// ----------------------------------------------------------------------------- // Groupe KA — composant partagé (lou-ka / immo-ka) // components/AmenityIco.tsx : icône contextuelle d'une commodité ou inclusion. // Fini l'icône unique répétée dix fois : chaque libellé est associé par // mots-clés (accents neutralisés) à l'un des ~30 pictos maison — trait 1.8, // 24×24, currentColor. Repli : ✓ (confirmé) ou étoile (mention libre). // ----------------------------------------------------------------------------- import { ReactNode } from "react"; const ICONS: Record = { heat: (<>), bolt: , droplet: (<>), wifi: , dishwasher: (<>), washer: (<>), fridge: (<>), snow: , elevator: (<>), balcony: , pool: , gym: , laundry: , box: , parking: (<>), garage: , sofa: , nosmoke: , paw: (<>), fire: (<>), tree: , spa: , shield: (<>), eye: (<>), waves: , calendar: (<>), ruler: , bed: , bath: , people: (<>), stairs: , door: (<>), home: , sun: (<>), check: , spark: , }; /** [motif (sur libellé minuscule sans accents), clé d'icône] — ordre = priorité */ const RULES: [RegExp, string][] = [ [/lave-?vaisselle/, "dishwasher"], [/laveuse|secheuse|lessive/, "washer"], [/buanderie/, "laundry"], [/electromenager|frigo|refrigerateur|cuisiniere|four incl|poele/, "fridge"], [/climatis|air clim|thermopompe|echangeur d.air|\ba\/?c\b/, "snow"], [/chauff/, "heat"], [/eau chaude/, "droplet"], [/electric|eclair|hydro/, "bolt"], [/internet|wi-?fi|cablodistribution|\bcable\b|fibre/, "wifi"], [/ascenseur/, "elevator"], [/balcon|terrasse|patio|loggia|veranda/, "balcony"], [/piscine/, "pool"], [/gym|salle d.entrainement|exercice/, "gym"], [/rangement|locker|entreposage|walk-?in|penderie/, "box"], [/garage/, "garage"], [/stationnement|parking|abri d.auto/, "parking"], [/meuble/, "sofa"], [/non-?fumeur|sans fumee/, "nosmoke"], [/animau|chat|chien|\bpet\b/, "paw"], [/foyer|cheminee|poele a bois/, "fire"], [/spa\b|jacuzzi|sauna|bain tourbillon/, "spa"], [/securite|surveill|camera|alarme|interphone|concierge|portier/, "shield"], [/\bvue\b|panoram/, "eye"], [/bord de l.eau|acces au lac|\blac\b|riviere|plage|navigable/, "waves"], [/cour|jardin|arbre|boise|verdure|gazon|amenagement paysager/, "tree"], [/ensoleill|luminosite|lumineux|solarium/, "sun"], [/dispo|libre |libre$/, "calendar"], [/pi2|pieds carres|superficie|\bm2\b/, "ruler"], [/chambre/, "bed"], [/salle[s]? de bain|salle[s]? d.eau|douche|\bsdb\b/, "bath"], [/occupant|personne|colocataire/, "people"], [/etage|niveau|escalier|mezzanine/, "stairs"], [/studio|loft|(^|\s)\d ?1\/2|½/, "door"], [/maison|plain-?pied|unifamiliale/, "home"], [/egout|septique|fosse/, "waves"], [/aqueduc|approvisionnement en eau|puits/, "droplet"], [/construction|neuve|fondation|toiture|revetement|renov/, "home"], [/commerce|zonage|usage/, "box"], ]; /** minuscules + accents neutralisés, pour un appariement robuste */ const norm = (s: string) => s.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""); export function amenityKey(label: string, fallback = "check"): string { const n = norm(label); for (const [re, key] of RULES) if (re.test(n)) return key; return fallback; } export default function AmenityIco({ label, size = 16, fallback = "check" }: { label: string; size?: number; fallback?: string }) { return ( ); }