/* GOODWOOD 360 — editorial base styles (ported from v2) */
  :root{
    --ink:#1a1a18; --mute:#9a9a95; --faint:#cfcfca; --line:#eceae6; --bg:#fff;
    --serif:Georgia,"Iowan Old Style","Times New Roman",serif;
    --sans:system-ui,-apple-system,"Segoe UI",sans-serif;
    /* Used only by the new admin-panel additions below (selection bar,
       "Rebuild manifest" emphasis, the incomplete-filter active state) —
       nothing on the visitor-facing page references these, so defining them
       cannot shift any existing color anywhere. */
    --accent:#9a6a3c; --accent-soft:rgba(154,106,60,.14); --accent-ink:#6e4b28;
    --logo:url("data:image/webp;base64,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");
  }
  *{box-sizing:border-box;}
  html,body{height:100%;}
  body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans);}

  /* flex-start (not center) so the header never shifts when content below it
     changes height (upload's back-home button, etc.) — centering the whole
     block against a variable-height child re-centers on every change,
     dragging the header along with it. */
  .app{min-height:100vh;display:flex;flex-direction:column;justify-content:flex-start;align-items:center;padding:32px 22px 16px;}
  /* .block sets the width of the HEADER and FOOTER, so it must NOT be tied to
     how much vertical room the stage has left — doing that visibly shortened
     the header on shorter windows. It keeps its original full width; the
     stage is constrained separately via .stagewrap below.
     (The old 108px padding-bottom was pure dead space — nothing sat in it, it
     just pushed the page into scrolling.) */
  .block{width:min(96vw,940px);padding-bottom:28px;position:relative;}

  .top{display:flex;justify-content:space-between;align-items:baseline;
       padding-bottom:14px;border-bottom:1px solid var(--line);animation:rise .6s ease both .05s;}
  .brand{display:flex;align-items:center;font-family:var(--sans);font-size:22px;font-weight:600;letter-spacing:-.005em;line-height:1;}
  .brand i{font-style:normal;font-family:var(--sans);font-size:10.5px;letter-spacing:.16em;
           text-transform:uppercase;color:var(--mute);margin-left:10px;vertical-align:middle;}
  /* Anchored to .block (flush with the header's own edges, same as the nav
     buttons in .top which sit flush too) rather than to .stage, whose own
     width shrinks on short windows — see the HTML comment above these
     elements. --stage-top-offset is published live by fitStageHeight() in
     viewer.js: the measured distance from .block's top to .stagewrap's top,
     so this still lines up with the top of the product image itself even
     though it's no longer a descendant of .stage.
     Deliberately NOT uppercase, unlike the rest of the chrome: this is a
     product path, and SKUs like Terra1Seater-NT-SUN_Bluebay_080 get much
     harder to read shouted in caps. max-width stops a long path from running
     underneath the badge. */
  .crumb{position:absolute;top:calc(var(--stage-top-offset,86px) + 14px);left:0;z-index:3;
         max-width:calc(50% - 40px);
         display:flex;align-items:center;gap:6px;min-width:0;
         font-family:var(--sans);font-size:11.5px;letter-spacing:.01em;
         text-transform:none;color:var(--mute);line-height:26px;
         /* Matches .top/.stagewrap's entrance fade — without this it popped
            in instantly while everything around it eased in, which read as
            a glitch on refresh. Safe to animate transform here: this only
            moves .crumb itself, not .stagewrap, so it can't reintroduce the
            --stage-top-offset measurement bug (that was about measuring
            .stagewrap mid-animation, not .crumb). */
         animation:rise .6s ease both .2s;}
  .crumb-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
         /* Selectable on purpose (unlike the rest of this decorative overlay
            chrome) — the path/SKU here is exactly the kind of text a visitor
            wants to copy. pointer-events:auto only affects this element; the
            stage underneath is untouched since .crumb sits in the gap above
            it, not over the product image. */
         pointer-events:auto;cursor:text;user-select:text;-webkit-user-select:text;}
  /* Reuses the same visual language as .stage-icon-btn (26px circle) but
     smaller, since it sits inline with 11.5px breadcrumb text rather than
     alone in a stage corner. flex:none so a long path never squeezes it. */
  .crumb-share{flex:none;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;
         width:20px;height:20px;border:1px solid var(--line);border-radius:999px;
         background:rgba(255,255,255,.7);color:var(--faint);cursor:pointer;padding:0;
         pointer-events:auto;transition:color .15s,border-color .15s,background .15s;}
  .crumb-share:hover{color:var(--ink);border-color:var(--ink);background:#fff;}
  .crumb-share:active{background:#f1f1ef;}
  .actions{display:flex;gap:20px;}
  .ctl{font-family:var(--sans);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;
       color:var(--mute);background:none;border:0;padding:0;cursor:pointer;transition:color .2s;}
  .ctl:hover{color:var(--ink);}
  .res{display:flex;align-items:baseline;justify-content:center;gap:9px;}
  .res-lbl{font-family:var(--sans);font-size:9px;letter-spacing:.18em;text-transform:uppercase;color:var(--faint);margin-right:4px;}
  .res-opt{font-family:var(--sans);font-size:10px;letter-spacing:.06em;color:var(--mute);
           background:none;border:0;padding:0 0 2px;cursor:pointer;transition:color .2s;border-bottom:1px solid transparent;}
  .res-opt:hover{color:var(--ink);}
  .res-opt.active{color:var(--ink);border-bottom-color:var(--ink);}
  .res-sep{color:var(--faint);font-size:9px;}

  /* .stage has no independent height by design (aspect-ratio:1/1 + height:auto
     further down), so its WIDTH governs the rendered height. Capping the wrap
     here shrinks the product to fit the room that actually exists — measured
     live by fitStageHeight() in js/viewer.js — without touching the header. */
  .stagewrap{display:flex;justify-content:center;animation:rise .7s ease both .16s;
             width:min(100%,var(--stage-vh,80vh));margin-left:auto;margin-right:auto;}
  .stage-row{display:flex;gap:16px;align-items:flex-start;width:100%;justify-content:center;}
  .stage-row .stage{flex:1;min-width:0;}
  .stage{position:relative;
         width:calc(100% + 2 * var(--stage-overhang, 72px));
         max-width:none;
         margin-left:calc(-1 * var(--stage-overhang, 72px));
         margin-right:calc(-1 * var(--stage-overhang, 72px));
         height:min(96vw,80vh,940px);            /* keep vertical size exactly as before */
         background:var(--bg);
         overflow:hidden;cursor:grab;touch-action:none;user-select:none;}
  .stage.dragging{cursor:grabbing;}
  /* fullscreen: full viewport, centered, no horizontal overhang */
  .stage:fullscreen{width:100vw;height:100vh;margin:0;background:var(--bg);display:flex;align-items:center;justify-content:center;}
  .stage:fullscreen #frame{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;
                           transform:scale(var(--fs-scale,0.92))!important;}
  #frame{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;
         pointer-events:none;transform-origin:center center;will-change:transform;}
  .loader{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:var(--bg);}
  .loader-box{display:flex;flex-direction:column;align-items:center;gap:12px;width:min(220px,60%);}
  .loader-box span{font-size:10.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--mute);}
  .loader-bar{width:100%;height:2px;background:var(--line);border-radius:2px;overflow:hidden;}
  .loader-bar i{display:block;height:100%;width:0;background:var(--ink);border-radius:2px;
                transition:width .2s ease;}
  .loader-pct{font-style:normal;font-size:9px;letter-spacing:.16em;color:var(--faint);
              font-variant-numeric:tabular-nums;}

  /* fabric / resolution row — always reserves the same vertical space so the layout never shifts */
  /* fabric / resolution row — disabled in favor of the Library (apply flow) */
  .config{display:none !important;}
  .swatches{display:flex;flex-wrap:wrap;justify-content:center;gap:14px;max-width:100%;}
  .swatch{width:30px;height:30px;border-radius:50%;padding:0;border:1px solid rgba(0,0,0,.12);
          cursor:pointer;flex:none;background:#e9e7e2;transition:transform .18s,box-shadow .18s;}
  .swatch:hover{transform:translateY(-2px);}
  .swatch.active{box-shadow:0 0 0 1.5px var(--bg),0 0 0 3px var(--ink);}
  .swatch.loading{animation:pulse 1s ease-in-out infinite;}
  .fabric-name{font-size:12px;letter-spacing:.02em;color:var(--ink);min-height:14px;}

  .bottom{display:flex;align-items:center;padding-top:14px;margin-top:16px;border-top:1px solid var(--line);
          animation:rise .6s ease both .26s;}
  .label{font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);white-space:nowrap;}
  .num{color:var(--ink);font-variant-numeric:tabular-nums;}
  .prog{flex:1;height:1px;background:var(--line);position:relative;margin:0 24px;}
  .prog i{position:absolute;left:0;top:0;height:1px;background:var(--ink);width:0;}
  .panel{width:min(96vw,80vh,940px);margin-top:16px;font-size:12.5px;color:#c92a2a;text-align:center;line-height:1.6;display:none;}
  .back-home{display:block;margin:8px 0;font-family:var(--sans);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;
             color:var(--mute);background:none;border:0;padding:0;cursor:pointer;transition:color .2s;
             animation:rise .6s ease both .26s;}
  .back-home[hidden]{display:none;}
  .back-home:hover{color:var(--ink);}
  /* .aftermath used to wrap the version on its own row below the footer; the
     version moved INTO .bottom, and dropping that row is part of what gives
     the product its height back. Rule kept harmless in case of stale markup. */
  .aftermath{display:none;}
  .bottom .version{margin-left:18px;flex:none;}
  .version{font-family:var(--sans);font-size:9px;letter-spacing:.2em;text-transform:uppercase;color:var(--faint);}

  /* uploader overlay */
  .uploader{position:fixed;inset:0;background:var(--bg);z-index:50;display:none;
            flex-direction:column;align-items:center;justify-content:center;padding:24px;}
  .uploader.show{display:flex;}
  .up-card{width:min(92vw,540px);text-align:center;}
  .up-title{font-family:var(--sans);font-size:18px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;margin:0 0 8px;}
  .up-sub{color:var(--mute);font-size:13px;margin:0 0 24px;line-height:1.5;}
  .dropzone{border:1.5px dashed #d9d8d2;border-radius:18px;padding:42px 26px;transition:.2s;}
  .dropzone.over{border-color:var(--ink);background:#fafaf8;}
  .dz-text{font-size:13px;color:var(--mute);margin:0 0 20px;}
  .up-actions{display:flex;gap:12px;justify-content:center;flex-wrap:wrap;}
  .btn{font:inherit;font-size:12px;letter-spacing:.06em;padding:11px 18px;border:1px solid var(--ink);
       border-radius:10px;background:var(--ink);color:#fff;cursor:pointer;}
  .btn.secondary{background:#fff;color:var(--ink);}
  .up-hint{font-size:11px;color:var(--faint);margin:20px 0 0;line-height:1.6;}
  .up-close{margin-top:22px;font-family:var(--sans);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);
            background:none;border:0;cursor:pointer;}

  /* library overlay */
  /* library as a left side panel */
  .library{position:fixed;top:0;bottom:0;left:0;width:min(92vw,560px);background:var(--bg);z-index:60;
           display:flex;flex-direction:column;padding:26px 24px 20px;
           border-right:1px solid var(--line);box-shadow:0 0 40px rgba(0,0,0,.05);
           transform:translateX(-102%);transition:transform .3s ease;}
  .library.show{transform:translateX(0);}
  /* panel overlays the page — the product stays exactly where it is */
  .lib-head{display:flex;align-items:baseline;justify-content:space-between;
            border-bottom:1px solid var(--line);padding-bottom:14px;}
  .lib-title{font-family:var(--sans);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink);}
  .lib-title small{font-family:var(--sans);font-size:9.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);margin-left:10px;}
  .lib-close{font-family:var(--sans);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);background:none;border:0;cursor:pointer;}
  .lib-close:hover{color:var(--ink);}
  .lib-hint{margin:12px 0 8px;font-family:var(--sans);font-size:10.5px;letter-spacing:.01em;color:var(--mute);line-height:1.55;}
  .lib-search-wrap{margin:0 0 10px;}
  .lib-search{width:100%;box-sizing:border-box;font-family:var(--sans);font-size:12px;color:var(--ink);
              border:1px solid var(--line);border-radius:999px;background:#fff;padding:7px 14px;outline:none;
              transition:border-color .2s;}
  .lib-search:focus{border-color:var(--ink);}
  .lib-tree{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;padding:6px 0 12px;
            font-family:var(--sans);font-size:12.5px;line-height:1.3;}

  /* plain grouping folders (product root + fabric folders) — file-tree rows */
  .lib-row{position:relative;display:flex;align-items:center;gap:7px;padding:6px 4px;border-radius:6px;
           cursor:pointer;white-space:nowrap;color:var(--ink);}
  .lib-row:hover{background:#f5f5f3;}
  .lib-row .tw{color:#c4c4be;white-space:pre;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;}
  .lib-row .ic{flex:none;display:inline-flex;}
  .lib-row .nm{overflow:hidden;text-overflow:ellipsis;}
  .lib-fabric-row .nm{font-weight:400;}
  .lib-fabric-row .fb-dot{margin-left:8px;flex:none;width:7px;height:7px;border-radius:50%;background:#16a34a;
                          box-shadow:0 0 0 3px rgba(22,163,74,.15);display:none;}
  .lib-fabric-row.has-live .fb-dot{display:inline-block;}
  /* collection (depth 0) reads as a header; nested product folders stay lighter */
  .lib-fabric-row.depth-0{font-weight:600;font-size:12.5px;letter-spacing:.01em;
                          padding:9px 4px;margin-top:2px;}
  .lib-fabric-row.depth-0 .nm{font-weight:600;}

  /* a 360 set folder — full-width rounded chip, click it to load. Smaller than the fabric folders above. */
  .lib-set{display:flex;align-items:center;gap:9px;margin:3px 0;padding:8px 11px;
           border:1px solid var(--line);border-radius:9px;background:#fafafa;cursor:pointer;
           font-size:11px;transition:border-color .15s,background .15s,box-shadow .15s;}
  .lib-set:hover{background:#f1f1ef;border-color:#cccbc4;}
  /* wrapper that puts a monospace tree-connector to the left of a set chip */
  .lib-setrow{display:flex;align-items:center;gap:0;margin:3px 0;}
  .lib-setrow .tw{color:#c4c4be;white-space:pre;flex:none;align-self:center;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;}
  .lib-setrow .lib-set{flex:1;min-width:0;margin:0;}
  .lib-set .ic{flex:none;display:inline-flex;}
  .lib-set .set-name{font-weight:400;font-size:11px;letter-spacing:.01em;color:var(--mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .lib-set .set-meta{margin-left:auto;flex:none;font-family:var(--sans);font-size:8.5px;letter-spacing:.14em;
                     text-transform:uppercase;color:var(--faint);}
  .lib-set .res-dot{flex:none;width:7px;height:7px;border-radius:50%;background:#d0d0ca;transition:background .15s,box-shadow .15s;}
  /* loaded state — monochrome card + green dot; meta text stays gray */
  .lib-set.live{background:#f3f3f1;border-color:#b6b6b0;box-shadow:0 0 0 1px #c4c4be;cursor:default;}
  .lib-set.live:hover{background:#f3f3f1;}
  .lib-set.live .res-dot{background:#16a34a;box-shadow:0 0 0 3px rgba(22,163,74,.18);}
  .lib-set.live .set-name{color:var(--ink);}
  .lib-set.live .set-meta{color:var(--mute);}

  /* peek (show / hide frames) button — folder icon, no border box */
  .set-peek{flex:none;width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;
            border:0;border-radius:6px;background:none;color:#9a9a95;cursor:pointer;
            transition:background .15s,color .15s;}
  .set-peek:hover{background:rgba(0,0,0,.05);color:var(--ink);}
  .lib-set.open .set-peek{color:var(--ink);}

  /* frame list revealed by peek */
  .lib-frames{display:none;margin:0 0 6px 22px;padding:4px 0 6px;border-left:1px solid var(--line);}
  .lib-frames.open{display:block;}
  .lib-frame{display:flex;align-items:center;gap:8px;padding:4px 10px;border-radius:5px;cursor:pointer;
             font-size:11px;color:var(--faint);}
  .lib-frame:hover{background:#f5f5f3;color:var(--mute);}
  .lib-frame .ic{flex:none;display:inline-flex;opacity:.6;}
  .lib-empty{color:var(--mute);font-size:12px;text-align:center;padding:30px;font-family:var(--sans);}

  /* pin toggle on each set chip */
  .set-pin{flex:none;width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;
           border:0;border-radius:6px;background:none;color:#c4c4be;cursor:pointer;
           transition:background .15s,color .15s;}
  .set-pin:hover{background:rgba(0,0,0,.05);color:var(--ink);}
  .set-pin.pinned{color:var(--ink);}

  /* pinned · quick access (session only — cleared on refresh) */
  .lib-pinned{flex:none;margin:2px 0 10px;border:1px solid var(--line);border-radius:10px;
              background:#fff;padding:10px 12px 8px;max-height:30vh;overflow:auto;min-height:0;}
  .lib-pinned-title{font-family:var(--sans);font-size:9px;letter-spacing:.18em;text-transform:uppercase;
                    color:var(--mute);padding-bottom:6px;border-bottom:1px solid var(--line);margin-bottom:4px;}
  .qa-row{display:flex;align-items:center;gap:9px;padding:6px 4px;border-radius:6px;cursor:pointer;
          font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;color:var(--mute);}
  .qa-row:hover{background:#f5f5f3;color:var(--ink);}
  .qa-row.live{color:var(--ink);cursor:default;}
  .qa-row .res-dot{flex:none;width:7px;height:7px;border-radius:50%;background:#d0d0ca;}
  .qa-row.live .res-dot{background:#16a34a;box-shadow:0 0 0 3px rgba(22,163,74,.18);}
  .qa-row .nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .qa-row .ctx{margin-left:auto;flex:none;font-family:var(--sans);font-size:8.5px;letter-spacing:.12em;
               text-transform:uppercase;color:var(--faint);max-width:38%;overflow:hidden;
               text-overflow:ellipsis;white-space:nowrap;}
  .qa-unpin{flex:none;width:20px;height:20px;display:inline-flex;align-items:center;justify-content:center;
            border:0;border-radius:5px;background:none;color:#c4c4be;cursor:pointer;font-size:12px;line-height:1;
            transition:background .15s,color .15s;}
  .qa-unpin:hover{background:rgba(0,0,0,.06);color:var(--ink);}

  /* library footer — now just a status line + close */
  .lib-foot{padding-top:14px;border-top:1px solid var(--line);
            display:flex;align-items:center;justify-content:flex-end;gap:12px;}
  .lib-status{font-family:var(--sans);font-size:10px;letter-spacing:.04em;color:var(--mute);
              overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;}
  .lib-status b{color:#16a34a;font-weight:600;}
  .lib-actions{display:flex;gap:8px;justify-content:flex-end;flex:none;}
  .lib-btn{font:inherit;font-size:10px;letter-spacing:.1em;text-transform:uppercase;padding:8px 16px;
           border-radius:7px;cursor:pointer;transition:background .2s,color .2s,border-color .2s,opacity .2s;}
  .lib-cancel{background:none;border:1px solid var(--line);color:var(--mute);}
  .lib-cancel:hover{color:var(--ink);border-color:var(--ink);}

  @keyframes rise{from{opacity:0;transform:translateY(9px);}to{opacity:1;transform:none;}}
  @keyframes pulse{0%,100%{opacity:1;}50%{opacity:.4;}}

  .maint-banner{position:fixed;top:0;left:0;right:0;z-index:150;background:#3a2f1f;color:#f6ecd8;
    font-family:var(--sans);font-size:11.5px;text-align:center;padding:9px 16px;letter-spacing:.01em;}
  /* The banner is position:fixed with no compensating offset, so when it's on
     it covered the header/nav row — the visitor could not click Library/
     Upload/Fullscreen at all. */
  body.has-maint .app{padding-top:66px;}

  /* toast — slides in at the top-right when a set is loaded */
  .toast{position:fixed;right:28px;top:24px;bottom:auto;left:auto;transform:translateX(24px);
         background:var(--ink);color:#fff;font-family:var(--sans);font-size:11px;letter-spacing:.04em;
         padding:11px 16px;border-radius:10px;max-width:calc(100vw - 56px);text-align:left;
         display:flex;align-items:center;gap:9px;white-space:nowrap;
         pointer-events:none;opacity:0;transition:opacity .25s ease,transform .25s ease;z-index:200;
         box-shadow:0 8px 28px rgba(0,0,0,.22);}
  .toast.show{opacity:1;transform:translateX(0);}
  .toast .toast-lead{flex:none;font-weight:600;text-transform:uppercase;letter-spacing:.12em;font-size:9px;color:#cfcfca;}
  .toast .toast-path{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:11px;color:#fff;}

  /* brand logo (single embedded asset, reused in both screens) */
  .brand-logo{height:22px;aspect-ratio:1500/174;background:var(--logo) left center/contain no-repeat;}
  .gate-logo{height:30px;aspect-ratio:1500/174;background:var(--logo) center/contain no-repeat;margin:0 auto 8px;}

  /* password gate */
  .gate{position:fixed;inset:0;background:var(--bg);z-index:100;display:flex;align-items:center;justify-content:center;padding:24px;}
  .gate-card{width:min(90vw,360px);text-align:center;}
  .gate-title{font-family:var(--sans);font-size:24px;margin-bottom:6px;}
  .gate-sub{font-size:10.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--mute);margin-bottom:24px;}
  .gate input{width:100%;font:inherit;font-size:14px;padding:12px 14px;border:1px solid var(--line);
              border-radius:10px;text-align:center;letter-spacing:.1em;outline:none;margin-bottom:12px;}
  .gate input:focus{border-color:var(--ink);}
  .gate .btn{width:100%;}
  .gate-err{margin-top:14px;font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:#c92a2a;opacity:0;transition:opacity .2s;}

  /* =====================  MOBILE  =====================
     Everything below only applies on narrow screens; the desktop layout
     above is left exactly as-is.                                          */
  @media (max-width:720px){
    .app{padding:28px 14px 14px;}
    .block{width:100%;padding-bottom:24px;}

    /* header: brand on top, nav row beneath, both centered */
    .top{flex-direction:column;align-items:center;gap:10px;padding-bottom:12px;text-align:center;}
    .brand{flex-direction:column;align-items:center;font-size:18px;}
    .brand i{display:block;margin-left:0;margin-top:6px;font-size:9px;}
    .actions{gap:8px;row-gap:10px;flex-wrap:wrap;justify-content:center;}
    /* real tap targets: the desktop version is text-only with zero padding
       (13px tall) — comfortable on a mouse, error-prone on a finger. Pad
       each button out to a proper touch-friendly size instead. */
    .ctl{font-size:11px;padding:10px 12px;min-height:40px;display:inline-flex;align-items:center;}

    /* stage: drop the big horizontal overhang so nothing bleeds off-screen,
       and use a square-ish area that fits the phone width */
    .stage{--stage-overhang:0px;width:100%;margin-left:0;margin-right:0;
           height:min(86vw,62vh);}
    /* .block has no horizontal padding, so left:0/right:0 would sit flush
       against the screen edge on a phone — keep a small inset here. */
    .stage-topright{right:14px;}
    .crumb{left:14px;max-width:calc(100% - 28px - 62px);font-size:10.5px;}
    .fill-chip{left:14px;top:calc(var(--stage-top-offset,58px) + 14px + 30px);}

    /* bottom bar: smaller, tighter */
    .bottom{padding-top:12px;margin-top:14px;flex-wrap:wrap;row-gap:10px;}
    .label{font-size:9px;letter-spacing:.12em;}
    .prog{margin:0 12px;}
    .spin-btn{width:36px;height:36px;}         /* 28px was under the ~40px comfortable tap size */
    .spin-btn svg{width:13px;height:13px;}

    /* library becomes a full-width sheet */
    .library{width:100vw;max-width:100vw;padding:20px 16px 16px;}
    .lib-set{padding:9px 11px;}
    .lib-set .set-name{font-size:11px;}
    .lib-row{padding:10px 4px;}                /* taller rows = easier to tap the right one */
    .lib-search{padding:10px 14px;}            /* match the 40px-ish touch target used elsewhere */

    /* uploader + gate fit the screen */
    .up-card{width:92vw;}
    .up-title{font-size:15px;}
    .dropzone{padding:30px 16px;}
    .up-actions{flex-direction:column;}
    .btn{width:100%;}

    /* toast spans the top neatly instead of overflowing */
    .toast{right:12px;left:12px;top:12px;max-width:none;white-space:normal;font-size:10.5px;}
    .toast .toast-path{white-space:normal;word-break:break-word;}
  }

  /* very small phones — shave a little more */
  @media (max-width:380px){
    .actions{gap:16px;}
    .ctl{font-size:10px;letter-spacing:.12em;}
    .stage{height:min(92vw,58vh);}
  }

/* ============================================================================
   v3 ADDITIONS — hardened gate polish, viewer controls, fullscreen library,
   admin panel. Same editorial language: white, hairlines, serif accents.
   ========================================================================== */

/* ---- motion safety ---- */
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important;}
}

/* ---- gate refinements ---- */
.gate.gate-out{opacity:0;transition:opacity .4s ease;}
.gate.shake .gate-card{animation:gwshake .4s ease;}
@keyframes gwshake{20%{transform:translateX(-7px)}40%{transform:translateX(6px)}60%{transform:translateX(-4px)}80%{transform:translateX(2px)}}

/* ---- stage extras ---- */
.stage{aspect-ratio:1/1;height:auto;touch-action:none;}
.stage.zoomed{cursor:move;}
/* Reverted per feedback: the shimmer skeleton was more distracting than
   helpful during product switches — plain white while loading (with the
   existing spinner/percentage overlay) reads as calmer and closer to how
   this looked before. The .stage-empty class is still toggled by
   viewer.js, just no longer styled, so no JS change was needed. */
.stage img,.stage canvas{will-change:transform;}
.drag-hint{position:absolute;left:50%;bottom:18px;transform:translateX(-50%);
  display:flex;align-items:center;gap:9px;pointer-events:none;color:var(--mute);
  font-family:var(--sans);font-size:10px;letter-spacing:.16em;text-transform:uppercase;
  opacity:0;animation:hintIn .8s ease 1.2s forwards;}
.drag-hint svg{width:30px;height:16px;stroke:var(--mute);}
.drag-hint.gone{animation:none;opacity:0;transition:opacity .5s ease;}
@keyframes hintIn{to{opacity:1}}
/* Anchored to .block, same as .crumb above — flush with the header's own
   right edge (where the nav buttons in .top already sit), independent of
   .stage's own width. z-index:3 (matching .crumb) is required here: .stagewrap
   forms its own stacking context (its `rise` animation touches `transform`),
   and without an explicit z-index this element — despite coming earlier in
   the DOM — painted BEHIND that stacking context, i.e. behind the product
   image, making the badge invisible. */
.stage-topright{position:absolute;top:calc(var(--stage-top-offset,86px) + 14px);right:0;z-index:3;
  display:flex;align-items:center;gap:8px;
  /* Matches .crumb's entrance fade (see its comment) so the two corners
     appear together instead of the badge popping in with no transition. */
  animation:rise .6s ease both .2s;}
.badge-360{box-sizing:border-box;height:26px;display:inline-flex;align-items:center;
  font-family:var(--sans);font-size:9.5px;letter-spacing:.14em;color:var(--faint);
  border:1px solid var(--line);border-radius:999px;padding:0 10px;pointer-events:none;
  background:rgba(255,255,255,.7);}
.stage-icon-btn{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;
  width:26px;height:26px;border:1px solid var(--line);border-radius:999px;
  background:rgba(255,255,255,.7);color:var(--faint);cursor:pointer;padding:0;
  transition:color .15s,border-color .15s,background .15s;}
.stage-icon-btn:hover{color:var(--ink);border-color:var(--ink);background:#fff;}
.stage-icon-btn:active{background:#f1f1ef;}
/* Sits directly UNDER the breadcrumb, sharing its left edge (now .block's
   edge, same anchor as .crumb above). The crumb's line box is 26px tall, so
   +34px clears it with a little breathing room. Same stacking-context issue
   as .stage-topright above — needs an explicit z-index or .stagewrap paints
   over it. */
.fill-chip{position:absolute;top:calc(var(--stage-top-offset,86px) + 14px + 34px);left:0;z-index:3;font-family:var(--sans);font-size:9px;
  letter-spacing:.14em;text-transform:uppercase;color:var(--mute);border:1px solid var(--line);
  border-radius:999px;padding:4px 9px;background:rgba(255,255,255,.75);
  opacity:0;transition:opacity .3s;pointer-events:none;}
  /* Deliberately NOT given the .crumb/.stage-topright entrance animation:
     unlike those two (always on screen, animate once at load), this chip's
     own visibility is show/hide-toggled by JS — and it most often FIRST
     appears while a product's frames are still loading, i.e. within that
     same ~0.8s entrance window right after page load. Adding a .6s slide-in
     on top of its own .3s opacity fade made "processing" visibly take
     longer to look settled than before, right when it's most likely seen. */
.fill-chip.show{opacity:1;}
.ctl.on{color:var(--ink);border-bottom:1px solid var(--ink);}

/* pseudo-fullscreen (iPhone Safari has no element fullscreen) */
body.pseudo-full{overflow:hidden;}
/* .stagewrap animates `transform` (@keyframes rise) with fill-mode `both`,
   which makes it a CONTAINING BLOCK for position:fixed descendants. That broke
   pseudo-fullscreen twice over: the stage's width:calc(100% + overhang)
   resolved against the wrap (so "fullscreen" was only ~1075px wide), and even
   top/left:0 anchored to the wrap's corner instead of the screen's. Killing
   the animation here removes the containing block so the stage can anchor to
   the viewport properly; the viewport units then guarantee full coverage. */
body.pseudo-full .stagewrap,
body.pseudo-full .stage-row{animation:none;transform:none;}
body.pseudo-full .stage{position:fixed;top:0;left:0;z-index:60;background:#fff;
  width:100vw;width:100dvw;height:100vh;height:100dvh;
  margin:0;aspect-ratio:auto;border:0;}
.stage:fullscreen{background:#fff;}

/* .crumb/.stage-topright/.fill-chip are now children of .block (see index.html
   comment), so pseudo-fullscreen — which hides everything except .stage —
   would otherwise hide them too. Switch them to viewport-fixed corners,
   above the stage's z-index:60, so they stay visible over the fullscreen
   image exactly like before. */
body.pseudo-full .crumb, body.pseudo-full .stage-topright, body.pseudo-full .fill-chip{
  position:fixed;z-index:61;}
body.pseudo-full .crumb{top:14px;left:14px;max-width:calc(50vw - 40px);}
body.pseudo-full .stage-topright{top:14px;right:14px;}
body.pseudo-full .fill-chip{top:48px;left:14px;}

/* ---- spin controls (in the bottom bar) ---- */
.spin-controls{display:flex;align-items:center;gap:8px;flex:none;}
.spin-btn{width:28px;height:28px;border-radius:50%;border:1px solid var(--line);
  background:#fff;color:var(--mute);display:inline-flex;align-items:center;justify-content:center;
  cursor:pointer;padding:0;transition:color .2s,border-color .2s,background .2s;}
.spin-btn svg{width:10px;height:10px;fill:currentColor;}
.spin-btn:hover{color:var(--ink);border-color:#c9c8c1;}
.spin-btn.on{background:var(--ink);border-color:var(--ink);color:#fff;}
.spin-btn:focus-visible{outline:1.5px solid var(--ink);outline-offset:2px;}

/* ============================================================================
   YSA — admin panel  (design matches the viewer: same tokens, same feel)
   ========================================================================== */

body.ysa-body{background:var(--bg);color:var(--ink);}
.ysa-page{min-height:100vh;display:flex;flex-direction:column;
  padding:22px 22px 0;max-width:1080px;margin:0 auto;}
.ysa-top{padding-top:2px;}
.ysa-main{flex:1;padding:32px 0 60px;display:flex;flex-direction:column;gap:22px;}
.ysa-bottom{max-width:1080px;margin:0 auto;padding:14px 22px 22px;width:calc(100% - 44px);
  display:flex;justify-content:space-between;align-items:baseline;
  font-family:var(--sans);font-size:9.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);
  border-top:1px solid var(--line);}
.ysa-bottom .num{color:var(--faint);}
/* The rule above's `margin:0 auto` silently zeroed the intended 22px top
   margin, and its width calc double-counted .ysa-page's own padding —
   leaving the footer 44px narrower than every card above it. */
.ysa-bottom{width:100%;max-width:none;margin:22px auto 0;padding:14px 0 22px;}

/* The "← Viewer" link in the admin header rendered underlined next to
   identical-looking .ctl buttons. */
.ctl{text-decoration:none;}

.ysa-card{background:#fff;border:1px solid var(--line);border-radius:12px;padding:22px 24px;
  animation:rise .5s ease both;}
.ysa-card + .ysa-card{margin-top:0;}
.ysa-h{font-family:var(--sans);font-size:18px;font-weight:400;margin:0 0 6px;letter-spacing:.005em;}
.ysa-card-head{display:flex;justify-content:space-between;align-items:baseline;gap:16px;flex-wrap:wrap;margin-bottom:2px;}
.ysa-card-tools{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.ysa-p{font-family:var(--sans);font-size:12.5px;color:var(--mute);line-height:1.8;margin:0 0 14px;}
.ysa-p-sub{margin:6px 0 18px;}
.ysa-p b{color:var(--ink);font-weight:600;}
.ysa-p code{font-size:11.5px;background:#f4f4f2;border:1px solid var(--line);border-radius:4px;padding:1px 6px;}
.ysa-hint{font-family:var(--sans);font-size:11px;color:var(--faint);line-height:1.75;margin:10px 0 0;}
.ysa-hint b{color:var(--mute);}

/* form field */
.ysa-fld{display:flex;flex-direction:column;gap:6px;margin-bottom:12px;}
.ysa-fld label{font-family:var(--sans);font-size:9px;letter-spacing:.18em;text-transform:uppercase;color:var(--mute);}
.ysa-fld input,.ysa-fld select{font-family:var(--sans);font-size:13px;color:var(--ink);
  border:1px solid var(--line);border-radius:8px;padding:10px 12px;background:#fff;outline:none;
  transition:border-color .2s;}
.ysa-fld input:focus,.ysa-fld select:focus{border-color:var(--ink);}
.ysa-fld-row{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px 14px;}
@media (max-width:720px){.ysa-fld-row{grid-template-columns:1fr;}}

/* buttons */
.ysa-btn{font-family:var(--sans);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;
  background:none;border:1px solid var(--line);color:var(--ink);border-radius:999px;
  padding:10px 20px;cursor:pointer;transition:background .18s,color .18s,border-color .18s,opacity .18s;}
.ysa-btn:hover{border-color:var(--ink);}
.ysa-btn:disabled{opacity:.35;cursor:default;border-color:var(--line);}
.ysa-btn-primary{background:var(--ink);color:#fff;border-color:var(--ink);}
.ysa-btn-primary:hover{opacity:.86;border-color:var(--ink);}
.ysa-btn-primary:disabled{background:#c9c8c1;border-color:#c9c8c1;color:#fff;}
.ysa-btn-ghost{color:var(--mute);border-color:var(--line);}
.ysa-btn-ghost:hover{color:var(--ink);}
.ysa-btn-danger{color:#8d3b3b;border-color:#dcc6c6;}
.ysa-btn-danger:hover{background:#faf3f3;border-color:#c99d9d;color:#8d3b3b;}
.ysa-btn-primary.ysa-btn-danger{background:#8d3b3b;color:#fff;border-color:#8d3b3b;}
.ysa-btn-mini{padding:6px 12px;font-size:9px;}

/* login card */
.ysa-login{max-width:400px;margin:8vh auto 0;}
.ysa-login .ysa-btn{margin-top:6px;}

/* messages */
.ysa-msg{font-family:var(--sans);font-size:11px;color:var(--mute);margin:0;min-height:16px;line-height:1.7;}
.ysa-msg-err{color:#8d3b3b;}
.ysa-msg-ok{color:#2f7a4f;}

/* storage indicator */
.ysa-usage{background:#fff;border:1px solid var(--line);border-radius:12px;padding:14px 18px;
  animation:rise .5s ease both;}
.ysa-usage-row{display:flex;justify-content:space-between;align-items:baseline;
  font-family:var(--sans);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);}
.ysa-usage-label{color:var(--ink);font-weight:600;}
.ysa-usage-num{color:var(--ink);letter-spacing:.06em;text-transform:none;font-size:12px;}
.ysa-usage-track{height:4px;background:var(--line);border-radius:99px;overflow:hidden;margin:9px 0 8px;}
.ysa-usage-track i{display:block;height:100%;width:0;background:var(--ink);border-radius:99px;transition:width .3s ease;}
.ysa-usage-track i.warn{background:#c69028;}
.ysa-usage-track i.crit{background:#8d3b3b;}
.ysa-usage-meta{font-size:9.5px;letter-spacing:.14em;color:var(--faint);}

/* dropzone */
.ysa-drop{border:1.5px dashed var(--faint);border-radius:14px;padding:44px 24px;text-align:center;
  cursor:pointer;transition:border-color .2s,background .2s;background:#fdfdfc;}
.ysa-drop:hover,.ysa-drop.over{border-color:var(--ink);background:#faf9f6;}
.ysa-drop-icon{color:var(--faint);margin-bottom:12px;transition:color .2s;}
.ysa-drop:hover .ysa-drop-icon,.ysa-drop.over .ysa-drop-icon{color:var(--ink);}
.ysa-drop-lead{font-family:var(--sans);font-size:15.5px;color:var(--ink);margin-bottom:6px;}
.ysa-drop-sub{font-family:var(--sans);font-size:11.5px;color:var(--mute);line-height:1.7;}
.ysa-drop-sub b{color:var(--ink);font-weight:600;}
.ysa-drop-actions{text-align:center;margin-top:10px;}

/* detected plan */
.ysa-plan{margin-top:18px;border:1px solid var(--line);border-radius:10px;padding:14px 16px;background:#fbfbfa;}
.ysa-plan-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:10px;gap:12px;}
.ysa-plan-title{font-family:var(--sans);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink);}
.ysa-plan-body{font-family:var(--sans);font-size:12px;color:var(--ink);max-height:280px;overflow:auto;padding-right:4px;}
.ysa-plan-col{margin-top:8px;color:var(--ink);}
.ysa-plan-col:first-child{margin-top:0;}
.ysa-plan-caret{color:var(--faint);}
.ysa-plan-prod{margin-left:16px;color:var(--mute);padding:4px 0;font-size:11.5px;}
.ysa-plan-var{margin-left:32px;padding:5px 8px;display:flex;flex-wrap:wrap;align-items:baseline;gap:10px;
  border-radius:6px;font-size:11.5px;}
.ysa-plan-var:hover{background:rgba(0,0,0,.02);}
.ysa-plan-var-name{color:var(--ink);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ysa-plan-var-meta{font-size:10px;letter-spacing:.06em;color:var(--faint);flex:none;}
.ysa-plan-var-meta em{color:#2f7a4f;font-style:normal;}
.ysa-plan-var-warn{flex:none;font-size:9px;letter-spacing:.12em;text-transform:uppercase;color:#8d3b3b;}
.ysa-plan-var.incomplete{background:rgba(141,59,59,.04);}
.ysa-plan-strip{flex-basis:100%;display:flex;gap:4px;margin-top:4px;}
.ysa-plan-strip img{width:38px;height:38px;object-fit:cover;border-radius:4px;border:1px solid var(--line);background:#f4f4f2;}
.ysa-trash{border-color:rgba(141,59,59,.25);}
.ysa-trash .ysa-p-sub{margin:0;}
.ysa-trash-list{margin-top:10px;border-top:1px solid var(--line);}
.ysa-trash-row{display:flex;align-items:center;gap:10px;padding:8px 4px;border-bottom:1px solid var(--line);
  font-family:var(--sans);font-size:12px;}
.ysa-trash-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink);}
.ysa-trash-meta{flex:none;font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--mute);}

.ysa-error-list{margin-top:10px;max-height:280px;overflow:auto;border-top:1px solid var(--line);}
.ysa-error-row{display:flex;flex-wrap:wrap;gap:4px 10px;padding:8px 4px;border-bottom:1px solid var(--line);
  font-family:var(--sans);font-size:11.5px;}
.ysa-error-time{flex:none;color:var(--mute);font-size:10px;}
.ysa-error-msg{flex:1;min-width:200px;color:#8d3b3b;}
.ysa-error-url{flex-basis:100%;color:var(--faint);font-size:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

/* Selection status bar — ticking a checkbox used to give no feedback until
   you clicked a row's Rename/Delete button; this surfaces the count and the
   bulk actions as soon as anything is selected. Warm accent tokens (additive
   — nothing else on this page used --accent before, so this cannot shift any
   existing color anywhere). */
.ysa-selection-bar{display:none;align-items:center;gap:10px;margin-top:10px;padding:9px 14px;
  background:var(--accent-soft,#f5ede2);border:1px solid var(--accent,#9a6a3c);border-radius:10px;
  font-family:var(--sans);font-size:12px;color:var(--accent-ink,#6b4726);}
.ysa-selection-bar.show{display:flex;}
.ysa-selection-bar span{font-weight:600;margin-right:auto;}
#filterIncomplete.active{color:var(--accent-ink,#6b4726);border-color:var(--accent,#9a6a3c);background:var(--accent-soft,#f5ede2);}

/* Catalogue history (manifest rollback) — the Worker already kept these
   snapshots; this surfaces them so a bad bulk edit is one click from undone. */
.ysa-backup-list{margin-top:10px;max-height:300px;overflow:auto;border-top:1px solid var(--line);}
.ysa-backup-row{display:flex;align-items:center;gap:12px;padding:9px 4px;border-bottom:1px solid var(--line);
  font-family:var(--sans);font-size:12.5px;}
.ysa-backup-row:last-child{border-bottom:0;}
.ysa-backup-when{flex:1;min-width:0;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ysa-backup-meta{flex:none;font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--mute);}

.ysa-analytics-list{margin-top:10px;max-height:340px;overflow:auto;border-top:1px solid var(--line);}
.ysa-analytics-row{display:flex;align-items:center;gap:10px;padding:8px 4px;border-bottom:1px solid var(--line);
  font-family:var(--sans);font-size:12px;}
.ysa-analytics-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink);}
.ysa-analytics-meta{flex:none;font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--mute);}

/* Access history — anonymous session/view log, grouped into one collapsible
   card per visit (sid) so every product a visitor opened reads together
   instead of as unrelated rows. */
.ysa-access-list{margin-top:10px;max-height:440px;overflow:auto;border-top:1px solid var(--line);}
.ysa-access-session{border-bottom:1px solid var(--line);}
.ysa-access-session:last-child{border-bottom:0;}

.ysa-access-head{width:100%;display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
  padding:9px 4px;background:none;border:0;cursor:pointer;text-align:left;
  font-family:var(--sans);font-size:12px;color:inherit;transition:background .15s;}
.ysa-access-head:hover{background:var(--bg-alt,rgba(0,0,0,.02));}
.ysa-access-session.open .ysa-access-chevron{transform:rotate(180deg);}
.ysa-access-chevron{flex:none;color:var(--mute);font-size:10px;transition:transform .15s;transform-origin:center;}
.ysa-access-when{flex:none;color:var(--mute);font-size:11px;white-space:nowrap;}
.ysa-access-meta{flex:1;min-width:160px;font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ysa-access-count{flex:none;font-size:11px;color:var(--ink);white-space:nowrap;}
.ysa-access-tag{flex:none;font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--accent-ink,#6b4726);
  background:var(--accent-soft,#f5ede2);border:1px solid var(--accent,#9a6a3c);border-radius:5px;padding:1px 6px;}
.ysa-access-tag-new{color:var(--mute);background:none;border-color:var(--line);}

.ysa-access-details{padding:2px 4px 12px 26px;}
.ysa-access-view-row{display:flex;align-items:baseline;gap:10px;padding:5px 0;
  font-family:var(--sans);font-size:11.5px;border-bottom:1px dashed var(--line);}
.ysa-access-view-row:last-child{border-bottom:0;}
.ysa-access-view-rel{flex:1;min-width:0;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ysa-access-view-dwell{flex:none;font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--mute);}
.ysa-access-empty-views, .ysa-access-referrer{font-size:11px;color:var(--mute);padding:4px 0;}

/* Admin toolbar: 7 undifferentiated mini-buttons wrapped into 3-4 ragged rows
   at tablet width, with the destructive-ish "Rebuild manifest" looking exactly
   like "Refresh". Group them and let the search field take the slack. */
.ysa-card-tools{row-gap:8px;}
.ysa-card-tools .ysa-search{flex:1 1 180px;min-width:150px;}
.ysa-card-tools #auditManifest{margin-left:auto;}
.ysa-card-tools #rebuildManifest{border-color:#e0d5c4;color:var(--accent-ink,#6b4726);}
@media (max-width:820px){
  .ysa-card-tools{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));align-items:stretch;}
  .ysa-card-tools .ysa-search{grid-column:1/-1;width:100%;}
  .ysa-card-tools #auditManifest{margin-left:0;}
}

/* overrides */
.ysa-overrides{margin-top:14px;padding:14px 16px;background:#fbfbfa;border:1px solid var(--line);border-radius:10px;}
.ysa-overrides .ysa-hint{margin:0 0 10px;color:var(--mute);}

/* options (radio groups) */
.ysa-opts{margin-top:18px;display:grid;grid-template-columns:1fr 1fr;gap:14px;}
@media (max-width:720px){.ysa-opts{grid-template-columns:1fr;}}
.ysa-opt{border:1px solid var(--line);border-radius:10px;padding:12px 14px;background:#fff;}
.ysa-opt-label{font-family:var(--sans);font-size:9px;letter-spacing:.18em;text-transform:uppercase;
  color:var(--mute);margin-bottom:8px;}
.ysa-opt-choices{display:flex;flex-direction:column;gap:4px;}
.ysa-radio{display:flex;align-items:baseline;gap:9px;font-family:var(--sans);font-size:12px;color:var(--ink);
  cursor:pointer;padding:4px 0;}
.ysa-radio input{margin:0;accent-color:var(--ink);}
.ysa-radio em{font-style:normal;color:var(--faint);font-size:10.5px;letter-spacing:.02em;}
.ysa-radio:hover em{color:var(--mute);}

/* progress dashboard */
.ysa-progress{margin-top:18px;border:1px solid var(--line);border-radius:10px;padding:14px 16px;background:#fbfbfa;}
.ysa-progress-head{display:flex;justify-content:space-between;align-items:baseline;
  font-family:var(--sans);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--mute);}
.ysa-progress-title{color:var(--ink);}
.ysa-progress-track{height:4px;background:var(--line);border-radius:99px;overflow:hidden;margin:8px 0 12px;}
.ysa-progress-track i{display:block;height:100%;width:0;background:var(--ink);border-radius:99px;transition:width .2s;}
.ysa-progress-list{display:flex;flex-direction:column;gap:5px;max-height:280px;overflow:auto;padding-right:4px;}
.ysa-prog-row{display:flex;align-items:center;gap:10px;font-family:var(--sans);font-size:11.5px;color:var(--ink);}
.ysa-prog-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ysa-prog-bar{flex:none;width:120px;height:3px;background:var(--line);border-radius:99px;overflow:hidden;}
.ysa-prog-bar i{display:block;height:100%;width:0;background:var(--ink);transition:width .2s;}
.ysa-prog-row.done .ysa-prog-bar i{background:#2f7a4f;}
.ysa-prog-row.err{color:#8d3b3b;}
.ysa-prog-row.err .ysa-prog-bar i{background:#8d3b3b;}
.ysa-prog-count{flex:none;font-size:10px;letter-spacing:.06em;color:var(--mute);min-width:70px;text-align:right;}

.ysa-actions-row{margin-top:16px;display:flex;align-items:center;gap:14px;flex-wrap:wrap;}

/* cloud tree */
.ysa-search{font-family:var(--sans);font-size:12px;color:var(--ink);
  border:1px solid var(--line);border-radius:999px;background:#fff;padding:7px 12px;width:200px;outline:none;
  transition:border-color .2s;}
.ysa-search:focus{border-color:var(--ink);}
.ysa-tree{font-family:var(--sans);font-size:12.5px;margin-top:10px;border:1px solid var(--line);border-radius:10px;overflow:hidden;}
.ysa-tree-row{display:flex;align-items:center;gap:10px;padding:8px 4px;border-bottom:1px solid var(--line);}
.ysa-tree-row:last-child{border-bottom:0;}
.ysa-tree-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink);}
.ysa-tree-meta{flex:none;font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--mute);}

/* Three visually distinct tiers so the hierarchy reads at a glance instead
   of every row looking the same weight: collection = bold header block with
   its own background, product = a labeled sub-header, variant = a plain
   indented leaf row with a tree-guide line connecting it to its product. */
.ysa-tree-col{cursor:pointer;padding:12px 14px;background:#f7f6f3;border-bottom:1px solid var(--line);}
.ysa-tree-col .ysa-tree-name{font-family:var(--sans);font-size:14.5px;font-weight:600;letter-spacing:.005em;}
.ysa-tree-col .ysa-plan-caret{flex:none;color:var(--mute);font-size:11px;width:14px;}
.ysa-tree-col:hover{background:#f1f0ec;}
.ysa-tree-col.is-open{background:#fff;}

.ysa-tree-prod{padding:8px 14px 8px 30px;background:#fbfbfa;position:relative;}
.ysa-tree-prod::before{content:'';position:absolute;left:18px;top:0;bottom:0;width:1px;background:var(--line);}
.ysa-tree-prod .ysa-tree-name{font-weight:600;font-size:12px;letter-spacing:.02em;text-transform:uppercase;color:var(--mute);}

.ysa-tree-set{padding:7px 14px 7px 44px;position:relative;}
.ysa-tree-set::before{content:'';position:absolute;left:18px;top:0;bottom:50%;width:1px;background:var(--line);}
.ysa-tree-set:last-child::before{bottom:0;}
.ysa-tree-set::after{content:'';position:absolute;left:18px;top:50%;width:12px;height:1px;background:var(--line);}
.ysa-tree-set .ysa-tree-name{color:var(--ink);font-size:12px;}
.ysa-tree-set:hover{background:#fafaf8;}
.ysa-tree-set.is-default{background:#f4faf6;}

.ysa-pill{font-family:var(--sans);font-size:8.5px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--mute);border:1px solid var(--line);border-radius:999px;padding:3px 9px;background:#fff;}
.ysa-pill-def{color:#2f7a4f;border-color:#cfe3d4;background:#f4faf6;}
.ysa-pill-new{color:#1a6ea8;border-color:#cfe0ec;background:#f2f8fc;}
.ysa-tree-meta.warn{color:#8d3b3b;}
.ysa-tree-check{flex:none;width:14px;height:14px;cursor:pointer;accent-color:var(--ink);}

.ysa-empty{padding:24px 6px;color:var(--mute);font-family:var(--sans);font-size:12px;text-align:center;}

/* batch rename popup — one editable row per selected item */
.ysa-batch-rename-list{max-height:50vh;overflow:auto;display:flex;flex-direction:column;gap:8px;}
.ysa-batch-rename-row{display:flex;align-items:center;gap:10px;}
.ysa-batch-rename-old{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-family:var(--sans);font-size:11.5px;color:var(--mute);}
.ysa-batch-rename-row .ysa-modal-input{flex:1;min-width:0;}

/* modal */
.ysa-modal{position:fixed;inset:0;background:rgba(26,26,24,.32);backdrop-filter:blur(2px);
  display:flex;align-items:center;justify-content:center;z-index:100;animation:fadein .18s ease;padding:22px;}
.ysa-modal[hidden]{display:none;}
body.ysa-modal-open{overflow:hidden;}
@keyframes fadein{from{opacity:0;}to{opacity:1;}}
.ysa-modal-card{background:#fff;border-radius:14px;padding:26px 28px 22px;max-width:480px;width:100%;
  box-shadow:0 20px 60px -20px rgba(26,26,24,.4);animation:rise .3s cubic-bezier(.22,.8,.3,1);}
.ysa-modal-title{font-family:var(--sans);font-size:19px;font-weight:400;margin:0 0 12px;}
.ysa-modal-body{font-family:var(--sans);font-size:13px;color:var(--ink);line-height:1.75;margin-bottom:20px;}
.ysa-modal-body p{margin:0 0 8px;}
.ysa-modal-body p:last-child{margin-bottom:0;}
.ysa-modal-body code{font-size:11.5px;background:#f4f4f2;border:1px solid var(--line);border-radius:4px;padding:2px 7px;
  display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;}
.ysa-modal-warn{color:#8d3b3b;font-size:11.5px;}
.ysa-modal-hint{color:var(--mute);font-size:12px;}
.ysa-modal-actions{display:flex;justify-content:flex-end;gap:10px;}
.ysa-modal-input{width:100%;box-sizing:border-box;font-family:var(--sans);font-size:14px;color:var(--ink);
  border:1px solid var(--line);border-radius:8px;padding:9px 11px;margin-top:2px;}
.ysa-modal-input:focus{outline:none;border-color:var(--ink);}

/* toast notifications */
.ysa-toast-wrap{position:fixed;top:20px;right:20px;z-index:200;display:flex;flex-direction:column;gap:8px;pointer-events:none;}
.ysa-toast{font-family:var(--sans);font-size:12.5px;padding:10px 18px;border-radius:10px;
  background:#fff;color:var(--ink);border:1px solid var(--line);
  box-shadow:0 8px 30px -10px rgba(26,26,24,.25);pointer-events:auto;
  animation:toastIn .3s cubic-bezier(.22,.8,.3,1);}
.ysa-toast-ok{border-color:#cfe3d4;background:#f4faf6;color:#2f7a4f;}
.ysa-toast-err{border-color:#e8cece;background:#fdf5f5;color:#8d3b3b;}
.ysa-toast.fade-out{animation:toastOut .25s ease forwards;}
@keyframes toastIn{from{opacity:0;transform:translateX(40px);}to{opacity:1;transform:translateX(0);}}
@keyframes toastOut{from{opacity:1;transform:translateX(0);}to{opacity:0;transform:translateX(40px);}}

/* set-default highlight */
.ysa-tree-set.is-default{background:#f4faf6;}
.ysa-tree-set.flash{animation:flashDefault .6s ease;}
@keyframes flashDefault{0%{background:#d9f0e0;}100%{background:#f4faf6;}}
