SPB Git forge

spb/lou-ka

Public

Lou·Ka — tous les logements à louer du Québec, un seul endroit.

232commits 1branches 0releases
172.9 MBsize
maindefault branch
2 days agolast push
HTML 98.9% Python 0.6%
13.0 KB · 449 lines tsx
Raw Blame History
1// -----------------------------------------------------------------------------2// Lou-Ka — Agrégateur de logements à louer (province de Québec)3// Auteur : Simon-Pierre Boucher — contact@spboucher.ai4// components/Icons.tsx : icônes SVG maison — style linéaire (outline),5//   trait moyen 2 px, extrémités arrondies, currentColor — conformes à6//   l'identité visuelle Lou-Ka (minimaliste et chaleureuse).7// -----------------------------------------------------------------------------8import { SVGProps } from "react";910type P = SVGProps<SVGSVGElement> & { size?: number };1112function Base({ size = 16, children, ...rest }: P) {13  return (14    <svg15      width={size} height={size} viewBox="0 0 24 24" fill="none"16      stroke="currentColor" strokeWidth="2" strokeLinecap="round"17      strokeLinejoin="round" aria-hidden="true" focusable="false" {...rest}18    >19      {children}20    </svg>21  );22}2324/** Maison au trait — pignon marqué + porte décalée (signature Lou-Ka) */25export const IcoHouse = (p: P) => (26  <Base {...p}>27    <path d="M4 11 12 4l8 7" />28    <path d="M6 10v10h12V10" />29    <path d="M13.5 20v-6h-3v6" />30  </Base>31);3233/** Immeuble à logements — fenêtres en grille */34export const IcoBuilding = (p: P) => (35  <Base {...p}>36    <path d="M5 20V5h10v15" />37    <path d="M15 9h4v11" />38    <path d="M3 20h18" />39    <path d="M8 8.5h1.5M11 8.5h1.5M8 12h1.5M11 12h1.5M8 15.5h1.5M11 15.5h1.5" strokeWidth="1.7" />40  </Base>41);4243export const IcoCamera = (p: P) => (44  <Base {...p}>45    <path d="M3 7h4l2-2.5h6L17 7h4v13H3z" />46    <circle cx="12" cy="13" r="3.4" />47  </Base>48);4950export const IcoPaw = (p: P) => (51  <Base {...p}>52    <path d="M12 12.5c-3 0-5 2.2-5 4.4 0 1.6 1.2 2.6 2.6 2.6 1 0 1.6-.4 2.4-.4s1.4.4 2.4.4c1.4 0 2.6-1 2.6-2.6 0-2.2-2-4.4-5-4.4z" />53    <path d="M7.2 10.2c.5 1-.1 2-1 2s-1.8-.8-1.8-1.9c0-1 .8-1.6 1.5-1.4.6.1 1 .6 1.3 1.3z" strokeWidth="1.7" />54    <path d="M16.8 10.2c-.5 1 .1 2 1 2s1.8-.8 1.8-1.9c0-1-.8-1.6-1.5-1.4-.6.1-1 .6-1.3 1.3z" strokeWidth="1.7" />55    <path d="M10.4 7.5c.3 1.1-.3 2.1-1.2 2.1-1 0-1.7-1-1.6-2.1.1-1 .9-1.7 1.7-1.5.6.2 1 .8 1.1 1.5z" strokeWidth="1.7" />56    <path d="M13.6 7.5c-.3 1.1.3 2.1 1.2 2.1 1 0 1.7-1 1.6-2.1-.1-1-.9-1.7-1.7-1.5-.6.2-1 .8-1.1 1.5z" strokeWidth="1.7" />57  </Base>58);5960export const IcoSofa = (p: P) => (61  <Base {...p}>62    <path d="M5 11V7.5A1.5 1.5 0 0 1 6.5 6h11A1.5 1.5 0 0 1 19 7.5V11" />63    <path d="M3 13.5A1.9 1.9 0 0 1 5 11.5c1.1 0 2 .9 2 2V14h10v-.5c0-1.1.9-2 2-2a1.9 1.9 0 0 1 2 2V18H3z" />64    <path d="M5 18v1.8M19 18v1.8" />65  </Base>66);6768export const IcoBolt = (p: P) => (69  <Base {...p}>70    <path d="M13 2 5 13.5h5.5L11 22l8-11.5h-5.5z" />71  </Base>72);7374export const IcoList = (p: P) => (75  <Base {...p}>76    <path d="M4 6h2M4 12h2M4 18h2" />77    <path d="M9.5 6H20M9.5 12H20M9.5 18H20" />78  </Base>79);8081/** Carte pliée (plan) */82export const IcoMap = (p: P) => (83  <Base {...p}>84    <path d="M3 6.5 9 4l6 2.5L21 4v13.5L15 20l-6-2.5L3 20z" />85    <path d="M9 4v13.5M15 6.5V20" />86  </Base>87);8889export const IcoPin = (p: P) => (90  <Base {...p}>91    <path d="M12 21s-6.5-6-6.5-11a6.5 6.5 0 0 1 13 0c0 5-6.5 11-6.5 11z" />92    <circle cx="12" cy="9.7" r="2.2" />93  </Base>94);9596/** Curseurs de filtres */97export const IcoSliders = (p: P) => (98  <Base {...p}>99    <path d="M4 8h10M18 8h2M4 16h2M10 16h10" />100    <path d="M14 5.8v4.4M6 13.8v4.4" />101  </Base>102);103104export const IcoSearch = (p: P) => (105  <Base {...p}>106    <circle cx="11" cy="11" r="7" />107    <path d="m20 20-3.5-3.5" />108  </Base>109);110111export const IcoAlert = (p: P) => (112  <Base {...p}>113    <path d="M12 3 2.5 20h19z" />114    <path d="M12 9.5v4.5" />115    <path d="M12 17.2v.1" strokeWidth="2.6" />116  </Base>117);118119export const IcoCompass = (p: P) => (120  <Base {...p}>121    <circle cx="12" cy="12" r="9" />122    <path d="m15.5 8.5-2.2 5-4.8 2 2.2-5z" />123  </Base>124);125126export const IcoChart = (p: P) => (127  <Base {...p}>128    <path d="M4 20V4" />129    <path d="M4 20h16" />130    <path d="M8.5 16v-5M13 16V8M17.5 16v-3.5" />131  </Base>132);133134export const IcoFolder = (p: P) => (135  <Base {...p}>136    <path d="M3 6h6l2 2.5h10V19H3z" />137  </Base>138);139140export const IcoLock = (p: P) => (141  <Base {...p}>142    <rect x="5" y="11" width="14" height="9" />143    <path d="M8 11V7.8A3.8 3.8 0 0 1 12 4a3.8 3.8 0 0 1 4 3.8V11" />144  </Base>145);146147export const IcoDoc = (p: P) => (148  <Base {...p}>149    <path d="M6 3h8l4 4v14H6z" />150    <path d="M14 3v4h4" />151    <path d="M9 12h6M9 15.5h6" />152  </Base>153);154155export const IcoHeart = (p: P & { filled?: boolean }) => {156  const { filled, ...rest } = p;157  return (158    <Base {...rest} fill={filled ? "currentColor" : "none"}>159      <path d="M12 20.5C7 16.5 3.5 13 3.5 9.3 3.5 6.8 5.5 5 7.8 5c1.7 0 3.2 1 4.2 2.6C13 6 14.5 5 16.2 5c2.3 0 4.3 1.8 4.3 4.3 0 3.7-3.5 7.2-8.5 11.2z" />160    </Base>161  );162};163164// -- réseaux sociaux (tracés au trait, même langage que le reste) --------------165166export const IcoUser = (p: P) => (167  <Base {...p}>168    <circle cx="12" cy="8" r="3.5" />169    <path d="M5 20c1.2-3.4 3.8-5 7-5s5.8 1.6 7 5" />170  </Base>171);172173export const IcoInstagram = (p: P) => (174  <Base {...p}>175    <rect x="4" y="4" width="16" height="16" rx="4.5" />176    <circle cx="12" cy="12" r="3.6" />177    <path d="M16.6 7.4v.1" strokeWidth="2.6" />178  </Base>179);180181export const IcoFacebook = (p: P) => (182  <Base {...p}>183    <path d="M14.8 4h-2.3a3.4 3.4 0 0 0-3.4 3.4V10H6.8v3.4h2.3V21h3.4v-7.6h2.6l.6-3.4h-3.2V7.8c0-.5.4-.9.9-.9h2.4z" />184  </Base>185);186187export const IcoX = (p: P) => (188  <Base {...p}>189    <path d="M4.5 4.5 19.5 19.5M19 4.5 5 19.5" />190  </Base>191);192193export const IcoLinkedIn = (p: P) => (194  <Base {...p}>195    <rect x="4" y="4" width="16" height="16" rx="2.5" />196    <path d="M8.2 10.5V16M8.2 8v.1" strokeWidth="2.2" />197    <path d="M11.8 16v-3.2a2 2 0 0 1 4 0V16" strokeWidth="2.2" />198  </Base>199);200201export const IcoTikTok = (p: P) => (202  <Base {...p}>203    <path d="M13.5 4v10.3a3.3 3.3 0 1 1-3.3-3.3" />204    <path d="M13.5 6.2c.8 2 2.6 3.4 4.8 3.6" />205  </Base>206);207208export const IcoYouTube = (p: P) => (209  <Base {...p}>210    <rect x="3" y="6" width="18" height="12" rx="3.5" />211    <path d="m10.3 9.5 4.6 2.5-4.6 2.5z" />212  </Base>213);214215export const IcoChevronLeft = (p: P) => (216  <Base {...p}>217    <path d="m14.5 5-7 7 7 7" />218  </Base>219);220221export const IcoChevronRight = (p: P) => (222  <Base {...p}>223    <path d="m9.5 5 7 7-7 7" />224  </Base>225);226227/* ---------------------------------------------------------------------------228   Icônes de la fiche logement (refonte 2026-09-04) — même style linéaire,229   trait 2 px, 24×24. Nommage aligné sur Lucide pour la lisibilité du code.230--------------------------------------------------------------------------- */231export const IcoMapPin = (p: P) => (232  <Base {...p}>233    <path d="M20 10c0 6-8 12-8 12S4 16 4 10a8 8 0 0 1 16 0z" />234    <circle cx="12" cy="10" r="3" />235  </Base>236);237export const IcoTrain = (p: P) => (238  <Base {...p}>239    <rect x="4" y="3" width="16" height="14" rx="3" />240    <path d="M4 11h16M8 21l2-4M16 21l-2-4M9 7h6" />241    <path d="M8.5 14h.01M15.5 14h.01" />242  </Base>243);244export const IcoBus = (p: P) => (245  <Base {...p}>246    <path d="M5 4h14a2 2 0 0 1 2 2v11H3V6a2 2 0 0 1 2-2z" />247    <path d="M3 11h18M7 17v3M17 17v3M7.5 14h.01M16.5 14h.01" />248  </Base>249);250export const IcoCart = (p: P) => (251  <Base {...p}>252    <path d="M3 4h2l2.4 11.2a2 2 0 0 0 2 1.6h8.4a2 2 0 0 0 2-1.6L21 8H6" />253    <circle cx="10" cy="20" r="1.2" /><circle cx="17" cy="20" r="1.2" />254  </Base>255);256export const IcoPill = (p: P) => (257  <Base {...p}>258    <path d="M10.5 20.5 3.5 13.5a5 5 0 0 1 7-7l7 7a5 5 0 0 1-7 7z" />259    <path d="M7 10l7 7" />260  </Base>261);262export const IcoSchool = (p: P) => (263  <Base {...p}>264    <path d="M3 10 12 5l9 5" />265    <path d="M5 11v8h14v-8" />266    <path d="M10 19v-4h4v4M12 5V3" />267  </Base>268);269export const IcoTrees = (p: P) => (270  <Base {...p}>271    <path d="M9 3 4.5 10h2L4 15h10l-2.5-5h2L9 3zM9 15v6" />272    <path d="M16 8l-2.5 4h1.5l-1.5 3h5l-1.5-3h1.5L16 8zM16 15v5" />273  </Base>274);275export const IcoFuel = (p: P) => (276  <Base {...p}>277    <path d="M4 21V5a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v16" />278    <path d="M3 21h12M6 8h6" />279    <path d="M14 10h2a2 2 0 0 1 2 2v5a1.5 1.5 0 0 0 3 0V9l-2.5-2.5" />280  </Base>281);282export const IcoWind = (p: P) => (283  <Base {...p}>284    <path d="M3 8h10a3 3 0 1 0-3-3" />285    <path d="M3 12h15a3 3 0 1 1-3 3" />286    <path d="M3 16h7" />287  </Base>288);289export const IcoDroplets = (p: P) => (290  <Base {...p}>291    <path d="M12 3s-6 6.5-6 10.5a6 6 0 0 0 12 0C18 9.5 12 3 12 3z" />292  </Base>293);294export const IcoWallet = (p: P) => (295  <Base {...p}>296    <path d="M3 7a2 2 0 0 1 2-2h13v4" />297    <rect x="3" y="7" width="18" height="12" rx="2" />298    <path d="M16 13h.01" />299  </Base>300);301export const IcoGraduation = (p: P) => (302  <Base {...p}>303    <path d="M2 9 12 4l10 5-10 5L2 9z" />304    <path d="M6 11.5V16c0 1.5 3 3 6 3s6-1.5 6-3v-4.5M22 9v5" />305  </Base>306);307export const IcoUsers = (p: P) => (308  <Base {...p}>309    <circle cx="9" cy="8" r="3.2" />310    <path d="M3.5 20c0-3.2 2.5-5.3 5.5-5.3s5.5 2.1 5.5 5.3" />311    <path d="M15.5 5.2a3.2 3.2 0 0 1 0 5.6M20.5 20c0-2.7-1.8-4.7-4.3-5.2" />312  </Base>313);314export const IcoShare = (p: P) => (315  <Base {...p}>316    <circle cx="18" cy="5" r="2.5" /><circle cx="6" cy="12" r="2.5" /><circle cx="18" cy="19" r="2.5" />317    <path d="M8.2 10.8 15.8 6.3M8.2 13.2l7.6 4.5" />318  </Base>319);320export const IcoSparkles = (p: P) => (321  <Base {...p}>322    <path d="M12 3l1.9 5.6L19.5 10.5l-5.6 1.9L12 18l-1.9-5.6L4.5 10.5l5.6-1.9L12 3z" />323    <path d="M19 16l.8 2.2L22 19l-2.2.8L19 22l-.8-2.2L16 19l2.2-.8L19 16z" />324  </Base>325);326export const IcoBed = (p: P) => (327  <Base {...p}>328    <path d="M3 18V7M3 13h18v5M3 10h7v3M21 13v-1a3 3 0 0 0-3-3h-8" />329  </Base>330);331export const IcoBath = (p: P) => (332  <Base {...p}>333    <path d="M4 12h16v2a5 5 0 0 1-5 5H9a5 5 0 0 1-5-5v-2z" />334    <path d="M6 12V6a2.5 2.5 0 0 1 4.6-1.3M7 19l-1 2M17 19l1 2" />335  </Base>336);337export const IcoRuler = (p: P) => (338  <Base {...p}>339    <path d="M3.5 16 16 3.5l4.5 4.5L8 20.5 3.5 16z" />340    <path d="M7.5 16l1.5 1.5M10.5 13l1.5 1.5M13.5 10l1.5 1.5M16.5 7 18 8.5" />341  </Base>342);343export const IcoCalendar = (p: P) => (344  <Base {...p}>345    <rect x="4" y="5" width="16" height="16" rx="2" />346    <path d="M4 10h16M8 3v4M16 3v4" />347  </Base>348);349export const IcoChevronDown = (p: P) => (350  <Base {...p}><path d="m6 9 6 6 6-6" /></Base>351);352export const IcoClose = (p: P) => (353  <Base {...p}><path d="M18 6 6 18M6 6l12 12" /></Base>354);355export const IcoCheck = (p: P) => (356  <Base {...p}><path d="m5 12.5 4.5 4.5L19 7.5" /></Base>357);358export const IcoInfo = (p: P) => (359  <Base {...p}>360    <circle cx="12" cy="12" r="9" /><path d="M12 11v5M12 8h.01" />361  </Base>362);363export const IcoExternal = (p: P) => (364  <Base {...p}>365    <path d="M14 4h6v6M20 4l-9 9" />366    <path d="M19 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h5" />367  </Base>368);369export const IcoExpand = (p: P) => (370  <Base {...p}>371    <path d="M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7" />372  </Base>373);374export const IcoWaves = (p: P) => (375  <Base {...p}>376    <path d="M3 8c1.5 1.3 3 1.3 4.5 0s3-1.3 4.5 0 3 1.3 4.5 0 3-1.3 4.5 0" />377    <path d="M3 13c1.5 1.3 3 1.3 4.5 0s3-1.3 4.5 0 3 1.3 4.5 0 3-1.3 4.5 0" />378    <path d="M3 18c1.5 1.3 3 1.3 4.5 0s3-1.3 4.5 0 3 1.3 4.5 0 3-1.3 4.5 0" />379  </Base>380);381export const IcoShield = (p: P) => (382  <Base {...p}>383    <path d="M12 3 5 6v5.5c0 4.4 3 7.6 7 9.5 4-1.9 7-5.1 7-9.5V6l-7-3z" />384  </Base>385);386export const IcoThermo = (p: P) => (387  <Base {...p}>388    <path d="M10 14.5V5a2 2 0 1 1 4 0v9.5a3.5 3.5 0 1 1-4 0z" />389  </Base>390);391export const IcoSnow = (p: P) => (392  <Base {...p}>393    <path d="M12 3v18M4 7.5l16 9M20 7.5l-16 9" />394  </Base>395);396export const IcoScale = (p: P) => (397  <Base {...p}>398    <path d="M12 3v18M5 21h14M12 6l7 2-3 7h-4M12 6 5 8l3 7h4" />399  </Base>400);401export const IcoTrendDown = (p: P) => (402  <Base {...p}><path d="m3 7 7 7 4-4 7 7M15 17h6v-6" /></Base>403);404export const IcoTrendUp = (p: P) => (405  <Base {...p}><path d="m3 17 7-7 4 4 7-7M15 7h6v6" /></Base>406);407export const IcoCoffee = (p: P) => (408  <Base {...p}>409    <path d="M4 9h12v6a4 4 0 0 1-4 4H8a4 4 0 0 1-4-4V9zM16 10h2a2.5 2.5 0 0 1 0 5h-2M7 3v3M11 3v3" />410  </Base>411);412export const IcoHospital = (p: P) => (413  <Base {...p}>414    <rect x="4" y="4" width="16" height="16" rx="2" />415    <path d="M12 8v8M8 12h8" />416  </Base>417);418export const IcoBook = (p: P) => (419  <Base {...p}>420    <path d="M4 5a2 2 0 0 1 2-2h13v16H6a2 2 0 0 0-2 2V5z" />421    <path d="M4 19a2 2 0 0 0 2 2h13" />422  </Base>423);424export const IcoDumbbell = (p: P) => (425  <Base {...p}>426    <path d="M6.7 6.7v10.6M17.3 6.7v10.6M3.5 9.2v5.6M20.5 9.2v5.6M6.7 12h10.6" />427  </Base>428);429export const IcoBaby = (p: P) => (430  <Base {...p}>431    <circle cx="12" cy="9" r="5" />432    <path d="M7 20a5 5 0 0 1 10 0M10 8.5h.01M14 8.5h.01M10.5 11.5c.8.7 2.2.7 3 0" />433  </Base>434);435export const IcoStore = (p: P) => (436  <Base {...p}>437    <path d="M3 9 5 4h14l2 5M3 9h18v3a2.5 2.5 0 0 1-5 0 2.5 2.5 0 0 1-5 0 2.5 2.5 0 0 1-5 0 2.5 2.5 0 0 1-3 2.4V9z" />438    <path d="M5 14v6h14v-6M10 20v-4h4v4" />439  </Base>440);441export const IcoBolt2 = (p: P) => (442  <Base {...p}><path d="M13 2 4.5 13.5H11l-1.5 8.5 8.5-11.5H12.5L13 2z" /></Base>443);444export const IcoLayers = (p: P) => (445  <Base {...p}>446    <path d="m12 3 9 5-9 5-9-5 9-5z" /><path d="m3 13 9 5 9-5M3 17.5l9 5 9-5" />447  </Base>448);449