/* ----------------------------------------------------------------------------- House-Ka — Homes-for-sale aggregator (Canada outside Québec, Ontario first) Author: Simon-Pierre Boucher — contact@spboucher.ai styles.css : House-Ka business classes on top of the shared Groupe KA design system (ka/tokens.css, imported BEFORE this file in main.tsx). House-Ka overrides MORE than the accent: pine/cream palette + serif display type (Fraunces) — a deliberately different skin from Immo-Ka. ----------------------------------------------------------------------------- */ :root { /* ---- House-Ka PINE accent + warm cream paper + serif display ---- */ --accent: #0f6b4f; --accent-soft: #dcefe6; --accent-deep: #0a4a37; --on-accent: #ffffff; --paper: #faf7f0; --ink: #14201a; --font-display: "Fraunces", "Iowan Old Style", Georgia, serif; /* legacy aliases — all the business CSS below uses --lime */ --lime: var(--accent); --lime-soft: var(--accent-soft); } /* Serif display: Fraunces is wider than Space Grotesk — soften the tracking */ h1, h2, h3, h4, .brand, .price, .card-price { letter-spacing: -0.015em; } /* Ancre sous le header collant (spécifique Immo-Ka) */ html { scroll-padding-top: 76px; } h1, h2, h3, h4 { margin: 0; } a { text-decoration: none; } button { font-family: inherit; } .mono { font-family: var(--font-mono); } .kicker { font-family: var(--font-mono); font-size: 11.5px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.14em; color: var(--green); display: inline-flex; align-items: center; gap: 8px; } .kicker::before { content: ""; width: 22px; height: 2px; background: var(--green); } .container { max-width: 1240px; margin: 0 auto; padding: 0 24px; } @media (max-width: 640px) { .container { padding: 0 16px; } } /* ================= Header ================= */ .header { position: sticky; top: 0; z-index: var(--z-header, 500); background: var(--paper); border-bottom: 2px solid var(--ink); } /* Menu mobile ouvert : le panneau vit DANS le header — on monte tout le header au niveau modale pour qu il passe au-dessus du voile (--z-overlay). */ .header:has(.mobile-menu.open) { z-index: var(--z-modal, 900); } .header-inner { display: flex; align-items: center; gap: 20px; height: 64px; } .brand { font-family: var(--font-display); font-weight: 700; font-size: 26px; letter-spacing: -0.04em; display: flex; align-items: center; line-height: 1; } .brand .ka { background: var(--ink); color: var(--lime); padding: 2px 7px 4px; border-radius: 6px; margin-left: 3px; transform: rotate(-2deg); transition: transform 0.2s ease; } .brand:hover .ka { transform: rotate(0deg); } .brand-tag { font-family: var(--font-mono); font-size: 10.5px; color: var(--ink-3); letter-spacing: 0.08em; text-transform: uppercase; margin-left: 12px; } @media (max-width: 860px) { .brand-tag { display: none; } } .nav { margin-left: auto; display: flex; gap: 4px; } .nav a { padding: 9px 16px; border-radius: 999px; font-weight: 600; font-size: 14px; color: var(--ink-2); border: 1.5px solid transparent; transition: all 0.15s ease; min-height: 40px; display: inline-flex; align-items: center; } .nav a:hover { border-color: var(--ink); color: var(--ink); } .nav a.active { background: var(--ink); color: var(--lime); } /* ================= Ticker ================= */ .ticker { background: var(--ink); color: var(--lime); overflow: hidden; font-family: var(--font-mono); font-size: 11.5px; letter-spacing: 0.1em; text-transform: uppercase; padding: 7px 0; white-space: nowrap; border-bottom: 1px solid rgba(15, 107, 79, 0.25); } .ticker-track { display: inline-flex; gap: 0; animation: ticker 48s linear infinite; will-change: transform; } .ticker span { padding: 0 26px; position: relative; } .ticker span::after { content: "◆"; position: absolute; right: -6px; opacity: 0.5; font-size: 8px; top: 3px; } @keyframes ticker { from { transform: translateX(0); } to { transform: translateX(-50%); } } @media (prefers-reduced-motion: reduce) { .ticker-track { animation: none; } * { transition-duration: 0.01ms !important; } } /* ================= Hero ================= */ .hero { position: relative; padding: 64px 0 26px; } @media (max-width: 640px) { .hero { padding: 36px 0 14px; } } /* halo cerise + trame de points en fond — décoratif, sous le texte */ .hero::before { content: ""; position: absolute; z-index: -1; top: -60px; right: -120px; width: 580px; height: 460px; pointer-events: none; background: radial-gradient(closest-side, rgba(15, 107, 79, 0.12), transparent 72%); } .hero::after { content: ""; position: absolute; z-index: -1; inset: -20px -40px 0 0; pointer-events: none; background-image: radial-gradient(rgba(20, 24, 20, 0.18) 1.2px, transparent 1.7px); background-size: 22px 22px; -webkit-mask-image: linear-gradient(112deg, transparent 58%, rgba(0, 0, 0, 0.9)); mask-image: linear-gradient(112deg, transparent 58%, rgba(0, 0, 0, 0.9)); } .hero h1 { font-size: clamp(38px, 6.4vw, 78px); font-weight: 700; line-height: 0.98; text-transform: uppercase; letter-spacing: -0.035em; max-width: 940px; margin-top: 14px; } .hero h1 .outline { color: transparent; -webkit-text-stroke: 2px var(--ink); } .hero h1 .hl { background: var(--lime); color: #fff; padding: 0 10px; border-radius: 8px; display: inline-block; transform: rotate(-1deg); } .hero p.lede { color: var(--ink-2); font-size: 16.5px; max-width: 680px; margin: 20px 0 0; } @media (max-width: 640px) { .hero::before { width: 320px; height: 260px; top: -30px; right: -90px; } } .stat-row { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 28px; } .stat-chip { background: var(--surface); border: 1.5px solid var(--ink); border-radius: 999px; padding: 8px 16px; font-family: var(--font-mono); font-size: 12px; color: var(--ink-2); display: flex; gap: 8px; align-items: center; box-shadow: 3px 3px 0 rgba(26, 18, 20, 0.12); transition: transform 0.13s ease, box-shadow 0.13s ease; } @media (hover: hover) { .stat-chip:hover { transform: translate(-1px, -1px); box-shadow: 4px 4px 0 rgba(26, 18, 20, 0.2); } } .stat-chip b { color: var(--ink); font-weight: 700; font-variant-numeric: tabular-nums; } .stat-chip .pulse { width: 8px; height: 8px; border-radius: 50%; background: var(--green); box-shadow: 0 0 0 4px var(--lime-soft); animation: pulse 2.4s ease infinite; } @keyframes pulse { 50% { box-shadow: 0 0 0 7px rgba(15, 107, 79, 0.4); } } /* ================= Filter bar ================= */ .filterbar { background: var(--surface); border: 2px solid var(--ink); border-radius: 14px; box-shadow: var(--shadow-off-soft); padding: 14px; margin: 34px 0 6px; display: flex; flex-direction: column; gap: 0; min-width: 0; } .f-primary { display: flex; gap: 10px; align-items: stretch; flex-wrap: wrap; min-width: 0; } .f-search { flex: 1 1 240px; min-width: 0; display: flex; align-items: center; gap: 9px; border: 1.5px solid var(--ink); border-radius: 9px; background: var(--surface-2); padding: 0 14px; min-height: 52px; color: var(--ink-2); transition: box-shadow 0.15s ease, background 0.15s ease, color 0.15s ease; } .f-search:focus-within { box-shadow: 3px 3px 0 var(--lime); background: var(--surface); color: var(--accent-deep); } .f-search input { border: none; background: none; outline: none; flex: 1; min-width: 0; font-size: 15px; color: var(--ink); font-family: inherit; } .f-search input::placeholder { color: var(--ink-3); } .f-clear { border: none; background: var(--line); color: var(--ink-2); border-radius: 50%; width: 22px; height: 22px; font-size: 10px; cursor: pointer; flex: none; display: grid; place-items: center; transition: background 0.12s ease, color 0.12s ease; } .f-clear:hover { background: var(--ink); color: #fff; } .f-ctl { flex: 0 1 auto; min-width: 0; display: flex; flex-direction: column; justify-content: center; gap: 2px; border: 1.5px solid var(--ink); border-radius: 9px; background: var(--surface); padding: 7px 12px 6px; min-height: 52px; cursor: pointer; transition: box-shadow 0.15s ease, background 0.15s ease; } @media (hover: hover) { .f-ctl:hover { background: var(--surface-2); } } .f-ctl:focus-within { box-shadow: 3px 3px 0 var(--lime); background: var(--surface); } .f-ctl > span { font-family: var(--font-mono); font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.12em; color: var(--ink-3); } .f-ctl select { border: none; background: transparent; outline: none; font-family: var(--font-display); font-weight: 700; font-size: 14.5px; color: var(--ink); cursor: pointer; appearance: none; -webkit-appearance: none; padding-right: 16px; min-width: 0; max-width: 180px; text-overflow: ellipsis; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9' height='5'%3E%3Cpath d='M0 0l4.5 5L9 0z' fill='%23141814'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right center; } .range-pair { display: flex; align-items: center; gap: 4px; } .range-pair select { max-width: 92px; } .range-sep { color: var(--ink-3); font-family: var(--font-mono); font-size: 11px; } .f-more { flex: none; align-self: stretch; display: inline-flex; align-items: center; gap: 8px; border: 1.5px solid var(--ink); border-radius: 9px; background: var(--surface); color: var(--ink); padding: 0 18px; cursor: pointer; font-family: var(--font-display); font-weight: 700; font-size: 14px; min-height: 52px; transition: transform 0.13s ease, box-shadow 0.13s ease, background 0.13s ease, color 0.13s ease; } .f-more:hover { transform: translate(-1px, -1px); box-shadow: var(--shadow-off-mid); background: var(--surface); } .f-more:active { transform: none; box-shadow: none; } .f-more.on { background: var(--ink); border-color: var(--ink); color: var(--lime); box-shadow: 3px 3px 0 var(--lime); } .f-more.on:hover { transform: none; } .f-more-badge { display: inline-grid; place-items: center; min-width: 20px; height: 20px; padding: 0 6px; border-radius: 999px; background: var(--lime); color: var(--on-accent); font-size: 11.5px; font-weight: 700; font-variant-numeric: tabular-nums; } .f-chev { width: 8px; height: 8px; flex: none; border-right: 2px solid currentColor; border-bottom: 2px solid currentColor; transform: rotate(45deg); margin-top: -4px; transition: transform 0.18s ease, margin 0.18s ease; } .f-chev.up { transform: rotate(-135deg); margin-top: 4px; } .f-adv { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 18px 26px; border-top: 1.5px dashed var(--line); margin-top: 14px; padding-top: 16px; min-width: 0; animation: adv-in 0.22s cubic-bezier(0.2, 0.9, 0.3, 1); } @keyframes adv-in { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } } .f-group { display: flex; flex-direction: column; gap: 7px; min-width: 0; } .f-group > label { font-family: var(--font-mono); font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.12em; color: var(--ink-3); } .f-group-end { justify-content: flex-end; } .f-group .btn:disabled { opacity: 0.4; cursor: default; } .f-native { border: 1.5px solid var(--line); background: var(--surface-2); border-radius: var(--r-ctl); padding: 10px 30px 10px 12px; font-size: 14px; color: var(--ink); outline: none; font-family: inherit; min-height: 42px; width: 100%; min-width: 0; appearance: none; -webkit-appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23141814'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 12px center; } .f-native:focus { border-color: var(--ink); box-shadow: 3px 3px 0 var(--lime); } .seg { display: inline-flex; flex-wrap: wrap; row-gap: 6px; } .seg button { border: 1.5px solid var(--ink); background: var(--surface); color: var(--ink-2); padding: 8px 13px; font-family: var(--font-display); font-weight: 600; font-size: 13px; cursor: pointer; margin-left: -1.5px; white-space: nowrap; min-height: 40px; transition: background 0.12s ease, color 0.12s ease, box-shadow 0.12s ease; } .seg button:first-child { border-radius: 8px 0 0 8px; margin-left: 0; } .seg button:last-child { border-radius: 0 8px 8px 0; } .seg button:hover { background: var(--lime-soft); color: var(--ink); } .seg button.on { background: var(--ink); color: var(--lime); position: relative; z-index: 1; box-shadow: inset 0 -2.5px 0 var(--lime); } /* pastilles de filtres actifs — survol = intention de retrait (danger) */ .pills { display: flex; flex-wrap: wrap; gap: 8px; margin: 12px 0 2px; } .pills .pill { display: inline-flex; align-items: center; gap: 7px; border: 1.5px solid var(--ink); background: var(--surface); color: var(--ink); border-radius: 999px; padding: 6px 13px; font-size: 12.5px; font-weight: 600; font-family: var(--font-mono); text-transform: none; letter-spacing: normal; cursor: pointer; transition: all 0.13s ease; box-shadow: 2px 2px 0 var(--lime-soft); animation: pill-in 0.18s ease; } @keyframes pill-in { from { opacity: 0; transform: scale(0.9); } to { opacity: 1; transform: none; } } .pills .pill:hover { background: var(--danger-soft); border-color: var(--danger); color: var(--danger); box-shadow: none; } .pills .pill:hover .pill-x { opacity: 1; } .pill-x { font-size: 10px; opacity: 0.6; } .pills .pill-clear { background: var(--surface); border-color: var(--danger); color: var(--danger); box-shadow: none; } .pills .pill-clear:hover { background: var(--danger); color: #fff; } .link-btn { background: none; border: none; padding: 0; color: var(--green); font: inherit; text-decoration: underline; cursor: pointer; } .btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; border: 1.5px solid var(--ink); border-radius: var(--r-ctl); padding: 11px 20px; font-weight: 700; font-size: 14px; cursor: pointer; min-height: 44px; background: var(--surface); color: var(--ink); transition: transform 0.12s ease, box-shadow 0.12s ease, background 0.15s ease, color 0.15s ease; font-family: var(--font-display); letter-spacing: 0.01em; text-decoration: none; } .btn:hover { transform: translate(-1px, -1px); box-shadow: var(--shadow-off-mid); } .btn:active { transform: translate(2px, 2px); box-shadow: none !important; } .btn:disabled { opacity: 0.45; pointer-events: none; } .btn-primary { background: var(--ink); color: var(--lime); box-shadow: 4px 4px 0 rgba(26, 18, 20,0.25); } .btn-primary:hover { background: var(--green-deep); box-shadow: 4px 4px 0 rgba(26, 18, 20,0.25); } .btn-ghost { background: transparent; color: var(--ink); } .btn-ghost:hover { background: var(--lime); color: #fff; box-shadow: 4px 4px 0 rgba(26, 18, 20,0.2); } /* ================= Chips ================= */ .chips { display: flex; gap: 8px; margin: 16px 0 4px; overflow-x: auto; padding-bottom: 6px; scrollbar-width: none; } .chips::-webkit-scrollbar { display: none; } .chip { display: inline-flex; align-items: center; gap: 7px; border: 1.5px solid var(--ink); background: var(--surface); color: var(--ink); border-radius: 999px; padding: 9px 18px; font-size: 13.5px; font-weight: 600; cursor: pointer; font-family: var(--font-display); white-space: nowrap; min-height: 42px; transition: transform 0.13s ease, box-shadow 0.13s ease, background 0.13s ease, color 0.13s ease; } .chip:hover { transform: translate(-1px, -1px); box-shadow: var(--shadow-off-mid); } .chip:active { transform: none; box-shadow: none; } .chip.on { background: var(--ink); color: var(--lime); box-shadow: 3px 3px 0 var(--lime); } /* ================= Results ================= */ .results-head { display: flex; align-items: baseline; gap: 14px; margin: 28px 0 18px; flex-wrap: wrap; } .results-head h2 { font-size: 22px; text-transform: uppercase; letter-spacing: -0.02em; } .results-head > span { font-family: var(--font-mono); color: var(--ink-3); font-size: 12px; letter-spacing: 0.06em; } .results-tools { display: flex; align-items: center; gap: 12px; margin-left: auto; } .sort-ctl select { border: 1.5px solid var(--ink); background: var(--surface); border-radius: var(--r-ctl); padding: 8px 28px 8px 12px; min-height: 36px; font-family: var(--font-mono); font-size: 12px; color: var(--ink); cursor: pointer; appearance: none; -webkit-appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23141814'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 10px center; transition: box-shadow 0.13s ease; } .sort-ctl select:hover { box-shadow: 2px 2px 0 rgba(26, 18, 20, 0.18); } .sort-ctl select:focus { outline: none; box-shadow: 3px 3px 0 var(--lime); } .view-toggle { display: inline-flex; border: 1.5px solid var(--ink); border-radius: var(--r-ctl); overflow: hidden; background: var(--surface); box-shadow: var(--shadow-flat); } .view-toggle button { display: inline-flex; align-items: center; gap: 6px; border: 0; background: transparent; padding: 8px 14px; min-height: 36px; cursor: pointer; font-family: var(--font-mono); font-size: 12px; font-weight: 700; color: var(--ink-2); transition: background 0.12s ease, color 0.12s ease; } .view-toggle button:hover { background: var(--surface-2); color: var(--ink); } .view-toggle button + button { border-left: 1.5px solid var(--ink); } .view-toggle button.on { background: var(--ink); color: var(--lime); box-shadow: inset 0 -2.5px 0 var(--lime); } .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(290px, 1fr)); gap: 22px; padding-bottom: 20px; } @media (max-width: 640px) { .grid { grid-template-columns: 1fr; gap: 16px; } } .more-wrap { display: flex; justify-content: center; padding: 8px 0 70px; } .card { background: var(--surface); border: 1.5px solid var(--line-strong); border-radius: var(--r-card); overflow: hidden; display: flex; flex-direction: column; box-shadow: var(--shadow-flat); transition: transform 0.16s ease, box-shadow 0.16s ease; } .card:hover { transform: translate(-3px, -3px); box-shadow: var(--shadow-off); } .card:focus-visible { outline: 3px solid var(--lime); outline-offset: 2px; } .card-img { position: relative; aspect-ratio: 16/10.5; background: repeating-linear-gradient(45deg, #eceae3 0 12px, #f3f1ea 12px 24px); overflow: hidden; } .card-img img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.4s ease; } .card:hover .card-img img { transform: scale(1.05); } .card-img .noimg { display: flex; align-items: center; justify-content: center; height: 100%; color: var(--ink-3); font-size: 34px; } .badge { position: absolute; top: 12px; left: 12px; border-radius: 6px; padding: 4px 10px; font-family: var(--font-mono); font-size: 11.5px; font-weight: 700; letter-spacing: 0.04em; background: rgba(255, 255, 255, 0.95); color: var(--ink); border: 1px solid var(--ink); } .badge.type { background: var(--ink); color: var(--lime); border-color: var(--ink); } .badge.right { left: auto; right: 12px; background: rgba(255,255,255,0.92); border-color: transparent; } .card-body { padding: 16px 18px; display: flex; flex-direction: column; gap: 6px; flex: 1; } .card-price { font-family: var(--font-display); font-weight: 700; font-size: 21px; letter-spacing: -0.02em; } .card-title { font-weight: 600; font-size: 14.5px; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .card-meta { color: var(--ink-3); font-size: 12.5px; display: flex; gap: 7px; flex-wrap: wrap; align-items: center; font-family: var(--font-mono); } .card-meta .sep { width: 4px; height: 4px; background: var(--lime); border: 1px solid var(--ink); border-radius: 1px; transform: rotate(45deg); } .card-specs { display: flex; gap: 12px; font-size: 12.5px; color: var(--ink-2); font-family: var(--font-mono); } .card-foot { margin-top: auto; padding-top: 11px; border-top: 1.5px dashed var(--line); display: flex; justify-content: space-between; align-items: center; gap: 8px; } .source-tag { font-family: var(--font-mono); font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: var(--green-deep); background: var(--lime-soft); border: 1px solid var(--green); border-radius: 4px; padding: 3px 8px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 62%; } .avail { font-size: 11px; color: var(--ink-3); font-weight: 500; text-align: right; font-family: var(--font-mono); } /* ================= Skeletons ================= */ @keyframes shimmer { 0% { background-position: -400px 0; } 100% { background-position: 400px 0; } } .skel { border-radius: var(--r-card); border: 1.5px solid var(--line); overflow: hidden; background: var(--surface); } .skel .sk-img, .skel .sk-line { background: linear-gradient(90deg, #eeece5 25%, #f7f5ef 50%, #eeece5 75%); background-size: 800px 100%; animation: shimmer 1.4s infinite linear; } .skel .sk-img { aspect-ratio: 16/10.5; } .skel .sk-line { height: 14px; border-radius: 4px; margin: 12px 16px; } .skel .sk-line.short { width: 45%; } /* ================= Empty / error ================= */ .notice { text-align: center; padding: 72px 24px; color: var(--ink-2); } .notice .big { font-size: 44px; margin-bottom: 10px; } .notice h2 { text-transform: uppercase; } /* ================= Detail page ================= */ .detail { padding: 30px 0 90px; } .crumbs { font-family: var(--font-mono); font-size: 11.5px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-3); margin-bottom: 20px; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; } .crumbs a { border-bottom: 1.5px solid transparent; } .crumbs a:hover { color: var(--green); border-color: var(--green); } /* Ordre DOM = ordre visuel sur TOUS les breakpoints (standard Groupe Ka « Ordre des sections — pages détail »). Interdit : `order` / `column-reverse` / `display:contents` pour réordonner — un bloc sans `order` retombe à order:0 et passe devant la galerie sur mobile (bug corrigé sur Lou-Ka). Mobile : colonnes empilées ; desktop : grid 2 colonnes (fiche | annexes). */ .fiche { display: flex; flex-direction: column; gap: 22px; } .f-col { display: flex; flex-direction: column; gap: 22px; min-width: 0; } @media (min-width: 900px) { .fiche { display: grid; grid-template-columns: 1.6fr 1fr; gap: 30px; align-items: start; } .f-col { gap: 26px; } .f-col:last-child { position: sticky; top: 88px; } } .f-bloc { min-width: 0; } .f-bloc h2 { font-size: 21px; letter-spacing: -0.02em; margin-bottom: 12px; border-left: 4px solid var(--lime); padding-left: 10px; } .f-bloc:empty { display: none; } /* galerie */ .carousel { position: relative; border-radius: var(--r-card); overflow: hidden; border: 1.5px solid var(--line-strong); background: var(--surface-2); box-shadow: var(--shadow-off-soft); } .carousel-track { display: flex; overflow-x: auto; scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch; scrollbar-width: none; aspect-ratio: 16/11; } .carousel-track::-webkit-scrollbar { display: none; } .carousel-track img { flex: 0 0 100%; width: 100%; object-fit: cover; scroll-snap-align: center; cursor: zoom-in; } .carousel-empty { display: flex; align-items: center; justify-content: center; aspect-ratio: 16/11; font-size: 48px; } .carousel-count { position: absolute; right: 12px; bottom: 12px; z-index: 2; background: rgba(26, 18, 20, 0.82); color: var(--lime); font-family: var(--font-mono); font-size: 12px; font-weight: 700; padding: 4px 10px; border-radius: 999px; } .carousel-nav { position: absolute; top: 50%; transform: translateY(-50%); z-index: 2; width: 44px; height: 44px; border-radius: 50%; border: 1.5px solid var(--ink); background: rgba(255, 255, 255, 0.92); font-size: 22px; cursor: pointer; display: flex; align-items: center; justify-content: center; line-height: 1; } .carousel-nav.prev { left: 10px; } .carousel-nav.next { right: 10px; } @media (max-width: 640px) { .carousel-nav { display: none; } } .thumbs { display: grid; grid-template-columns: repeat(auto-fill, minmax(84px, 1fr)); gap: 8px; margin-top: 10px; } .thumbs button { border: 2px solid var(--line); border-radius: 8px; overflow: hidden; padding: 0; cursor: pointer; aspect-ratio: 4/3; background: #eceae3; transition: border-color 0.12s ease, transform 0.12s ease; } .thumbs button:hover { transform: translateY(-2px); } .thumbs button.on { border-color: var(--ink); box-shadow: 3px 3px 0 var(--lime); } .thumbs img { width: 100%; height: 100%; object-fit: cover; } @media (max-width: 640px) { .thumbs { display: flex; overflow-x: auto; scrollbar-width: none; } .thumbs::-webkit-scrollbar { display: none; } .thumbs button { flex: 0 0 84px; } } /* lightbox */ .lightbox { position: fixed; inset: 0; background: rgba(16, 18, 16, 0.94); z-index: 100; display: flex; align-items: center; justify-content: center; cursor: zoom-out; padding: max(16px, env(safe-area-inset-top)) 16px; } .lightbox img { max-width: 94vw; max-height: 86vh; border-radius: 6px; border: 2px solid var(--lime); object-fit: contain; } .lb-close { position: absolute; top: 18px; right: 22px; background: none; border: none; color: #fff; font-size: 30px; cursor: pointer; } .lb-nav { position: absolute; top: 50%; transform: translateY(-50%); background: none; border: none; color: var(--lime); font-size: 52px; cursor: pointer; padding: 0 22px; user-select: none; } .lb-nav.prev { left: 6px; } .lb-nav.next { right: 6px; } .lb-count { position: absolute; bottom: 24px; color: #c9ccc2; font-family: var(--font-mono); font-size: 13px; } /* hero panneau (colonne droite) */ .f-hero { background: var(--surface); border: 1.5px solid var(--ink); border-radius: var(--r-card); box-shadow: var(--shadow-off-soft); padding: 26px; } .price-kicker { font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; letter-spacing: 0.14em; color: var(--green); } .price-kicker::before { content: ""; display: inline-block; width: 16px; height: 2px; background: var(--lime); vertical-align: 3px; margin-right: 7px; } .price-row { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; } .f-hero .price { font-family: var(--font-display); font-size: clamp(30px, 6vw, 40px); font-weight: 700; letter-spacing: -0.03em; } .type-chip { display: inline-flex; align-items: center; gap: 5px; padding: 4px 11px; background: var(--lime-soft); color: var(--green-deep); border: 1px solid rgba(179, 32, 43, 0.25); border-radius: 999px; font-size: 12px; font-weight: 600; } .price-sub { font-family: var(--font-mono); font-size: 11.5px; color: var(--ink-3); margin-top: 2px; } .f-hero h1 { font-size: clamp(20px, 4.5vw, 24px); margin-top: 10px; } .f-hero .loc { color: var(--ink-2); font-size: 13.5px; margin-top: 3px; display: flex; align-items: center; gap: 5px; } .f-hero .loc .ico { color: var(--lime); } /* liste de specs — fiche technique premium */ .spec-list { margin: 18px 0 4px; border-top: 1.5px solid var(--line-strong); } .spec-row { display: grid; grid-template-columns: 30px 1fr auto; align-items: center; gap: 11px; padding: 8.5px 0; border-bottom: 1px dashed var(--line); } .spec-row:last-child { border-bottom: 1.5px solid var(--line-strong); } .spec-badge { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; border-radius: 9px; background: var(--lime-soft); color: var(--green-deep); } .spec-k { font-family: var(--font-mono); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--ink-2); } .spec-v { font-family: var(--font-display); font-size: 15.5px; font-weight: 700; text-align: right; } .deal-badge { display: inline-flex; align-items: center; gap: 6px; margin: 8px 0 4px; border-radius: 999px; padding: 6px 13px; font-size: 12.5px; font-weight: 600; border: 1.5px solid var(--line-strong); } .deal-ok { background: var(--lime-soft); border-color: var(--green); color: var(--green-deep); } .specs-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); gap: 8px; margin: 18px 0; } .spec { border: 1.5px solid var(--line-strong); border-radius: var(--r-ctl); padding: 9px 11px; background: var(--surface-2); } .spec b { display: block; font-family: var(--font-display); font-size: 16px; } .spec span { font-family: var(--font-mono); font-size: 9.5px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--ink-3); } .broker { margin: 16px 0; padding: 14px; border: 1.5px dashed var(--line-strong); border-radius: var(--r-ctl); background: var(--surface-2); } .broker-k { font-family: var(--font-mono); font-size: 9.5px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-3); } .broker-name { font-family: var(--font-display); font-weight: 700; font-size: 15px; margin-top: 3px; } .broker-tel { display: inline-block; margin-top: 6px; color: var(--green-deep); font-weight: 600; border-bottom: 1.5px solid var(--lime); } .cta { display: block; text-align: center; background: var(--ink); color: var(--lime); font-weight: 700; font-family: var(--font-display); border-radius: var(--r-ctl); padding: 15px; border: 1.5px solid var(--ink); min-height: 48px; box-shadow: 4px 4px 0 rgba(26, 18, 20,0.25); transition: all 0.14s ease; margin-top: 6px; } .cta:hover { background: var(--lime); color: #fff; } .cta:active { transform: translate(2px, 2px); box-shadow: none; } .f-hero .fine { font-size: 11.5px; color: var(--ink-3); margin-top: 14px; text-align: center; font-family: var(--font-mono); letter-spacing: 0.02em; } .desc-text { color: var(--ink-2); font-size: 14.5px; white-space: pre-line; line-height: 1.6; margin: 0; } /* tableau caractéristiques */ .dtable { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 0 22px; } .drow { display: flex; justify-content: space-between; gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--line); font-size: 13.5px; } .drow span { color: var(--ink-3); } .drow b { text-align: right; font-family: var(--font-display); } /* tableau pièces */ .rooms-wrap { overflow-x: auto; border: 1.5px solid var(--line-strong); border-radius: var(--r-card); } table.rooms { width: 100%; border-collapse: collapse; font-size: 13.5px; min-width: 460px; } table.rooms th { text-align: left; background: var(--ink); color: var(--paper); padding: 9px 12px; font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; } table.rooms td { padding: 8px 12px; border-bottom: 1px solid var(--line); } table.rooms tr:last-child td { border-bottom: none; } table.rooms tr:nth-child(even) td { background: var(--surface-2); } .amenity-row { display: flex; flex-wrap: wrap; gap: 7px; } .amenity { background: var(--lime-soft); color: var(--green-deep); font-size: 12px; font-weight: 600; border: 1px solid var(--green); border-radius: 999px; padding: 5px 12px; } .prix-histo { margin-top: 14px; padding: 10px 14px; border-radius: var(--r-card); border: 1.5px solid var(--line-strong); font-size: 13.5px; background: var(--surface); } .prix-histo.down { background: var(--lime-soft); border-color: var(--green); color: var(--green-deep); } .mini-map { height: 320px; border: 1.5px solid var(--line-strong); border-radius: var(--r-card); overflow: hidden; } .mini-map .mapview { border: none; border-radius: 0; box-shadow: none; height: 100%; } .cta-sticky { position: fixed; left: 0; right: 0; bottom: 0; z-index: 45; display: flex; align-items: center; gap: 12px; background: rgba(247, 241, 239, 0.94); backdrop-filter: blur(12px); border-top: 2px solid var(--ink); padding: 10px 16px calc(10px + env(safe-area-inset-bottom)); } .cta-sticky .cta { flex: 1; margin: 0; } .cta-sticky-prix { font-family: var(--font-display); font-weight: 700; font-size: 19px; white-space: nowrap; } @media (min-width: 900px) { .cta-sticky { display: none; } } @media (max-width: 899px) { .detail { padding-bottom: 84px; } } .f-foot { margin-top: 26px; } .fine { font-size: 12px; color: var(--ink-3); } /* Box « Aussi publiée sur… » : autres publications de la même propriété */ .dups-note { font-size: 13px; color: var(--ink-3); margin: 4px 0 10px; } .dups-list { display: flex; flex-direction: column; gap: 8px; } .dup-item { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding: 11px 13px; border: 1.5px solid var(--line-strong); border-radius: var(--r-ctl); background: var(--surface-2); transition: all 0.14s ease; min-height: 44px; } .dup-item:hover { border-color: var(--ink); box-shadow: 3px 3px 0 rgba(26, 18, 20, 0.18); } .dup-src { font-family: var(--font-display); font-weight: 700; font-size: 14px; } .dup-broker { font-size: 12.5px; color: var(--ink-3); } .dup-go { margin-left: auto; font-size: 12.5px; font-weight: 600; color: var(--green-deep); border-bottom: 1.5px solid var(--lime); white-space: nowrap; } .dup-go .ico { vertical-align: -2px; } /* ================= Sources / Agences ================= */ .sources { padding: 44px 0 90px; } .sources h1 { font-size: clamp(28px, 4vw, 40px); text-transform: uppercase; margin: 10px 0 6px; } .sources .sub { color: var(--ink-2); margin-bottom: 30px; max-width: 720px; } .src-wrap { overflow-x: auto; border: 1.5px solid var(--ink); border-radius: var(--r-card); box-shadow: var(--shadow-off-soft); background: var(--surface); } .src-table { width: 100%; border-collapse: separate; border-spacing: 0; min-width: 760px; } .src-table th { text-align: left; font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; letter-spacing: 0.12em; color: var(--ink-3); padding: 14px 18px; border-bottom: 1.5px solid var(--ink); background: var(--surface-2); } .src-table td { padding: 13px 18px; border-bottom: 1px solid var(--line); font-size: 14px; vertical-align: top; } .src-table tr:last-child td { border-bottom: none; } .src-table tr:hover td { background: var(--surface-2); } .src-table a { color: var(--green-deep); font-weight: 600; border-bottom: 1.5px solid var(--lime); } .pill.ok { background: var(--lime); color: #fff; border: 1px solid var(--ink); border-radius: 4px; padding: 3px 10px; font-family: var(--font-mono); font-size: 10.5px; font-weight: 700; text-transform: uppercase; } .pill.todo { background: var(--amber-soft); color: #8a5a12; border: 1px solid var(--amber); border-radius: 4px; padding: 3px 10px; font-family: var(--font-mono); font-size: 10.5px; font-weight: 700; text-transform: uppercase; } .count-pill { font-weight: 700; font-family: var(--font-display); font-size: 16px; border-bottom: 1.5px solid var(--lime); } /* ================= Stats ================= */ .stats-page { padding: 44px 0 90px; } .stats-title { font-size: clamp(30px, 4.6vw, 46px); text-transform: uppercase; margin: 10px 0 6px; } .stats-page .sub { color: var(--ink-2); max-width: 660px; margin-bottom: 30px; } .tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 14px; margin-bottom: 30px; } .tile { background: var(--surface); border: 1.5px solid var(--ink); border-radius: var(--r-card); padding: 18px 20px; box-shadow: 3px 3px 0 rgba(26, 18, 20, 0.1); } .tile-v { font-family: var(--font-display); font-weight: 700; font-size: clamp(22px, 3vw, 32px); letter-spacing: -0.03em; line-height: 1.05; } .tile-k { font-family: var(--font-mono); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-3); margin-top: 6px; } .hero-tile { background: var(--ink); color: var(--lime); border-color: var(--ink); } .hero-tile .tile-k { color: rgba(15, 107, 79, 0.7); } .viz-card { background: var(--surface); border: 1.5px solid var(--ink); border-radius: var(--r-card); box-shadow: var(--shadow-off-soft); padding: 26px 28px 20px; margin-bottom: 22px; min-width: 0; max-width: 100%; overflow-x: auto; } /* mobile : une table large ne doit JAMAIS déborder la page (grid blowout) — chaque bloc de la page Stats défile horizontalement en interne au besoin */ .stats-page section, .stats-page > * { min-width: 0; max-width: 100%; } @media (max-width: 640px) { .stats-page .viz-card { padding: 18px 14px 14px; } } .viz-card h2 { font-size: 19px; text-transform: uppercase; letter-spacing: -0.01em; } .viz-sub { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-3); margin: 4px 0 20px; } .viz-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; } @media (max-width: 900px) { .viz-grid { grid-template-columns: 1fr; } } .hbars { display: flex; flex-direction: column; gap: 7px; } .hbar-row { display: grid; grid-template-columns: minmax(96px, 180px) 1fr auto; gap: 12px; align-items: center; min-height: 26px; } .hbar-label { font-size: 13px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .hbar-label a { border-bottom: 1.5px solid var(--lime); } .hbar-label a:hover { color: var(--green-deep); } .hbar-track { background: var(--surface-2); border-radius: 0 4px 4px 0; height: 18px; overflow: hidden; } .hbar-fill { display: block; height: 100%; background: var(--green); border-radius: 0 4px 4px 0; min-width: 2px; transition: background 0.12s ease; } .hbar-row:hover .hbar-fill { background: var(--ink); box-shadow: inset 0 0 0 2px var(--lime); } .hbar-value { font-family: var(--font-mono); font-size: 11.5px; font-weight: 700; white-space: nowrap; } .hbar-value em { font-style: normal; font-weight: 500; color: var(--ink-3); } .viz-table { margin-top: 4px; } .viz-table table { width: 100%; border-collapse: collapse; font-size: 13px; } .viz-table th { text-align: left; font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--ink-3); padding: 6px 10px; border-bottom: 1.5px solid var(--ink); } .viz-table td { padding: 6px 10px; border-bottom: 1px solid var(--line); } .stats-foot { font-family: var(--font-mono); font-size: 11px; color: var(--ink-3); letter-spacing: 0.04em; margin-top: 6px; } /* ---- Iconographie maison (Icons.tsx) ---- */ .ico { vertical-align: -3px; flex-shrink: 0; } .card-specs span { display: inline-flex; align-items: center; gap: 5px; } .card-specs .ico { color: var(--green); } .badge.right .ico { vertical-align: -2px; } .noimg .ico, .carousel-empty .ico { color: var(--ink-3); } .notice .big .ico { color: var(--lime); } .amenity .ico { color: var(--green); margin-right: 2px; } .q-badge .ico { vertical-align: -3px; margin-right: 2px; } .q-bar-label { display: inline-flex; align-items: center; gap: 7px; } .q-bar-label .ico { color: var(--green); } .mm-ico .ico { vertical-align: -4px; } .mv-noimg svg { color: var(--ink-3); } .broker-tel .ico { vertical-align: -2.5px; } .cta .ico { vertical-align: -2.5px; margin-left: 3px; } .prix-histo .ico { vertical-align: -3.5px; } .spec { position: relative; } .spec-ico { position: absolute; top: 10px; right: 10px; color: var(--lime); opacity: 0.85; } /* ---- Survalorisation vs Vrai-Prix (jauges divergentes) ---- */ .vpg-axis { display: grid; grid-template-columns: 220px 1fr 74px 90px; gap: 10px; margin-bottom: 2px; } .vpg-axis > div { grid-column: 2; display: flex; justify-content: space-between; font-family: var(--font-mono); font-size: 10px; color: var(--ink-3); } .vpg-row { display: grid; grid-template-columns: 220px 1fr 74px 90px; align-items: center; gap: 10px; padding: 7px 0; border-bottom: 1px dashed var(--line); } .vpg-row:last-of-type { border-bottom: none; } .vpg-name { font-size: 13.5px; font-weight: 600; } .vpg-name em { display: block; font-style: normal; font-family: var(--font-mono); font-size: 10px; color: var(--ink-3); } .vpg-track { position: relative; height: 18px; background: var(--surface-2); border: 1px solid var(--line); border-radius: 999px; overflow: hidden; } .vpg-zero { position: absolute; left: 50%; top: 0; bottom: 0; width: 1.5px; background: var(--line-strong); opacity: 0.5; } .vpg-band { position: absolute; top: 3px; bottom: 3px; background: rgba(26, 18, 20, 0.14); border-radius: 999px; } .vpg-median { position: absolute; top: 1px; bottom: 1px; width: 4px; margin-left: -2px; border-radius: 2px; } .vpg-median.vp-sur { background: var(--lime); } .vpg-median.vp-juste { background: #d9a942; } .vpg-median.vp-sous { background: #4c8b4f; } .vpg-value { font-family: var(--font-display); font-weight: 700; font-size: 15px; text-align: right; } .vpg-value.vp-sur { color: var(--green); } .vpg-value.vp-juste { color: #a97b1e; } .vpg-value.vp-sous { color: #3c7440; } .vpg-split { display: flex; height: 10px; border-radius: 999px; overflow: hidden; border: 1px solid var(--line); } .vps-sous { background: #7fb283; } .vps-juste { background: #d9cfc7; } .vps-sur { background: var(--lime); } .vpg-sep { border-top: 1.5px solid var(--line-strong); margin: 4px 0; } .vpg-legend { display: flex; gap: 16px; margin-top: 10px; font-family: var(--font-mono); font-size: 10.5px; color: var(--ink-2); flex-wrap: wrap; } .vpg-legend i { display: inline-block; width: 14px; height: 9px; border-radius: 999px; margin-right: 5px; vertical-align: -1px; } @media (max-width: 780px) { .vpg-row { grid-template-columns: 1fr 64px; } .vpg-track { grid-column: 1 / -1; } .vpg-split { grid-column: 1 / -1; } .vpg-axis { display: none; } } /* ================= Carte (Ka Maps — framework partagé Groupe Ka) ========= Jetons du design system appliqués au chrome de la carte, mêmes réglages que Lou-Ka Maps. */ .mapview .ka-map, .lmap3d .ka-map { --ka-accent: var(--accent); --ka-on-accent: var(--on-accent); --ka-surface: var(--surface); --ka-ink: var(--ink); --ka-line: var(--line-strong); --ka-radius: var(--r-ctl); --ka-shadow: 0 8px 24px rgba(26, 18, 20, 0.14); --ka-font: var(--font-body); } .mapview { position: relative; overflow: hidden; } .mapview .ka-map { position: absolute; inset: 0; } /* mini-carte 3D de la fiche (Emplacement) — bâtiment de l'annonce en cerise */ .lmap3d { position: relative; height: 340px; border: 1.5px solid var(--ink); border-radius: var(--r-card); box-shadow: var(--shadow-off-soft); overflow: hidden; background: var(--surface-2); } .lmap3d-skel { background: linear-gradient(90deg, #eeece5 25%, #f7f5ef 50%, #eeece5 75%); background-size: 800px 100%; animation: shimmer 1.4s infinite linear; } .lmap3d-legende { position: absolute; left: 10px; bottom: 10px; z-index: 5; display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; border: 1.5px solid var(--ink); border-radius: 999px; background: var(--surface); font-size: 10.5px; font-weight: 500; color: var(--ink-2); pointer-events: none; } .lmap3d-legende i { width: 10px; height: 10px; border-radius: 3px; background: var(--accent); border: 1px solid rgba(26, 18, 20, 0.25); } @media (max-width: 780px) { .lmap3d { height: 280px; } } /* ================= Carte ================= */ .map-split { display: grid; grid-template-columns: minmax(300px, 400px) 1fr; gap: 18px; height: calc(100dvh - 200px); min-height: 420px; } .map-list { overflow-y: auto; display: flex; flex-direction: column; gap: 14px; padding-right: 4px; scrollbar-width: thin; } .map-list .card { margin: 0; flex: 0 0 auto; } /* sync liste ↔ carte : fiche sélectionnée depuis une pastille de la carte */ .map-card { border-radius: var(--r-card); } .map-card-sel .card { border-color: var(--accent); box-shadow: 4px 4px 0 var(--accent-soft), 0 0 0 2px var(--accent); } .mapwrap { position: relative; width: 100%; height: 100%; } .mapview { width: 100%; height: 100%; border: 1.5px solid var(--line-strong); border-radius: var(--r-card); box-shadow: var(--shadow-off-soft); overflow: hidden; background: var(--surface-2); } .mv-brand { position: absolute; top: 10px; left: 10px; z-index: 3; display: flex; align-items: center; gap: 6px; padding: 5px 11px; background: var(--surface); border: 1.5px solid var(--line-strong); border-radius: 999px; box-shadow: var(--shadow-off-soft); font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.04em; color: var(--ink-2); pointer-events: none; } .mv-brand b { color: var(--ink); } .mv-brand-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--lime); box-shadow: 0 0 0 3px var(--lime-soft); } .mv-legend { position: absolute; bottom: 26px; left: 10px; z-index: 3; display: flex; flex-direction: column; gap: 4px; padding: 8px 11px; background: rgba(255, 255, 255, 0.92); border: 1px solid var(--line); border-radius: var(--r-ctl); font-family: var(--font-mono); font-size: 10.5px; color: var(--ink-2); pointer-events: none; } .mv-legend span { display: flex; align-items: center; gap: 7px; } .mv-lg-pill { display: inline-block; width: 22px; height: 12px; border-radius: 999px; background: #fff; border: 1.5px solid rgba(26, 18, 20, 0.35); } .mv-lg-deal { background: var(--lime); border-color: var(--green); } .mv-credit { position: absolute; bottom: 8px; right: 8px; z-index: 3; padding: 4px 10px; background: rgba(255, 255, 255, 0.9); border-radius: 999px; font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.04em; color: var(--ink-2); pointer-events: none; } .mv-credit b { color: var(--ink); } .mini-map .mv-brand, .mini-map .mv-legend { display: none; } .mini-map .mapwrap { height: 100%; } /* ---- carte propriété (fiche) : marqueur pulsant + anneaux piéton ---- */ .pm-wrap { position: relative; width: 100%; height: 100%; } .pm-marker { display: flex; flex-direction: column; align-items: center; } .pm-pill { padding: 5px 13px; background: #fff; border: 1.5px solid var(--line-strong); border-radius: 999px; font-family: var(--font-display); font-weight: 700; font-size: 14px; color: var(--ink); box-shadow: var(--shadow-off-soft); white-space: nowrap; margin-bottom: 4px; } .pm-pill-deal { background: var(--lime); border-color: var(--green); color: #fff; } .pm-dot { width: 14px; height: 14px; border-radius: 50%; background: var(--lime); border: 2.5px solid #fff; box-shadow: 0 1px 4px rgba(26, 18, 20, 0.4); } .pm-pulse { position: absolute; bottom: -8px; width: 30px; height: 30px; border-radius: 50%; background: var(--lime); opacity: 0.35; animation: pm-pulse 2s ease-out infinite; } @keyframes pm-pulse { 0% { transform: scale(0.5); opacity: 0.45; } 80% { transform: scale(1.9); opacity: 0; } 100% { opacity: 0; } } .pm-rings-legend { position: absolute; bottom: 8px; left: 8px; z-index: 3; display: flex; gap: 12px; padding: 4px 10px; background: rgba(255, 255, 255, 0.9); border-radius: 999px; font-family: var(--font-mono); font-size: 10px; color: var(--green); pointer-events: none; } .mini-map .pm-wrap .mv-credit { display: block; } .map-loading { display: flex; align-items: center; justify-content: center; color: var(--ink-3); font-family: var(--font-mono); font-size: 13px; } @media (max-width: 780px) { .map-split { grid-template-columns: 1fr; height: calc(100dvh - 230px); } .map-list { display: none; } .results-tools { width: 100%; justify-content: space-between; } } .maplibregl-popup-content { padding: 0; border-radius: var(--r-card); overflow: hidden; border: 1.5px solid var(--line-strong); box-shadow: var(--shadow-off); font-family: var(--font-body); } .maplibregl-popup-close-button { font-size: 18px; padding: 2px 8px; color: var(--paper); z-index: 2; text-shadow: 0 0 4px rgba(26, 18, 20, 0.8); } .mv-pop img, .mv-noimg { width: 100%; height: 130px; object-fit: cover; } .mv-noimg { display: flex; align-items: center; justify-content: center; font-size: 34px; background: var(--surface-2); } .mv-pop-body { padding: 10px 12px 12px; } .mv-pop-price { font-family: var(--font-display); font-weight: 700; font-size: 18px; } .mv-pop-title { font-size: 13px; color: var(--ink-2); margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .mv-pop-meta { font-family: var(--font-mono); font-size: 11px; color: var(--ink-2); margin-top: 6px; } .mv-pop-src { font-family: var(--font-mono); font-size: 10px; color: var(--ink-3); text-transform: uppercase; letter-spacing: 0.06em; margin-top: 2px; } .mv-pop-cta { display: block; margin-top: 10px; padding: 8px 10px; text-align: center; background: var(--ink); color: #fff; border-radius: var(--r-ctl); font-weight: 600; font-size: 13px; } .mv-pop-cta:hover { background: var(--green-deep); } .mv-pop-deal { display: inline-block; margin-left: 6px; padding: 2px 8px; vertical-align: 3px; background: var(--lime); color: #fff; border-radius: 999px; font-family: var(--font-mono); font-size: 9.5px; text-transform: uppercase; letter-spacing: 0.05em; } .maplibregl-ctrl-attrib { font-size: 10px; } /* ================= Menu mobile ================= */ .menu-btn { display: none; position: relative; z-index: 60; width: 44px; height: 44px; margin-left: auto; border: 1.5px solid var(--ink); border-radius: var(--r-ctl); background: var(--surface); cursor: pointer; padding: 0; flex-direction: column; align-items: center; justify-content: center; gap: 5px; box-shadow: 3px 3px 0 rgba(26, 18, 20, 0.15); transition: box-shadow 0.15s ease, transform 0.15s ease; } .menu-btn:active { transform: translate(2px, 2px); box-shadow: 1px 1px 0 rgba(26, 18, 20,0.15); } .menu-btn span { display: block; width: 18px; height: 2px; background: var(--ink); border-radius: 2px; transition: transform 0.25s ease, opacity 0.2s ease; } .menu-btn.open span:nth-child(1) { transform: translateY(7px) rotate(45deg); } .menu-btn.open span:nth-child(2) { opacity: 0; } .menu-btn.open span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); } /* KA Nav v2 (2026-08-25) : panneau PLEIN ECRAN fixed inset:0 - visible peu importe le scroll (l'ancien dropdown absolute 480px clippait/se coupait). */ .mobile-menu { display: none; position: fixed; inset: 0; background: var(--paper); padding: 76px 16px calc(24px + env(safe-area-inset-bottom)); overflow-y: auto; overscroll-behavior: contain; } .mobile-menu.open { display: block; animation: mm-in 0.16s ease; } @keyframes mm-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } } /* burger masque a l'ouverture : la fermeture passe par le X fixe du panneau */ .header:has(.mobile-menu.open) .menu-btn { visibility: hidden; } /* bouton de fermeture du panneau : fixe en haut a droite du viewport */ .mm-close { position: fixed; top: 10px; right: 14px; z-index: 2; width: 44px; height: 44px; display: flex; align-items: center; justify-content: center; border: 1.5px solid var(--ink); border-radius: 999px; background: var(--ink); color: var(--paper); font-size: 17px; font-weight: 700; line-height: 1; cursor: pointer; padding: 0; } /* verrou du scroll d'arriere-plan quand le menu est ouvert (CSS pur) */ html:has(.mobile-menu.open) { overflow: hidden; } .mm-link { display: flex; align-items: center; gap: 12px; padding: 15px 10px; min-height: 52px; font-family: var(--font-display); font-weight: 700; font-size: 19px; letter-spacing: -0.02em; border-bottom: 1.5px dashed var(--line); opacity: 0; transform: translateY(-8px); transition: opacity 0.25s ease, transform 0.25s ease; } .mobile-menu.open .mm-link { opacity: 1; transform: translateY(0); } .mm-link.active { color: var(--green); } .mm-ico { width: 26px; text-align: center; font-size: 17px; } .mm-arrow { margin-left: auto; opacity: 0.25; } .mm-link:active { background: var(--lime-soft); border-radius: var(--r-ctl); } .mm-foot { padding: 12px 10px 4px; font-family: var(--font-mono); font-size: 10.5px; color: var(--ink-3); letter-spacing: 0.04em; } .mm-backdrop { position: fixed; inset: 0; z-index: var(--z-overlay, 800); background: rgba(26, 18, 20, 0.35); backdrop-filter: blur(2px); } @media (max-width: 760px) { .menu-btn { display: flex; } .nav { display: none; } } /* ================= Footer ================= Remplacé par le footer commun Groupe KA (ka/KaFooter.tsx — styles .ka-footer dans ka/tokens.css). */ /* ================= Mobile : feuille de filtres + FAB ================= */ .sheet-head { display: none; } .sheet-handle { display: none; } .sheet-apply { display: none; } .sheet-backdrop { display: none; } .fab { display: none; } .fab-badge { display: inline-grid; place-items: center; min-width: 20px; height: 20px; padding: 0 6px; border-radius: 999px; background: var(--lime); color: #fff; font-size: 11.5px; font-weight: 700; font-variant-numeric: tabular-nums; margin-left: 2px; } @media (max-width: 640px) { .header-inner { height: 56px; } .brand { font-size: 21px; } .hero h1 { font-size: clamp(30px, 9.4vw, 44px); } .hero p.lede { font-size: 15px; } .stat-row { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; padding-bottom: 6px; margin-right: -16px; padding-right: 16px; } .stat-row::-webkit-scrollbar { display: none; } .stat-chip { flex: 0 0 auto; white-space: nowrap; } .filterbar { display: none; } .filterbar.open .f-primary { flex-direction: column; } .filterbar.open .f-ctl select { max-width: none; width: 100%; } .filterbar.open .f-more { display: none; } .filterbar.open { display: flex; flex-direction: column; gap: 12px; position: fixed; left: 0; right: 0; bottom: 0; z-index: var(--z-modal, 900); margin: 0; border-radius: 20px 20px 0 0; border-width: 2px 0 0 0; max-height: 82dvh; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 10px 18px calc(18px + env(safe-area-inset-bottom)); box-shadow: 0 -16px 48px rgba(16, 18, 16, 0.35); animation: sheet-up 0.24s cubic-bezier(0.2, 0.9, 0.3, 1); } @keyframes sheet-up { from { transform: translateY(30%); opacity: 0.4; } to { transform: none; opacity: 1; } } .filterbar.open .sheet-handle { display: block; flex: none; width: 44px; height: 5px; border-radius: 999px; background: var(--line); margin: 0 auto 2px; } .filterbar.open .sheet-head { display: flex; justify-content: space-between; align-items: center; font-family: var(--font-display); font-weight: 700; font-size: 17px; text-transform: uppercase; position: sticky; top: -10px; background: var(--surface); padding: 6px 0 8px; border-bottom: 1.5px solid var(--line); margin-bottom: 2px; z-index: 1; } .sheet-close { border: 1.5px solid var(--ink); background: var(--surface); border-radius: 50%; width: 36px; height: 36px; font-size: 15px; cursor: pointer; line-height: 1; } .filterbar.open .sheet-apply { display: flex; width: 100%; min-height: 50px; position: sticky; bottom: 0; z-index: 1; box-shadow: 0 -14px 18px -12px rgba(16, 18, 16, 0.4), 5px 5px 0 var(--lime); } .sheet-backdrop { display: block; position: fixed; inset: 0; z-index: 90; background: rgba(16, 18, 16, 0.45); backdrop-filter: blur(2px); } .fab { display: flex; align-items: center; gap: 8px; position: fixed; left: 50%; transform: translateX(-50%); bottom: calc(18px + env(safe-area-inset-bottom)); z-index: 80; background: var(--ink); color: var(--lime); border: 1.5px solid var(--ink); border-radius: 999px; padding: 13px 24px; font-family: var(--font-display); font-weight: 700; font-size: 15px; cursor: pointer; box-shadow: 0 8px 24px rgba(16, 18, 16, 0.35), 4px 4px 0 rgba(15, 107, 79, 0.55); } .fab:active { transform: translateX(-50%) scale(0.97); } .results-head { margin-top: 20px; } .chips { margin-right: -16px; padding-right: 16px; } .notice { padding: 48px 16px; } } @media (max-width: 900px) { .f-search input, .f-native, .f-ctl select { font-size: 16px; } } /* --- Sources : bannières → sous-agences -------------------------------- */ .franchise-list { display: flex; flex-direction: column; gap: 10px; margin: 18px 0; } .franchise { border: 2px solid var(--ink); background: var(--surface); box-shadow: var(--shadow-off-soft); } .franchise-head { width: 100%; display: flex; align-items: center; gap: 12px; padding: 14px 16px; background: none; border: 0; cursor: pointer; font-family: var(--font-display); font-size: 16px; font-weight: 600; color: var(--ink); text-align: left; } .franchise-head:hover { background: var(--surface-2); } .fh-caret { color: var(--green); width: 14px; } .fh-name { flex: 1; } .fh-sub { font-size: 12px; font-weight: 500; color: var(--ink-3); font-family: var(--font-mono); } .fh-count { font-family: var(--font-mono); font-weight: 700; background: var(--ink); color: var(--lime); padding: 3px 10px; min-width: 64px; text-align: right; } .subagency-list { list-style: none; margin: 0; padding: 0 16px 10px 40px; border-top: 1px solid var(--line); } .subagency-list li { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 8px 0; border-bottom: 1px dotted var(--line); font-size: 14px; } .subagency-list li:last-child { border-bottom: 0; } .sa-name { color: var(--ink-2); } /* --- Pagination (accueil) ---------------------------------------------- */ .pager { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 6px; margin: 32px 0 8px; } .pager-btn { font-family: var(--font-mono); font-size: 14px; min-width: 42px; min-height: 42px; padding: 8px 12px; border: 2px solid var(--ink); border-radius: 8px; background: var(--surface); color: var(--ink); cursor: pointer; box-shadow: 3px 3px 0 rgba(26, 18, 20, 0.14); transition: transform 0.12s ease, box-shadow 0.12s ease, background 0.12s ease; } .pager-btn:hover:not(:disabled):not(.on) { background: var(--lime-soft); transform: translate(-1px, -1px); box-shadow: 4px 4px 0 rgba(26, 18, 20, 0.2); } .pager-btn:active:not(:disabled) { transform: none; box-shadow: none; } .pager-btn.on { background: var(--ink); color: var(--lime); font-weight: 700; box-shadow: 3px 3px 0 var(--lime); } .pager-btn:disabled { opacity: .4; cursor: not-allowed; box-shadow: none; } .pager-gap { padding: 0 4px; color: var(--ink-3); } .pager-info { width: 100%; text-align: center; margin-top: 8px; font-size: 12px; color: var(--ink-3); font-family: var(--font-mono); } /* --- Le quartier (census / proximité / chaleur / crime) — porté de Lou-Ka --- */ /* --- Section « Le quartier » (fiche) --------------------------------------- */ .quartier { margin-top: 34px; } .quartier h2 { font-size: 24px; letter-spacing: -0.02em; } .q-sub { color: var(--ink-3); font-size: 13px; margin: 4px 0 16px; } .q-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; } .q-grid { grid-template-columns: repeat(2, 1fr); } .q-cell { background: var(--surface); border: 1.5px solid var(--line-strong); border-radius: var(--r-card); padding: 12px 14px; box-shadow: var(--shadow-flat); } .q-val { font-family: var(--font-display); font-weight: 700; font-size: 19px; letter-spacing: -0.02em; } .q-label { font-family: var(--font-mono); font-size: 10.5px; color: var(--ink-3); text-transform: uppercase; letter-spacing: 0.06em; margin-top: 3px; } .q-prox { margin-top: 18px; display: flex; flex-direction: column; gap: 8px; } .q-bar { display: flex; align-items: center; gap: 10px; font-size: 13px; } .q-bar-label { flex: 0 0 150px; color: var(--ink-2); } .q-bar-label { flex-basis: 120px; font-size: 12px; } .q-bar-track { flex: 1; height: 10px; background: var(--surface-2); border: 1px solid var(--line-strong); border-radius: 999px; overflow: hidden; } .q-bar-fill { display: block; height: 100%; background: var(--green); border-radius: 999px; } .q-bar-num { flex: 0 0 30px; text-align: right; font-family: var(--font-mono); font-size: 11.5px; font-weight: 700; } .q-badges { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; } .q-badge { display: inline-flex; align-items: center; gap: 6px; border: 1.5px solid var(--line-strong); border-radius: 999px; padding: 7px 13px; font-size: 12.5px; background: var(--surface); } .q-badge.cool { background: var(--lime-soft); border-color: var(--green); color: var(--green-deep); } .q-badge.hot { background: var(--amber-soft); border-color: var(--amber); color: #8a5a12; } .quartier .fine { margin-top: 10px; } .q-cell { padding: 9px 11px; } .q-val { font-size: 16px; } .q-bar { gap: 8px; font-size: 12px; } .q-bar-track { height: 8px; } .q-badge-sub { display: block; font-size: 10.5px; color: var(--ink-3); font-weight: 400; margin-left: 4px; } /* --- Vrai-Prix : estimation de valeur ---------------------------------- */ .vraiprix { border: 2px solid var(--ink); background: var(--surface-2); box-shadow: var(--shadow-off-soft); padding: 14px; margin: 14px 0; } .vp-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; } .vp-logo { font-family: var(--font-display); font-weight: 700; color: var(--green-deep); letter-spacing: -.3px; } .vp-conf { font-family: var(--font-mono); font-size: 11px; padding: 2px 7px; border: 1px solid var(--ink); } .vp-conf-A { background: var(--lime); color: #fff; } .vp-conf-B { background: var(--lime-soft); } .vp-conf-C { background: var(--amber-soft); } .vp-conf-D { background: #f0d9d9; } .vp-k { font-size: 11px; color: var(--ink-3); text-transform: uppercase; letter-spacing: .5px; margin-top: 8px; } .vp-value { font-family: var(--font-display); font-size: 26px; font-weight: 700; letter-spacing: -1px; color: var(--ink); } .vp-range { font-size: 12px; color: var(--ink-2); font-family: var(--font-mono); } /* jauge Vrai-Prix : fourchette P10–P90 + marqueurs estimation / prix demandé */ .vp-gauge { margin-top: 10px; } .vp-gauge-track { position: relative; height: 14px; border-radius: 999px; background: var(--surface); border: 1px solid var(--line-strong); overflow: hidden; } .vp-gauge-band { position: absolute; inset: 3px 6%; background: linear-gradient(90deg, var(--lime-soft), rgba(15, 107, 79, 0.35), var(--lime-soft)); border-radius: 999px; } .vp-gauge-est { position: absolute; top: 0; bottom: 0; width: 4px; margin-left: -2px; background: var(--lime); border-radius: 2px; } .vp-gauge-ask { position: absolute; top: 2px; bottom: 2px; width: 4px; margin-left: -2px; background: var(--ink); border-radius: 2px; } .vp-gauge-ends { display: flex; justify-content: space-between; font-family: var(--font-mono); font-size: 10px; color: var(--ink-3); margin-top: 4px; } .vp-gauge-legend { display: flex; gap: 14px; font-family: var(--font-mono); font-size: 10px; color: var(--ink-2); margin-top: 5px; } .vp-dot-est, .vp-dot-ask { display: inline-block; width: 9px; height: 9px; border-radius: 3px; margin-right: 4px; vertical-align: -1px; } .vp-dot-est { background: var(--lime); } .vp-dot-ask { background: var(--ink); } .vp-delta { font-size: 13px; margin-top: 8px; padding: 6px 8px; border-radius: var(--r-ctl); } .vp-over { background: #f6e2e2; color: #8a2b2b; } .vp-under { background: #e2f0e6; color: #1c5c41; } .vp-fair { background: var(--surface); color: var(--ink-2); } .vp-link { display: block; text-align: center; margin-top: 10px; font-weight: 700; font-size: 13px; padding: 8px; background: var(--green-deep); color: #fff; text-decoration: none; } .vp-link:hover { background: var(--green); } /* ============================================================================= Harmonisation Groupe KA — header (badge + compte KA ID), pages Profil, Contact et légales. Le socle vient de ka/tokens.css. ============================================================================= */ /* ---- Header : badge « Un service Groupe KA » + zone compte ---- */ .header-inner .gk-badge { flex: none; } @media (max-width: 900px) { .header-inner .gk-badge { display: none; } } .header-acct { display: flex; align-items: center; gap: 10px; flex: none; } .ka-auth { display: flex; align-items: center; gap: 10px; } .ka-login { display: inline-flex; align-items: center; gap: 6px; min-height: 40px; padding: 8px 15px; border: 1.5px solid var(--ink); border-radius: 999px; background: var(--surface); color: var(--ink); cursor: pointer; font-family: var(--font-display); font-weight: 600; font-size: 13.5px; box-shadow: 3px 3px 0 rgba(20, 24, 20, 0.15); transition: transform 0.13s ease, box-shadow 0.13s ease, background 0.15s ease; } .ka-login b { background: var(--ink); color: var(--accent); border-radius: 5px; padding: 0 6px 1px; transform: rotate(-2deg); transition: transform 0.15s ease; } .ka-login:hover { transform: translate(-1px, -1px); box-shadow: 4px 4px 0 rgba(20, 24, 20, 0.2); } .ka-login:hover b { transform: rotate(0); } .ka-login:active { transform: translate(2px, 2px); box-shadow: none; } .ka-signup { font-family: var(--font-mono); font-size: 11px; color: var(--ink-2); text-decoration: underline; text-underline-offset: 3px; white-space: nowrap; } .ka-signup:hover { color: var(--accent-deep); } @media (max-width: 1100px) { .header-acct .ka-signup { display: none; } } .ka-acct { display: inline-flex; align-items: center; gap: 8px; min-height: 40px; padding: 6px 14px; border: 1.5px solid var(--ink); border-radius: 999px; background: var(--surface); font-family: var(--font-display); font-weight: 600; font-size: 13.5px; color: var(--ink); max-width: 160px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .ka-acct:hover, .ka-acct.active { background: var(--ink); color: var(--accent); } .ka-acct-pic { width: 24px; height: 24px; border-radius: 50%; flex: none; border: 1px solid var(--line); } @media (max-width: 760px) { .header-acct { margin-left: auto; } .menu-btn { margin-left: 0; } .ka-login { min-height: 44px; } } @media (max-width: 380px) { .header-acct { display: none; } } /* → menu mobile */ /* ---- Menu mobile : compte + badge groupe ---- */ .mm-auth { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; padding: 15px 10px; border-bottom: 1.5px dashed var(--line); } .mm-auth .ka-login { min-height: 44px; } .mm-foot p { margin: 10px 0 0; } /* ---- Générique : lede (Profil / Contact) ---- */ .lede { color: var(--ink-2); font-size: 15.5px; max-width: 640px; } /* ================= Page Profil (KA ID) ================= */ .profil { padding: 44px 0 90px; } .profil h1 { font-size: clamp(28px, 4.6vw, 44px); margin: 10px 0 24px; letter-spacing: -0.03em; } .profil .lede { margin-bottom: 22px; } .profil .notice { padding: 60px 0; } /* Carte de membre — encre + cerise */ .pc { position: relative; overflow: hidden; max-width: 460px; background: var(--ink); color: var(--paper); border: 1.5px solid var(--ink); border-radius: var(--r-card); box-shadow: var(--shadow-off-soft); padding: 22px 26px 0; } .pc-watermark { position: absolute; right: -18px; bottom: 14px; font-family: var(--font-display); font-weight: 700; font-size: 150px; line-height: 1; letter-spacing: -0.06em; color: rgba(245, 243, 238, 0.05); pointer-events: none; user-select: none; } .pc-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; } .pc-brand { font-family: var(--font-display); font-weight: 700; font-size: 24px; letter-spacing: -0.03em; } .pc-ka { display: inline-block; background: var(--accent); color: var(--on-accent); border-radius: 6px; padding: 0 7px 2px; margin-left: 3px; transform: rotate(-2deg); } .pc-label { font-family: var(--font-mono); font-size: 9.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.16em; color: rgba(245, 243, 238, 0.5); } .pc-id-block { margin: 26px 0 22px; display: flex; flex-direction: column; gap: 4px; } .pc-id-label { font-family: var(--font-mono); font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.2em; color: var(--accent); } .pc-id { font-family: var(--font-mono); font-weight: 700; font-size: clamp(17px, 4.4vw, 22px); letter-spacing: 0.04em; word-break: break-all; } .pc-foot { display: flex; align-items: flex-end; justify-content: space-between; gap: 14px; padding-bottom: 18px; } .pc-holder { display: flex; flex-direction: column; gap: 3px; min-width: 0; } .pc-holder-name { font-family: var(--font-display); font-weight: 600; font-size: 15px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .pc-role-badge { align-self: flex-start; font-family: var(--font-mono); font-size: 9.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; background: var(--accent); color: var(--on-accent); border-radius: 999px; padding: 2px 9px; } .pc-holder-since { font-family: var(--font-mono); font-size: 10.5px; color: rgba(245, 243, 238, 0.5); letter-spacing: 0.06em; } .pc-avatar { width: 52px; height: 52px; border-radius: 50%; border: 2px solid var(--accent); flex: none; object-fit: cover; } .pc-strip { display: flex; align-items: flex-end; gap: 5px; margin: 0 -26px; padding: 9px 18px; background: rgba(15, 107, 79, 0.14); border-top: 1px solid rgba(15, 107, 79, 0.4); overflow: hidden; } .pc-strip i { display: block; width: 3px; border-radius: 1px; background: var(--accent); opacity: 0.75; } .pc-strip i:nth-child(3n) { height: 14px; opacity: 0.4; } .pc-strip i:nth-child(3n+1) { height: 9px; } .pc-strip i:nth-child(3n+2) { height: 17px; opacity: 0.95; } .pc-copy { margin-top: 16px; } .pc-copy.ok { background: var(--ink); color: var(--accent); } .profil-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; margin-top: 28px; max-width: 720px; } .pg-item { background: var(--surface); border: 1.5px solid var(--line-strong); border-radius: var(--r-ctl); padding: 12px 14px; display: flex; flex-direction: column; gap: 4px; min-width: 0; } .pg-label { font-family: var(--font-mono); font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.12em; color: var(--ink-3); } .pg-value { font-weight: 600; font-size: 14.5px; word-break: break-word; } .pg-value.mono { font-family: var(--font-mono); color: var(--accent-deep); } .profil-note { max-width: 640px; color: var(--ink-2); font-size: 13.5px; margin-top: 22px; } .profil-note a { text-decoration: underline; text-underline-offset: 3px; } .profil-actions { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 26px; } /* Profil hub Groupe KA (lecture seule) */ .hub-profile { margin-top: 34px; padding-top: 24px; border-top: 1.5px solid var(--line-strong); max-width: 720px; display: flex; flex-direction: column; gap: 14px; } .hub-profile h3 { font-size: 18px; } .hub-profile .hub-bio { color: var(--ink-2); font-size: 14px; margin: 0; max-width: 560px; } .hub-profile .pub-meta { display: flex; gap: 8px; flex-wrap: wrap; } .hub-profile .stat-chip { display: inline-flex; align-items: center; gap: 6px; } .hub-profile a.stat-chip:hover { background: var(--accent-soft); } .hub-hint { color: var(--ink-3); font-size: 12.5px; margin: 0; } /* ================= Pages légales ================= */ .legal { padding: 48px 0 80px; max-width: 780px; } .legal h1 { font-size: clamp(28px, 4.6vw, 44px); margin: 8px 0 6px; } .legal .legal-meta { color: var(--ink-3); font-family: var(--font-mono); font-size: 12px; margin: 0 0 26px; } .legal h2 { font-size: 20px; margin: 30px 0 8px; border-left: 4px solid var(--accent); padding-left: 10px; } .legal p, .legal li { color: var(--ink-2); font-size: 14.5px; } .legal ul { padding-left: 20px; display: flex; flex-direction: column; gap: 6px; } .legal a { text-decoration: underline; text-underline-offset: 3px; } .legal b { color: var(--ink); } /* ================= Page Contact (écosystème Groupe KA) ================= */ .contact { padding: 48px 0 90px; } .contact h1 { font-size: clamp(30px, 5vw, 52px); margin: 12px 0 14px; text-transform: uppercase; letter-spacing: -0.03em; } .contact-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 14px; margin: 28px 0 6px; max-width: 900px; } .contact-card { display: flex; flex-direction: column; gap: 8px; min-height: var(--touch, 44px); background: var(--surface); border: 1.5px solid var(--ink); border-radius: var(--r-card); padding: 18px 20px; box-shadow: var(--shadow-off-soft); transition: transform 0.15s ease, box-shadow 0.15s ease; } .contact-card:hover { transform: translate(-2px, -2px); box-shadow: var(--shadow-off); } .contact-role { font-family: var(--font-mono); font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; color: var(--green); } .contact-mail { font-family: var(--font-display); font-weight: 700; font-size: clamp(14px, 2vw, 17px); word-break: break-all; border-bottom: 2px solid var(--accent); align-self: flex-start; } .contact-disclaimer { max-width: 720px; margin: 24px 0 0; padding: 14px 16px; border-left: 3px solid var(--accent); background: var(--accent-soft); color: var(--ink-2); font-size: 13.5px; } .contact-disclaimer b { color: var(--ink); } .contact-hub { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 26px; } .contact-sites { margin-top: 46px; } .contact-sites h2 { font-size: 21px; text-transform: uppercase; margin-bottom: 14px; } .contact-sites ul { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 10px; } .contact-sites a { display: flex; flex-direction: column; gap: 3px; min-height: var(--touch, 44px); background: var(--surface); border: 1.5px solid var(--line-strong); border-radius: var(--r-ctl); padding: 12px 14px; transition: transform 0.14s ease, box-shadow 0.14s ease; } .contact-sites a:hover { transform: translate(-2px, -2px); box-shadow: 4px 4px 0 var(--ink); } .contact-sites b { font-family: var(--font-display); font-size: 15px; } .contact-sites span { font-size: 12px; color: var(--ink-3); } @media (max-width: 480px) { .header-inner { gap: 10px; } .ka-login { font-size: 12px; padding: 6px 10px; gap: 4px; min-height: 44px; } } /* Bulle KA Agent : sur mobile, remontée au-dessus de la barre CTA collante des fiches (sinon elle chevauche le bouton « Voir chez … »). */ @media (max-width: 899px) { .kaa-btn { bottom: calc(88px + env(safe-area-inset-bottom, 0px)) !important; } } /* Footer commun KA : zones tactiles ≥ 44 px pour les petits liens (Ka2, Ka4…) — padding compensé par une marge négative : aucun changement visuel. */ .ka-footer .sites a, .ka-footer .legal a, .ka-footer .contacts a { display: inline-block; padding: 12px 8px; margin: -12px -8px; } /* ================= Qualité des annonces / images ================= */ /* Image de secours par TYPE DE BIEN (jamais d'icône d'image cassée) */ .type-fallback { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 9px; width: 100%; height: 100%; min-height: 120px; background: radial-gradient(circle at 78% 18%, rgba(15, 107, 79, 0.14), transparent 52%), repeating-linear-gradient(45deg, #f3ece9 0 14px, #f7f1ef 14px 28px); color: var(--accent-deep); } .type-fallback .ico { opacity: 0.75; } .type-fallback span { font-family: var(--font-mono); font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.12em; color: var(--ink-3); } .carousel-empty .type-fallback { aspect-ratio: 16/11; } /* légende de photo (étiquette de pièce de la source) */ .carousel-caption { position: absolute; left: 12px; bottom: 12px; z-index: 2; max-width: 60%; background: rgba(26, 18, 20, 0.82); color: #f5f3ee; font-family: var(--font-mono); font-size: 11px; font-weight: 600; padding: 4px 10px; border-radius: 999px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* mention loyer mensuel (transaction = location) */ .per-month { font-size: 0.55em; font-weight: 600; color: var(--ink-3); letter-spacing: 0; } /* lightbox : l'image zoomable ne doit pas déclencher le scroll de la page */ .lightbox img { user-select: none; -webkit-user-drag: none; } /* ---- Stats : qualité des données ---- */ .q-table-wrap { overflow-x: auto; } .q-table { width: 100%; border-collapse: collapse; font-size: 13px; min-width: 520px; } .q-table th { text-align: left; font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--ink-3); padding: 6px 10px; border-bottom: 1.5px solid var(--ink); } .q-table td { padding: 6px 10px; border-bottom: 1px solid var(--line); } .q-table .num { text-align: right; font-family: var(--font-mono); } .q-meter { display: inline-block; width: 74px; height: 9px; background: var(--surface-2); border: 1px solid var(--line-strong); border-radius: 999px; overflow: hidden; vertical-align: -1px; margin-right: 7px; } .q-meter i { display: block; height: 100%; background: var(--green); } /* ---- Criminalité détaillée SPVM (bloc quartier) ---- */ .q-crime { width: 100%; } .q-crime-cats { list-style: none; margin: 8px 0 0; padding: 0; } .q-crime-cats li { display: flex; align-items: center; gap: 8px; padding: 3px 0; font-size: 12.5px; } .q-crime-nom { flex: 0 0 46%; color: var(--ink-2, #555); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .q-crime-barre { flex: 1 1 auto; height: 10px; background: var(--surface-2, #f0ede8); border-radius: 5px; overflow: hidden; } .q-crime-barre i { display: block; height: 100%; border-radius: 5px; background: var(--accent, #0f6b4f); opacity: 0.55; } .q-crime-n { flex: 0 0 52px; text-align: right; font-weight: 600; color: var(--ink, #222); white-space: nowrap; } .q-crime-n small { font-weight: 400; color: var(--ink-3, #888); } .q-crime-src { margin-top: 8px; } /* ---- Risque d'inondation (fiche) — BDZI gouv. du Québec ---- */ .f-zi .zi-head { display: flex; align-items: center; gap: 10px; } .zi-badge { display: inline-block; padding: 3px 10px; border-radius: 999px; font-size: 12.5px; font-weight: 700; } .zi-eleve { background: #fde8e8; color: #a12622; } .zi-modere { background: #fdf3e0; color: #8a5a00; } .zi-present { background: #fdf3e0; color: #8a5a00; } .zi-ok { background: #e7f4ea; color: #1e6b34; } .zi-nc { background: var(--surface-2, #f0ede8); color: var(--ink-3, #888); } .zi-liste { margin: 8px 0 0; padding: 0; list-style: none; font-size: 13px; } .zi-liste li { padding: 4px 0; border-top: 1px solid var(--line, #e6e4df); } /* ---- tuiles KPI + tableau compacts (partagés air/essence) ---- */ .rdl-kpis { display: flex; flex-wrap: wrap; gap: 10px; margin: 2px 0 12px; } .rdl-kpi { flex: 1 1 90px; min-width: 90px; background: var(--surface-2, #f7f5f1); border-radius: 10px; padding: 10px 12px; } .rdl-kpi-v { display: block; font-size: 20px; font-weight: 700; letter-spacing: -0.02em; color: var(--ink, #222); } .rdl-kpi-l { display: block; font-size: 11px; line-height: 1.35; color: var(--ink-3, #888); margin-top: 2px; } .rdl-table { width: 100%; border-collapse: collapse; font-size: 13px; } .rdl-table td { padding: 5px 8px 5px 0; border-top: 1px solid var(--line, #e6e4df); vertical-align: top; } .rdl-table .rdl-addr { max-width: 46%; } .rdl-table .rdl-prix { font-weight: 600; white-space: nowrap; } .rdl-table .rdl-date { white-space: nowrap; color: var(--ink-2, #555); } .rdl-table .rdl-dist { color: var(--ink-3, #888); white-space: nowrap; text-align: right; } .rdl-cap { caption-side: top; text-align: left; font-size: 13px; font-weight: 700; color: var(--ink, #222); padding: 6px 0; } /* ---- Qualité de l'air (RSQAQ) + Essence à proximité ---- */ .air-liste { list-style: none; margin: 10px 0 0; padding: 0; } .air-liste li { display: flex; align-items: center; gap: 8px; padding: 4px 0; font-size: 12.5px; } .air-nom { flex: 0 0 44%; color: var(--ink-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .air-barre { flex: 1 1 auto; height: 10px; background: var(--surface-2, #f0ede8); border-radius: 5px; overflow: hidden; } .air-barre i { display: block; height: 100%; border-radius: 5px; background: #4d9e64; } .air-barre i.air-sur { background: #c96a1f; } .air-val { flex: 0 0 34%; text-align: right; font-weight: 600; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .air-val small { font-weight: 400; color: var(--ink-3); } .air-val .air-ref { display: block; font-size: 10px; } .gaz-head th { text-align: left; font-size: 11px; color: var(--ink-3); font-weight: 600; padding: 2px 8px 2px 0; } .gaz-best { display: inline-block; margin-left: 6px; padding: 1px 7px; border-radius: 999px; background: #e7f4ea; color: #1e6b34; font-size: 10.5px; font-weight: 700; } .gaz-adr { display: block; font-size: 11px; color: var(--ink-3); } /* ---- Commerces et transport (fiche) ---- */ .cm-grille { list-style: none; margin: 6px 0 0; padding: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 4px 18px; } @media (max-width: 560px) { .cm-grille { grid-template-columns: 1fr; } } .cm-item { display: flex; align-items: center; gap: 9px; padding: 5px 0; border-bottom: 1px solid var(--line, #eeece7); min-width: 0; } .cm-ico { flex: 0 0 28px; } .cm-txt { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; } .cm-nom { font-size: 13px; font-weight: 600; color: var(--ink, #222); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .cm-poi { font-size: 11px; color: var(--ink-3, #8a877f); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .cm-dist { flex: 0 0 auto; font-size: 13px; font-weight: 700; color: var(--ink-2, #4c4a45); white-space: nowrap; } /* ---- Coût d'électricité (Hydro-Québec) ---- */ .hydro-intro { margin: 2px 0 12px; color: var(--ink-2, #4c4a45); } .hydro-btn { appearance: none; border: 0; border-radius: 10px; cursor: pointer; background: var(--accent, #2b7a3b); color: #fff; font-weight: 700; font-size: 14px; padding: 11px 18px; } .hydro-btn:disabled { opacity: 0.6; cursor: progress; } .hydro-montant { font-size: 26px; font-weight: 800; letter-spacing: -0.02em; color: var(--navy, #1c1b18); display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; } .hydro-montant small { font-size: 14px; font-weight: 500; color: var(--ink-3); } .hydro-an { font-size: 14px; font-weight: 600; color: var(--ink-2, #4c4a45); } .hydro-vide { color: var(--ink-3, #8a877f); } /* ============================================================================ PASSE DE DESIGN — « éditorial sharp » appliqué à toute la fiche Blocs = cartes encre (bordure 1,5 px + ombre décalée douce), titres à marqueur accent + filet, tuiles KPI blanches à ombre dure, tableaux zébrés, barres en dégradé, pastilles unifiées (mono, point d'état, liseré). Aucune propriété `order` (règle Groupe Ka : ordre DOM = ordre visuel). ========================================================================== */ /* --- Blocs de la fiche : cartes posées sur le papier --- */ .f-bloc:not(.f-galerie):not(.f-hero), .quartier { background: var(--surface); border: 1.5px solid var(--ink); border-radius: var(--r-card); padding: 18px 20px 16px; box-shadow: var(--shadow-off-soft); } @media (max-width: 640px) { .f-bloc:not(.f-galerie):not(.f-hero), .quartier { padding: 15px 15px 13px; } } /* blocs pleine largeur sous la grille : respiration entre les cartes */ .detail > .f-bloc { margin-top: 22px; } /* --- Titres de section : carré accent + filet éditorial --- */ .f-bloc h2, .quartier h2 { display: flex; align-items: center; gap: 10px; font-size: 19px; letter-spacing: -0.015em; margin-bottom: 14px; border-left: 0; padding-left: 0; } .f-bloc h2::before, .quartier h2::before { content: ""; flex: 0 0 9px; width: 9px; height: 9px; background: var(--accent); border: 1.5px solid var(--ink); box-shadow: 2px 2px 0 var(--ink); } .f-bloc h2::after, .quartier h2::after { content: ""; flex: 1 1 auto; height: 1.5px; min-width: 20px; background: var(--line); } /* --- Tuiles KPI : blanches, bord encre, ombre dure accent --- */ .rdl-kpi { background: var(--surface); border: 1.5px solid var(--ink); border-radius: var(--r-ctl); box-shadow: 3px 3px 0 var(--accent-soft); } .rdl-kpi-v { font-family: var(--font-display); } .q-cell { box-shadow: 3px 3px 0 rgba(20, 24, 20, 0.1); border-radius: var(--r-ctl); } .q-val { font-size: 20px; } /* --- Tableaux : en-têtes mono, zébrure, survol accent --- */ .rdl-table td { padding: 7px 8px 7px 0; } .rdl-table tbody tr:nth-child(even) td, .rdl-table > tr:nth-child(even) td { background: var(--surface-2); } .rdl-table tr:hover td { background: var(--accent-soft); } .gaz-head th { font-family: var(--font-mono); font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; border-bottom: 1.5px solid var(--ink); } .rdl-cap { font-family: var(--font-display); } table.rooms tbody tr:hover td { background: var(--accent-soft); } /* --- Barres : pistes bordées + remplissage en dégradé --- */ .q-bar-track, .q-crime-barre, .air-barre { background: var(--surface-2); border: 1px solid var(--line); height: 12px; } .q-bar-fill { background: linear-gradient(90deg, var(--accent), var(--accent-deep)); } .q-crime-barre i { background: linear-gradient(90deg, #f0808a, var(--accent)); opacity: 0.9; } .air-barre i { background: linear-gradient(90deg, #6fbc85, #2e7d4a); } .air-barre i.air-sur { background: linear-gradient(90deg, #e08a48, #c96a1f); } /* --- Pastilles d'état unifiées (zi-badge & cie) : mono + point d'état --- */ .zi-badge { display: inline-flex; align-items: center; gap: 6px; font-family: var(--font-mono); font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; padding: 4px 10px; border: 1.5px solid currentColor; } .zi-badge::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: currentColor; } .gaz-best { border: 1px solid currentColor; } /* --- Listes riches (zones d'inondation) : mini-cartes à liseré accent --- */ .zi-liste { display: flex; flex-direction: column; gap: 8px; } .zi-liste li { border: 1px solid var(--line); border-left: 3px solid var(--accent); border-top: 1px solid var(--line); border-radius: var(--r-ctl); padding: 9px 12px; background: var(--surface-2); } /* --- Inclusions : icône et libellé alignés sur une seule ligne --- */ .amenity { display: inline-flex; align-items: center; gap: 6px; } /* --- Notes de bas de bloc : filet pointillé --- */ .f-bloc .fine, .quartier .fine { margin-top: 12px; padding-top: 9px; border-top: 1px dashed var(--line); } /* --- CTA secondaire : téléchargement de la fiche PDF --- */ .cta-pdf { background: var(--surface); color: var(--ink); box-shadow: 4px 4px 0 rgba(26, 18, 20, 0.12); margin-top: 10px; } .cta-pdf:hover { background: var(--ink); color: var(--paper); } /* ================= Financement (fiche) + page Taux hypothécaires ========= */ .f-mtg .mtg-intro { color: var(--ink-2); font-size: 14px; margin: 4px 0 14px; } .f-mtg .mtg-intro a { color: var(--lime); font-weight: 600; } .mtg-form { display: grid; gap: 10px; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); } .mtg-form label { display: flex; flex-direction: column; gap: 3px; min-width: 0; } .mtg-form label > span { font-family: var(--font-mono); font-size: 9.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-3); } .mtg-form input, .mtg-form select { border: 1.5px solid var(--ink); border-radius: 9px; background: var(--surface); padding: 9px 10px; font-size: 14.5px; font-family: inherit; color: var(--ink); min-height: 42px; min-width: 0; } .mtg-form input:focus, .mtg-form select:focus { outline: none; box-shadow: 3px 3px 0 var(--lime); } .mtg-err { color: var(--accent-deep); font-size: 13.5px; margin: 12px 0 0; } .mtg-resultat { display: grid; gap: 10px; margin-top: 16px; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); } .mtg-kpi { border: 1.5px solid var(--line-strong); border-radius: var(--r-card); background: var(--surface-2); padding: 12px 14px; display: flex; flex-direction: column; gap: 2px; min-width: 0; } .mtg-kpi-k { font-family: var(--font-mono); font-size: 9.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.12em; color: var(--ink-3); } .mtg-kpi-v { font-family: var(--font-display); font-weight: 700; font-size: 22px; letter-spacing: -0.02em; } .mtg-kpi-sub { font-size: 12px; color: var(--ink-3); } .mtg-kpi:first-child { background: var(--ink); border-color: var(--ink); } .mtg-kpi:first-child .mtg-kpi-v { color: var(--lime); } .mtg-kpi:first-child .mtg-kpi-k, .mtg-kpi:first-child .mtg-kpi-sub { color: rgba(255,255,255,0.75); } .mtg-source { margin-top: 10px; } .mtg-schl { margin-top: 14px; border: 1.5px dashed var(--line-strong); border-radius: var(--r-card); padding: 12px 14px; font-size: 13.5px; background: var(--surface); } .mtg-schl ul { margin: 8px 0 0; padding-left: 18px; display: grid; gap: 3px; } .mtg-schl-no { border-color: var(--accent-deep); } .mtg-issue { margin: 8px 0 0; color: var(--accent-deep); font-size: 13px; } .mtg-detail { margin-top: 10px; border: 1.5px solid var(--line-strong); border-radius: var(--r-card); background: var(--surface); } .mtg-detail > summary { cursor: pointer; padding: 11px 14px; font-weight: 700; font-size: 14px; list-style: none; display: flex; align-items: center; gap: 8px; } .mtg-detail > summary::before { content: "+"; font-family: var(--font-mono); color: var(--lime); font-weight: 700; } .mtg-detail[open] > summary::before { content: "−"; } .mtg-detail > summary::-webkit-details-marker { display: none; } .mtg-detail > *:not(summary) { margin: 0 14px 12px; } .mtg-detail .fine { border-top: none; padding-top: 0; } .mtg-total { border-top: 2px solid var(--ink); } .mtg-comp td, .mtg-comp th { white-space: nowrap; } .mtg-stale { color: var(--accent-deep); } .mtg-chart svg { width: 100%; height: auto; display: block; } .mtg-grid { stroke: var(--line); stroke-width: 1; } .mtg-tick { font-family: var(--font-mono); font-size: 10px; fill: var(--ink-3); } .mtg-line { fill: none; stroke: var(--lime); stroke-width: 2.5; stroke-linejoin: round; } .mtg-dot { fill: var(--ink); stroke: var(--lime); stroke-width: 2.5; } /* ---- page /taux-hypothecaires ---- */ .taux-page { padding-bottom: 40px; } .taux-head { margin: 28px 0 6px; max-width: 760px; } .taux-head h1 { font-family: var(--font-display); font-size: clamp(28px, 5vw, 40px); letter-spacing: -0.03em; } .taux-head p { color: var(--ink-2); font-size: 15px; margin: 12px 0 0; } .taux-page > .f-bloc { margin-top: 22px; } .taux-grid { display: grid; gap: 10px; grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); } .taux-card { border: 1.5px solid var(--ink); border-radius: var(--r-card); background: var(--surface); padding: 12px 14px; text-align: left; cursor: pointer; display: flex; flex-direction: column; gap: 2px; transition: box-shadow 0.15s ease; font-family: inherit; min-width: 0; } .taux-card:hover { box-shadow: 3px 3px 0 var(--lime); } .taux-card.on { background: var(--ink); color: var(--paper); } .taux-card.on .taux-card-v { color: var(--lime); } .taux-card-k { font-family: var(--font-mono); font-size: 9.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.12em; color: var(--ink-3); } .taux-card.on .taux-card-k, .taux-card.on .taux-card-sub { color: rgba(255,255,255,0.7); } .taux-card-v { font-family: var(--font-display); font-weight: 700; font-size: 24px; } .taux-card-sub { font-size: 11.5px; color: var(--ink-3); } .taux-filtres { display: flex; gap: 10px; margin-bottom: 14px; flex-wrap: wrap; } .taux-filtres label { display: flex; flex-direction: column; gap: 3px; } .taux-filtres label > span { font-family: var(--font-mono); font-size: 9.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-3); } .taux-filtres select { border: 1.5px solid var(--ink); border-radius: 9px; background: var(--surface); padding: 9px 12px; font-size: 14.5px; font-family: inherit; min-height: 42px; } .taux-best td { background: var(--lime-soft); } .taux-badge { font-family: var(--font-mono); font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; background: var(--ink); color: var(--lime); border-radius: 999px; padding: 2px 8px; margin-left: 8px; } .taux-sante { display: flex; flex-wrap: wrap; gap: 8px; } .taux-src { border: 1.5px solid var(--line-strong); border-radius: 999px; padding: 6px 12px; font-size: 12.5px; font-weight: 600; display: inline-flex; align-items: center; gap: 7px; } .taux-src::before { content: ""; width: 8px; height: 8px; border-radius: 50%; } .taux-src-ok::before { background: var(--green, #2f9e44); } .taux-src-warning::before { background: #e8a000; } .taux-src-error::before { background: var(--accent-deep); } /* ============================================================================= REFONTE ÉDITORIALE v2 (2026-08-25) — accueil « produit premium » Personnalité Immo-Ka : architecturale et financière — composition typographique majuscule plein/outline décalée, colonne de données mono façon terminal, cerise en couleur de SIGNAL (jamais en aplat décoratif). Primitives locales : rayons 0/6/10/18, durées 150/240/350 ms. Couche posée en FIN de fichier : elle a le dernier mot sur la cascade. ============================================================================= */ :root { --r-0: 0px; --r-1: 6px; --r-2: 10px; --r-3: 18px; --dur-1: 150ms; --dur-2: 240ms; --dur-3: 350ms; --ease-out: cubic-bezier(0.2, 0.8, 0.2, 1); --hairline: rgba(20, 24, 20, 0.14); --hairline-strong: rgba(20, 24, 20, 0.6); } /* ---- Héro : composition typographique + colonne de données ---- */ .hero-wrap { display: grid; grid-template-columns: 1fr auto; gap: 24px 56px; align-items: end; } .hero h1.hero-display { display: flex; flex-direction: column; font-size: clamp(40px, 6.8vw, 92px); line-height: 0.96; text-transform: uppercase; letter-spacing: -0.04em; max-width: none; margin-top: 16px; } .hero-display .hd-l1, .hero-display .hd-l2, .hero-display .hd-l3, .hero-display .hd-l4 { display: block; } .hero-display .hd-l2 { color: transparent; -webkit-text-stroke: 2.5px var(--ink); } .hero-display .hd-l3 { margin-left: clamp(24px, 6vw, 110px); } .hero-display .hd-l4 { font-size: 0.5em; letter-spacing: -0.02em; margin-top: 0.35em; margin-left: clamp(2px, 1vw, 8px); } .hero-display .signal { font-style: normal; color: var(--lime); position: relative; border-bottom: 4px solid var(--lime); padding-bottom: 1px; } .hero p.lede { font-size: 16px; max-width: 560px; } .hero::before { opacity: 0.7; } .hero::after { opacity: 0.5; } /* colonne « terminal » : les chiffres du marché comme élément graphique */ .hero-data { display: flex; flex-direction: column; gap: 18px; border-left: 1px solid var(--hairline-strong); padding-left: 28px; min-width: 190px; } .hd-row b { display: block; font-family: var(--font-display); font-weight: 700; font-size: clamp(20px, 2vw, 27px); letter-spacing: -0.03em; color: var(--ink); font-variant-numeric: tabular-nums; line-height: 1.1; } .hd-row span { font-family: var(--font-mono); font-size: 9.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.14em; color: var(--ink-3); } @media (max-width: 900px) { .hero-wrap { grid-template-columns: 1fr; align-items: start; } .hero-data { flex-direction: row; flex-wrap: wrap; gap: 16px 28px; border-left: 0; border-top: 1px solid var(--hairline); padding: 16px 0 0; min-width: 0; margin-top: 6px; } } /* ---- Ligne de données vivantes (mono + filets) ---- */ .live-line { display: flex; flex-wrap: wrap; align-items: baseline; margin-top: 30px; font-family: var(--font-mono); font-size: 12px; color: var(--ink-2); letter-spacing: 0.02em; row-gap: 10px; } .live-flag { display: inline-flex; align-items: center; gap: 7px; font-weight: 700; font-size: 10.5px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--accent-deep); padding-right: 14px; margin-right: 14px; border-right: 1px solid var(--hairline-strong); } .live-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--lime); animation: pulse 2.4s ease infinite; } .live-item { padding-right: 14px; margin-right: 14px; border-right: 1px solid var(--hairline); } .live-item:last-child { border-right: 0; padding-right: 0; margin-right: 0; } .live-item b { color: var(--ink); font-weight: 700; font-variant-numeric: tabular-nums; } @media (max-width: 640px) { .live-line { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; white-space: nowrap; margin-right: -16px; padding-right: 16px; } .live-line::-webkit-scrollbar { display: none; } } /* ---- Recherche au cœur : grand champ souligné + critères en filets ---- */ .search-zone { margin: 42px 0 0; } .q-big { display: flex; align-items: center; gap: 14px; border: 0; border-bottom: 2px solid var(--ink); border-radius: 0; background: transparent; padding: 4px 2px 14px; color: var(--ink-3); transition: border-color var(--dur-2) var(--ease-out), color var(--dur-2) ease; } .q-big:focus-within { border-color: var(--lime); color: var(--accent-deep); } .q-big svg { flex: none; } .q-big input { flex: 1; min-width: 0; border: 0; background: none; outline: none; padding: 0; font-family: var(--font-display); font-weight: 600; font-size: clamp(19px, 2.8vw, 28px); letter-spacing: -0.02em; color: var(--ink); } .q-big input::placeholder { color: var(--ink-3); font-weight: 500; } .crit-line { display: flex; align-items: stretch; flex-wrap: wrap; } .crit { display: flex; flex-direction: column; justify-content: center; gap: 1px; padding: 12px 26px 12px 0; margin-right: 26px; border-right: 1px solid var(--hairline); min-width: 0; cursor: pointer; } .crit > span { font-family: var(--font-mono); font-size: 9.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.14em; color: var(--ink-3); } .crit select { border: 0; background: transparent; outline: none; cursor: pointer; font-family: var(--font-display); font-weight: 700; font-size: 15.5px; color: var(--ink); appearance: none; -webkit-appearance: none; padding: 2px 18px 2px 0; min-width: 0; max-width: 190px; text-overflow: ellipsis; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9' height='5'%3E%3Cpath d='M0 0l4.5 5L9 0z' fill='%238b928c'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right center; } .crit:hover select { color: var(--accent-deep); } .crit .range-pair select { max-width: 92px; } .crit-more { display: inline-flex; align-items: center; gap: 9px; align-self: center; border: 0; background: none; padding: 12px 0; cursor: pointer; font-family: var(--font-display); font-weight: 700; font-size: 14.5px; color: var(--ink); transition: color var(--dur-1) ease; } .crit-more:hover, .crit-more.on { color: var(--accent-deep); } .crit-badge, .rb-badge { display: inline-grid; place-items: center; min-width: 19px; height: 19px; padding: 0 5px; border-radius: 999px; background: var(--lime); color: #fff; font-size: 11px; font-weight: 700; font-variant-numeric: tabular-nums; } .search-zone .f-adv { border-top: 1px solid var(--hairline); margin-top: 2px; padding-top: 18px; } .search-zone .seg button { border: 1px solid var(--hairline-strong); background: transparent; color: var(--ink-2); min-height: 38px; font-weight: 600; margin-left: -1px; } .search-zone .seg button:first-child { border-radius: var(--r-1) 0 0 var(--r-1); } .search-zone .seg button:last-child { border-radius: 0 var(--r-1) var(--r-1) 0; } .search-zone .seg button:hover { background: var(--lime-soft); color: var(--accent-deep); } .search-zone .seg button.on { background: var(--ink); border-color: var(--ink); color: var(--paper); box-shadow: none; } .search-zone .f-native { border: 1px solid var(--hairline-strong); background: transparent; } /* résumé mobile des critères — remplace le FAB (voir media 640 plus bas) */ .crit-summary { display: none; } /* ---- Barre de résultats sticky : N propriétés · tri · Liste|Carte ---- */ .results-bar { position: sticky; top: 64px; z-index: var(--z-sticky, 300); display: flex; align-items: center; gap: 16px; margin: 30px 0 22px; padding: 12px 0 11px; border-bottom: 1px solid var(--hairline-strong); background: color-mix(in srgb, var(--paper) 86%, transparent); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); } @supports not (background: color-mix(in srgb, red 50%, blue)) { .results-bar { background: rgba(245, 243, 238, 0.92); } } .rb-count { margin: 0; font-size: clamp(16px, 2vw, 20px); letter-spacing: -0.02em; color: var(--ink); text-transform: none; } .rb-count b { font-variant-numeric: tabular-nums; } .rb-tools { margin-left: auto; display: flex; align-items: center; gap: 20px; } .rb-sort select { border: 0; background: transparent; outline: none; cursor: pointer; font-family: var(--font-mono); font-size: 11.5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-2); appearance: none; -webkit-appearance: none; padding: 8px 16px 8px 0; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9' height='5'%3E%3Cpath d='M0 0l4.5 5L9 0z' fill='%238b928c'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right center; } .rb-sort select:hover { color: var(--ink); } .rb-tabs { display: flex; gap: 18px; } .rb-tab { position: relative; display: inline-flex; align-items: center; gap: 6px; border: 0; background: none; padding: 8px 0; cursor: pointer; font-family: var(--font-display); font-weight: 700; font-size: 13.5px; color: var(--ink-3); transition: color var(--dur-1) ease; } .rb-tab:hover, .rb-tab.on { color: var(--ink); } .rb-tab::after { content: ""; position: absolute; left: 0; right: 0; bottom: -12px; height: 2.5px; background: var(--lime); transform: scaleX(0); transform-origin: left; transition: transform var(--dur-2) var(--ease-out); } .rb-tab.on::after { transform: scaleX(1); } .rb-filters { display: inline-flex; align-items: center; gap: 7px; border: 0; background: none; padding: 8px 0; cursor: pointer; font-family: var(--font-display); font-weight: 700; font-size: 13.5px; color: var(--ink); } .rb-filters:hover { color: var(--accent-deep); } @media (min-width: 641px) { .rb-filters { display: none; } } /* ---- Transition douce liste ↔ carte ---- */ .view-pane { animation: pane-in var(--dur-2) var(--ease-out); } @keyframes pane-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } } /* ---- Chips rapides : plus légères ---- */ .chip { border: 1px solid var(--hairline-strong); background: transparent; min-height: 38px; padding: 7px 15px; font-size: 12.5px; box-shadow: none; } .chip:hover { transform: none; box-shadow: none; background: var(--lime-soft); color: var(--accent-deep); } .chip.on { background: var(--ink); border-color: var(--ink); color: var(--paper); box-shadow: none; } .chips { margin: 20px 0 0; } /* ---- Pastilles actives : discrètes, survol = retrait ---- */ .pills { margin: 14px 0 0; } .pills .pill { border: 1px solid var(--hairline-strong); background: transparent; box-shadow: none; padding: 5px 12px; font-size: 12px; } .pills .pill:hover { background: var(--danger-soft); border-color: var(--danger); color: var(--danger); } /* ---- Fiches éditoriales : l'image domine, plus de boîte ---- */ .card, .card:hover { background: transparent; border: 0; border-radius: 0; box-shadow: none; transform: none; } .card-img { border-radius: var(--r-2); aspect-ratio: 4/3; } .card-img img { transition: transform var(--dur-3) var(--ease-out); } @media (hover: hover) { .card:hover .card-img img { transform: scale(1.025); } .card:hover .card-price { color: var(--accent-deep); } } .card:focus-visible { outline: 2px solid var(--green); outline-offset: 4px; border-radius: var(--r-2); } .card-body { padding: 13px 2px 0; gap: 3px; } .card-price { font-size: 22px; letter-spacing: -0.03em; color: var(--ink); transition: color var(--dur-1) ease; } .card-title { font-size: 14px; font-weight: 500; color: var(--ink-2); } .card-meta { font-family: var(--font-mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-3); } .card-meta .sep { width: 3px; height: 3px; border: 0; border-radius: 50%; background: var(--lime); transform: none; } .card-specs { font-size: 11.5px; color: var(--ink-2); } .card-foot { border-top: 0; padding-top: 8px; } .source-tag { background: none; border: 0; border-radius: 0; padding: 0; color: var(--ink-3); font-size: 10px; letter-spacing: 0.08em; max-width: 62%; } .avail { font-size: 11px; color: var(--ink-3); } .badge { border: 0; border-radius: 4px; background: rgba(20, 24, 20, 0.78); color: var(--paper); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); font-size: 9.5px; padding: 4px 9px; letter-spacing: 0.08em; } .badge.type { background: var(--lime); color: #fff; } .badge.right { background: rgba(20, 24, 20, 0.55); } /* la liste latérale de la vue carte garde ses fiches synchronisées lisibles */ .map-card { border-radius: var(--r-2); } .map-card-sel { outline: 2px solid var(--lime); outline-offset: 3px; border-radius: var(--r-2); } /* ---- Grille à rythme éditorial (accueil) ---- */ .grid.grid-edito { grid-template-columns: repeat(3, 1fr); gap: 36px 26px; align-items: start; } @media (max-width: 980px) { .grid.grid-edito { grid-template-columns: 1fr 1fr; gap: 30px 20px; } } @media (max-width: 640px) { .grid.grid-edito { grid-template-columns: 1fr; gap: 32px; } } @media (prefers-reduced-motion: no-preference) { .grid-edito > * { animation: rise 0.5s var(--ease-out) backwards; } .grid-edito > *:nth-child(3n+2) { animation-delay: 60ms; } .grid-edito > *:nth-child(3n) { animation-delay: 120ms; } } @keyframes rise { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } } /* ---- Squelettes sans boîte ---- */ .skel { border: 0; border-radius: 0; background: transparent; } .skel .sk-img { aspect-ratio: 4/3; border-radius: var(--r-2); } .skel .sk-line { margin: 12px 2px; } /* ---- Pagination éditoriale : chiffres nus, page courante soulignée ---- */ .pager { border-top: 1px solid var(--hairline); padding-top: 16px; margin-top: 26px; } .pager-info { font-family: var(--font-mono); font-size: 11.5px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-3); } .pager-btn { min-width: 34px; min-height: 38px; height: auto; padding: 0 10px; border: 0; border-radius: var(--r-1); background: none; color: var(--ink-2); box-shadow: none; font-family: var(--font-display); font-size: 13.5px; font-weight: 600; position: relative; } .pager-btn:hover:not(:disabled):not(.on) { background: var(--lime-soft); color: var(--accent-deep); transform: none; box-shadow: none; } .pager-btn.on { background: none; border: 0; color: var(--ink); font-weight: 700; box-shadow: none; } .pager-btn.on::after { content: ""; position: absolute; left: 9px; right: 9px; bottom: 3px; height: 2.5px; background: var(--lime); } .pager-btn:disabled { box-shadow: none; } /* ---- Mobile : recherche condensée + feuille de critères premium ---- */ @media (max-width: 640px) { .hero h1.hero-display { font-size: clamp(38px, 11vw, 52px); } .results-bar { top: 64px; gap: 10px; flex-wrap: wrap; } .rb-tools { gap: 14px; } .search-zone { margin: 30px 0 0; } .crit-line, .search-zone .f-adv, .search-zone .sheet-apply { display: none; } .crit-summary { display: flex; align-items: center; gap: 10px; width: 100%; border: 0; border-bottom: 1px solid var(--hairline); background: none; padding: 14px 2px; margin: 0; cursor: pointer; text-align: left; font-family: var(--font-mono); font-size: 12px; color: var(--ink-2); } .crit-summary svg { flex: none; color: var(--ink); } .crit-summary .cs-txt { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .crit-summary .f-chev { margin: 0 2px 0 0; } .search-zone.open { display: flex; flex-direction: column; gap: 12px; position: fixed; left: 0; right: 0; bottom: 0; z-index: var(--z-modal, 900); margin: 0; border-radius: var(--r-3) var(--r-3) 0 0; background: var(--surface); border: 0; max-height: 86dvh; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 10px 18px calc(16px + env(safe-area-inset-bottom)); box-shadow: 0 -18px 50px rgba(20, 24, 20, 0.3); animation: sheet-up 0.26s var(--ease-out); } .search-zone.open .sheet-handle { display: block; flex: none; width: 40px; height: 4.5px; border-radius: 999px; background: var(--line); margin: 0 auto; } .search-zone.open .sheet-head { display: flex; justify-content: space-between; align-items: center; font-family: var(--font-display); font-weight: 700; font-size: 17px; letter-spacing: -0.01em; color: var(--ink); text-transform: none; position: sticky; top: -10px; background: var(--surface); padding: 6px 0 8px; border-bottom: 1px solid var(--hairline); z-index: 1; } .search-zone.open .crit-summary { display: none; } .search-zone.open .q-big { padding: 2px 0 10px; } .search-zone.open .q-big input { font-size: 17px; } .search-zone.open .crit-line { display: flex; flex-direction: column; } .search-zone.open .crit { border-right: 0; border-bottom: 1px solid var(--hairline); margin: 0; padding: 10px 0; } .search-zone.open .crit select { max-width: none; width: 100%; font-size: 16px; } .search-zone.open .crit .range-pair select { width: auto; flex: 1; } .search-zone.open .crit-more { display: none; } .search-zone.open .f-adv { display: grid; border-top: 0; padding-top: 4px; margin-top: 0; } .search-zone.open .sheet-apply { display: flex; position: sticky; bottom: 0; z-index: 1; width: 100%; min-height: 50px; box-shadow: 0 -14px 18px -12px rgba(20, 24, 20, 0.35); } } /* ---- Navigation mobile flottante (pilule détachée du bord) ---- */ .tabbar { display: none; } @media (max-width: 760px) { .tabbar { display: grid; grid-template-columns: repeat(4, 1fr); position: fixed; left: 12px; right: 12px; bottom: calc(10px + env(safe-area-inset-bottom)); z-index: var(--z-bottombar, 600); border: 1px solid var(--hairline-strong); border-radius: var(--r-3); background: rgba(250, 249, 245, 0.88); backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px); box-shadow: 0 14px 34px rgba(20, 24, 20, 0.16); padding: 6px; } .tabbar a { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; padding: 5px 2px; min-height: 48px; border-radius: 12px; font-family: var(--font-display); font-size: 10px; font-weight: 600; color: var(--ink-3); text-decoration: none; transition: color var(--dur-1) ease; } .tabbar a svg { display: block; } .tabbar a.active { color: var(--ink); } .tabbar a.active::after { content: ""; width: 16px; height: 2.5px; border-radius: 2px; background: var(--lime); } body { padding-bottom: calc(80px + env(safe-area-inset-bottom)); } .ka-footer { padding-bottom: calc(56px + env(safe-area-inset-bottom)); } /* widget KA Agent : dégagé de la tabbar (style injecté après le bundle → spécificité doublée pour gagner) */ .kaa-btn.kaa-btn { bottom: calc(86px + env(safe-area-inset-bottom, 0px)); right: 14px; } .kaa-panel.kaa-panel:not(.kaa-full) { bottom: calc(152px + env(safe-area-inset-bottom, 0px)); } } /* ---- Header : jamais de débordement à droite ---- La nav (8 entrées) + connexion dépassaient le conteneur même à 1440px (masqué par overflow-x: clip). Resserrage, badge Groupe KA masqué quand l'espace manque, burger sous 1200px. ---- */ .nav a { white-space: nowrap; padding: 8px 11px; font-size: 13px; } @media (max-width: 1400px) { .header .gk-badge { display: none; } } @media (max-width: 1200px) { .nav { display: none; } .menu-btn { display: flex; } } /* header pleine largeur : la nav dense s'aligne aux bords de l'écran au lieu de déborder du conteneur 1240px sur les grands écrans */ .header .header-inner { max-width: none; } /* ---- Fiche propriété : DA v2 — sections en filets, icônes contextuelles ---- */ .f-bloc h2 { border-left: 0; padding-left: 0; display: flex; align-items: center; gap: 10px; } .f-bloc h2::before { content: ""; width: 20px; height: 3px; border-radius: 2px; background: var(--lime); flex: none; } /* le panneau héros perd sa boîte : la typographie structure */ .f-hero { background: transparent; border: 0; box-shadow: none; padding: 0; } .f-hero .price { font-size: clamp(36px, 7vw, 54px); letter-spacing: -0.04em; } /* inclusions : grille d'items en filets — chaque inclusion a SON icône */ .amenity-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(215px, 1fr)); gap: 0 28px; margin-bottom: 8px; } .amenity-it { display: flex; align-items: center; gap: 11px; padding: 7px 0; border-bottom: 1px solid var(--hairline); font-size: 13.5px; color: var(--ink); min-height: 46px; } .am-ico { display: inline-grid; place-items: center; width: 32px; height: 32px; border-radius: 10px; background: var(--lime-soft); color: var(--green-deep); flex: none; } .am-txt { min-width: 0; } /* caractéristiques : clés en micro-mono */ .dtable { gap: 0 28px; } .drow { padding: 9px 0; } .drow span { font-family: var(--font-mono); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-3); align-self: center; } /* galerie : cadre allégé */ .carousel { border: 1px solid var(--hairline-strong); box-shadow: none; border-radius: var(--r-2); } .thumbs button { border-radius: 8px; } /* CTA sticky : sur la fiche, il prend le bas d'écran — la tabbar s'efface */ body:has(.cta-sticky) .tabbar { display: none; } .cta-sticky { z-index: var(--z-dropdown, 700); border-top: 1px solid var(--hairline-strong); background: rgba(250, 249, 245, 0.92); } @media (max-width: 760px) { body:has(.cta-sticky) { padding-bottom: 0; } } /* colonnes de la fiche : les sections respirent sans boîte — les modules pleine largeur (.detail > .f-bloc : financement, quartier…) restent en cartes */ .fiche > .f-col > .f-bloc:not(.f-galerie) { background: transparent; border: 0; border-radius: 0; padding: 0; box-shadow: none; } @media (max-width: 640px) { .fiche > .f-col > .f-bloc:not(.f-galerie) { padding: 0; } } /* tiret accent des titres : sans bordure ni ombre héritées de la couche fiche */ .f-bloc h2::before, .quartier h2::before { border: 0; box-shadow: none; } /* ============================================================================= KA MAP SYSTEM v2 — MODE CARTE IMMO-KA (shell plein viewport) Jetons du design system appliqués au shell ; le sélecteur .ka-map du framework pose ses défauts directement sur le canevas — re-déclarer les jetons dessus, sinon l'accent retombe au noir générique dans la carte. ============================================================================= */ .ka-shell, .ka-shell .ka-map { --ka-accent: var(--accent); --ka-on-accent: var(--on-accent, #fff); --ka-surface: var(--surface); --ka-ink: var(--ink); --ka-line: var(--line-strong); --ka-radius: var(--r-ctl); --ka-shadow: 0 8px 24px rgba(26, 18, 20, 0.14); --ka-font: var(--font-body); } .ka-shell-fallback { position: fixed; inset: 0; z-index: 640; display: grid; place-items: center; background: var(--surface); color: var(--ink-3); font-family: var(--font-mono, inherit); font-size: 13px; } .ms2-brand { display: inline-flex; align-items: baseline; gap: 7px; font-family: var(--font-display); min-width: 0; } .ms2-brand b { font-size: 15px; letter-spacing: -0.01em; } .ms2-brand span { font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.14em; color: var(--ink-3); font-weight: 600; } .ka-top-btn { display: inline-flex; align-items: center; gap: 6px; border: 1.5px solid var(--ink); border-radius: var(--r-ctl); background: var(--surface); color: var(--ink); font-family: var(--font-display); font-weight: 600; font-size: 12.5px; padding: 8px 13px; cursor: pointer; min-height: 38px; white-space: nowrap; } .ka-top-btn:hover { background: var(--ink); color: #fff; } .ka-top-badge { min-width: 17px; height: 17px; border-radius: 999px; background: var(--accent); color: var(--on-accent, #fff); font-size: 10.5px; font-weight: 700; line-height: 17px; text-align: center; padding: 0 4px; } .ms2-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; min-width: 0; } .ms2-count { font-size: 13px; color: var(--ink-2); min-width: 0; } .ms2-count b { color: var(--ink); font-size: 15px; } .ms2-zone { margin-left: 8px; font-size: 11px; color: var(--accent-deep, var(--accent)); border: 1px dashed var(--accent); border-radius: 999px; padding: 2px 8px; } .ms2-sort select { border: 1.5px solid var(--ink); border-radius: var(--r-ctl); background: var(--surface); padding: 6px 8px; font-size: 12.5px; font-weight: 600; color: var(--ink); max-width: 168px; } .ms2-list { display: flex; flex-direction: column; gap: 14px; position: relative; } .ms2-list .map-card { flex: 0 0 auto; } .ka-sheet .ms2-list { gap: 12px; padding-bottom: 10px; } .ms2-pager { display: flex; align-items: center; justify-content: center; gap: 10px; padding: 6px 0 4px; } /* mode carte : le widget Ka Agent s'efface (le sheet occupe son coin) */ body.ka-map-mode .kaa-btn, body.ka-map-mode .kaa-hello { display: none !important; } /* filtres de la page AU-DESSUS du mode carte — desktop : modale centrée */ @media (min-width: 781px) { body.ka-map-mode .sheet-backdrop { display: block; position: fixed; inset: 0; z-index: var(--z-overlay, 800); background: rgba(26, 18, 20, 0.45); } body.ka-map-mode .search-zone { display: none; } body.ka-map-mode .search-zone.open { display: block; position: fixed; top: 7dvh; left: 50%; transform: translateX(-50%); width: min(760px, 94vw); max-height: 84dvh; overflow-y: auto; z-index: var(--z-modal, 900); background: var(--surface); border: 1.5px solid var(--ink); border-radius: var(--r-card); box-shadow: var(--shadow-off); padding: 16px 22px 20px; margin: 0; } body.ka-map-mode .search-zone.open .sheet-head { display: flex; align-items: center; justify-content: space-between; font-weight: 700; font-size: 14px; margin-bottom: 10px; } body.ka-map-mode .search-zone.open .sheet-close { display: grid; place-items: center; width: 34px; height: 34px; border: 1.5px solid var(--ink); border-radius: 50%; background: var(--surface); cursor: pointer; font-size: 14px; } } /* --- KA ID v2 : badge « Recommandé pour vous » (parcimonieux, serveur) --- */ .badge.ka-reco { top: auto; bottom: 12px; background: var(--ink); color: var(--accent); } /* ================= House-Ka footer (replaces the shared KaFooter) ========== */ .hk-footer { margin-top: 72px; background: var(--ink); color: rgba(250, 247, 240, 0.78); padding: 52px 0 40px; position: relative; overflow: hidden; } .hk-footer::before { content: ""; position: absolute; inset: 0; pointer-events: none; background: radial-gradient(circle at 78% 18%, rgba(15, 107, 79, 0.35), transparent 52%), radial-gradient(circle at 8% 90%, rgba(15, 107, 79, 0.18), transparent 45%); } .hk-footer .container { position: relative; } .hk-foot-brand { font-family: var(--font-display); font-weight: 700; font-size: 30px; letter-spacing: -0.02em; color: var(--paper); display: inline-flex; align-items: center; } .hk-foot-brand .ka { background: var(--accent); color: #fff; padding: 2px 8px 4px; border-radius: 7px; margin-left: 4px; transform: rotate(-2deg); } .hk-foot-desc { max-width: 640px; margin: 16px 0 10px; line-height: 1.65; font-size: 14.5px; } .hk-foot-desc b { color: var(--paper); } .hk-foot-notice { max-width: 640px; margin: 0 0 24px; font-size: 12.5px; line-height: 1.6; color: rgba(250, 247, 240, 0.55); } .hk-foot-sites { list-style: none; margin: 0 0 26px; padding: 0; display: flex; flex-wrap: wrap; gap: 10px 26px; } .hk-foot-sites li { display: flex; align-items: baseline; gap: 8px; font-size: 13px; } .hk-foot-sites a { color: var(--paper); font-family: var(--font-display); font-weight: 600; font-size: 15px; } .hk-foot-sites a:hover { color: var(--accent-soft); } .hk-foot-sites span { color: rgba(250, 247, 240, 0.5); } .hk-foot-legal { display: flex; flex-wrap: wrap; gap: 8px 22px; padding-top: 18px; border-top: 1px solid rgba(250, 247, 240, 0.14); font-size: 12.5px; } .hk-foot-legal a { color: rgba(250, 247, 240, 0.72); } .hk-foot-legal a:hover { color: var(--paper); } .hk-foot-legal span { margin-left: auto; color: rgba(250, 247, 240, 0.45); } @media (max-width: 780px) { .hk-footer { padding-bottom: calc(56px + env(safe-area-inset-bottom)); } } .legal .legal-date { color: var(--ink-3); font-family: var(--font-mono); font-size: 12px; margin: 0 0 26px; } /* ♥ favourite on the listing hero (KA ID account) */ .fav-heart { margin-left: 10px; border: 1.5px solid var(--hairline-strong, #d8d2c6); background: transparent; border-radius: 999px; width: 40px; height: 40px; font-size: 20px; line-height: 1; cursor: pointer; color: var(--ink-2); vertical-align: middle; transition: all 0.15s ease; } .fav-heart:hover { border-color: var(--accent); color: var(--accent); } .fav-heart.on { background: var(--accent); border-color: var(--accent); color: #fff; }