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%
4.8 KB · 106 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/Logo.tsx : icône officielle Lou-Ka — la porte entrouverte qui5//   laisse entrer la lumière. Spécifications géométriques (grille 100 × 100) :6//   A. cadre : rect vertical 60 × 90 centré, rx 19 (squircle), contour seul7//      7,5 u, dégradé orange #FF7A1A → #F56000, extrémités arrondies ;8//   B. porte : parallélogramme charnières à GAUCHE, ouverte ≈ 30° vers le9//      spectateur, coins droits rapprochés verticalement (fuite ≈ 9°), marine10//      #101A3D → #0B1330, coins adoucis ; coin de lumière (espace négatif)11//      entre la porte et le cadre droit, s'élargissant vers le bas ;12//   C. tapis de lumière : trapèze au seuil (≈ 30 u) s'évasant vers l'avant13//      (≈ 49 u), bord avant arrondi touchant le trait bas du cadre,14//      dégradé #FF8533 → #FF6A00.15//   Ordre des calques : porte → tapis → cadre → reflet. Finition « liquid16//   glass » : reflet blanc 28 % sur la courbe haute + ombre portée douce17//   marine 14 %. Version flat (sans dégradés) : favicon + icône PWA.18//   Baseline : « La porte d'entrée vers votre prochain chez-vous. »19// -----------------------------------------------------------------------------2021/** Icône seule (fond transparent — pour fonds clairs ; dark = porte blanche). */22export function LogoIcon({ size = 30, dark = false }: { size?: number; dark?: boolean }) {23  // dark = version pour fond bleu marine : la porte devient blanche24  const doorTop = dark ? "#ffffff" : "#101a3d";25  const doorBot = dark ? "#e8edf8" : "#0b1330";26  const uid = dark ? "lk-dark" : "lk-light-bg";27  return (28    <svg29      className="logo-ico"30      width={size}31      height={size}32      viewBox="0 0 100 100"33      fill="none"34      aria-hidden="true"35    >36      <defs>37        {/* cadre : orange plus lumineux en haut, plus saturé en bas */}38        <linearGradient id={`${uid}-frame`} x1="0" y1="0" x2="0" y2="1">39          <stop offset="0" stopColor="#ff7a1a" />40          <stop offset="1" stopColor="#f56000" />41        </linearGradient>42        {/* porte : micro-dégradé de profondeur */}43        <linearGradient id={`${uid}-door`} x1="0" y1="0" x2="0" y2="1">44          <stop offset="0" stopColor={doorTop} />45          <stop offset="1" stopColor={doorBot} />46        </linearGradient>47        {/* tapis : lumière chaude qui se diffuse vers l'avant */}48        <linearGradient id={`${uid}-light`} x1="0" y1="0" x2="0" y2="1">49          <stop offset="0" stopColor="#ff8533" />50          <stop offset="1" stopColor="#ff6a00" />51        </linearGradient>52        {/* ombre portée très douce, teinte marine — jamais d'ombre dure */}53        <filter id={`${uid}-soft`} x="-25%" y="-25%" width="150%" height="150%">54          <feDropShadow dx="0" dy="2" stdDeviation="3" floodColor="#0b1330" floodOpacity="0.14" />55        </filter>56      </defs>57      <g filter={`url(#${uid}-soft)`}>58        {/* B — porte entrouverte : charnière gauche, fuite en perspective à droite ;59            le coin de lumière (espace vide) s'élargit vers le bas */}60        <path61          d="M29 17 L66 22.5 L62 73.5 L29 79 Z"62          fill={`url(#${uid}-door)`}63          stroke={`url(#${uid}-door)`}64          strokeWidth="4"65          strokeLinejoin="round"66        />67        {/* C — tapis de lumière : du seuil vers l'avant-droite, bord avant arrondi68            qui touche le trait inférieur du cadre */}69        <path70          d="M37 77.4 L63 73.2 L74.8 88.5 Q76.4 92.5 71.6 92.5 L34.5 92.5 Q30.2 92.5 32 88.6 Z"71          fill={`url(#${uid}-light)`}72        />73        {/* A — cadre : contour seul, coins très arrondis (squircle vertical) */}74        <rect75          x="20" y="5" width="60" height="90" rx="19"76          stroke={`url(#${uid}-frame)`}77          strokeWidth="7.5"78          strokeLinecap="round"79          strokeLinejoin="round"80        />81        {/* reflet spéculaire « liquid glass » sur la courbe supérieure */}82        <path83          d="M31 6.8 Q50 4.4 69 6.8"84          stroke="#ffffff"85          strokeOpacity="0.28"86          strokeWidth="2.6"87          strokeLinecap="round"88        />89      </g>90    </svg>91  );92}9394/** Logo horizontal complet : icône + wordmark « Lou-Ka »95 *  (Lou- marine, Ka orange ; espace icône↔texte ≈ 40 % de la largeur d'icône). */96export default function Logo({ size = 30 }: { size?: number }) {97  return (98    <span style={{ display: "inline-flex", alignItems: "center", gap: size * 0.4 * 0.6 }}>99      <LogoIcon size={size} />100      <span style={{ color: "#0b1330", fontWeight: 700, letterSpacing: "-0.005em" }}>101        Lou-<span style={{ color: "#ff6a00" }}>Ka</span>102      </span>103    </span>104  );105}106