Lou·Ka — tous les logements à louer du Québec, un seul endroit.
- 264commits
- 1branches
- 0releases
- 180.7 MBon disk
- maindefault branch
- 5 days agolast push
-
Wed, Aug 26, 2026 3
-
feat(ka-id v2): personnalisation Groupe KA — louka/kaid.py (canonique ka-ui.git/kaid), journal serveur (search/detail_view/favorite), reranking personnalisé du tri par défaut (blend 0,35, session > long terme, masqués exclus), enrichisseur ka_id (session legacy sans ka_id), routeur /api/kaid, SDK ka-id.js, badge « Recommandé pour vous » sur ListingCard
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Mode carte : jetons Ka re-déclarés sur le canevas (accent orange dans la carte, pas le noir générique)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Mode carte Ka Map System v2 — expérience immersive plein viewport
…
- MapSearch réécrit autour de KaMapShell : mobile edge-to-edge + bottom sheet de résultats à 3 crans, desktop split liste|carte redimensionnable (ratio persisté) avec carte quasi plein écran d un clic - Toolbar unifiée (zoom, 3D, dessiner, me localiser) au lieu des pilules flottantes ; « Rechercher dans cette zone » contextuel - Mode dessin temporaire avec CTA « N logements dans cette zone » - Fiche contextuelle v2 : photo, prix, favori, swipe/chevrons entre voisines (remplace le carrousel mobile) - Thème markers v2 : pilules off-white/encre premium, orange réservé au « sous le marché » et à la sélection ; clusters légers à anneau orange avec loyer moyen sous la bulle - Home : vue carte mémorisée dans l URL, feuille de filtres en modale au-dessus du mode carte (desktop), widget Ka Agent masqué en mode carte Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Tue, Aug 25, 2026 8
-
Fiche logement : refonte editoriale v2 — icones contextuelles, sections sans boites
…
- Nouveau composant AmenityIco (~34 pictos maison, trait 1.8) : chaque inclusion/caracteristique est appariee par mots-cles (accents neutralises) a SON icone — lave-vaisselle, chauffage, balcon, stationnement, animaux, piscine, foyer… — fini le meme ✓ repete dix fois - Inclusions : grille en filets (tuile icone 32px accent-soft, libelle, ✓ discret a droite pour le confirme ; neutre pour les mentions libres) - Chips cles du hero : hairline + icone contextuelle (3½ → porte, dispo → calendrier, pi² → regle…) au lieu d aplats marine - Colonne editoriale (gauche) de-boxee : description, inclusions, details pratiques respirent sans carte — les modules de donnees (droite) restent en cartes ; titres avec tiret accent net (sans bordure/ombre heritees) - Details pratiques : rangees en filets, cles en micro-mono, fini les tuiles - Prix 38-54px, ancres en onglets textes, en-bref en filet accent, galerie au cadre allege (hairline, rayon 10) - Mobile : le CTA sticky prend le bas d ecran, la tabbar s efface sur la fiche (body:has(.cta-sticky)) — plus de chevauchement
-
Desktop : grille uniforme + header sans debordement
…
- Grille editoriale : suppression du grand format 7n+1 (annonces de tailles inegales jugees etranges) — 3 colonnes uniformes, le style editorial (fiches sans boite, image dominante, stagger) est conserve - Header : nav sans retour de ligne (Court terme tenait sur 2 lignes), burger des 960px, badge Groupe KA masque sous 1140px (debordement de 6px du bouton Connexion autour de 1100px) — verifie par mesure Playwright de 1440 a 900px : plus aucun element coupe a droite
-
Refonte editoriale v2 de l accueil — direction artistique premium
…
Moins de boites, plus de typographie : le contenu structure la page. - Hero : composition typographique geante (clamp 44-88px), surlignage orange irregulier en trait SVG sous chez-vous., plus de gros boutons rectangulaires - Donnees vivantes : ligne mono LIVE avec compteur anime (count-up 0,9s), derniere synchro reelle qui tictaque a la seconde (max last_sync des connecteurs), sources et loyer moyen — separes par filets, zero chip - Recherche au coeur : grand champ Ou voulez-vous habiter ? souligne 2px (focus accent), criteres inline Ville/Quartier/Loyer separes par filets verticaux, bouton texte Tous les criteres avec badge — la boite filterbar disparait de l accueil - Barre de resultats sticky : N logements · Liste|Carte (onglets textes a soulignement anime scaleX) · Filtres (mobile) — remplace le FAB flottant - Fiches editoriales : plus de carte-boite — l image domine (radius 10, zoom 1,025 au survol), prix 22px niveau 1, adresse niveau 2, quartier/ville en mono uppercase niveau 3, source en micro-mono niveau 4 - Grille a rythme magazine : 3 colonnes, 1 grand format panoramique 16/9 toutes les 7 fiches, apparition en decale par colonne, align-items start - Pagination nue : chiffres sans boites, page courante soulignee accent - Nav mobile : tabbar flottante detachee des bords (radius 18, blur, ombre portee), etat actif = trait accent sous l icone ; widget KA Agent remonte - Primitives locales v2 : rayons 0/6/10/18, durees 150/240/350ms, hairlines - Feuille mobile : resume des criteres actifs sous la recherche (remplace le FAB), poignee, application sticky - Classes partagees avec CourtTerme (.hero, .filterbar, .stat-chip…) intactes : la refonte vit dans de nouvelles classes + une couche finale
-
Accueil : pastilles actives — neutraliser l uppercase herite de la page Sources
…
La regle .pill de la page Sources (10.5px, uppercase) venait apres celle de l accueil et fuyait sur les pastilles de filtres actifs ; text-transform et letter-spacing sont desormais explicites sur .pills .pill.
-
Accueil : refonte majeure du rendu — CTA hero, filtres et boutons peaufines
…
- Hero : halo d accent + trame de points decorative, rangee CTA (Explorer / Voir la carte) avec ombres decalees accent, stat-chips interactives (tabular-nums, survol), avantages en mini-cartes bordees encre - Filterbar : cadre 2px + rayon 16, recherche 52px focus accent (ombre 3x3), selects survolables, bouton Plus de filtres avec icone, badge compteur et chevron anime, panneau avance en pointille avec easing - Segments : etat actif encre + souligne accent interieur ; pastilles actives avec animation d apparition et survol danger (intention de retrait) - Chips 42px avec icones alignees ; bascule Liste/Carte etat actif encre - Mobile : poignee de sheet, bouton Voir les resultats sticky en bas de la feuille, FAB avec badge compteur
-
Court terme : upgrade majeur — 21 nouveaux connecteurs, 12 enrichis, fiches améliorées
…
- 21 nouveaux connecteurs (chaleto, hébergement-charlevoix, chaletsalpins, memoria, pourvoiries FPQ, campingquebec, hebergia, rezerve, accestremblant, chaletsdanslenord, alouerauxiles, rvmt, boraboreal, homminichalets…) - enrichissement des existants : airbnb (desc/capacité/commodités via PDP), booking/vrbo/expedia (Apollo SSR, bug slug vrbo corrigé), sepaq (desc+géo), tremblantliving (prix API Streamline), qldc/kijiji/parcscanada/bonjourquebec/ gitespassant ; sinistar : prix vérifiés inaccessibles (documenté) - fiches CT : /api/ct/listings/{uid}/context (analyse prix/nuit par segment, histogramme, centile) + badge marché + hébergements similaires à proximité - registre sources_ct.json : 52 sources (7 mortes retirées, 21 ajoutées) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> -
Nav v2 correctif : le ✕ de fermeture vit DANS le panneau (fixe, toujours visible)
…
Le ✕ était le burger du header ; si le header n'est pas épinglé (bas de page), il défilait hors écran alors que le panneau fixed restait affiché — impossible de fermer sans Escape. Ajout d'un .mm-close position:fixed en haut à droite du panneau et burger masqué à l'ouverture (une seule commande de fermeture). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Nav mobile v2 : le dropdown 480px devient un panneau plein écran fixed
…
Standard KA 2026-08-25 : .mobile-menu passe de position:absolute top:100% (max-height 480px) à position:fixed inset:0 — menu visible peu importe la position de scroll. Rang du header (marque + burger→✕) maintenu au-dessus du panneau, verrou de scroll CSS pur via html:has(.mobile-menu.open). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Mon, Aug 24, 2026 4
-
feat(fiche): dossier d'intelligence locative — passe sharp desktop/mobile + PDF complet
…
CSS : pastilles de statut affûtées, score hiver et note Google en tuiles à ombre dure, timeline encre, media queries 640px (tableau coût réel, dates empilées, barres d'avis compactes). PDF fiche : cinq nouvelles sections fidèles au web — coût réel ligne par ligne (statuts étiquetés), historique Lou-Ka + vies antérieures, passeport de l'immeuble (tuiles KPI, rotation, pression), gestionnaire (note Google, distribution des avis, plaintes, confiance d'association), score hiver. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
-
feat(fiche): styles du dossier d'intelligence locative — coût réel, historique, immeuble, gestionnaire, hiver
…
Complète les snapshots ka2 (backend 8efd8cb + composants 0ee1a2d) : pastilles de statut de donnée (observé/estimé/inconnu), tableau du coût réel, timeline Lou-Ka, distribution des avis Google, score hiver. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
-
feat(design): passe « éditorial sharp » sur la fiche — cartes, KPI, tableaux, pastilles
…
Blocs de la fiche transformés en cartes encre (bordure 1,5 px + ombre décalée douce), titres de section à marqueur accent + filet, tuiles KPI blanches à ombre dure, tableaux zébrés avec survol accent, barres de proximité/crime/air en dégradé, pastilles d'état unifiées (mono, point, liseré), décisions TAL en mini-cartes. Vérifié Playwright desktop 1440 + mobile 390 (overflow 0, check-order OK). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
-
feat(tal): historique du Tribunal administratif du logement par adresse
…
Décisions publiques du TAL (diffusées par SOQUIJ) croisées avec l'adresse de chaque annonce : recherche « no civique + rue » via Scrapfly (le site exige rendu JS + IP résidentielle ; pas de phrases entre guillemets), puis vérification de l'adresse exacte dans le texte intégral et classification (non-paiement, résiliation, expulsion, reprise/éviction, insalubrité…, demande du locateur vs du locataire, verdict). Cache par adresse dans data/tal.db, backfill borné dans la boucle watch + file prioritaire alimentée par les fiches consultées (/api/tal), bloc « Historique au TAL » sur la fiche (aucun nom de partie affiché — référence neutre + lien SOQUIJ). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
-
-
Sun, Aug 23, 2026 6
-
Fiche : estimation du coût d electricite Hydro-Quebec (a la demande)
…
- louka/hydro.py : parcours PUBLIC rétro-conçu de l outil « Estimer les coûts d électricité à une résidence » — 2 étapes (lieu-consommation -> estimation) sur services-cl.solutions.hydroquebec.com, jeton reCAPTCHA v2 via solveur enfichable (2captcha/CapSolver, clé HQ_CAPTCHA_KEY), sortie par proxy résidentiel CA (Oxylabs/Bright Data), cache 6 mois data/hydro.db ; sans clé captcha -> {disponible:false} et bloc masqué (jamais d estimation inventée) - GET /api/hydro?adresse= ; bloc fiche à la demande (bouton, 1 captcha/appel) affichant le coût mensuel et annuel estimés Activation : définir HQ_CAPTCHA_KEY (+ HQ_CAPTCHA_PROVIDER) dans .env. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> -
Fiche : bloc Commerces et transport (Mapbox Search Box + cache POI/OSM)
…
- louka/commerces.py : point de vente le plus proche de 14 grandes bannières (Costco, Walmart, Metro, IGA, Maxi, Super C, Provigo, Canadian Tire, Dollarama, SAQ, Pharmaprix, Jean Coutu, Home Depot, RONA) via l API Mapbox Search Box (jeton public kamaps, validation du nom retourné, anti « Station Métro »), cache par cellule ~1 km TTL 30 j ; station de métro et arrêt de bus les plus proches repris du cache POI du projet (repli Overpass) ; GET /api/commerces - bloc fiche : pastilles SVG monogrammes aux couleurs des bannières, nom du point de vente et distance — métro/bus en tête Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Fiche : qualité de l air (RSQAQ/PST) + essence à proximité (gazquebec.ca)
…
- louka/air.py : agrégats annuels par station du RSQAQ (MELCCFP) — horaires 2024-2025 (PM2.5, NO2, O3, SO2, CO) + séquentielles PST/PM10 (<LD -> LD/2), data/air.db minuscule, station la plus proche ≤ 60 km ; bloc fiche avec badge global et barres vs repères OMS 2021 / norme RAA (PST 60 µg/m³) - louka/gaz.py : copie locale des ~2 450 stations de gazquebec.ca (prix Régulier/Super/Diesel, TTL 4 h, auto-refresh au lookup) ; bloc fiche avec KPI (stations, médiane du secteur, meilleur prix) et tableau des stations les plus proches, la moins chère mise en évidence - run.py air-refresh / gaz-refresh, GET /api/air et /api/gaz Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Quartier : criminalité SPVM détaillée par catégorie (12 mois, tendance)
…
_crime_mtl ventile désormais les actes par catégorie (vol dans/sur véhicule, introduction, vol de véhicule, méfait, vol qualifié, infractions mortelles) ; le bloc quartier affiche des barres par catégorie avec la variation vs les 12 mois précédents (flèches chiffrées, jamais la couleur seule). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Risque d inondation (BDZI) + Registre des loyers v2 (visuel)
…
- louka/inondation.py : base locale data/inondation.db construite du GeoPackage BDZI officiel (25 k polygones éclatés + R*Tree, couverture Carto_ZI_S), lookup point-dans-polygone shapely (0-40 ms), statuts en_zone / a_proximite (≤100 m) / hors_zone / non_cartographie ; run.py inondation-build, GET /api/inondation — bloc fiche avec badge de sévérité (grand courant 0-20 ans = élevé, faible courant 20-100 ans = modéré) et rappel que la cartographie officielle fait foi (CMM non couverte par la BDZI) - Registre des loyers v2 : tuiles KPI (volume, médiane secteur, médiane même nombre de chambres), bande de position p10-p90/boîte p25-p75/médiane vs le loyer demandé, barres des médianes par chambres (celle de l annonce surlignée + étiquette), date de la valeur = année du loyer (mois seulement si le bail débute la même année), quartiles côté API Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Registre des loyers : extraction pancanadienne (57 433 déclarations géocodées) + bloc fiche
…
- louka/rdl.py : balayage par boîtes de l API publique de registre-des-loyers.ca (subdivision récursive sur erreur ou volume suspect), base séparée data/rdl.db, requête de proximité (bbox + haversine) avec médianes globale/récente/par chambres - run.py rdl + GET /api/rdl?lat&lng&radius - fiche : bloc « Registre des loyers » sous l analyse de prix — médiane du secteur, écart du loyer demandé vs les déclarations du même nombre de chambres, 8 déclarations les plus proches avec la date de la valeur (année du loyer, mois si le bail débute la même année), crédit Vivre en ville Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Sat, Aug 22, 2026 1
-
header opaque + z-index en tokens + scroll-lock ka-scroll-lock (standard header/menu KA 2026-08-22)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Wed, Aug 19, 2026 2
-
fix(fiche): ordre des sections = ordre du DOM sur tous les breakpoints
…
Sur mobile, PriceAnalysis (.f-fairvalue), la carte (.f-carte) et les KA Scores (.f-kascores) n avaient pas de règle order: et retombaient à order:0 — ils s affichaient AVANT la galerie, le prix et l adresse. - Listing.tsx : DOM restructuré en ordre logique unique (galerie → prix/ adresse/PDF → description → inclusions → détails pratiques → analyse de prix → carte 3D → KA Scores → quartier → à proximité) - styles.css : suppression de tous les order:/display:contents — mobile empile les colonnes en flux naturel, desktop garde la grid 2 colonnes - scripts/check-order.mjs : validation Playwright (iPhone + desktop) de l ordre visuel, du scroll initial et de l absence d order CSS Validé Chromium + WebKit (iPhone 14) et desktop 1440px sur 2 fiches. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Mobile : backdrop du menu compte via createPortal, verrou scroll de la feuille filtres, champs ≥16 px, logo tactile, socle mobile tokens.css, ka-agent corrigé
…
- frontend/src/App.tsx : .account-backdrop rendu à la racine via createPortal (le backdrop-filter du header re-parentait le position:fixed → voile de 66 px) + fermeture du menu compte à Escape. - frontend/src/pages/Home.tsx : feuille de filtres mobile (sheetOpen) — gel du scroll d arrière-plan (pattern du hamburger) + fermeture à Escape. - frontend/src/styles.css : backdrop compte plein écran sous le header (z-40, le menu ancré dans le header reste au-dessus) ; champs de filtres ≥16 px sur mobile (f-search, f-native, f-ctl select, ms-sort) ; zone tactile ≥44 px du logo .brand (::after inset -8px, rendu inchangé). - frontend/src/ka/tokens.css : socle mobile obligatoire (z-index communs, --vh100, .ka-scroll-lock, .ka-bottombar, filet anti-zoom iOS 16 px). - frontend/public/ka-agent.js : safe-areas, textarea 16 px, plein écran ≤640 px + verrou, pas de focus clavier forcé. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Tue, Aug 18, 2026 5
-
Rapport de validation sync liste↔carte + KA Scores (25/25 E2E) + chrome mobile
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
KA Scores — suite géographique maison (Walk/Transit/Bike/Calme/Services)
…
· environment.py : inventaire OSM par tuile (Overpass) — routes majeures, rails, aéroports, zones industrielles, bars, pistes cyclables (géométrie densifiée) et TOUS les POI par catégorie ; cache env_tiles ~3 mois. · kascores.py : 5 scores 0-100 par immeuble + global pondéré, barème versionné (2026.08-v1), détails honnêtes par score, « Données insuffisantes »/« Non desservi » plutôt que des 0 trompeurs ; Transit = proximité des arrêts × percentile PMD StatCan ; calcul incrémental (7 900 immeubles en ~8 s), distribution de calibration en sortie. · API : ks_* joints à /api/listings et /api/search (tri « ka », filtre kascore_min), détail complet sur la fiche, /api/kascores/stats. · Frontend : pastille KA sur les cartes d annonces, section KA Scores de la fiche (5 jauges + détail dépliable + date/version), page /ka-scores (méthodologie publique + pondérations personnelles en curseurs), tri « Meilleur KA Score » dans la vue carte, filtre « KA Score minimal ». · Boucle watch : env (4 tuiles max) + kascores incrémental à chaque sync. · Tests : test_kascores.py (barème, honnêteté, rendement décroissant, cohérence spatiale sur le parc réel). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Recherche synchronisée liste ↔ carte (une seule vérité partagée)
…
· /api/search : une réponse = page de liste + tous les points carte, même tri — compteur liste = marqueurs par construction ; bbox, polygone dessiné, tris (prix/récent/affaires), include=liste, annonces sans position comptées honnêtement. · MapSearch.tsx : état unique filtres+zone+tri+page, miroirs survol/clic < 100 ms dans les deux sens, page ajustée au clic marqueur + pulsation, « Rechercher quand je déplace la carte », « Rechercher dans cette zone », recadrage animé respectant l intention (byUser), « Recadrer sur les résultats », zone dessinée en puce retirable + URL, carrousel mobile synchronisé aux marqueurs, états vides propres, URL complète partageable. · Géolocalisation d accueil : arrivée sur le site → demande de position → vue carte centrée sur l utilisateur (une fois par session, lien partagé respecté, refus silencieux). · Marqueurs « déjà vu » atténués (localStorage), fourchette de prix des clusters au survol, spiderfy discret des unités d un même immeuble. · Tests : scripts/test-sync.mjs (25 vérifications E2E Playwright, critères 1-9), tests/test_search.py (9 tests API). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Garde-fou overflow-x: clip (débordement transitoire 360 px au chargement)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Qualité des données + solidité mobile + framework de juste valeur (fair value)
…
Mission 1 — enrichissement des connecteurs et qualité : - quality.py : score de complétude 0-100 + seuil de publication (quarantaine des annonces sans prix plausible / localisation / contenu exploitable) - imgcheck.py : audit des images (liens morts 404/410, minuscules, placeholders multi-adresses, doublons) -> galeries nettoyées images_ok, cache image_checks, politesse 3 requêtes/hôte, écriture hors transaction réseau - 26 connecteurs enrichis (galeries complètes, descriptions, prix, adresses) : kangalou, royal_lepage, medway, remax_quebec, groupe_maurice, mellem, sutton, lespac, heafey, kijiji, fb_marketplace, zumper, equinoxe_batimo, logis_experts, quartier_sila, msi, summum, quartier_plus, urban_services, cosoltec, garic, lakle, matinale, huma, jutras, groupe_theoret, ferrovia - normalize : clean_city/clean_sector (rues et entités HTML retirées des menus), kijiji : adresses françaises « 89, rue X » correctement découpées - geocode : virgule après le n° civique corrigée (lot AQ), base en WAL - dedup : une annonce en quarantaine ne masque jamais un doublon publié Mission 2 — mobile : - /api/img : miniatures WebP servies à la taille de l écran (cache disque) - SmartImg : miniature -> original -> visuel de secours Lou-Ka (jamais d icône cassée) - lightbox tactile : balayage scroll-snap + pincement + double-tape - bannière témoins : ne recouvre plus le bouton Filtres (--consent-h) - cibles tactiles >= 44 px (pointer: coarse) ; KA Agent plein écran à l ouverture - stats : complétude moyenne, quarantaine par source Mission 3 — juste valeur locative (fairvalue.py, fv-logement-1.0) : - 3 niveaux : segments médians (repli en échelle) + coefficients de caractéristiques appris et centrés + comparables kNN géographiques (médiane pondérée) ; couloir de sécurité, fourchette, indice de confiance - prudence : pas de verdict si confiance faible, prix « à partir de », prix non mensuel, écart hors plausible ; chambres/coloc = segment dédié - pastilles sous/dans/au-dessus du marché (cartes + fiche), bloc Analyse de prix avec histogramme, filtre « Sous le marché » + tri, page /juste-valeur - API : champs fv_* + deal/sort, /api/fairvalue/{uid} ; stats + PDF ; historisation fv_segments ; tests synthétiques ; docs/FAIRVALUE*.md Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Mon, Aug 17, 2026 1
-
Retour au design system commun Groupe KA « éditorial sharp » (accent orange conservé)
…
Lou-Ka abandonne l'identité marine/bleu du 2026-08-15 et revient au socle partagé ka-ui (papier #f5f3ee, encre #141814, Space Grotesk/Inter/JetBrains Mono, bordures encre 1,5 px + ombres décalées), en gardant son accent orange (#ff6a00), son logo « porte entrouverte » et sa baseline. - ka-ui vendoré : frontend/src/ka/ (tokens.css, ecosystem.json, KaFooter, GroupeKaBadge) ; tokens.css importé AVANT styles.css dans main.tsx - styles.css : :root réécrit (accent orange + alias --lime, anciens jetons marine/bleu remappés sur les jetons communs), géométrie sharp 10/6 px, états sélectionnés encre+accent, couche d'harmonisation finale ; le thème Ka Maps passe à l'accent orange sur le chrome de la carte - Header : badge « Un service Groupe KA » (desktop + menu mobile ≥44 px) - Footer : KaFooter commun (siteId lou-ka, pages légales locales) précédé d'une rangée de navigation locale + « Gérer mes témoins » - Nouvelle page /contact (courriels + rôles d'ecosystem.json, avertissement agrégateur, liste des sites, lien hub) ; route ajoutée au fallback SPA - SEO : title « Lou-Ka — Un service Groupe KA » (index.html) ; titre SSR de l'accueil harmonisé + lien Groupe KA dans le corps SEO (seo.py) - « Créer mon compte » pointe vers https://www.groupe-ka.com/connexion - Polices Space Grotesk + JetBrains Mono ajoutées (Google Fonts) - ka-maps redéployé sur le nœud (~/apps/ka-maps) pour le build Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Sat, Aug 15, 2026 3
-
Filtres : bulle de recherche « Ville, quartier ou code postal » compacte (42 px, centrée, max 440 px — pleine largeur conservée dans la feuille mobile, 16 px anti-zoom iOS) ; README — captures d'écran refaites sur la prod avec la nouvelle identité visuelle (9 écrans web + mobile)
…
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Thu, Aug 13, 2026 7
-
Lou-Ka Maps — carte propulsée par Ka Maps (framework Groupe Ka, moteur Mapbox 3D)
…
Frontend : MapView réécrit sur @groupe-ka/ka-maps (file:../../ka-maps) — style Mapbox Standard 3D par défaut + bouton 2D, pastilles de prix encre/ blanc, grappes compte + loyer moyen (clamp anti-prix aberrants), « Rechercher dans cette zone », aperçu React (fin du popup HTML injecté), sync liste↔carte (sélection + survol), caméra dans l'URL, badge Lou-Ka Maps · Groupe Ka, jeton public Mapbox (kamaps/config.ts). Recherche debouncée (fin des requêtes à chaque frappe). Backend : /api/listings.geojson accepte bbox + limit et renvoie totalGeocoded/totalMatching ; index idx_listings_geo(lat,lng) ; PRAGMA optimize au cycle d'ingestion (le planificateur choisissait le mauvais index). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Profil enrichi — photo téléversée, bio, ville, coordonnées, réseaux sociaux
…
- louka/profile.py : PUT /api/me/profile (nom affiché, bio 280, ville, téléphone, site web, réseaux instagram/facebook/x/linkedin/tiktok/youtube), POST /api/me/avatar (Pillow : EXIF, recadrage carré centré, 512 px, JPEG, purge des anciennes photos), DELETE /api/me/avatar (retour avatar Google) - /uploads/ monté (data/uploads/), colonnes users (display_name, avatar_url, bio, city, phone, website, socials JSON) - /api/me : nom et avatar « effectifs » (display_name > Google, upload > Google) + tous les champs ; profil public /u/{ka_id} : bio, ville, rôle, site, réseaux (jamais courriel/téléphone) - /profil : éditeur complet (photo avec téléversement, nom affiché, bio avec compteur, ville, téléphone, site, 6 réseaux avec icônes maison) - /u/{ka_id} : bio, chips ville/rôle/site, boutons réseaux sociaux - python-multipart ajouté (formulaires multipart FastAPI) -
Comptes v2 — KA-ID, profil « carte de membre », rôles, favoris, pages gestionnaires
…
- KA-ID : identifiant membre unique « ka- » + 10 chiffres, attribué à la création du compte (index unique, backfill au premier /api/me) - /profil : carte de membre Groupe KA (encre + lime, KA-ID en vedette, avatar, ancienneté, bande décorative), infos du compte, copie du KA-ID - Profil PUBLIC opt-in : /u/{ka_id} (nom, avatar, ancienneté — jamais le courriel ; 404 indistinguable si non public), toggle + lien copiable - Rôles à l'intégration (/bienvenue après le premier login Google) : · locataire — favoris (cœur sur les cartes, page /favoris, toggle optimiste) · gestionnaire — réclame la page de SA source (1/compte, 1 compte/source) et la personnalise (/gestion : accroche, description, contact, logo) ; page publique /g/{source} avec inventaire relié + pagination - louka/accounts.py (rôles, favoris, source_profiles), tables favorites + source_profiles + colonnes users (ka_id, public, role, org_source) - Contexte de compte partagé (account.tsx) : header, cartes et pages reliés -
Comptes utilisateurs — connexion Google (OAuth 2.0 / OpenID Connect)
…
- louka/auth.py : flux authorization-code serveur (login -> Google -> callback), state signé, upsert table users, session HMAC-SHA256 en cookie httpOnly 30 j (stdlib seulement), /api/me, /api/auth/logout, /api/auth/config - db.py : table users (google_sub unique, email, name, picture) - Frontend : bouton « Connexion » (logo Google) dans le header, avatar + menu compte (courriel, se déconnecter) — masqué tant que l'OAuth n'est pas configuré - .env : SESSION_SECRET généré ; GOOGLE_CLIENT_ID/SECRET à coller (redirect URI : https://www.lou-ka.com/api/auth/google/callback)
-
Web — mention Groupe KA + page Conditions d'utilisation + courriels officiels
…
- Footer : « Lou-Ka est une plateforme du Groupe KA » (lien groupe-ka.com), © Groupe KA, contact@groupe-ka.com, lien vers /conditions - Nouvelle page /conditions : opérateur (info@groupe-ka.com), nature du service, exactitude, retrait de contenu (contact@groupe-ka.com), usage acceptable, volet légal (admin@groupe-ka.com) — route + menu mobile - Confidentialité : responsable Loi 25 admin@groupe-ka.com, retraits et questions contact@/info@groupe-ka.com (remplace contact@spboucher.ai)
-
Web — pagination 12 annonces/page + icônes SVG maison (fin des emojis génériques)
…
- Pager.tsx : pagination éditoriale (précédent/suivant, numéros avec ellipses, rappel « X–Y sur N »), sous la grille ET sous la liste de la vue carte - Home.tsx : 12 annonces/page via limit/offset API, page dans l'URL (?page=N), retour page 1 au changement de filtre, défilement doux vers les résultats - Icons.tsx : jeu d'icônes SVG au trait « éditorial sharp » (maison, immeuble, caméra, patte, sofa, éclair, liste, carte, curseurs, alerte, boussole…) - Emojis remplacés partout (cartes, chips, bascule liste/carte, FAB filtres, nav mobile, onglets Stats, fiche, carrousel vide, popups carte, 404)