spb/ka-guardian
Public
Python 57.1%
Shell 13.8%
CSS 12%
JavaScript 10%
HTML 7.2%
1/* KA Guardian — langage visuel Groupe KA : papier, encre, lime, ombres décalées dures */2:root {3 --paper: #f5f3ee; --surface: #fff; --surface-2: #faf9f5;4 --ink: #141814; --ink-2: #4d5551; --ink-3: #8b928c;5 --line: #14181424; --line-strong: #141814d9;6 --green: #1c5c41; --green-soft: #e4f0e9;7 --amber: #e8a33d; --amber-soft: #fdf3e2;8 --danger: #b3423a; --danger-soft: #fbe9e7;9 --stale: #3a5f8a; --stale-soft: #e7edf5;10 --lime: #d9f26b; --lime-soft: #f0f9d2; --accent-deep: #123f2e;11 --agent: #22d3ee; /* remplacé au chargement par l'accent de l'agent */12 --r-card: 10px; --r-ctl: 6px; --r-pill: 999px;13 --shadow-off: 6px 6px 0 var(--ink);14 --shadow-off-soft: 8px 8px 0 #14181414;15 --shadow-off-mid: 4px 4px 0 #1418142e;16 --font-display: "Space Grotesk", system-ui, sans-serif;17 --font-body: "Inter", system-ui, sans-serif;18 --font-mono: "JetBrains Mono", ui-monospace, monospace;19 --fs-h1: clamp(30px, 3.2vw + 18px, 52px);20}21* { box-sizing: border-box; margin: 0; }22[hidden] { display: none !important; }23body { background: var(--paper); color: var(--ink); font: 15px/1.55 var(--font-body);24 -webkit-font-smoothing: antialiased; overflow-x: clip; }25a { color: inherit; }26::selection { background: var(--lime); color: var(--ink); }2728.klabel { font-family: var(--font-mono); text-transform: uppercase; letter-spacing: 0.1em;29 color: var(--ink-3); font-size: 10px; font-weight: 700; margin-bottom: 10px; }30.hint { text-transform: none; letter-spacing: 0.02em; font-weight: 400; }31.hl { background: var(--lime); color: var(--ink); border-radius: 8px; padding: 0 10px 2px;32 display: inline-block; transform: rotate(-1deg); }3334.card { background: var(--surface); border: 1.5px solid var(--ink); border-radius: var(--r-card);35 box-shadow: var(--shadow-off-soft); overflow: hidden; }36.pad { padding: 16px; }3738.chip { font-family: var(--font-mono); text-transform: uppercase; letter-spacing: 0.06em;39 border: 1.5px solid var(--ink); border-radius: var(--r-pill); background: var(--surface);40 color: var(--ink); align-items: center; gap: 6px; padding: 4px 11px; font-size: 11px;41 font-weight: 700; display: inline-flex; }42.chip-accent { background: var(--lime); }4344/* ---------- header ---------- */45.topbar { display: flex; justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap;46 padding: 14px clamp(16px, 4vw, 48px); border-bottom: 1.5px solid var(--ink); background: var(--paper);47 position: sticky; top: 0; z-index: 500; }48.wordmark { font-family: var(--font-display); font-weight: 700; font-size: 24px; letter-spacing: -0.04em;49 text-decoration: none; display: inline-flex; align-items: center; }50.wordmark .ka { background: var(--ink); color: var(--lime); border-radius: 6px; margin-left: 6px;51 padding: 0 8px 2px; display: inline-block; transform: rotate(-2deg); font-size: 0.72em; }52#wm-name b, #wm-name { color: var(--ink); }53.topnav { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }54.tabs { display: flex; gap: 6px; }55.tab { font: 700 13px var(--font-display); text-decoration: none; color: var(--ink-2);56 border: 1.5px solid transparent; border-radius: var(--r-pill); padding: 6px 14px;57 transition: transform 0.15s, box-shadow 0.15s; }58.tab:hover { border-color: var(--ink); background: var(--surface); transform: translate(-1px, -1px);59 box-shadow: 3px 3px 0 var(--ink); }60.tab.active { background: var(--ink); color: var(--lime); border-color: var(--ink); }61.gk-badge { min-height: 30px; font-family: var(--font-mono); letter-spacing: 0.08em; text-transform: uppercase;62 border: 1.5px solid var(--ink); border-radius: var(--r-pill); background: var(--surface); color: var(--ink-2);63 white-space: nowrap; align-items: center; gap: 7px; padding: 3px 10px 4px; font-size: 10px; font-weight: 700;64 text-decoration: none; display: inline-flex; transition: transform 0.15s, box-shadow 0.15s; }65.gk-badge:hover { transform: translate(-1px, -1px); box-shadow: 3px 3px 0 var(--ink); }66.gk-badge b { font-family: var(--font-display); letter-spacing: -0.02em; text-transform: none;67 color: var(--ink); font-size: 12px; }68.gk-badge .ka { background: var(--ink); color: var(--lime); border-radius: 5px; margin-left: 3px;69 padding: 0 5px 1px; display: inline-block; transform: rotate(-2deg); }70.gk-badge .dot { width: 8px; height: 8px; border-radius: 50%; border: 1.5px solid var(--ink); }7172/* ---------- héros ---------- */73main { padding: clamp(24px, 4vw, 48px) clamp(16px, 4vw, 48px); max-width: 1440px; margin: 0 auto;74 display: grid; gap: clamp(32px, 4vw, 56px); }75.hero { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: clamp(20px, 3vw, 40px);76 align-items: start; }77@media (max-width: 900px) { .hero { grid-template-columns: 1fr; } }78.hero h1 { font-family: var(--font-display); font-size: var(--fs-h1); line-height: 1.08;79 letter-spacing: -0.03em; margin: 6px 0 16px; }80.lede { color: var(--ink-2); max-width: 56ch; font-size: 16px; }81.hero-chips { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 18px; }82.live-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--ink-3); display: inline-block; }83.live-dot.on { background: var(--green); animation: pulse 1.8s infinite; }84@keyframes pulse { 0%, 100% { box-shadow: 0 0 0 0 #1c5c4166; } 60% { box-shadow: 0 0 0 7px transparent; } }8586.defcard { padding: 18px 20px; box-shadow: var(--shadow-off); transform: rotate(0.4deg); }87.defword { font-family: var(--font-display); font-size: 24px; font-weight: 700; margin-bottom: 10px; }88.phon { color: var(--ink-3); font-weight: 400; font-size: 16px; }89.nat { font-style: italic; color: var(--ink-3); font-size: 14px; }90.defs { margin: 0; padding-left: 20px; display: grid; gap: 8px; font-size: 14px; color: var(--ink-2); }91.defs b { color: var(--ink); }9293/* ---------- tuiles ---------- */94.tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 14px; }95.tile { background: var(--surface); border: 1.5px solid var(--ink); border-radius: var(--r-card);96 padding: 14px 16px; box-shadow: var(--shadow-off-mid); }97.tile .v { font: 700 30px/1.15 var(--font-mono); letter-spacing: -0.02em; }98.tile .l { color: var(--ink-2); font-size: 12px; margin-top: 4px; }99.tile.hot { background: var(--lime); }100101/* ---------- commander un effort ---------- */102.commander { background: var(--lime-soft); box-shadow: var(--shadow-off); }103.cmd-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.3fr); gap: clamp(18px, 3vw, 40px);104 padding: clamp(18px, 3vw, 32px); }105@media (max-width: 900px) { .cmd-grid { grid-template-columns: 1fr; } }106.cmd-title { font-family: var(--font-display); font-size: clamp(24px, 2.4vw, 34px); letter-spacing: -0.02em;107 margin: 4px 0 12px; }108.cmd-lede { color: var(--ink-2); font-size: 14.5px; max-width: 48ch; }109#effort-form { display: grid; gap: 12px; align-content: start; }110.frow { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }111@media (max-width: 640px) { .frow { grid-template-columns: 1fr; } }112.frow-end { align-items: end; }113.flab { display: grid; gap: 5px; font: 700 10px var(--font-mono); text-transform: uppercase;114 letter-spacing: 0.08em; color: var(--ink-3); }115.input, .select { width: 100%; min-height: 44px; font: 400 14px var(--font-body); color: var(--ink);116 background: var(--surface); border: 1.5px solid var(--ink); border-radius: var(--r-ctl); padding: 10px 14px; }117.input:focus, .select:focus { box-shadow: 3px 3px 0 var(--lime); outline: none; }118.input::placeholder { color: var(--ink-3); }119.btn-primary { min-height: 44px; font: 700 14px var(--font-display); border: 1.5px solid var(--ink);120 border-radius: var(--r-ctl); background: var(--ink); color: var(--lime); cursor: pointer; padding: 10px 18px;121 transition: transform 0.15s, box-shadow 0.15s, background 0.15s; }122.btn-primary:hover { transform: translate(-2px, -2px); box-shadow: 4px 4px 0 #1418142e; background: var(--accent-deep); }123.btn-primary:disabled { opacity: 0.5; cursor: wait; transform: none; box-shadow: none; }124.cmd-msg { font: 600 12.5px var(--font-mono); min-height: 18px; }125.cmd-msg.ok { color: var(--green); } .cmd-msg.err { color: var(--danger); }126127/* ---------- page /commander ---------- */128.cmd-page { max-width: 980px; }129.cmd-hero h1 { font-family: var(--font-display); font-size: clamp(30px, 4.5vw, 48px);130 letter-spacing: -0.03em; line-height: 1.06; margin: 6px 0 14px; }131.cmd-hero .lede { color: var(--ink-2); max-width: 62ch; }132.cmd-form { padding: clamp(18px, 3vw, 30px); display: grid; gap: 14px; }133.frow-3 { grid-template-columns: 1fr 1fr 1fr; }134@media (max-width: 800px) { .frow-3 { grid-template-columns: 1fr; } }135.kind-hint { font-size: 13px; color: var(--ink-2); background: var(--surface);136 border: 1.5px solid var(--line); border-left: 3px solid var(--lime); border-radius: var(--r-ctl);137 padding: 9px 12px; }138.cmd-note { font-size: 12px; color: var(--ink-3); max-width: 52ch; align-self: center; }139140/* ---------- écran (flux) + side ---------- */141.cols { display: grid; grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr); gap: 20px; align-items: start; }142@media (max-width: 980px) { .cols { grid-template-columns: 1fr; } }143.side { display: grid; gap: 20px; min-width: 0; }144145.screen { background: var(--ink); border-color: var(--ink); box-shadow: var(--shadow-off); min-width: 0; }146.screen-head { display: flex; align-items: center; gap: 12px; padding: 10px 14px;147 border-bottom: 1px solid #f5f3ee2b; }148.screen-dots { display: inline-flex; gap: 5px; }149.screen-dots i { width: 10px; height: 10px; border-radius: 50%; background: #f5f3ee33; }150.screen-dots i:first-child { background: var(--agent); }151.screen-title { font-family: var(--font-mono); font-size: 11px; color: #f5f3ee99;152 text-transform: uppercase; letter-spacing: 0.08em; }153.feed { font: 12.5px/1.6 var(--font-mono); padding: 14px; height: 560px; overflow-y: auto;154 display: flex; flex-direction: column; gap: 7px; color: #f5f3eec9; }155.feed-empty { color: #f5f3ee66; }156.fe { display: flex; gap: 10px; align-items: baseline; animation: fadein 0.3s; }157@keyframes fadein { from { opacity: 0; transform: translateY(4px); } }158.fe .t { color: #f5f3ee59; flex: none; font-size: 10.5px; }159.fe .tag { flex: none; font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em;160 padding: 1px 8px; border-radius: 999px; border: 1px solid #f5f3ee38; color: #f5f3ee99; }161.fe.tool .tag { color: var(--lime); border-color: #d9f26b59; }162.fe.text .tag { color: #7fd6a8; border-color: #7fd6a859; }163.fe.incident .tag { color: var(--amber); border-color: #e8a33d66; }164.fe.rollback .tag { color: #ef9d96; border-color: #ef9d9666; }165.fe .m { overflow-wrap: anywhere; white-space: pre-wrap; min-width: 0; }166.fe.text .m { color: #f5f3ee; }167168/* ---------- incidents ---------- */169.incidents { display: grid; gap: 8px; max-height: 320px; overflow-y: auto; }170.inc { display: flex; align-items: center; gap: 10px; background: var(--surface-2);171 border: 1.5px solid var(--line); border-radius: var(--r-ctl); padding: 9px 11px; font-size: 13px; }172.inc .src { font: 600 12.5px var(--font-mono); overflow-wrap: anywhere; }173.inc .svc { color: var(--ink-3); font-size: 11px; font-family: var(--font-mono); }174.badge { margin-left: auto; flex: none; font: 700 10px var(--font-mono); text-transform: uppercase;175 letter-spacing: 0.05em; padding: 3px 9px; border-radius: var(--r-pill); border: 1.5px solid var(--ink); }176.b-open { background: var(--danger-soft); color: var(--danger); border-color: var(--danger); }177.b-fixing, .b-dispatched { background: var(--lime); color: var(--ink); }178.b-watching { background: var(--stale-soft); color: var(--stale); border-color: var(--stale); }179.b-cooldown { background: var(--amber-soft); color: #8a5f1e; border-color: var(--amber); }180.b-resolved, .b-self_healed { background: var(--green-soft); color: var(--green); border-color: var(--green); }181.b-abandoned { background: var(--surface); color: var(--ink-3); border-color: var(--ink-3); }182.empty { color: var(--ink-3); font-size: 13px; }183184/* ---------- couverture ---------- */185.coverage { display: grid; gap: 12px; }186.cov { border: 1.5px solid var(--line); border-radius: var(--r-ctl); padding: 11px 13px; background: var(--surface-2); }187.cov .head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 8px; gap: 8px; }188.cov .app { font-family: var(--font-display); font-weight: 700; font-size: 15px; }189.cov .node { color: var(--ink-3); font: 10.5px var(--font-mono); text-transform: uppercase; letter-spacing: 0.05em; }190.strip { display: flex; height: 10px; border-radius: 5px; overflow: hidden; gap: 2px; }191.strip span { min-width: 3px; }192.s-ok { background: var(--green); } .s-degraded { background: var(--amber); }193.s-broken { background: var(--danger); } .s-stale { background: var(--stale); }194.counts { display: flex; gap: 11px; margin-top: 8px; flex-wrap: wrap;195 font: 600 10.5px var(--font-mono); color: var(--ink-2); text-transform: uppercase; letter-spacing: 0.04em; }196.counts i { display: inline-block; width: 8px; height: 8px; border-radius: 2px; margin-right: 5px; }197198/* ---------- missions ---------- */199.table-wrap { overflow-x: auto; box-shadow: var(--shadow-off-soft); }200table { width: 100%; border-collapse: collapse; font-size: 13px; background: var(--surface); }201th { text-align: left; font: 700 10px var(--font-mono); text-transform: uppercase; letter-spacing: 0.08em;202 color: var(--ink-3); padding: 11px 12px; border-bottom: 1.5px solid var(--ink); background: var(--surface-2); }203td { padding: 10px 12px; border-bottom: 1px solid var(--line); }204tbody tr { cursor: pointer; transition: background 0.12s; }205tbody tr:hover { background: var(--lime-soft); }206.mono { font-family: var(--font-mono); font-size: 12px; }207.vbadge { font: 700 10px var(--font-mono); text-transform: uppercase; letter-spacing: 0.05em;208 padding: 3px 9px; border-radius: var(--r-pill); border: 1.5px solid currentColor; white-space: nowrap; }209.v-repare { color: var(--green); background: var(--green-soft); }210.v-echec, .v-inconnu, .v-erreur { color: var(--danger); background: var(--danger-soft); }211.v-site_source_mort { color: var(--ink-3); background: var(--surface-2); }212.v-rien_a_faire { color: var(--stale); background: var(--stale-soft); }213.v-running { color: var(--accent-deep); background: var(--lime); }214215/* ---------- footer ---------- */216.ka-footer { margin-top: 24px; background: var(--ink); color: #f5f3eebf; padding: 44px 0; font-size: 13px; }217.foot-in { max-width: 1440px; margin: 0 auto; padding: 0 clamp(16px, 4vw, 48px); display: grid; gap: 16px; }218.wordmark-foot, .wordmark-foot #foot-name { color: var(--paper); font-size: 30px; }219.wordmark-foot .ka { background: var(--lime); color: var(--ink); }220.notice { max-width: 640px; border-left: 2px solid var(--lime); padding-left: 16px; }221.notice b { color: var(--paper); }222.sites { display: flex; gap: 14px; flex-wrap: wrap; }223.sites a, .legal a { color: #f5f3eebf; text-decoration: none; }224.sites a:hover, .legal a:hover { color: var(--lime); text-decoration: underline; text-underline-offset: 4px; }225.legal { color: #f5f3ee73; }226227/* ---------- modal ---------- */228.modal { position: fixed; inset: 0; background: #14181480; display: grid; place-items: center; z-index: 900; padding: 16px; }229.modal[hidden] { display: none; }230.modal-box { width: min(880px, 94vw); max-height: 86vh; display: flex; flex-direction: column; box-shadow: var(--shadow-off); }231.modal-head { display: flex; justify-content: space-between; align-items: center; gap: 10px;232 padding: 13px 18px; border-bottom: 1.5px solid var(--ink); background: var(--surface-2); }233.modal-head h3 { font-family: var(--font-display); font-size: 16px; }234.modal-head button { background: var(--surface); border: 1.5px solid var(--ink); border-radius: var(--r-ctl);235 width: 32px; height: 32px; font-size: 14px; cursor: pointer; }236.modal-head button:hover { background: var(--lime); }237.modal-body { padding: 16px 18px; overflow-y: auto; font: 12.5px/1.6 var(--font-mono); display: grid; gap: 8px; }238.modal-body .meta { background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--r-ctl);239 padding: 10px 12px; color: var(--ink-2); white-space: pre-wrap; overflow-wrap: anywhere; }240.modal-body .meta b { color: var(--ink); }241242/* =============================================================================243 KA ÉDITORIAL v2 (2026-08-25) — aligné sur la refonte lou-ka / vrai-prix :244 typo géante, souligné « brush » SVG, tuiles et listes à filet (zéro boîte),245 l'écran encre du flux garde son ombre signature. Bloc volontairement en FIN246 de fichier : il surcharge la v1 sans toucher au markup (index/commander).247 ========================================================================== */248:root { --hairline: #14181424; --hairline-strong: #14181499; }249250/* .hl : la pastille lime tournée devient un souligné brush lime */251.hl { background: transparent; color: inherit; border-radius: 0; transform: none;252 position: relative; display: inline-block; padding: 0 0.06em; z-index: 0; }253.hl::after { content: ""; position: absolute; left: -3%; right: -3%; bottom: 0.05em; height: 0.34em;254 z-index: -1; transform: rotate(-0.6deg);255 background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 300 26' preserveAspectRatio='none'%3E%3Cpath d='M5 17 C 60 8, 118 21, 168 13 S 258 10, 295 15' fill='none' stroke='%23d9f26b' stroke-width='11' stroke-linecap='round' opacity='.9'/%3E%3C/svg%3E") no-repeat center / 100% 100%; }256257/* héros : typo géante, définition en colonne à filet (plus de carte tournée) */258.hero h1 { font-size: clamp(38px, 5.2vw, 72px); line-height: 1.02; letter-spacing: -0.045em; }259.cmd-hero h1 { font-size: clamp(36px, 5vw, 64px); line-height: 1.02; letter-spacing: -0.045em; }260.defcard, .defcard.card { background: transparent; border: 0; border-radius: 0; box-shadow: none;261 transform: none; border-left: 2px solid var(--ink); padding: 6px 0 6px 24px; }262263/* chips du héros → ligne de données vivantes (mono + filets) */264.hero-chips { gap: 0; row-gap: 10px; align-items: baseline; }265.hero-chips .chip { border: 0; border-radius: 0; background: transparent;266 padding: 0 14px 0 0; margin-right: 14px; border-right: 1px solid var(--hairline);267 font-size: 11.5px; font-weight: 500; letter-spacing: 0.02em; text-transform: none; color: var(--ink-2); }268.hero-chips .chip:last-child { border-right: 0; margin-right: 0; padding-right: 0; }269.hero-chips .chip-accent { background: transparent; color: var(--accent-deep); font-weight: 700;270 text-transform: uppercase; font-size: 10.5px; letter-spacing: 0.16em;271 border-right-color: var(--hairline-strong); }272@media (max-width: 640px) {273 .hero-chips { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; white-space: nowrap; }274 .hero-chips::-webkit-scrollbar { display: none; }275}276/* piège min-content : la ligne nowrap ne doit gonfler ni la colonne ni main */277main > *, .hero > *, .cols > * { min-width: 0; }278279/* cartes : hairline discrète — l'écran encre du flux garde son ombre dure */280.card { border: 1px solid var(--hairline-strong); box-shadow: none; }281.screen { box-shadow: var(--shadow-off); border-color: var(--ink); }282.pad { padding: 18px; }283284/* tuiles d'état : magazine à filet, zéro boîte */285.tiles { gap: 24px 30px; }286.tile { background: transparent; border: 0; border-top: 2px solid var(--ink);287 border-radius: 0; box-shadow: none; padding: 12px 2px 0; }288.tile .v { font: 700 34px/1.1 var(--font-display); letter-spacing: -0.03em; font-variant-numeric: tabular-nums; }289.tile.hot { background: transparent; border-top: 4px solid var(--lime); }290291/* incidents & couverture : lignes à filet */292.inc { background: transparent; border: 0; border-top: 1px solid var(--hairline); border-radius: 0; padding: 10px 0; }293.cov { background: transparent; border: 0; border-top: 1px solid var(--hairline); border-radius: 0; padding: 12px 0 0; }294295/* registre des missions : tableau éditorial */296.table-wrap { box-shadow: none; border: 0; border-top: 2px solid var(--ink); border-radius: 0; }297table { background: transparent; }298th { background: transparent; }299tbody tr:hover { background: var(--lime-soft); }300301/* commander : formulaire posé sur filet, plus de panneau lime */302.commander { background: transparent; border: 0; border-radius: 0; box-shadow: none;303 border-top: 2.5px solid var(--ink); }304.commander.card { border-top: 2.5px solid var(--ink); }305.cmd-form { padding-left: 0; padding-right: 0; }306.cmd-grid { padding-left: 0; padding-right: 0; }307308/* badges topbar : filets légers */309.gk-badge { border-width: 1px; background: transparent; }310.chip { border-width: 1px; border-color: var(--hairline-strong); background: transparent; }311312/* bouton primaire : fond lime + texte encre (plus de fond encre peu lisible) */313.btn-primary { background: var(--lime); color: var(--ink); }314.btn-primary:hover { background: var(--accent-deep); color: var(--lime); }315316/* territoire surveillé — provenance des emplacements (registre mld) et état des runners */317.cov-warn { color: var(--bad, #b42318); font-weight: 700; }318.cov-registry { grid-column: 1 / -1; padding: 8px 0 0; border-top: 1px dashed var(--hairline, var(--line)); }319.cov-registry .node { text-transform: none; letter-spacing: 0; }320.cov-changes { margin-top: 4px; color: var(--ink-3); font: 10.5px var(--font-mono); }321