/* =========================================================
   CONSOLIDATED CSS (no inline styles in index.html)
   Order:
   1) legacy styles.css (base components)
   2) former inline <style> block (mock UI + layout) -> wins
   ========================================================= */

:root{
    --ebay-icon-color: #ffffff; /* dark/default */
    --bg: #0f1115;
    --panel: #151a22;
    --panel2: #0f141c;
    --text: #e7e9ee;
    --muted: #a6adbb;
    --line: rgba(255,255,255,.08);
    --chip: rgba(255,255,255,.08);
    --shadow: 0 10px 30px rgba(0,0,0,.35);
    --radius: 18px;
    --radius2: 14px;
    --pad: 14px;
    --font: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji","Segoe UI Emoji";
}


body[data-theme="light"],
html[data-theme="light"]{
    --ebay-icon-color: #000000;
    --bg: #f6f7fb;
    --panel: #ffffff;
    --panel2: #fbfcff;
    --text: #0f1115;
    --muted: #5a6476;
    --line: rgba(15,17,21,.10);
    --chip: rgba(15,17,21,.06);
    --shadow: 0 10px 30px rgba(0,0,0,.12);
}

/* Soft = light, gentle */
body[data-theme="soft"],
html[data-theme="soft"]{
    --ebay-icon-color: #000000;
    --bg: #f2f4f8;
    --panel: #ffffff;
    --panel2: #f8fafc;
    --text: #111827;
    --muted: #5b6476;
    --line: rgba(17,24,39,.10);
    --chip: rgba(17,24,39,.06);
    --shadow: 0 10px 30px rgba(17,24,39,.10);
}

/* Light Purple (lavender) */
body[data-theme="purple_light"],
html[data-theme="purple_light"]{
    --ebay-icon-color: #7c3aed;
    --bg: #f2ebff;
    --panel: #ffffff;
    --panel2: #f7f0ff;
    --text: #15111f;
    --muted: #5f5a72;
    --line: rgba(70, 45, 140, .16);
    --chip: rgba(130, 95, 235, .12);
    --shadow: 0 10px 30px rgba(70, 45, 140, .14);
}

/* Ensure native form controls (especially <select>) render with the correct theme.
   Without this, some browsers can show a light dropdown popup with light text,
   making it look like the dropdown is "broken" or empty. */
body[data-theme="dark"],
html[data-theme="dark"]{
    --ebay-icon-color: #ffffff; color-scheme: dark; }

body[data-theme="light"],
html[data-theme="light"],
body[data-theme="soft"],
html[data-theme="soft"],
body[data-theme="purple_light"],
html[data-theme="purple_light"]{ color-scheme: light; }

*{ box-sizing:border-box; }
html,body{ height:100%; }
body{
    margin:0;
    font-family: var(--font);
    background: var(--bg);
    color: var(--text);
}

/* Bigger app */
.app{ max-width: 1900px; margin: 0 auto; padding: 16px; }

header{
    /*display:flex;*/
    justify-content:space-between;
    align-items:center;
    gap: 14px;
    padding: 10px 4px 18px;
}
.brand{ display:flex; gap:12px; align-items:center; }
.logo{
    width: 44px; height: 44px; border-radius: 14px;
    background: linear-gradient(140deg, rgba(255,255,255,.15), rgba(255,255,255,.02));
    border: 1px solid var(--line);
    box-shadow: var(--shadow);
}
h1{ margin:0; font-size: 18px; }
header p{ margin: 3px 0 0; color: var(--muted); font-size: 13px; }

.header-actions{ display:flex; gap:10px; flex-wrap:wrap; align-items:center; }

/* Bigger controls panel */
/* One-column layout */
main{
    display:block;
    width:100%;
}

.panel{
    background: var(--panel);
    border: 1px solid var(--line);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
    overflow:hidden;
    margin: 0 0 14px;
}
.panel-header{
    display:flex; justify-content:space-between; align-items:center;
    padding: 14px 16px;
    border-bottom: 1px solid var(--line);
    background: linear-gradient(180deg, rgba(255,255,255,.03), transparent);
}
.panel-header h2{ margin:0; font-size: 16px; }
.meta{ color: var(--muted); font-size: 12px; }

.panel-body{ padding: 14px; display:flex; flex-direction:column; gap: 12px; }

.section{
    background: var(--panel2);
    border: 1px solid var(--line);
    border-radius: var(--radius2);
    padding: 12px;
}
.section h3{
    margin:0 0 10px;
    display:flex;
    align-items:center;
    gap: 10px;
    font-size: 14px;
}

.hint{ color: var(--muted); font-size: 12px; margin-top: 8px; }
.kbd{
    display:inline-block;
    padding: 2px 8px;
    border-radius: 999px;
    border: 1px solid var(--line);
    background: var(--chip);
    font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
    font-size: 12px;
}
.badge{
    display:inline-flex;
    align-items:center;
    padding: 2px 8px;
    border-radius: 999px;
    border: 1px solid var(--line);
    background: var(--chip);
    font-size: 12px;
    color: var(--muted);
}

.btn{
    border: 1px solid var(--line);
    background: rgba(255,255,255,.04);
    color: var(--text);
    padding: 8px 12px;
    border-radius: 12px;
    cursor:pointer;
    font-weight: 600;
}
.btn:hover{ filter: brightness(1.08); }
.btn.primary{ background: rgba(255,255,255,.10); }
.btn.danger{ background: rgba(255,60,60,.14); border-color: rgba(255,60,60,.28); }

.mini-btn{
    border: 1px solid var(--line);
    background: rgba(255,255,255,.05);
    color: var(--text);
    padding: 6px 10px;
    border-radius: 12px;
    cursor:pointer;
    font-weight: 650;
    font-size: 12px;
}
.mini-btn:hover{ filter: brightness(1.08); }
.mini-btn.danger{ background: rgba(255,60,60,.14); border-color: rgba(255,60,60,.28); }

.pill{
    display:flex;
    gap: 10px;
    align-items:center;
    padding: 8px 10px;
    border: 1px solid var(--line);
    border-radius: 999px;
    background: var(--chip);
}
.pill label{ font-size: 12px; color: var(--muted); }

/* NEW: pill-style search input */
.pill-input{
    flex: 1 1 280px;
    max-width: 520px;
    padding: 10px 12px;
    border-radius: 999px;
    border: 1px solid var(--line);
    background: rgba(255,255,255,.03);
    color: var(--text);
    outline: none;
}
.pill-input::placeholder{ color: var(--muted); }

.select-wrap{
    display:inline-flex;
    border: 1px solid var(--line);
    border-radius: 12px;
    overflow:hidden;
    background: rgba(255,255,255,.04);
}
select{
    border:0;
    background: transparent;
    color: var(--text);
    padding: 8px 10px;
    outline:none;
}

input[type="text"], input[type="number"], input[type="file"]{
    width:100%;
    padding: 10px 10px;
    border-radius: 12px;
    border: 1px solid var(--line);
    background: rgba(255,255,255,.03);
    color: var(--text);
    outline:none;
}

/* Match selects inside .field to other inputs (e.g., Manual Entry "Select Sheet") */
.field select{
    width:100%;
    padding: 10px 10px;
    border-radius: 12px;
    border: 1px solid var(--line);
    background: rgba(255,255,255,.03);
    color: var(--text);
    outline:none;

    /* Keep native dropdown behavior */
    appearance: auto;
    -webkit-appearance: menulist;
    pointer-events: auto;
    cursor: pointer;
    position: relative;
    z-index: 1;
}
/* Improve option legibility in dark themes */
.field select option{
    background: var(--panel);
    color: var(--text);
}
input[type="range"]{ width:100%; }
.chk{ transform: scale(1.05); }

.toolbar{
    display:flex;
    gap: 10px;
    flex-wrap:wrap;
    align-items:center;
    justify-content:space-between;
}
.field{ display:flex; flex-direction:column; gap:6px; }
.field label{ font-size: 12px; color: var(--muted); }

/* Step 2 — keep equal-width flex columns consistent after mobile preview updates */
.step2EqualCols{
    display:flex;
    align-items:flex-end;
    gap:16px;
    flex-wrap:wrap;
}
.step2EqualCols > .field{
    flex:1 1 0;
    min-width:280px;
}
.step2EqualCols > .field select,
.step2EqualCols > .field .select-wrap{
    width:100%;
}
.step2EqualCols > .step2ActionsField .row{
    width:100%;
    justify-content:flex-start;
}
@media (max-width: 640px){
    .step2EqualCols > .field{
        flex:1 1 100%;
        min-width:0;
    }
}

.grid2{ display:grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.grid3{ display:grid; grid-template-columns: 1fr 160px 160px; gap: 10px; }
@media (max-width: 520px){
    .grid2, .grid3{ grid-template-columns: 1fr; }
}

.dropzone.dragover{
    outline: 2px solid rgba(255,255,255,.18);
    outline-offset: 2px;
}
body[data-theme="dark"] .dropzone.dragover-ok,
html[data-theme="dark"] .dropzone.dragover-ok{
    border-color: rgba(190, 120, 255, .98);
    box-shadow: 0 0 0 2px rgba(190, 120, 255, .35);
}

/* NEW: valid file hover (dark purple border) */
.dropzone.dragover-ok{
    border-color: rgba(70, 45, 140, .95);
    box-shadow: 0 0 0 2px rgba(70, 45, 140, .25);
}

/* NEW: invalid file hover (red border) */
.dropzone.dragover-bad{
    border-color: rgba(255, 60, 60, .95);
    box-shadow: 0 0 0 2px rgba(255, 60, 60, .22);
}

.dropzone{
    border: 2px dashed var(--line);
    border-radius: var(--radius2);
    padding: 12px;
    background: rgba(255,255,255,.02);
    cursor: pointer;
}
.dropzone.dragover{
    outline: 2px solid rgba(255,255,255,.18);
    outline-offset: 2px;
}

/* Keep the green "loaded" state */
.dropzone.loaded{
    border-color: rgba(60, 220, 120, .55);
    background: rgba(60, 220, 120, .07);
}
.dropzone.loaded .badge{
    border-color: rgba(60, 220, 120, .35);
    background: rgba(60, 220, 120, .08);
    color: rgba(180, 255, 210, .95);
}

.fileInputHidden{
    position: absolute;
    left: -9999px;
    width: 1px;
    height: 1px;
    opacity: 0;
    pointer-events: none;
}


.dz-head{ display:flex; justify-content:space-between; align-items:center; gap: 10px; }
.dz-actions{ display:flex; gap: 8px; flex-wrap:wrap; }
.fileline{ display:none; margin-top: 8px; align-items:center; justify-content:space-between; gap:8px; }
.filename{ font-weight:700; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

.sheetlist{ display:flex; flex-direction:column; gap: 8px; margin-top: 8px; }

/* URL Builder: column pick + drag order */
.colPick{
    display:flex;
    align-items:center;
    gap: 10px;
    padding: 8px 10px;
    border-radius: 12px;
    border: 1px solid var(--line);
    background: rgba(255,255,255,.03);
}
.colPick span{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

.colOrder{ margin-top: 10px; }
.colOrderLabel{ font-size: 12px; color: var(--muted); margin-bottom: 6px; }
.colOrderList{ display:flex; flex-wrap:wrap; gap: 8px; }
.colOrderItem{
    display:inline-flex;
    align-items:center;
    gap: 6px;
    padding: 6px 10px;
    border-radius: 999px;
    border: 1px solid var(--line);
    background: rgba(255,255,255,.06);
    font-size: 12px;
    cursor: grab;
    user-select:none;
}
.colOrderItem.dragging{ opacity: .55; cursor: grabbing; }
.colOrderItem.dragover{ outline: 2px solid rgba(255,255,255,.18); }

/* Unified Sheets section (Workbook + Manual) */
.sheet-selection{ margin-bottom: 12px; }
.manual-entry{ margin-bottom: 12px; }
.subhead{
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap: 10px;
    flex-wrap:wrap;
    margin-top: 6px;
}
.subhead-title{ font-weight: 800; }
.subhead-actions{ display:flex; gap:8px; flex-wrap:wrap; }
.subdivider{
    height: 1px;
    background: var(--line);
    margin: 10px 0;
    opacity: .9;
}
.sheet{
    display:flex;
    justify-content:space-between;
    align-items:center;
    gap: 10px;
    padding: 10px;
    border-radius: 14px;
    border: 1px solid var(--line);
    background: rgba(255,255,255,.03);
}
.sheet .left{ display:flex; align-items:center; gap: 10px; min-width:0; }
.sheet .name{ font-weight: 700; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sheet .count{ color: var(--muted); font-size: 12px; }

/* Bigger preview area */
.preview-wrap{ display:flex; flex-direction:column; min-height: 860px; }

.preview-toolbar{
    display:flex;
    justify-content:space-between;
    gap: 10px;
    padding: 10px 12px;
    border-bottom: 1px solid var(--line);
    flex-wrap:wrap;
}
.tag{
    display:inline-flex;
    border: 1px solid var(--line);
    background: var(--chip);
    color: var(--muted);
    border-radius: 999px;
    padding: 4px 10px;
    font-size: 12px;
    gap: 6px;
    align-items:center;
}

.canvas-area{ padding: 12px; overflow:auto; }

.table-wrap{
    border: 1px solid var(--line);
    border-radius: 16px;
    overflow:hidden;
    margin-bottom: 12px;
}
table{
    width:100%;
    border-collapse: collapse;
    font-size: 16px;
}
thead th{
    text-align:left;
    padding: 10px;
    border-bottom: 1px solid var(--line);
    background: rgba(255,255,255,.03);
    position: sticky;
    top: 0;
    z-index: 2;
}
tbody td{
    padding: 10px;
    border-bottom: 1px solid var(--line);
    vertical-align: top;
}
tbody tr:hover td{ background: rgba(255,255,255,.02); }

.col-small{ width: 56px; }
.nowrap{ white-space:nowrap; }
.mono{ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; }
.muted{ color: var(--muted); }

.errorbox{
    display:none;
    margin-top: 10px;
    padding: 10px 12px;
    border-radius: 14px;
    border: 1px solid rgba(255,60,60,.35);
    background: rgba(255,60,60,.12);
    color: #ffb3b3;
}
.errorbox.show{ display:block; }

.preview-footer{
    display:flex;
    justify-content:space-between;
    gap: 10px;
    padding: 10px 12px;
    border-top: 1px solid var(--line);
    color: var(--muted);
    font-size: 12px;
    flex-wrap:wrap;
}

.toast{
    position: fixed;
    bottom: 16px;
    left: 50%;
    transform: translateX(-50%);
    background: rgba(0,0,0,.75);
    border: 1px solid rgba(255,255,255,.15);
    color: #fff;
    padding: 10px 14px;
    border-radius: 999px;
    opacity: 0;
    pointer-events:none;
    transition: opacity .15s ease;
}
.toast.show{ opacity: 1; }

/* Modal */
.modal{ position: fixed; inset:0; display:flex; align-items:center; justify-content:center; z-index: 50; }
.modal.hidden{ display:none; }
.modal-backdrop{ position:absolute; inset:0; background: rgba(0,0,0,.55); }
.modal-card{
    position:relative;
    width: min(560px, 92vw);
    border-radius: 18px;
    border: 1px solid var(--line);
    background: var(--panel);
    box-shadow: var(--shadow);
    overflow:hidden;
}
.modal-header{
    display:flex; justify-content:space-between; align-items:center;
    padding: 12px 14px; border-bottom: 1px solid var(--line);
}
.modal-title{ font-weight: 800; }
.modal-subtitle{ color: var(--muted); font-size: 12px; margin-top: 2px; }
.modal-body{ padding: 14px; }
.modal-footer{
    display:flex; justify-content:space-between; align-items:center;
    padding: 12px 14px; border-top: 1px solid var(--line);
}
.step.hidden{ display:none; }

/* ===== Story 7: Card Preview ===== */

/* =========================
   Template-specific preview sizing
   ========================= */
/* Physical label templates must NOT stretch full width in the Live Card Preview */
.cardPreviewStage .card.tpl-avery5160,
.cardPreviewStage .card.tpl-avery5161{
    display: block;              /* prevent flexbox from stretching the label */
    width: auto;
    max-width: none;
    min-width: 0;
    flex: 0 0 auto;
    transform-origin: center center;
}

/* Remove global min-width constraints inside the Live Card Preview */
.cardPreviewStage .cardCell,
.cardPreviewStage .cardPreviewCell{
    min-width: 0;
}

.cardPreviewStage .card{
    background: #ffffff !important;
    color: #000000 !important;
}

.cardCell{ min-width: 420px; }

.card{
    --card-scale: 1;
    --desc-fs: 13px;
    --price-fs: 14px;
    --b: 0;

    display:flex;
    /* Tighter by default so QR can visually fill compact label-style cards */
    gap: 8px;
    padding: 6px;
    border-radius: 16px;

    border: calc(var(--b) * 1px) solid var(--line);
    background: rgba(255,255,255,.02);

    /*
      Live Card Preview scales the label with CSS transform.
      If the origin is top-left, the card looks "shifted" because flex centering
      uses the unscaled box. Center origin keeps the scaled card visually centered.
    */
    transform-origin: center;
    transform: scale(var(--card-scale));
}

/* Live Card Preview: show an outline that represents the physical label */
.card.labelBorder{
    --b: 1;
    border-style: dashed;
    border-radius: 10px;
    padding: 4px;
    background: rgba(255,255,255,.01);
}
.card.labelBorder .qrPane,
.card.labelBorder .textPane{
    border: 0;
    background: transparent;
    padding: 0;
}

/* For physical label templates (e.g., Avery 5161), keep the price always visible.
   Long search terms are clamped to a fixed number of lines (template-driven via --desc-lines)
   so text cannot push the price below the printable area. */
.card.labelBorder .textPane{
    overflow: hidden;
}
.card.labelBorder .desc{
    flex: 1 1 auto;
    min-height: 0;
    overflow: hidden;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: var(--desc-lines, 2);
}
.card.labelBorder .price{
    margin-top: auto;
}

.card.mode-right{ flex-direction: row; align-items: stretch; }
.card.mode-right .textPane{ flex: 1; }

.card.mode-below{ flex-direction: column; }
.card.mode-right_compact{ flex-direction: row; align-items: stretch; }

.card .qrPane{
    flex: 0 0 auto;
    display:flex;
    align-items:center;
    justify-content:center;
    /* Reduce inner padding; the QR itself already includes a quiet zone if enabled */
    padding: 2px;
    border-radius: 14px;
    border: calc(var(--b) * 1px) solid var(--line);
    background: rgba(255,255,255,.02);
}

.card .textPane{
    flex: 1 1 auto;
    min-width: 0;
    display:flex;
    flex-direction: column;
    gap: 6px;
    padding: 4px;
    border-radius: 14px;
    border: calc(var(--b) * 1px) solid var(--line);
    background: rgba(255,255,255,.015);
}

.card .desc{
    font-size: var(--desc-fs);
    line-height: 1.15;
    font-weight: 750;
    word-break: break-word;
    overflow-wrap: anywhere;
    white-space: normal;
}

.card .price{
    margin-top: 2px;
    font-size: var(--price-fs);
    line-height: 1.1;
    font-weight: 900;
    opacity: .92;
    white-space: nowrap;

    text-align: right;
}

.card.mode-right_compact .textPane{ justify-content: space-between; }
.card.mode-right_compact .price{ white-space: normal; }

.card .qrPane canvas{
    display:block;
    width: 100% !important;
    height: auto !important;
    border-radius: 12px;
}
.qrwrap{ position:relative; width: fit-content; height: fit-content; }
.qrwrap img{
    position:absolute;
    left:50%; top:50%;
    transform: translate(-50%,-50%);
}

/* ===== Story 8: PDF Preview ===== */
.cardPreviewTop {
    width: 100%;
    border-bottom: 1px solid var(--line);
    background: var(--panel2);
}

.cardPreviewTopInner {
    padding: 10px 14px;
    display: flex;
    align-items: center;
    gap: 12px;
    min-height: 44px;
}

.cardPreview{
    margin-top: 12px;
    border: 1px solid var(--line);
    border-radius: 16px;
    overflow: hidden;
    background: rgba(255,255,255,.02);
}

.cardPreviewWrap{
    padding: 12px;
    display:flex;
    flex-direction: column;
    gap: 12px;
    justify-content: flex-start;
}

.cardPreviewControls{
    border: 1px solid var(--line);
    border-radius: 14px;
    padding: 10px;
    background: rgba(255,255,255,.03);
}

.cardPreviewControlsTitle{
    display:flex;
    align-items:center;
    justify-content: space-between;
    gap: 10px;
    flex-wrap: wrap;
    margin-bottom: 8px;
}

.cardPreviewStage{
    border: 1px solid var(--line);
    border-radius: 14px;
    padding: 12px;
    display:flex;
    justify-content:center;
    background: rgba(255,255,255,.01);
    /* Give enough space so 1"×4" label templates can scale up in the Live Preview */
    min-height: 220px;

    /* Prevent scaled labels from being clipped if they grow beyond the stage */
    overflow: auto;
}

.cardPreviewCell{
    width: 100%;
    display:flex;
    justify-content:center;
    align-items: center;
}

/* Live Card Preview only: allow up to 5 lines of description before truncating.
   (The PDF output can still use a stricter clamp via template rules.) */
.cardPreviewStage .card.labelBorder{
    --desc-lines: 5;
}


/* Live Card Preview: show an ellipsis hint only when JS detects truncation */
.cardPreviewStage .card.labelBorder .desc.isTruncated{
    position: relative;
}
.cardPreviewStage .card.labelBorder .desc.isTruncated::after{
    content: "…";
    position: absolute;
    right: 0;
    bottom: 0;
    padding-left: 14px;
    /* fade-out background to make the ellipsis readable */
    background: linear-gradient(to right, rgba(0,0,0,0), rgba(0,0,0,.35), rgba(0,0,0,.45));
    color: var(--text);
}
body[data-theme="light"] .cardPreviewStage .card.labelBorder .desc.isTruncated::after,
html[data-theme="light"] .cardPreviewStage .card.labelBorder .desc.isTruncated::after,
body[data-theme="soft"] .cardPreviewStage .card.labelBorder .desc.isTruncated::after,
html[data-theme="soft"] .cardPreviewStage .card.labelBorder .desc.isTruncated::after,
body[data-theme="purple_light"] .cardPreviewStage .card.labelBorder .desc.isTruncated::after,
html[data-theme="purple_light"] .cardPreviewStage .card.labelBorder .desc.isTruncated::after{
    background: linear-gradient(to right, rgba(255,255,255,0), rgba(255,255,255,.55), rgba(255,255,255,.75));
}

.cardPreviewStage .card.labelBorder .desc{
    white-space: normal;
    overflow-wrap: anywhere;
    word-break: break-word;
}

/* Template + Logo inline row */
.template-logo-row {
    display: flex;
    gap: 16px;
    align-items: flex-end;
    margin-bottom: 16px;
}

.template-field {
    flex: 1;
    min-width: 0;
}

.logo-field {
    flex: 0 0 auto;
}

/* Make file input align visually with select */
.logo-field input[type="file"] {
    height: 38px;
}

/* Responsive: stack on smaller screens */
@media (max-width: 900px) {
    .template-logo-row {
        flex-direction: column;
        align-items: stretch;
    }

    .logo-field {
        width: 100%;
    }
}

/* =========================
   Live Card Preview: square corners
   Remove rounded corners around the QR area, text area, and label outline
   within the Live Card Preview stage.
   ========================= */
.cardPreviewStage .card,
.cardPreviewStage .card.labelBorder,
.cardPreviewStage .qrPane,
.cardPreviewStage .textPane,
.cardPreviewStage .qrPane canvas{
    border-radius: 0 !important;
}

@media (min-width: 980px){
    /* In the Live Card Preview, keep sections stacked and full-width.
       (URL Builder + Live Preview already share the page 50/50.) */
    .cardPreviewWrap{
        flex-direction: column;
        align-items: stretch;
    }

    .cardPreviewWrap .cardPreviewControls{
        flex: 0 0 auto;
        width: 100%;
        max-width: none;
    }

    .cardPreviewStage{
        flex: 0 0 auto;
        width: 100%;
        align-items: center;
    }
}

.pdfPreview{
    margin-top: 12px;
    border: 1px solid var(--line);
    border-radius: 16px;
    overflow: hidden;
    background: rgba(255,255,255,.02);
}
.pdfHeader{
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:10px;
    padding: 10px 12px;
    border-bottom: 1px solid var(--line);
}
.pdfCanvasWrap{
    padding: 12px;
    display:flex;
    justify-content:center;
}

/* ===== URL Builder: grid layout for Build-from-Columns + Live Card Preview ===== */
.urlBuilderWrap{
    justify-content: stretch; /* override pdfCanvasWrap centering */
    align-items: stretch;
}

/* Build-from-columns should fill the URL Builder column */
.urlBuilderWrap > .cardPreviewControls{
    width: 100%;
    max-width: none;
}

.urlBuilderGrid{
    width: 100%;
    display: grid;
    grid-template-columns: 1fr;
    gap: 12px;
    align-items: start;
}

.urlBuilderGrid > .cardPreview{
    margin-top: 0; /* prevent extra gap inside grid */
}

@media (min-width: 980px){
    .urlBuilderGrid{
        grid-template-columns: 1fr 1fr;
    }
}

.pdfDownloadRow{
    display:flex;
    gap:10px;
    flex-wrap:wrap;
    justify-content:flex-end;
    padding-top:10px;
}
#pdfCanvas{
    max-width: 100%;
    height: auto;
    border-radius: 10px;
    border: 1px solid var(--line);
    background: white;
}

/* Download links for Separate mode */
.downloads{
    margin-top: 10px;
    display:flex;
    flex-direction:column;
    gap: 8px;
}
.downloadLink{
    display:flex;
    justify-content:space-between;
    align-items:center;
    gap: 10px;
    padding: 10px;
    border-radius: 14px;
    border: 1px solid var(--line);
    background: rgba(255,255,255,.03);
}
.downloadLink a{
    color: inherit;
    text-decoration: none;
    font-weight: 800;
}

/* Full-width table search (above preview table) */
.table-search{
    margin-bottom: 12px;
    padding: 10px;
    border-radius: 16px;
    border: 1px solid var(--line);
    background: rgba(255,255,255,.04);
    box-shadow: 0 8px 22px rgba(0,0,0,.18);
}

.table-search-input{
    width: 100%;
    padding: 12px 14px;
    border-radius: 14px;
    border: 1px solid rgba(255,255,255,.14);
    background: rgba(255,255,255,.05);
    color: var(--text);
    font-size: 14px;
    outline: none;
}

.table-search-input::placeholder{
    color: var(--muted);
}

.table-search-input:focus{
    border-color: rgba(190, 120, 255, .85);
    box-shadow: 0 0 0 3px rgba(190, 120, 255, .22);
}

/* Actions column buttons on one line */
.actionBtns{
    display: flex;
    flex-direction: row;   /* ← key change */
    gap: 8px;
    align-items: center;
}
/* Search + Show Rows inline row (above table) */
.table-search-row{
    display: flex;
    gap: 12px;
    align-items: center;
    margin-bottom: 12px;
}

.table-search-input{
    flex: 1 1 auto;
}

.table-select-actions{
    display: inline-flex;
    gap: 8px;
    align-items: center;
    flex-wrap: wrap;
}

.table-row-limit{
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 6px 10px;
    border-radius: 12px;
    border: 1px solid var(--line);
    background: rgba(255,255,255,.04);
    white-space: nowrap;
}

.table-row-limit select{
    border: 0;
    background: transparent;
    color: var(--text);
    font-weight: 600;
    outline: none;
}

/* Search + Show Rows container — standout styling */
.table-search-row{
    display: flex;
    gap: 12px;
    align-items: center;
    margin-bottom: 12px;

    /* standout card styling (RESTORED) */
    padding: 10px;
    border-radius: 16px;
    border: 1px solid var(--line);
    background: rgba(255,255,255,.04);
    box-shadow: 0 8px 22px rgba(0,0,0,.18);
}

/* Full-width search input */
.table-search-input{
    flex: 1 1 auto;
    padding: 12px 14px;
    border-radius: 14px;
    border: 1px solid rgba(255,255,255,.14);
    background: rgba(255,255,255,.05);
    color: var(--text);
    font-size: 14px;
    outline: none;
}

.table-search-input::placeholder{
    color: var(--muted);
}

/* Focus state — makes it pop */
.table-search-input:focus{
    border-color: rgba(190, 120, 255, .85);
    box-shadow: 0 0 0 3px rgba(190, 120, 255, .22);
}

/* Show rows selector */
.table-row-limit{
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 6px 10px;
    border-radius: 12px;
    border: 1px solid var(--line);
    background: rgba(255,255,255,.05);
    white-space: nowrap;
}

.table-row-limit select{
    border: 0;
    background: transparent;
    color: var(--text);
    font-weight: 600;
    outline: none;
}
/* Total rows count next to Show rows */
.table-row-limit .row-sep{
    opacity: .4;
    margin: 0 4px;
}

.table-row-limit .row-total{
    font-weight: 700;
}

/* --- Icon action buttons (Copy / eBay) --- */
.rowActions{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap}
.icon-btn{
    display:inline-flex;
    align-items:center;
    justify-content:center;
    width:30px;
    height:30px;
    padding:0;
    background:var(--panel);
    color:var(--text);
    cursor:pointer}
.icon-btn:hover{
    filter:brightness(1.05)
}
.icon-btn svg{
    width:16px;
    height:16px;
    fill:none;
    stroke:currentColor;
    stroke-width:2;
    stroke-linecap:round;
    stroke-linejoin:round
}
.icon-link{
    display:inline-flex;
    align-items:center;
    justify-content:center;
    width:32px;
    height:32px;
    background:var(--panel);
    color:var(--text);
    text-decoration:none}
.icon-link:hover{
    filter:brightness(1.05)
}
.icon-link img, .icon-link svg{
    width:24px;
    height:24px;
    fill:currentColor
}

/* =========================
   URL Builder + Live Card Preview
   Side-by-side (50/50) layout
   ========================= */

.urlBuilderRow{
    display: flex;
    flex-direction: column;
    gap: 14px;
}

@media (min-width: 980px){
    .urlBuilderRow{
        flex-direction: row;
        align-items: stretch;
    }
    /* Left: URL Builder, Right: Live Card Preview */
    .urlBuilderRow > .urlBuilder,
    .urlBuilderRow > #cardPreview{
        flex: 1 1 0;
        width: 50%;
        max-width: 50%;
        min-width: 0;
    }
}
/* =========================
   Table Preview – Font Sizes
   ========================= */
/* =========================
   Table Preview – Action Icons
   ========================= */

.table-wrap .actionBtn,
.table-wrap .actionBtn svg,
.table-wrap .actionIcon {
    width: 22px;
    height: 22px;
    font-size: 22px;
}

.table-wrap .actionBtn {
    padding: 6px;
}
/* =========================
   URL Builder – Draggable Columns (LARGER)
   ========================= */

.urlBuilder .colOrderList {
    gap: 12px;
}

.urlBuilder .colOrderItem {
    font-size: 20px;          /* ~2x original */
    padding: 14px 18px;       /* bigger chip */
    min-height: 48px;
    line-height: 1.25;
    border-radius: 8px;
}

/* If icons / drag handles exist */
.urlBuilder .colOrderItem svg,
.urlBuilder .colOrderItem .icon {
    width: 22px;
    height: 22px;
    font-size: 22px;
}

/* =========================
   Table Preview – Font Sizes (locked to 16px)
   ========================= */
.table-wrap table { font-size: 16px; }
.table-wrap thead th { font-size: 16px; }
.table-wrap tbody td { font-size: 16px; line-height: 1.35; }
/* =========================
   eBay Icon (RESTORED)
   ========================= */

.icon-link.ebay{
    display:inline-flex;
    align-items:center;
    justify-content:center;
}

.icon-link.ebay .ebayIcon{
    width: 36px;
    height: 36px;
    display: inline-block;
    background-color: var(--ebay-icon-color);

    /* SVG mask for theme coloring */
    -webkit-mask: url("../imgs/ebay.svg") no-repeat center / contain;
    mask: url("../imgs/ebay.svg") no-repeat center / contain;
}


/* --- Step 3 width + stretch fix --- */
.list{ width:100%; }
.item{ width:100%; box-sizing:border-box; justify-self:stretch; }


/* --- Step 3 layout: actions below text/price (scoped to preview list) --- */
#tbody .item{
    display:flex;
    flex-direction:column;
    gap:10px;
}
#tbody .itemMain{
    display:flex;
    flex-direction:column;
    gap:4px;
}
#tbody .acts{
    display:flex;
    align-items:center;
    justify-content:flex-end;
    gap:10px;
}
#tbody .chk{ margin-top:0; }


/* --- Align Actions Left --- */
.acts {
    justify-content: flex-start !important;
}

/* =========================
   Step 3 – Search + Row Selector (same row)
   ========================= */
.step3Controls .field { margin: 0; }
.step3Controls input { width: 100%; }

/* Make "Show rows" selector compact */
.step3Controls .step3RowLimit { min-width: 140px; }
#rowLimitSelect { width: 120px; }

/* =========================
   Live Preview — font sizing + no clipping
   (does NOT affect PDF rendering)
   ========================= */

/* Make the live preview match PDF point sizing (9pt≈12px, 12pt≈16px) */
.previewCard .descMock,
#previewCardDesktop .descMock,
#previewCardMobile .descMock{
    font-size: 12px !important; /* 9pt */
    line-height: 1.18 !important;
    /* allow more lines like PDF (PDF clamps to 5) */
    display: -webkit-box !important;
    -webkit-box-orient: vertical !important;
    -webkit-line-clamp: 5 !important;
    overflow: hidden !important;
    white-space: normal !important;
    word-break: break-word !important;
}

.previewCard .priceMock,
#previewCardDesktop .priceMock,
#previewCardMobile .priceMock{
    font-size: 16px !important; /* 12pt */
    margin-top: 6px !important;
}

/* Prevent QR from being clipped inside the rounded QR slot */
.previewCard .qrSlot,
#previewCardDesktop .qrSlot,
#previewCardMobile .qrSlot{
    padding: 4px !important;
    overflow: visible !important;
    box-sizing: border-box !important;
}

.previewCard .qrSlot canvas,
#previewCardDesktop .qrSlot canvas,
#previewCardMobile .qrSlot canvas{
    width: 100% !important;
    height: 100% !important;
    display: block !important;
}


/* =========================
   PDF Preview Sidebar (replaces Live Preview)
   ========================= */
.previewHeaderRow{
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:10px;
}
.previewHeaderRow h3{
    margin:0;
}
.previewActionsRow{
    display:flex;
    gap:10px;
}
.previewActionsRow .btn{
    flex:1;
}



/* ===== Former inline styles from index.html ===== */

:root{
    --bg:#0f1115;
    --panel:#151a22;
    --panel2:#101621;
    --line:rgba(255,255,255,.08);
    --text:#e7e9ee;
    --muted:#a6adbb;
    --brand:#7c5cff;
    --ok:#2ecc71;
    --radius:16px;
    --pad:14px;
    --shadow:0 10px 25px rgba(0,0,0,.35);
    --tap:52px;
    --font: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji","Segoe UI Emoji";
}
[data-theme="light"]{
    --bg:#f6f7fb;
    --panel:#ffffff;
    --panel2:#fbfcff;
    --line:rgba(0,0,0,.08);
    --text:#0f1115;
    --muted:#5d667a;
    --shadow:0 8px 20px rgba(0,0,0,.10);
}
*{box-sizing:border-box}
body{
    margin:0;
    font-family:var(--font);
    background:linear-gradient(180deg,var(--bg), rgba(0,0,0,0));
    color:var(--text);
    min-height:100vh;
}

.topbar{
    position:sticky; top:0; z-index:50;
    background:color-mix(in oklab, var(--bg), transparent 10%);
    backdrop-filter: blur(10px);
    border-bottom:1px solid var(--line);
}
.topbar-inner{
    max-width:980px;
    margin:0 auto;
    padding:12px 14px 10px;
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:10px;
}
.brand{display:flex; align-items:center; gap:10px; font-weight:900; letter-spacing:.2px;}
.logo{
    width:32px; height:32px; border-radius:10px;
    background: radial-gradient(circle at 30% 30%, var(--brand), color-mix(in oklab, var(--brand), #000 60%));
    box-shadow: var(--shadow);
}
.actions{display:flex; gap:10px; align-items:center;}
.iconbtn{
    width:40px; height:40px;
    border-radius:12px;
    border:1px solid var(--line);
    background:var(--panel);
    display:grid; place-items:center;
    cursor:pointer;
    user-select:none;
}
.iconbtn:active{transform:translateY(1px)}

.stepper{
    max-width:980px;
    margin:0 auto;
    padding:0 14px 12px;
    display:flex;
    gap:8px;
    overflow:auto;
    -webkit-overflow-scrolling: touch;
    scrollbar-width:none;
}
.stepper::-webkit-scrollbar{ display:none; }
.step{
    flex:0 0 auto;
    display:flex; align-items:center; gap:10px;
    padding:10px 12px;
    border:1px solid var(--line);
    background:var(--panel);
    border-radius:999px;
    cursor:pointer;
    user-select:none;
    white-space:nowrap;
}
.step .dot{
    width:26px; height:26px; border-radius:999px;
    border:2px solid var(--line);
    display:grid; place-items:center;
    font-weight:900;
    color:var(--muted);
}
.step.active{
    border-color: color-mix(in oklab, var(--brand), var(--line) 40%);
    box-shadow:0 0 0 3px color-mix(in oklab, var(--brand), transparent 75%);
}
.step.active .dot{ border-color: var(--brand); color: var(--text); }
.step.done .dot{ border-color: var(--ok); color: var(--ok); }
.step small{color:var(--muted); font-weight:850}
.step strong{font-size:13px}

.container{
    max-width:980px;
    margin:0 auto;
    padding:14px;
    padding-bottom:132px;
}
.grid{ display:grid; grid-template-columns: 1fr; gap:12px; }
@media (min-width: 900px){
    .grid{ grid-template-columns: 1.05fr .95fr; align-items:start; }
    .desktopPreview{ display:block; position:sticky; top:92px; }
    .mobilePreviewDock{ display:none; }
}
@media (max-width: 899px){
    .desktopPreview{ display:none; }
    .mobilePreviewDock{ display:block; }
}

.card{
    background:var(--panel);
    border:1px solid var(--line);
    border-radius:16px;
    padding:14px;
    box-shadow:var(--shadow);
}
.card h2{ margin:0 0 6px; font-size:18px; letter-spacing:.2px; }
.sub{ margin:0 0 12px; color:var(--muted); font-size:13px; line-height:1.35; }
.row{ display:flex; gap:10px; align-items:center; flex-wrap:wrap; }

.btn{
    min-height:52px;
    padding:12px 14px;
    border-radius:14px;
    border:1px solid var(--line);
    background:var(--panel2);
    color:var(--text);
    font-weight:900;
    cursor:pointer;
    display:inline-flex;
    align-items:center;
    justify-content:center;
    gap:10px;
    user-select:none;
    white-space:nowrap;
}
.btn.primary{
    background: linear-gradient(180deg, color-mix(in oklab, var(--brand), #000 10%), color-mix(in oklab, var(--brand), #000 35%));
    border-color: color-mix(in oklab, var(--brand), var(--line) 30%);
}
.btn.ghost{ background:transparent }
.btn.small{
    min-height:40px;
    padding:8px 10px;
    border-radius:12px;
    font-size:13px;
}
.btn:active{ transform:translateY(1px) }

.pill{
    display:inline-flex; align-items:center; gap:8px;
    padding:8px 10px;
    border-radius:999px;
    border:1px solid var(--line);
    background:color-mix(in oklab, var(--panel2), transparent 10%);
    font-weight:900;
    color:var(--text);
    user-select:none;
}
.pill small{color:var(--muted); font-weight:950}

.field{ display:grid; gap:6px; margin:10px 0; }
label{font-size:12px; color:var(--muted); font-weight:950}
input[type="text"], input[type="number"], select, textarea{
    min-height:48px;
    padding:10px 12px;
    border-radius:14px;
    border:1px solid var(--line);
    background:var(--panel2);
    color:var(--text);
    outline:none;
    width:100%;
    font: inherit;
}
textarea{ min-height:96px; resize:vertical; }

.tabs{
    display:flex;
    gap:8px;
    padding:6px;
    border-radius:16px;
    border:1px solid var(--line);
    background: color-mix(in oklab, var(--panel2), transparent 8%);
    margin-bottom:12px;
}
.tab{
    flex:1;
    min-height:44px;
    border-radius:12px;
    border:1px solid transparent;
    background:transparent;
    color:var(--muted);
    font-weight:950;
    cursor:pointer;
}
.tab.active{
    background: var(--panel);
    border-color: color-mix(in oklab, var(--brand), var(--line) 35%);
    color:var(--text);
    box-shadow:0 0 0 3px color-mix(in oklab, var(--brand), transparent 82%);
}

.list{ display:grid; gap:10px; margin-top:10px; }
.item{
    display:flex;
    flex-direction:column;
    gap:10px;
    padding:12px;
    border-radius:14px;
    border:1px solid var(--line);
    background:color-mix(in oklab, var(--panel2), transparent 5%);
}
.left{ display:flex; align-items:flex-start; gap:10px; min-width:0; }
.chk{
    width:22px; height:22px; border-radius:7px;
    border:2px solid var(--line);
    display:grid; place-items:center;
    flex:0 0 auto;
    cursor:pointer;
    user-select:none;
    margin-top:2px;
}
.chk.on{ border-color: var(--ok); background: color-mix(in oklab, var(--ok), transparent 85%); }
.name{
    font-weight:950;
    overflow:hidden;
    text-overflow:ellipsis;
    display:-webkit-box;
    -webkit-line-clamp:2;
    -webkit-box-orient:vertical;
    line-height:1.2;
}
.meta{ color:var(--muted); font-size:12px; font-weight:900; margin-top:6px; }

@media (hover:hover) and (pointer:fine){
    .itemMain:hover .name{
        -webkit-line-clamp:unset;
        overflow:visible;
        display:block;
        white-space:normal;
    }
    .itemMain:hover{
        background: var(--panel);
        outline: 2px solid color-mix(in oklab, var(--brand), transparent 70%);
        outline-offset: 2px;
        border-radius:12px;
    }
}
.itemMain{ cursor:pointer; border-radius:12px; padding:2px 2px; }

.acts{ display:flex; gap:8px; align-items:center; justify-content:flex-start; }
.actbtn{
    width:40px; height:40px;
    border-radius:12px;
    border:1px solid var(--line);
    background:color-mix(in oklab, var(--panel2), transparent 5%);
    display:grid; place-items:center;
    cursor:pointer;
    user-select:none;
    font-size:16px;
    line-height:1;
}
.actbtn:active{ transform:translateY(1px); }
.actbtn.ebay{ font-weight:950; font-size:13px; letter-spacing:.2px; }

.pager{
    display:flex;
    flex-wrap:wrap;
    align-items:center;
    justify-content:space-between;
    gap:10px;
    padding-top:10px;
    border-top:1px solid var(--line);
    margin-top:10px;
}
.pager .mini{ display:flex; gap:10px; flex-wrap:wrap; }
.pager .meta{ color:var(--muted); font-weight:900; font-size:12px; white-space:nowrap; }

.siteRow{
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:10px;
    padding:12px;
    border-radius:14px;
    border:1px solid var(--line);
    background:color-mix(in oklab, var(--panel2), transparent 5%);
    margin-top:10px;
}
.siteRow strong{ font-weight:950; }
.siteRow small{ color:var(--muted); font-weight:900; }
.seg{
    display:inline-flex;
    gap:6px;
    padding:6px;
    border-radius:999px;
    border:1px solid var(--line);
    background: var(--panel);
}
.seg button{
    min-height:34px;
    padding:6px 10px;
    border-radius:999px;
    border:1px solid transparent;
    background:transparent;
    color:var(--muted);
    font-weight:950;
    cursor:pointer;
}
.seg button.on{
    background: color-mix(in oklab, var(--brand), #000 25%);
    border-color: color-mix(in oklab, var(--brand), var(--line) 30%);
    color: var(--text);
}

.previewCard h3{
    margin:0 0 10px;
    font-size:14px;
    color:var(--muted);
    font-weight:950;
    text-transform:uppercase;
    letter-spacing:.8px;
}

.labelMock{
    border:1px solid var(--line);
    border-radius:16px;
    background: color-mix(in oklab, var(--panel2), transparent 10%);
    padding:12px;
}
/* "Printed label" frame inside the preview stage */
.labelInner{
    font-family: Helvetica, Arial, system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
    display:grid;
    grid-template-columns: var(--lp-qr-px, 92px) 1fr;
    gap:10px;
    align-items:start;
    border:1px solid var(--line);
    border-radius:14px;
    background:#fff;
    padding:10px;
    box-sizing:border-box;
    overflow:hidden;
}
.qrSlot{
    width:var(--lp-qr-px, 92px);
    height:var(--lp-qr-px, 92px);
    border-radius:12px;
    border:1px solid var(--line);
    background:#fff;
    display:grid;
    place-items:center;
    overflow:hidden;
    box-sizing:border-box;
    /* tiny inset so finder patterns never get visually clipped by border radius */
    padding:1px;
}
.qrSlot .qrwrap{
    width:100%;
    height:100%;
    display:block;
}
.qrSlot canvas{
    width:100% !important;
    height:100% !important;
    display:block;
}
.descMock{
    font-weight:950;
    /* PDF uses points. Convert pt -> px at 96dpi: 1pt = 1.3333px */
    font-size: calc(var(--lp-desc-pt, 9) * 1.333333px);
    line-height: 1.18;
    overflow:hidden;
    display:-webkit-box;
    -webkit-line-clamp: var(--lp-lines, 5);
    -webkit-box-orient: vertical;
    white-space: normal;
    word-break: break-word;
}
.priceMock{
    margin-top:6px;
    font-weight:950;
    font-size: calc(var(--lp-price-pt, 12) * 1.333333px);
    letter-spacing:.2px;
}

.siteBadges{ display:flex; gap:6px; flex-wrap:wrap; margin-top:8px; }
.badge{
    border:1px solid var(--line);
    background: var(--panel);
    border-radius:999px;
    padding:6px 10px;
    font-size:12px;
    font-weight:950;
    color:var(--muted);
}
.badge.on{ color:var(--text); border-color:color-mix(in oklab, var(--brand), var(--line) 35%) }

.hint{
    margin-top:10px;
    padding:10px 12px;
    border-radius:14px;
    border:1px solid var(--line);
    background: color-mix(in oklab, var(--panel2), transparent 5%);
    color:var(--muted);
    font-size:13px;
    line-height:1.35;
}

.mobilePreviewDock{
    position:fixed;
    left:0; right:0;
    bottom:74px;
    z-index:45;
    pointer-events:none;
}
.mobilePreviewBtnWrap{
    max-width:980px;
    margin:0 auto;
    padding:0 14px;
    display:flex;
    justify-content:flex-end;
    pointer-events:auto;
}
.previewChip{
    display:flex; align-items:center; gap:10px;
    border:1px solid var(--line);
    background:var(--panel);
    border-radius:999px;
    padding:8px 10px;
    box-shadow: var(--shadow);
    cursor:pointer;
    user-select:none;
}
.chipThumb{
    width:28px; height:28px;
    border-radius:10px;
    background:#fff;
    border:1px solid var(--line);
    display:grid; place-items:center;
    overflow:hidden;
}
.chipThumb canvas{ width:28px; height:28px; display:block; }
.chipText{ font-weight:950; font-size:13px; }
.chipSub{ font-size:12px; color:var(--muted); font-weight:950; margin-top:-2px; }

.modalBackdrop{
    position:fixed; inset:0;
    background:rgba(0,0,0,.55);
    display:none;
    z-index:60;
    padding:14px;
}
.modalBackdrop.open{ display:flex; }
.modalBackdrop.show{ display:flex; }
body.preview-modal-open{ overflow:hidden; }
.modal{
    width:100%;
    max-width:560px;
    margin:auto;
    border-radius:18px;
    border:1px solid var(--line);
    background:var(--panel);
    box-shadow: var(--shadow);
    overflow:hidden;
}
.modalHead{
    display:flex; align-items:center; justify-content:space-between;
    padding:12px 12px;
    border-bottom:1px solid var(--line);
}
.modalHead strong{ font-weight:950; }
.modalBody{ padding:12px; }
.modalDesc{
    font-weight:950;
    line-height:1.25;
    word-break:break-word;
}
.modalMeta{
    margin-top:10px;
    color:var(--muted);
    font-weight:900;
    font-size:13px;
}
.modalActions{
    display:flex;
    gap:10px;
    flex-wrap:wrap;
    margin-top:12px;
}
.modalActions .btn{ flex:1; min-width:140px; }

.bottombar{
    position:fixed;
    left:0; right:0; bottom:0;
    border-top:1px solid var(--line);
    background:color-mix(in oklab, var(--bg), transparent 5%);
    backdrop-filter: blur(10px);
    padding:10px 14px;
    z-index:70;
}
.bottombar-inner{
    max-width:980px;
    margin:0 auto;
    display:flex;
    gap:10px;
}
.bottombar .btn{ flex:1 }

.drop{
    border:2px dashed color-mix(in oklab, var(--line), transparent 10%);
    border-radius:16px;
    padding:14px;
    background: color-mix(in oklab, var(--panel2), transparent 10%);
}

.tplGrid{ display:grid; grid-template-columns:1fr; gap:10px; }
@media (min-width:520px){ .tplGrid{ grid-template-columns:1fr 1fr; } }
.tpl{
    border:1px solid var(--line);
    background: color-mix(in oklab, var(--panel2), transparent 6%);
    border-radius:16px;
    padding:12px;
    cursor:pointer;
    user-select:none;
}
.tpl.on{
    outline:3px solid color-mix(in oklab, var(--brand), transparent 75%);
    border-color: color-mix(in oklab, var(--brand), var(--line) 40%);
    background: color-mix(in oklab, var(--brand), transparent 92%);
}
.tpl strong{ font-weight:950; }
.tpl .mini{ margin-top:6px; color:var(--muted); font-weight:900; font-size:12px; }

.exportBlock{
    margin-top:12px;
    border:1px solid var(--line);
    border-radius:16px;
    padding:12px;
    background: color-mix(in oklab, var(--panel2), transparent 6%);
}
.exportBlock strong{ font-weight:950; }

/* =========================
   Style selector palettes
   - Only adjusts CSS variables (safe, non-breaking)
   ========================= */
body[data-style="midnight"]{
    --bg:#070a12;
    --panel:#0b1020;
    --panel2:#070c18;
    --line:rgba(255,255,255,.08);
    --text:#e9ecff;
    --muted:#a7b0d6;
    --brand:#4ea1ff;
}
body[data-style="slate"]{
    --bg:#0e1218;
    --panel:#151b24;
    --panel2:#0f1520;
    --line:rgba(255,255,255,.09);
    --text:#e6e9f0;
    --muted:#9aa4b6;
    --brand:#22c1c3;
}
body[data-style="purple"]{
    --bg:#0f0d16;
    --panel:#161326;
    --panel2:#110f1f;
    --line:rgba(255,255,255,.09);
    --text:#f0effa;
    --muted:#b8b3d8;
    --brand:#a855f7;
}
body[data-style="ember"]{
    --bg:#120c0a;
    --panel:#1b120f;
    --panel2:#130d0b;
    --line:rgba(255,255,255,.09);
    --text:#f4eee9;
    --muted:#c8b2a6;
    --brand:#ff6b3d;
}
body[data-theme="light"][data-style="daylight"]{
    --bg:#f6f7fb;
    --panel:#ffffff;
    --panel2:#fbfcff;
    --line:rgba(0,0,0,.08);
    --text:#0f1115;
    --muted:#5d667a;
    --brand:#3b82f6;
}
body[data-theme="light"][data-style="mint"]{
    --bg:#f4fbf8;
    --panel:#ffffff;
    --panel2:#f7fffb;
    --line:rgba(0,0,0,.08);
    --text:#0f1115;
    --muted:#51606e;
    --brand:#10b981;
}
body[data-theme="light"][data-style="sand"]{
    --bg:#fbf7f0;
    --panel:#ffffff;
    --panel2:#fffaf2;
    --line:rgba(0,0,0,.08);
    --text:#121212;
    --muted:#5c5a55;
    --brand:#d97706;
}


body[data-theme="light"][data-style="lavender"]{
    --bg:#f7f3ff;
    --panel:#ffffff;
    --panel2:#fbf8ff;
    --line:rgba(88, 70, 140, .14);
    --text:#14121a;
    --muted:#5e5670;
    --brand:#a855f7;
}

/* =========================
   Button text contrast fix
   ========================= */
.btn.primary,
.btn.dark,
.btn.filled{
    color:#ffffff;
}
.btn.primary:hover,
.btn.dark:hover,
.btn.filled:hover{
    color:#ffffff;
}


/* =====================================================
   Hover / Press / Focus feedback (wireframe + themes)
   ===================================================== */
.btn, .iconbtn, .actbtn, .tab, .step, select, input[type="file"] + label{
    transition: transform .08s ease, box-shadow .15s ease, border-color .15s ease, background-color .15s ease, filter .15s ease;
}
@media (hover:hover) and (pointer:fine){
    .btn:hover, .iconbtn:hover, .actbtn:hover, .tab:hover, .step:hover{
        transform: translateY(-1px);
        box-shadow: 0 6px 16px rgba(0,0,0,.12);
        border-color: color-mix(in oklab, var(--brand), var(--line) 60%);
        filter: none;
    }
}
.btn:active, .iconbtn:active, .actbtn:active, .tab:active, .step:active{
    transform: translateY(0);
    box-shadow: 0 2px 6px rgba(0,0,0,.10);
}
.btn:focus-visible, .iconbtn:focus-visible, .actbtn:focus-visible, .tab:focus-visible, .step:focus-visible, select:focus-visible, input:focus-visible, textarea:focus-visible{
    outline:none;
    box-shadow: 0 0 0 3px color-mix(in oklab, var(--brand), transparent 70%);
}


/* --- Step 3 width + stretch fix --- */
.list{ width:100%; }
.item{ width:100%; box-sizing:border-box; justify-self:stretch; }

/* stepper centering override (keep header layout intact) */
.stepper{ justify-content: center; }
@media (max-width: 700px){
    .stepper{ justify-content: flex-start; }
}

/* =========================
   Desktop one-page workspace + collapsible preview rail
   ========================= */
:root{
    --desktop-shell-max: 1500px;
    --desktop-preview-width: 460px;
    --desktop-preview-collapsed-width: 72px;
}

.previewRailHeader{
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:10px;
    margin-bottom:12px;
}
.previewSidebarBody{
    display:block;
}
.previewSidebarToggle{
    flex:0 0 auto;
}
.desktopCardActions{
    justify-content:flex-end;
}
.desktopCardActions .rowActions{
    display:inline-flex;
    gap:8px;
    align-items:center;
}

@media (min-width: 1200px){
    .topbar-inner,
    .stepper,
    .container,
    .bottombar-inner,
    .mobilePreviewBtnWrap{
        max-width: var(--desktop-shell-max);
    }

    .stepper{
        padding-top: 4px;
        justify-content:flex-start;
    }

    .container{
        padding-bottom: 28px;
    }

    .grid.appDesktopShell{
        grid-template-columns: minmax(0, 1fr) var(--desktop-preview-width);
        gap: 20px;
        align-items: start;
    }

    #stepCard{
        background: transparent;
        border: 0;
        box-shadow: none;
        padding: 0;
        display: flex;
        flex-direction: column;
        gap: 18px;
    }

    #stepCard > .stepPanel{
        display: block !important;
        background: var(--panel);
        border: 1px solid var(--line);
        border-radius: 16px;
        padding: 18px;
        box-shadow: var(--shadow);
    }

    #previewCardDesktop.desktopPreview{
        display:block;
        position: sticky;
        top: 104px;
        max-height: calc(100vh - 120px);
        overflow: auto;
        scrollbar-gutter: stable;
    }

    .mobilePreviewDock,
    .modalBackdrop#previewModal,
    .bottombar{
        display:none !important;
    }

    body.desktop-preview-collapsed .grid.appDesktopShell{
        grid-template-columns: minmax(0, 1fr) var(--desktop-preview-collapsed-width);
    }

    body.desktop-preview-collapsed #previewCardDesktop.desktopPreview{
        overflow: visible;
        padding: 10px 8px;
    }

    body.desktop-preview-collapsed #previewCardDesktop .previewHeaderRow,
    body.desktop-preview-collapsed #previewCardDesktop .previewSidebarBody{
        display:none;
    }

    body.desktop-preview-collapsed #previewCardDesktop .previewRailHeader{
        margin:0;
        justify-content:center;
    }

    body.desktop-preview-collapsed #previewCardDesktop .previewSidebarToggle{
        min-height: 220px;
        min-width: 48px;
        padding: 12px 10px;
        writing-mode: vertical-rl;
        transform: rotate(180deg);
        border-radius: 999px;
    }
}

@media (max-width: 1199px){
    .previewRailHeader{
        display:none;
    }
    .previewSidebarBody{
        display:block;
    }
}


/* Reusable inline info popover */
.stepTitle{
    display:flex;
    align-items:center;
    gap:8px;
}

.infoTrigger{
    appearance:none;
    border:0;
    background:transparent;
    color:var(--muted);
    cursor:pointer;
    padding:0;
    display:inline-flex;
    align-items:center;
    justify-content:center;
    line-height:1;
}

.infoTrigger:hover,
.infoTrigger:focus-visible{
    color:var(--text);
}

.infoPopover{
    position:fixed;
    z-index:10000;
}

.infoPopover[hidden]{
    display:none !important;
}

.infoPopoverCard{
    width:min(320px, calc(100vw - 24px));
    background:var(--panel);
    color:var(--text);
    border:1px solid var(--line);
    border-radius:12px;
    box-shadow:var(--shadow);
    padding:12px;
}

.infoPopoverTitle{
    font-weight:900;
    margin-bottom:6px;
}

.infoPopoverBody{
    color:var(--muted);
    font-size:13px;
    line-height:1.45;
}
