:root{
  --bg:#08080F;
  --ink:#F4F4F8;
  --muted:#AEACC4;
  --faint:#76748C;
  --violet:#8B5CF6;
  --indigo:#6366F1;
  --violet-rgb:139,92,246;
  --accent-pale:#C9B6FF;
  --evo-stroke:#9D7BFF;
  --grad:linear-gradient(135deg,var(--evo-stroke),var(--indigo));
  --glass:rgba(255,255,255,.045);
  --glass-2:rgba(255,255,255,.07);
  --glass-border:rgba(255,255,255,.10);
  --accent-dim:rgba(var(--violet-rgb),.16);
  --danger:#FF6B8A;
  --teal:#3FD3C6;
  --sans:'Inter',-apple-system,Segoe UI,sans-serif;
  --disp:'Space Grotesk','Inter',sans-serif;
  --ease:cubic-bezier(.22,1,.36,1);
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{
  background:var(--bg);color:var(--ink);font-family:var(--sans);font-size:14px;-webkit-font-smoothing:antialiased;
  position:relative;overflow-x:hidden;
}
body::before{
  content:"";position:fixed;inset:0;z-index:0;pointer-events:none;
  background:
    radial-gradient(60% 55% at 15% 8%,rgba(var(--violet-rgb),.28),transparent 60%),
    radial-gradient(50% 50% at 92% 20%,rgba(var(--violet-rgb),.20),transparent 62%),
    radial-gradient(55% 60% at 80% 100%,rgba(var(--violet-rgb),.14),transparent 60%),
    radial-gradient(45% 50% at 30% 95%,rgba(var(--violet-rgb),.10),transparent 60%);
}
#app{display:flex;min-height:100vh;position:relative;z-index:1}
::selection{background:var(--violet);color:#fff}
::-webkit-scrollbar{width:11px;height:11px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:rgba(255,255,255,.11);border-radius:8px;border:3px solid transparent;background-clip:padding-box}
::-webkit-scrollbar-thumb:hover{background:rgba(160,140,255,.35);background-clip:padding-box}

/* ---------- rail ---------- */
#rail{width:236px;flex-shrink:0;display:flex;flex-direction:column;position:sticky;top:0;height:100vh;padding:22px 14px;
  background:rgba(11,11,19,.66);
  border-right:1px solid var(--glass-border)}
.brand{display:flex;align-items:center;justify-content:center;padding:6px 8px 26px}
/* hue-rotate/saturate run BEFORE drop-shadow, so the mark follows the accent while the glow keeps
   its own explicit accent color. Vars are set by applyAccent(); the defaults keep the PNG as-is. */
.brand-mark{width:40px;height:40px;flex-shrink:0;border-radius:12px;object-fit:cover;filter:hue-rotate(var(--logo-hue,0deg)) saturate(var(--logo-sat,1)) drop-shadow(0 4px 18px rgba(var(--violet-rgb),.5));transition:filter .25s var(--ease)}
#nav{display:flex;flex-direction:column;gap:3px;flex:1;margin-top:6px}
.nav-item{display:flex;align-items:center;gap:12px;padding:10px 12px;border-radius:11px;color:var(--muted);text-decoration:none;font-size:13.5px;font-weight:500;transition:color .18s,background .18s;border:1px solid transparent}
.nav-item .ic{width:18px;height:18px;stroke:currentColor;stroke-width:1.6;fill:none;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
.nav-item:hover{color:var(--ink);background:var(--glass)}
.nav-item.active{color:#fff;background:var(--grad);border-color:rgba(255,255,255,.14);box-shadow:0 6px 22px rgba(var(--violet-rgb),.45)}
.nav-item.active .ic{stroke-width:1.9}
.rail-foot{padding-top:14px;border-top:1px solid var(--glass-border);display:flex;flex-direction:column;gap:8px}
.rail-settings{display:flex;align-items:center;gap:12px;padding:10px 12px;border-radius:11px;color:var(--muted);background:transparent;border:1px solid transparent;font-family:var(--sans);font-size:13.5px;font-weight:500;cursor:pointer;transition:color .18s,background .18s;width:100%;text-align:left}
.rail-settings .ic{width:18px;height:18px;stroke:currentColor;stroke-width:1.6;fill:none;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
.rail-settings:hover{color:var(--ink);background:var(--glass)}
.swatch-row{display:flex;flex-wrap:wrap;gap:10px;margin:10px 0 18px}
.swatch{width:36px;height:36px;border-radius:50%;border:2px solid transparent;cursor:pointer;overflow:hidden;transition:transform .12s,border-color .12s;padding:0}
.swatch:hover{transform:scale(1.1)}
.swatch.on{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,.25)}
.custom-color-row{display:flex;align-items:center;gap:12px;margin-top:4px}
.custom-color-row input[type="color"]{width:44px;height:36px;padding:0;border:1px solid var(--glass-border);border-radius:9px;background:transparent;cursor:pointer}
.lvl-chip{display:flex;align-items:center;gap:10px;padding:10px 12px;background:var(--glass);border:1px solid var(--glass-border);border-radius:13px;text-decoration:none;transition:border-color .15s,background .15s}
.lvl-chip:hover{background:var(--glass-2);border-color:rgba(var(--violet-rgb),.35)}
.lvl-chip-badge{width:30px;height:30px;flex-shrink:0;border-radius:9px;background:var(--grad);display:flex;align-items:center;justify-content:center;font-family:var(--disp);font-weight:700;font-size:14px;color:#fff;box-shadow:0 3px 12px rgba(var(--violet-rgb),.5)}
.lvl-chip-info{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}
.lvl-chip-title{display:flex;align-items:baseline;justify-content:space-between;gap:6px}
.lvl-chip-title b{font-size:12.5px;color:var(--ink);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lvl-chip-lvl{font-size:10px;color:var(--faint);white-space:nowrap}
.lvl-chip-bar{display:block;height:4px;background:rgba(255,255,255,.08);border-radius:20px;overflow:hidden}
.lvl-chip-fill{display:block;height:100%;width:0;background:var(--grad);border-radius:20px;transition:width .8s var(--ease)}

/* ---------- main ---------- */
#main{flex:1;min-width:0;padding:30px 38px 48px}
#view{max-width:1180px;margin:0 auto}
.topline{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:26px}
.greet{font-family:var(--disp);font-weight:600;font-size:30px;letter-spacing:-.02em;line-height:1}
.date{color:var(--muted);font-size:13.5px;margin-top:8px;text-transform:capitalize}
.score{display:flex;align-items:center;gap:13px}
.score-ring{width:60px;height:60px;transform:rotate(-90deg);filter:drop-shadow(0 0 6px rgba(var(--violet-rgb),.55))}
.ring-bg{fill:none;stroke:rgba(255,255,255,.10);stroke-width:5}
.ring-fg{fill:none;stroke:var(--violet);stroke-width:5;stroke-linecap:round;stroke-dasharray:188.5;stroke-dashoffset:188.5;transition:stroke-dashoffset 1.1s var(--ease)}
.score-num{display:flex;flex-direction:column;line-height:1}
.score-num b{font-family:var(--disp);font-size:26px;font-weight:700}
.score-num span{font-size:11px;color:var(--faint);margin-top:3px}
.micro-lbl{font-size:10.5px;letter-spacing:1.3px;text-transform:uppercase;color:var(--faint);font-weight:500}
.xp-badge{display:inline-block;font-family:var(--disp);font-size:10.5px;font-weight:600;color:var(--accent-pale);background:var(--accent-dim);border:1px solid rgba(var(--violet-rgb),.3);border-radius:20px;padding:2px 8px;white-space:nowrap;vertical-align:middle}
.overdue-badge{display:inline-block;font-family:var(--disp);font-size:10.5px;font-weight:600;color:var(--danger);background:rgba(255,107,138,.12);border:1px solid rgba(255,107,138,.35);border-radius:20px;padding:2px 8px;white-space:nowrap;vertical-align:middle}
.xp-badge.neg{color:var(--danger);background:rgba(255,107,138,.12);border-color:rgba(255,107,138,.35)}
.task.overdue .tt{color:var(--danger)}

/* glass panel base */
.panel,.focus-hero{
  background:rgba(23,21,36,.44);
  border:1px solid var(--glass-border);border-radius:20px;
  box-shadow:0 10px 40px rgba(0,0,0,.38),inset 0 1px 0 rgba(255,255,255,.08);
}

/* ---------- focus hero ---------- */
.focus-hero{display:flex;justify-content:space-between;align-items:center;gap:24px;padding:26px 30px;margin-bottom:20px;position:relative;overflow:hidden}
.focus-hero::after{content:"";position:absolute;width:260px;height:260px;right:-40px;top:-90px;background:radial-gradient(circle,rgba(var(--violet-rgb),.35),transparent 70%);pointer-events:none}
.fh-left{display:flex;flex-direction:column;gap:12px;position:relative}
.timer{font-family:var(--disp);font-weight:700;font-size:66px;letter-spacing:-.03em;line-height:.9;font-variant-numeric:tabular-nums;text-shadow:0 0 30px rgba(var(--violet-rgb),.35)}
/* DM envoyés — compact : compteur du jour + bande 7 j cliquable (voir & corriger l'historique) */
.dm-row{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin:2px 0 10px}
.dm-num{display:flex;align-items:baseline;gap:7px}
.dm-num b{font-family:var(--disp);font-size:26px;font-weight:700;letter-spacing:-.02em;line-height:1;font-variant-numeric:tabular-nums}
.dm-num span{font-size:11px;color:var(--faint)}
.dm-actions{display:flex;gap:6px}
.dm-actions .dm-q{font-family:var(--disp);font-variant-numeric:tabular-nums;padding:5px 9px;font-size:12px}
.dm-week{display:grid;grid-template-columns:repeat(7,1fr);gap:5px}
.dm-cell{display:flex;flex-direction:column;align-items:center;gap:2px;padding:6px 0 5px;border-radius:9px;border:1.4px solid rgba(255,255,255,.12);background:transparent;cursor:pointer;transition:all .15s var(--ease)}
.dm-cell:hover{border-color:var(--muted)}
.dm-cell b{font-family:var(--disp);font-size:13px;font-weight:600;font-variant-numeric:tabular-nums;color:var(--faint)}
.dm-cell span{font-size:9px;color:var(--faint);opacity:.7}
.dm-cell.has b{color:var(--ink)}
.dm-cell.has{border-color:rgba(var(--violet-rgb),.4);background:var(--accent-dim)}
.dm-cell.now{border-color:var(--accent-pale)}
.fh-live{display:flex;align-items:center;gap:8px}
.fh-actions{display:flex;gap:10px;margin-top:4px}
.btn-accent{background:var(--grad);color:#fff;border:none;border-radius:11px;padding:11px 24px;font-family:var(--sans);font-size:13.5px;font-weight:600;cursor:pointer;transition:transform .12s var(--ease),filter .15s,box-shadow .2s;box-shadow:0 6px 22px rgba(var(--violet-rgb),.5)}
.btn-accent:hover{filter:brightness(1.08);box-shadow:0 8px 30px rgba(var(--violet-rgb),.65)}
.btn-accent:active{transform:scale(.97)}
.btn-ghost{background:var(--glass);color:var(--muted);border:1px solid var(--glass-border);border-radius:11px;padding:11px 18px;font-family:var(--sans);font-size:13.5px;font-weight:500;cursor:pointer;transition:color .15s,border-color .15s}
.btn-ghost:hover{color:var(--ink);border-color:rgba(255,255,255,.2)}
.fh-right{display:flex;gap:34px;padding-right:6px;position:relative}
.fh-stat{display:flex;flex-direction:column;gap:8px}
.fh-stat b{font-family:var(--disp);font-size:22px;font-weight:600}

/* ---------- grid ---------- */
.grid{display:grid;grid-template-columns:1.55fr 1fr;gap:20px;margin-bottom:20px}
.col-right{display:flex;flex-direction:column;gap:20px}
.panel{padding:22px 24px}
.panel-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}
.panel-head h2{font-family:var(--disp);font-size:15px;font-weight:600;letter-spacing:-.01em}
.count{font-family:var(--disp);font-size:15px;color:var(--muted)}
.count .sep{color:var(--faint);margin:0 2px}

/* tasks */
.tasklist{list-style:none;display:flex;flex-direction:column}
.task{display:flex;align-items:center;gap:13px;padding:12px 2px;border-bottom:1px solid rgba(255,255,255,.06);cursor:pointer}
.task:last-child{border-bottom:none}
.check{width:19px;height:19px;border-radius:7px;border:1.7px solid rgba(255,255,255,.2);flex-shrink:0;overflow:hidden;transition:all .15s var(--ease);position:relative}
.task:hover .check{border-color:var(--muted)}
.task.done .check{background:var(--grad);border-color:transparent;box-shadow:0 0 12px rgba(var(--violet-rgb),.6)}
.task.done .check::after{content:"";position:absolute;left:5px;top:1.5px;width:5px;height:9px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(43deg)}
.tt{flex:1;font-size:14px;transition:color .15s}
.task.done .tt{color:var(--faint);text-decoration:line-through;text-decoration-color:rgba(255,255,255,.18)}
.prio{font-size:11px;color:var(--faint);padding:3px 9px;border:1px solid var(--glass-border);border-radius:20px}
.prio.p1{color:var(--accent-pale);border-color:rgba(var(--violet-rgb),.4);background:var(--accent-dim)}

/* habits */
.habitlist{list-style:none;display:flex;flex-direction:column;gap:3px}
.hab{display:flex;align-items:center;gap:12px;padding:10px 2px;cursor:pointer}
.hb-dot{width:20px;height:20px;border-radius:50%;border:1.7px solid rgba(255,255,255,.2);flex-shrink:0;overflow:hidden;transition:all .15s var(--ease)}
.hab.on .hb-dot{background:var(--grad);border-color:transparent;box-shadow:0 0 0 4px var(--accent-dim),0 0 14px rgba(var(--violet-rgb),.55)}
.hb-name{flex:1;font-size:13.5px;color:var(--muted)}
.hab.on .hb-name{color:var(--ink)}
.hb-streak{font-family:var(--disp);font-size:13px;color:var(--faint)}
.hab.on .hb-streak{color:var(--accent-pale)}

/* goal */
.goal-tag{font-family:var(--disp);font-size:12px;color:var(--accent-pale);background:var(--accent-dim);padding:3px 10px;border-radius:20px;font-weight:600}
.goal-num{display:flex;align-items:baseline;gap:8px;margin-bottom:14px}
.goal-num b{font-family:var(--disp);font-size:34px;font-weight:700;letter-spacing:-.02em}
.goal-num span{color:var(--muted);font-size:13px}
.goal-bar{height:8px;background:rgba(255,255,255,.08);border-radius:20px;overflow:hidden}
.goal-fill{display:block;height:100%;width:0;background:var(--grad);border-radius:20px;box-shadow:0 0 14px rgba(var(--violet-rgb),.7);transition:width 1.2s var(--ease)}
.goal-meta{color:var(--faint);font-size:12px;margin-top:10px}

/* week */
.bars{display:flex;align-items:flex-end;gap:14px;height:132px;padding-top:8px}
.bar-col{flex:1;display:flex;flex-direction:column;align-items:center;gap:10px;height:100%;justify-content:flex-end}
.bar{width:100%;max-width:46px;height:var(--h);min-height:6px;background:var(--glass-2);border:1px solid var(--glass-border);border-radius:9px 9px 5px 5px;transition:height .9s var(--ease)}
.bar.today{background:var(--grad);border-color:transparent;box-shadow:0 0 18px rgba(var(--violet-rgb),.55)}
.bar-d{font-size:11px;color:var(--faint)}

/* week — task vs habit % (two bars per day) */
.wk-legend{display:flex;gap:16px}
.wk-legend .lg{display:flex;align-items:center;gap:7px;font-size:11.5px;color:var(--muted)}
.wk-legend .lg::before{content:"";width:9px;height:9px;border-radius:3px;flex-shrink:0}
.wk-legend .lg.task::before{background:var(--violet)}
.wk-legend .lg.hab::before{background:var(--teal)}
.wk-bars{display:flex;align-items:flex-end;gap:12px;padding-top:16px}
.wk-day{flex:1;display:flex;flex-direction:column;align-items:center;gap:10px}
.wk-pair{display:flex;align-items:flex-end;justify-content:center;gap:5px;height:118px;width:100%}
.wk-bar{width:15px;height:var(--h);min-height:3px;border-radius:6px 6px 3px 3px;transition:height .9s var(--ease)}
.wk-bar.task{background:var(--grad)}
.wk-bar.hab{background:linear-gradient(135deg,#63E6D8,#2FB6C7)}
.wk-bar.task.now{box-shadow:0 0 14px rgba(var(--violet-rgb),.5)}
.wk-bar.hab.now{box-shadow:0 0 14px rgba(63,211,198,.45)}
.wk-d{font-size:11px;color:var(--faint)}

/* ---------- shared bits ---------- */
.soft{color:var(--faint);font-size:13.5px}
.lnk{color:var(--accent-pale);text-decoration:none;border-bottom:1px solid rgba(201,182,255,.35)}
.add-inline{margin-top:12px;background:transparent;border:1px dashed var(--glass-border);color:var(--muted);border-radius:11px;padding:10px 14px;font-family:var(--sans);font-size:13px;cursor:pointer;width:100%;transition:all .15s}
.add-inline span{color:var(--accent-pale);font-weight:600;margin-right:4px}
.add-inline:hover{border-color:rgba(var(--violet-rgb),.5);color:var(--ink)}
.btn-accent.sm,.btn-ghost.sm{padding:7px 14px;font-size:12.5px;border-radius:9px}
.mini{background:transparent;border:none;cursor:pointer;padding:5px;border-radius:8px;color:var(--faint);transition:color .15s,background .15s;display:inline-flex}
.mini:hover{color:var(--ink);background:var(--glass)}
.mic{width:17px;height:17px;stroke:currentColor;stroke-width:1.6;fill:none;stroke-linecap:round;stroke-linejoin:round}

/* segmented control */
.segbar{display:inline-flex;gap:3px;background:var(--glass);border:1px solid var(--glass-border);border-radius:12px;padding:4px;margin-bottom:18px}
.seg{background:transparent;border:none;color:var(--muted);font-family:var(--sans);font-size:13px;font-weight:500;padding:7px 16px;border-radius:9px;cursor:pointer;transition:all .15s}
.seg:hover{color:var(--ink)}
.seg.on{background:var(--grad);color:#fff;box-shadow:0 4px 14px rgba(var(--violet-rgb),.4)}

/* tasks — big list rows */
.tasklist.big .task{padding:14px 4px}
.row-x{display:inline-flex;gap:2px;margin-left:4px;opacity:0;transition:opacity .15s}
.task:hover .row-x{opacity:1}

/* habit grid */
.hgrid-head{display:grid;grid-template-columns:190px repeat(7,34px) 64px;gap:8px;align-items:center;padding:0 4px 12px;border-bottom:1px solid var(--glass-border);margin-bottom:6px}
.hg-d{text-align:center;font-size:11px;color:var(--faint)}
.hg-d.now{color:var(--accent-pale);font-weight:600}
.hgrid-row{display:grid;grid-template-columns:190px repeat(7,34px) 64px auto;gap:8px;align-items:center;padding:11px 4px;border-bottom:1px solid rgba(255,255,255,.05)}
.hgrid-row:last-child{border-bottom:none}
.hg-name{font-size:13.5px;color:var(--ink);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}
.hg-cell{width:26px;height:26px;justify-self:center;border-radius:8px;border:1.6px solid rgba(255,255,255,.16);background:transparent;cursor:pointer;overflow:hidden;transition:all .15s var(--ease)}
.hg-cell:hover{border-color:var(--muted)}
.hg-cell.on{background:var(--grad);border-color:transparent;box-shadow:0 0 5px rgba(var(--violet-rgb),.4)}
.hg-cell.future{opacity:.28;cursor:not-allowed}
.hg-cell.future:hover{border-color:rgba(255,255,255,.16)}
.hg-cell.auto{cursor:default}
.hg-cell.auto:hover{border-color:rgba(255,255,255,.16)}
.hgrid-row.auto .hg-name{color:var(--muted)}
.hg-auto-ic{width:13px;height:13px;stroke:var(--accent-pale);stroke-width:2;fill:none;vertical-align:-2px;margin-right:4px;flex-shrink:0}
.hab.auto{cursor:default}
.hg-streak{font-family:var(--disp);font-size:16px;color:var(--accent-pale);text-align:right;display:flex;flex-direction:column;line-height:1;align-items:flex-end}
.hg-streak em{font-style:normal;font-size:9.5px;letter-spacing:.6px;text-transform:uppercase;color:var(--faint);margin-top:3px;font-family:var(--sans)}
.hg-del{opacity:0;transition:opacity .15s}
.hgrid-row:hover .hg-del{opacity:1}

/* goals */
.goalgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px}
.goalcard-act{display:flex;gap:8px;align-items:center;margin-top:18px}
.goalcard-act .mini{margin-left:auto}
.goalcard-act .mini:last-child{margin-left:0}
.goalcard.pinned{border-color:rgba(var(--violet-rgb),.45);box-shadow:0 10px 40px rgba(0,0,0,.38),0 0 0 1px rgba(var(--violet-rgb),.22),inset 0 1px 0 rgba(255,255,255,.08)}
.pin-badge{font-size:10px;letter-spacing:.6px;text-transform:uppercase;color:var(--accent-pale);background:var(--accent-dim);border-radius:20px;padding:3px 9px;margin-left:9px;vertical-align:middle;font-family:var(--sans);font-weight:600}
.pin-btn.on{color:var(--accent-pale)}
.pin-btn .mic path{transition:fill .15s}
.pin-btn.on .mic path{fill:var(--accent-pale);stroke:none}

/* soon */
.soon{text-align:center;padding:48px 30px;color:var(--muted)}
.soon-badge{display:inline-block;font-family:var(--disp);font-size:12px;letter-spacing:1px;text-transform:uppercase;color:var(--accent-pale);background:var(--accent-dim);padding:5px 14px;border-radius:20px;margin-bottom:14px}

/* modal */
#modal-root .overlay{position:fixed;inset:0;background:rgba(4,4,10,.66);display:flex;align-items:flex-start;justify-content:center;padding:9vh 16px;z-index:100;overflow:auto}
.sheet{width:100%;max-width:460px;background:rgba(20,18,30,.96);border:1px solid var(--glass-border);border-radius:20px;padding:26px;box-shadow:0 30px 90px rgba(0,0,0,.6),inset 0 1px 0 rgba(255,255,255,.07)}
.sheet h2{font-family:var(--disp);font-size:19px;font-weight:600;margin-bottom:18px}
label.f{display:block;font-size:11px;letter-spacing:.6px;text-transform:uppercase;color:var(--faint);margin:14px 0 6px;font-weight:500}
label.f:first-of-type{margin-top:0}
.sheet input{width:100%;background:rgba(255,255,255,.05);border:1px solid var(--glass-border);color:var(--ink);border-radius:11px;padding:11px 13px;font-family:var(--sans);font-size:14px;outline:none;transition:border-color .15s}
.sheet input:focus{border-color:var(--violet);box-shadow:0 0 0 3px var(--accent-dim)}
.frow{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.pickrow{display:flex;gap:8px}
.pick{flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;background:rgba(255,255,255,.05);border:1px solid var(--glass-border);color:var(--muted);border-radius:11px;padding:10px;font-family:var(--sans);font-size:13px;cursor:pointer;transition:all .15s}
.pick.on{background:var(--accent-dim);border-color:rgba(var(--violet-rgb),.5);color:var(--accent-pale)}
.pick em{font-style:normal;font-size:10px;color:var(--faint)}
.pick.on em{color:var(--accent-pale);opacity:.8}
.catrow{display:flex;flex-wrap:wrap;gap:7px}
.catchip{background:rgba(255,255,255,.05);border:1px solid var(--glass-border);color:var(--muted);border-radius:20px;padding:6px 13px;font-family:var(--sans);font-size:12.5px;cursor:pointer;transition:all .15s;white-space:nowrap}
.catchip:hover{color:var(--ink);border-color:rgba(255,255,255,.2)}
.catchip.on{background:var(--accent-dim);border-color:rgba(var(--violet-rgb),.55);color:var(--accent-pale)}
.catchip.newcat{border-style:dashed;color:var(--faint)}
.catchip.newcat:hover{color:var(--accent-pale);border-color:rgba(var(--violet-rgb),.5)}
.catnew{background:rgba(255,255,255,.06);border:1px solid var(--violet);border-radius:20px;color:var(--ink);padding:6px 13px;font-family:var(--sans);font-size:12.5px;outline:none;width:150px}
.catfilter{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:16px}
.tcat{font-size:11px;color:var(--muted);background:rgba(255,255,255,.055);border:1px solid var(--glass-border);border-radius:20px;padding:2px 9px;white-space:nowrap}
.modal-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:22px}

/* toast */
#toast{position:fixed;bottom:26px;left:50%;transform:translateX(-50%) translateY(12px);background:rgba(24,20,36,.96);border:1px solid rgba(var(--violet-rgb),.5);color:var(--ink);font-size:13.5px;padding:11px 20px;border-radius:12px;box-shadow:0 14px 40px rgba(0,0,0,.5),0 0 24px rgba(var(--violet-rgb),.25);opacity:0;pointer-events:none;transition:all .22s var(--ease);z-index:200}
#toast.show{opacity:1;transform:translateX(-50%) translateY(0)}

/* goal reward */
.reward{margin-top:14px;display:flex;align-items:center;gap:9px;font-size:13px;padding:11px 13px;border-radius:12px;line-height:1.3}
.reward .rw-ic{width:16px;height:16px;flex-shrink:0;stroke:currentColor;stroke-width:1.7;fill:none;stroke-linecap:round;stroke-linejoin:round}
.reward.locked{color:var(--muted);background:rgba(255,255,255,.035);border:1px solid var(--glass-border)}
.reward.unlocked{color:#fff;background:var(--grad);box-shadow:0 8px 24px rgba(var(--violet-rgb),.5)}
.reward.unlocked .rw-ic path{fill:rgba(255,255,255,.9);stroke:none}
.reward b{font-weight:600}
.reward.sm{margin-top:12px;padding:9px 11px;font-size:12px}


/* planning — weekly planner */
.wknav{display:flex;gap:8px;align-items:center}
.wknav .btn-ghost.sm{min-width:36px;text-align:center}
.planner{display:grid;grid-template-columns:repeat(7,minmax(124px,1fr));gap:9px;overflow-x:auto;padding-bottom:6px}
.pcol{background:rgba(23,21,36,.44);border:1px solid var(--glass-border);border-radius:14px;padding:12px 9px;display:flex;flex-direction:column;min-height:230px}
.pcol.now{border-color:rgba(var(--violet-rgb),.5);box-shadow:0 0 0 1px rgba(var(--violet-rgb),.22),inset 0 1px 0 rgba(255,255,255,.06)}
.pcol-head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:12px;padding:0 3px}
.pd-dow{font-size:10.5px;letter-spacing:.6px;text-transform:uppercase;color:var(--faint)}
.pcol.now .pd-dow{color:var(--accent-pale)}
.pd-num{font-family:var(--disp);font-size:15px;font-weight:600;color:var(--muted)}
.pcol.now .pd-num{color:var(--ink)}
.pcol-body{flex:1;display:flex;flex-direction:column;gap:6px;border-radius:9px;transition:background .15s,box-shadow .15s}
.pcol-body.drag-over{background:rgba(var(--violet-rgb),.1);box-shadow:inset 0 0 0 1.5px rgba(var(--violet-rgb),.5)}
.pcol-empty{color:var(--faint);font-size:12px;text-align:center;padding:10px 0;opacity:.4}
.ptask{display:flex;align-items:center;gap:8px;padding:7px 8px;background:rgba(255,255,255,.035);border:1px solid var(--glass-border);border-radius:9px;transition:background .15s,opacity .15s;cursor:grab}
.ptask:hover{background:rgba(255,255,255,.06)}
.ptask.dragging{opacity:.35;cursor:grabbing}
.ptask .check{width:16px;height:16px;border-radius:5px;cursor:pointer}
.ptask.done .check{background:var(--grad);border-color:transparent}
.ptask.done .check::after{content:"";position:absolute;left:4px;top:1px;width:4px;height:8px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(43deg)}
.ptt{font-size:12.5px;line-height:1.3;flex:1;min-width:0;color:var(--ink);cursor:pointer;overflow-wrap:break-word}
.ptask.done .ptt{color:var(--faint);text-decoration:line-through;text-decoration-color:rgba(255,255,255,.2)}
.pcol-add{margin-top:8px;background:transparent;border:1px dashed var(--glass-border);color:var(--faint);border-radius:9px;padding:6px;font-size:15px;line-height:1;cursor:pointer;transition:all .15s}
.pcol-add:hover{border-color:rgba(var(--violet-rgb),.5);color:var(--accent-pale)}

/* ---------- analytics ---------- */
.an-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:20px}
.an-stat{padding:18px 20px}
.an-stat b{font-family:var(--disp);font-size:26px;font-weight:700;display:block;letter-spacing:-.01em}
.an-stat span{font-size:11.5px;color:var(--faint);margin-top:6px;display:block}

.evo-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(270px,1fr));gap:16px}
.evo-card{padding:18px 20px 14px}
.evo-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:6px}
.evo-name{font-size:13.5px;font-weight:600;color:var(--ink)}
.evo-now{font-family:var(--disp);font-size:15px;color:var(--accent-pale);font-weight:600}
.evo-svg{width:100%;height:70px;display:block}
.evo-area{fill:rgba(var(--violet-rgb),.22);stroke:none}
.evo-line{fill:none;stroke:var(--evo-stroke);stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}
.evo-pt{fill:#fff;stroke:var(--evo-stroke);stroke-width:1.5;opacity:0;cursor:pointer;transition:opacity .12s}
.evo-pt:hover{opacity:1}
.evo-foot{margin-top:8px;font-size:11.5px;color:var(--faint)}
.evo-svg.global{height:160px}
.evo-svg.global .evo-line{stroke-width:2.8}
.evo-svg.global .evo-pt{r:5}

.wkr-bars{display:flex;align-items:flex-end;gap:12px;height:150px;padding-top:22px}
.wkr-day{flex:1;display:flex;flex-direction:column;align-items:center;gap:8px;height:100%;justify-content:flex-end}
.wkr-val{font-family:var(--disp);font-size:11.5px;color:var(--muted)}
.wkr-bar{width:100%;max-width:38px;height:var(--h);min-height:4px;background:linear-gradient(135deg,#63E6D8,#2FB6C7);border-radius:8px 8px 4px 4px;transition:height .9s var(--ease);box-shadow:0 0 14px rgba(63,211,198,.3)}
.wkr-d{font-size:11px;color:var(--faint)}

.rank-list{display:flex;flex-direction:column;gap:12px}
.rank-row{display:flex;align-items:center;gap:12px}
.rank-name{width:44%;flex-shrink:0;font-size:13px;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rank-track{flex:1;height:10px;background:rgba(255,255,255,.07);border-radius:20px;overflow:hidden}
.rank-fill{display:block;height:100%;background:var(--grad);border-radius:20px;transition:width 1s var(--ease);box-shadow:0 0 10px rgba(var(--violet-rgb),.5)}
.rank-pct{width:38px;text-align:right;font-family:var(--disp);font-size:13px;color:var(--muted);flex-shrink:0}

.heatmap-wrap{overflow-x:auto;padding-bottom:4px}
.heatmap{display:inline-flex;gap:4px}
.hm-week{display:flex;flex-direction:column;gap:4px}
.hm-cell{width:13px;height:13px;border-radius:3px;background:rgba(255,255,255,.05);display:block}
.hm-cell.empty{visibility:hidden}
.hm-cell.nodata{background:rgba(255,255,255,.03)}
.hm-cell.lvl0{background:rgba(255,255,255,.09)}
.hm-cell.lvl1{background:rgba(var(--violet-rgb),.24)}
.hm-cell.lvl2{background:rgba(var(--violet-rgb),.48)}
.hm-cell.lvl3{background:rgba(var(--violet-rgb),.74)}
.hm-cell.lvl4{background:var(--grad);box-shadow:0 0 8px rgba(var(--violet-rgb),.6)}
.hm-cell.clickable{cursor:pointer;transition:transform .1s,box-shadow .1s}
.hm-cell.clickable:hover{transform:scale(1.25);box-shadow:0 0 0 2px rgba(255,255,255,.35)}
.heatmap-legend{display:flex;align-items:center;gap:6px;margin-top:12px;font-size:11px;color:var(--faint)}
.heatmap-legend .hm-cell{width:11px;height:11px}
.dd-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin:14px 0 18px}
.dd-stat{background:var(--glass);border:1px solid var(--glass-border);border-radius:10px;padding:10px 12px;text-align:center}
.dd-stat b{font-family:var(--disp);font-size:19px;font-weight:700;display:block}
.dd-stat span{font-size:11px;color:var(--faint)}

/* ---------- progression / gamification ---------- */
.lvl-hero{display:flex;align-items:center;gap:26px;padding:24px 28px;margin-bottom:20px}
.lvl-badge{width:84px;height:84px;border-radius:22px;background:var(--grad);display:flex;flex-direction:column;align-items:center;justify-content:center;flex-shrink:0;box-shadow:0 10px 30px rgba(var(--violet-rgb),.55),inset 0 1px 0 rgba(255,255,255,.25)}
.lvl-num{font-family:var(--disp);font-size:32px;font-weight:700;color:#fff;line-height:1}
.lvl-lbl{font-size:10px;letter-spacing:1px;text-transform:uppercase;color:rgba(255,255,255,.75);margin-top:3px}
.lvl-info{flex:1;display:flex;flex-direction:column;gap:11px;min-width:0}
.lvl-xp-row{display:flex;justify-content:space-between;align-items:baseline;font-size:13.5px;color:var(--ink);gap:12px}

.next-ach{display:flex;gap:18px;align-items:center;padding:20px 24px;margin-bottom:20px}
.next-ach.sm{padding:14px 20px}
.next-ach.sm .next-ach-name{margin-bottom:7px;font-size:13.5px}
.next-ach.sm .next-ach-ic{width:38px;height:38px}
.next-ach-ic{width:44px;height:44px;flex-shrink:0;border-radius:13px;background:var(--accent-dim);border:1px solid rgba(var(--violet-rgb),.35);display:flex;align-items:center;justify-content:center}
.next-ach-ic .ach-ic{width:22px;height:22px;stroke:var(--accent-pale);stroke-width:1.7;fill:none;stroke-linecap:round;stroke-linejoin:round}
.next-ach-body{flex:1;min-width:0}
.next-ach-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:4px}
.next-ach-pct{font-family:var(--disp);font-size:13px;color:var(--accent-pale);font-weight:600}
.next-ach-name{font-size:15px;font-weight:600;color:var(--ink);margin-bottom:10px}
.next-ach-bar{height:7px}
.next-ach-sub{font-size:11.5px;color:var(--faint);margin-top:8px}

.ach-branch{margin-bottom:16px;overflow-x:auto}
.ach-chain{display:flex;align-items:flex-start;flex-wrap:wrap;gap:0;padding-top:4px}
.ach-node{width:118px;display:flex;flex-direction:column;align-items:center;text-align:center;gap:7px;flex-shrink:0}
.ach-icon{width:48px;height:48px;border-radius:14px;background:rgba(255,255,255,.045);border:1.6px solid var(--glass-border);display:flex;align-items:center;justify-content:center;transition:all .2s var(--ease)}
.ach-ic{width:22px;height:22px;stroke:var(--faint);stroke-width:1.6;fill:none;stroke-linecap:round;stroke-linejoin:round;transition:stroke .2s}
.ach-node.unlocked .ach-icon{background:var(--grad);border-color:transparent;box-shadow:0 0 16px rgba(var(--violet-rgb),.6)}
.ach-node.unlocked .ach-ic{stroke:#fff}
.ach-name{font-size:12px;font-weight:600;color:var(--muted);line-height:1.25}
.ach-node.unlocked .ach-name{color:var(--ink)}
.ach-sub{font-size:10.5px;color:var(--faint)}
.ach-node.unlocked .ach-sub{color:var(--accent-pale)}
.ach-connector{width:26px;height:2px;background:rgba(255,255,255,.1);margin-top:23px;flex-shrink:0;transition:background .3s}
.ach-connector.lit{background:var(--grad);box-shadow:0 0 8px rgba(var(--violet-rgb),.5)}

/* ---------- completion feedback ---------- */
@keyframes completePop{
  0%{transform:scale(1);box-shadow:0 0 0 0 rgba(var(--violet-rgb),.65),0 0 0 0 rgba(var(--violet-rgb),.4)}
  35%{transform:scale(1.85);box-shadow:0 0 0 14px rgba(var(--violet-rgb),0),0 0 0 4px rgba(var(--violet-rgb),.15)}
  100%{transform:scale(1);box-shadow:0 0 0 0 rgba(var(--violet-rgb),0),0 0 0 0 rgba(var(--violet-rgb),0)}
}
.check.pop,.hg-cell.pop,.hb-dot.pop{animation:completePop .6s var(--ease);position:relative;z-index:2}
#burst-layer{position:fixed;inset:0;pointer-events:none;z-index:998}
.burst-piece{position:absolute;width:7px;height:7px;border-radius:50%;transform:translate(-50%,-50%);animation:burstFly .65s cubic-bezier(.2,.7,.3,1) forwards;box-shadow:0 0 6px currentColor}
@keyframes burstFly{
  0%{transform:translate(-50%,-50%) scale(1);opacity:1}
  100%{transform:translate(calc(-50% + var(--dx)),calc(-50% + var(--dy))) scale(.25);opacity:0}
}
@keyframes rowFlash{
  0%{background:rgba(var(--violet-rgb),.22)}
  100%{background:transparent}
}
li.row-flash,.ptask.row-flash{animation:rowFlash .65s ease-out}
.task-reward{display:inline-flex;align-items:center;justify-content:center;width:15px;height:15px;color:#FFC38A;flex-shrink:0}
.task-reward svg{width:100%;height:100%;stroke:none;fill:currentColor}

/* big goal-completion celebration */
.goal-celebrate{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;z-index:999;pointer-events:none}
.confetti-piece{position:absolute;top:50%;left:50%;width:8px;height:14px;border-radius:2px;opacity:0;animation:confettiBurst 1.3s ease-out forwards;animation-delay:var(--delay)}
@keyframes confettiBurst{
  0%{transform:translate(-50%,-50%) rotate(0deg);opacity:1}
  100%{transform:translate(calc(-50% + var(--dx)),calc(-50% + var(--dy))) rotate(560deg);opacity:0}
}
.goal-celebrate-msg{position:relative;text-align:center;padding:32px 44px;border-radius:22px;background:rgba(18,16,30,.88);border:1px solid rgba(var(--violet-rgb),.4);box-shadow:0 20px 70px rgba(0,0,0,.55),0 0 80px rgba(var(--violet-rgb),.35);backdrop-filter:blur(6px);animation:celebrateIn .5s var(--ease)}
@keyframes celebrateIn{0%{transform:scale(.7);opacity:0}60%{transform:scale(1.05);opacity:1}100%{transform:scale(1);opacity:1}}
.goal-celebrate-title{font-family:var(--disp);font-size:22px;font-weight:700;color:#fff;letter-spacing:.2px}
.goal-celebrate-name{margin-top:8px;font-size:15px;color:var(--accent-pale)}
.goal-celebrate-reward{margin-top:14px;font-size:13px;color:var(--muted);padding-top:14px;border-top:1px solid var(--glass-border)}

/* ---------- Journal ---------- */
.jl-nocap{text-transform:none}
.jl-back{color:var(--accent-pale);cursor:pointer;border-bottom:1px solid rgba(201,182,255,.35)}
.jl-editor{padding:22px 24px}
.jl-moodrow{display:flex;flex-direction:column;gap:10px;margin-bottom:16px}
.jl-moods{display:flex;gap:8px;flex-wrap:wrap}
.jl-mood{flex:1;min-width:74px;display:flex;flex-direction:column;align-items:center;gap:5px;background:rgba(255,255,255,.04);border:1.5px solid var(--glass-border);border-radius:13px;padding:11px 6px;cursor:pointer;transition:all .15s var(--ease)}
.jl-mood .e{font-size:23px;line-height:1;filter:grayscale(.35);transition:filter .15s}
.jl-mood .l{font-size:11px;color:var(--faint);text-transform:uppercase;letter-spacing:.04em}
.jl-mood:hover{border-color:var(--muted)}
.jl-mood:hover .e{filter:grayscale(0)}
.jl-mood.on{border-color:var(--mc);background:color-mix(in srgb,var(--mc) 16%,transparent)}
.jl-mood.on .e{filter:grayscale(0)}
.jl-mood.on .l{color:var(--mc)}
.jl-prompts{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:12px}
.jl-plabel{font-size:12px;color:var(--faint)}
.jl-chip{background:rgba(255,255,255,.05);border:1px solid var(--glass-border);color:var(--muted);border-radius:20px;padding:6px 12px;font-family:var(--sans);font-size:12.5px;cursor:pointer;transition:all .15s}
.jl-chip:hover{color:var(--accent-pale);border-color:rgba(var(--violet-rgb),.5);background:var(--accent-dim)}
.jl-text{width:100%;min-height:180px;resize:vertical;background:rgba(255,255,255,.04);border:1px solid var(--glass-border);color:var(--ink);border-radius:13px;padding:14px 15px;font-family:var(--sans);font-size:14.5px;line-height:1.65;outline:none;transition:border-color .15s}
.jl-text:focus{border-color:var(--violet);box-shadow:0 0 0 3px var(--accent-dim)}
.jl-foot{display:flex;justify-content:flex-end;margin-top:8px;min-height:16px}
.jl-stat{font-size:11.5px;color:var(--faint)}
/* bande 30 jours */
.jl-strip{display:grid;grid-template-columns:repeat(15,1fr);gap:7px}
.jl-cell{display:flex;flex-direction:column;align-items:center;gap:5px;background:transparent;border:none;cursor:pointer;padding:4px 0;border-radius:9px;transition:background .15s}
.jl-cell:hover{background:rgba(255,255,255,.05)}
.jl-cell .dot{width:20px;height:20px;border-radius:7px;border:1.5px solid rgba(255,255,255,.14);background:transparent;transition:all .15s}
.jl-cell.has .dot{border-color:transparent}
.jl-cell .dn{font-size:10px;color:var(--faint);font-variant-numeric:tabular-nums}
.jl-cell.today .dn{color:var(--accent-pale);font-weight:600}
.jl-cell.sel .dot{box-shadow:0 0 0 2px var(--bg),0 0 0 3.5px var(--accent-pale)}
@media (max-width:720px){.jl-strip{grid-template-columns:repeat(10,1fr)}}
/* entrées récentes */
.jl-item{display:flex;gap:13px;padding:13px 2px;border-bottom:1px solid rgba(255,255,255,.06);cursor:pointer;transition:background .15s;border-radius:8px}
.jl-item:last-child{border-bottom:none}
.jl-item:hover{background:rgba(255,255,255,.03)}
.jl-item-mood{font-size:20px;line-height:1.2;flex-shrink:0;width:24px;text-align:center}
.jl-item-body{min-width:0;flex:1}
.jl-item-date{font-size:13px;color:var(--ink);font-weight:500}
.jl-item-prev{font-size:12.5px;color:var(--muted);margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.jl-item-prev.soft{color:var(--faint);font-style:italic}

@media (prefers-reduced-motion:reduce){*{transition:none!important}}
