index.html référençait /manifest.json (inexistant) → nginx renvoyait index.html
en fallback SPA → "Manifest: Line 1, column 1, Syntax error" dans Chromium, et la
PWA n'avait aucune icône valide (d'où les favicons icon-192/512 non utilisées
pour le raccourci).
- Retire le <link rel="manifest" href="/manifest.json"> codé en dur :
VitePWA injecte déjà /manifest.webmanifest au build
- Ajoute <link rel="apple-touch-icon" href="/icons/icon-192.png"> pour le
raccourci écran d'accueil iOS (qui n'utilise pas le manifest pour l'icône)
v0.5.17
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Les notes créées avant la migration 0061 ont urls=NULL en base. Le défaut
NoteResponse.urls=[] ne s'applique qu'à un attribut absent, pas à None, d'où
ResponseValidationError "Input should be a valid list" → GET /api/notes 500
→ "Erreur de chargement" côté UI.
Ajoute un field_validator(mode='before') qui coerce None → [].
Nettoie aussi l'import HttpUrl inutilisé.
v0.5.16
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Backend :
- Migration 007 : list_type VARCHAR(20) sur shopping.lists (weekly/project),
url/description/image_url sur shopping.list_items
- Modèle ShoppingList : champ list_type
- Modèle ListItem : champs url, description, image_url
- Schémas : list_type sur Create/Response, nouveaux champs sur ItemCreate/Update/Response
- _unique_week_label() : évite les doublons S22 2026 → S22 2026 (2)
- finish_shopping : carry-over uniquement pour list_type='weekly'
Frontend :
- api/shopping.ts : list_type, champs enrichis item, createProjectList()
- ProjectItemCard.tsx : carte avec image, description, URL, boutique, cochage
- ShoppingPage :
· Séparation weekly / project dans la sélection de liste active
· Section "Listes projet" sur l'écran vide avec navigation
· Badge PROJET dans l'en-tête
· Bouton "Clôturer la semaine" et badge "semaine dépassée" masqués sur projet
· Bouton "+ Ajouter" (mobile + laptop) sur les listes projet
· Vue grille ProjectItemCard pour les listes projet
· Modale création liste projet (nom + boutique)
· Modale ajout/édition item projet (nom, description, URL, image URL)
v0.5.14
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace fa-house par fa-circle-nodes dans la TopBar pour aligner
le logo affiché dans l'app avec la nouvelle icône PWA/favicon hub.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Admin stats : ajout video (count + size_bytes) dans /api/admin/stats.
ConfigPage : grille médias 3 colonnes (Photos / Audio / Vidéos).
docker-compose : backend et backend-worker tournent en user 1000:1000
pour que les fichiers écrits dans ./data/ appartiennent à l'utilisateur
hôte et non à root.
v0.5.6
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Decimal Python → string JSON causait TypeError: z.toFixed is not a function
dans NoteCard (title attribute de l'icône GPS). Tous les champs gps_lat/gps_lon
passent maintenant en float | None dans les schémas Pydantic.
v0.5.3
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
BottomSheet.tsx
- visualViewport API : calcule la hauteur du clavier en temps réel
- bottom: keyboardOffset → le sheet monte exactement au-dessus du clavier
- maxHeight s'adapte à l'espace visible restant
- border-radius passe à 16px partout quand le clavier est ouvert
- Transition douce 0.15s sur bottom/maxHeight/border-radius
ShoppingPage.tsx
- type="search" sur le champ de recherche → supprime la suggestion URL iOS
dans la barre QuickType du clavier
- autoFocus → clavier s'ouvre automatiquement à l'ouverture du sheet
v0.5.1
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ThemeContext
- ThemeMode dark/light/system persisté en localStorage
- fontScale 0.8–1.4 appliqué via CSS zoom sur <html>
- Écoute prefers-color-scheme pour le mode système
index.html
- Script anti-flash : applique thème et zoom synchrone avant le premier rendu
Layout
- TopBar fixe 44px : bouton icône qui cycle dark→light→system→dark
- Contenu décalé de 44px vers le bas
ConfigPage (/config)
- Sélecteur de thème (3 boutons avec icônes)
- Slider taille de texte avec aperçu temps réel
- Bouton Réinitialiser
HomePage
- Tuile Paramètres (fa-sliders) → /config
TodoForm
- Paste Ctrl+V pour ajouter une photo (même mécanique que CatalogueModal)
- Indice visuel "ou Ctrl+V"
v0.5.0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Cochée par défaut à la création (aucune date soumise).
Décochée si la tâche éditée a déjà une date (champ date pré-rempli).
Décocher affiche le sélecteur de date ; cocher le masque et efface la date.
v0.4.14
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Écoute l'événement paste sur window quand le formulaire est ouvert.
Si le presse-papier contient une image, déclenche le même upload
que le bouton fichier. Indice visuel "ou Ctrl+V" affiché sous le bouton.
Les deux méthodes (fichier + coller) coexistent.
v0.4.13
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Migration 006 : colonne tags TEXT[] sur shopping.products
- Modèle SQLAlchemy + schémas Pydantic mis à jour (ProductCreate/Update/Response)
- Interface TypeScript Product/ProductCreate/ProductUpdate avec tags?: string[]
- CatalogueModal : chip input (Entrée/virgule pour ajouter, clic pour supprimer, Backspace pour retirer le dernier)
- Recherche dans le catalogue et le bottom sheet étendue aux tags (insensible aux accents)
- Tags affichés en pills dans la liste du catalogue
v0.4.12
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Le backend utilisait ILIKE (insensible à la casse uniquement) — "iles" ne
trouvait pas "Îles flottantes". Passage au filtrage client avec matchesSearch
(normalize NFD) identique au bottom sheet. Charge tous les produits une fois
puis filtre sur name, brand et category sans aller-retour serveur.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Le cercle de fond était visible derrière le FAB — deux cercles superposés.
Slot conservé (flex, positionnement) mais sans visuel propre.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ActionButtonContext : contexte React permettant aux pages d'injecter
leur bouton action dans la navbar (Shopping=fa-cart-plus, Todos/Notes=+)
- BottomNav : 5e slot dédié avec dock circulaire visuel permanent ;
bouton rendu 10px au-dessus du centre du slot (effet soulevé)
- Layout : ActionButtonProvider + overflow visible sur le conteneur nav
- Pages : useEffect enregistre/vide le bouton action — plus de FAB flottant
sur le contenu, liste entièrement visible
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
FAB déplacé sur la barre de nav (bottom: 10px) au lieu de flotter
au-dessus de la liste — liste entièrement visible sur Shopping,
Todos et Notes. paddingBottom liste réduit à 64px (hauteur nav seule).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Bug: décrémentation à 0 d'un article pré-chargé (existingItemId) conserve
la sélection à qty=0 (marqué pour DELETE) → bouton ✓ devient accessible
Visuel: fond rouge + barré + opacité 0.6 pour les articles à supprimer
- UX: première lettre en majuscule auto lors de l'ajout d'un article libre
- UX: FAB remplace '+' par fa-cart-plus pour mieux signifier l'ajout à la liste
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Boutons Annuler (fa-xmark, outline err) et Valider (fa-check, ok)
déplacés en haut du sheet, pill shape, touch target 48px
- Suppression du bouton sticky en bas
- zIndex sheet 70 > tab bar 50 : bottom sheet couvre la nav
- maxHeight 85dvh → 92dvh pour exploiter l'espace libéré
- Poignée de drag supprimée
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- openAddSheet() pré-charge les articles non cochés de la liste courante
(qty existante, PATCH si modifiée / POST si nouvel article)
- Toggle "Ajouter au catalogue" sur les articles libres nouvellement saisis
(coché par défaut, créé via createProduct puis lié en product_id)
- Bouton "Confirmer (N)" comptant uniquement les actions réelles
(new items + existing avec qty modifiée)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- QtyControls: boutons +/- design system (var(--ok)/var(--err)/var(--bg-5))
- qty=0 → article non sélectionné, seul "+" visible (var(--ok) plein)
- qty>0 → fond teinté vert, "−" + valeur mono + "+" ; "−" retire si qty atteint 1
- Quantité transmise à addItem lors de la confirmation
- Articles libres : même comportement +/- en tête de liste
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- user-select:none global (index.css) + reset sur input/textarea/select
- ItemRow: swipe gauche → édition (fond bleu), suppression long press,
bouton ✕ toujours visible sur mobile
- SwipeableRow: prop onSwipeLeft, révèle rightContent entre seuil/2 et seuil,
déclenche onSwipeLeft au seuil complet
- TodosPage: onSwipeLeft → édition (remplace double-tap)
- inputMode=decimal sur tous les champs quantité et prix
- formatQty: affiche "2" au lieu de "2.000"
- Versionnage: __APP_VERSION__ injecté par Vite depuis package.json v0.4.0
- HomePage: version affichée à côté du titre (v0.4.0)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Mise en place de la structure de base du frontend HomeHub : React 18,
Vite 5, TypeScript strict, React Router v6, Tailwind CSS et vite-plugin-pwa
installés. Composants placeholder Layout et HomePage pour que le build
compile sans erreur. Build de production vérifié (dist/ généré, 0 erreur TS).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>