# Simpl-Liste Application mobile de gestion de tâches minimaliste par La Compagnie Maximus. Bundle ID : `com.lacompagniemaximus.simpliste` — Scheme : `simplliste` ## Stack - **React Native 0.81** + **Expo SDK 54** (New Architecture) - **Expo Router 6** (file-based, typed routes) - **TypeScript 5.9** (strict) - **NativeWind 4.2** (Tailwind CSS 3.4 pour RN) - **Drizzle ORM 0.45** + **expo-sqlite 16** (SQLite local, `simpliste.db`) - **Zustand 5** + AsyncStorage (state UI persisté) - **i18next 25** + react-i18next (FR/EN, français par défaut) - **lucide-react-native** (icônes) - **date-fns 4** (dates) ## Scripts ```bash npm start # Expo dev server npm run android # Lancer sur Android npm run ios # Lancer sur iOS ``` ## Structure ``` app/ ├── _layout.tsx # Root stack (fonts, migrations, theme) ├── (tabs)/ │ ├── _layout.tsx # Tab bar (3 onglets) │ ├── index.tsx # Inbox │ ├── lists.tsx # Toutes les listes │ └── settings.tsx # Paramètres + gestion tags ├── task/ │ ├── new.tsx # Création de tâche (modal) │ └── [id].tsx # Détail/édition tâche └── list/ └── [id].tsx # Détail d'une liste src/ ├── components/ │ ├── FilterMenu.tsx # Modal filtres (bottom sheet) │ ├── SortMenu.tsx # Modal tri (bottom sheet) │ └── task/ │ ├── TagChip.tsx # Pill tag réutilisable │ └── TaskItem.tsx # Rangée de tâche ├── db/ │ ├── client.ts # Config SQLite + Drizzle │ ├── schema.ts # Tables : lists, tasks, tags, task_tags │ ├── migrations/ # SQL migrations (auto-appliquées au démarrage) │ └── repository/ │ ├── lists.ts # CRUD listes + ensureInbox() │ ├── tags.ts # CRUD tags + relations task-tag │ └── tasks.ts # CRUD tâches, filtres, tri, sous-tâches ├── i18n/ │ ├── index.ts # Init i18next (détection locale appareil) │ ├── fr.json # Traductions françaises │ └── en.json # Traductions anglaises ├── lib/ │ ├── priority.ts # Helpers couleurs priorité │ ├── recurrence.ts # Types récurrence + calcul prochaine occurrence │ └── uuid.ts # Wrapper expo-crypto randomUUID ├── services/ │ ├── calendar.ts # Sync expo-calendar │ ├── icsExport.ts # Export .ics + partage │ └── notifications.ts # Planification expo-notifications ├── stores/ │ ├── useSettingsStore.ts # Thème, locale, notifs, calendrier │ └── useTaskStore.ts # État tri/filtre └── theme/ └── colors.ts # Palette centralisée (bleu, crème, terracotta) ``` ## Base de données 4 tables SQLite gérées par Drizzle ORM. Migrations auto-appliquées via `useMigrations()`. - **lists** : id, name, color, icon, position, is_inbox, timestamps - **tasks** : id, title, notes, completed, priority (0-3), due_date, list_id → lists, parent_id (sous-tâches), position, recurrence, calendar_event_id, timestamps - **tags** : id, name, color, timestamps - **task_tags** : task_id → tasks (CASCADE), tag_id → tags (CASCADE) ### Générer une migration ```bash npx drizzle-kit generate ``` Puis mettre à jour `src/db/migrations/migrations.js` si nécessaire. ## Conventions - **Français par défaut**, anglais en second. Toutes les chaînes visibles dans `fr.json`/`en.json` - **Dark mode** : résolu localement avec `isDark` ternary (pas de NativeWind dark: prefix) - **Composants** : headers custom par écran (pas de React Navigation header) - **Polling 500ms** : les écrans rechargent les données par intervalle (pas de live queries) - **Pas de state global pour les tâches** : chargées depuis SQLite par écran - Icônes via lucide-react-native, polices Inter (400/500/600/700) - UUID générés via `expo-crypto` - Sous-tâches = tâches avec `parentId` non-null ## Palette de couleurs | Token | Valeur | |-------|--------| | bleu | `#4A90A4` | | crème | `#FFF8F0` | | terracotta | `#C17767` | | vert | `#8BA889` | | sable | `#D4A574` | | violet | `#7B68EE` | | rouge | `#E57373` | | teal | `#4DB6AC` | Couleurs sombres : fond `#1A1A1A`, surface `#2A2A2A`, bordure `#3A3A3A`, texte `#F5F5F5`, secondaire `#A0A0A0` ## Build Profiles EAS dans `eas.json` : dev / preview / production.