Resto·Ka — tous les restaurants du Québec, menus complets et prix réels (famille ·Ka)
Python 69.3%
TypeScript 16.7%
CSS 7.9%
JavaScript 4.7%
HTML 1.4%
1// Auteur : Simon-Pierre Boucher — contact@spboucher.ai2// ka-ui/react/KaFooter.tsx — footer commun Groupe KA (fond encre), à vendorer3// dans chaque app Vite/React sous frontend/src/ka/. Consomme ecosystem.json :4// toute modification des infos de contact se fait dans ka-ui/ecosystem.json5// puis se resynchronise sur les 12 sites (voir ka-ui/README.md).6import eco from "./ecosystem.json";78type LocalLink = { label: string; href: string };910export default function KaFooter({11 siteId,12 localLegal = [],13}: {14 /** id du site courant dans ecosystem.json (ex. "resto-ka") */15 siteId: string;16 /** pages légales PROPRES au site (ex. /conditions), affichées avant celles du hub */17 localLegal?: LocalLink[];18}) {19 const year = new Date().getFullYear();20 const site = eco.sites.find((s) => s.id === siteId);21 const others = eco.sites.filter((s) => s.id !== siteId);22 return (23 <footer className="ka-footer" id="contact">24 <div className="container">25 <a26 className="wordmark"27 href={eco.hub.url}28 target={siteId === "groupe-ka" ? undefined : "_blank"}29 rel="noopener noreferrer"30 aria-label="Groupe KA — le portail de l'écosystème"31 >32 Groupe <span className="ka">KA</span>33 </a>34 <p className="desc">35 {eco.org.tagline} Des centaines de connecteurs lisent les sites à la36 source, normalisent la donnée et se resynchronisent seuls.{" "}37 {site ? (38 <>39 <b style={{ color: "var(--paper)" }}>{site.wordmark}</b> —{" "}40 {site.tagline} — est un service Groupe KA.41 </>42 ) : null}43 </p>44 <p className="notice">45 <b>{eco.org.disclaimer}</b>46 </p>47 <ul className="sites">48 {others.map((s) => (49 <li key={s.id}>50 <a href={`https://${s.domain}`} target="_blank" rel="noopener noreferrer">51 {s.wordmark}52 </a>53 </li>54 ))}55 {eco.extraFooterLinks.map((l) => (56 <li key={l.href}>57 <a href={l.href} target="_blank" rel="noopener noreferrer">58 {l.label}59 </a>60 </li>61 ))}62 </ul>63 <div className="contacts">64 {eco.contacts.map((c) => (65 <p key={c.email} style={{ margin: 0 }}>66 <a href={`mailto:${c.email}`}>{c.email}</a>67 <span>{c.role}</span>68 </p>69 ))}70 </div>71 <p className="legal">72 © {year} {eco.org.copyrightHolder}73 {localLegal.map((l) => (74 <span key={l.href}>75 {" · "}76 <a href={l.href}>{l.label}</a>77 </span>78 ))}79 {eco.legal.map((l) => (80 <span key={l.href}>81 {" · "}82 <a href={l.href} target="_blank" rel="noopener noreferrer">83 {l.label}84 </a>85 </span>86 ))}87 </p>88 </div>89 </footer>90 );91}92