/* ===== Base ===== */
:root{
  --bg:#0e1118;
  --panel:#161b26;
  --panel-2:#1d2432;
  --ink:#e8ecf3;
  --muted:#9aa6ba;
  --line:#2a3344;
  --accent:#ffcb2e;
  --accent-2:#4f8cff;
  --radius:14px;
  --card-w:360px;
  --card-h:504px;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  font-family:"Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif;
  background:radial-gradient(1200px 600px at 70% -10%,#1b2740 0%,var(--bg) 60%);
  color:var(--ink);
  line-height:1.5;
  min-height:100vh;
}
a{color:inherit;text-decoration:none}

/* ===== Header ===== */
.site-header{
  position:sticky;top:0;z-index:50;
  display:flex;align-items:center;justify-content:space-between;
  padding:14px 28px;
  background:rgba(14,17,24,.8);
  backdrop-filter:blur(10px);
  border-bottom:1px solid var(--line);
}
.brand{display:flex;align-items:center;gap:10px;font-weight:800;letter-spacing:.5px}
.brand-mark{color:var(--accent);font-size:20px}
.brand-name{font-size:18px}
.site-nav{display:flex;gap:22px}
.site-nav a{color:var(--muted);font-weight:600;padding:6px 2px;border-bottom:2px solid transparent}
.site-nav a.active,.site-nav a:hover{color:var(--ink);border-bottom-color:var(--accent)}

/* ===== Layout ===== */
.layout{
  display:grid;
  grid-template-columns:minmax(320px,460px) 1fr;
  gap:32px;
  max-width:1180px;margin:0 auto;padding:32px 24px;
  align-items:start;
}
.panel{
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:var(--radius);
  padding:24px;
}
.panel-title{margin:0 0 4px;font-size:24px}
.panel-sub{margin:0 0 20px;color:var(--muted);font-size:14px}

/* ===== Fields ===== */
.field-group{margin-bottom:18px}
.row{display:flex;gap:12px;margin-bottom:14px}
.field{flex:1;display:flex;flex-direction:column}
.field.small{flex:0 0 84px}
.field-label{font-size:12px;font-weight:700;color:var(--muted);margin-bottom:6px;text-transform:uppercase;letter-spacing:.6px}
.text,.select{
  width:100%;
  background:var(--panel-2);
  border:1px solid var(--line);
  color:var(--ink);
  border-radius:10px;
  padding:10px 12px;
  font-size:14px;
  outline:none;
  transition:border-color .15s,box-shadow .15s;
}
.text:focus,.select:focus{border-color:var(--accent-2);box-shadow:0 0 0 3px rgba(79,140,255,.18)}
.text.area{resize:vertical;min-height:56px;font-family:inherit}
.select{cursor:pointer}

/* ===== Generation picker (top of the form) ===== */
.gen-group{margin-bottom:18px}
.gen-picker{display:flex;align-items:center;gap:12px}
.gen-icon{
  width:58px;height:58px;flex:0 0 auto;border-radius:12px;object-fit:cover;
  background:var(--panel-2);border:1px solid var(--line);
  box-shadow:0 2px 8px rgba(0,0,0,.3);
}
.gen-picker .select{flex:1}
.gen-hint{margin:8px 0 0;font-size:12px;color:var(--muted)}

/* ===== Frame colour / thickness controls ===== */
.color-row{display:flex;align-items:center;gap:10px}
input[type="color"]{
  width:48px;height:38px;padding:3px;cursor:pointer;
  background:var(--panel-2);border:1px solid var(--line);border-radius:10px;
}
input[type="color"]::-webkit-color-swatch-wrapper{padding:0}
input[type="color"]::-webkit-color-swatch{border:none;border-radius:6px}
.hex{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;color:var(--muted)}
.thick-val{color:var(--accent);font-variant-numeric:tabular-nums}
.range{
  width:100%;height:38px;margin:0;cursor:pointer;
  accent-color:var(--accent);background:transparent;
}
.check-row{
  display:flex;align-items:center;gap:10px;margin:2px 0 14px;
  font-size:13px;color:var(--ink);cursor:pointer;
  background:var(--panel-2);border:1px solid var(--line);
  border-radius:10px;padding:10px 12px;
  transition:border-color .15s;
}
.check-row:hover{border-color:var(--accent)}
.check-row input[type="checkbox"]{width:16px;height:16px;accent-color:var(--accent);cursor:pointer}

/* ===== Dropzone ===== */
.dropzone{
  border:2px dashed var(--line);
  border-radius:12px;
  background:var(--panel-2);
  padding:22px;
  text-align:center;
  cursor:pointer;
  transition:border-color .15s,background .15s;
}
.dropzone:hover,.dropzone.drag{border-color:var(--accent);background:#20283a}
.dropzone-inner{display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--muted)}
.drop-icon{font-size:28px}

/* ===== Buttons ===== */
.btn{
  border:none;border-radius:10px;padding:11px 16px;font-size:14px;font-weight:700;
  cursor:pointer;transition:transform .08s,filter .15s,background .15s;
}
.btn:active{transform:translateY(1px)}
.btn.primary{background:var(--accent);color:#1a1400}
.btn.primary:hover{filter:brightness(1.06)}
.btn.accent{background:var(--accent-2);color:#fff}
.btn.accent:hover{filter:brightness(1.08)}
.btn.ghost{background:transparent;border:1px solid var(--line);color:var(--ink)}
.btn.ghost:hover{background:var(--panel-2)}
.btn.small{padding:7px 12px;font-size:12px;margin-top:8px}
.actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:8px}
.actions .btn{flex:1;min-width:120px}

/* ===== Attack editor ===== */
.attacks{display:flex;flex-direction:column;gap:12px}
.attack-card{
  background:var(--panel-2);border:1px solid var(--line);border-radius:10px;padding:12px;
}
.attack-card .row{margin-bottom:8px}
.attack-card .a-name{flex:2}
.attack-card .a-cost{flex:0 0 70px}
.attack-card .a-dmg{flex:0 0 70px}
.attack-card .a-desc{width:100%}
.attack-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
.attack-head .tag{font-size:11px;color:var(--muted);font-weight:700}
.rm-attack{background:none;border:none;color:#ff6b6b;cursor:pointer;font-size:12px;font-weight:700}

/* ===== Energy cost editor (retreat + attack) ===== */
.energy-wrap{display:flex;flex-direction:column}
.energy-editor{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.energy-sel{flex:0 0 auto;width:auto;min-width:118px;padding:8px 10px;font-size:13px}
.energy-btns{display:flex;gap:6px;flex:0 0 auto}
.energy-btn{
  width:32px;height:36px;border-radius:8px;border:1px solid var(--line);
  background:var(--panel-2);color:var(--ink);font-size:18px;font-weight:800;
  cursor:pointer;line-height:1;display:inline-flex;align-items:center;justify-content:center;
  transition:background .12s;
}
.energy-btn:hover:not(:disabled){background:var(--line)}
.energy-btn:disabled{opacity:.4;cursor:not-allowed}
.energy-empty{color:var(--muted);font-size:12px;font-style:italic}
.energy-row{align-items:center}
.energy-row .energy-label{margin:0;flex:0 0 auto}
.energy-row .energy-editor{flex:1}

/* ===== Preview ===== */
.preview-wrap{display:flex;justify-content:center}
.preview-sticky{position:sticky;top:90px;display:flex;align-items:flex-start;justify-content:center;gap:18px}

/* Zoom stage: reserves the scaled footprint so the rail sits beside the card
   and sticky positioning stays correct. The card itself is scaled via --zoom. */
.zoom-stage{
  --zoom:1;
  position:relative;
  width:calc(var(--card-w) * var(--zoom));
  height:calc(var(--card-h) * var(--zoom));
  flex:0 0 auto;
}
.zoom-stage > .card{
  transform:scale(var(--zoom));
  transform-origin:top left;
}

/* Vertical zoom rail (styled after the reference slider) */
.zoom-rail{
  flex:0 0 auto;
  display:flex;flex-direction:column;align-items:center;gap:10px;
  padding-top:6px;
  user-select:none;-webkit-user-select:none;
}
.zoom-icon{font-size:15px;line-height:1;color:var(--muted);position:relative;display:inline-block}
.zoom-plus,.zoom-minus{
  position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  font-size:11px;font-weight:800;color:var(--accent);
}
.zoom-track{
  position:relative;width:6px;height:300px;border-radius:999px;
  background:var(--line);cursor:pointer;touch-action:none;
}
.zoom-fill{
  position:absolute;left:0;right:0;bottom:0;border-radius:999px;
  background:linear-gradient(180deg,var(--accent-2),var(--accent));
  height:33.3%;
}
.zoom-thumb{
  position:absolute;left:50%;bottom:33.3%;
  width:22px;height:22px;border-radius:50%;
  transform:translate(-50%,50%);
  background:#fff;border:3px solid var(--accent-2);
  box-shadow:0 2px 6px rgba(0,0,0,.45);
  cursor:grab;outline:none;
}
.zoom-thumb:focus-visible{box-shadow:0 0 0 4px rgba(79,140,255,.4)}
.zoom-thumb.dragging{cursor:grabbing;border-color:var(--accent)}
.zoom-readout{font-size:12px;font-weight:700;color:var(--muted);font-variant-numeric:tabular-nums}

/* ===== CARD ===== */
/* Frame layout: thick coloured outer border. Colour/thickness are
   live-adjustable via CSS vars (--frame-color, --frame-w) set inline by
   the controls. */
.card{
  --frame-color:#a8d5a2;
  --frame-w:14px;
  width:var(--card-w);height:var(--card-h);
  border-radius:calc(10px + var(--frame-w) * .55);
  padding:14px;
  display:flex;flex-direction:column;
  position:relative;
  isolation:isolate; /* own stacking context so the -1 full-art bg stays above the card bg but below content */
  box-shadow: 0 20px 50px rgba(0,0,0,.5);
  overflow:visible; /* allow the stage pill to be dragged over the outer border */
  border:var(--frame-w) solid var(--frame-color);
  background:linear-gradient(160deg,#f6e7a8,#e7cf78);
  color:#20242c;
}
/* frames (presets supply the default border colour; the picker overrides it) */
.card.frame-classic{--frame-color:#d9b64a;background:linear-gradient(160deg,#f6e7a8,#e7cf78)}
.card.frame-gold{--frame-color:#caa63a;background:linear-gradient(160deg,#ffe9a8,#e3b84e)}
.card.frame-dark{--frame-color:#3a3f4b;background:linear-gradient(160deg,#2b3140,#171b24);color:#e8ecf3}
.card.frame-holo{--frame-color:#b9a24a;background:linear-gradient(135deg,#ffe9a8,#cfe0ff 40%,#ffd6f2 70%,#ffe9a8)}
.card.frame-holo::after{
  content:"";position:absolute;inset:0;pointer-events:none;border-radius:inherit;
  background:linear-gradient(115deg,transparent 30%,rgba(255,255,255,.55) 45%,transparent 60%);
  mix-blend-mode:overlay;
}
.card.frame-dark .p-name,.card.frame-dark .hp-val{color:#fff}

/* ===== Full Art mode ===== */
/* Image bleeds edge-to-edge behind everything; text blocks get translucent
   frosted panels so they stay readable, like official full-art cards. */
.full-art-bg{
  position:absolute;inset:0;z-index:-1;overflow:hidden;border-radius:inherit;
  background:#0c0f15;
}
.full-art-bg img{width:100%;height:100%;object-fit:cover;display:block}
.full-art-empty{
  width:100%;height:100%;display:flex;align-items:center;justify-content:center;
  color:#8b95a8;font-size:14px;
}
/* NOTE: do NOT make intermediate containers (.card-top/.card-bottom/...) positioned
   here — dragged children resolve their absolute coords against the card, and a
   positioned collapsed container would fling them far outside it. The bg uses
   z-index:-1 inside the card's isolated stacking context instead. */
.card.full-art .art-frame{display:none}
.card.full-art .attacks-block{flex:0 0 auto;margin-top:auto;justify-content:flex-start}
.card.full-art .card-bottom{margin-top:8px}
/* Outlined text directly over the art (like the reference card) —
   the stage pill and stat bar keep their light backgrounds. */
.card.full-art .p-name,
.card.full-art .hp-block,
.card.full-art .p-atk-name,
.card.full-art .p-dmg{
  color:#fff;
  text-shadow:
    1px 1px 0 rgba(15,10,12,.75), -1px 1px 0 rgba(15,10,12,.75),
    1px -1px 0 rgba(15,10,12,.75), -1px -1px 0 rgba(15,10,12,.75),
    0 0 10px rgba(0,0,0,.45);
}
.card.full-art .p-atk-desc{color:#f2f2f2;text-shadow:0 1px 3px rgba(0,0,0,.85)}
.card.full-art .flavor{color:#f2f2f2;text-shadow:0 1px 3px rgba(0,0,0,.85)}
.card.full-art .foot-left{color:#e8ecf3;text-shadow:0 1px 3px rgba(0,0,0,.85)}
.card.full-art .card-number{color:#fff}

/* type accent colors (--tc-soft = ~28% tint toward white; precomputed because
   html2canvas 1.4.1 cannot parse color-mix()/color() computed values).
   Covers every type across all generations; "colorless" kept as a legacy alias
   for "normal" so older saved cards still colour correctly. */
.card.type-fire{--tc:#e8623c;--tc-soft:#f9d3c8}
.card.type-water{--tc:#3f8fe0;--tc-soft:#c9e0f6}
.card.type-grass{--tc:#4caf50;--tc-soft:#cde9ce}
.card.type-electric{--tc:#f2c53d;--tc-soft:#fbefc9}
.card.type-fighting{--tc:#c1502e;--tc-soft:#eed2c4}
.card.type-psychic{--tc:#b34fa8;--tc-soft:#eacee7}
.card.type-normal{--tc:#9aa0a6;--tc-soft:#e3e5e8}
.card.type-steel{--tc:#7d8b99;--tc-soft:#d8e0e8}
.card.type-dark{--tc:#5b5b72;--tc-soft:#d6d6e2}
.card.type-dragon{--tc:#c99a2e;--tc-soft:#f0e3c4}
.card.type-fairy{--tc:#e07bbf;--tc-soft:#f8dcef}
/* legacy alias */
.card.type-colorless{--tc:#9aa0a6;--tc-soft:#e3e5e8}

/* Top bar: stage pill (left) · name (centre) · HP + type badge (right) */
.card-top{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.p-stage{
  flex:0 0 auto;
  background:var(--tc-soft);
  color:#232830;
  padding:3px 12px;border-radius:999px;
  font-size:11px;font-weight:800;letter-spacing:1px;
  box-shadow:0 1px 4px rgba(0,0,0,.2);
}
/* With a generation stage icon: the icon is the pill background (full pill +
   trailing bar), and the live stage label is overlaid on the pill region. */
.p-stage.has-ico{
  position:relative;
  display:inline-flex;align-items:center;
  padding:0;background:none;box-shadow:none;
  height:22px;
}
.p-stage.has-ico .stage-ico{
  height:100%;width:auto;display:block;
}
.p-stage.has-ico .stage-text{
  position:absolute;left:0;top:50%;transform:translateY(-50%);
  display:inline-flex;align-items:center;
  padding:2px 9px;border-radius:999px;
  background:transparent;
  color:#232830;
  font-size:11px;font-weight:800;letter-spacing:1px;
  white-space:nowrap;
}
.p-name{flex:1;min-width:0;text-align:center;font-size:22px;font-weight:800;letter-spacing:.3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hp-block{flex:0 0 auto;display:flex;align-items:center;gap:4px;color:var(--tc)}
.hp-label{font-size:12px;font-weight:800}
.hp-val{font-size:26px;font-weight:900;line-height:1}
.type-badge{
  width:26px;height:26px;border-radius:50%;overflow:hidden;
  display:inline-flex;align-items:center;justify-content:center;
  background:var(--tc);font-size:14px;
  box-shadow:0 2px 6px rgba(0,0,0,.25);
}

.art-frame{
  flex:0 0 auto;height:190px;border-radius:10px;overflow:hidden;
  border:2px solid var(--tc);
  background:#0c0f15;
  display:flex;align-items:center;justify-content:center;
}
.art-placeholder{color:#5b6577;font-size:14px}
.art-frame img{width:100%;height:100%;object-fit:cover;display:block}

.attacks-block{flex:1;display:flex;flex-direction:column;justify-content:center;gap:6px;padding:6px 2px;min-height:0}
/* Attack row: cost badge (left) · name/desc (centre) · damage (right) */
.p-attack{
  display:flex;align-items:center;gap:10px;
  padding:8px 4px;border-radius:8px;
}
.p-cost{display:flex;gap:3px;flex:0 0 auto}
.cost-dot{
  width:18px;height:18px;border-radius:50%;overflow:hidden;
  background:#fdfbf2;border:1.5px solid rgba(0,0,0,.18);
  display:inline-flex;align-items:center;justify-content:center;
  font-size:10px;color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.3)
}
.cost-dot.none{background:#9aa6ba;border-color:transparent}
/* energy / type icons loaded from the generation's icons/ folder. The icons are
   full circular badges, so they fill their container (object-fit:cover keeps the
   circle intact; border-radius keeps the emoji-fallback path tidy). */
.type-ico{width:15px;height:15px;display:inline-block;vertical-align:-3px;object-fit:cover;border-radius:50%}
.cost-dot .type-ico{width:100%;height:100%;vertical-align:middle;border-radius:50%}
.type-badge .type-ico{width:100%;height:100%;vertical-align:middle;border-radius:50%}
.p-atk-main{flex:1;min-width:0;text-align:center}
.p-atk-name{font-weight:800;font-size:14px}
.p-atk-desc{font-size:11px;color:var(--muted);line-height:1.3}
.card.frame-dark .p-atk-desc{color:#aab4c6}
.p-dmg{font-size:18px;font-weight:900;flex:0 0 auto}

/* Bottom: pill stat bar + footer (illus · ball · number · rarity | flavour) */
.card-bottom{margin-top:6px}
.stat-bar{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  background:var(--tc-soft);
  border-radius:999px;padding:7px 16px;
  box-shadow:0 1px 4px rgba(0,0,0,.18);
}
.stat{display:flex;align-items:center;gap:5px;font-size:12px;color:#232830}
.stat b{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;color:#4a5260}
.bar-div{width:1px;height:16px;background:rgba(0,0,0,.25);flex:0 0 auto}
.foot-row{display:flex;justify-content:space-between;align-items:flex-end;gap:10px;margin-top:7px;padding:0 2px}
.foot-left{display:flex;align-items:center;gap:6px;font-size:10px;color:var(--muted)}
.illus{font-size:9px}
.ball-mark{
  width:14px;height:14px;border-radius:50%;flex:0 0 auto;position:relative;
  border:1.5px solid #2b2f38;
  background:linear-gradient(180deg,#e8564f 0 42%,#fff 42% 58%,#f2f2f2 58% 100%);
}
.ball-mark::after{
  content:"";position:absolute;left:50%;top:50%;width:4px;height:4px;
  border-radius:50%;background:#fff;border:1.5px solid #2b2f38;
  transform:translate(-50%,-50%);
}
.card-number{font-weight:800;font-size:11px;color:#232830}
.rarity-mark{font-size:12px;color:var(--tc);font-weight:800}
.flavor{font-size:10px;font-style:italic;color:var(--muted);margin:0;max-width:58%;text-align:right;line-height:1.3;min-height:14px}

/* ===== Drag to reposition ===== */
.card{user-select:none;-webkit-user-select:none}
.draggable{cursor:move;touch-action:none;border-radius:8px}
.draggable:hover{outline:2px dashed rgba(79,140,255,.65);outline-offset:2px}
.card .draggable.dragging{outline:2px solid var(--accent-2);z-index:10;opacity:.96;cursor:grabbing}
.drag-hint{margin:0 0 12px;font-size:12px;color:var(--muted)}
/* full-art image is pannable */
.full-art-bg{cursor:move;touch-action:none}
.full-art-bg img.dragging{outline:2px solid var(--accent-2);outline-offset:-6px}

/* Stage pill & Element badge are click-to-edit */
.p-stage,.type-badge{cursor:pointer}
.p-stage:hover,.type-badge:hover{filter:brightness(1.05)}

/* ===== Inline editor popovers ===== */
.card-popover{
  position:fixed;z-index:1000;display:none;
  background:var(--panel-2);border:1px solid var(--line);border-radius:12px;
  padding:8px;box-shadow:0 14px 34px rgba(0,0,0,.55);
}
.card-popover.stage-menu{flex-direction:column;gap:4px;min-width:128px}
.card-popover.element-menu{flex-direction:row;gap:8px;align-items:center}
.pop-opt{
  background:transparent;border:none;color:var(--ink);font-weight:700;
  padding:8px 12px;border-radius:8px;cursor:pointer;text-align:left;font-size:13px;
  letter-spacing:.5px;
}
.pop-opt:hover{background:var(--line)}
.pop-opt.active{background:var(--accent);color:#1a1400}
/* Stage-menu options show the generation's stage icon next to the label. */
.pop-opt{display:flex;align-items:center;gap:10px}
.pop-stage-ico{flex:0 0 auto;display:inline-flex;align-items:center;height:18px}
.pop-stage-ico .stage-ico{height:18px;width:auto;display:block}
.pop-stage-label{white-space:nowrap}
.pop-el{
  width:42px;height:42px;border-radius:50%;border:2px solid transparent;
  background:#fdfbf2;display:inline-flex;align-items:center;justify-content:center;
  cursor:pointer;transition:border-color .12s,transform .08s;
}
.pop-el .type-ico{width:34px;height:34px;object-fit:cover;border-radius:50%}
.pop-el:hover{border-color:var(--accent-2);transform:translateY(-1px)}
.pop-el.active{border-color:var(--accent)}

/* ===== Inline text editing ===== */
.p-name,.hp-val,.p-atk-name,.p-atk-desc,.p-dmg,.flavor,#pIllus,.card-number{cursor:text}
.card [contenteditable="true"]{
  outline:2px solid var(--accent-2);outline-offset:2px;border-radius:4px;
  background:rgba(79,140,255,.12);cursor:text;
  white-space:pre-wrap;word-break:break-word;
}

/* ===== Gallery ===== */
.gallery-section{max-width:1180px;margin:0 auto;padding:24px}
.gallery-grid{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:20px;margin-top:18px;
}
.g-item{position:relative;border-radius:12px;overflow:hidden;border:1px solid var(--line);background:var(--panel)}
.g-item .g-card{transform:scale(.6);transform-origin:top left;width:var(--card-w);height:var(--card-h)}
.g-item .g-holder{width:100%;height:302px;overflow:hidden;display:flex;align-items:center;justify-content:center}
.g-actions{display:flex;gap:8px;padding:10px;border-top:1px solid var(--line)}
.g-empty{color:var(--muted);font-size:14px;padding:20px 0}

/* ===== Footer ===== */
.site-footer{max-width:1180px;margin:0 auto;padding:30px 24px;color:var(--muted);font-size:13px;text-align:center;border-top:1px solid var(--line);margin-top:20px}

/* ===== Responsive ===== */
@media (max-width:900px){
  .layout{grid-template-columns:1fr}
  .preview-sticky{position:static}
  .preview-wrap{order:-1;margin-bottom:10px}
}
