/* studio_bundle.css, built by npm run css:studio (scripts/build_studio_css.js) from
   parts: [studio_phone.css, studio_return.css, studio_price_facts.css, studio_style_rows.css, studio_picker_clarity.css, studio_controls.css, studio_visual.css, thread_chart.css, studio/review_blocks.css, lg2_phone.css, studio_sheet.css, studio/01_masthead.css, studio/color_menu.css, studio/puff.css]
   in that order. Do not edit: edit a part and rebuild. */
/* Responsive Studio presentation below the unchanged desktop workbench.
   Canonical nodes, catalogue and actions are shared; CSS owns no order state. */
.lgm-only{display:none;}
.lgm-resize,.lgm-placement-tools,.lgm-size-note{display:none;}
.lgm-review-edit{display:none;}
#lgt-phone-chooser:not([open]){display:none;}
@media all{
  /* The phone shell owns presentation only. The canvas, catalogue and
     inspector retain their canonical nodes and geometry. */
  body.lgm-on.body-page-scrolled main{padding-top:var(--lgw-top,var(--nav-height));}
  body.lgm-on main + div[aria-hidden="true"],body.lgm-on footer,body.lgm-on .lk-strip--journey,body.lgm-on .lgs>.lg-shell,body.lgm-on .lg-base,body.lgm-on .lg-under{display:none;}
  body.lgm-on .lgm-only{display:block;}
  body.lgm-on .lgm-ws{display:grid;position:fixed;inset:var(--lgw-top,var(--nav-height)) 0 auto;overflow:clip;grid-template-areas:"top" "room" "camera" "views" "tools" "footer";grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(120px,1fr) auto auto auto auto;height:calc(var(--lgm-visible-height,100dvh) - var(--lgw-top,var(--nav-height)));background:var(--vh-white);color:var(--vh-ink);isolation:isolate;}
  body.lgm-on .lgm-ws [hidden]{display:none!important;}
  body.lgm-on .lgm-bar,body.lgm-on .lgm-tabs,body.lgm-on .lgm-expand,body.lgm-on #lgm-edit-toggle{display:none;}
  body.lgm-on .lgm-topline{grid-area:top;display:flex;align-items:center;gap:12px;min-width:0;padding:6px max(12px,env(safe-area-inset-right)) 6px max(12px,env(safe-area-inset-left));border-bottom:1px solid var(--vh-line);background:var(--vh-white);}
  body.lgm-on #lgm-garment-open{display:flex;flex:1;flex-direction:column;align-items:flex-start;justify-content:center;gap:2px;min-width:0;min-height:48px;padding:2px 0;border:0;background:none;color:var(--vh-ink);text-align:left;cursor:pointer;}
  body.lgm-on #lgm-garment-name{max-width:100%;font:500 17px/1.2 var(--vh-display);letter-spacing:.025em;overflow-wrap:anywhere;}
  body.lgm-on #lgm-garment-meta{max-width:100%;font:12px/1.35 var(--vh-body);color:var(--vh-muted);overflow-wrap:anywhere;}
  body.lgm-on #lgm-review-open{flex:0 0 auto;min-width:60px;min-height:44px;padding:8px 10px;border:1px solid var(--vh-line-strong);border-radius:0;background:var(--vh-white);color:var(--vh-ink);font:14px var(--vh-body);cursor:pointer;}
  body.lgm-on #lgm-review-open[aria-current="page"]{background:var(--vh-cream);border-color:var(--vh-ink);}
  body.lgm-on .lgm-room{grid-area:room;position:relative;display:flex;align-items:center;justify-content:center;min-width:0;min-height:0;overflow:clip;container-type:size;background:var(--vh-white);touch-action:none;}
  body.lgm-on .lgm-room .lg-preview{position:static;flex:0 0 auto;margin:0;min-width:0;max-width:none;}
  body.lgm-on .lgm-room .lg-canvas-card{border:0;border-radius:0;background:transparent;overflow:visible;}
  body.lgm-on .lgm-room .lg-canvas-head{padding:0;border:0;margin:0;}
  body.lgm-on .lgm-room .lg-canvas-head .lbl{display:none;}
  body.lgm-on .lgm-room .lg-stage{width:var(--lgm-camera-size,min(94cqw,calc(100cqh - 12px)));min-width:0;max-width:none;aspect-ratio:1;border:0;border-radius:0;box-shadow:none;transform:translate(var(--lgm-camera-x,0px),var(--lgm-camera-y,0px));touch-action:none;}
  body.lgm-on .lgm-room .lg-view-tabs,body.lgm-on .lgm-room .lg-rotate{display:none;}
  body.lgm-on .lgm-room .lg-spots,body.lgm-on .lgm-room .lg-canvas-foot{display:none;}
  body.lgm-on .lgm-ws:not([data-phone-manipulate="true"]) .lg-logo .hnd,body.lgm-on .lgm-ws:not([data-phone-manipulate="true"]) .lg-logo .lg-rot{display:none;}
  body.lgm-on .lgm-ws:not([data-phone-manipulate="true"]) .lg-logo{cursor:pointer;}
  /* The live size chip hangs under the box here: above it, it sat on the
     zone's name tag ("LEFT CHEST" read "CHE"), which rides above the zone.
     1.2rem clears the corner grips. A too-big design keeps the chip above,
     so the Too big chip under the zone stays clear. */
  body.lgm-on .lg-logo .dim{top:calc(100% + 1.2rem);}
  body.lgm-on .lg-stage:has(> .lg-bound.lg-bound--big) > .lg-logo .dim{top:-2.8rem;}
  /* ...and a zone right of the photo's middle hangs that tag from its right
     edge, so it reads over the garment instead of running off it */
  body.lgm-on .lg-bound.lg-bound--east .tag{left:auto;right:0;}
  /* ...and a zone in the photo's middle (a cap front, a back) hangs it from
     its middle: from its left corner the cap front's white tag ran off the
     crown onto the white, where it could not be read */
  body.lgm-on .lg-bound.lg-bound--mid .tag{left:50%;transform:translateX(-50%);}
  /* a tag with no room left in the stage's padding (a pinch zoom; the
     engine's phoneLabelFit) steps aside */
  body.lgm-on #lg-stage .lgm-label-off{visibility:hidden;}
  /* no text under 12px on the stage: the zone's name tag and the size chip */
  body.lgm-on .lg-bound .tag,body.lgm-on .lg-logo .dim{font-size:1.2rem;}
  body.lgm-on .lgm-camera-tools{grid-area:camera;display:flex;align-items:center;justify-content:center;gap:4px;min-width:0;padding:0 12px;background:var(--vh-white);}
  body.lgm-on .lgm-camera-tools button{min-width:44px;min-height:44px;padding:6px 10px;border:0;border-radius:0;background:none;color:var(--vh-ink);font:14px/1.25 var(--vh-body);cursor:pointer;}
  body.lgm-on #lgm-zoom-fit{min-width:72px;font-variant-numeric:tabular-nums;}
  body.lgm-on #lgm-zoom-in,body.lgm-on #lgm-zoom-out{font-size:21px;}
  body.lgm-on #lgm-zoom-design{margin-left:auto;text-decoration:underline;text-underline-offset:4px;}
  body.lgm-on .lgm-context{grid-area:tools;min-width:0;min-height:0;overflow:auto;overscroll-behavior:contain;padding:10px max(12px,env(safe-area-inset-right)) 8px max(12px,env(safe-area-inset-left));border-top:1px solid var(--vh-line);background:var(--vh-cream);}
  body.lgm-on .lgm-selection{display:flex;align-items:baseline;flex-wrap:wrap;gap:3px 10px;min-width:0;margin-bottom:8px;}
  body.lgm-on #lgm-selection-name{display:-webkit-box;flex:1 1 140px;min-width:0;max-height:2.6em;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2;font:500 15px/1.3 var(--vh-body);overflow-wrap:anywhere;}
  body.lgm-on #lgm-selection-meta{font:12px/1.35 var(--vh-body);color:var(--vh-muted);font-variant-numeric:tabular-nums;overflow-wrap:anywhere;}
  body.lgm-on #lgm-selected-actions{display:flex;gap:5px;min-width:0;}
  body.lgm-on #lgm-selected-actions button{flex:1 1 0;min-width:44px;min-height:48px;padding:8px 4px;border:1px solid var(--vh-line-strong);border-radius:0;background:var(--vh-white);color:var(--vh-ink);font:13px/1.25 var(--vh-body);cursor:pointer;}
  body.lgm-on #lgm-selected-actions [data-lgm-tool="delete"],body.lgm-on #lgm-delete{color:var(--vh-stop);border-color:var(--vh-stop);}
  body.lgm-on #lgm-empty-actions{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;}
  body.lgm-on #lgm-empty-actions button{min-width:44px;min-height:52px;padding:8px 6px;border:1px solid var(--vh-line-strong);border-radius:0;background:var(--vh-white);color:var(--vh-ink);font:14px/1.3 var(--vh-body);cursor:pointer;}
  body.lgm-on #lgm-empty-actions button:first-child{border-color:var(--vh-ink);background:var(--vh-ink);color:var(--vh-white);}
  body.lgm-on #lgm-add-open,body.lgm-on #lgm-pieces-open{min-width:44px;min-height:44px;margin:4px 10px 0 0;padding:6px 0;border:0;background:none;color:var(--vh-ink);font:13px/1.3 var(--vh-body);text-decoration:underline;text-underline-offset:4px;cursor:pointer;}
  body.lgm-on .lgm-context-links{display:flex;align-items:center;flex-wrap:wrap;gap:0 12px;}
  body.lgm-on #lgm-empty-open{display:block;min-height:44px;max-width:100%;padding:6px 0;border:0;background:none;color:var(--vh-stop);font:14px/1.4 var(--vh-body);text-align:left;text-decoration:underline;text-underline-offset:4px;cursor:pointer;}
  body.lgm-on #lgm-empty-placements,body.lgm-on #lgm-empty-status{padding:0 18px 16px;margin:0;font:14px/1.5 var(--vh-body);}
  body.lgm-on .lgm-empty-placement{display:flex;flex-wrap:wrap;gap:8px;padding:12px 0;border-top:1px solid var(--vh-line);}
  body.lgm-on .lgm-empty-title{flex:0 0 100%;margin:0;font-weight:500;overflow-wrap:anywhere;}
  body.lgm-on .lgm-empty-action{min-height:44px;padding:8px 10px;border:1px solid var(--vh-line-strong);border-radius:0;background:var(--vh-white);color:var(--vh-ink);font:14px/1.4 var(--vh-body);cursor:pointer;}
  body.lgm-on #lgm-view-hint{margin:6px 0 0;font:12px/1.4 var(--vh-body);color:var(--vh-muted);}
  body.lgm-on .lgm-context button[aria-pressed="true"]{background:var(--vh-ink);border-color:var(--vh-ink);color:var(--vh-white);}
  body.lgm-on .lgm-ws button:disabled{cursor:not-allowed;opacity:.45;}
  /* The no-fit explanation must remain readable even when its choice is disabled. */
  body.lgm-on .lgm-ws button.lgw-ins-spot:disabled{opacity:1;}
  body.lgm-on .lgm-sheet{grid-area:editor;display:flex;flex-direction:column;min-width:0;min-height:0;overflow:hidden;border-top:1px solid var(--vh-line);background:var(--vh-white);}
  body.lgm-on .lgm-body{max-height:none;flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;scroll-padding-block:14px;scrollbar-color:var(--vh-line-strong) var(--vh-white);}
  body.lgm-on .lgm-body input:not([type="range"]):not([type="checkbox"]):not([type="radio"]),body.lgm-on .lgm-body textarea,body.lgm-on .lgm-body select{font-size:16px;caret-color:var(--vh-ink);}
  body.lgm-on .lgm-ws ::selection{background:var(--vh-ink);color:var(--vh-white);}
  body.lgm-on .lgm-body .lg-ticket{border:0;border-radius:0;box-shadow:none;overflow:visible;background:transparent;}
  body.lgm-on .lgm-body .lg-ticket-band,body.lgm-on .lg-step-num,body.lgm-on .lgm-body #lg-zone-ticks{display:none;}
  body.lgm-on .lg-step{display:none;}
  body.lgm-on .lg-step.lgw-active{display:block;}
  body.lgm-on .lgm-body .lg-step{padding:12px 18px 20px;}
  body.lgm-on .lgm-body .lg-step-head{flex-wrap:wrap;margin-bottom:10px;gap:8px;align-items:center;}
  body.lgm-on .lgm-ws[data-phone-workspace] .lg-step:has(#lgw-ins)>.lg-step-head,body.lgm-on .lgm-ws[data-phone-workspace] #lgt-panel>.lg-step-head{display:none;}
  body.lgm-on .lgm-body .lg-step-s{flex-basis:100%;margin-left:0;text-align:left;}
  body.lgm-on .lgm-body .lg-step-t,body.lgm-on .lgm-body .lgw-ins-title{font-size:19px;letter-spacing:.07em;white-space:normal;}
  body.lgm-on .lgm-body .lgw-ins-sub{display:none;}
  body.lgm-on .lgm-body .lgw-ins-back,body.lgm-on .lgw-panel-back{min-height:44px;display:inline-flex;align-items:center;font:13px var(--vh-body);letter-spacing:0;text-transform:none;border:0;text-decoration:underline;text-underline-offset:4px;padding:4px;}
  body.lgm-on .lgm-body .lgw-ins-back[hidden]{display:none;}
  body.lgm-on .lgm-hint-slot{padding:0 18px;}
  body.lgm-on .lgm-hint-slot:empty{display:none;}
  body.lgm-on .lgm-hint-slot .lg-base-hint{display:block;margin:0;font:13px/1.45 var(--vh-body);color:var(--vh-muted);padding:4px 0;}
  body.lgm-on .lgm-hint-slot .sz-apply-note,body.lgm-on .lgm-hint-slot .sz-advisory{margin:0 0 8px;font-size:13px;}
  body.lgm-on .lgm-hint-slot .sz-fit{min-height:44px;}
  body.lgm-on .lgm-ws:not([data-phone-surface="review"]) #lg-bar-hint{display:none;}
  body.lgm-on .lgm-footer{grid-area:footer;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px 12px;min-width:0;border-top:1px solid var(--vh-line);background:var(--vh-white);padding:8px max(12px,env(safe-area-inset-right)) calc(8px + env(safe-area-inset-bottom)) max(12px,env(safe-area-inset-left));}
  body.lgm-on #lgm-price-seat{min-width:0;}
  body.lgm-on #lgm-cta-slot{min-width:0;max-width:160px;}
  body.lgm-on #lgm-review-next{min-width:100px;min-height:48px;max-width:150px;padding:10px 14px;border:1px solid var(--vh-ink);border-radius:0;background:var(--vh-ink);color:var(--vh-white);font:500 14px/1.35 var(--vh-body);cursor:pointer;}
  body.lgm-on .lgm-footer .lgw-foot-price{display:block;color:var(--vh-ink);font:11px/1.4 var(--vh-body);}
  body.lgm-on .lgm-footer .lgw-foot-price[hidden]{display:none;}
  body.lgm-on .lgm-body .lgw-preupload-facts{padding:12px 0;margin:12px 0;font:13px/1.5 var(--vh-body);border-top:1px solid var(--vh-line);}
  body.lgm-on .lgm-footer .lgw-price-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;column-gap:4px;}
  body.lgm-on .lgm-footer .lgw-price-v{grid-column:1;font:600 18px/24px var(--vh-display);}
  body.lgm-on .lgm-footer .lgw-price-k{grid-column:1;font:11px/14px var(--vh-body);}
  body.lgm-on .lgm-footer .lgw-price-dot{display:none;}
  body.lgm-on .lgm-footer .lgw-price-note{display:block;font:11px/1.4 var(--vh-body);color:var(--vh-muted);}
  body.lgm-on .lgm-footer .lgw-price-math{grid-column:2;grid-row:1/3;padding:5px 0;border:0;background:none;color:var(--vh-ink);font:12px var(--vh-body);text-decoration:underline;text-underline-offset:3px;cursor:pointer;min-height:44px;}
  body.lgm-on .lgm-footer .lg-base-btn{width:auto;margin:0;min-height:48px;padding:10px 12px;font-size:13px;line-height:1.35;letter-spacing:.025em;white-space:normal;max-width:160px;background:var(--vh-ink);border-color:var(--vh-ink);color:var(--vh-white);}
  body.lgm-on .lgm-footer .lg-base-btn:disabled{background:var(--vh-ink);border-color:var(--vh-ink);color:var(--vh-white);opacity:.45;}
  body.lgm-on .lgm-body .lgw-order-kicker{display:none;}
  body.lgm-on .lgm-body .lgw-order-title{font:500 22px var(--vh-display);margin:0 0 8px;}
  body.lgm-on .lgm-ws[data-phone-workspace] .lgw-order-title{display:none;}
  body.lgm-on .lgm-ws[data-phone-workspace] #lgw-order>.lg-step-head{display:none;}
  body.lgm-on .lgm-ws[data-phone-workspace] #lgw-order-hint{display:none;}
  body.lgm-on .lgm-body .lgw-order-copy,body.lgm-on .lgm-body .lgw-order-proof{font:14px/1.5 var(--vh-body);}
  body.lgm-on .lgm-body .lgw-foot-act{display:flex;flex-wrap:wrap;gap:8px;margin:18px 0;}
  body.lgm-on .lgm-body .lgw-save{min-height:44px;border:1px solid var(--vh-line-strong);background:var(--vh-white);color:var(--vh-ink);font:14px var(--vh-body);padding:10px 12px;cursor:pointer;}
  body.lgm-on .lgm-body .lgw-save-note{flex-basis:100%;font:14px/1.5 var(--vh-body);}
  body.lgm-on .lgm-ws[data-phone-tool="pieces"] #lgm-body>.lg-ticket,body.lgm-on .lgm-ws[data-phone-tool="pieces"] #lgm-hint-slot{display:none;}
  body.lgm-on #lgm-pieces{display:flex;flex-direction:column;gap:8px;padding:12px 18px 20px;}
  body.lgm-on #lgm-pieces .lgw-ins-row{display:grid;grid-template-columns:36px minmax(0,1fr);column-gap:12px;row-gap:4px;min-height:64px;padding:12px;border-radius:var(--vh-ctl-radius);}
  body.lgm-on #lgm-pieces .lgw-ins-thumb{grid-column:1;grid-row:1/3;width:36px;height:36px;border-radius:var(--vh-ctl-radius);}
  body.lgm-on #lgm-pieces .lgw-ins-f{grid-column:2;min-width:0;gap:4px;}
  body.lgm-on #lgm-pieces .lgw-ins-nm{font:500 15px/1.4 var(--vh-body);white-space:normal;overflow:visible;overflow-wrap:anywhere;text-overflow:clip;}
  body.lgm-on #lgm-pieces .lgw-ins-st{font:13px/1.4 var(--vh-body);overflow-wrap:anywhere;}
  body.lgm-on #lgm-pieces .lgw-ins-where{grid-column:2;margin-left:0;font:12px/1.4 var(--vh-body);letter-spacing:0;text-transform:none;color:var(--vh-muted);white-space:normal;overflow-wrap:anywhere;}
  body.lgm-on .lgm-placement-tools{display:none;}
  body.lgm-on .lgm-ws[data-phone-tool="size"] .lgm-placement-tools,body.lgm-on .lgm-ws[data-phone-tool="position"] .lgm-placement-tools,body.lgm-on .lgm-ws[data-phone-tool="more"] .lgm-placement-tools{display:block;}
  body.lgm-on .lgm-placement-tools .lg-tools{position:static;transform:none;margin:0 0 12px;max-width:100%;width:auto;flex-wrap:wrap;border:0;border-radius:0;background:none;box-shadow:none;justify-content:flex-start;padding:0;gap:8px;}
  body.lgm-on .lgm-placement-tools .lg-tools[hidden]{display:none;}
  body.lgm-on .lgm-placement-tools button,body.lgm-on .lgm-placement-tools .lg-tool{min-height:44px;min-width:44px;font-size:13px;}
  body.lgm-on .lgm-placement-tools .lg-spots{display:flex;flex-wrap:wrap;padding:0;border:0;background:none;}
  body.lgm-on .lgm-placement-tools .lg-spot{min-height:44px;}
  body.lgm-on .lgm-ws:is([data-phone-tool="size"],[data-phone-tool="position"],[data-phone-tool="more"]) .lg-step:has(#lgw-ins)>.lg-step-body{display:flex;flex-direction:column;}
  body.lgm-on .lgm-ws:is([data-phone-tool="size"],[data-phone-tool="position"],[data-phone-tool="more"]) #lgw-ins{display:contents;}
  body.lgm-on .lgm-ws:is([data-phone-tool="size"],[data-phone-tool="position"],[data-phone-tool="more"]) #lgw-ins-id{order:-1;margin-bottom:10px;}
  body.lgm-on .lgm-ws[data-phone-tool="size"] #lg-tools,body.lgm-on .lgm-ws[data-phone-tool="size"] #lg-spots,body.lgm-on .lgm-ws[data-phone-tool="size"] #lgw-ins-spots-lbl,body.lgm-on .lgm-ws[data-phone-tool="size"] #lgw-ins-spots,body.lgm-on .lgm-ws[data-phone-tool="size"] #lgw-ins-spots-hint,body.lgm-on .lgm-ws[data-phone-tool="size"] #lgw-ins-add,body.lgm-on .lgm-ws[data-phone-tool="size"] #lgw-ins-split,body.lgm-on .lgm-ws[data-phone-tool="size"] #lgw-ins-puff{display:none;}
  body.lgm-on .lgm-ws:not([data-phone-tool="size"]) #lgm-resize{display:none;}
  body.lgm-on .lgm-ws:not([data-phone-tool="position"]) #lgm-move-artwork,body.lgm-on .lgm-ws:not([data-phone-tool="position"]) #lgm-move-note{display:none;}
  body.lgm-on .lgm-ws[data-phone-tool="position"] #lg-tool-dup,body.lgm-on .lgm-ws[data-phone-tool="position"] #lg-tool-pin,body.lgm-on .lgm-ws[data-phone-tool="position"] #lg-tool-del,body.lgm-on .lgm-ws[data-phone-tool="position"] #lg-flip,body.lgm-on .lgm-ws[data-phone-tool="position"] #lg-spots{display:none;}
  body.lgm-on .lgm-ws[data-phone-tool="more"] #lg-tool-center,body.lgm-on .lgm-ws[data-phone-tool="more"] .lg-tool--nudge,body.lgm-on .lgm-ws[data-phone-tool="more"] #lg-tool-del,body.lgm-on .lgm-ws[data-phone-tool="more"] #lg-spots,body.lgm-on .lgm-ws[data-phone-tool="more"] #lgw-ins-spots-lbl,body.lgm-on .lgm-ws[data-phone-tool="more"] #lgw-ins-spots,body.lgm-on .lgm-ws[data-phone-tool="more"] #lgw-ins-spots-hint,body.lgm-on .lgm-ws[data-phone-tool="more"] #lgw-ins-add,body.lgm-on .lgm-ws[data-phone-tool="more"] #lgw-ins-split,body.lgm-on .lgm-ws[data-phone-tool="more"] #lgw-ins-limit,body.lgm-on .lgm-ws[data-phone-tool="more"] #lgw-ins-puff{display:none;}
  body.lgm-on .lgm-placement-tools .lg-nudge,body.lgm-on .lgm-placement-tools .lg-nudge-arrows{display:flex;flex-wrap:wrap;gap:6px;}
  body.lgm-on .lgm-placement-tools #lg-tool-nudge{display:none;}
  body.lgm-on .lgm-placement-tools .lg-tool{height:auto;min-height:44px;padding:8px 12px;border-radius:0;box-shadow:none;font:13px/1.3 var(--vh-body);letter-spacing:0;text-transform:none;}
  body.lgm-on .lgm-placement-tools .lg-tool--nudge{padding:8px;font-size:18px;}
  body.lgm-on .lgm-placement-tools .lg-flip{display:flex;flex-wrap:wrap;gap:8px;margin:0;}
  body.lgm-on .lgm-placement-tools .lg-tool--flip{gap:8px;min-width:130px;justify-content:flex-start;}
  body.lgm-on .lgm-placement-tools .lg-tool--flip .lgm-only{font:13px/1.3 var(--vh-body);}
  body.lgm-on .lgm-ws[data-phone-tool="position"] .lgm-placement-tools{display:flex;flex-direction:column;}
  body.lgm-on .lgm-ws[data-phone-tool="position"] #lg-tools{order:0;}
  body.lgm-on .lgm-ws[data-phone-tool="position"] #lgm-move-artwork{order:1;}
  body.lgm-on .lgm-ws[data-phone-tool="position"] #lgm-move-note{order:2;}
  body.lgm-on .lgm-ws[data-phone-tool="position"] #lg-spots{order:3;}
  body.lgm-on #lgm-move-artwork{width:100%;margin:0 0 6px;}
  body.lgm-on #lgm-move-artwork[aria-pressed="true"]{background:var(--vh-ink);border-color:var(--vh-ink);color:var(--vh-white);}
  body.lgm-on #lgm-move-note{margin:0 0 10px;font:13px/1.45 var(--vh-body);color:var(--vh-muted);}
  body.lgm-on .lgm-resize{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 8px;min-width:0;margin:0 0 12px;}
  body.lgm-on .lgm-resize[hidden]{display:none;}
  body.lgm-on .lgm-resize-title{flex:0 0 auto;font:500 14px/1.4 var(--vh-body);color:var(--vh-ink);}
  body.lgm-on #lgm-resize-value{flex:1 1 170px;min-width:0;font:13px/1.4 var(--vh-body);color:var(--vh-muted);text-align:right;overflow-wrap:anywhere;}
  body.lgm-on .lgm-resize-button{flex:1 1 calc(50% - 4px);min-width:44px;min-height:44px;padding:8px 12px;background:var(--vh-white);border:1px solid var(--vh-line-strong);border-radius:0;color:var(--vh-ink);font:14px/1.4 var(--vh-body);cursor:pointer;}
  body.lgm-on .lgm-resize-button:hover:not(:disabled){background:var(--vh-cream);border-color:var(--vh-ink);}
  body.lgm-on .lgm-resize-button:disabled{opacity:.45;cursor:not-allowed;}
  /* Zones step 2 (rule F): the photos show a size M, under the Size group */
  body.lgm-on .lgm-size-note{display:block;margin:-6px 0 12px;font:12px/1.4 var(--vh-body);color:var(--vh-muted);}
  body.lgm-on .lgm-size-note[hidden],body.lgm-on .lgm-ws:not([data-phone-tool="size"]) #lgm-size-note{display:none;}
  /* The text sheet is the PC Text panel's own rows on the phone too (drive S1:
     studio_visual.css reads both shells); its old phone order is gone. */
  body.lgm-on .lgw-tonal-copy{font:13px/1.5 var(--vh-body);}
  body.lgm-on #lgw-ins-id{gap:8px;min-width:0;}
  body.lgm-on #lgw-ins-id .lgw-ins-thumb{width:36px;height:36px;}
  body.lgm-on #lgw-ins-id .lgw-ins-f{flex:1;min-width:0;}
  body.lgm-on #lgw-ins-id .lgw-ins-nm{font-size:14px;line-height:1.35;white-space:normal;overflow-wrap:anywhere;}
  body.lgm-on #lgw-ins-id .lgw-ins-upstat{font-size:12px;line-height:1.4;}
  body.lgm-on #lgw-ins-id .lgw-ins-swap{min-width:44px;min-height:44px;max-width:82px;padding:6px 4px;border:0;font:13px/1.35 var(--vh-body);text-transform:none;letter-spacing:0;white-space:normal;text-decoration:underline;text-underline-offset:4px;}
  body.lgm-on .lgm-done-typing{margin-left:auto;border:0;background:none;color:var(--vh-ink);min-height:44px;padding:6px;font:14px var(--vh-body);text-decoration:underline;text-underline-offset:4px;}
  body.lgm-on .lgm-ws:not(.lgm-typing) .lgm-done-typing{display:none;}
  body.lgm-on .lgm-ws[data-phone-workspace] .lgm-done-typing{display:none;}
  body.lgm-on .lgw-dg-chip{position:absolute;top:6px;left:8px;max-width:calc(100% - 16px);font:12px var(--vh-body);padding:5px 8px;background:var(--vh-ink);color:var(--vh-white);border-radius:2px;box-shadow:none;}
  body.lgm-on .lgw-dg-chip .rule,body.lgm-on .lgw-dg-chip .gl{display:none;}
  body.lgm-on .lgw-dg-chip[hidden]{display:none;}
  body.lgm-on .lgm-ws button:focus-visible,body.lgm-on .lgm-ws summary:focus-visible,body.lgm-on .lgm-ws input:focus-visible,body.lgm-on .lgm-ws textarea:focus-visible,body.lgm-on .lgm-ws select:focus-visible,body.lgm-on #lgt-phone-chooser button:focus-visible,body.lgm-on #lgt-phone-chooser input:focus-visible{outline:2px solid var(--vh-ink);outline-offset:3px;}
  body.lgm-on #lgt-phone-chooser{position:fixed;inset:0;width:100%;height:100dvh;max-width:none;max-height:none;margin:0;padding:0;border:0;background:var(--vh-white);color:var(--vh-ink);overscroll-behavior:contain;}
  body.lgm-on #lgt-phone-chooser[open]{display:flex;flex-direction:column;}
  body.lgm-on #lgt-phone-chooser::backdrop{background:rgba(24,21,16,.5);}
  body.lgm-on .lgt-phone-chooser-head{display:flex;align-items:center;gap:12px;padding:12px 18px;border-bottom:1px solid var(--vh-line);}
  body.lgm-on #lgt-phone-chooser-title{margin:0;flex:1;font:500 22px var(--vh-display);letter-spacing:.04em;}
  body.lgm-on .lgt-phone-chooser-done{min-height:44px;padding:8px;border:0;background:none;color:var(--vh-ink);font:14px var(--vh-body);text-decoration:underline;text-underline-offset:4px;cursor:pointer;}
  body.lgm-on .lgt-phone-search-wrap{padding:14px 18px 0;}
  body.lgm-on .lgt-phone-search-wrap label{display:block;font:14px var(--vh-body);margin-bottom:8px;}
  body.lgm-on #lgt-phone-search{width:100%;min-height:48px;font:16px var(--vh-body);padding:10px 12px;background:var(--vh-white);border:1px solid var(--vh-line-strong);border-radius:2px;color:var(--vh-ink);}
  body.lgm-on #lgt-phone-search-count{font:13px var(--vh-body);color:var(--vh-muted);margin:10px 0;}
  body.lgm-on .lgt-phone-chooser-body{overflow:auto;min-height:0;flex:1;padding:12px 18px calc(20px + env(safe-area-inset-bottom));overscroll-behavior:contain;}
  body.lgm-on #lgt-phone-chooser #lgt-fonts{margin:0;max-height:none;overflow:visible;padding:0;}
  body.lgm-on #lgt-phone-chooser .lgt-fgrid{gap:10px;}
  body.lgm-on #lgt-phone-chooser .lgt-font{padding:8px;gap:10px;border:1px solid var(--vh-line);border-radius:2px;min-width:0;}
  body.lgm-on #lgt-phone-chooser .lgt-font-ph{height:64px;border:0;border-radius:0;box-shadow:none;padding:6px;width:100%;}
  body.lgm-on #lgt-phone-chooser .lgt-font-nm{font:14px/1.4 var(--vh-body);}
  body.lgm-on #lgt-phone-chooser .lgw-cl-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;}
  body.lgm-on #lgt-phone-chooser .lgw-cl-sw{min-width:0;display:grid;grid-template-columns:34px 1fr;grid-template-rows:auto auto;gap:3px 9px;align-items:center;min-height:68px;padding:10px;background:var(--vh-white);border:1px solid var(--vh-line);border-radius:2px;text-align:left;color:var(--vh-ink);cursor:pointer;}
  body.lgm-on #lgt-phone-chooser .lgw-cl-sw[hidden]{display:none;}
  body.lgm-on #lgt-phone-chooser .lgw-cl-cur{border:2px solid var(--vh-ink);padding:9px;background:var(--vh-cream);}
  body.lgm-on #lgt-phone-chooser .lgw-cl-swdot{width:30px;height:30px;grid-row:1/3;border-radius:50%;border:1px solid var(--vh-line-strong);}
  body.lgm-on #lgt-phone-chooser .lgw-cl-swno{font:600 14px var(--vh-body);}
  body.lgm-on #lgt-phone-chooser .lgw-cl-swnm{font:13px/1.35 var(--vh-body);overflow-wrap:anywhere;}
}
@media all{
  /* The current PC product browser proxies these live source controls. */
  body.lgm-on .lgm-ws[data-phone-tool="garment"] #lg-bar-hint{display:none;}
  body.lgm-on .lgm-body .lg-step:has(#lgw-picker)>.lg-step-head .lg-step-s{display:none;}
  body.lgm-on .lgm-body .lg-step:has(.lgw-picker.lgw-pk-open)>.lg-step-head{display:none;}
  body.lgm-on .lgm-body #lg-garments,body.lgm-on .lgm-body .lgx-sel,body.lgm-on .lgm-body .lgx-c-opts,body.lgm-on .lgm-body .lg-sw-name{display:none;}
  body.lgm-on .lgm-body .lgw-gar-title{display:inline;font:500 22px var(--vh-display);letter-spacing:.06em;text-transform:uppercase;}
  body.lgm-on .lgw-gar-title+.lg-step-t{display:none;}
  body.lgm-on .lgw-gar-copy{display:block;margin:0 0 14px;font:14px/1.5 var(--vh-body);color:var(--vh-muted);}
  body.lgm-on .lgw-gar-copy[hidden]{display:none;}
  body.lgm-on .lgw-prod{display:grid;grid-template-columns:72px minmax(0,1fr);margin-bottom:14px;background:var(--vh-white);border:1px solid var(--vh-line-strong);border-radius:var(--vh-ctl-radius);overflow:hidden;}
  body.lgm-on .lgw-prod-ph{display:flex;align-items:center;justify-content:center;min-height:76px;padding:6px;background:#fff;}
  body.lgm-on .lgw-prod-ph .lgw-gcard-img,body.lgm-on .lgw-prod-ph .lgw-gcard-ico{display:block;width:60px;height:64px;object-fit:contain;color:var(--vh-ink);}
  body.lgm-on .lgw-prod-meta{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:4px 10px;align-content:center;align-items:center;min-width:0;padding:10px 12px;border-left:1px solid var(--vh-line);}
  body.lgm-on .lgw-prod-nm{font:500 16px/1.3 var(--vh-display);letter-spacing:.03em;text-transform:uppercase;color:var(--vh-ink);overflow-wrap:anywhere;}
  body.lgm-on .lgw-prod-sub{grid-column:1;font:13px/1.4 var(--vh-body);color:var(--vh-muted);}
  body.lgm-on .lgw-prod-chg{grid-column:2;grid-row:1/3;min-width:44px;min-height:44px;padding:6px 0;background:none;border:0;color:var(--vh-ink);font:13px var(--vh-body);text-decoration:underline;text-underline-offset:4px;cursor:pointer;}
  body.lgm-on .lgw-prod--browse .lgw-prod-chg{display:none;}
  body.lgm-on .lgw-picker{position:static;margin:0;padding:0;}
  body.lgm-on .lgw-picker.lgw-pk-open{display:block;}
  body.lgm-on .lgw-picker[hidden]{display:none;}
  body.lgm-on .lgw-pk-card{position:static;display:block;width:100%;max-height:none;overflow:visible;background:transparent;border:0;border-radius:0;box-shadow:none;}
  /* The workspace sheet already owns the garment title and Done action. */
  body.lgm-on .lgm-ws[data-phone-workspace] .lgw-pk-head{display:none;}
  body.lgm-on .lgw-pk-title{margin:0;min-width:0;font:500 20px/1.3 var(--vh-display);letter-spacing:.04em;text-transform:uppercase;}
  body.lgm-on .lgw-pk-x,body.lgm-on .lgw-family-back{min-width:44px;min-height:44px;padding:8px 0;border:0;background:none;color:var(--vh-ink);font:14px var(--vh-body);text-decoration:underline;text-underline-offset:4px;cursor:pointer;}
  body.lgm-on .lgw-pk-x{margin-left:auto;}
  body.lgm-on .lgw-pk-body{min-height:0;overflow:visible;padding:0;}
  body.lgm-on .lgw-pk-guide,body.lgm-on .lgw-family-sub,body.lgm-on .lgw-pk-empty{margin:12px 0;font:14px/1.5 var(--vh-body);color:var(--vh-muted);}
  body.lgm-on .lgw-family-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;padding:0 0 12px;}
  body.lgm-on .lgw-family{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;min-width:0;min-height:100px;padding:10px 8px;text-align:center;cursor:pointer;background:var(--vh-white);border:1px solid var(--vh-line);border-radius:var(--vh-ctl-radius);color:var(--vh-ink);}
  body.lgm-on .lgw-family-ico{display:block;width:34px;height:34px;color:var(--vh-ink);}
  body.lgm-on .lgw-family-nm{font:500 15px/1.3 var(--vh-display);letter-spacing:.04em;text-transform:uppercase;}
  body.lgm-on .lgw-family-count{font:12px/1.35 var(--vh-body);color:var(--vh-muted);}
  body.lgm-on .lgw-family-arrow{position:absolute;right:8px;top:6px;font:14px var(--vh-body);color:var(--vh-text-faint);}
  body.lgm-on .lgw-family-head{display:flex;flex-direction:column;align-items:flex-start;padding:4px 0 10px;border-bottom:1px solid var(--vh-line);}
  body.lgm-on .lgw-family-title{margin:4px 0 0;font:500 22px/1.3 var(--vh-display);letter-spacing:.05em;text-transform:uppercase;}
  body.lgm-on .lgw-family-title:focus-visible{outline:2px solid var(--vh-ink);outline-offset:3px;}
  body.lgm-on .lgw-family-sub{margin:6px 0 0;}
  body.lgm-on .lgw-product-list{display:flex;flex-direction:column;gap:10px;padding-top:12px;}
  body.lgm-on .lgw-product{display:grid;grid-template-columns:64px minmax(0,1fr);gap:6px 12px;width:100%;min-height:104px;padding:10px;text-align:left;background:var(--vh-white);color:var(--vh-ink);border:1px solid var(--vh-line);border-radius:var(--vh-ctl-radius);cursor:pointer;}
  body.lgm-on .lgw-product-ph{grid-row:1/4;display:flex;align-items:center;justify-content:center;width:64px;min-height:76px;align-self:start;padding:4px;background:#fff;border:1px solid var(--vh-line);}
  body.lgm-on .lgw-product-ph .lgw-gcard-img,body.lgm-on .lgw-product-ph .lgw-gcard-ico{display:block;width:54px;height:68px;object-fit:contain;color:var(--vh-ink);}
  body.lgm-on .lgw-product-words{grid-column:2;display:flex;flex-direction:column;gap:4px;min-width:0;}
  body.lgm-on .lgw-product-nm{font:500 16px/1.3 var(--vh-display);letter-spacing:.03em;text-transform:uppercase;}
  body.lgm-on .lgw-product-meta,body.lgm-on .lgw-product-desc{font:13px/1.45 var(--vh-body);color:var(--vh-muted);}
  body.lgm-on .lgw-product-pr{grid-column:2;font:500 14px/1.4 var(--vh-body);}
  body.lgm-on .lgw-product-check{grid-column:2;font:12px/1.35 var(--vh-body);color:var(--vh-muted);}
  body.lgm-on .lgw-pk-colors{margin-top:18px;padding-top:14px;border-top:1px solid var(--vh-line);}
  body.lgm-on .lgw-pk-colorhead{display:flex;align-items:baseline;flex-wrap:wrap;gap:8px;margin-bottom:10px;}
  body.lgm-on .lgw-pk-lbl{margin:0;font:500 18px var(--vh-display);text-transform:uppercase;letter-spacing:.05em;}
  body.lgm-on .lgw-pk-colorname{margin-left:auto;font:14px var(--vh-body);color:var(--vh-muted);}
  body.lgm-on .lgw-swgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(78px,1fr));gap:8px;}
  body.lgm-on .lgw-swpick{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;min-width:0;min-height:72px;padding:8px 6px;background:var(--vh-white);border:1px solid var(--vh-line);border-radius:var(--vh-ctl-radius);color:var(--vh-ink);cursor:pointer;}
  body.lgm-on .lgw-swdot{display:block;width:28px;height:28px;border-radius:50%;border:1px solid var(--vh-line-strong);background-size:cover;background-position:center;}
  body.lgm-on .lgw-swnm{font:12px/1.35 var(--vh-body);color:var(--vh-muted);overflow-wrap:anywhere;}
  body.lgm-on .lgw-family:hover,body.lgm-on .lgw-product:hover,body.lgm-on .lgw-swpick:hover{border-color:var(--vh-ink);}
  body.lgm-on .lgw-family[disabled],body.lgm-on .lgw-product[disabled],body.lgm-on .lgw-swpick[disabled]{opacity:.45;cursor:not-allowed;}

  /* One in-flow strip: existing side cards and explicit workspace actions. */
  body.lgm-on #lgm-views{grid-area:views;display:flex;align-items:center;gap:8px;min-width:0;padding:6px 12px;border-top:1px solid var(--vh-line);background:var(--vh-white);}
  body.lgm-on #lgm-views .lgw-angles{display:flex;order:0;flex:1 1 0;align-items:stretch;gap:6px;min-width:0;overflow-x:auto;overscroll-behavior-x:contain;padding:2px;}
  body.lgm-on #lgm-views .lgw-angles:empty{display:none;}
  body.lgm-on #lgm-editor-tools{display:flex;flex:0 0 auto;align-items:center;gap:12px;min-height:52px;padding:4px 12px 4px 18px;border-bottom:1px solid var(--vh-line);}
  body.lgm-on #lgm-sheet-title{flex:1;min-width:0;margin:0;font:500 21px/1.25 var(--vh-display);letter-spacing:.025em;overflow-wrap:anywhere;}
  body.lgm-on #lgm-sheet-title:focus-visible{outline:2px solid var(--vh-ink);outline-offset:3px;}
  body.lgm-on #lgm-sheet-done{min-width:52px;min-height:44px;padding:8px 6px;border:0;background:none;color:var(--vh-ink);font:14px/1.3 var(--vh-body);text-decoration:underline;text-underline-offset:4px;cursor:pointer;}
  body.lgm-on #lgm-editor-tools .lgm-done-typing{margin-left:auto;}
  body.lgm-on .lgw-angle{display:grid;grid-template-columns:28px minmax(0,1fr);grid-template-rows:auto auto;align-items:center;gap:2px 6px;flex:0 0 auto;min-width:106px;min-height:52px;padding:6px;background:var(--vh-white);border:1px solid var(--vh-line-strong);border-radius:var(--vh-ctl-radius);color:var(--vh-ink);text-align:left;cursor:pointer;}
  body.lgm-on .lgw-ang-ph{grid-row:1/3;display:flex;align-items:center;justify-content:center;width:28px;height:36px;overflow:hidden;background:#fff;border:1px solid var(--vh-line);}
  body.lgm-on .lgw-ang-img{width:100%;height:100%;object-fit:contain;}
  body.lgm-on .lgw-ang-mir{transform:scaleX(-1);}
  body.lgm-on .lgw-angle[data-lgw-view="Left side"] .lgw-ang-img,body.lgm-on .lgw-angle[data-lgw-view="Right side"] .lgw-ang-img{scale:2.2;translate:0 -6%;}
  body.lgm-on .lgw-angles:has(.lgw-angle[data-lgw-view="Left side"]) .lgw-angle[data-lgw-view="Front"] .lgw-ang-img{scale:1.4;translate:0 -4%;}
  body.lgm-on .lgw-ang-an{display:flex;align-items:center;gap:4px;font:500 12px/1.3 var(--vh-display);letter-spacing:.03em;text-transform:uppercase;}
  body.lgm-on .lgw-ang-tick{display:none;font:11px var(--vh-body);color:var(--vh-ok);}
  body.lgm-on .lgw-ang-sub{display:flex;align-items:center;gap:3px;white-space:nowrap;font:10px/1.3 var(--vh-body);color:var(--vh-muted);}
  body.lgm-on .lgw-angle.lgw-ang-marked .lgw-ang-tick{display:inline;}
  body.lgm-on .lgw-angle.lgw-ang-on{background:var(--vh-cream);border-color:var(--vh-ink);box-shadow:inset 0 0 0 1px var(--vh-ink);}

  body.lgm-on .lgw-ins-actions{grid-template-columns:repeat(2,minmax(0,1fr));}
  body.lgm-on .lgw-ins-action{min-height:68px;}
  body.lgm-on .lgw-ins-action-title{font-size:14px;}
  body.lgm-on .lgw-ins-action-note{font-size:12px;}
  body.lgm-on .lgw-ds-x,body.lgm-on .lgw-ds-yes,body.lgm-on .lgw-ds-no{min-width:44px;min-height:44px;}
  /* the saved design's name (Rename): a 44px tall hit area over its one
     line, the tile's look unchanged */
  body.lgm-on .lgw-lib-rename::before{content:"";position:absolute;left:0;right:0;top:50%;height:44px;transform:translateY(-50%);}
  body.lgm-on .lgw-ds-confirm{flex-wrap:wrap;} /* L1b: the confirm is a strip along the tile's field now */
  body.lgm-on .lgw-ds-nudge{font-size:14px;}
  body.lgm-on .lgw-math{padding:12px;}
  body.lgm-on .lgw-mx-card{max-height:calc(100dvh - var(--lgw-top,var(--nav-height)) - 24px);}

  /* Uploaded-logo colors keep the same palette, selection and focus owner. */
  body.lgm-on .lgm-ws:has(#lgw-cl-pal.lgw-cl-open){z-index:60;}
  body.lgm-on #lgw-cl-pal{position:fixed;inset:0;z-index:80;padding:0;align-items:stretch;justify-content:center;}
  body.lgm-on #lgw-cl-pal.lgw-cl-open{display:flex;}
  body.lgm-on #lgw-cl-pal .lgw-cl-scrim{position:absolute;inset:0;background:rgba(24,21,16,.45);}
  body.lgm-on #lgw-cl-pal .lgw-cl-card{position:relative;display:flex;flex-direction:column;width:100%;height:100dvh;max-height:100dvh;overflow:hidden;border:0;border-radius:0;background:var(--vh-white);color:var(--vh-ink);}
  body.lgm-on #lgw-cl-pal .lgw-cl-phead{position:relative;flex-shrink:0;padding:20px 66px 20px 18px;border-bottom:1px solid var(--vh-line);}
  body.lgm-on #lgw-cl-pal .lgw-cl-ptitle{margin:0;font:500 22px/1.3 var(--vh-display);letter-spacing:.04em;}
  body.lgm-on #lgw-cl-pal .lgw-cl-x{position:absolute;right:12px;top:12px;min-width:44px;min-height:44px;padding:8px;background:none;border:1px solid var(--vh-line-strong);border-radius:0;color:var(--vh-ink);font:16px var(--vh-body);cursor:pointer;}
  body.lgm-on #lgw-cl-pal .lgw-cl-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));align-content:start;gap:8px;flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;padding:16px 18px calc(20px + env(safe-area-inset-bottom));}
  body.lgm-on #lgw-cl-pal .lgw-cl-sw{display:flex;align-items:center;flex-wrap:wrap;gap:5px 8px;min-width:0;min-height:60px;padding:10px;background:var(--vh-white);border:1px solid var(--vh-line);border-radius:var(--vh-ctl-radius);text-align:left;color:var(--vh-ink);cursor:pointer;}
  body.lgm-on #lgw-cl-pal .lgw-cl-sw[hidden]{display:none;}
  body.lgm-on #lgw-cl-pal .lgw-cl-cur{background:var(--vh-cream);border-color:var(--vh-ink);box-shadow:inset 0 0 0 1px var(--vh-ink);}
  body.lgm-on #lgw-cl-pal .lgw-cl-swdot{width:28px;height:28px;flex:0 0 28px;border:1px solid var(--vh-line-strong);border-radius:50%;}
  body.lgm-on .lgw-cl-dot--clear{background:var(--vh-white);background-image:linear-gradient(45deg,var(--vh-line) 25%,transparent 25%,transparent 75%,var(--vh-line) 75%),linear-gradient(45deg,var(--vh-line) 25%,transparent 25%,transparent 75%,var(--vh-line) 75%);background-size:8px 8px;background-position:0 0,4px 4px;}
  body.lgm-on #lgw-cl-pal .lgw-cl-swno{font:600 14px var(--vh-body);}
  body.lgm-on #lgw-cl-pal .lgw-cl-swnm{font:13px/1.4 var(--vh-body);white-space:normal;overflow-wrap:anywhere;}
  body.lgm-on #lgw-cl-pal button:focus-visible{outline:2px solid var(--vh-ink);outline-offset:2px;}

  /* The canvas shows no tool sheet. The workspace's layout (the canvas, the
     sheet on the bar, the tablet band) is studio_sheet.css's (drive S1). */
  body.lgm-on .lgm-ws[data-phone-surface="canvas"] .lgm-sheet{display:none;}
  body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) #lgm-review-next{display:none;}
}

@media all{
@media(min-width:700px),(min-width:560px) and (orientation:landscape){
  /* Landscape and tablet give the panels' contents more room. */
  body.lgm-on .lgm-body .lg-step{padding:18px 22px 24px;}
  body.lgm-on .lgw-family-grid{grid-template-columns:repeat(3,minmax(0,1fr));}
  body.lgm-on .lgm-ws[data-phone-surface="sheet"] .lgm-body .lg-step{max-width:860px;margin-inline:auto;}
  body.lgm-on #lgt-phone-chooser .lgw-cl-grid,body.lgm-on #lgw-cl-pal .lgw-cl-grid{grid-template-columns:repeat(3,minmax(0,1fr));}
}
@media(max-height:700px) and (max-width:559px){
  /* Keep the garment measurable, but let long action content scroll instead
     of pushing the footer below the fixed workspace. */
  body.lgm-on .lgm-topline{padding-block:2px;}
  body.lgm-on #lgm-garment-open{min-height:44px;}
  body.lgm-on .lgm-context{padding-top:6px;padding-bottom:4px;}
  body.lgm-on .lgm-selection{margin-bottom:5px;}
  body.lgm-on #lgm-selected-actions button{min-height:44px;}
  body.lgm-on #lgm-empty-actions button{min-height:48px;}
  body.lgm-on #lgm-add-open,body.lgm-on #lgm-pieces-open{margin-top:0;}
}
}

/* Live stock Part B (PB-4): the phone list's out colour (greyed, the dot's
   diagonal is studio_visual.css's); a tap on it picks nothing. A tile is the
   dot, the bare S&S name and, each on its own smaller line, its words ("12
   left", "Out of stock", "+$12.45 a piece"). A name never breaks inside a
   word: pkFitColors measures in whole words (--fit) and a tile with a word
   wider than itself spans two; the dense flow fills the cell it leaves and a
   row's tiles share its height. Breaking anywhere stays only as the last
   resort for a word no tile can hold (a very large text size). */
body.lgm-on .lgw-swpick[aria-disabled="true"]{opacity:.7;}
body.lgm-on .lgw-swnote{display:block;font:12px/1.35 var(--vh-body);color:var(--vh-muted);text-align:center;overflow-wrap:anywhere;text-wrap:balance;}
body.lgm-on .lgw-swpick[aria-disabled="true"] .lgw-swnote{color:var(--vh-ink);}
body.lgm-on .lgw-swgrid{grid-auto-flow:row dense;}
body.lgm-on .lgw-swgrid--fit :is(.lgw-swnm,.lgw-swnote){overflow-wrap:normal;}
body.lgm-on .lgw-swpick--wide{grid-column:span 2;}

/* One return-recovery notice, seated by the existing responsive shell. */
.lg-return-status{min-width:0;padding:12px 16px;border:1px solid var(--vh-line-strong);background:var(--vh-cream);color:var(--vh-ink);font:14px/1.45 var(--vh-body);}
.lg-return-status[hidden]{display:none!important;}
.lg-return-status p{margin:0;overflow-wrap:anywhere;}
.lg-return-status button{min-width:44px;min-height:44px;margin-top:8px;padding:8px 12px;border:1px solid var(--vh-ink);border-radius:0;background:var(--vh-ink);color:var(--vh-white);font:500 14px/1.4 var(--vh-body);cursor:pointer;}
.lg-return-status button:focus-visible{outline:2px solid var(--vh-ink);outline-offset:3px;}
.lg-return-status button:disabled{opacity:.55;cursor:wait;}
/* Every phone surface retains the top row, including keyboard and Position.
   Recovery must not revive a hidden checkout footer or retired grid layout. */
body.lgm-on .lgm-topline:has(>.lg-return-status:not([hidden])){flex-wrap:wrap;}
body.lgm-on .lgm-topline>.lg-return-status{flex:1 0 100%;max-height:35dvh;overflow:auto;padding:10px 12px;}
/* R-004: "Your design from before" rides the same seat; Start fresh is the quiet key */
body.lgm-on .lgm-topline:has(>#lgw-wip-offer:not([hidden])){display:flex;flex-wrap:wrap;}
.lgw-wip-offer #lgw-wip-fresh{margin-left:8px;background:transparent;color:var(--vh-ink);}

/* Local preview: one flat commercial ledger, using the existing vintage world. */
body .lgw-preupload-facts:not([hidden]) {
  color: var(--vh-muted);
  font: 14px/1.5 var(--vh-body);
}
body.lgw-on .lgw-ins-preupload-seat > .lgw-preupload-facts,
body.lgc-on .lgc-preupload-seat > .lgw-preupload-facts {
  padding: 12px 0;
  border: 0;
  border-top: 1px solid var(--vh-line);
  border-radius: 0;
  background: transparent;
}
.lgw-preupload-facts p { margin: 0; }
.lgw-preupload-facts .lgw-facts-rate {
  margin-bottom: 4px;
  color: var(--vh-ink);
  font: 500 20px/1.3 var(--vh-display);
  font-variant-numeric: tabular-nums;
}
.lgw-preupload-facts .lgw-facts-fee {
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 4px 16px;
  margin-top: 10px;
  padding-top: 8px;
  border-top: 1px solid var(--vh-line);
  color: var(--vh-ink);
}
.lgw-facts-fee-value { font-variant-numeric: tabular-nums; }
.lgw-facts-details { margin-top: 8px; }
.lgw-facts-details > summary {
  width: fit-content;
  min-height: 28px;
  padding: 3px 0;
  color: var(--vh-ink);
  cursor: pointer;
  text-decoration: underline;
  text-underline-offset: 3px;
}
.lgw-facts-details > summary:hover { text-decoration-thickness: 2px; }
.lgw-facts-details > summary:focus-visible {
  outline: 2px solid var(--vh-ink);
  outline-offset: 3px;
}
.lgw-facts-details .lgw-facts-summary { margin-top: 6px; }
/* Match the shell's phone query exactly, including fractional CSS widths. */
@media not all and (min-width: 1100px) {
  .lgw-facts-details > summary { min-height: 44px; padding: 11px 0; }
}

/* Local photo-led style-row preview. No category tile or summary overrides. */
body .lgw-product.lgw-product--photo {
  grid-template-columns: 128px minmax(0, 1fr);
  grid-template-rows: auto 1fr;
  gap: 8px 16px;
  min-width: 0;
  min-height: 160px;
  padding: 12px;
  border-radius: 0;
  background: #fff;
  box-shadow: none;
}
body .lgw-product.lgw-product--photo:hover { background: #fff; border-color: var(--vh-ink); }
body .lgw-product.lgw-product--photo.lgw-pk-sel {
  border-color: var(--vh-ink);
  outline: 1px solid var(--vh-ink);
  outline-offset: -2px;
}
body .lgw-product.lgw-product--photo:focus-visible { outline: 2px solid var(--vh-ink); outline-offset: 3px; }
body .lgw-product.lgw-product--photo .lgw-product-ph {
  grid-column: 1;
  grid-row: 1 / span 2;
  align-self: center;
  width: 128px;
  min-height: 144px;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: transparent;
}
body .lgw-product.lgw-product--photo .lgw-product-ph .lgw-gcard-img,
body .lgw-product.lgw-product--photo .lgw-product-ph .lgw-gcard-ico {
  width: 128px;
  height: 144px;
  object-fit: contain;
}
body .lgw-product.lgw-product--photo .lgw-product-words {
  grid-column: 2;
  grid-row: 1;
  gap: 6px;
  min-width: 0;
  align-self: start;
  overflow-wrap: anywhere;
}
body .lgw-product.lgw-product--photo .lgw-product-nm {
  font: 500 18px/1.3 var(--vh-display);
  letter-spacing: .02em;
}
body .lgw-product.lgw-product--photo .lgw-product-pr {
  font: 500 14px/1.4 var(--vh-body);
  color: var(--vh-ink);
  white-space: normal;
  font-variant-numeric: tabular-nums;
}
body .lgw-product.lgw-product--photo .lgw-product-price-note,
body .lgw-product.lgw-product--photo .lgw-product-colors {
  display: block;
  font: 13px/1.45 var(--vh-body);
  color: var(--vh-muted);
}
/* B7: the fabric-weight + Size guide meta line under the style name. One
   muted line; the guide is a plain underlined text link, not a button. */
body .lgw-product.lgw-product--photo .lgw-product-meta {
  display: block;
  font: 13px/1.45 var(--vh-body);
  color: var(--vh-muted);
}
body .lgw-product.lgw-product--photo .lgw-product-guide {
  color: inherit;
  text-decoration: underline;
  text-underline-offset: 0.15em;
}
body .lgw-product.lgw-product--photo .lgw-product-guide:hover { color: var(--vh-ink); }
body .lgw-product.lgw-product--photo .lgw-product-check {
  grid-column: 2;
  grid-row: 2;
  justify-self: start;
  font: 500 13px/1.4 var(--vh-body);
  letter-spacing: 0;
  text-transform: none;
}
/* Same exact cutoff as the shell, including fractional CSS viewport widths. */
@media not all and (min-width: 1100px) {
  body .lgw-product.lgw-product--photo { grid-template-columns: 104px minmax(0, 1fr); gap: 8px 12px; padding: 10px; min-height: 148px; }
  body .lgw-product.lgw-product--photo .lgw-product-ph { width: 104px; min-height: 128px; }
  body .lgw-product.lgw-product--photo .lgw-product-ph .lgw-gcard-img,
  body .lgw-product.lgw-product--photo .lgw-product-ph .lgw-gcard-ico { width: 104px; height: 128px; }
  body .lgw-product.lgw-product--photo .lgw-product-nm { font-size: 16px; }
}

/* One browsing hierarchy: heading, current choice, categories/styles, facts.
   The phone workspace already owns the heading and current-choice top bar. */
body.lgw-on .lgw-panel .lg-step:has(.lgw-picker.lgw-pk-open) > .lg-step-head {
  display: none;
}
body.lgw-on .lgw-picker.lgw-pk-open {
  margin-top: 0;
  padding-top: 0;
  border-top: 0;
}
body.lgw-on .lgw-picker .lgw-pk-head {
  margin-bottom: 12px;
  padding-top: 0;
  padding-bottom: 12px;
  border-top: 0;
}
body.lgw-on .lgw-picker .lgw-pk-title { font-size: 20px; letter-spacing: .08em; }
body.lgw-on .lgw-picker .lgw-prod--browse {
  display: grid;
  grid-template-columns: 56px minmax(0, 1fr);
  gap: 12px;
  align-items: center;
  margin: 0 0 16px;
  padding: 0 0 12px;
  border: 0;
  border-bottom: 1px solid var(--vh-line);
  border-radius: 0;
  background: transparent;
}
body.lgw-on .lgw-picker .lgw-prod--browse .lgw-prod-ph {
  width: 56px;
  height: 64px;
  min-height: 0;
  padding: 0;
  border: 0;
  background: white;
}
body.lgw-on .lgw-picker .lgw-prod--browse .lgw-prod-ph :is(img, svg) {
  width: 56px;
  height: 64px;
}
body.lgw-on .lgw-picker .lgw-prod--browse .lgw-prod-meta {
  display: flex;
  align-items: flex-start;
  flex-direction: column;
  gap: 3px;
  min-width: 0;
  padding: 0;
  border: 0;
}
body.lgw-on .lgw-picker .lgw-prod--browse .lgw-prod-nm {
  font-size: 16px;
  line-height: 1.3;
  letter-spacing: .06em;
}
body.lgw-on .lgw-picker .lgw-prod--browse .lgw-prod-sub {
  font-size: 14px;
  line-height: 1.4;
}
body:is(.lgw-on, .lgm-on) .lgw-picker .lgw-family-head {
  margin-bottom: 14px;
  padding-bottom: 0;
  border-bottom: 0;
}
body:is(.lgw-on, .lgm-on) .lgw-picker .lgw-family-back {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  margin-bottom: 4px;
  padding: 0;
}
body:is(.lgw-on, .lgm-on) .lgw-picker .lgw-pk-facts {
  margin: 20px 0 0;
  padding: 16px 0 0;
  border-top: 1px solid var(--vh-line);
}
.lgw-pk-facts:not(:has(> .lgw-preupload-facts:not([hidden]))) { display: none; }
.lgw-pk-facts-title {
  margin: 0 0 8px;
  color: var(--vh-muted);
  font: 400 14px/1.4 var(--vh-body);
}
body:is(.lgw-on, .lgm-on) .lgw-picker .lgw-pk-facts > .lgw-preupload-facts:not([hidden]) {
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: transparent;
}
/* This is the same live current garment as the phone top bar, not another
   choice. Leave the top bar visible and eliminate its duplicate in the sheet. */
@media not all and (min-width: 1100px) {
  body.lgm-on .lgm-ws[data-phone-workspace][data-phone-tool="garment"] .lgw-picker .lgw-prod--browse {
    display: none;
  }
  body.lgm-on .lgw-picker.lgw-pk-open {
    margin-top: 0;
    padding-top: 0;
    border-top: 0;
  }
}

/* Studio's operating controls. Loaded after the presentation sheets, scoped
   to the canonical phone/desktop shells; classic and admin tune are unchanged.
   Embroidered specimens, swatches and physical canvas geometry are not type UI.
   Root is normally 62.5%: rem values here remain responsive to text enlargement. */
:is(body.lgm-on, body.lgw-on) {
  --st-control-min: max(44px, 4.4rem);
  --st-control-height: max(48px, 4.8rem);
  --st-action-size: 1.6rem;
  --st-utility-size: 1.4rem;
  --st-control-border: #817866;
  --st-control-selected: #EEE9DF;
  --st-control-hover: #F4F0E7;
}
:is(body.lgm-on, body.lgw-on) [hidden] { display: none !important; }

/* A shared command family. Explicit membership avoids flattening the artwork,
   site navigation, inline resource links or a colour/font specimen. */
:is(body.lgm-on, body.lgw-on) :is(
  #lgm-review-open, #lgm-sheet-done, #lgm-empty-actions :where(button),
  #lgm-selected-actions :where(button), #lgm-add-open, #lgm-pieces-open,
  #lgm-empty-open, .lgm-empty-action, .lgm-camera-tools button,
  .lgm-placement-tools button, .lgw-panel-back, .lgw-ins-back,
  .lgw-family-back, .lgw-pk-x, #lgw-prod-change, #lgw-ins-swap,
  .lgw-save,
  #lgw-review-return, .lg-base-btn, .lg-tool,
  .lgw-ins-add, .lgw-ins-spot, .lgw-ins-clbtn, .lgw-ins-th,
  .lgw-ds-x, .lgw-ds-no, .lgw-ds-yes, .lgw-dg-retry,
  button.lgt-retry, #lgt-th-cur, #lgt-phone-font-open, .lgt-phone-chooser-done,
  .lgw-cl-btn, .lgw-mx-x, .lgw-cl-x, .lgw-price-math,
  .lg-return-status button
) {
  box-sizing: border-box;
  min-width: var(--st-control-min);
  min-height: var(--st-control-height);
  height: auto;
  padding: .9rem 1.2rem;
  border: 1px solid var(--st-control-border);
  border-radius: 0;
  background: var(--vh-white);
  color: var(--vh-ink);
  font: 500 var(--st-action-size)/1.35 var(--vh-body);
  font-style: normal;
  letter-spacing: normal;
  text-transform: none;
  text-decoration: none;
  text-underline-offset: initial;
  box-shadow: none;
  cursor: pointer;
  transition: none;
  transform: none;
  white-space: normal;
  overflow-wrap: anywhere;
}

/* Secondary command titles are not brand eyebrows. Keep the real sample face
   inside .lgt-font-ph and thread chips untouched. */
:is(body.lgm-on, body.lgw-on) :is(
  .lgw-ins-action-title, .lgw-ang-an, .lgw-step .lgw-lb,
  .lgw-pk-lbl, .lgw-ins-lbl, .lgt-th-t, .lgt-size-t,
  .lgw-ds-h2, .lgw-swnm, .lgt-font-nm
) {
  font: 500 var(--st-action-size)/1.35 var(--vh-body);
  letter-spacing: normal;
  text-transform: none;
  color: var(--vh-ink);
}
:is(body.lgm-on, body.lgw-on) :is(.lgw-ins-lbl, .lgw-pk-lbl, .lgt-th-t, .lgt-size-t, .lgw-ds-h2) {
  font-weight: 600;
}
:is(body.lgm-on, body.lgw-on) :is(
  .lg-step-t, .lgw-tt, .lgw-ins-title, .lgw-pk-title, .lgw-family-title,
  .lgw-order-title, #lgm-sheet-title, #lgw-review-title, #lgt-phone-chooser-title
) {
  font: 500 2.4rem/1.25 var(--vh-display);
  letter-spacing: .01em;
  text-transform: none;
  white-space: normal;
  overflow-wrap: anywhere;
}
:is(body.lgm-on, body.lgw-on) :is(.lgw-family-nm, .lgw-product-nm, .lgw-prod-nm, #lgm-garment-name) {
  font: 500 2rem/1.25 var(--vh-display);
  letter-spacing: .01em;
  text-transform: none;
  overflow-wrap: anywhere;
}
:is(body.lgm-on, body.lgw-on) :is(
  .lgw-order-copy, .lgw-order-proof,
  .lgw-ds-nudge, .lgw-ds-soon, .lgw-family-intro, .lgw-pk-note,
  .lgw-ins-spots-hint, .lgt-geometry-review, .lgt-review-entry
) {
  font: 400 1.6rem/1.55 var(--vh-body);
  letter-spacing: normal;
  text-transform: none;
}
:is(body.lgm-on, body.lgw-on) :is(
  .lgw-ins-action-note, .lgw-family-count, .lgw-ang-sub,
  .lgw-ins-arrange-note,
  .lgw-product-check, .lgw-product-colors, .lgw-product-price-note,
  #lgm-garment-meta, #lgm-view-hint, #lgm-selection-meta
) {
  font: 400 1.4rem/1.4 var(--vh-body);
  letter-spacing: normal;
  text-transform: none;
  color: var(--vh-muted);
}
:is(body.lgm-on, body.lgw-on) .lgw-ins-arrange-note {
  margin: .8rem 0 1.2rem;
}
:is(body.lgm-on, body.lgw-on) :is(.lgw-product-pr, .lgw-product-feel) {
  font: 500 1.6rem/1.4 var(--vh-body);
  letter-spacing: normal;
  text-transform: none;
  color: var(--vh-ink);
}
:is(body.lgm-on, body.lgw-on) .lgw-facts-details > summary {
  min-height: var(--st-control-min);
  padding: 1rem 0;
  font: 500 1.4rem/1.4 var(--vh-body);
  text-decoration: none;
}
:is(body.lgm-on, body.lgw-on) #lgt-th-cur :is(.lgw-cl-swno, .lgw-cl-swnm, .lgw-th-nm),
:is(body.lgm-on, body.lgw-on) #lgt-size-val {
  font: 500 1.6rem/1.4 var(--vh-body);
  letter-spacing: normal;
  text-transform: none;
  color: var(--vh-ink);
  white-space: normal;
}

/* The quiet utility variant shares typography and touch geometry, but does
   not outline every action in a navigation strip. Back is a verb, not Save. */
:is(body.lgm-on, body.lgw-on) :is(
  #lgm-sheet-done, .lgw-panel-back, .lgw-ins-back, .lgw-family-back,
  #lgw-review-return, .lgm-camera-tools button, #lgm-add-open,
  .lgw-price-math, #lgw-ins-swap
),
/* All designs is the phone's row into its list of pieces (it rides the
   Library panel's body, .lgm-only); the desktop Library never paints it */
body.lgm-on #lgm-pieces-open {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .6rem;
  min-height: var(--st-control-min);
  border-color: transparent;
  background: transparent;
  font-size: var(--st-utility-size);
}
:is(body.lgm-on, body.lgw-on) :is(.lgw-panel-back, .lgw-ins-back, #lgw-review-return)::before {
  content: '\2190';
  position: static;
  width: auto;
  min-width: 0;
  height: auto;
  transform: none;
  font-family: var(--vh-body);
}
:is(body.lgm-on, body.lgw-on) .lgw-family-back { padding-left: 0; }
/* Panel heads on the desktop: the back control sits on the title's row, at
   the right and on one line (a long title wraps instead); a subline takes
   the row below. One rule for every head: Library, Text, Review, the
   inspector and the garment step (its Back to review). */
body.lgw-on .lgw-panel .lg-step.lgw-active > .lg-step-head > :is(.lg-step-t, .lgw-tt) {
  flex: 1 1 0%;
  min-width: 0;
  white-space: normal;
  text-wrap: pretty;
}
body.lgw-on .lgw-panel .lg-step-head > :is(.lgw-panel-back, #lgw-ins-back) {
  flex: 0 0 auto;
  margin-left: auto;
  white-space: nowrap;
  overflow-wrap: normal;
}
body.lgw-on .lgw-panel .lg-step-head > :is(.lg-step-s, .lgw-ins-sub) { flex: 0 0 100%; }
/* The earlier phone identity card has a scoped descendant rule. Match that
   real owner without raising the specificity of every shared command. */
:is(body.lgm-on, body.lgw-on) #lgw-ins-id #lgw-ins-swap {
  min-width: var(--st-control-min);
  min-height: var(--st-control-min);
  padding: .7rem .8rem;
  border: 1px solid transparent;
  background: transparent;
  font: 500 var(--st-utility-size)/1.35 var(--vh-body);
  letter-spacing: normal;
  text-transform: none;
  text-decoration: none;
}
:is(body.lgm-on, body.lgw-on) #lgw-ins-swap::before { content: none; }
:is(body.lgm-on, body.lgw-on) :is(.lgw-ins-thno, .lgw-ins-thchg) {
  font: 500 1.4rem/1.4 var(--vh-body);
  letter-spacing: normal;
  text-transform: none;
  text-decoration: none;
  color: var(--vh-muted);
}
:is(body.lgm-on, body.lgw-on) .lgw-ins-thnm {
  font: 500 1.6rem/1.4 var(--vh-body);
  letter-spacing: normal;
  text-transform: none;
}
:is(body.lgm-on, body.lgw-on) :is(#lg-tools .lg-tool, .lg-tool, .lgm-placement-tools button) {
  min-height: var(--st-control-min);
  font-size: var(--st-utility-size);
  padding: .7rem .9rem;
}
:is(body.lgm-on, body.lgw-on) .lg-tools { gap: .6rem; box-shadow: none; border-radius: 0; }

/* Selected options keep a single, stable boundary. Nothing marks the current
   option down one side (Joel 2026-10-01: a bar down the side "is a huge sign
   of AI"); the shells draw the selected outline (studio_visual.css). */
:is(body.lgm-on, body.lgw-on) :is(.lgw-angle, .lgw-family, .lgw-product, .lgw-swpick, .lgt-font) {
  position: relative;
  min-height: var(--st-control-height);
  border: 1px solid var(--st-control-border);
  border-radius: var(--vh-ctl-radius);
  color: var(--vh-ink);
  background: var(--vh-white);
  box-shadow: none;
  transition: none;
  transform: none;
}
:is(body.lgm-on, body.lgw-on) :is(
  .lgw-angle.lgw-ang-on, .lgw-family.lgw-pk-sel,
  .lgw-product.lgw-pk-sel, .lgw-swpick.lgw-pk-sel,
  .lgt-font[aria-current="true"], .lgw-ins-spot.lgw-ins-spot--on,
  .lg-tool[aria-pressed="true"], #lgm-selected-actions button[aria-pressed="true"],
  .lgm-context button[aria-pressed="true"]
) {
  background: var(--st-control-selected);
  border-color: var(--vh-ink);
  color: var(--vh-ink);
  box-shadow: none;
  outline: none;
}
:is(body.lgm-on, body.lgw-on) .lgw-angle.lgw-ang-on .lgw-ang-an::after {
  content: '';
  display: inline-block;
  flex: 0 0 .6rem;
  width: .6rem;
  height: .6rem;
  margin-left: .5rem;
  border-radius: 50%;
  background: currentColor;
}

/* Primary commands, not selected options. Opening Review does not claim the
   design is complete; validation and blocking reasons still belong to Continue. */
:is(body.lgm-on, body.lgw-on) #lg-continue,
body.lgm-on[data-studio-has-artwork="true"] #lgm-review-open,
body.lgm-on #lgm-empty-actions button:first-child {
  background: var(--vh-ink);
  border-color: var(--vh-ink);
  color: var(--vh-white);
}
:is(body.lgm-on, body.lgw-on) :is(
  [data-lgm-tool="delete"], #lgm-delete, .lg-tool--del,
  .lgw-ds-x, .lgw-ds-yes
) { color: var(--vh-stop); border-color: var(--vh-stop); }
:is(body.lgm-on, body.lgw-on) :is(.lg-tool--del, [data-lgm-tool="delete"]) { margin-left: .3rem; }

/* Hover never changes geometry. A dedicated focus outline is deliberately
   different from the contained selection fill, including on selected items. */
@media (hover: hover) {
  :is(body.lgm-on, body.lgw-on) :is(
    #lgm-review-open, #lgm-sheet-done, #lgm-empty-actions button,
    #lgm-selected-actions button, .lgw-panel-back, .lgw-family-back,
    #lgw-review-return,
    .lgw-save, .lg-tool, .lgw-ins-action,
    .lgw-angle, .lgw-family, .lgw-product, .lgw-swpick, .lgt-font
  ):hover:not(:disabled) { border-color: var(--vh-ink); box-shadow: none; transform: none; }
  :is(body.lgm-on, body.lgw-on) :is(.lgw-panel-back, #lgw-review-return, #lgm-sheet-done):hover {
    background: var(--st-control-hover);
    border-color: transparent;
  }
}
:is(body.lgm-on, body.lgw-on) :is(.lgm-ws, .lgw-zones, .lgw-math, #lgt-phone-chooser) :is(button, [role="button"], input, select, textarea):focus-visible {
  outline: 2px solid var(--vh-ink);
  outline-offset: 3px;
  box-shadow: 0 0 0 3px var(--vh-white);
}
:is(body.lgm-on, body.lgw-on) :is(button, input, select, textarea) { scroll-margin-block: 1.2rem; }
:is(body.lgm-on, body.lgw-on) :is(.lgm-ws, .lgw-zones) button:disabled {
  cursor: not-allowed;
  opacity: .55;
}
:is(body.lgm-on, body.lgw-on) .lgw-ins-spot:disabled { opacity: 1; }
:is(body.lgm-on, body.lgw-on) :is(#lgt-input, #lgt-phone-chooser input) {
  min-height: var(--st-control-height);
  font: 400 1.6rem/1.45 var(--vh-body);
  border: 1px solid var(--st-control-border);
  border-radius: var(--vh-ctl-radius);
  color: var(--vh-ink);
  background: var(--vh-white);
}

/* Review is a checkpoint with one heading and direct editing by section. */
:is(body.lgm-on, body.lgw-on) #lgw-review-return[hidden] { display: none; }
:is(body.lgm-on, body.lgw-on) #lgw-review-return { margin: .6rem 1.2rem; align-self: flex-start; }
/* Review's Garment and location blocks: css/studio/review_blocks.css owns them. */

/* Phone: the working view has no duplicate bottom Review button/bar. The
   real quantities action appears only inside Review and can use the width. */
body.lgm-on #lgm-review-next { display: none !important; }
body.lgm-on #lgw-review-return { display: none; }
body.lgm-on #lgw-designs > .lg-step-head { display: none; }
body.lgm-on #lgm-review-open { max-width: 13rem; flex-shrink: 0; }
body.lgm-on #lgm-garment-name { font-size: 1.8rem; }
body.lgm-on :is(#lgm-sheet-title, .lg-step-t, .lgw-ins-title) { font-size: 2.2rem; }
body.lgm-on .lgm-editor-tools { flex-wrap: wrap; }
body.lgm-on #lgm-sheet-title { flex: 1 1 12rem; }
body.lgm-on #lgm-sheet-done { flex: 0 1 auto; }
body.lgm-on #lgm-selected-actions { flex-wrap: wrap; }
body.lgm-on #lgm-selected-actions button { flex: 1 1 6.5rem; padding-inline: .6rem; }
body.lgm-on #lgm-empty-actions { gap: .8rem; }
body.lgm-on #lgm-empty-actions button { padding-inline: .6rem; }
body.lgm-on .lgm-camera-tools { gap: .4rem; }
body.lgm-on .lgm-camera-tools button { padding: .7rem 1rem; }
body.lgm-on :is(#lgm-zoom-in, #lgm-zoom-out) { font-size: 2.2rem; }
body.lgm-on #lgm-zoom-design { margin-left: auto; }
body.lgm-on .lgw-ang-sub { white-space: normal; }
body.lgm-on .lgw-angle { gap: .3rem .8rem; padding: .7rem .8rem; }
body.lgm-on #lgm-views .lgw-angle { min-height: var(--st-control-height); }
body.lgm-on #lgm-views .lgw-ang-an { font-size: var(--st-action-size); }
body.lgm-on #lgm-views .lgw-ang-sub { font-size: 1.4rem; }
/* The phone bar (the price and Choose sizes) is studio_sheet.css's, drive S1. */
body.lgm-on[data-studio-review="true"] #lgm-review-open { display: none; }
body.lgm-on[data-studio-review="true"] #lgm-garment-open:disabled { opacity: 1; cursor: default; }
body.lgm-on .lgm-body .lgw-foot-act { gap: .8rem; }
body.lgm-on .lgm-body .lgw-save { flex: 1 1 12rem; }

/* The rail is the inverse version, not a competing button theme. Review is
   separated from editing tools; internal step/order keys remain unchanged. */
body.lgw-on .lgw-step {
  min-height: var(--st-control-height);
  border: 1px solid transparent;
  border-radius: 0;
  color: var(--vh-white);
  box-shadow: none;
  transition: none;
}
body.lgw-on .lgw-step .lgw-lb {
  font: 500 1.6rem/1.35 var(--vh-body);
  letter-spacing: normal;
  text-transform: none;
  color: inherit;
}
body.lgw-on .lgw-step.lgw-active { background: #38342D; color: var(--vh-white); border-color: #817866; }
body.lgw-on .lgw-step[data-lgw-step="order"] { margin-top: auto; border-top-color: #817866; }
body.lgw-on .lgw-step:focus-visible { outline-color: var(--vh-white); outline-offset: -4px; box-shadow: none; }
body.lgw-on .lgw-bench { border-color: var(--st-control-border); border-radius: 0; box-shadow: none; }
body.lgw-on .lgw-bench .lgw-bench-b {
  width: auto;
  min-width: var(--st-control-min);
  min-height: var(--st-control-min);
  height: auto;
  padding: .7rem .8rem;
  font: 500 1.4rem/1.35 var(--vh-body);
  text-transform: none;
  letter-spacing: normal;
  transition: none;
}
body.lgw-on .lgw-bench :is(#lgw-zoom-in, #lgw-zoom-out) { font-size: 2.2rem; }
body.lgw-on .lgw-bench .lgw-bench-pct { font: 400 1.4rem/1.4 var(--vh-body); letter-spacing: normal; }
/* studio B5: the Undo / Redo keys carry an inline currentColor SVG glyph in
   place of a text label; size the glyph to sit like the +/− marks. */
body.lgw-on .lgw-bench .lgw-bench-ur { color: var(--vh-ink); }
body.lgw-on .lgw-bench .lgw-bench-ur svg { width: 1.9rem; height: 1.9rem; display: block; }
body.lgw-on:not([data-studio-review="true"]) .lgw-foot { display: none; }
body.lgw-on .lgw-foot { background: var(--vh-white); border-top: 1px solid var(--vh-line); color: var(--vh-ink); }
body.lgw-on .lgw-foot #lg-continue { font: 500 1.6rem/1.35 var(--vh-body); letter-spacing: normal; text-transform: none; }

@media (forced-colors: active) {
  :is(body.lgm-on, body.lgw-on) :is(.lgw-ang-on, .lgw-pk-sel, .lgw-ins-spot--on, [aria-pressed="true"]) { border-color: Highlight; }
  :is(body.lgm-on, body.lgw-on) :is(.lgm-ws, .lgw-zones) :focus-visible { outline-color: Highlight; }
}

/* ============================================================================
   studio_visual.css — Studio visual pass (desktop /your-logo), 2026-09-21.
   PREVIEW / SKIN ONLY. Loaded LAST, after studio_controls.css, inside the same
   not-tune_mode guard. Deleting this file + its <link> restores today exactly.

   Scope: every rule is under body.lgw-on (the >=1100px desktop shell). A small
   de-gold + radius subset also reaches body.lgm-on (the phone shell) per spec
   section 8 — minimum only, no phone polish. Nothing here touches the classic
   (non lgw-on / non lgm-on) render or tune mode.

   No engine, state, pricing, id, data-key or handler is changed. This is CSS
   over the existing markup. Governing brief: briefs/_SPEC_studio_visual_pass.md.
   ========================================================================== */

/* ==========================================================================
   1 · TOKENS, RADIUS, DE-GOLD, TYPE ROLES
   ========================================================================== */

/* Shell tokens. Full set on the desktop shell; the de-gold + radius subset also
   on the phone shell. Joel is moving away from gold on this page: the warm
   khaki/gold vintage tokens are re-pointed to neutrals inside the studio root,
   so every border, faint text and control edge that used to lean gold reads as
   a warm grey instead. Status + garment swatch + thread colors are untouched. */
body.lgw-on {
  --sv-r-card: 10px;   /* tiles, rows, info blocks, drop zone, stage, angle cards, dialogs */
  --sv-r-ctl: 8px;     /* buttons, inputs, selects, Continue CTA, zoom bench outer */
  --sv-r-sm: 6px;      /* chips, thumbnails, corner-check inner radius */
  --sv-ink: var(--vh-ink);
  --sv-panel: var(--vh-white);
  --sv-tan: #FAF6EE;         /* info-block fill; same warm paper as the drop zone */
  --sv-hair: #E6E1D8;        /* the one soft border color: tiles, rows, blocks */
  --sv-hair-strong: #CFCAC0; /* control borders, dashed drop zone */
  --sv-text-quiet: #6B675F;  /* eyebrows, meta, counters — replaces gold #7A6E4F */
  --sv-rail-quiet: #A9A59C;  /* secondary text on the ink rail */
  --sv-select-fill: #F6F3EC; /* selected tile fill, very quiet */
  --sv-muted: #59554E;       /* de-golded muted text (was #5E574A, 39deg/21%) */

  /* R4·B — panel/family title face behind ONE knob set. Joel saw Bevan live and
     wanted to try a new face. Default = candidate 1 (Oswald 600, sentence case).
     Swap these five to re-face every panel + family title in one place. */
  --sv-title-font: var(--vh-display);   /* Oswald */
  --sv-title-weight: 600;
  --sv-title-size: 2.6rem;
  --sv-title-tracking: .005em;
  --sv-title-transform: none;

  /* R4·N — rail tile knobs. eyebrow: none = hide "Step n of 4" (kept for screen
     readers via clip); block = show it. status-lines: how many lines the live
     status may take (1 = single line, ellipsised). Flip in one line here. */
  --sv-rail-eyebrow: none;
  --sv-rail-status-lines: 1;
}
body.lgm-on {
  --sv-r-card: 10px;
  --sv-r-ctl: 8px;
  --sv-r-sm: 6px;
  --sv-tan: #FAF6EE;
  --sv-hair: #E6E1D8;
  --sv-hair-strong: #CFCAC0;
  --sv-text-quiet: #6B675F;
  --sv-select-fill: #F6F3EC;
  --sv-muted: #59554E;
}

/* De-gold: re-point the gold-leaning vintage + control tokens to the neutrals
   above, once, on the shell root. Everything downstream inherits the neutral. */
body.lgw-on,
body.lgm-on {
  --vh-text-faint: var(--sv-text-quiet);
  --vh-line: var(--sv-hair);
  --vh-line-strong: var(--sv-hair-strong);
  --vh-muted: var(--sv-muted);
  --st-control-border: #8A867E;
  --st-control-selected: var(--sv-select-fill);
  --st-control-hover: #F1EDE4;
}

/* --------------------------------------------------------------------------
   Radius sweep — round off the boxy controls. Joel: "everything is a little
   boxy ... round it more." One radius family, applied by role.
   -------------------------------------------------------------------------- */
:is(body.lgw-on, body.lgm-on) :is(
  .lgw-family, .lgw-product, .lgw-gcard, .lgw-angle, .lgw-swpick, .lgt-font,
  .lgw-fitcard, .lgw-tiercard, .lgw-ins-row, .lgw-ins-th, .lgw-ins-action,
  .lgw-prod, .up-done, .lg-locker-card, .lgw-ds-open, .lgw-ds-thumb,
  .lgw-ins-coach, .lgw-review-block, .lgw-order-proof, .lgw-tonal,
  .lgw-pk-card, .lgw-mx-card, .lgw-cl-card, .lgw-gpop-card
) { border-radius: var(--sv-r-card); }

:is(body.lgw-on, body.lgm-on) :is(
  .lgw-ins-spot, .lgw-cl-btn, .lgw-ins-clbtn, .lgw-mx-x, .lgw-cl-x, .lgw-pk-x,
  .lgw-bench, .lgw-save, .lgw-share,
  .lgw-order .lg-base-btn, .lgw-order .lgw-save, .lgw-order .lgw-share, .lgw-order .lgw-foot-price,
  .lgw-panel-back, #lgw-review-return, #lgw-ins-swap,
  .lgw-mx-once, .lgw-ins-puffrow, #lgt-input
) { border-radius: var(--sv-r-ctl); }

body.lgw-on :is(
  .lgw-ins-thumb, .lgw-ins-thumb--big, .lgw-product-ph, .lgw-family-ico,
  .lgw-gcard-ph, .lgw-ds-thumb, .up-done-head .thumb, .lgw-cl-sw
) { border-radius: var(--sv-r-sm); }

/* Phone (minimum inheritance only): radius on the tiles/cards/buttons it shares.
   No layout, height or Position-panel change. */
body.lgm-on :is(
  .lgw-family, .lgw-product, .lgw-gcard, .lgw-angle, .lgt-font,
  .lgw-ins-row, .lgw-ins-th, .lgw-ins-action, .lgw-ds-open,
  .lgm-tab, .lgw-gpop-card
) { border-radius: var(--sv-r-card); }
body.lgm-on :is(
  #lgm-review-open, #lgm-sheet-done, #lgm-empty-actions button,
  #lgm-selected-actions button, .lgm-camera-tools button, .lgm-placement-tools button,
  .lgw-ins-spot, .lgm-commerce .lgw-save
) { border-radius: var(--sv-r-ctl); }

/* --------------------------------------------------------------------------
   Type roles (comp B's type; the September sentence-case control labels stay).
   -------------------------------------------------------------------------- */

/* Panel / step titles → the --sv-title-* face (default Oswald 600, sentence
   case; R4·B replaced Bevan after Joel saw it live). Overrides the Oswald title
   rule in studio_controls.css by source order. */
:is(body.lgw-on, body.lgm-on) :is(
  .lg-step-t, .lgw-tt, .lgw-ins-title, .lgw-pk-title,
  .lgw-order-title, #lgw-review-title, .lgw-mx-title, .lgw-cl-ptitle,
  .lgw-gpop-t, #lgt-phone-chooser-title
) {
  font-family: var(--sv-title-font);
  font-weight: var(--sv-title-weight);
  font-size: var(--sv-title-size);
  line-height: 1.15;
  letter-spacing: var(--sv-title-tracking);
  text-transform: var(--sv-title-transform);
  color: var(--vh-ink);
}
/* the head override span that lgwShell writes into the engine's step head */
body.lgw-on .lgw-panel .lg-step.lgw-active > .lg-step-head .lgw-tt,
body.lgw-on .lgw-panel .lg-step.lgw-active > .lg-step-head .lg-step-t {
  font-family: var(--sv-title-font);
  font-weight: var(--sv-title-weight);
  font-size: var(--sv-title-size);
  line-height: 1.15;
  letter-spacing: var(--sv-title-tracking);
  text-transform: var(--sv-title-transform);
  color: var(--vh-ink);
}
/* Secondary family title (T-shirts, Hoodies): same face, one step down. */
body.lgw-on .lgw-family-title {
  font-family: var(--sv-title-font);
  font-weight: var(--sv-title-weight);
  font-size: calc(var(--sv-title-size) - .7rem);
  line-height: 1.15;
  letter-spacing: var(--sv-title-tracking);
  text-transform: var(--sv-title-transform);
  color: var(--vh-ink);
}

/* Subtitle directly under a title: body 1.4rem muted, tight .4rem gap. */
body.lgw-on :is(
  .lg-step-s, .lgw-ins-sub, .lgw-family-sub, .lgw-gpop-s
) {
  margin-top: .4rem;
  font-family: var(--vh-body);
  font-weight: 400;
  font-size: 1.4rem;
  line-height: 1.4;
  letter-spacing: 0;
  text-transform: none;
  color: var(--vh-muted);
}

/* Section labels inside a panel (Garment type, Style, Color, Other ways to
   begin, Garment, Embroidery locations): body 600 ink, sentence case. */
body.lgw-on :is(.lgw-pk-lbl, .lgw-ins-lbl, .lgw-ds-h2) {
  font-family: var(--vh-body);
  font-weight: 600;
  font-size: 1.5rem;
  line-height: 1.35;
  letter-spacing: 0;
  text-transform: none;
  color: var(--vh-ink);
}

/* Eyebrows / counters: Oswald 500 uppercase, quiet. */
body.lgw-on :is(.lgw-order-kicker, .lg-stage > .lgw-cap) {
  font-family: var(--vh-display);
  font-weight: 500;
  font-size: 1.1rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--sv-text-quiet);
}

/* ALL money in the shell → Oswald 500, tabular, upright. Cooper Hewitt's own $
   glyph leans; Oswald's is upright. Joel: "all money must be set in Oswald." */
body.lgw-on :is(
  .lgw-price-v, .lgw-product-pr, .lgw-product-price-note, .lgw-gcard-pr,
  .lgw-ang-pr, .lgw-mx-v, .lgw-order .lgw-price-v, .lgw-foot-price .lgw-price-v,
  .lgw-swpr, .lgw-fitcard-pr, .lgw-tiercard-pr, .lgw-ins-pufffee,
  .lgw-facts-rate, .lgw-facts-fee-value
),
body.lgw-on .lgw-product.lgw-product--photo .lgw-product-pr,
body.lgw-on .lgw-product.lgw-product--photo .lgw-product-price-note {
  font-family: var(--vh-display);
  font-style: normal;
  font-variant-numeric: tabular-nums;
  letter-spacing: .02em;
}

/* ==========================================================================
   2 · ONE SELECTION LANGUAGE — white tile, soft border; selected = ink outline
       + quiet fill + ink corner check badge. No edge bars. Front/Back no shift.
   ========================================================================== */

/* Rest state for every option card: white surface, one soft hair border, round.
   (Radius already applied above; this normalizes surface + border + kills the
   drop-shadows the angle/gcard cards carried.) */
:is(body.lgw-on, body.lgm-on) :is(
  .lgw-family, .lgw-product, .lgw-gcard, .lgw-angle, .lgw-swpick, .lgt-font,
  .lgw-fitcard, .lgw-tiercard, .lgw-ins-row
) {
  position: relative;
  background: var(--sv-panel);
  border: 1px solid var(--sv-hair);
  box-shadow: none;
  transition: border-color 120ms ease, box-shadow 120ms ease, background 120ms ease;
}
@media (prefers-reduced-motion: reduce) {
  :is(body.lgw-on, body.lgm-on) :is(
    .lgw-family, .lgw-product, .lgw-gcard, .lgw-angle, .lgw-swpick, .lgt-font,
    .lgw-fitcard, .lgw-tiercard, .lgw-ins-row, .lgw-ins-spot
  ) { transition: none; }
}

/* Hover: quiet fill, no lift, no geometry move. */
:is(body.lgw-on, body.lgm-on) :is(
  .lgw-family, .lgw-product, .lgw-gcard, .lgw-angle, .lgw-swpick, .lgt-font,
  .lgw-fitcard, .lgw-tiercard, .lgw-ins-row
):hover:not([disabled]):not(.lgw-pk-sel):not(.lgw-ang-on):not(.lgw-ins-row--on) {
  border-color: var(--sv-hair-strong);
  background: var(--st-control-hover);
  box-shadow: none;
  transform: none;
}
/* the angle card had a translateY hover in vintage.css — stand it down */
body.lgw-on .lgw-angle:hover { transform: none; }
body.lgw-on .lgw-angle.lgw-ang-on:hover { box-shadow: inset 0 0 0 2px var(--sv-ink); }

/* Selected: 2px ink outline drawn as an inset ring (no layout shift, no border
   width change), quiet select fill. */
:is(body.lgw-on, body.lgm-on) :is(
  .lgw-family.lgw-pk-sel, .lgw-product.lgw-pk-sel, .lgw-gcard.lgw-pk-sel,
  .lgw-swpick.lgw-pk-sel, .lgt-font[aria-current="true"], .lgt-font.lgw-pk-sel,
  .lgw-fitcard.lgw-pk-sel, .lgw-tiercard.lgw-pk-sel,
  .lgw-angle.lgw-ang-on, .lgw-ins-row.lgw-ins-row--on
) {
  border-color: var(--sv-ink);
  background: var(--sv-select-fill);
  box-shadow: inset 0 0 0 2px var(--sv-ink);
}

/* Ink corner check badge — top-right, 20px, white check. Outer corner follows
   the card radius; inner corner is --sv-r-sm. Absolutely positioned, so it adds
   no layout and never moves the card's own text. Placed on the tile-shaped
   cards (garment types, garment cards, angle cards, font cards, fit/tier). */
:is(body.lgw-on, body.lgm-on) :is(
  .lgw-family.lgw-pk-sel, .lgw-gcard.lgw-pk-sel, .lgw-angle.lgw-ang-on,
  .lgt-font[aria-current="true"], .lgt-font.lgw-pk-sel,
  .lgw-fitcard.lgw-pk-sel, .lgw-tiercard.lgw-pk-sel, .lgw-swpick.lgw-pk-sel
)::after {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  left: auto;
  bottom: auto;
  width: 20px;
  height: 20px;
  margin: 0;
  background:
    var(--sv-ink)
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 6.2l2.2 2.2 4.8-5' fill='none' stroke='%23FDFCF7' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")
    center / 12px 12px no-repeat;
  border-top-right-radius: var(--sv-r-card);
  border-bottom-left-radius: var(--sv-r-sm);
  border-top-left-radius: 0;
  border-bottom-right-radius: 0;
  z-index: 2;
}

/* Front/Back: remove the moving selected dot (it shifted the label). The card
   ink outline + corner badge carry the state. Acceptance: label x is identical
   selected vs unselected. */
body.lgw-on .lgw-angle.lgw-ang-on .lgw-ang-an::after { content: none; }

/* Exact-style product ROWS keep the price in their top-right corner, so instead
   of the corner badge they use the ink outline + fill, and the row's own
   "selected" text mark (.lgw-product-check) turns into a clear ink check. */
body.lgw-on .lgw-product.lgw-pk-sel .lgw-product-check {
  color: var(--sv-ink);
  font-family: var(--vh-body);
  font-weight: 600;
  letter-spacing: 0;
  text-transform: none;
}

/* The corner badge's place on selected family / font cards. (studio_controls.css
   drew a left-edge bar here until 2026-10-01; nothing draws one now.) */
:is(body.lgw-on, body.lgm-on) :is(.lgw-family, .lgw-product, .lgw-swpick, .lgt-font).lgw-pk-sel::after,
:is(body.lgw-on, body.lgm-on) .lgt-font[aria-current="true"]::after {
  left: auto;
  top: 0;
  bottom: auto;
  width: 20px;
  height: 20px;
  background:
    var(--sv-ink)
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 6.2l2.2 2.2 4.8-5' fill='none' stroke='%23FDFCF7' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")
    center / 12px 12px no-repeat;
}
/* product rows carry no badge (price occupies the corner). */
body.lgw-on .lgw-product.lgw-pk-sel::after { content: none; }

/* Placement spot choices: quiet selected (ink outline + fill), never solid ink
   fill. studio_controls already quieted the fill; add the inset ring + round. */
body.lgw-on .lgw-ins-spot {
  border: 1px solid var(--sv-hair);
  background: var(--sv-panel);
  transition: border-color 120ms ease, background 120ms ease, box-shadow 120ms ease;
}
body.lgw-on .lgw-ins-spot.lgw-ins-spot--on,
body.lgw-on .lgw-ins-spot.lgw-ins-spot--on:hover {
  background: var(--sv-select-fill);
  border-color: var(--sv-ink);
  color: var(--sv-ink);
  box-shadow: inset 0 0 0 2px var(--sv-ink);
}
body.lgw-on .lgw-ins-spot:hover:not(:disabled):not(.lgw-ins-spot--on) {
  box-shadow: none;
  transform: none;
}
body.lgw-on .lgw-ins-spot:not(:disabled):active { transform: none; }

/* Swatches: circle, quiet edge; selected = 2px ink ring at 3px offset. No box,
   no left bar. Names (if present) stay in their existing readout. */
body.lgw-on .lgw-panel .lg-sw {
  border: 1px solid rgba(24, 21, 16, .22);
  box-shadow: none;
}
body.lgw-on .lgw-panel .lg-sw--light { border-color: rgba(24, 21, 16, .30); }
body.lgw-on .lgw-panel .lg-sw.active {
  box-shadow: 0 0 0 3px var(--sv-panel), 0 0 0 5px var(--sv-ink);
}

/* Phone: a selected tile reads like the desktop's (Selected, above): the ink
   border, a 2px ink inset ring (one outline on the tile's own corners, no size
   change, nothing down one side) and the quiet select fill; each kind keeps its
   radius. studio_controls.css's selected list holds an id (#lgm-selected-actions),
   so it weighs (1,2,2) and sets box-shadow:none: one id-bearing :is() arm lifts
   these to (1,3,1); the id never matches a tile. Loaded after studio_controls,
   so a keyboard focus outline draws outside the selection and keeps it. */
body.lgm-on :is(#lgm-selected-actions, .lgw-family, .lgw-gcard, .lgw-product, .lgw-swpick, .lgw-fitcard, .lgw-tiercard):is(.lgw-family, .lgw-gcard, .lgw-product, .lgw-swpick, .lgw-fitcard, .lgw-tiercard).lgw-pk-sel,
body.lgm-on :is(#lgm-selected-actions, .lgt-font).lgt-font:is([aria-current="true"], .lgw-pk-sel) {
  border-color: var(--vh-ink);
  background: var(--sv-select-fill);
  box-shadow: inset 0 0 0 2px var(--vh-ink);
}
/* The picked colour's name in ink 600, as on the desktop. Every name keeps room
   for its 600 self (an unseen copy shares its cell), so a pick moves no text
   and pkFitColors measures the wider of the two. */
body.lgm-on .lgw-swpick.lgw-pk-sel .lgw-swnm { color: var(--vh-ink); font-weight: 600; }
body.lgm-on .lgw-swnm[data-nm] { display: grid; grid-template-rows: 0 auto; }
body.lgm-on .lgw-swnm[data-nm]::after { content: attr(data-nm); grid-row: 2; font-weight: 600; visibility: hidden; }
/* The corner check badge where the desktop draws one (garment types, garment
   cards, fonts, fit and tier cards); never on a colour tile or a style row (a
   row keeps its own "Selected"). Its outer corner follows the tile's inner one;
   the type tile's arrow steps aside while the badge holds its corner. */
body.lgm-on :is(.lgw-family, .lgw-gcard, .lgw-fitcard, .lgw-tiercard).lgw-pk-sel::after,
body.lgm-on .lgt-font:is([aria-current="true"], .lgw-pk-sel)::after {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  width: 20px;
  height: 20px;
  background:
    var(--vh-ink)
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 6.2l2.2 2.2 4.8-5' fill='none' stroke='%23FDFCF7' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")
    center / 12px 12px no-repeat;
  border-radius: 0 calc(var(--sv-r-card) - 1px) 0 var(--sv-r-sm);
}
body.lgm-on .lgt-font:is([aria-current="true"], .lgw-pk-sel)::after { border-top-right-radius: 1px; } /* 2px tile corners */
body.lgm-on .lgw-family.lgw-pk-sel .lgw-family-arrow { visibility: hidden; }
body.lgm-on :is(.lgw-family, .lgw-gcard) { position: relative; }

/* ==========================================================================
   3 · DE-LINED PANEL, TAN INFO BLOCKS, REVIEW BLOCKS
       Joel: "lines everywhere ... does not look professional." Borders survive
       only on things you click, on info blocks, and on the dashed drop zone.
   ========================================================================== */

/* The rule under the panel head is gone; space separates instead. */
body.lgw-on .lgw-panel .lg-step.lgw-active > .lg-step-head {
  border-bottom: 0;
  margin-bottom: 2.2rem;
  padding-bottom: 0;
}

/* Section labels: 2.4rem above, 1rem below (label-to-content). */
body.lgw-on :is(.lgw-ins-lbl, .lgw-pk-lbl) { margin: 2.4rem 0 1rem; }
body.lgw-on .lgw-ins-coach + .lgw-ins-lbl,
body.lgw-on .lgw-ins-id + .lgw-ins-lbl { margin-top: 2.4rem; }
body.lgw-on .lgw-pk-opts > .lgw-pk-lbl:first-child,
body.lgw-on .lgw-ins > .lgw-ins-lbl:first-child { margin-top: 1rem; }

/* Drop the decorative separator rules between sections; keep the space. */
:is(body.lgw-on, body.lgm-on) :is(
  .lgw-ins-textseat, .lgw-ins-split, .lgw-pk-colors, .lgw-pk-opts, .lgw-ds-h2
) { border-top: 0; }
:is(body.lgw-on, body.lgm-on) :is(.lgw-ins-textseat, .lgw-ins-split) { margin-top: 2.4rem; padding-top: 0; }
body.lgw-on .lgw-pk-colors { margin-top: 2.4rem; padding-top: 0; }
body.lgw-on .lgw-pk-opts { margin-top: 2.4rem; padding-top: 0; }
body.lgw-on .lgw-ds-h2 { margin-top: 2.4rem; padding-top: 0; }

/* Starting-price ledger (#lgw-preupload-facts and its Garment-seat twin): one
   tan block, r-card, hair border, generous padding. */
body.lgw-on .lgw-ins-preupload-seat > .lgw-preupload-facts,
body.lgw-on .lgw-prod > .lgw-preupload-facts {
  background: var(--sv-tan);
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
  padding: 1.8rem;
}
/* the twin lives INSIDE the garment summary card (#lgw-prod appends it as its
   last child on the Garment step; the card is a 2-col grid with no own
   padding). Round 2 item 3: make the two read as ONE unified card — the facts
   span both columns as the card's tan lower region, single outer border on
   .lgw-prod, NO inner rule; the tan fill alone separates summary from ledger. */
body.lgw-on .lgw-prod > .lgw-preupload-facts {
  grid-column: 1 / -1;
  border: 0;
  border-radius: 0;
  margin: 0;
  padding: 1.6rem 1.8rem;
}

/* Inside the tan ledger: no inner rules; the from-price rate + the fee row
   just stack with space (Joel: "lines everywhere"). */
body.lgw-on .lgw-preupload-facts .lgw-facts-fee { border-top: 0; margin-top: 1rem; padding-top: 0; }

/* Pricing details disclosure: clean summary row, chevron marker, no underline. */
body.lgw-on .lgw-facts-details { border: 0; }
body.lgw-on .lgw-facts-details > summary {
  list-style: none;
  display: flex;
  align-items: center;
  gap: .8rem;
  color: var(--sv-text-quiet);
  text-decoration: none;
}
body.lgw-on .lgw-facts-details > summary:hover { text-decoration: none; }
body.lgw-on .lgw-facts-details > summary::-webkit-details-marker { display: none; }
body.lgw-on .lgw-facts-details > summary::after {
  content: "";
  width: .9rem;
  height: .9rem;
  margin-left: .2rem;
  border-right: 1.6px solid currentColor;
  border-bottom: 1.6px solid currentColor;
  transform: rotate(45deg);
  transition: transform 120ms ease;
}
body.lgw-on .lgw-facts-details[open] > summary::after { transform: rotate(-135deg); }
@media (prefers-reduced-motion: reduce) {
  body.lgw-on .lgw-facts-details > summary::after { transition: none; }
}

/* Selected-garment summary card (.lgw-prod): one card, no inner divider lines. */
body.lgw-on .lgw-prod {
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
  overflow: hidden;
}
body.lgw-on .lgw-prod-meta { border-left: 0; }
/* Change: a secondary control, quiet, rounded, no underline. */
body.lgw-on .lgw-prod-chg {
  text-decoration: none;
  border: 1px solid var(--sv-hair-strong);
  border-radius: var(--sv-r-ctl);
  min-height: var(--st-control-min, 4.4rem);
  padding: .7rem 1.1rem;
  color: var(--vh-muted);
  align-self: center;
}
body.lgw-on .lgw-prod-chg:hover { border-color: var(--sv-ink); color: var(--sv-ink); }

/* Uploaded-file summary card (.up-done) loses its heavy 1.5px ink frame. */
body.lgw-on .lgw-panel .up-done {
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
}

body.lgw-on .lgw-order-proof {
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
  background: var(--sv-tan);
}

/* Order price seat: tan block, r-card. */
body.lgw-on .lgw-order .lgw-foot-price {
  background: var(--sv-tan);
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
  padding: 1.8rem;
}

/* Secondary controls in Review (Save design, Share for approval): white,
   hair-strong border, rounded, no underline. */
body.lgw-on :is(.lgw-save, .lgw-share) {
  background: var(--sv-panel);
  border: 1px solid var(--sv-hair-strong);
  border-radius: var(--sv-r-ctl);
  color: var(--vh-ink);
  text-transform: none;
  letter-spacing: 0;
  text-decoration: none;
  font-family: var(--vh-body);
  font-weight: 600;
}
body.lgw-on :is(.lgw-save, .lgw-share):hover {
  border-color: var(--sv-ink);
  background: var(--st-control-hover);
}

/* The primary Continue CTA (the one thing Joel loves as is) keeps ink + white;
   only its corners round and its disabled state stays ink at reduced emphasis
   (never a grey slab), keeping its label >= 3:1. */
body.lgw-on .lgw-order .lg-base-btn,
body.lgw-on .lgw-foot #lg-continue {
  border-radius: var(--sv-r-ctl);
}
/* Disabled Continue: the ink CTA at reduced emphasis, NOT a grey slab. Round 2
   item 12 — opacity faded the white label too (reading flat grey); use a SOLID
   reduced-ink fill instead so the label stays crisp white. The fill is a warm
   ink mixed toward the panel; kept dark enough that white stays >= 3:1 (spec
   §5) while clearly reading as the same ink button, dimmed. */
body.lgw-on .lgw-order .lg-base-btn:disabled,
body.lgw-on .lgw-order .lg-base-btn:disabled:hover,
body.lgw-on .lgw-foot #lg-continue:disabled,
body.lgw-on .lgw-foot #lg-continue:disabled:hover {
  background: #5F594F;   /* warm reduced-emphasis ink, not neutral grey; gold-safe (delta 16) */
  border-color: #5F594F;
  color: var(--sv-panel);
  opacity: 1;            /* NOT opacity — keep the white label crisp */
}

/* The upload drop zone: tan fill, rounded, dashed hair-strong (kept — it is a
   drop target). */
body.lgw-on .lgw-panel .up-zone,
body.lgw-on .lgw-ins--overview .lgw-ins-upseat > .up-zone {
  border: 2px dashed var(--sv-hair-strong);
  border-radius: var(--sv-r-card);
  background: var(--sv-tan);
}
/* studio panel (Joel 2026-09-23): in the Your design overview the drop box
   is ALWAYS open. The engine paints its zone with an inline display (block
   on an empty active spot, none on a held one); !important is the only way
   to beat an inline style, and it is scoped to the overview state only, so
   the classic page, the phone and the piece editors keep the engine's
   verdict. A click or drop on the open zone while the active spot holds a
   piece already ADDS a new piece (logoIntentForActive), so nothing changes
   in what the zone does - only that it is there. */
body.lgw-on .lgw-ins--overview .lgw-ins-upseat > .up-zone { display: block !important; }
body.lgw-on .lgw-ins-coach {
  border: 1.5px dashed var(--sv-hair-strong);
  border-radius: var(--sv-r-card);
  background: var(--sv-tan);
}

/* ==========================================================================
   B6 · REVIEW AS A REAL SUMMARY (2026-09-22)
       Front/Back mockup cards at the top, per-location thread lines, and
       empty-location actions. Skin only; the shell owns the structure.
   ========================================================================== */

/* studio panel (Joel 2026-09-23): the "Continue is off: …" line sits directly
   above the Save / Continue pair - one quiet body line, muted, no box. */
body.lgw-on .lgw-order-reason {
  margin: 1.6rem 0 -.6rem;
  font: 400 1.3rem/1.5 var(--vh-body);
  color: var(--sv-text-quiet);
}
body.lgw-on .lgw-order-reason[hidden] { display: none; }
body.lgw-on .lgw-order-hint[hidden] { display: none; }

/* The two-up row of garment-view cards, above the Garment row. Photo cards →
   white surface (photo on white, per Joel), r-ctl, the same hair border the
   angle thumbs use, no gold. */
body.lgw-on .lgw-review-views {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1.2rem;
  margin: 2rem 0 .4rem;
}
body.lgw-on .lgw-review-view {
  display: flex;
  flex-direction: column;
  gap: .6rem;
  padding: .8rem;
  background: #FFFFFF;
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-ctl);
  color: var(--vh-ink);
  text-align: left;
  cursor: pointer;
  box-shadow: none;
  transition: border-color 120ms ease, box-shadow 120ms ease;
}
@media (prefers-reduced-motion: reduce) {
  body.lgw-on .lgw-review-view { transition: none; }
}
body.lgw-on .lgw-review-view:hover { border-color: var(--sv-hair-strong); }
/* Selected view = the ink outline on white the Round-3 photo cards use (never a
   cream fill behind a garment photo). */
body.lgw-on .lgw-review-view--on {
  border-color: var(--vh-ink);
  box-shadow: inset 0 0 0 1px var(--vh-ink);
}
body.lgw-on .lgw-review-view:focus-visible {
  outline: 2px solid var(--vh-ink);
  outline-offset: 2px;
}
/* The picture well: white, framed, the art contained (mirrors .lgw-ang-ph). */
body.lgw-on .lgw-review-view-ph {
  display: flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  width: 100%;
  height: clamp(6rem, 11vh, 12rem);
  overflow: hidden;
  background: #FFFFFF;
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-sm);
}
body.lgw-on .lgw-review-view-img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  /* the card's own well already frames the picture; the generic review-img rule
     (white pad/border on any img in a review block) must not double-frame it */
  background: transparent;
  border: 0;
  padding: 0;
}
body.lgw-on .lgw-review-view-img.lgw-ang-mir { transform: scaleX(-1); }
body.lgw-on .lgw-review-view-nm {
  font-family: var(--vh-body);
  font-weight: 600;
  font-size: 1.5rem;
  line-height: 1.2;
  color: var(--vh-ink);
}
body.lgw-on .lgw-review-view-ct {
  font-family: var(--vh-body);
  font-weight: 400;
  font-size: 1.3rem;
  line-height: 1.2;
  color: var(--vh-muted);
}
/* the phone shell's one-line separator ("Front · 1 piece"); stacked here */
body.lgw-on .lgw-review-view-sep { display: none; }

/* ==========================================================================
   4 · THE RAIL AS A PANEL TAB, WITH LIVE STATUS
       One menu, left, icons kept. Active step reads as the panel popping out.
   ========================================================================== */

/* Rail width is left at its original 14rem so the canvas room width — and the
   stage geometry the canvas-fit assertions freeze — is untouched (spec 7). The
   centered-column steps fit comfortably at that width. */

/* Rail ground stays ink; no gold anywhere. */
body.lgw-on .lgw-rail { background: var(--vh-ink); gap: .4rem; }

/* Each step: a centered column — icon, eyebrow, label, live status — so the
   labels never clip in the narrow rail. The active step becomes a tab. */
body.lgw-on .lgw-step {
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: .3rem;
  text-align: center;
  min-height: 8.4rem;
  padding: 1.1rem .8rem;
  border: 0;
  border-radius: var(--sv-r-card) 0 0 var(--sv-r-card);
  color: var(--sv-panel);
  transition: background 120ms ease, color 120ms ease;
}
@media (prefers-reduced-motion: reduce) {
  body.lgw-on .lgw-step { transition: none; }
}
body.lgw-on .lgw-step .lgw-navmark {
  flex: 0 0 auto;
  /* B2 §2: rail icon box 2.6rem -> 3.2rem (~25% bigger, matches the label bump);
     the per-icon scale/translate in R6·2 keep every icon's painted-ink height
     uniform in the larger box.
     B5: 3.2rem -> 2.9rem (10% smaller, with the label; Joel: "reduce the size of
     icons by 10%, and the text"). Tile padding/rhythm unchanged so the rail keeps
     its height and every label stays one line. */
  width: 2.9rem;
  height: 2.9rem;
  color: var(--sv-rail-quiet);
}
body.lgw-on .lgw-step .lgw-navmark svg { width: 100%; height: 100%; }
body.lgw-on .lgw-step .lgw-sw {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .15rem;
  min-width: 0;
  width: 100%;
}
body.lgw-on .lgw-step .lgw-stepmeta {
  margin: 0;
  font-family: var(--vh-display);
  font-weight: 500;
  font-size: 1rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--sv-rail-quiet);
}
body.lgw-on .lgw-step .lgw-lb {
  font-family: var(--vh-body);
  font-weight: 600;
  font-size: 1.5rem;
  line-height: 1.15;
  letter-spacing: 0;
  text-transform: none;
  color: var(--sv-panel);
}

/* The LIVE status line under the label (these nodes already exist and are
   written by the shell). Make them visible + tidy; do not change what writes
   them. Two lines max, wrap not clip. */
body.lgw-on .lgw-step .lgw-st {
  position: static;
  width: auto;
  height: auto;
  margin: .2rem 0 0;
  padding: 0;
  overflow: hidden;
  clip: auto;
  white-space: normal;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  font-family: var(--vh-body);
  font-weight: 400;
  font-size: 1.2rem;
  line-height: 1.3;
  letter-spacing: 0;
  text-transform: none;
  color: var(--sv-rail-quiet);
}
/* the DOM-only spare status nodes at the rail foot stay hidden */
body.lgw-on .lgw-rail > .lgw-st { display: none; }
body.lgw-on .lgw-step .lgw-st[hidden] { display: none; }

/* Non-active hover: a faint lift, no gold. */
body.lgw-on .lgw-step:hover:not(.lgw-active) {
  background: rgba(255, 255, 255, .06);
  color: var(--sv-panel);
}
body.lgw-on .lgw-step:hover:not(.lgw-active) .lgw-navmark { color: var(--sv-panel); }

/* Active step: a panel-colored tab, ink text + icon, rounded on the LEFT only,
   flush against the panel (negative right margin closes the seam). */
body.lgw-on .lgw-step.lgw-active,
body.lgw-on .lgw-step.lgw-active:hover,
body.lgw-on .lgw-step.lgw-active:focus-visible {
  background: var(--sv-panel);
  color: var(--sv-ink);
  border: 0;
  border-radius: var(--sv-r-card) 0 0 var(--sv-r-card);
  margin-right: -.9rem;
  box-shadow: none;
}
body.lgw-on .lgw-step.lgw-active .lgw-navmark { color: var(--sv-ink); }
body.lgw-on .lgw-step.lgw-active .lgw-lb { color: var(--sv-ink); }
body.lgw-on .lgw-step.lgw-active .lgw-stepmeta { color: var(--sv-text-quiet); }
body.lgw-on .lgw-step.lgw-active .lgw-st { color: var(--vh-muted); }

/* The Review entry sits at the rail foot (margin-top:auto stays); no gold rule
   above it — a faint white rule instead. */
body.lgw-on .lgw-step[data-lgw-step="order"] {
  border-top: 1px solid rgba(255, 255, 255, .12);
  border-radius: var(--sv-r-card) 0 0 var(--sv-r-card);
}
body.lgw-on .lgw-step[data-lgw-step="order"].lgw-active {
  border-top-color: transparent;
}

/* Rail keyboard ring stays distinct (cream on ink). */
body.lgw-on .lgw-step:focus-visible {
  outline: 2px solid var(--sv-panel);
  outline-offset: -4px;
  box-shadow: none;
}

/* --------------------------------------------------------------------------
   Canvas room — radius + hair borders; the zoom bench is one rounded shape.
   No geometry / zoom / fit change; the canvas-fit assertions still hold.
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-room .lg-stage {
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
}
body.lgw-on .lgw-angle .lgw-ang-ph { border-radius: var(--sv-r-sm); }

/* The zoom bench: one rounded outer shell, overflow hidden, hair border. Its
   keys keep their ids/handlers/targets; only the plate rounds. */
body.lgw-on .lgw-bench {
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-ctl);
  overflow: hidden;
  box-shadow: 0 6px 18px rgba(24, 21, 16, .07);
}
body.lgw-on .lgw-bench .lgw-bench-b { border-radius: 0; }

/* On-canvas tools plate rounds to match. */
body.lgw-on .lgw-room .lg-tools {
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-ctl);
}
body.lgw-on .lgw-room .lg-view-tabs { border-radius: var(--sv-r-ctl); overflow: hidden; }

/* ==========================================================================
   ROUND 2 POLISH (2026-09-21) — rules, radius sweep, rail tab, rows.
   Cowork reviewed every AFTER shot: direction right, these defects remain.
   ========================================================================== */

/* --------------------------------------------------------------------------
   R2·1 — the last decorative rules. Space separates sections; borders survive
   only on controls, info blocks and the drop zone. (studio_controls, the
   picker sheet and the JS-injected text-panel style still drew these.)
   -------------------------------------------------------------------------- */
/* hairline under the current-garment header in the garment browser */
body.lgw-on .lgw-picker .lgw-prod--browse { border-bottom: 0; padding-bottom: 0; }
/* hairline above "Pricing for …" (this block becomes the tan ledger in R2·2) */
body.lgw-on .lgw-picker .lgw-pk-facts { border-top: 0; }
/* the rule under Thread in the Text panel (was .lgt-size border-top) */
:is(body.lgw-on, body.lgm-on) .lgt-size { border-top: 0; padding-top: 0; margin-top: 2.2rem; }
:is(body.lgw-on, body.lgm-on) :is(#lgt-fit-note, .lgt-geometry-review, .lgt-review-entry) {
  border-top: 0;
  padding-top: 0;
  margin-top: 1.4rem;
}
/* the full-width rule that closed the panel at its very foot */
body.lgw-on .lgw-foot { border-top: 0; }
/* every engine step drew a border-bottom that closed each panel section
   (garment / design / placement) at its foot — space separates instead */
body.lgw-on .lgw-panel .lg-step { border-bottom: 0; }
/* the foot hint slot's top rule (vintage scopes it under .lgw-panel) */
body.lgw-on .lgw-panel .lgw-hint-slot { border-top: 0; }

/* --------------------------------------------------------------------------
   R2·2 — the garment browser's pricing seat becomes the SAME tan block as the
   Garment summary and Design ledgers seat everywhere it lands.
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-picker .lgw-pk-facts {
  margin-top: 2.4rem;
  padding: 1.8rem;
  background: var(--sv-tan);
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
}
body.lgw-on .lgw-picker .lgw-pk-facts-title {
  margin: 0 0 1rem;
  font-family: var(--vh-body);
  font-weight: 600;
  font-size: 1.4rem;
  line-height: 1.35;
  color: var(--vh-ink);
}

/* --------------------------------------------------------------------------
   R2·3 — the garment summary "Change" is a rounded secondary, not the squared
   command-family default. (#id needed to beat the shared family's 1,1,1.)
   -------------------------------------------------------------------------- */
body.lgw-on #lgw-prod-change {
  background: var(--sv-panel);
  border: 1px solid var(--sv-hair-strong);
  border-radius: var(--sv-r-ctl);
  color: var(--vh-muted);
  text-decoration: none;
}
body.lgw-on #lgw-prod-change:hover {
  border-color: var(--sv-ink);
  background: var(--st-control-hover);
  color: var(--sv-ink);
}

/* --------------------------------------------------------------------------
   R2·4 — RADIUS SWEEP. The shared command family in studio_controls.css uses
   :is(#id, .class, …){border-radius:0}, which hands EVERY member id-level
   (1,1,1) specificity — so round 1's class-based radius rules (0,2,1) lost.
   Match that (1,1,1) by keeping an id in the list; studio_visual loads last,
   so equal specificity resolves our way. Every clickable control rounds.
   -------------------------------------------------------------------------- */
:is(body.lgm-on, body.lgw-on) :is(
  #lgm-review-open, #lgm-sheet-done, #lgm-empty-actions button,
  #lgm-selected-actions button, #lgm-add-open, #lgm-pieces-open,
  #lgm-empty-open, .lgm-empty-action, .lgm-camera-tools button,
  .lgm-placement-tools button, .lgw-panel-back, .lgw-ins-back,
  .lgw-family-back, .lgw-pk-x, #lgw-prod-change, #lgw-ins-swap,
  .lgw-save, .lgw-share,
  #lgw-review-return, .lg-base-btn, .lg-tool,
  .lgw-ins-add, .lgw-ins-spot, .lgw-ins-th,
  .lgw-ds-x, .lgw-ds-no, .lgw-ds-yes, .lgw-dg-retry,
  button.lgt-retry, #lgt-th-cur, #lgt-phone-font-open, .lgt-phone-chooser-done,
  .lgw-cl-btn, .lgw-mx-x, .lgw-cl-x, .lgw-price-math,
  .lg-return-status button, #lgt-input
) { border-radius: var(--sv-r-ctl); }
/* the small square utility keys read better a touch tighter, still >= 6px */
:is(body.lgm-on, body.lgw-on) :is(#lgw-ins-swap, .lgw-ins-clbtn, .lg-tool) {
  border-radius: var(--sv-r-sm);
}

/* R2·4 — Add text / Design library: two separate option cards with a gap, not
   one joined two-cell box. Undo the --two wrapper and card each child. */
body.lgw-on .lgw-ins-actions--two {
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1rem;
  overflow: visible;
  background: transparent;
  border: 0;
  border-radius: 0;
}
body.lgw-on .lgw-ins-action { border-radius: var(--sv-r-card); }
body.lgw-on .lgw-ins-actions--two > .lgw-ins-action {
  flex-direction: column;
  align-items: flex-start;
  gap: .7rem;
  min-height: 7.6rem;
  padding: 1.1rem 1rem;
  background: var(--sv-panel);
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
}
/* the wrapper's inner divider is redundant once each cell is its own bordered
   card with a gap — fold it back into a plain (invisible) left edge */
body.lgw-on .lgw-ins-actions--two > .lgw-ins-action:not([hidden]) + .lgw-ins-action:not([hidden]) {
  border-left: 1px solid var(--sv-hair);
}
body.lgw-on .lgw-ins-actions--two > .lgw-ins-action:hover {
  border-color: var(--sv-hair-strong);
  background: var(--st-control-hover);
}

/* --------------------------------------------------------------------------
   R2·5 — Text input: one 1px border at rest; on focus-visible a single 2px
   ring OUTSIDE the border that follows the radius. No doubled edge (the
   injected #lgt-input:focus drew a ring at offset -1px, hugging the border).
   -------------------------------------------------------------------------- */
:is(body.lgw-on, body.lgm-on) #lgt-input {
  border: 1px solid var(--sv-hair-strong);
  border-radius: var(--sv-r-ctl);
  box-shadow: none;
}
:is(body.lgw-on, body.lgm-on) #lgt-input:focus { outline: none; }
:is(body.lgw-on, body.lgm-on) #lgt-input:focus-visible {
  outline: 2px solid var(--sv-ink);
  outline-offset: 2px;
  border-color: var(--sv-hair-strong);
  box-shadow: none;
}

/* --------------------------------------------------------------------------
   R2·6 — the rail active step reads as a TAB, not a floating card. It extends
   to the rail's right edge (cancel the .9rem side padding), square right
   corners, rounded left, zero seam against the panel so the panel pops out.
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-rail { padding-right: 0; }
body.lgw-on .lgw-step {
  margin-right: 0;
  padding-right: .9rem;                 /* keep the label inset the rail lost */
  border-radius: var(--sv-r-card) 0 0 var(--sv-r-card);
}
body.lgw-on .lgw-step.lgw-active,
body.lgw-on .lgw-step.lgw-active:hover,
body.lgw-on .lgw-step.lgw-active:focus-visible {
  background: var(--sv-panel);
  color: var(--sv-ink);
  border: 0;
  border-radius: var(--sv-r-card) 0 0 var(--sv-r-card);
  margin-right: -1px;                    /* overlap the panel's left edge, no seam */
  position: relative;
  z-index: 1;
  box-shadow: none;
}

/* --------------------------------------------------------------------------
   R2·8 — exact-style rows: 9.6rem thumbnail vertically centred, even 1.2rem
   padding, text block centred, and the trailing word ("Choose" / "Selected")
   as a quiet right-aligned affordance on the row instead of floating bottom-
   left. Text unchanged — placement and weight only.
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-product.lgw-product--photo {
  grid-template-columns: 9.6rem minmax(0, 1fr);
  grid-template-rows: auto;
  align-items: center;
  gap: 0 1.6rem;
  padding: 1.2rem;
}
body.lgw-on .lgw-product.lgw-product--photo .lgw-product-ph {
  grid-row: 1;
  align-self: center;
  width: 9.6rem;
  min-height: 0;
}
body.lgw-on .lgw-product.lgw-product--photo .lgw-product-ph .lgw-gcard-img,
body.lgw-on .lgw-product.lgw-product--photo .lgw-product-ph .lgw-gcard-ico {
  width: 9.6rem;
  height: auto;
  max-height: 10.8rem;
}
body.lgw-on .lgw-product.lgw-product--photo .lgw-product-words {
  grid-row: 1;
  align-self: center;
  padding-right: 7rem;                   /* clear the trailing affordance */
}
body.lgw-on .lgw-product.lgw-product--photo .lgw-product-check {
  position: absolute;
  right: 1.2rem;
  bottom: 1.2rem;
  grid-row: auto;
  justify-self: auto;
  font-family: var(--vh-body);
  font-weight: 500;
  font-size: 1.2rem;
  letter-spacing: 0;
  text-transform: none;
  color: var(--sv-text-quiet);
}
body.lgw-on .lgw-product.lgw-product--photo.lgw-pk-sel .lgw-product-check {
  color: var(--vh-ink);
  font-weight: 600;
}

/* --------------------------------------------------------------------------
   R2·9 — the quiet italic helper lines were cramped against the cards. Give
   them 1.2rem of air above and below, drop the italic, set 1.3rem muted.
   -------------------------------------------------------------------------- */
body.lgw-on :is(
  .lgw-ins-alt, .lgw-ins-promise, .lgw-ins-split-note, .lgw-pk-empty,
  .lgw-ins-arrange-note, .lgw-ins-spots-hint
) {
  margin: 1.2rem 0;
  font-style: normal;
  font-size: 1.3rem;
  line-height: 1.5;
  color: var(--vh-muted);
}

/* --------------------------------------------------------------------------
   R2·11 — the picker's colour chooser is a SWATCH grid, not option cards.
   Spec §4: a circle with a 1px edge, selected = a 2px ink ring at 3px offset,
   the name under it (selected ink 600, others muted) in an even grid — NO box
   around each swatch, no corner badge. Round 1 mistakenly boxed .lgw-swpick and
   gave it a check badge. Keep the 48px target and the 16px name the suite
   freezes; only the surface changes.
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-swgrid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(7.2rem, 1fr));
  gap: 1.2rem .4rem;
}
body.lgw-on .lgw-swpick,
body.lgw-on .lgw-swpick:hover,
body.lgw-on .lgw-swpick.lgw-pk-sel,
body.lgw-on .lgw-swpick.lgw-pk-sel:hover {
  background: transparent;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  min-height: 4.8rem;
  padding: .4rem .6rem;
}
body.lgw-on .lgw-swpick.lgw-pk-sel::after { content: none; }   /* no corner badge on a swatch */
body.lgw-on .lgw-swdot {
  width: 3rem;
  height: 3rem;
  border: 1px solid rgba(24, 21, 16, .22);
}
body.lgw-on .lgw-swpick.lgw-pk-sel .lgw-swdot {
  box-shadow: 0 0 0 3px var(--sv-panel), 0 0 0 5px var(--sv-ink);   /* 2px ink ring at 3px offset */
}
body.lgw-on .lgw-swpick .lgw-swnm { color: var(--vh-muted); }
body.lgw-on .lgw-swpick.lgw-pk-sel .lgw-swnm { color: var(--vh-ink); font-weight: 600; }

/* ==========================================================================
   ROUND 3 POLISH (2026-09-21) — WHITE SURFACES BEHIND GARMENT PHOTOS.
   Garment/design photos are JPEG/PNG on a pure white background. Wherever a
   photo sat on a tinted fill — a selected exact-style row (--sv-select-fill
   #F6F3EC), an unselected card on the panel white (#FDFCF7), a cream photo well
   — you saw a white rectangle inside a cream box. Joel: "these boxes will need
   to be white because of the white background of the sweater ... same goes
   wherever else it shows the pic."

   Rule for every option card / block that CONTAINS a garment or design photo:
   the surface directly behind and around the photo is pure #FFFFFF in rest,
   hover AND selected; the photo's own well has no visible edge against it (drop
   its frame + inset shadow); selection is carried by the ink outline + corner
   check ONLY (no tinted fill); hover moves the border to --sv-hair-strong, not a
   fill. NO mix-blend-mode / filters on garment photos — garment colour truth
   matters (a White or Bone garment must not pick up a cream tint).

   Text-only cards keep their tinted selected fill and are untouched here:
   garment TYPE tiles (.lgw-family, SVG icon not a photo), colour swatches
   (.lgw-swpick), font/fit/tier cards (text specimens, no white-on-tint well).
   ========================================================================== */

/* The §2 hover group tints these cards with --st-control-hover at (0,7,1)
   specificity; the §2 selected group fills them with --sv-select-fill. Round 3
   loads last and matches that :not() chain so equal specificity resolves white.
   -------------------------------------------------------------------------- */

/* --- Garment cards (.lgw-gcard): white card + white photo well, no framed edge
       on the well. Selection stays the ink inset ring + corner badge (§2). --- */
body.lgw-on .lgw-gcard,
body.lgw-on .lgw-gcard.lgw-pk-sel,
body.lgw-on .lgw-gcard.lgw-pk-sel:hover {
  background: #FFFFFF;
}
body.lgw-on .lgw-gcard:hover:not([disabled]):not(.lgw-pk-sel):not(.lgw-ang-on):not(.lgw-ins-row--on) {
  background: #FFFFFF;
  border-color: var(--sv-hair-strong);
}
/* the photo well melts into the white card — kill its frame + inset shadow so
   there is no edge between the white photo ground and the white card. */
body.lgw-on .lgw-gcard .lgw-gcard-ph,
body.lgw-on .lgw-gcard .lgw-gcard-ph:has(.lgw-gcard-img) {
  background: #FFFFFF;
  border: 0;
  box-shadow: none;
}

/* --- Exact-style rows (.lgw-product--photo): white row in every state. The
       photo well is already transparent (studio_style_rows.css); the ROW fill
       is what tinted, so the ROW must be white. Rest/hover win at (0,3,1)/
       (0,7,1). Selection = the ink inset ring + the "Selected" text mark; no
       corner badge (the price occupies the corner). --- */
body.lgw-on .lgw-product.lgw-product--photo {
  background: #FFFFFF;
}
body.lgw-on .lgw-product.lgw-product--photo:hover:not([disabled]):not(.lgw-pk-sel):not(.lgw-ang-on):not(.lgw-ins-row--on) {
  background: #FFFFFF;
  border-color: var(--sv-hair-strong);
}
/* Selected row: studio_controls.css:202 tints .lgw-product.lgw-pk-sel with
   --st-control-selected AND sets box-shadow:none through an :is() that also
   lists #lgm-selected-actions — an id — inflating the WHOLE list to (1,2,2).
   Because the photo row's own well is transparent, that cream tint shows behind
   the photo. Match Round 2's id trick: one id-bearing :is() arm lifts this to
   (1,4,1) so the selected row stays white and carries a crisp 2px ink inset
   ring (the ring studio_controls' box-shadow:none had suppressed). The id never
   matches a desktop row — it is a specificity lever only. */
body.lgw-on :is(#lgm-selected-actions, .lgw-product).lgw-product.lgw-product--photo.lgw-pk-sel,
body.lgw-on :is(#lgm-selected-actions, .lgw-product).lgw-product.lgw-product--photo.lgw-pk-sel:hover {
  background: #FFFFFF;
  box-shadow: inset 0 0 0 2px var(--sv-ink);
}

/* --- Front/Back angle cards (.lgw-angle): white card + white photo well with
       no frame, no inset shadow, no cream outer ring. Selection = ink ring +
       corner badge (§2). --- */
body.lgw-on .lgw-angle {
  background: #FFFFFF;
}
body.lgw-on .lgw-angle:hover:not([disabled]):not(.lgw-pk-sel):not(.lgw-ang-on):not(.lgw-ins-row--on) {
  background: #FFFFFF;
  border-color: var(--sv-hair-strong);
}
/* Selected angle card: .lgw-angle.lgw-ang-on is also in the studio_controls.css:
   202 (1,2,2) list, so its fill tints to cream behind the white photo well. Lift
   the white fill above it with the same id lever (→ (1,3,1)); the ink ring +
   corner badge (§2) stay the selection marks. */
body.lgw-on :is(#lgm-selected-actions, .lgw-angle).lgw-angle.lgw-ang-on,
body.lgw-on :is(#lgm-selected-actions, .lgw-angle).lgw-angle.lgw-ang-on:hover {
  background: #FFFFFF;
}
body.lgw-on .lgw-angle .lgw-ang-ph {
  background: #FFFFFF;
  border: 0;
  box-shadow: none;
}

/* --- Garment summary card (.lgw-prod) + the browser's current-garment header
       (.lgw-prod--browse): the thumb + meta region reads as ONE white card so
       the pure-white photo well is part of it; the tan ledger (its last child,
       from §3) stays tan. The round-2 join holds: one outer border, tan lower
       region, no inner rule. --- */
body.lgw-on .lgw-prod { background: #FFFFFF; }
body.lgw-on .lgw-prod .lgw-prod-ph { background: #FFFFFF; }

/* --- Saved-design + library thumbs (.lgw-ds-thumb): a white framed well (white
       fill, 1px hair border, its own radius) so the design preview reads as a
       framed photo, not a cream rectangle on the card. --- */
body.lgw-on .lgw-ds-thumb {
  background: #FFFFFF;
  border-color: var(--sv-hair);
}


/* ==========================================================================
   ROUND 4 POLISH (2026-09-21) — photo surfaces, title font variable, cards,
   review buttons, rail tiles, swatches, icons, tonal notice, corner badge.
   Joel used the live preview: "Other than that it looks good" + a punch list.
   Skin only, one stylesheet, one template-label edit (item O), plus the harness.
   ========================================================================== */

/* --------------------------------------------------------------------------
   R4·A — every card/block that holds a garment or design PHOTO is #FFFFFF in
   rest, hover, focus AND selected, with no border/shadow/fill on the image
   well. Round 3 whitened most; the browser's current-garment header stayed a
   transparent row (cream showed around its white 56x64 photo well = a white
   rectangle on cream). Make it a white card so the well melts into it.
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-picker .lgw-prod--browse {
  background: #FFFFFF;
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
  padding: 1rem 1.2rem;
}
body.lgw-on .lgw-picker .lgw-prod--browse .lgw-prod-ph { background: #FFFFFF; }
/* focus of a photo card never tints the surface (item A: focus stays white) */
body.lgw-on :is(.lgw-gcard, .lgw-angle, .lgw-product.lgw-product--photo):focus-visible {
  background: #FFFFFF;
}

/* --------------------------------------------------------------------------
   R4·H — hover / focus must NOT mimic selected. Hover = hair-strong border
   only (no ink outline, no tint, no inset ring). focus-visible = the September
   focus ring only. selected = 2px ink outline + corner check. The shared
   command family in studio_controls.css hovers option cards to border ink
   (:is(...):hover{border-color:ink}); beat it with a matching :is() that keeps
   an id so equal specificity resolves to us, and force hair-strong.
   -------------------------------------------------------------------------- */
:is(body.lgm-on, body.lgw-on) :is(#lgm-selected-actions,
  .lgw-family, .lgw-product, .lgw-gcard, .lgw-angle, .lgt-font, .lgw-fitcard, .lgw-tiercard
):hover:not(:disabled):not(.lgw-pk-sel):not(.lgw-ang-on):not(.lgw-ins-row--on) {
  border-color: var(--sv-hair-strong);
  box-shadow: none;
}
/* the photo-row hover in studio_style_rows.css:13 sets border ink — override */
body.lgw-on .lgw-product.lgw-product--photo:hover:not(:disabled):not(.lgw-pk-sel) {
  border-color: var(--sv-hair-strong);
  background: #FFFFFF;
  box-shadow: none;
}

/* --------------------------------------------------------------------------
   R4·I — exact-style rows: smaller type, no tint, ink ring + corner check on a
   WHITE card, name never breaks mid-word, Choose/Selected on its own last line.
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-product.lgw-product--photo {
  grid-template-columns: 8.8rem minmax(0, 1fr);
  grid-template-rows: auto auto;
  align-items: start;
  gap: .2rem 1.4rem;
  padding: 1.4rem;
  overflow: hidden;                 /* R4·Q: clip the corner badge to the card */
}
body.lgw-on .lgw-product.lgw-product--photo .lgw-product-ph {
  grid-column: 1;
  grid-row: 1 / span 2;
  align-self: center;
  width: 8.8rem;
  min-height: 0;
}
body.lgw-on .lgw-product.lgw-product--photo .lgw-product-ph .lgw-gcard-img,
body.lgw-on .lgw-product.lgw-product--photo .lgw-product-ph .lgw-gcard-ico {
  width: 8.8rem;
  height: auto;
  max-height: 10rem;
}
body.lgw-on .lgw-product.lgw-product--photo .lgw-product-words {
  grid-column: 2;
  grid-row: 1;
  align-self: center;
  padding-right: 0;
  overflow-wrap: normal;            /* was 'anywhere' — stop mid-word breaks */
  word-break: normal;
  hyphens: none;
}
body.lgw-on .lgw-product.lgw-product--photo .lgw-product-nm {
  font: 500 1.8rem/1.25 var(--vh-display);
  letter-spacing: .01em;
  overflow-wrap: normal;
  word-break: normal;
  hyphens: none;
}
body.lgw-on .lgw-product.lgw-product--photo .lgw-product-pr {
  font-size: 1.4rem;
  line-height: 1.35;
  margin-top: .2rem;
}
body.lgw-on .lgw-product.lgw-product--photo .lgw-product-price-note,
body.lgw-on .lgw-product.lgw-product--photo .lgw-product-colors {
  font-size: 1.3rem;
  line-height: 1.35;
  margin-top: .2rem;
  color: var(--vh-muted);
}
/* Choose / Selected on its OWN last line, right-aligned, .8rem above; never
   shares the colors line. (Round 2 floated it absolute; put it back in flow.) */
body.lgw-on .lgw-product.lgw-product--photo .lgw-product-check {
  position: static;
  grid-column: 2;
  grid-row: 2;
  justify-self: end;
  align-self: end;
  margin: .8rem 0 0;
  right: auto;
  bottom: auto;
  font: 500 1.3rem/1.2 var(--vh-body);
  letter-spacing: 0;
  text-transform: none;
  color: var(--sv-text-quiet);
}
body.lgw-on .lgw-product.lgw-product--photo.lgw-pk-sel .lgw-product-check {
  color: var(--vh-ink);
  font-weight: 600;
}
/* selected row = ink ring on white + a corner check badge (corner is now free —
   the price is inline in the words column, not in the corner). */
body.lgw-on .lgw-product.lgw-product--photo.lgw-pk-sel::after {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  left: auto;
  bottom: auto;
  width: 20px;
  height: 20px;
  margin: 0;
  background:
    var(--sv-ink)
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 6.2l2.2 2.2 4.8-5' fill='none' stroke='%23FDFCF7' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")
    center / 12px 12px no-repeat;
  border-bottom-left-radius: var(--sv-r-sm);
  z-index: 2;
}

/* --------------------------------------------------------------------------
   R4·Q — the corner check badge must fill the card's rounded corner with no
   white sliver. Clip every badge-bearing card to its radius (overflow hidden)
   so the badge's square outer corner is rounded exactly to the card, and pin
   the badge flush to top:0/right:0 with no offset gap.
   -------------------------------------------------------------------------- */
:is(body.lgw-on, body.lgm-on) :is(
  .lgw-family, .lgw-gcard, .lgw-angle, .lgt-font, .lgw-fitcard, .lgw-tiercard
) { overflow: hidden; }
:is(body.lgw-on, body.lgm-on) :is(
  .lgw-family.lgw-pk-sel, .lgw-gcard.lgw-pk-sel, .lgw-angle.lgw-ang-on,
  .lgt-font[aria-current="true"], .lgt-font.lgw-pk-sel,
  .lgw-fitcard.lgw-pk-sel, .lgw-tiercard.lgw-pk-sel
)::after {
  top: 0;
  right: 0;
  border-top-right-radius: 0;       /* the card's overflow-clip rounds it */
}

/* --------------------------------------------------------------------------
   R4·B — subtitle gap under the (now larger) Oswald title.
   -------------------------------------------------------------------------- */
body.lgw-on :is(.lg-step-s, .lgw-ins-sub, .lgw-family-sub, .lgw-gpop-s) {
  margin-top: .5rem;
}

/* --------------------------------------------------------------------------
   R4·L (supersedes C) — "Add another element" and "Other ways to begin" both
   render as full-width STACKED option rows: icon left (2.4rem), title + note on
   the right, .8rem between rows, no outer container border. Whole row clickable
   (it already is — each is a <button>).
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-ins-actions,
body.lgw-on .lgw-ins-actions--two {
  display: flex;
  flex-direction: column;
  gap: .8rem;
  grid-template-columns: none;      /* undo the 2-col grid */
  background: transparent;
  border: 0;
  border-radius: 0;
  overflow: visible;
}
body.lgw-on .lgw-ins-actions .lgw-ins-action:not([hidden]),
body.lgw-on .lgw-ins-actions--two > .lgw-ins-action:not([hidden]) {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 1.2rem;
  width: 100%;
  min-height: 0;
  padding: 1.2rem 1.4rem;
  background: var(--sv-panel);
  border: 1px solid var(--sv-hair);
  border-left: 1px solid var(--sv-hair);   /* kill the round-2 divider edge */
  border-radius: var(--sv-r-card);
  text-align: left;
}
body.lgw-on .lgw-ins-action .lgw-ins-action-mark {
  flex: 0 0 auto;
  width: 2.4rem;
  height: 2.4rem;
}
body.lgw-on .lgw-ins-action .lgw-ins-action-mark svg { width: 100%; height: 100%; }
/* B4 §3: the Text / Design-library affordance marks are now Joel's rail glyphs,
   drawn as FILLS (fill=currentColor on the path, no svg fill attribute). The
   shared stroke rules (vintage.css .lgw-ins-action-mark svg { stroke-width }) are
   inert on a fill glyph, but scope defensively so no stroke-width/fill:none can
   leak onto them — only the 'logo' upload mark (svg[fill=none]) strokes. */
body.lgw-on .lgw-ins-action .lgw-ins-action-mark svg:not([fill="none"]) {
  stroke: none;
  stroke-width: 0;
}
body.lgw-on .lgw-ins-action .lgw-ins-action-words {
  display: flex;
  flex-direction: column;
  gap: .1rem;
  min-width: 0;
}
body.lgw-on .lgw-ins-action .lgw-ins-action-title {
  font: 600 1.6rem/1.25 var(--vh-body);
  letter-spacing: 0;
  color: var(--vh-ink);
}
body.lgw-on .lgw-ins-action .lgw-ins-action-note {
  font: 400 1.3rem/1.3 var(--vh-body);
  color: var(--vh-muted);
}
body.lgw-on .lgw-ins-actions .lgw-ins-action:hover,
body.lgw-on .lgw-ins-actions--two > .lgw-ins-action:hover {
  border-color: var(--sv-hair-strong);
  background: var(--st-control-hover);
}

/* --------------------------------------------------------------------------
   R4·D — Email/Save: 46px so the pair reads lighter than the ink Continue CTA.
   The shared command family in studio_controls.css:18 carries an id in its
   :is() list, so it is (1,1,1) and owns min-height/padding/font/white-space on
   these buttons — beat it with the real id (#lgw-save). (Review's Edit garment
   / location / artwork buttons are css/studio/review_blocks.css's now.)
   -------------------------------------------------------------------------- */
body.lgw-on #lgw-save {
  min-height: 46px;
  font-size: 1.5rem;
}

/* --------------------------------------------------------------------------
   R4·O — the Email button now reads "Email my design" and must sit on ONE line
   like Save design. Equal width, nowrap, identical height; shrink label to
   1.4rem before wrapping (the pair fits at 1.5rem in the fixed panel width, so
   the smaller size only kicks in if the panel ever narrows).
   -------------------------------------------------------------------------- */
body.lgw-on #lgw-save {
  white-space: nowrap;
  overflow-wrap: normal;
  min-width: 0;
}

/* --------------------------------------------------------------------------
   R4·F — disabled Continue must read obviously disabled while staying ink
   family. Fill #A09B93 (warm stone), white label, not-allowed, no hover change.
   Enabled stays solid ink (untouched).
   -------------------------------------------------------------------------- */
/* studio_controls.css:238 sets `#lg-continue{background:ink}` at id specificity
   (1,1,1) with NO :disabled — so it painted the DISABLED button ink too (why it
   read enabled, and why the round-2 class-level disabled rule never landed).
   Match the id to win, and the ink-family Delete guard below. */
body.lgw-on #lg-continue:disabled,
body.lgw-on #lg-continue:disabled:hover,
body.lgw-on .lgw-order .lg-base-btn#lg-continue:disabled {
  background: #A09B93;
  border-color: #A09B93;
  color: #FFFFFF;
  opacity: 1;
  cursor: not-allowed;
}

/* --------------------------------------------------------------------------
   R4·G + R4·J — swatches. Selected = 2px ink ring at 3px offset (white gap) +
   ink 600 name, nothing else (no tinted rectangle). The selected-color readout
   at the right of the Color label = 1.3rem muted. Names 1.3rem, up to two lines,
   4-column grid with 1.6rem row gap.
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-swgrid {
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 1.6rem .6rem;
}
/* the selected swatch tint comes from studio_controls.css:202, whose :is() list
   holds an id (#lgm-selected-actions) — inflating the whole group to (1,2,2).
   Beat it with the same id-lever Round 3 used so the swatch stays transparent
   (selection = the ink ring on the dot + the ink name, nothing behind it). */
body.lgw-on .lgw-swpick,
body.lgw-on .lgw-swpick:hover,
body.lgw-on :is(#lgm-selected-actions, .lgw-swpick).lgw-swpick.lgw-pk-sel,
body.lgw-on :is(#lgm-selected-actions, .lgw-swpick).lgw-swpick.lgw-pk-sel:hover {
  background: transparent;
}
body.lgw-on .lgw-swpick.lgw-pk-sel .lgw-swdot {
  box-shadow: 0 0 0 3px #FFFFFF, 0 0 0 5px var(--sv-ink);   /* white gap, not cream */
}
/* B4 §4: Joel — "make it so the text is a little lower so it does not touch the
   ring." The selected ring is a box-shadow that reaches 5px past the 3rem dot's
   border-box (no layout space), while the swpick column gap was only .35rem
   (vintage.css:3087) — the name's top sat ~0.6px under the ring. Widen the
   dot→name gap to .9rem (~14.4px) so the name's content-box top clears the ring
   bottom (dot.bottom + 5px) by ≥4px. The grid row gap (1.6rem above) still keeps
   rows from colliding after the taller swatch. (Harness: swatchNameClearsRing.) */
body.lgw-on .lgw-swpick { gap: .9rem; }
body.lgw-on .lgw-swpick .lgw-swnm {
  font-size: 1.3rem;
  line-height: 1.25;
}
body.lgw-on .lgw-pk-colorname {
  font-size: 1.3rem;
  color: var(--vh-muted);
  letter-spacing: 0;
  text-transform: none;
}

/* --------------------------------------------------------------------------
   R4·M — no gold in the studio. The tonal notice was a khaki (wait-tint) block
   with a gold (wait-fill) dot and a khaki Dismiss underline. Make it a tan
   block, hair border, INK dot, ink text, quiet ink Dismiss with ink underline.
   (vintage.css scopes .lgw-tonal without a shell class; body.lgw-on beats it.)
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-tonal {
  background: var(--sv-tan);
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
}
body.lgw-on .lgw-tonal-mark {
  background: var(--sv-ink);
  box-shadow: 0 0 0 1px rgba(24, 21, 16, .16);
}
body.lgw-on .lgw-tonal-copy { color: var(--vh-ink); }
body.lgw-on .lgw-tonal-dismiss {
  border-bottom: 1px solid var(--sv-ink);
  color: var(--vh-ink);
  text-transform: none;
  letter-spacing: 0;
  font-family: var(--vh-body);
  font-size: 1.3rem;
}
body.lgw-on .lgw-tonal-dismiss:hover { color: var(--vh-ink); border-bottom-color: var(--vh-ink); }

/* --------------------------------------------------------------------------
   R4·K — canvas selection toolbar labels never wrap ("Cent er", "Duplic ate").
   studio_controls.css sets the whole command family to white-space:normal +
   overflow-wrap:anywhere, and because that :is() list is #id-anchored
   (#lgm-review-open ...) the WHOLE group inflates to (1,1,1). R4's old
   `.lg-tools .lg-tool` rule was only (0,3,1) and lost — the same specificity
   trap round 1 hit. Fix with the id lever this file already uses: the compound
   :is(#lgm-review-open, .lg-tool).lg-tool still only matches .lg-tool elements
   (the id member never carries .lg-tool) but borrows the id's (1,0,0), landing
   this rule at (1,2,1) so it wins. flex:0 0 auto keeps a squeezed plate from
   shrinking a key below its single-line width (a shrunk key with normal
   white-space is exactly what wrapped). The plate is a sibling of the
   transformed stage, so it is already outside the camera zoom — no counter-
   scaling needed at any zoom level.

   B6: the anti-shrink floor is --st-control-min (the 44px touch target
   studio_controls.css already sets on .lg-tool), NOT max-content. flex:0 0 auto
   alone keeps a key at its single-line width (flex-shrink:0 never squeezes it
   below content), so max-content was redundant AND it shrank a one-word key
   like "Pin" to ~39px — under the 44px target and clipping its own label. The
   floor keeps narrow keys at 44px while wide keys (Duplicate) still ride their
   content width through flex-basis:auto.
   -------------------------------------------------------------------------- */
body.lgw-on :is(#lgm-review-open, .lg-tool).lg-tool {
  white-space: nowrap;
  overflow-wrap: normal;
  word-break: keep-all;
  min-width: var(--st-control-min);
  flex: 0 0 auto;
}
/* And the plate gives up its own gap/padding before it ever squeezes a key: on
   a narrow desktop room it tightens (vintage.css keeps flex-wrap:nowrap +
   max-width:calc(100% - 2rem)), and if the keys still total wider than the room
   it overflows visibly rather than clip or wrap — every key stays one line and
   on screen. */
@media (max-width: 1300px) {
  body.lgw-on .lg-tools { gap: .4rem; padding: .4rem .5rem; }
}

/* --------------------------------------------------------------------------
   R4·N — rail tiles stay simple: icon, label, ONE single-line status. The
   "Step n of 4" eyebrow is hidden (kept for screen readers via clip). Behind
   --sv-rail-eyebrow / --sv-rail-status-lines (declared at the top of the file).
   R4·E — the status leading check is legible: ~1.5rem, heavier, centered.
   -------------------------------------------------------------------------- */
/* eyebrow: hidden by default via --sv-rail-eyebrow (none). Removing the "Step n
   of 4" text leaves the button's accessible name as its plain step label
   (Garment / Design / Placement / Review design) — cleaner, not poorer — while
   aria-current="step" still conveys the current step. Flip to block to show it.
   (Harness asserts each rail button's accessible name still holds its label.) */
body.lgw-on .lgw-step .lgw-stepmeta {
  display: var(--sv-rail-eyebrow, none);
}
/* status: clamp to --sv-rail-status-lines (default 1 = one line, ellipsised). */
body.lgw-on .lgw-step .lgw-st {
  -webkit-line-clamp: var(--sv-rail-status-lines);
  line-clamp: var(--sv-rail-status-lines);
  text-overflow: ellipsis;
}
/* R4·E — the leading OK check before the status line, bigger + bolder, centered
   on the first line, .5rem gap. Same on active (ink-on-white) + inactive tabs. */
body.lgw-on .lgw-step .lgw-st .lgw-ok {
  display: inline-block;
  font-size: 1.5rem;
  font-weight: 700;
  line-height: 1;
  margin-right: .5rem;
  vertical-align: -.18em;
  color: var(--vh-ok);
}

/* --------------------------------------------------------------------------
   R4·P — garment-type tile icons: one fixed 3.6rem box, optically centered.
   Every icon's viewBox is 351x351 but the painted ink sits at a different
   vertical centre and height. Per-icon translate brings each ink-centre onto
   the box centre (measured by canvas alpha scan); the short cap is scaled up a
   touch and the tall hoodie down a touch so their visual heights balance.
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-family-ico {
  display: grid;
  place-items: center;
  width: 3.6rem;
  height: 3.6rem;
  margin-bottom: .8rem;
  transform-origin: 50% 50%;
  overflow: visible;
}
body.lgw-on .lgw-family[data-lgw-k="f:tshirt"]   .lgw-family-ico { transform: translateY(-8%); }
body.lgw-on .lgw-family[data-lgw-k="f:crewneck"] .lgw-family-ico { transform: translateY(-9%); }
body.lgw-on .lgw-family[data-lgw-k="f:hoodie"]   .lgw-family-ico { transform: translateY(0.5%) scale(0.9); }
body.lgw-on .lgw-family[data-lgw-k="f:cap"]      .lgw-family-ico { transform: translateY(-26.5%) scale(1.2); }
body.lgw-on .lgw-family[data-lgw-k="f:polo"]     .lgw-family-ico { transform: translateY(-7%); }
body.lgw-on .lgw-family[data-lgw-k="f:jacket"]   .lgw-family-ico { transform: translateY(-8.5%); }

/* --------------------------------------------------------------------------
   R4·R — the "Thread colors — whole design" panel: rounded tan header with the
   stepper on the same row, right-aligned; thread rows as white option rows.
   (Selectors are defensive — this panel only renders when a design has threads;
   it is not in the standard drive states. The tonal notice inside is item M.)
   -------------------------------------------------------------------------- */
:is(body.lgw-on, body.lgm-on) :is(.lgw-cl-head, .lgw-th-head, .lgt-th-head) {
  background: var(--sv-tan);
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
  padding: 1.2rem 1.4rem;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.2rem;
}
body.lgw-on :is(.lgw-cl-stepper, .lgw-th-stepper) {
  display: inline-flex;
  align-items: center;
  gap: .6rem;
}
body.lgw-on :is(.lgw-cl-stepper button, .lgw-th-stepper button) {
  min-height: 44px;
  min-width: 44px;
  border-radius: var(--sv-r-ctl);
}
body.lgw-on :is(.lgw-cl-count, .lgw-th-count) {
  font-family: var(--vh-display);
  font-variant-numeric: tabular-nums;
}
:is(body.lgw-on, body.lgm-on) :is(.lgw-cl-row, .lgw-th-row, .lgt-th-row) {
  background: #FFFFFF;
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
}

/* ==========================================================================
   ROUND 5 POLISH (2026-09-21) — add rows unboxed, last hairline, thread check.
   Joel approved the round-4 look + picked title font option 1 (already default).
   Three fixes. Still skin only (one stylesheet + harness + handoff); no markup /
   JS / engine / other-CSS change, no !important.
   ========================================================================== */

/* --------------------------------------------------------------------------
   R5·1 — the "Add to your design" / "Add another element" action group must be
   visually NONEXISTENT as a container: no border, no background, no shadow, no
   radius, no padding — just a 1rem gap between the stacked rows. In the --two
   state (Logo hidden, Add text + Design library remaining) vintage.css:3657
   `.lgw-ins-actions.lgw-ins-actions--two` (specificity (0,3,1)) BEAT the round-4
   override (0,2,1): it painted a 1px hair border + panel-white fill + 2px radius
   and set gap:0, so an outer box hugged the two rows and they touched. The group
   carries id `lgw-ins-actions`, so its own id (1,x,x) wins outright over any
   class rule in either state. Each row stays its own bordered card (round 4).
   -------------------------------------------------------------------------- */
body.lgw-on #lgw-ins-actions,
body.lgw-on #lgw-ins-actions.lgw-ins-actions--two {
  display: flex;
  flex-direction: column;
  grid-template-columns: none;
  gap: 1rem;
  background: transparent;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  padding: 0;
  overflow: visible;
}

/* --------------------------------------------------------------------------
   R5·2 — the last surviving hairline: the garment browser head (.lgw-pk-head,
   the "Choose a garment" title + Done row) still drew a border-BOTTOM.
   studio_picker_clarity.css:11 zeroed its border-top but never touched the
   border-bottom, so vintage.css:2988's (0,1,0) border-bottom survived under the
   head. Remove both edges; space separates (the no-rules borderSweep now runs
   with the garment browser open and covers this element).
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-picker .lgw-pk-head {
  border-top: 0;
  border-bottom: 0;
}

/* ==========================================================================
   ROUND 6 POLISH (2026-09-21) — FINAL CSS ROUND: icon-and-label rail, pricing
   details spacing. Joel saw a competitor's rail he likes and wants ours to
   match its simplicity: icon + ONE label per step, nothing else. His words:
   "No other text just the Garment or Add Design etc."
   Still skin only (one stylesheet + harness + handoff); no markup / JS / engine
   / other-CSS change, no !important.
   ========================================================================== */

/* --------------------------------------------------------------------------
   R6·1 — RAIL: icon over label only. The live status line is hidden VISUALLY
   (--sv-rail-status-lines flipped to 0) but KEPT in each button's accessible
   name via a visually-hidden clip (position:absolute + clip, NOT display:none),
   so screen-reader users still hear the step status. The "Step n of 4" eyebrow
   stays hidden (R4·N). The active-tab treatment (panel-white flush tab, rounded
   left corners) is unchanged — §4 / R2·6 own it.
   -------------------------------------------------------------------------- */
body.lgw-on { --sv-rail-status-lines: 0; }

/* first tile 1.6rem below the masthead; tiles 1.2rem apart. Rail width stays
   14rem (vintage.css:2604's grid column) so the canvas room + canvas-fit
   geometry are untouched; "Review design" fits one line at 1.4rem there. */
body.lgw-on .lgw-rail {
  gap: 1.2rem;
  padding-top: 1.6rem;
}

/* tile: icon (2.6rem box, §4) over label, .6rem between, 1.4rem vertical
   padding. Content-height (min-height:0) so the padding defines the tile; the
   touch target stays well over 44px (icon 2.6rem + label + 2×1.4rem padding).
   Horizontal padding (.9rem, R2·6) stays so the label keeps the rail inset. */
body.lgw-on .lgw-step {
  gap: .6rem;
  min-height: 0;
  padding-top: 1.4rem;
  padding-bottom: 1.4rem;
}

/* label: Cooper Hewitt (--vh-body) 600, centered, one line, no wrap.
   B2 §2: 1.4rem -> 1.75rem (~25% bigger). "Review design" still fits one line in
   the 14rem rail at this size (harness labelsOneLine confirms no clip at 1440 or
   1100); the rail width stays 14rem so canvas-fit geometry is untouched.
   B5: 1.75rem -> 1.6rem (10% smaller, 1.575 exact rounded to 1.6; Joel: "reduce
   the size of icons by 10%, and the text"). Still one line in the 14rem rail. */
body.lgw-on .lgw-step .lgw-lb {
  font-family: var(--vh-body);
  font-weight: 600;
  font-size: 1.6rem;
  line-height: 1.2;
  letter-spacing: 0;
  text-transform: none;
  text-align: center;
  white-space: nowrap;
}

/* status: with --sv-rail-status-lines 0 it is visually hidden but stays in the
   accessible name (the clip technique keeps the text node in the DOM, unlike
   the eyebrow's display:none). Overrides the §4 visible-status block. */
body.lgw-on .lgw-step .lgw-st {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  border: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  -webkit-line-clamp: none;
  line-clamp: none;
  display: block;
}

/* --------------------------------------------------------------------------
   B4 §1 — RAIL ICONS replaced with Joel's matched set (rail-{garment,design,
   text,placement,review,startover}.svg, source of record in
   app/static/images/studio/rail/). Each is a 0 0 100 100 fill="currentColor"
   glyph vectorized to an identical painted height across the six, so NO
   per-icon scale/translate is needed and NO stroke-width rule applies — the
   R6·2 / B2 §2 normalization hacks are gone. Every icon paints in the same
   3.2rem box (the .lgw-navmark box above, svg at 100%×100%). currentColor lets
   the fill ride the active-tab ink colour. (Harness railIconNorm asserts the
   painted-ink-height spread stays <=1px with no transforms.)
   railsize (2026-09-23): Garment + Design are 10% bigger by Joel's ask — the
   1.10x is baked into those two SVGs' path coordinates about (50,50), so there
   is still no CSS here. The garment's sleeves now reach just past the viewBox,
   so its svg carries overflow="visible". railIconNorm asserts 1.10x (+-1px). */

/* --------------------------------------------------------------------------
   R6·3 — PRICING DETAILS disclosure. Joel: it "still looks a mess". The
   revealed content (.lgw-facts-summary inside the <details>) is served as ONE
   run-on <p> text node — the server builds the whole sentence with the money
   interpolated inline (routes.py _studio_commercial_summary, printed verbatim
   by studio_price_facts.js into <p class="lgw-facts-summary">), so the money is
   NOT its own spans and can't be re-faced to Oswald from CSS without a copy
   change. What CSS can do: 1.4rem body, line-height 1.55, muted, 1.2rem top
   padding inside the tan block, and max-width 34ch so the lines break evenly
   into a tidy column instead of one wide run-on. (A follow-up drive can turn
   the string into rows — see the handoff for the exact source.)
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-facts-details .lgw-facts-summary {
  margin-top: 0;
  padding-top: 1.2rem;
  max-width: 34ch;
  font-family: var(--vh-body);
  font-weight: 400;
  font-size: 1.4rem;
  line-height: 1.55;
  letter-spacing: 0;
  color: var(--vh-muted);
}

/* ==========================================================================
   B1 DRIVE (2026-09-21) — behaviour drive: Text step, Start over, pricing rows.
   briefs/_SPEC_studio_b1.md. This drive is allowed to add markup + JS + edit
   this stylesheet; the visual pass's skin-only rule does not bind it. Still no
   !important, still scoped under body.lgw-on (the desktop shell).
   ========================================================================== */

/* --------------------------------------------------------------------------
   B1 §2 — Start over: a quiet tile that is never a step. It carries no
   data-lgw-step; fx4: it takes the active plate (.lgw-active) only while its
   confirm shows, and the quiet label yields to active ink then. It sits in
   the normal tile rhythm directly under Placement (no auto-margin gap), so the
   rail reads Garment / Design / Text / Placement / Start over; the Review entry
   carries margin-top:auto instead and stays pinned at the rail foot. Quieter
   than the step labels (rail-quiet ink, weight 500) so it reads as a utility,
   not a step; hover brightens it.
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-step--order { margin-top: auto; }
body.lgw-on .lgw-startover .lgw-lb {
  font-weight: 500;
  color: var(--sv-rail-quiet);
}
body.lgw-on .lgw-startover:hover .lgw-lb { color: var(--sv-panel); }
body.lgw-on .lgw-startover.lgw-active .lgw-lb { color: var(--sv-ink); font-weight: 600; }

/* B1 §2 — the inline Start over confirm: the D17 hidden-swap idiom seated
   INSIDE the panel. At rest it is display:none and costs nothing. When the
   rail button arms it (#lgw-panel gets .lgw-startover-on) it becomes an OPAQUE
   panel-white fill of the whole panel (position:absolute inset:0) — the panel
   head is replaced by the question, not covered by a floating modal or scrim.
   -------------------------------------------------------------------------- */
body.lgw-on #lgw-startover-confirm { display: none; }
body.lgw-on .lgw-panel.lgw-startover-on { position: relative; }
body.lgw-on .lgw-panel.lgw-startover-on #lgw-startover-confirm {
  display: flex;
  flex-direction: column;
  gap: 1.8rem;
  position: absolute;
  inset: 0;
  z-index: 6;
  background: var(--vh-white);
  padding: 2.6rem 2.4rem;
}
body.lgw-on #lgw-startover-confirm .lgw-startover-q {
  margin: 0;
  max-width: 34ch;
  font-family: var(--sv-title-font, var(--vh-display));
  font-weight: var(--sv-title-weight, 600);
  font-size: 2rem;
  line-height: 1.35;
  letter-spacing: var(--sv-title-tracking, .005em);
  color: var(--vh-ink);
}
body.lgw-on #lgw-startover-confirm .lgw-startover-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
}
body.lgw-on #lgw-startover-confirm button {
  min-height: 44px;
  padding: .7rem 1.6rem;
  font-family: var(--vh-body);
  font-size: 1.5rem;
  border-radius: var(--sv-r-ctl, 8px);
  cursor: pointer;
}
body.lgw-on #lgw-startover-confirm .lgw-startover-yes {
  background: var(--vh-ink);
  color: var(--vh-white);
  border: 1px solid var(--vh-ink);
}
body.lgw-on #lgw-startover-confirm .lgw-startover-no {
  background: var(--vh-white);
  color: var(--vh-ink);
  border: 1px solid var(--st-control-border, #8A867E);
}
body.lgw-on #lgw-startover-confirm button:focus-visible {
  outline: 2px solid var(--vh-ink);
  outline-offset: 2px;
}

/* --------------------------------------------------------------------------
   B1 §3 — PRICING DETAILS as rows. The server now emits commercial_rows and
   studio_price_facts.js renders them as a <dl class="lgw-facts-rows"> inside
   the disclosure (falling back to the single <p> for older cached payloads,
   still styled by R6·3 above). Two-column grid: dt muted label, dd ink value
   right-aligned with money upright in Oswald tabular. No rules — .6rem row gap.
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-facts-details .lgw-facts-rows {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: .6rem 1.6rem;
  margin: 0;
  padding-top: 1.2rem;
}
body.lgw-on .lgw-facts-details .lgw-facts-rows dt {
  margin: 0;
  font-family: var(--vh-body);
  font-weight: 400;
  font-size: 1.3rem;
  line-height: 1.3;
  color: var(--vh-muted);
}
body.lgw-on .lgw-facts-details .lgw-facts-rows dd {
  margin: 0;
  justify-self: end;
  text-align: right;
  font-family: var(--vh-display);
  font-style: normal;
  font-weight: 500;
  font-size: 1.4rem;
  line-height: 1.3;
  letter-spacing: .02em;
  font-variant-numeric: tabular-nums;
  color: var(--vh-ink);
}

/* ==========================================================================
   B3 DRIVE (2026-09-22) — Design owns the piece, Placement owns the spot.
   Behaviour drive: the shell chooses which panel opens on select and lays the
   controls out; the engine still owns select / delete / spot move / size /
   thread count. All rules scoped to body.lgw-on (desktop) unless noted; the
   phone shell (lgm-on) keeps today's layout except the cheap header Remove.
   ========================================================================== */

/* --- B3 §1 — the shared piece-header card: thumb, name, meta, then a quiet red
   Remove text button on the right. The header card is identical on both the
   Design piece editor and the Placement panel. The file-card "Swap"/"Add logo"
   link (#lgw-ins-swap) stays a Design-only affordance; it is hidden in
   Placement (insRender) and never competes with Remove for the right edge. --- */
body.lgw-on .lgw-ins-id .lgw-ins-f { flex: 1 1 auto; min-width: 0; }
body.lgw-on .lgw-ins-remove {
  flex: 0 0 auto;
  appearance: none;
  border: 0;
  background: none;
  padding: .4rem .2rem;
  font-family: var(--vh-body);
  font-size: 1.3rem;
  font-weight: 500;
  color: var(--vh-stop);
  cursor: pointer;
  border-radius: var(--sv-r-sm, 6px);
}
body.lgw-on .lgw-ins-remove:hover { text-decoration: underline; }
body.lgw-on .lgw-ins-remove:focus-visible { outline: 2px solid var(--vh-stop); outline-offset: 2px; }

/* the inline remove confirm — the Start over hidden-swap idiom, scoped to the
   confirming HOST (the header card or a list row): arming hides the host's own
   content and reveals the confirm IN PLACE (no modal, no scrim). Esc = Keep
   (wired in JS). One shared .lgw-ins-confirm host class carries the swap. */
body.lgw-on .lgw-ins-confirm { display: none; }
body.lgw-on .lgw-ins-confirming > :not(.lgw-ins-confirm) { display: none; }
body.lgw-on .lgw-ins-confirming .lgw-ins-confirm {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 1rem 1.2rem;
  width: 100%;
}
body.lgw-on .lgw-ins-id.lgw-ins-confirming { flex-wrap: wrap; }
body.lgw-on .lgw-ins-confirm .lgw-ins-confirm-q {
  margin: 0;
  flex: 1 1 auto;
  font-family: var(--sv-title-font, var(--vh-display));
  font-weight: var(--sv-title-weight, 600);
  font-size: 1.7rem;
  line-height: 1.3;
  letter-spacing: var(--sv-title-tracking, .005em);
  color: var(--vh-ink);
}
body.lgw-on .lgw-ins-confirm-actions { display: flex; gap: .8rem; flex: 0 0 auto; }
body.lgw-on .lgw-ins-confirm-actions button {
  min-height: 40px;
  padding: .5rem 1.3rem;
  font-family: var(--vh-body);
  font-size: 1.4rem;
  border-radius: var(--sv-r-ctl, 8px);
  cursor: pointer;
}
body.lgw-on .lgw-ins-confirm-yes {
  background: var(--vh-stop);
  color: var(--vh-white);
  border: 1px solid var(--vh-stop);
}
body.lgw-on .lgw-ins-confirm-no {
  background: var(--vh-white);
  color: var(--vh-ink);
  border: 1px solid var(--st-control-border, #8A867E);
}
body.lgw-on .lgw-ins-confirm-actions button:focus-visible {
  outline: 2px solid var(--vh-ink);
  outline-offset: 2px;
}

/* --- B3 §2 — thread dots on the "Everything in this design" rows: up to 5 dots
   after the name/status, then a quiet "+N" overflow. Colours are the design's
   thread palette (logos, whole-design) or the text's own thread hex. --- */
body.lgw-on .lgw-ins-dots { display: flex; align-items: center; gap: .4rem; margin-top: .45rem; }
body.lgw-on .lgw-ins-dots[hidden] { display: none; }
body.lgw-on .lgw-ins-dot {
  width: 12px;
  height: 12px;
  border-radius: 50%;
  border: 1px solid rgba(24, 21, 16, .18);
  flex: 0 0 auto;
}
body.lgw-on .lgw-ins-dot--more {
  width: auto;
  height: auto;
  border: 0;
  border-radius: 0;
  font-family: var(--vh-body);
  font-size: 1.1rem;
  line-height: 1;
  color: var(--vh-muted);
}

/* --- B3 §2/§3 — the cross-link secondary button under the editor / panel. One
   full-width quiet secondary ("Place this piece" or "Edit colors"/"Edit text").
   Reads lighter than the ink Continue CTA; same control radius. --- */
body.lgw-on .lgw-ins-xlink { margin-top: 2.4rem; display: flex; flex-direction: column; gap: .8rem; }
body.lgw-on .lgw-ins-xlink[hidden] { display: none; }
/* the swap link reads quieter than "Place this piece" - a plain text control. */
body.lgw-on .lgw-ins-xbtn--swap {
  border-color: transparent;
  background: none;
  min-height: 40px;
  color: var(--sv-muted);
  font-size: 1.4rem;
}
body.lgw-on .lgw-ins-xbtn--swap:hover { border-color: transparent; text-decoration: underline; }
/* B3 §1: the file-card swap link lives in the Design editor on the desktop, so
   the shared header shows only thumb / name / meta / Remove - identical on both
   panels. studio_controls.css:158 shows #lgw-ins-id #lgw-ins-swap at (2,1,0), so
   match that (studio_visual loads last → wins). The phone keeps swap in the
   header (its own edit flow), so this is scoped to lgw-on only. */
body.lgw-on #lgw-ins-id #lgw-ins-swap { display: none; }
body.lgw-on .lgw-ins-xbtn {
  width: 100%;
  min-height: 46px;
  padding: .8rem 1.6rem;
  font-family: var(--vh-body);
  font-size: 1.5rem;
  color: var(--vh-ink);
  background: var(--sv-panel);
  border: 1px solid var(--st-control-border, #8A867E);
  border-radius: var(--sv-r-ctl, 8px);
  cursor: pointer;
  transition: border-color 120ms ease, background 120ms ease;
}
body.lgw-on .lgw-ins-xbtn[hidden] { display: none; }
body.lgw-on .lgw-ins-xbtn:hover { border-color: var(--vh-ink); }
body.lgw-on .lgw-ins-xbtn:focus-visible { outline: 2px solid var(--vh-ink); outline-offset: 2px; }

/* B3 §4 — the per-row Remove: a quiet red text button revealed on row hover /
   focus (always reachable by keyboard via focus-within). Its confirm reuses the
   shared .lgw-ins-confirm swap above. */
body.lgw-on .lgw-ins-row { position: relative; }
body.lgw-on .lgw-ins-rowrm {
  flex: 0 0 auto;
  appearance: none;
  border: 0;
  background: none;
  padding: .3rem .5rem;
  font-family: var(--vh-body);
  font-size: 1.2rem;
  font-weight: 500;
  color: var(--vh-stop);
  cursor: pointer;
  border-radius: var(--sv-r-sm, 6px);
  opacity: 0;
  transition: opacity 120ms ease;
}
body.lgw-on .lgw-ins-row:hover .lgw-ins-rowrm,
body.lgw-on .lgw-ins-row:focus-within .lgw-ins-rowrm { opacity: 1; }
body.lgw-on .lgw-ins-rowrm:hover { text-decoration: underline; }
body.lgw-on .lgw-ins-rowrm:focus-visible { opacity: 1; outline: 2px solid var(--vh-stop); outline-offset: 2px; }
/* the row's confirm q reads smaller than the header's (a row is a tight strip) */
body.lgw-on .lgw-ins-rowconfirm .lgw-ins-confirm-q { font-size: 1.4rem; }

/* Phone shell (<1100px): the B3 desktop confirm swap, dots, cross-link and
   row Remove are styled for the desktop panel only. Rather than ship them
   half-styled on the phone sheet, keep the phone layout as it is today (spec
   §5) — they are hidden on lgm-on; the phone keeps its own edit flow. */
body.lgm-on .lgw-ins-remove,
body.lgm-on .lgw-ins-idconfirm,
body.lgm-on .lgw-ins-dots,
body.lgm-on .lgw-ins-rowrm,
body.lgm-on .lgw-ins-rowconfirm,
body.lgm-on .lgw-ins-xlink { display: none; }

/* --- B3 §3 — Placement equal cards. Joel: the mixed-width chips "are too
   different in size and look a little messy." The spots as a grid of IDENTICAL
   cards (name on top, fit line under), then a one-row Width stepper. Desktop
   shell only; the phone keeps its own layout.
   B10 §1 — the Side toggle (Front | Back) is gone: the cards list every spot on
   both sides and take the toggle's look — Oswald caps label; selected = solid
   ink fill with a white label (the black button Joel likes), unselected = white
   with a hair border. The corner check stays off: the fill IS the selection. --- */

body.lgw-on .lgw-ins-spots {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
}
/* the id in the :is() list is the R2 specificity lever: studio_controls.css
   styles .lgw-ins-spot (and its --on state) at (1,1,1) through an :is() that
   carries ids; (1,2,1) here wins by source order AND weight. */
body.lgw-on :is(#lgw-ins-spots, .lgw-ins-spots) > .lgw-ins-spot {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  min-height: 6.6rem;
  padding: 1rem 1.2rem;
  text-align: left;
  gap: .3rem;
  font: 400 1.3rem/1.2 var(--vh-display);
  text-transform: uppercase;
  letter-spacing: .06em;
  color: var(--vh-ink);
  background: var(--sv-panel);
  border: 1px solid var(--sv-hair-strong);
  border-radius: var(--sv-r-ctl, 8px);
  box-shadow: none;
  transition: background 120ms ease, border-color 120ms ease, color 120ms ease;
}
body.lgw-on :is(#lgw-ins-spots, .lgw-ins-spots) > .lgw-ins-spot:hover:not(:disabled):not(.lgw-ins-spot--on) {
  border-color: var(--vh-ink);
  background: var(--sv-panel);
  box-shadow: none;
  transform: none;
}
body.lgw-on :is(#lgw-ins-spots, .lgw-ins-spots) > .lgw-ins-spot.lgw-ins-spot--on,
body.lgw-on :is(#lgw-ins-spots, .lgw-ins-spots) > .lgw-ins-spot.lgw-ins-spot--on:hover {
  background: var(--vh-ink);
  color: var(--vh-white);
  border-color: var(--vh-ink);
  box-shadow: none;
}
body.lgw-on :is(#lgw-ins-spots, .lgw-ins-spots) > .lgw-ins-spot.lgw-ins-spot--on::after { content: none; }
body.lgw-on :is(#lgw-ins-spots, .lgw-ins-spots) > .lgw-ins-spot:disabled {
  opacity: .5;
  cursor: not-allowed;
}
body.lgw-on :is(#lgw-ins-spots, .lgw-ins-spots) > .lgw-ins-spot:focus-visible { outline: 2px solid var(--vh-ink); outline-offset: 2px; }
/* the fit line keeps the body face, sentence case, quiet; white-ish on ink */
body.lgw-on :is(#lgw-ins-spots, .lgw-ins-spots) > .lgw-ins-spot .lgw-ins-fit {
  margin-top: 0;
  font: 400 1.2rem/1.3 var(--vh-body);
  text-transform: none;
  letter-spacing: 0;
  color: var(--vh-muted);
}
body.lgw-on :is(#lgw-ins-spots, .lgw-ins-spots) > .lgw-ins-spot.lgw-ins-spot--on .lgw-ins-fit { color: rgba(253, 252, 247, .78); }
/* the "Too small" line on a dimmed, unclickable card reads distinct from Fits */
body.lgw-on .lgw-ins-spot .lgw-ins-fit--no { color: var(--sv-muted); }
/* B10 §1: Arrange text below logo sits directly under the cards, ahead of Size */
body.lgw-on #lgw-ins-arrange { margin: 1.2rem 0 0; }
body.lgw-on #lgw-ins-arrange[hidden] { display: none; }

/* ==========================================================================
   B10 §2 — the Text panel as ROWS (the Lids pattern), the piece tools, the
   font chooser view. Desktop shell only: the lgt module re-seats its own
   nodes into these rows under body.lgw-on and restores today's order for the
   phone. Rows: 1.5rem body-600 label left, value right-aligned muted, 8px
   radius on the click-through rows, ONE hairline between rows (no boxes), ink
   chevrons. No gold. Shape / Spacing / Lines rows are not built (engine gate).
   ========================================================================== */
/* Phone studio S1: the phone's Text sheet is these same rows (Joel's PC
   order since T1), so the selectors below read both shells */
:is(body.lgw-on, body.lgm-on) .lgt-row {
  display: flex;
  flex-direction: column;
  gap: .9rem;
  padding: 1.5rem 0;
  border-top: 1px solid var(--sv-hair);
}
:is(body.lgw-on, body.lgm-on) .lgt-row[hidden] { display: none; }
:is(body.lgw-on, body.lgm-on) #lgt-row-words { border-top: 0; padding-top: .2rem; }
:is(body.lgw-on, body.lgm-on) .lgt-row-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.2rem;
  min-height: 2.6rem;
}
:is(body.lgw-on, body.lgm-on) .lgt-row .lgt-row-lbl,
:is(body.lgw-on, body.lgm-on) .lgt-row .lgt-th-t,
:is(body.lgw-on, body.lgm-on) .lgt-row .lgt-size-t {
  display: block;
  margin: 0;
  font: 600 1.5rem/1.35 var(--vh-body);
  letter-spacing: 0;
  text-transform: none;
  color: var(--vh-ink);
}
:is(body.lgw-on, body.lgm-on) .lgt-row-val,
:is(body.lgw-on, body.lgm-on) .lgt-row .lgt-row-value {
  display: inline-flex;
  align-items: center;
  justify-content: flex-end;
  gap: .9rem;
  min-width: 0;
  text-align: right;
  font: 400 1.4rem/1.35 var(--vh-body);
  color: var(--sv-muted);
}
:is(body.lgw-on, body.lgm-on) .lgt-row-valtext { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* the ink chevron: a CSS-drawn stroke, no glyph font */
:is(body.lgw-on, body.lgm-on) .lgt-row-chev,
:is(body.lgw-on, body.lgm-on) .lgt-th.lgt-row #lgt-th-cur::after {
  content: '';
  flex: none;
  width: .8rem;
  height: .8rem;
  margin-left: .2rem;
  border-right: 2px solid var(--vh-ink);
  border-bottom: 2px solid var(--vh-ink);
  transform: rotate(-45deg);
}
/* click-through rows (Font, Thread): the whole row is the control */
:is(body.lgw-on, body.lgm-on) .lgt-row--btn {
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  min-height: 5.8rem;
  padding: 1rem .6rem;
  appearance: none;
  background: transparent;
  border: 0;
  border-top: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-ctl);
  text-align: left;
  cursor: pointer;
  transition: background 120ms ease;
}
:is(body.lgw-on, body.lgm-on) .lgt-row--btn:hover { background: var(--st-control-hover); }
:is(body.lgw-on, body.lgm-on) .lgt-row--btn:focus-visible { outline: 2px solid var(--vh-ink); outline-offset: 2px; }
:is(body.lgw-on, body.lgm-on) .lgt-font-sample {
  height: 2.2rem;
  max-width: 9rem;
  object-fit: contain;
  object-position: right center;
}
/* Thread: the existing chip is the row's value, flattened */
:is(body.lgw-on, body.lgm-on) .lgt-th.lgt-row {
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  margin-top: 0;
  padding: 1rem .6rem;
  border-radius: var(--sv-r-ctl);
  cursor: pointer;
  transition: background 120ms ease;
}
:is(body.lgw-on, body.lgm-on) .lgt-th.lgt-row:hover { background: var(--st-control-hover); }
/* M13 under B10: the tonal warning keeps its own full-width line under the
   Thread row instead of squeezing in beside the chip */
:is(body.lgw-on, body.lgm-on) .lgt-th.lgt-row { flex-wrap: wrap; }
:is(body.lgw-on, body.lgm-on) .lgt-th.lgt-row > .lgw-tonal { flex: 1 0 100%; cursor: default; }
:is(body.lgw-on, body.lgm-on) .lgt-th.lgt-row #lgt-th-cur {
  min-width: 0;
  min-height: 2.6rem;
  height: auto;
  padding: 0;
  gap: .8rem;
  background: transparent;
  border: 0;
  border-radius: var(--sv-r-sm);
  font: 400 1.4rem/1.35 var(--vh-body);
  color: var(--sv-muted);
  box-shadow: none;
}
:is(body.lgw-on, body.lgm-on) .lgt-th.lgt-row #lgt-th-cur:hover { border-color: transparent; }
:is(body.lgw-on, body.lgm-on) .lgt-th.lgt-row #lgt-th-cur:focus-visible { outline: 2px solid var(--vh-ink); outline-offset: 4px; }
:is(body.lgw-on, body.lgm-on) .lgt-th.lgt-row #lgt-th-cur .lgw-cl-swno { color: var(--vh-ink); font-weight: 600; }
/* Caps: a two-key segmented control, selected = ink fill (the placement cards' language) */
:is(body.lgw-on, body.lgm-on) .lgt-seg { display: inline-flex; gap: .5rem; }
:is(body.lgw-on, body.lgm-on) .lgt-seg-btn,
:is(body.lgw-on, body.lgm-on) .lgt-quick-btn,
:is(body.lgw-on, body.lgm-on) .lgw-pt-chip {
  min-height: 3.6rem;
  padding: 0 1.2rem;
  appearance: none;
  background: var(--sv-panel);
  color: var(--vh-ink);
  border: 1px solid var(--sv-hair-strong);
  border-radius: var(--sv-r-ctl);
  font: 500 1.3rem/1 var(--vh-body);
  letter-spacing: 0;
  white-space: nowrap;
  cursor: pointer;
  transition: background 120ms ease, border-color 120ms ease, color 120ms ease;
}
:is(body.lgw-on, body.lgm-on) .lgt-seg-btn:hover:not(.lgt-seg--on),
:is(body.lgw-on, body.lgm-on) .lgt-quick-btn:hover:not([aria-pressed="true"]):not(:disabled),
:is(body.lgw-on, body.lgm-on) .lgw-pt-chip:hover:not([aria-pressed="true"]):not(:disabled) { border-color: var(--vh-ink); }
:is(body.lgw-on, body.lgm-on) .lgt-seg-btn.lgt-seg--on,
:is(body.lgw-on, body.lgm-on) .lgt-quick-btn[aria-pressed="true"],
:is(body.lgw-on, body.lgm-on) .lgw-pt-chip[aria-pressed="true"] {
  background: var(--vh-ink);
  color: var(--vh-white);
  border-color: var(--vh-ink);
}
:is(body.lgw-on, body.lgm-on) :is(.lgt-seg-btn, .lgt-quick-btn, .lgw-pt-chip):focus-visible { outline: 2px solid var(--vh-ink); outline-offset: 2px; }
:is(body.lgw-on, body.lgm-on) :is(.lgt-quick-btn, .lgw-pt-chip):disabled { opacity: .45; cursor: not-allowed; }
/* personalisation part 2: "Different on each piece" — the Caps row's chrome
   (label + two-key segmented), the help line under it, and the quiet reason
   when another line already changes per piece (keys greyed, not hidden) */
:is(body.lgw-on, body.lgm-on) .lgt-row--pp { gap: .6rem; }
:is(body.lgw-on, body.lgm-on) .lgt-row--pp .lgt-seg-btn { min-width: 5.6rem; }
:is(body.lgw-on, body.lgm-on) .lgt-row--pp .lgt-seg-btn:disabled { opacity: .45; cursor: not-allowed; }
:is(body.lgw-on, body.lgm-on) .lgt-row--pp .lgt-seg-btn:disabled:hover { border-color: var(--sv-hair-strong); }
:is(body.lgw-on, body.lgm-on) .lgt-pp-help,
:is(body.lgw-on, body.lgm-on) .lgt-pp-why {
  margin: 0;
  font: 400 1.3rem/1.5 var(--vh-body);
  color: var(--sv-muted);
}
:is(body.lgw-on, body.lgm-on) .lgt-pp-why { color: var(--vh-ink); }
:is(body.lgw-on, body.lgm-on) .lgw-pt-chip--reset { font-weight: 400; color: var(--sv-muted); }
:is(body.lgw-on, body.lgm-on) .lgw-pt-chip--reset:disabled { opacity: .45; }
/* Text size: head (label · value) + the existing slider + quick sizes */
:is(body.lgw-on, body.lgm-on) .lgt-size.lgt-row { margin-top: 0; padding-top: 1.5rem; }
:is(body.lgw-on, body.lgm-on) .lgt-size.lgt-row #lgt-size-val {
  font: 400 1.4rem/1.35 var(--vh-body);
  color: var(--sv-muted);
  white-space: nowrap;
}
:is(body.lgw-on, body.lgm-on) .lgt-size.lgt-row .lgt-size-row { gap: .6rem; }
:is(body.lgw-on, body.lgm-on) .lgt-size.lgt-row #lgt-size { width: 100%; min-width: 0; accent-color: var(--vh-ink); }
:is(body.lgw-on, body.lgm-on) .lgt-quick { display: flex; flex-wrap: wrap; gap: .6rem; }
:is(body.lgw-on, body.lgm-on) .lgt-quick[hidden] { display: none; }
:is(body.lgw-on, body.lgm-on) .lgt-size.lgt-row #lgt-size-note { margin-top: .2rem; }
/* Rotation: readout, slider, quick angles */
:is(body.lgw-on, body.lgm-on) .lgw-pt-slider { width: 100%; accent-color: var(--vh-ink); margin: 0; }
:is(body.lgw-on, body.lgm-on) .lgw-pt-chips { display: flex; flex-wrap: wrap; gap: .6rem; }
/* R-009: a chip turn that no longer fit shrank the logo: the line says so */
:is(body.lgw-on, body.lgm-on) .lgw-pt-note { margin: .6rem 0 0; font-size: 1.3rem; line-height: 1.8rem; color: var(--vh-muted); }
:is(body.lgw-on, body.lgm-on) .lgw-pt-note[hidden] { display: none; }
:is(body.lgw-on, body.lgm-on) .lgw-pt-rot .lgt-row-val { font-family: var(--vh-display); font-variant-numeric: tabular-nums; color: var(--vh-ink); font-size: 1.5rem; }
/* the piece-tools strip (Send back · Bring forward · Flip H · Flip V; Center
   rides under the Size row since 2026-10-01):
   small icon keys with a one-word label, above the rows (the Lids strip) */
:is(body.lgw-on, body.lgm-on) .lgw-pt-strip {
  display: flex;
  flex-wrap: wrap;
  gap: .5rem;
  padding: 0 0 1.4rem;
}
:is(body.lgw-on, body.lgm-on) .lgw-pt-strip[hidden] { display: none; }
:is(body.lgw-on, body.lgm-on) .lgw-pt-key {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: .5rem;
  flex: 1 1 0;
  min-width: 5.8rem;
  min-height: 5.4rem;
  padding: .6rem .4rem;
  appearance: none;
  background: var(--sv-panel);
  color: var(--vh-ink);
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-ctl);
  font: 500 1.15rem/1 var(--vh-body);
  letter-spacing: 0;
  cursor: pointer;
  transition: background 120ms ease, border-color 120ms ease, color 120ms ease;
}
:is(body.lgw-on, body.lgm-on) .lgw-pt-key[hidden] { display: none; }
:is(body.lgw-on, body.lgm-on) .lgw-pt-key:hover:not(:disabled):not([aria-pressed="true"]) { border-color: var(--vh-ink); }
:is(body.lgw-on, body.lgm-on) .lgw-pt-key[aria-pressed="true"] { background: var(--vh-ink); color: var(--vh-white); border-color: var(--vh-ink); }
:is(body.lgw-on, body.lgm-on) .lgw-pt-key:disabled { opacity: .4; cursor: not-allowed; }
:is(body.lgw-on, body.lgm-on) .lgw-pt-key:focus-visible { outline: 2px solid var(--vh-ink); outline-offset: 2px; }
:is(body.lgw-on, body.lgm-on) .lgw-pt-ico { display: inline-grid; place-items: center; width: 1.8rem; height: 1.8rem; }
:is(body.lgw-on, body.lgm-on) .lgw-pt-ico svg { width: 1.6rem; height: 1.6rem; }
/* B10 §2b — "Lines on this spot": one chip per text line in stacking order
   (dot in its thread colour + the words + the font name), the active line
   ink-filled; "+ Add another line" dashed; "Stack" quiet. Above the rows. */
:is(body.lgw-on, body.lgm-on) .lgt-lines { display: flex; flex-direction: column; gap: .8rem; padding: 0 0 1.6rem; }
:is(body.lgw-on, body.lgm-on) .lgt-lines[hidden] { display: none; }
:is(body.lgw-on, body.lgm-on) .lgt-lines-lbl {
  font: 500 1.2rem/1 var(--vh-display);
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--sv-text-quiet);
}
:is(body.lgw-on, body.lgm-on) .lgt-lines-row { display: flex; flex-wrap: wrap; align-items: center; gap: .6rem; }
:is(body.lgw-on, body.lgm-on) .lgt-line {
  display: inline-flex;
  align-items: center;
  gap: .7rem;
  max-width: 100%;
  min-height: 3.8rem;
  padding: 0 1.2rem 0 .9rem;
  appearance: none;
  background: var(--sv-panel);
  color: var(--vh-ink);
  border: 1px solid var(--sv-hair-strong);
  border-radius: var(--sv-r-ctl);
  font: 500 1.3rem/1 var(--vh-body);
  letter-spacing: 0;
  cursor: pointer;
  transition: background 120ms ease, border-color 120ms ease, color 120ms ease;
}
:is(body.lgw-on, body.lgm-on) .lgt-line:hover:not(:disabled):not(.lgt-line--on) { border-color: var(--vh-ink); }
:is(body.lgw-on, body.lgm-on) .lgt-line:focus-visible { outline: 2px solid var(--vh-ink); outline-offset: 2px; }
:is(body.lgw-on, body.lgm-on) .lgt-line:disabled { opacity: .45; cursor: not-allowed; }
:is(body.lgw-on, body.lgm-on) .lgt-line.lgt-line--on { background: var(--vh-ink); color: var(--vh-white); border-color: var(--vh-ink); }
:is(body.lgw-on, body.lgm-on) .lgt-line-dot {
  flex: none;
  width: 1.1rem;
  height: 1.1rem;
  border-radius: 50%;
  box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .28);
}
:is(body.lgw-on, body.lgm-on) .lgt-line--on .lgt-line-dot { box-shadow: 0 0 0 1px rgba(253, 252, 247, .6); }
:is(body.lgw-on, body.lgm-on) .lgt-line-words { max-width: 14ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
:is(body.lgw-on, body.lgm-on) .lgt-line-font { font-size: 1.1rem; font-weight: 400; color: var(--sv-muted); white-space: nowrap; }
:is(body.lgw-on, body.lgm-on) .lgt-line--on .lgt-line-font { color: rgba(253, 252, 247, .75); }
:is(body.lgw-on, body.lgm-on) .lgt-line--add { padding: 0 1.2rem; border-style: dashed; }
/* studio panel (Joel 2026-09-23): with ONE line the add sits under Your words
   as its own quiet row ("+ Add a second line below") - no hairline above it,
   so it reads as part of the words group; the strip takes over at 2+ lines. */
:is(body.lgw-on, body.lgm-on) #lgt-row-addline { border-top: 0; padding: 0 0 1.5rem; }
:is(body.lgw-on, body.lgm-on) #lgt-row-addline[hidden] { display: none; }
:is(body.lgw-on, body.lgm-on) #lgt-row-addline > .lgt-line--add { align-self: flex-start; }
:is(body.lgw-on, body.lgm-on) .lgt-line--stack { padding: 0 1.2rem; color: var(--sv-muted); }
:is(body.lgw-on, body.lgm-on) .lgt-lines-live { margin: 0; font: 400 1.3rem/1.5 var(--vh-body); color: var(--vh-muted); }
:is(body.lgw-on, body.lgm-on) .lgt-lines-live[hidden] { display: none; }
/* the Design editor's strip + Rotation row for a logo (B10 §3) */
body.lgw-on .lgw-ins-pt-strip { margin-top: 2rem; padding-bottom: 0; }
body.lgw-on .lgw-ins-pt-rot { margin-top: .4rem; }
/* Stack lines under the placement cards, beside Arrange */
body.lgw-on #lgw-ins-stack { margin: 1.2rem 0 0; }
body.lgw-on #lgw-ins-stack[hidden] { display: none; }
/* the font chooser VIEW: replaces the rows in place, Back at the top, the
   existing grid at full panel height (the panel scrolls, not the grid) */
:is(body.lgw-on, body.lgm-on) #lgt-view-font[hidden] { display: none; }
:is(body.lgw-on, body.lgm-on) .lgt-view-on > :not(#lgt-view-font) { display: none; }
:is(body.lgw-on, body.lgm-on) .lgt-view-head { display: flex; flex-direction: column; align-items: flex-start; gap: 1rem; margin: 0 0 1.6rem; }
:is(body.lgw-on, body.lgm-on) .lgt-view-title { display: block; }
:is(body.lgw-on, body.lgm-on) #lgt-view-font #lgt-fonts { max-height: none; overflow: visible; margin-top: 0; padding-right: 0; }

/* the one-row Width stepper: label, - value + , then the height readout. The
   value is Oswald tabular, inches, one decimal (the engine's own string). */
body.lgw-on .lgw-ins-size {
  display: flex;
  align-items: center;
  gap: .8rem;
  min-height: 4.8rem;
  padding: .7rem 1.2rem;
  background: var(--sv-panel);
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card, 10px);
}
body.lgw-on .lgw-ins-size[hidden] { display: none; }
body.lgw-on .lgw-ins-size-w {
  margin-right: auto;
  font-family: var(--vh-body);
  font-weight: 500;
  font-size: 1.4rem;
  color: var(--vh-ink);
}
body.lgw-on .lgw-ins-sizebtn {
  flex: 0 0 auto;
  min-width: 40px;
  min-height: 40px;
  appearance: none;
  cursor: pointer;
  background: var(--sv-panel);
  color: var(--vh-ink);
  border: 1px solid var(--sv-hair-strong);
  border-radius: var(--sv-r-ctl, 8px);
  font-family: var(--vh-display);
  font-size: 1.7rem;
  line-height: 1;
}
body.lgw-on .lgw-ins-sizebtn:hover:not(:disabled) { border-color: var(--vh-ink); }
body.lgw-on .lgw-ins-sizebtn:disabled { opacity: .4; cursor: not-allowed; }
body.lgw-on .lgw-ins-sizebtn:focus-visible { outline: 2px solid var(--vh-ink); outline-offset: 2px; }
body.lgw-on .lgw-ins-size-val {
  min-width: 5.6rem;
  text-align: center;
  font-family: var(--vh-display);
  font-variant-numeric: tabular-nums;
  letter-spacing: .02em;
  font-size: 1.7rem;
  color: var(--vh-ink);
}
body.lgw-on .lgw-ins-size-meta {
  flex: 0 0 auto;
  margin-left: .4rem;
  font-family: var(--vh-body);
  font-size: 1.3rem;
  color: var(--vh-muted);
}
body.lgw-on .lgw-ins-size-meta[hidden] { display: none; }
/* Zones step 2 (rule F): the sizes are true on the size M every photo shows */
body.lgw-on .lgw-ins-sizenote { margin: .5rem 0 0 .2rem; font-family: var(--vh-body); font-size: 1.2rem; color: var(--vh-muted); }
.lgw-ins-sizenote[hidden], body:not(.lgw-on) .lgw-ins-sizenote { display: none; }
/* Studio tweaks (Joel 2026-10-01): the one Center key, directly under the
   Size row and its note - the piece-tools key's skin (hairline, r-ctl, the
   same centre glyph) laid out in one line. */
body.lgw-on .lgw-ins-center {
  display: inline-flex;
  align-items: center;
  gap: .7rem;
  margin: 1rem 0 0;
  min-height: 4.4rem;
  padding: 0 1.6rem 0 1.3rem;
  appearance: none;
  cursor: pointer;
  background: var(--sv-panel);
  color: var(--vh-ink);
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-ctl);
  font: 500 1.3rem/1 var(--vh-body);
  letter-spacing: 0;
  transition: border-color 120ms ease;
}
body.lgw-on .lgw-ins-center:hover { border-color: var(--vh-ink); }
body.lgw-on .lgw-ins-center:focus-visible { outline: 2px solid var(--vh-ink); outline-offset: 2px; }
body.lgw-on .lgw-ins-center-ico { display: inline-grid; place-items: center; width: 1.8rem; height: 1.8rem; }
body.lgw-on .lgw-ins-center-ico svg { width: 1.6rem; height: 1.6rem; }
.lgw-ins-center[hidden], body:not(.lgw-on) .lgw-ins-center { display: none; }
@media (prefers-reduced-motion: reduce) { body.lgw-on .lgw-ins-center { transition: none; } }
/* studio textsize: on the Text tab the same row sits in the Text size section,
   under the slider and above the quick sizes */
body.lgw-on .lgw-ins-size--text { margin: 1.2rem 0 0; }

/* phone: the size row is the desktop placement layout only. */
body.lgm-on :is(.lgw-ins-size, #lgw-ins-size-lbl) { display: none; }

/* --------------------------------------------------------------------------
   B3 §4 — GARMENT TYPE PICKER AS STACKED ROWS. Joel: the 3x2 squares "looked
   squashed and the icons rode high/low." Replace the tile grid with full-width
   rows: a fixed 44px icon box left, the name (Oswald 600) + "N styles available"
   in a column, an arrow at the far right; 8px between rows. Layout only - the
   buttons are the same nodes/handlers the shell already mirrors. Selection (ink
   ring + corner check) is the §2 rule the family already carries. The per-icon
   optical-centre transforms from R4·P are percentage-based, so they still land.
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-family-grid {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 0 0 1.3rem;
}
body.lgw-on .lgw-family {
  display: grid;
  grid-template-columns: 44px 1fr auto;
  grid-template-rows: auto auto;
  align-items: center;
  justify-items: start;
  column-gap: 1.4rem;
  row-gap: .1rem;
  min-height: 6.6rem;
  padding: 1.1rem 1.6rem;
  text-align: left;
}
body.lgw-on .lgw-family-ico {
  grid-column: 1;
  grid-row: 1 / 3;
  width: 44px;
  height: 44px;
  margin: 0;
  align-self: center;
}
body.lgw-on .lgw-family-nm {
  grid-column: 2;
  grid-row: 1;
  align-self: end;
  max-width: 100%;
  font-family: var(--vh-display);
  font-weight: 600;
  font-size: 1.7rem;
  letter-spacing: .01em;
  text-transform: none;
  line-height: 1.15;
  color: var(--vh-ink);
}
body.lgw-on .lgw-family-count {
  grid-column: 2;
  grid-row: 2;
  align-self: start;
  margin: 0;
  font-family: var(--vh-body);
  font-size: 1.3rem;
  color: var(--sv-muted);
  line-height: 1.2;
}
body.lgw-on .lgw-family-arrow {
  grid-column: 3;
  grid-row: 1 / 3;
  position: static;
  align-self: center;
  right: auto;
  top: auto;
  font-family: var(--vh-body);
  font-size: 1.6rem;
  color: var(--sv-text-quiet);
}

/* ==========================================================================
   BOOT ANTI-FLASH — no classic page before the shell mounts
   ==========================================================================
   The shell (body.lgw-on / body.lgm-on) is applied by applyMode() at the END
   of the ~12k-line studio script; the server sends the classic engine markup
   (.lgs > .lg-shell holds the "Placement preview" card + the "Job ticket"
   column). On every cold load, Start over reload, and Back/Forward, the
   browser paints that classic grid for one or more frames before applyMode
   reparents the nodes into the rail/panel — the flash Joel saw on Start over.

   An inline <head> script (logo_studio.html head_extra) stamps html.lgw-boot
   (>=1100px, mirrors mqD) or html.lgm-boot (<1100px, mirrors mqM) synchronously
   before the body paints. Until the matching mode class lands we hide the
   classic grid. visibility (not display) so layout is measured normally and the
   shell's first canvas-fit / --lgw-top reads are unchanged; the reparented
   preview/ticket inherit visible from their new (unhidden) zone parents. The
   masthead lives outside .lgs and stays visible. applyMode() and a window
   'load' fallback both clear the boot classes, so the page can never stay
   blank even if the script throws before the shell mounts. */
html.lgw-boot body:not(.lgw-on) .lgs > .lg-shell,
html.lgm-boot body:not(.lgm-on) .lgs > .lg-shell {
  visibility: hidden;
}

/* ==========================================================================
   STUDIO B9 (2026-09-22) — FULL-SCREEN GARMENT PICKER (comp D "Every style on
   one wall"). Desktop shell only (body.lgw-on). Spec:
   briefs/_SPEC_studio_b9_garment_picker.md. The overlay is a new SURFACE the
   shell builds over the same pk* data; the inline #lgw-picker keeps every rule
   above for the phone. Tokens, radius, no gold; one selection language (ink
   ring + corner check); photos on white; titles in the --sv-title face; money
   in Oswald.
   ========================================================================== */
.lgw-gp { display: none; }
body.lgw-on .lgw-gp:not([hidden]) {
  display: block;
  position: fixed;
  inset: 0;
  z-index: 72;                       /* above the phone popup (70) and the math dialog (21) */
}
body.lgw-on.lgw-gp-open { overflow: hidden; }
body.lgw-on .lgw-gp-scrim {
  position: absolute;
  inset: 0;
  background: rgba(24, 21, 16, .46);
}
body.lgw-on .lgw-gp-sheet {
  position: absolute;
  inset: 1.6rem;
  display: flex;
  overflow: hidden;
  background: var(--vh-cream);
  border-radius: 16px;
  box-shadow: 0 30px 80px rgba(24, 21, 16, .38);
  animation: lgwGpIn 180ms cubic-bezier(.2, .7, .2, 1);
  outline: none;
}
@keyframes lgwGpIn {
  from { opacity: 0; transform: translateY(10px); }
  to   { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) {
  body.lgw-on .lgw-gp-sheet { animation: none; }
}

/* ── left: head, chips, wall ─────────────────────────────────────────────── */
body.lgw-on .lgw-gp-main {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  flex-direction: column;
}
body.lgw-on .lgw-gp-head {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 2rem;
  padding: 2.8rem 3.6rem 1.6rem;
}
body.lgw-on .lgw-gp-eyebrow {
  margin: 0 0 .6rem;
  font-family: var(--vh-display);
  font-weight: 500;
  font-size: 1.1rem;
  line-height: 1;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--sv-text-quiet);
}
body.lgw-on .lgw-gp-title {
  margin: 0;
  font-family: var(--sv-title-font);
  font-weight: var(--sv-title-weight);
  font-size: 3.2rem;
  line-height: 1.05;
  letter-spacing: var(--sv-title-tracking);
  text-transform: var(--sv-title-transform);
  color: var(--sv-ink);
}
body.lgw-on .lgw-gp-count {
  padding-bottom: .5rem;
  font-family: var(--vh-body);
  font-size: 1.3rem;
  color: var(--sv-muted);
  white-space: nowrap;
}
body.lgw-on .lgw-gp-chips {
  display: flex;
  flex-wrap: wrap;
  gap: .8rem;
  padding: 0 3.6rem 1.8rem;
}
body.lgw-on .lgw-gp-chip {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: .9rem;
  height: 4.4rem;
  padding: 0 1.4rem 0 .6rem;
  background: #FFFFFF;
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-ctl);
  font-family: var(--vh-body);
  font-weight: 600;
  font-size: 1.35rem;
  color: var(--sv-ink);
  cursor: pointer;
  transition: border-color 120ms ease, background 120ms ease, box-shadow 120ms ease;
}
body.lgw-on .lgw-gp-chip:hover:not(.lgw-pk-sel):not([disabled]) {
  border-color: var(--sv-hair-strong);
  background: var(--st-control-hover);
}
body.lgw-on .lgw-gp-chip.lgw-pk-sel {
  border-color: var(--sv-ink);
  box-shadow: inset 0 0 0 1px var(--sv-ink);
}
body.lgw-on .lgw-gp-chip[disabled] { opacity: .45; cursor: not-allowed; }
body.lgw-on .lgw-gp-chip-ava {
  display: grid;
  place-items: center;
  width: 3.2rem;
  height: 3.2rem;
  flex: none;
  overflow: hidden;
  border-radius: var(--sv-r-sm);
  background: #FFFFFF;
  color: var(--sv-text-quiet);
}
body.lgw-on .lgw-gp-chip-ava img,
body.lgw-on .lgw-gp-chip-ava .lgw-gp-chip-ico {
  width: 100%;
  height: 100%;
  object-fit: contain;
}
body.lgw-on .lgw-gp-chip-ava .lgw-gp-chip-ico { width: 2.2rem; height: 2.2rem; }
body.lgw-on .lgw-gp-chip-ava--all svg { width: 1.6rem; height: 1.6rem; }
body.lgw-on .lgw-gp-chip-n {
  font-weight: 500;
  font-size: 1.2rem;
  color: var(--sv-muted);
}
body.lgw-on .lgw-gp-wall {
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
  padding: 2rem 3.6rem 3.2rem;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(17.2rem, 1fr));
  grid-auto-rows: max-content;       /* a <button> grid item under-reports its auto row height in Chrome */
  gap: 1.4rem;
  align-content: start;
}
body.lgw-on .lgw-gp-card {
  position: relative;
  display: flex;
  flex-direction: column;
  min-width: 0;
  padding: 0;
  margin: 0;
  overflow: hidden;                  /* the corner badge clips to the card radius */
  text-align: left;
  background: #FFFFFF;
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
  color: var(--sv-ink);
  cursor: pointer;
  transition: border-color 120ms ease, box-shadow 120ms ease, background 120ms ease;
}
body.lgw-on .lgw-gp-card[hidden] { display: none; }
body.lgw-on .lgw-gp-card:hover:not(.lgw-pk-sel):not([disabled]) {
  border-color: var(--sv-hair-strong);
  box-shadow: 0 10px 24px -18px rgba(24, 21, 16, .45);
}
/* the 1px ink border + a 1px OUTER ink shadow = one even 2px ring. An inset
   shadow was painted over by the photo block's white, leaving the ring thin
   round the photo and thick only under the text. */
body.lgw-on .lgw-gp-card.lgw-pk-sel {
  border-color: var(--sv-ink);
  box-shadow: 0 0 0 1px var(--sv-ink);
}
body.lgw-on .lgw-gp-card.lgw-pk-sel::after {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  width: 20px;
  height: 20px;
  background:
    var(--sv-ink)
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 6.2l2.2 2.2 4.8-5' fill='none' stroke='%23FDFCF7' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")
    center / 12px 12px no-repeat;
  border-bottom-left-radius: var(--sv-r-sm);
  z-index: 2;
}
body.lgw-on .lgw-gp-card[disabled] { cursor: not-allowed; }
body.lgw-on .lgw-gp-card--off .lgw-gp-card-ph,
body.lgw-on .lgw-gp-card--off .lgw-gp-card-nm { opacity: .45; }
body.lgw-on .lgw-gp-cur {
  position: absolute;
  left: .8rem;
  top: .8rem;
  z-index: 3;
  display: inline-flex;
  align-items: center;
  height: 2.2rem;
  padding: 0 .8rem;
  border-radius: var(--sv-r-sm);
  background: #FFFFFF;
  box-shadow: 0 0 0 1px var(--sv-hair);
  font-family: var(--vh-body);
  font-weight: 600;
  font-size: 1.1rem;
  color: var(--sv-text-quiet);
  white-space: nowrap;
}
body.lgw-on .lgw-gp-card-ph {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 16.4rem;
  padding: 1.4rem 1.2rem .4rem;
  background: #FFFFFF;
  color: var(--sv-text-quiet);
}
body.lgw-on .lgw-gp-card-ph img,
body.lgw-on .lgw-gp-card-ph .lgw-gp-card-ico {
  width: 100%;
  height: 100%;
  object-fit: contain;
}
body.lgw-on .lgw-gp-card-ph .lgw-gp-card-ico { width: 7rem; height: 7rem; }
body.lgw-on .lgw-gp-card-txt {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  padding: .8rem 1.4rem 1.4rem;
}
body.lgw-on .lgw-gp-card-type {
  font-family: var(--vh-display);
  font-weight: 500;
  font-size: 1.05rem;
  line-height: 1;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--sv-text-quiet);
}
body.lgw-on .lgw-gp-card-nm {
  margin-top: .5rem;
  min-height: 3.5rem;
  font-family: var(--vh-body);
  font-weight: 600;
  font-size: 1.4rem;
  line-height: 1.25;
  color: var(--sv-ink);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
body.lgw-on .lgw-gp-card-meta {
  margin-top: .4rem;
  font-family: var(--vh-body);
  font-size: 1.2rem;
  line-height: 1.3;
  color: var(--sv-muted);
}
body.lgw-on .lgw-gp-card-pr {
  margin-top: auto;
  padding-top: 1rem;
  font-family: var(--vh-body);
  font-size: 1.2rem;
  color: var(--sv-muted);
}
body.lgw-on .lgw-gp-money {
  font-family: var(--vh-display);
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  font-style: normal;
  color: var(--sv-ink);
}
body.lgw-on .lgw-gp-card-pr .lgw-gp-money {
  font-size: 1.8rem;
  line-height: 1;
  margin-left: .1rem;
}

/* ── right: the inspector ────────────────────────────────────────────────── */
body.lgw-on .lgw-gp-insp {
  flex: none;
  width: 39.2rem;
  display: flex;
  flex-direction: column;
  min-height: 0;
  overflow: auto;
  padding: 1.8rem 2.8rem 2.2rem;
  background: var(--sv-panel);
  border-left: 1px solid var(--sv-hair);
}
body.lgw-on .lgw-gp-insp-top {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 1rem;
  margin-bottom: 1rem;
  font-family: var(--vh-body);
  font-size: 1.2rem;
  color: var(--sv-muted);
}
body.lgw-on .lgw-gp-kbd {
  display: inline-grid;
  place-items: center;
  min-width: 2.2rem;
  height: 2.2rem;
  padding: 0 .6rem;
  border: 1px solid var(--sv-hair);
  border-bottom-width: 2px;
  border-radius: var(--sv-r-sm);
  background: #FFFFFF;
  font-family: var(--vh-body);
  font-weight: 600;
  font-size: 1.1rem;
  line-height: 1;
  color: var(--sv-muted);
}
body.lgw-on .lgw-gp-x {
  display: grid;
  place-items: center;
  width: 4.2rem;
  height: 4.2rem;
  padding: 0;
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-ctl);
  background: #FFFFFF;
  color: var(--sv-ink);
  cursor: pointer;
}
body.lgw-on .lgw-gp-x svg { width: 1.8rem; height: 1.8rem; }
body.lgw-on .lgw-gp-x:hover { border-color: var(--sv-ink); }
body.lgw-on .lgw-gp-insp-photo {
  display: flex;
  align-items: center;
  justify-content: center;
  flex: none;
  height: 31.8rem;
  padding: 1.4rem;
  margin-bottom: 1.8rem;
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
  background: #FFFFFF;
  color: var(--sv-text-quiet);
}
body.lgw-on .lgw-gp-insp-photo img,
body.lgw-on .lgw-gp-insp-photo .lgw-gp-insp-ico {
  width: 100%;
  height: 100%;
  object-fit: contain;
}
body.lgw-on .lgw-gp-insp-photo .lgw-gp-insp-ico { width: 12rem; height: 12rem; }
body.lgw-on .lgw-gp-insp-name {
  margin: 0;
  font-family: var(--sv-title-font);
  font-weight: var(--sv-title-weight);
  font-size: 2.4rem;
  line-height: 1.1;
  letter-spacing: var(--sv-title-tracking);
  text-transform: var(--sv-title-transform);
  color: var(--sv-ink);
}
body.lgw-on .lgw-gp-insp-row {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 1rem;
  margin-top: 1rem;
  font-family: var(--vh-body);
  font-size: 1.3rem;
  color: var(--sv-muted);
}
body.lgw-on .lgw-gp-pill {
  display: inline-flex;
  align-items: center;
  height: 2.2rem;
  padding: 0 .8rem;
  border-radius: var(--sv-r-sm);
  background: var(--sv-tan);
  border: 1px solid var(--sv-hair);
  font-weight: 600;
  font-size: 1.15rem;
  color: var(--sv-ink);
}
body.lgw-on .lgw-gp-insp-feel { color: var(--sv-muted); }
body.lgw-on .lgw-gp-insp-dots {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .8rem;
  min-height: 2.4rem;
  margin-top: 1.4rem;
  padding: .3rem 0 .3rem .3rem;
}
body.lgw-on .lgw-gp-dot {
  width: 2.4rem;
  height: 2.4rem;
  flex: none;
  padding: 0;
  border: 0;
  border-radius: 50%;
  box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22);
  cursor: pointer;
  transition: transform 120ms ease, box-shadow 120ms ease;
}
body.lgw-on .lgw-gp-dot:hover { transform: translateY(-2px); }
body.lgw-on .lgw-gp-dot.lgw-pk-sel {
  box-shadow: 0 0 0 2px #FFFFFF, 0 0 0 4px var(--sv-ink), inset 0 0 0 1px rgba(24, 21, 16, .22);
}
body.lgw-on .lgw-gp-dot:focus-visible {
  outline: 2px solid var(--sv-ink);
  outline-offset: 6px;
}
body.lgw-on .lgw-gp-insp-hint {
  margin: .8rem 0 0;
  font-family: var(--vh-body);
  font-size: 1.2rem;
  line-height: 1.4;
  color: var(--sv-muted);
}
body.lgw-on .lgw-gp-insp-meta {
  margin: .8rem 0 0;
  font-family: var(--vh-body);
  font-size: 1.2rem;
  color: var(--sv-muted);
}
body.lgw-on .lgw-gp-insp-guide {
  color: var(--sv-muted);
  text-decoration: underline;
  text-underline-offset: .2em;
}
body.lgw-on .lgw-gp-insp-guide:hover { color: var(--sv-ink); }
body.lgw-on .lgw-gp-insp-price {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: .6rem;
  margin-top: 1.6rem;
  font-family: var(--vh-body);
  font-size: 1.3rem;
  color: var(--sv-muted);
}
body.lgw-on .lgw-gp-insp-price .lgw-gp-money {
  font-size: 3rem;
  line-height: 1;
}
body.lgw-on .lgw-gp-insp-min {
  flex-basis: 100%;
  font-size: 1.2rem;
  color: var(--sv-text-quiet);
}
body.lgw-on .lgw-gp-insp-off { font-size: 1.3rem; color: var(--sv-text-quiet); }
body.lgw-on .lgw-gp-insp-cta {
  display: flex;
  flex-direction: column;
  gap: .8rem;
  margin-top: auto;
  padding-top: 1.8rem;
}
body.lgw-on .lgw-gp-use {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 1rem;
  width: 100%;
  height: 5.2rem;
  padding: 0 2rem;
  border: 0;
  border-radius: var(--sv-r-ctl);
  background: var(--sv-ink);
  color: #FFFFFF;
  font-family: var(--vh-body);
  font-weight: 600;
  font-size: 1.5rem;
  white-space: nowrap;
  cursor: pointer;
  transition: background 150ms ease, transform 100ms ease;
}
body.lgw-on .lgw-gp-use:hover:not([disabled]) { background: #2c271f; }
body.lgw-on .lgw-gp-use:active:not([disabled]) { transform: translateY(1px); }
body.lgw-on .lgw-gp-use[disabled] { opacity: .45; cursor: not-allowed; }
body.lgw-on .lgw-gp-use-arrow { display: inline-grid; }
body.lgw-on .lgw-gp-use-arrow svg { width: 1.6rem; height: 1.6rem; }
body.lgw-on .lgw-gp-cancel {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: 4.2rem;
  padding: 0 1.4rem;
  border: 1px solid var(--sv-hair-strong);
  border-radius: var(--sv-r-ctl);
  background: #FFFFFF;
  font-family: var(--vh-body);
  font-weight: 600;
  font-size: 1.3rem;
  color: var(--sv-ink);
  white-space: nowrap;
  cursor: pointer;
}
body.lgw-on .lgw-gp-cancel:hover { border-color: var(--sv-ink); background: var(--st-control-hover); }
body.lgw-on .lgw-gp-keys {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: .5rem;
  margin-top: 1.2rem;
  font-family: var(--vh-body);
  font-size: 1.15rem;
  color: var(--sv-muted);
}
/* one focus ring across the overlay's controls (distinct from selection) */
body.lgw-on .lgw-gp :is(.lgw-gp-card, .lgw-gp-chip, .lgw-gp-x, .lgw-gp-use, .lgw-gp-cancel, .lgw-gp-insp-guide):focus-visible {
  outline: 2px solid var(--sv-ink);
  outline-offset: 2px;
}

/* holds at 1100: narrower inspector, tighter gutters, smaller cards */
@media (max-width: 1240px) {
  body.lgw-on .lgw-gp-sheet { inset: 1.2rem; }
  body.lgw-on .lgw-gp-head { padding: 2.2rem 2.4rem 1.2rem; }
  body.lgw-on .lgw-gp-title { font-size: 2.8rem; }
  body.lgw-on .lgw-gp-chips { padding: 0 2.4rem 1.4rem; }
  body.lgw-on .lgw-gp-chip { padding-right: 1.1rem; }
  body.lgw-on .lgw-gp-wall {
    padding: 1.6rem 2.4rem 2.4rem;
    grid-template-columns: repeat(auto-fill, minmax(15.4rem, 1fr));
    gap: 1.2rem;
  }
  body.lgw-on .lgw-gp-card-ph { height: 14.6rem; }
  body.lgw-on .lgw-gp-insp { width: 32.4rem; padding: 1.6rem 2rem 1.8rem; }
  body.lgw-on .lgw-gp-insp-photo { height: 24rem; }
  body.lgw-on .lgw-gp-insp-name { font-size: 2.1rem; }
  body.lgw-on .lgw-gp-insp-price .lgw-gp-money { font-size: 2.6rem; }
}

/* --------------------------------------------------------------------------
   B9 §2.3 — the COLOUR DOCK on the canvas edge. A 6rem white plate under the
   zoom bench on the room's right, hair border, --sv-r-ctl radius: "Colour"
   eyebrow, one circle per colour (the panel swatch language: 1px edge,
   selected = 2px ink ring at 3px white offset), the name flagged to the LEFT
   on hover / for the selected one, and a "+N more" key past eight colours.
   Desktop only; hidden until cdSync seats it.
   -------------------------------------------------------------------------- */
.lgw-cdock { display: none; }
body.lgw-on .lgw-cdock {
  position: absolute;
  right: 1.9rem;
  top: 40rem;                        /* cdPlace() seats it under the bench */
  z-index: 6;
  display: flex;
  flex-direction: column;
  align-items: center;
  width: 6rem;
  min-height: 0;
  padding: 1rem 0 .8rem;
  gap: .8rem;
  background: var(--sv-panel);
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-ctl);
  box-shadow: 0 6px 18px rgba(24, 21, 16, .07);
}
body.lgw-on .lgw-cdock[hidden] { display: none; }
body.lgw-on .lgw-cdock-lbl {
  flex: none;
  font-family: var(--vh-display);
  font-weight: 500;
  font-size: 1rem;
  line-height: 1;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--sv-text-quiet);
}
body.lgw-on .lgw-cdock-list {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1rem;
  min-height: 0;
  padding: .6rem .8rem;              /* room for the 5px selection ring inside the scroll box */
  overflow-y: auto;
  overscroll-behavior: contain;
  scrollbar-width: none;
}
body.lgw-on .lgw-cdock-list::-webkit-scrollbar { display: none; }
body.lgw-on .lgw-cdot {
  flex: none;
  width: 3rem;
  height: 3rem;
  padding: 0;
  border: 0;
  border-radius: 50%;
  box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22);
  cursor: pointer;
  transition: transform 120ms ease, box-shadow 120ms ease;
}
body.lgw-on .lgw-cdot:hover:not(.lgw-pk-sel) { transform: scale(1.08); }
body.lgw-on .lgw-cdot.lgw-pk-sel {
  box-shadow: 0 0 0 3px #FFFFFF, 0 0 0 5px var(--sv-ink), inset 0 0 0 1px rgba(24, 21, 16, .22);
}
body.lgw-on .lgw-cdot:focus-visible {
  outline: 2px solid var(--sv-ink);
  outline-offset: 7px;
}
@media (prefers-reduced-motion: reduce) {
  body.lgw-on .lgw-cdot { transition: none; }
  body.lgw-on .lgw-cdot:hover:not(.lgw-pk-sel) { transform: none; }
}
/* name flags ride OUTSIDE the plate to its left, one node each for the
   selected colour (quiet, white) and the hovered one (ink), positioned by
   cdFlagPlace against the dot's centre. */
body.lgw-on .lgw-cdock-flag {
  position: absolute;
  right: calc(100% + 1.2rem);
  transform: translateY(-50%);
  z-index: 7;
  padding: .5rem .9rem;
  border-radius: var(--sv-r-sm);
  white-space: nowrap;
  font-family: var(--vh-body);
  font-weight: 600;
  font-size: 1.2rem;
  line-height: 1.2;
  pointer-events: none;
}
body.lgw-on .lgw-cdock-flag[hidden] { display: none; }
body.lgw-on .lgw-cdock-flag::after {
  content: "";
  position: absolute;
  left: 100%;
  top: 50%;
  margin-top: -5px;
  border: 5px solid transparent;
}
body.lgw-on .lgw-cdock-flag--sel {
  background: #FFFFFF;
  color: var(--sv-ink);
  box-shadow: 0 0 0 1px var(--sv-hair), 0 6px 14px -8px rgba(24, 21, 16, .35);
}
body.lgw-on .lgw-cdock-flag--sel::after { border-left-color: var(--sv-hair); }
body.lgw-on .lgw-cdock-flag--hov {
  background: var(--sv-ink);
  color: #FFFFFF;
}
body.lgw-on .lgw-cdock-flag--hov::after { border-left-color: var(--sv-ink); }
body.lgw-on .lgw-cdock-more {
  flex: none;
  height: 2.6rem;
  padding: 0 .7rem;
  border: 1px solid var(--sv-hair-strong);
  border-radius: var(--sv-r-sm);
  background: #FFFFFF;
  font-family: var(--vh-body);
  font-weight: 600;
  font-size: 1.05rem;
  line-height: 1;
  white-space: nowrap;
  color: var(--sv-muted);
  cursor: pointer;
}
/* folded, the key is the count over "more" (Joel 2026-10-03: "+60 more" ran
   past the plate): as wide as its longer word, so it breaks at its one space
   and every count from +1 to +999 sits inside the 6rem plate. "Fewer" keeps
   the one line above. cdFit counts this 3.2rem height. */
body.lgw-on .lgw-cdock-more[aria-expanded="false"] {
  width: min-content;
  height: 3.2rem;
  line-height: 1.1;
  white-space: normal;
}
body.lgw-on .lgw-cdock-more:hover { border-color: var(--sv-ink); color: var(--sv-ink); }
body.lgw-on .lgw-cdock-more[hidden] { display: none; }
body.lgw-on .lgw-cdock-more:focus-visible { outline: 2px solid var(--sv-ink); outline-offset: 2px; }

/* ==========================================================================
   STUDIO B11 — one design, many garments (garment LINES).
   The strip above the canvas, its copy-across notice, the Review card and the
   N-line Review list. Vintage rulings: ink fill = selection, Oswald titles,
   tan (never gold) notices, white behind garment photos, one control radius.
   ========================================================================== */
body.lgw-on .lgw-gl {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: .8rem;
  width: 100%;
  box-sizing: border-box;
  padding: 1.4rem 12rem .2rem 2rem; /* the right pad clears the zoom bench */
  z-index: 5;
}
body.lgw-on .lgw-gl[hidden] { display: none; }
body.lgw-on .lgw-gl-item { position: relative; display: inline-flex; align-items: center; }
body.lgw-on .lgw-gl-chip {
  display: inline-flex;
  align-items: center;
  gap: .9rem;
  height: 4.8rem;
  padding: .4rem 1.4rem .4rem .5rem;
  border: 1px solid var(--sv-hair-strong);
  border-radius: var(--sv-r-ctl);
  background: #FFFFFF;
  color: var(--vh-ink);
  cursor: pointer;
  font-family: var(--vh-body);
}
body.lgw-on .lgw-gl-chip:hover { border-color: var(--vh-ink); }
body.lgw-on .lgw-gl-chip--on,
body.lgw-on .lgw-gl-chip--on:hover {
  background: var(--vh-ink);
  color: #FFFFFF;
  border-color: var(--vh-ink);
}
body.lgw-on .lgw-gl-chip:focus-visible,
body.lgw-on .lgw-gl-add:focus-visible,
body.lgw-on .lgw-gl-x:focus-visible,
body.lgw-on .lgw-gl-btn:focus-visible { outline: 2px solid var(--vh-ink); outline-offset: 2px; }
body.lgw-on .lgw-gl-ph {
  display: grid;
  place-items: center;
  width: 3.8rem;
  height: 3.8rem;
  flex: 0 0 auto;
  overflow: hidden;
  border: 1px solid var(--sv-hair);
  border-radius: 4px;
  background: #FFFFFF;
}
body.lgw-on .lgw-gl-ph img { width: 100%; height: 100%; object-fit: contain; display: block; }
body.lgw-on .lgw-gl-ph .lgw-gl-ico { width: 2.4rem; height: 2.4rem; }
body.lgw-on .lgw-gl-words { display: flex; flex-direction: column; align-items: flex-start; line-height: 1.15; }
body.lgw-on .lgw-gl-nm {
  font-family: var(--sv-title-font, 'Oswald', sans-serif);
  font-weight: 600;
  font-size: 1.3rem;
  letter-spacing: .04em;
  text-transform: uppercase;
  white-space: nowrap;
}
body.lgw-on .lgw-gl-col { font-size: 1.15rem; color: var(--vh-muted); white-space: nowrap; }
body.lgw-on .lgw-gl-chip--on .lgw-gl-col { color: rgba(253, 252, 247, .78); }
body.lgw-on .lgw-gl-x {
  width: 2.6rem;
  height: 2.6rem;
  margin-left: -.5rem;
  border: 0;
  border-radius: 99px;
  background: none;
  color: var(--vh-muted);
  font-family: var(--vh-body);
  font-size: 1.8rem;
  line-height: 1;
  cursor: pointer;
}
body.lgw-on .lgw-gl-x:hover { color: var(--vh-ink); background: var(--sv-tan); }
body.lgw-on .lgw-gl-add {
  height: 4.8rem;
  padding: 0 1.6rem;
  border: 1px dashed var(--sv-hair-strong);
  border-radius: var(--sv-r-ctl);
  background: transparent;
  color: var(--vh-ink);
  font-family: var(--vh-body);
  font-weight: 600;
  font-size: 1.4rem;
  cursor: pointer;
}
body.lgw-on .lgw-gl-add:hover:not([disabled]) { border-style: solid; border-color: var(--vh-ink); }
body.lgw-on .lgw-gl-add[disabled] { opacity: .45; cursor: not-allowed; }
/* the confirm row swaps in place of the chip (the shared .lgw-ins-confirm swap) */
body.lgw-on .lgw-gl-item.lgw-ins-confirming .lgw-gl-confirm {
  display: inline-flex;
  align-items: center;
  gap: 1rem;
  height: 4.8rem;
  padding: 0 1.2rem;
  border: 1px solid var(--vh-ink);
  border-radius: var(--sv-r-ctl);
  background: #FFFFFF;
}
body.lgw-on .lgw-gl-notice {
  box-sizing: border-box;
  max-width: 68rem;
  margin: .2rem 2rem .4rem;
  padding: .8rem 1.2rem;
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-sm);
  background: var(--sv-tan);
  color: var(--vh-ink);
  font-family: var(--vh-body);
  font-size: 1.3rem;
  line-height: 1.45;
}
body.lgw-on .lgw-gl-notice::before {
  content: "";
  display: inline-block;
  width: .7rem;
  height: .7rem;
  margin-right: .7rem;
  border-radius: 99px;
  background: var(--vh-ink);
  vertical-align: 1px;
}
body.lgw-on .lgw-gl-notice[hidden] { display: none; }
/* polish 3 item 6 (C3a on the PC): a piece waiting on this garment asks in
   the line, its two choices text keys like the tan notes' own (Dismiss). The
   line paints over the stage card's top margin: a second line (main's own two
   moves as well) was drawn under the stage, and a choice there could not be
   clicked */
body.lgw-on .lgw-gl-notice { position: relative; z-index: 6; margin-right: 12rem; } /* the strip's own bench clearance */
body.lgw-on .lgw-gl-wait-k {
  appearance: none;
  margin-left: 1.2rem;
  padding: .1rem 0 .2rem;
  border: 0;
  border-bottom: 1px solid var(--sv-ink);
  background: none;
  color: var(--vh-ink);
  font-family: var(--vh-body);
  font-size: 1.3rem;
  white-space: nowrap;
  cursor: pointer;
}
body.lgw-on .lgw-gl-wait-k:hover { border-bottom-width: 2px; }
body.lgw-on .lgw-gl-wait-k:focus-visible { outline: 2px solid var(--vh-ink); outline-offset: 3px; }

/* Review: the card above the summary (spec A) */
body.lgw-on .lgw-gl-card {
  margin: 0 0 2rem;
  padding: 1.6rem 1.8rem;
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
  background: var(--sv-tan);
}
body.lgw-on .lgw-gl-card[hidden] { display: none; }
body.lgw-on .lgw-gl-card-t {
  margin: 0 0 .4rem;
  font-family: var(--sv-title-font, 'Oswald', sans-serif);
  font-weight: 600;
  font-size: 1.7rem;
  line-height: 1.2;
  color: var(--vh-ink);
}
body.lgw-on .lgw-gl-card-p { margin: 0 0 1.2rem; font-size: 1.35rem; line-height: 1.5; color: var(--vh-muted); }
body.lgw-on .lgw-gl-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 4.8rem;
  padding: 0 1.6rem;
  border: 1px solid var(--vh-ink);
  border-radius: var(--sv-r-ctl);
  background: var(--vh-ink);
  color: #FFFFFF;
  font-family: var(--sv-title-font, 'Oswald', sans-serif);
  font-weight: 600;
  font-size: 1.4rem;
  letter-spacing: .06em;
  text-transform: uppercase;
  cursor: pointer;
}
body.lgw-on .lgw-gl-btn:hover { background: #2c271f; }

/* Review: the N-line list (spec E) is css/studio/review_blocks.css's: each
   garment renders as a review block there. */
/* with 2+ lines the single-garment Garment and location blocks give way to
   the list */
body.lgw-on.lgw-gl-multi #lgw-order .lgw-order-body > .lgw-review-views,
body.lgw-on.lgw-gl-multi #lgw-order .lgw-order-body > .lgw-order-facts,
body.lgw-on.lgw-gl-multi #lgw-order .lgw-order-body > .lgw-review-locations,
body.lgw-on.lgw-gl-multi #lgw-order .lgw-order-body > .lgw-order-proof { display: none; }
   fx5 · THREAD-COUNT STEPPER — one compact rounded control, [−] 9 colors [+].
   Joel: the +/− keys were huge squares, the count sat oddly between them and
   the box was square-cornered. Now one white hairline pill, 3.6rem tall, keys
   3.2rem with ink glyphs and no inner boxes, a hairline between key and count,
   the number in the Oswald money face, "colors" muted beside it. Right-aligned
   on the block title's line, width to content. Markup/ids/handlers unchanged.
   ========================================================================== */
/* The panel column is ~31rem of content: title + stepper can't both sit at
   max-content, so the header is a two-column grid. The title (an anonymous
   text item) takes the left track and balances onto two lines if it must; the
   stepper holds the right track on the title's row; the help copy runs full
   width underneath. */
body.lgw-on .lgw-panel #lgw-ins-th-lbl {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  column-gap: 1rem;
  row-gap: .8rem;
  text-wrap: balance;
}
body.lgw-on .lgw-panel #lgw-ins-th-lbl > #lgw-ins-clstep { grid-column: 2; grid-row: 1; }
body.lgw-on .lgw-panel #lgw-ins-th-lbl > #lgw-ins-clcopy { grid-column: 1 / -1; text-wrap: pretty; }
body.lgw-on .lgw-panel #lgw-ins-clstep:not([hidden]) {
  display: inline-flex;
  align-items: center;
  flex: 0 0 auto;
  gap: 0;
  justify-self: end;
  margin-left: 0;
  box-sizing: border-box;
  height: 3.6rem;
  padding: 0 .1rem;
  background: #FFFFFF;
  border: 1px solid var(--sv-hair-strong);
  border-radius: var(--sv-r-card);
}
body.lgw-on .lgw-panel #lgw-ins-clstep .lgw-ins-clbtn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  box-sizing: border-box;
  width: 3.2rem;
  min-width: 0;
  height: 3.2rem;
  min-height: 0;
  padding: 0;
  border: 0;
  border-radius: calc(var(--sv-r-card) - 3px);
  background: transparent;
  color: var(--sv-ink);
  font: 400 1.8rem/1 var(--vh-body);
  box-shadow: none;
  transform: none;
  opacity: 1;
}
body.lgw-on .lgw-panel #lgw-ins-clstep .lgw-ins-clbtn:not(:disabled):hover {
  background: var(--st-control-hover);
  color: var(--sv-ink);
  box-shadow: none;
}
body.lgw-on .lgw-panel #lgw-ins-clstep .lgw-ins-clbtn:disabled {
  background: transparent;
  color: rgba(24, 21, 16, .4);
  cursor: default;
  opacity: 1;
}
body.lgw-on .lgw-panel #lgw-ins-clstep .lgw-ins-clbtn:focus-visible {
  outline: 2px solid var(--sv-ink);
  outline-offset: 1px;
}
/* studio textsize (Joel 2026-09-24): the numeral sits ON the baseline of
   "colors" at about its cap height (Oswald 500, 1.35rem - it was 1.6rem and
   rode 2px low). The pair baseline-aligns; the shared top margin recentres
   the baseline group in the 3.6rem capsule (a baseline group packs to the
   cross-start). The - and + buttons keep their own centring. */
body.lgw-on .lgw-panel #lgw-ins-clstep .lgw-ins-clcount,
body.lgw-on .lgw-panel #lgw-ins-clstep .lgw-ins-clunit {
  align-self: baseline;
  margin-top: calc(.8rem - 1px);
}
body.lgw-on .lgw-panel #lgw-ins-clstep .lgw-ins-clcount {
  min-width: 0;
  height: 2rem;
  margin-left: .1rem;
  padding: 0 .3rem 0 .7rem;
  border-left: 1px solid var(--sv-hair);
  display: inline-flex;
  align-items: center;
  font-family: var(--vh-display);
  font-weight: 500;
  font-size: 1.35rem;
  line-height: 1;
  font-variant-numeric: tabular-nums;
  letter-spacing: .02em;
  color: var(--sv-ink);
}
body.lgw-on .lgw-panel #lgw-ins-clstep .lgw-ins-clunit {
  display: inline-flex;
  align-items: center;
  height: 2rem;
  margin-right: .1rem;
  padding: 0 .7rem 0 .1rem;
  border-right: 1px solid var(--sv-hair);
  font: 400 1.3rem/1 var(--vh-body);
  text-transform: lowercase;
  letter-spacing: 0;
  color: var(--sv-muted);
}

/* --------------------------------------------------------------------------
   L1a — SAVE IN THE RAIL (briefs/_SPEC_studio_library_save.md §1, comp
   briefs/_comps_library_save/rail_save_pill.png). The foot-act's #lgw-save
   re-seats into #lgw-rail-save on the desktop shell (lgwShell desktopMoves):
   ONE long white capsule - r8 (--sv-r-ctl), hair border, Oswald caps, the
   rail width minus the gutter - pinned directly above Review design. The B7
   status note (#lgw-save-note) sits under it, quiet Cooper Hewitt on the ink;
   "Save as new" is a quiet underlined text link under that. None of this
   reaches the phone shell: the node is not in the rail there.
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-rail-save {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .5rem;
  width: auto;
  /* auto top margin pins the seat above Review; the right margin mirrors the
     rail's .9rem left padding so the pill is centred in the column */
  margin: auto .9rem .2rem 0;
  padding: 0;
}
/* Review gives up its own auto margin (studio_controls.css:414) to the seat. */
body.lgw-on .lgw-rail-save + .lgw-step[data-lgw-step="order"] { margin-top: 0; }
body.lgw-on .lgw-rail-save #lgw-save {
  display: block;
  width: 100%;
  min-width: 0;
  min-height: 4.4rem;
  margin: 0;
  padding: 1rem 1.2rem;
  background: var(--sv-panel);
  color: var(--sv-ink);
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-ctl);
  font-family: var(--vh-display);
  font-weight: 500;
  font-size: 1.4rem;
  line-height: 1;
  letter-spacing: .12em;
  text-transform: uppercase;
  text-align: center;
  white-space: nowrap;
  overflow: hidden;
  cursor: pointer;
  box-shadow: none;
  opacity: 1;
  transition: background 120ms ease, border-color 120ms ease;
}
body.lgw-on .lgw-rail-save #lgw-save:hover {
  background: var(--st-control-hover);
  border-color: var(--sv-hair-strong);
}
body.lgw-on .lgw-rail-save #lgw-save:disabled,
body.lgw-on .lgw-rail-save #lgw-save:disabled:hover {
  opacity: .45;
  cursor: default;
  background: var(--sv-panel);
  border-color: var(--sv-hair);
}
body.lgw-on .lgw-rail-save #lgw-save:focus-visible {
  outline: 2px solid var(--sv-panel);
  outline-offset: 3px;
  box-shadow: none;
}
body.lgw-on .lgw-rail-save #lgw-save-note {
  display: block;
  margin: 0;
  padding: 0 .2rem;
  font-family: var(--vh-body);
  font-weight: 400;
  font-size: 1.2rem;
  line-height: 1.3;
  letter-spacing: 0;
  text-transform: none;
  text-align: center;
  white-space: normal;
  color: var(--sv-rail-quiet);
}
body.lgw-on .lgw-rail-save #lgw-save-note:empty { display: none; }
/* Joel 09-24: the status carries the design's name ("Saved just now · Team
   hoodie"); a long name stops at three lines in the narrow rail */
body.lgw-on .lgw-rail-save #lgw-save-note:not(:empty) {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  overflow: hidden;
}
body.lgw-on .lgw-rail-save .lgw-save-asnew {
  appearance: none;
  background: none;
  border: 0;
  margin: -.2rem 0 0;
  padding: .3rem .6rem;
  min-height: 0;
  font-family: var(--vh-body);
  font-weight: 400;
  font-size: 1.2rem;
  line-height: 1.3;
  letter-spacing: 0;
  text-transform: none;
  color: var(--sv-rail-quiet);
  text-decoration: underline;
  text-underline-offset: .2em;
  cursor: pointer;
}
body.lgw-on .lgw-rail-save .lgw-save-asnew:hover { color: var(--sv-panel); }
body.lgw-on .lgw-rail-save .lgw-save-asnew[hidden] { display: none; }
body.lgw-on .lgw-rail-save .lgw-save-asnew:focus-visible {
  outline: 2px solid var(--sv-panel);
  outline-offset: 2px;
  box-shadow: none;
}
/* Joel 09-24: Save as new asks for a name - one white r8 field in the
   seat, the full pill width, the name set like the status line's body
   face but in ink; under it a small SAVE key (the pill's face) and a
   quiet Cancel link (the Save as new link's face). The label is for
   screen readers only; the field says what it is by its prefill. */
body.lgw-on .lgw-rail-save .lgw-asnew {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: .6rem;
  width: 100%;
  margin: .1rem 0 0;
}
body.lgw-on .lgw-rail-save .lgw-asnew[hidden] { display: none; }
/* while the field is open it IS the status: the "Saved … · name" line
   steps aside so the rail seat stays short (1100 x 700 included) */
body.lgw-on .lgw-rail-save:has(> .lgw-asnew:not([hidden])) #lgw-save-note { display: none; }
body.lgw-on .lgw-rail-save .lgw-asnew-lbl {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}
body.lgw-on .lgw-rail-save .lgw-asnew-input {
  display: block;
  box-sizing: border-box;
  width: 100%;
  min-width: 0;
  min-height: 3.6rem;
  margin: 0;
  padding: .7rem .9rem;
  background: var(--sv-panel);
  color: var(--sv-ink);
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-ctl);
  box-shadow: none;
  font-family: var(--vh-body);
  font-weight: 400;
  font-size: 1.3rem;
  line-height: 1.3;
}
body.lgw-on .lgw-rail-save .lgw-asnew-input:focus,
body.lgw-on .lgw-rail-save .lgw-asnew-input:focus-visible {
  outline: 2px solid var(--sv-panel);
  outline-offset: 2px;
  box-shadow: none;
}
body.lgw-on .lgw-rail-save .lgw-asnew-acts {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .6rem;
}
body.lgw-on .lgw-rail-save .lgw-asnew-go {
  appearance: none;
  min-width: 0;
  min-height: 3rem;
  margin: 0;
  padding: .6rem 1.2rem .55rem;
  background: var(--sv-panel);
  color: var(--sv-ink);
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-ctl);
  box-shadow: none;
  font-family: var(--vh-display);
  font-weight: 500;
  font-size: 1.15rem;
  line-height: 1;
  letter-spacing: .12em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background 120ms ease;
}
body.lgw-on .lgw-rail-save .lgw-asnew-go:hover { background: var(--st-control-hover); }
body.lgw-on .lgw-rail-save .lgw-asnew-x {
  appearance: none;
  min-width: 0;
  min-height: 0;
  margin: 0;
  padding: .3rem .2rem;
  background: none;
  border: 0;
  box-shadow: none;
  font-family: var(--vh-body);
  font-weight: 400;
  font-size: 1.2rem;
  line-height: 1.3;
  letter-spacing: 0;
  text-transform: none;
  color: var(--sv-rail-quiet);
  text-decoration: underline;
  text-underline-offset: .2em;
  cursor: pointer;
}
body.lgw-on .lgw-rail-save .lgw-asnew-x:hover { color: var(--sv-panel); }
body.lgw-on .lgw-rail-save :is(.lgw-asnew-go, .lgw-asnew-x):focus-visible {
  outline: 2px solid var(--sv-panel);
  outline-offset: 2px;
  box-shadow: none;
}
@media (prefers-reduced-motion: reduce) {
  body.lgw-on .lgw-rail-save .lgw-asnew-go { transition: none; }
}

/* --------------------------------------------------------------------------
   L1a — LOG IN TO SAVE sheet (briefs/_SPEC_studio_library_save.md §2, comp
   briefs/_comps_library_save/login_to_save_v3.png). A card over the PANEL
   column only: #lgw-lis is absolute inside .lgw-zones (position:relative),
   spanning exactly the panel's grid column (left = the 14rem rail, width =
   the 38.5rem panel), so the canvas is never covered. Panel-title face for
   the heading (the R4·B knobs), body copy in Cooper Hewitt, one r8 input,
   the ink r8 primary, quiet alternatives underneath. Desktop only.
   -------------------------------------------------------------------------- */
body.lgw-on .lgw-lis {
  display: none;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 14rem;
  width: 38.5rem;
  z-index: 24;                /* over the panel column; under the full-screen pickers */
}
body.lgw-on .lgw-lis.lgw-lis-open { display: block; }
body.lgw-on .lgw-lis[hidden] { display: none; }
body.lgw-on .lgw-lis-scrim {
  position: absolute;
  inset: 0;
  background: rgba(24, 21, 16, .34);
  cursor: pointer;
}
body.lgw-on .lgw-lis-card {
  position: absolute;
  z-index: 1;
  top: 1.6rem;
  left: 1.6rem;
  right: 1.6rem;
  max-height: calc(100% - 3.2rem);
  overflow-y: auto;
  padding: 2.4rem 2.4rem 2.2rem;
  background: var(--sv-panel);
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
  box-shadow: 0 18px 44px rgba(24, 21, 16, .22);
}
body.lgw-on .lgw-lis-card:focus { outline: none; }
body.lgw-on .lgw-lis-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 1rem;
}
body.lgw-on .lgw-lis-title {
  margin: 0;
  font-family: var(--sv-title-font);
  font-weight: var(--sv-title-weight);
  font-size: var(--sv-title-size);
  line-height: 1.15;
  letter-spacing: var(--sv-title-tracking);
  text-transform: var(--sv-title-transform);
  color: var(--sv-ink);
}
body.lgw-on .lgw-lis-x {
  flex: 0 0 auto;
  appearance: none;
  width: 3.6rem;
  height: 3.6rem;
  margin: -.6rem -.8rem 0 0;
  padding: 0;
  background: none;
  border: 0;
  border-radius: var(--sv-r-ctl);
  color: var(--sv-text-quiet);
  font-size: 1.6rem;
  line-height: 1;
  cursor: pointer;
}
body.lgw-on .lgw-lis-x:hover { color: var(--sv-ink); background: var(--st-control-hover); }
body.lgw-on .lgw-lis-sub,
body.lgw-on .lgw-lis-what,
body.lgw-on .lgw-lis-stay,
body.lgw-on .lgw-lis-alt,
body.lgw-on .lgw-lis-err {
  margin: .8rem 0 0;
  font-family: var(--vh-body);
  font-weight: 400;
  font-size: 1.4rem;
  line-height: 1.5;
  letter-spacing: 0;
  color: var(--sv-muted);
}
body.lgw-on .lgw-lis-what {
  margin-top: 1.4rem;
  padding: 1.1rem 1.3rem;
  background: var(--sv-tan);
  border: 1px solid var(--sv-hair);
  border-radius: var(--sv-r-card);
  font-size: 1.3rem;
}
body.lgw-on .lgw-lis-what b { font-weight: 600; color: var(--sv-ink); }
body.lgw-on .lgw-lis-what[hidden] { display: none; }
body.lgw-on .lgw-lis-form { margin-top: 1.6rem; }
body.lgw-on .lgw-lis-label {
  display: block;
  margin: 0 0 .5rem;
  font-family: var(--vh-body);
  font-weight: 600;
  font-size: 1.3rem;
  line-height: 1.3;
  color: var(--sv-ink);
}
body.lgw-on .lgw-lis-pw { margin-top: 1.2rem; }
body.lgw-on .lgw-lis-pw[hidden] { display: none; }
body.lgw-on .lgw-lis-input {
  display: block;
  width: 100%;
  min-height: 4.6rem;
  margin: 0;
  padding: 1rem 1.3rem;
  background: var(--sv-panel);
  border: 1px solid var(--sv-hair-strong);
  border-radius: var(--sv-r-ctl);
  font-family: var(--vh-body);
  font-weight: 400;
  font-size: 1.5rem;
  line-height: 1.3;
  color: var(--sv-ink);
  box-shadow: none;
}
body.lgw-on .lgw-lis-input:focus-visible {
  outline: 2px solid var(--sv-ink);
  outline-offset: 1px;
  border-color: var(--sv-hair-strong);
}
body.lgw-on .lgw-lis-input::placeholder { color: var(--sv-rail-quiet); }
/* the honeypot: out of flow, out of sight, never a target */
body.lgw-on .lgw-lis-hp {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}
body.lgw-on .lgw-lis-err { color: var(--vh-stop, #9B2C2C); }
body.lgw-on .lgw-lis-err[hidden] { display: none; }
body.lgw-on .lgw-lis-send {
  display: block;
  width: 100%;
  min-height: 4.8rem;
  margin: 1.4rem 0 0;
  padding: 1.2rem 1.6rem;
  background: var(--sv-ink);
  color: var(--sv-panel);
  border: 1px solid var(--sv-ink);
  border-radius: var(--sv-r-ctl);
  font-family: var(--vh-display);
  font-weight: 500;
  font-size: 1.4rem;
  line-height: 1;
  letter-spacing: .14em;
  text-transform: uppercase;
  text-align: center;
  white-space: nowrap;
  cursor: pointer;
  transition: background 120ms ease;
}
body.lgw-on .lgw-lis-send:hover { background: #2B2721; border-color: #2B2721; }
body.lgw-on .lgw-lis-send:disabled,
body.lgw-on .lgw-lis-send:disabled:hover { background: #5F594F; border-color: #5F594F; cursor: default; }
body.lgw-on .lgw-lis-send:focus-visible { outline: 2px solid var(--sv-ink); outline-offset: 2px; }
body.lgw-on .lgw-lis-stay { margin-top: 1.2rem; }
body.lgw-on .lgw-lis-stay[hidden] { display: none; }
/* #498 review rider: "New here? The link creates your account." and the
   password link are two LINES with normal line spacing, not one run-on -
   the swap's focus ring (2px, 2px offset) never touches the line above. */
body.lgw-on .lgw-lis-alt {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: .6rem;
  margin-top: 1rem;
  font-size: 1.3rem;
  line-height: 1.5;
}
body.lgw-on .lgw-lis-alt > #lgw-lis-new[hidden] { display: none; }
body.lgw-on .lgw-lis-swap {
  appearance: none;
  display: inline-block;
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
  font: inherit;
  color: var(--sv-ink);
  text-decoration: underline;
  text-underline-offset: .2em;
  cursor: pointer;
}
body.lgw-on .lgw-lis-swap:hover { color: var(--sv-muted); }
body.lgw-on .lgw-lis-swap:focus-visible { outline: 2px solid var(--sv-ink); outline-offset: 2px; border-radius: 2px; }
@media (prefers-reduced-motion: reduce) {
  body.lgw-on .lgw-lis-send { transition: none; }
}

/* ==========================================================================
   L1b (2026-09-24) — LIBRARY TILES on the desktop shell (base rules live in
   vintage.css beside the D17 block). Only what the shell's shared families
   would otherwise impose: the saved-design thumb is NOT a white framed well
   here (the tile's field IS the garment colour, the design floats on it),
   the ✕ is a quiet 2.6rem key at the field's top-right rather than a
   stop-coloured control-family button, and Delete / Keep keep the r8
   control radius and their small size. The shared control family
   (studio_controls.css:18) carries ids in its :is() list, so these rules
   ride the grid ids (#lgw-ds-list / #lgw-lib-files) as the lever.
   ========================================================================== */
body.lgw-on .lgw-lib-art .lgw-ds-thumb {
  background: transparent;
  border: 0;
  border-radius: 0;
}
body.lgw-on #lgw-ds-list .lgw-ds-x {
  min-width: 0;
  min-height: 0;
  width: 2.6rem;
  height: 2.6rem;
  padding: 0;
  color: var(--sv-text-quiet);
  background: rgba(253, 252, 247, .94);
  border: 1px solid var(--sv-hair-strong);
  border-radius: var(--sv-r-sm);
  font-size: 1.15rem;
  line-height: 1;
}
body.lgw-on #lgw-ds-list .lgw-ds-x:hover {
  color: var(--sv-ink);
  border-color: var(--sv-ink);
  background: var(--sv-panel);
}
body.lgw-on #lgw-ds-list .lgw-ds-x:focus-visible { outline: 2px solid var(--sv-ink); outline-offset: 2px; }
body.lgw-on #lgw-ds-list :is(.lgw-ds-yes, .lgw-ds-no) {
  min-width: 0;
  min-height: 3rem;
  padding: .45rem .8rem;
  border-radius: var(--sv-r-ctl);
  font-size: 1rem;
}
body.lgw-on #lgw-ds-list .lgw-ds-yes { color: var(--vh-stop, #9B2C2C); border-color: var(--vh-stop, #9B2C2C); }
body.lgw-on #lgw-ds-list .lgw-ds-yes:hover { background: var(--vh-stop, #9B2C2C); color: var(--sv-panel); }
/* Joel 09-24: the tile IS the action - its stretched button (.lgw-lib-hit)
   stays invisible whatever the shell's button families say; the focus ring
   is drawn on the tile itself (vintage.css) so it follows the r10 card. */
body.lgw-on :is(#lgw-ds-list, #lgw-lib-files) .lgw-lib-hit,
body.lgw-on :is(#lgw-ds-list, #lgw-lib-files) .lgw-lib-hit:hover {
  min-width: 0;
  min-height: 0;
  padding: 0;
  background: transparent;
  border: 0;
  box-shadow: none;
  outline: none;
}
/* the rename field (vintage.css) draws its own focus as a 2px ink edge; the
   shell-wide focus outline would ring it twice and spill over the meta line */
body.lgw-on #lgw-ds-list .lgw-lib-name-input:focus,
body.lgw-on #lgw-ds-list .lgw-lib-name-input:focus-visible {
  outline: none;
  border-color: var(--sv-ink);
  box-shadow: 0 0 0 1px var(--sv-ink);
}

/* --------------------------------------------------------------------------
   Studio keyboard (Joel 2026-09-24). The piece box is a Tab stop now: for
   keyboard users (:focus-visible only) it draws the shell's September focus
   ring - 2px ink outline on a white halo - outside the selection edge, so
   the pointer's selection ring is untouched. Esc's idle paint (engine
   .lg-logo--idle: no grips, no stalk, no ring) also hides the on-box ✕.
   -------------------------------------------------------------------------- */
body.lgw-on .lg-logo:focus-visible {
  outline: 2px solid var(--sv-ink);
  outline-offset: 4px;
  box-shadow: 0 0 0 4px var(--sv-panel);
}
/* a press focuses the box from script; .lg-logo--ptr (set on the press,
   cleared by the next key) keeps that focus ring-free for pointer users */
body.lgw-on .lg-logo.lg-logo--ptr:focus-visible {
  outline: none;
  box-shadow: none;
}
body.lgw-on .lgw-room .lg-logo.lg-logo--idle .lgw-rmx { display: none; }

/* ── Share for approval (briefs/_SPEC_share_for_approval.md) ───────────────
   The Review card's ONE secondary button (#lgw-share) takes the secondary
   control face above; it fills the actions seat's width above the Continue
   CTA and reads dimmed, not grey, while Continue is off. The sheet reuses
   the Log in to save chrome (.lgw-lis-*) plus a textarea, a counter and the
   optional "Your email" field. The Library tile's status chip sits quiet in
   the art's bottom-left corner (r4); the Review card's approved line sits
   directly above the reason line + Continue. Desktop shell only. */
body.lgw-on .lgw-order .lgw-share {
  display: block;
  width: 100%;
  min-height: 4.6rem;
  margin: 0 0 1rem;
  padding: 1.2rem 1.6rem;
  font-size: 1.5rem;
  line-height: 1;
  text-align: center;
  white-space: nowrap;
  cursor: pointer;
  transition: background 120ms ease, border-color 120ms ease, opacity 120ms ease;
}
body.lgw-on .lgw-order .lgw-share:disabled {
  opacity: .55;
  cursor: default;
}
body.lgw-on .lgw-order .lgw-share:disabled:hover {
  background: var(--sv-panel);
  border-color: var(--sv-hair-strong);
}
body.lgw-on .lgw-order .lgw-share:focus-visible { outline: 2px solid var(--sv-ink); outline-offset: 2px; }
body:not(.lgw-on) .lgw-share { display: none; }
body.lgw-on .lgw-lis-field { margin-top: 1.2rem; }
body.lgw-on .lgw-lis-field[hidden] { display: none; }
body.lgw-on .lgw-lis-opt { font-weight: 400; color: var(--sv-text-quiet); }
body.lgw-on .lgw-lis-textarea {
  min-height: 8.4rem;
  resize: vertical;
  line-height: 1.45;
}
body.lgw-on .lgw-lis-count {
  margin: .5rem 0 0;
  font-family: var(--vh-display);
  font-weight: 500;
  font-size: 1.05rem;
  letter-spacing: .1em;
  text-transform: uppercase;
  text-align: right;
  color: var(--sv-text-quiet);
}
body.lgw-on .lgw-sfa .lgw-lis-stay { margin-top: 1.2rem; }
body.lgw-on .lgw-sfa #lgw-sfa-from-note { margin-top: .7rem; font-size: 1.25rem; }
.lgw-lib-chip--status {
  top: auto;
  bottom: .8rem;
  left: .8rem;
  border-radius: 4px;
  background: var(--sv-tan, #FAF6EE);
  color: var(--sv-text-quiet, #6B675F);
  border: 1px solid var(--sv-hair, #E6E1D8);
  font-weight: 500;
  letter-spacing: .08em;
  text-transform: none;
}
body.lgw-on .lgw-order-approved {
  margin: 0 0 1rem;
  font-family: var(--vh-body);
  font-weight: 500;
  font-size: 1.3rem;
  line-height: 1.4;
  color: var(--sv-text-quiet);
}
body.lgw-on .lgw-order-approved::before {
  content: "\2713";
  display: inline-block;
  margin-right: .6rem;
  font-weight: 700;
  color: var(--vh-ok, #3E6448);
}
body.lgw-on .lgw-order-approved[hidden] { display: none; }
/* R-007 (fix 2's item 8): a request for changes wears no tick */
body.lgw-on .lgw-order-approved[data-status="changes_requested"]::before { content: none; }
/* fix 1b: a design saved again since it was shared says so (no tick) with Send again */
body.lgw-on .lgw-order-approved[data-status="changed"]::before { content: none; }
body.lgw-on .lgw-order-approved .lgw-sfa-again {
  padding: 0; border: 0; background: none; font: inherit; color: var(--vh-ink);
  text-decoration: underline; text-underline-offset: 2px; cursor: pointer;
}
@media (prefers-reduced-motion: reduce) {
  body.lgw-on .lgw-order .lgw-share { transition: none; }
}

/* --------------------------------------------------------------------------
   A retired Email my design link that could not be opened (hyg3): one quiet
   line under the site nav, in every studio mode, until its x dismisses it.
   -------------------------------------------------------------------------- */
.lgw-link-note {
  position: fixed;
  top: calc(var(--nav-height, 8rem) + 1.2rem);
  left: 0;
  right: 0;
  z-index: 60;
  display: flex;
  align-items: center;
  gap: 1.2rem;
  width: fit-content;
  max-width: calc(100% - 3.2rem);
  margin: 0 auto;
  padding: .9rem .9rem .9rem 1.6rem;
  background: var(--vh-ink);
  color: var(--vh-cream);
  font: 500 1.4rem/1.4 var(--vh-body);
  border-radius: var(--vh-ctl-radius, 2px);
  box-shadow: 0 8px 24px rgba(24, 21, 16, .22);
}
.lgw-link-note[hidden] { display: none; }
.lgw-link-note button {
  flex: 0 0 auto;
  min-width: 3.2rem;
  min-height: 3.2rem;
  padding: 0;
  background: none;
  border: 0;
  color: inherit;
  font-size: 2rem;
  line-height: 1;
  cursor: pointer;
}
.lgw-link-note button:focus-visible { outline: 2px solid var(--vh-cream); outline-offset: 2px; }
/* ── Live stock Part B (PB-4): stock states, no new layout. An out colour
   stays in its place, greyed with a thin diagonal (aria-disabled / data-stock,
   never [disabled]: the engine reads .disabled); hover and focus still work.
   The engine swatch, the colour dock, the wall's side panel and the phone
   list (studio_phone.css) share the look. An option with no colour left to
   pick greys its Style button (title "Out of stock"); the side panel draws a
   thin rule between Joel's picks and the other colours. ── */
.lg-sw[data-stock="out"],
body.lgw-on .lgw-cdot[aria-disabled="true"],
body.lgw-on .lgw-gp-dot[aria-disabled="true"],
.lgw-swpick[aria-disabled="true"] .lgw-swdot { position: relative; opacity: .45; }
.lg-sw[data-stock="out"],
body.lgw-on .lgw-cdot[aria-disabled="true"],
body.lgw-on .lgw-gp-dot[aria-disabled="true"],
.lgw-swpick[aria-disabled="true"] { cursor: not-allowed; }
.lg-sw[data-stock="out"]::after,
body.lgw-on .lgw-cdot[aria-disabled="true"]::after,
body.lgw-on .lgw-gp-dot[aria-disabled="true"]::after,
.lgw-swpick[aria-disabled="true"] .lgw-swdot::after {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: linear-gradient(to top right, transparent calc(50% - 2px), rgba(250, 246, 238, .92) calc(50% - 2px), rgba(250, 246, 238, .92) calc(50% - .6px), #181510 calc(50% - .6px), #181510 calc(50% + .6px), rgba(250, 246, 238, .92) calc(50% + .6px), rgba(250, 246, 238, .92) calc(50% + 2px), transparent calc(50% + 2px));
  pointer-events: none;
}
body.lgw-on .lgw-cdot[aria-disabled="true"]:hover:not(.lgw-pk-sel) { transform: none; }
body.lgw-on .lgw-gp-dot[aria-disabled="true"]:hover { transform: none; }
.lg-style[data-stock="out"] { opacity: .45; }
body.lgw-on .lgw-gp-dots-rule {
  flex: 0 0 100%;
  height: 0;
  margin: .1rem 0;
  border-top: 1px solid var(--vh-line);
}
body.lgw-on .lgw-gp-insp-dots.lgw-gp-dots--open { flex: none; }   /* open: the column scrolls, nothing overlaps */
body.lgw-on .lgw-gp-dots-more {
  flex: none;
  height: 2.4rem;
  padding: 0 .9rem;
  border: 1px solid var(--sv-hair);
  border-radius: 1.2rem;
  background: #FFFFFF;
  color: var(--sv-muted);
  font-family: var(--vh-body);
  font-size: 1.15rem;
  font-weight: 600;
  cursor: pointer;
}
body.lgw-on .lgw-gp-dots-more:hover { border-color: var(--sv-ink); color: var(--sv-ink); }
body.lgw-on .lgw-gp-dots-more:focus-visible { outline: 2px solid var(--sv-ink); outline-offset: 2px; }

/* R-012: a price on its way: the till dims and "Updating price" stands in
   for its line (the phone bar says it in its own line, beside a spinner) */
.lgw-price-wait { display: none; }
body.lgw-pr-wait:not(.lgm-on) #lgw-foot-price .lgw-price-note { display: none; }
body.lgw-pr-wait:not(.lgm-on) #lgw-foot-price .lgw-price-wait { display: block; }
.lgw-order .lgw-price-wait { font-family: var(--vh-body); font-size: 1.05rem; color: var(--vh-muted); }
body.lgw-pr-wait :is(#lgw-price-v, #lgm-pe-from, .lgw-ang-pr, #lgw-st-order) { opacity: .4; transition: opacity .15s ease; }
/* fix 1b (QA #12): words no spot here can take wait for their stitched render
   hidden ("Stitching your preview" says why), never sprawled at a provisional size */
#lg-logo.lg-wait-fit { visibility: hidden; }

/* polish 1 (P11): the texts the block below raises to 12 px on the studio's
   first screens keep main's line boxes (its line heights, in px), so a text
   grows inside its own box and nothing around it moves: the side cards, the
   color dock, the garment line, the stage's width tag, the size chip and the
   inspector's lines keep their seats (the T1 frames) */
body.lgw-on :is(.lgw-ang-st, .lgw-ang-dot, .lgw-ang-pr) { line-height: 12px; }
body.lgw-on .lgw-ang-tick { line-height: 10px; }
body.lgw-on .lgw-cdock-lbl { line-height: 10px; }
body.lgw-on .lgw-cdock-more { line-height: 11.55px; }
body.lgw-on .lgw-prod-sub { line-height: 17.82px; }
body.lgw-on .lg-stage > .lgw-cap { line-height: 18.15px; }
body.lgw-on .lg-logo .dim { line-height: 17.325px; }
body.lgw-on .lgw-dg-chip { line-height: 18.975px; }
body.lgw-on .lgw-dg-chip .gl { line-height: 17.325px; }
body.lgw-on .lgw-panel .lgw-ins-sub { line-height: 16.53px; }
body.lgw-on .lgw-ins-upstat { line-height: 18.48px; }
body.lgw-on .lgw-ins-side { line-height: 18.975px; }
body.lgw-on .lgw-panel .lgw-ins-clcopy { line-height: 15.66px; }
body.lgw-on .lgw-tonal-copy { line-height: 16.2px; }
body.lgw-on .lgw-ins-where { line-height: 16.83px; }
body.lgw-on .lgw-ins-st { line-height: 18.48px; }

/* ── polish 1 (P11): no customer text under 12 px on the PC ───────────────
   Every studio text the PC drew at 9.5 to 11.8 px reads at 12 px (1.2rem):
   the side cards' size, price and "blank", the color dock, the size chip,
   the garment line under the product, the inspector's notes, the thread
   chart's names, the garment picker, the price sheet, the Library's tiles,
   and the few that show only now and then (the rotate readout, "Too big",
   the stock count, "Updating price"). Size only: each selector matches or
   outranks the rule it raises and matches nothing already 12 px or more,
   so nothing else changes. ── */
body.lgw-on :is(.lgw-ang-st, .lgw-ang-dot, .lgw-ang-pr, .lgw-ang-tick),
body.lgw-on :is(.lgw-order-kicker, .lg-stage > .lgw-cap),
body.lgw-on :is(.lgw-cdock-lbl, .lgw-cdock-more, .lgw-lis-count, .lgw-prod-sub),
body.lgw-on :is(.lgw-gp-eyebrow, .lgw-gp-card-type, .lgw-gp-cur, .lgw-gp-kbd, .lgw-gp-pill, .lgw-gp-keys),
body.lgw-on #lgw-gp-insp-type,
body.lgw-on .lg-logo .dim,
body.lgw-on .lg-bound .tag,
body.lgw-on :is(.lg-bound-chip, .lg-rot-deg, .lgw-rmx, .lgw-dg-chip, .lgw-dg-note),
body.lgw-on .lgw-dg-chip .gl,
body.lgw-on .lgw-panel .lgw-ins-sub,
body.lgw-on .lgw-panel .lgw-ins-clcopy,
body.lgw-on :is(.lgw-ins-upstat, .lgw-ins-side, .lgw-ins-st, .lgw-ins-where, .lgw-ins-fit, .lgw-ins-split-copy),
body.lgw-on .lgw-ins-spot .lgw-ins-fit,
body.lgw-on :is(.lgw-tonal-copy, .lgw-order-hint, .lgw-price-k, .lgw-price-note, .lgw-price-wait),
body.lgw-on .lgw-order :is(.lgw-price-k, .lgw-price-note, .lgw-price-wait),
body.lgw-on :is(.lgw-mx-kt, .lgw-mx-ks, .lgw-mx-note),
body.lgw-on .lgw-pt-key,
body.lgw-on :is(.lgw-tc-c span, .lgw-tc-eye, .lgw-tc-cap),
body.lgw-on :is(#lgt-size-note, #lgt-meter),
body.lgw-on :is(.lgw-lib-chip, .lgw-lib-meta),
body.lgw-on .lgw-ds-confirm .q,
body.lgw-on #lgw-ds-list .lgw-ds-x,
body.lgw-on #lgw-ds-list :is(.lgw-ds-yes, .lgw-ds-no),
body.lgw-on .lgw-rail-save .lgw-asnew-go { font-size: 1.2rem; }

/* polish 3 item 7: "Yours is saved first." takes its own row of the strip */
body.lgw-on .lgw-ds-openask .lgw-ds-openl { flex: 1 0 100%; text-align: center; }

/* polish 1 (P13): a trucker's spot list says why it offers the front alone */
body.lgw-on .lgw-ins-mesh { margin: .65rem 0 0; font-family: var(--vh-body); font-size: 1.2rem; line-height: 1.5; color: var(--vh-muted); }
.lgw-ins-mesh[hidden] { display: none; }

/* polish 1 (U5): the steppers' signs, a drawn minus and plus alike */
body.lgw-on :is(.lgw-ins-sizebtn, .lgw-ins-clbtn) .lgw-sign { display: block; margin: auto; }

/* polish 1 (U6): the side's design (the Library tile's capture), big on its
   Review card's garment, so the card shows what will be sewn */
:is(body.lgw-on, body.lgm-on) .lgw-review-view-ph { position: relative; }
:is(body.lgw-on, body.lgm-on) .lgw-review-view-design {
  position: absolute; left: 50%; top: 46%; transform: translate(-50%, -50%);
  width: auto; height: auto; max-width: 46%; max-height: 46%; object-fit: contain;
  background: transparent; border: 0; padding: 0; pointer-events: none;
}

/* polish 1 (R-020 follow-up): under "Espresso can't sew é", the fonts that
   can sew the words, a tap each */
.lgt-font-offer[hidden] { display: none; }
:is(body.lgw-on, body.lgm-on) .lgt-font-offer { display: flex; flex-wrap: wrap; align-items: center; gap: .6rem; margin-top: .8rem; }
:is(body.lgw-on, body.lgm-on) .lgt-font-offer-t { flex-basis: 100%; font: 400 1.2rem/1.5 var(--vh-body); color: var(--vh-muted); }
:is(body.lgw-on, body.lgm-on) .lgt-font-offer-k {
  min-height: 3.6rem; padding: 0 1.2rem; border: 1px solid var(--sv-hair-strong, #CFCAC0); border-radius: 8px;
  background: var(--vh-white); color: var(--vh-ink); font: 600 1.3rem/1 var(--vh-body); cursor: pointer;
}
body.lgm-on .lgt-font-offer-k { min-height: 44px; }
:is(body.lgw-on, body.lgm-on) .lgt-font-offer-k:hover { border-color: var(--vh-ink); }
:is(body.lgw-on, body.lgm-on) .lgt-font-offer-k:focus-visible { outline: 2px solid var(--vh-ink); outline-offset: 2px; }

/* polish 1 (P5): a small or very thin logo file's quiet line, under its
   uploaded status: ink, not a refusal */
.lgw-ins-res[hidden] { display: none; }
body.lgw-on .lgw-ins-res { display: block; margin-top: .3rem; font-family: var(--vh-body); font-size: 1.2rem; line-height: 1.45; color: var(--vh-ink); text-wrap: pretty; }

/* ============================================================================
   thread_chart.css - "Pick a colour", the thread chart (briefs/_SPEC_thread_chart.md,
   Joel 2026-09-27; comps in briefs/_comps_thread_chart/). The ONE customer
   colour picker built by app/static/js/lgw_threads.js (LGW_THREADS.pick):
   the studio's logo colours + text thread, the stitch-file swap overlay and
   the reorder / quantities pages.

   Four hosts, one sheet:
     --panel  the studio desktop: over the left panel column (the 14rem rail
              stays, the sheet takes the 38.5rem panel, the canvas stays live)
     --modal  a centred 384px sheet over a scrim (quantities, reorder)
     --phone  a bottom sheet over a scrim (the studio phone + narrow pages)
     --inline in the page flow under the row that opened it (the business
              card Order more page, comp tp_ordermore_1440): no scrim, no x
              (the row's button reads Done), a fixed height so the grid
              scrolls inside it while the rest of the page moves down
   Sizes from the comp: dots 40px (46 in the machine view), phone 44px (48), names
   11.5px / 12px, two lines max; the grid reflows by container width.
   ========================================================================== */

.lgw-tc-layer {
  position: fixed;
  inset: 0;
  z-index: 150;               /* over the site header (100), under the skip link */
}
.lgw-tc-layer[hidden],
.lgw-tc-layer [hidden] { display: none !important; }
html.lgw-tc-lock,
html.lgw-tc-lock body { overflow: hidden; }

.lgw-tc-scrim {
  position: absolute;
  inset: 0;
  background: rgba(27, 26, 23, .42);
  cursor: pointer;
}

.lgw-tc {
  --tc-ink: var(--vh-ink, #1B1A17);
  --tc-paper: #FFFEFB;
  --tc-cream: #FBF9F4;
  --tc-hair: #E6E1D8;
  --tc-hair2: #CFCAC0;
  --tc-quiet: #6B675F;
  --tc-muted: #59554E;
  --tc-dot: 4rem;
  --tc-pad: 2rem;
  position: absolute;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  box-sizing: border-box;
  background: var(--tc-paper);
  color: var(--tc-ink);
  font-family: var(--vh-body, 'Cooper Hewitt', 'DM Sans', sans-serif);
  font-size: 1.4rem;
  font-weight: 400;
  line-height: 1.4;
  letter-spacing: 0;
  text-transform: none;
  -webkit-font-smoothing: antialiased;
}
.lgw-tc *,
.lgw-tc *::before,
.lgw-tc *::after { box-sizing: border-box; }
.lgw-tc:focus { outline: none; }
/* zero-specificity resets, so every component rule below wins over them */
.lgw-tc :where(button) { font: inherit; color: inherit; margin: 0; text-transform: none; letter-spacing: 0; }
.lgw-tc :where(p, h2) { margin: 0; }
.lgw-tc-sr {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
}

/* ── hosts ─────────────────────────────────────────────────────────────── */
.lgw-tc-layer--panel {
  position: absolute;
  inset: 0 auto 0 14rem;      /* exactly the panel column of .lgw-zones */
  width: 38.5rem;
  z-index: 24;                /* over the panel column; under the full-screen pickers */
}
.lgw-tc-layer--panel .lgw-tc-scrim { display: none; }
.lgw-tc-layer--panel .lgw-tc {
  inset: 0;
  border-right: 1px solid var(--tc-hair);
  box-shadow: 12px 0 28px -18px rgba(27, 26, 23, .45);
}
.lgw-tc-layer--modal .lgw-tc {
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  width: 38.4rem;
  max-width: calc(100% - 3.2rem);
  height: min(82rem, calc(100% - 4.8rem));
  border: 1px solid var(--tc-hair);
  border-radius: 12px;
  box-shadow: 0 22px 54px rgba(24, 21, 16, .28);
}
.lgw-tc-layer--phone .lgw-tc {
  left: 50%;
  bottom: 0;
  transform: translateX(-50%);
  width: 100%;
  max-width: 56rem;           /* a tablet's phone shell keeps a sheet, not a wall */
  height: calc(100% - 9.2rem);
  border-radius: 14px 14px 0 0;
  box-shadow: 0 -12px 32px -12px rgba(27, 26, 23, .35);
}
.lgw-tc-layer--inline {
  position: relative;
  inset: auto;
  z-index: auto;
}
.lgw-tc-layer--inline .lgw-tc-scrim,
.lgw-tc-layer--inline .lgw-tc-x { display: none; }
.lgw-tc-layer--inline .lgw-tc {
  position: relative;
  width: 100%;
  height: 66rem;
  border: 1px solid var(--tc-hair);
  border-radius: 10px;
  box-shadow: 0 18px 36px -26px rgba(24, 21, 16, .45);
}
@media (max-width: 560px) {
  /* 64.8rem = 62rem + what the 44px search field and family tabs below add
     (0.8rem + two rows of 1rem), so the grid shows as many colours */
  .lgw-tc-layer--inline .lgw-tc { --tc-dot: 4.4rem; --tc-pad: 1.6rem; height: 64.8rem; }
  .lgw-tc-layer--inline .lgw-tc-c span { font-size: 1.2rem; }
  /* phone tap targets: the search field and the family tabs are 44px */
  .lgw-tc-layer--inline .lgw-tc-search { height: 4.6rem; }
  .lgw-tc-layer--inline .lgw-tc-tab { height: 4.4rem; }
}

/* ── head ──────────────────────────────────────────────────────────────── */
.lgw-tc-h { flex: none; padding: 2rem var(--tc-pad) 1.4rem; }
.lgw-tc-grab { display: none; }
.lgw-tc-top {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.2rem;
  min-height: 3.6rem;
}
.lgw-tc-eye {
  font-family: var(--vh-display, 'Oswald', sans-serif);
  font-weight: 500;
  font-size: 1.15rem;
  line-height: 1.2;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--tc-quiet);
}
.lgw-tc-x {
  flex: none;
  width: 3.6rem;
  height: 3.6rem;
  padding: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--tc-paper);
  border: 1px solid var(--tc-hair2);
  border-radius: 8px;
  cursor: pointer;
}
.lgw-tc-x svg { width: 1.4rem; height: 1.4rem; stroke: var(--tc-ink); stroke-width: 1.8; fill: none; stroke-linecap: round; }
.lgw-tc-x:hover { border-color: var(--tc-ink); }
.lgw-tc-title {
  margin-top: .2rem;
  font-family: var(--vh-display, 'Oswald', sans-serif);
  font-weight: 500;
  font-size: 3rem;
  line-height: 1;
  letter-spacing: .005em;
  text-transform: none;
  color: var(--tc-ink);
}
.lgw-tc .lgw-tc-lede {
  margin-top: .8rem;
  font-size: 1.35rem;
  line-height: 1.45;
  color: var(--tc-muted);
  text-wrap: balance;
}

/* ── tools: the first row, the search, the family rail ─────────────────── */
.lgw-tc-tools {
  flex: none;
  display: flex;
  flex-direction: column;
  gap: 1rem;
  padding: 0 var(--tc-pad) 1.2rem;
}
.lgw-tc-none {
  display: flex;
  align-items: center;
  gap: 1.2rem;
  width: 100%;
  height: 4.8rem;
  padding: 0 1.2rem 0 .8rem;
  background: var(--tc-paper);
  border: 1px solid var(--tc-hair);
  border-radius: 10px;
  text-align: left;
  cursor: pointer;
}
.lgw-tc-none > i {
  position: relative;
  flex: none;
  width: 3.2rem;
  height: 3.2rem;
  border-radius: 50%;
  box-shadow: inset 0 0 0 1px rgba(27, 26, 23, .16);
}
.lgw-tc-none-dot {
  background-color: #fff;
  background-image:
    linear-gradient(45deg, #E4E0D8 25%, transparent 25%, transparent 75%, #E4E0D8 75%),
    linear-gradient(45deg, #E4E0D8 25%, transparent 25%, transparent 75%, #E4E0D8 75%);
  background-size: 10px 10px;
  background-position: 0 0, 5px 5px;
}
.lgw-tc-none b { font-weight: 500; font-size: 1.4rem; line-height: 1.2; }
.lgw-tc-none:hover { border-color: var(--tc-hair2); }
.lgw-tc-none.on { border-color: var(--tc-ink); box-shadow: inset 0 0 0 1px var(--tc-ink); }
.lgw-tc-none.on b { font-weight: 600; }
.lgw-tc-none .lgw-tc-check {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 46%;
  height: 46%;
  transform: translate(-50%, -50%);
  fill: none;
  stroke-width: 2.4;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.lgw-tc-search {
  display: flex;
  align-items: center;
  gap: .8rem;
  height: 3.8rem;
  margin: 0;
  padding: 0 1.2rem;
  background: #fff;
  border: 1px solid var(--tc-hair);
  border-radius: 8px;
  cursor: text;
}
.lgw-tc-search svg { flex: none; width: 1.5rem; height: 1.5rem; stroke: var(--tc-quiet); stroke-width: 1.8; fill: none; }
.lgw-tc-search input {
  flex: 1;
  min-width: 0;
  height: 100%;
  margin: 0;
  padding: 0;
  background: transparent;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  outline: none;
  font-family: inherit;
  font-size: 1.35rem;
  color: var(--tc-ink);
  -webkit-appearance: none;
  appearance: none;
}
.lgw-tc-search input::placeholder { color: #9B968C; opacity: 1; }
.lgw-tc-search input::-webkit-search-decoration { -webkit-appearance: none; }
.lgw-tc-search:focus-within { border-color: var(--tc-ink); }

.lgw-tc-rail {
  display: grid;
  grid-template-columns: repeat(20, minmax(0, 1fr));   /* 4 tabs, then 5 */
  gap: 3px;
  padding: 3px;
  background: var(--tc-cream);
  border: 1px solid var(--tc-hair);
  border-radius: 10px;
}
.lgw-tc-tab {
  grid-column: span 5;
  min-width: 0;
  height: 3.4rem;
  padding: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: .7rem;
  background: transparent;
  border: 0;
  border-radius: 8px;
  font-size: 1.35rem;
  font-weight: 500;
  color: var(--tc-muted);
  white-space: nowrap;
  cursor: pointer;
}
.lgw-tc-tab:nth-child(n+5) { grid-column: span 4; }
.lgw-tc-tab i {
  flex: none;
  width: 1.1rem;
  height: 1.1rem;
  border-radius: 50%;
  box-shadow: inset 0 0 0 1px rgba(27, 26, 23, .18);
}
.lgw-tc-tab:hover { color: var(--tc-ink); }
.lgw-tc-tab[aria-selected="true"] { background: var(--tc-ink); color: #fff; }
.lgw-tc-tab[aria-selected="true"] i { box-shadow: 0 0 0 1.5px rgba(255, 254, 251, .9); }

/* ── the grid of real cones ────────────────────────────────────────────── */
.lgw-tc-body {
  flex: 1;
  min-height: 0;
  position: relative;
  overflow: hidden;
  border-top: 1px solid var(--tc-hair);
}
.lgw-tc-scroll {
  position: relative;
  height: 100%;
  overflow-y: auto;
  overscroll-behavior: contain;
  padding: 1.4rem calc(var(--tc-pad) - .6rem) 1.6rem;
  scrollbar-width: thin;
  scrollbar-color: #D8D2C6 transparent;
}
.lgw-tc-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(6.4rem, 1fr));
  row-gap: 1.2rem;
}
.lgw-tc-c {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .7rem;
  min-width: 0;
  padding: 0 .2rem;
  background: none;
  border: 0;
  cursor: pointer;
}
.lgw-tc-c i {
  position: relative;
  flex: none;
  width: var(--tc-dot);
  height: var(--tc-dot);
  border-radius: 50%;
  box-shadow: inset 0 0 0 1px rgba(27, 26, 23, .14);
}
.lgw-tc-c span {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  min-height: 2.44em;
  font-size: 1.15rem;
  line-height: 1.22;
  text-align: center;
  color: var(--tc-muted);
  overflow-wrap: break-word;
}
.lgw-tc-c:hover i { box-shadow: inset 0 0 0 1px rgba(27, 26, 23, .14), 0 0 0 2px var(--tc-paper), 0 0 0 3px var(--tc-hair2); }
.lgw-tc-c.on i { box-shadow: inset 0 0 0 1px rgba(27, 26, 23, .14), 0 0 0 2px var(--tc-paper), 0 0 0 3px var(--tc-ink); }
.lgw-tc-c .lgw-tc-check {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 46%;
  height: 46%;
  transform: translate(-50%, -50%);
  fill: none;
  stroke-width: 2.4;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.lgw-tc-c.on span { color: var(--tc-ink); font-weight: 600; }
.lgw-tc-c:focus { outline: none; }
.lgw-tc-c:focus-visible i { outline: 2px solid var(--tc-ink); outline-offset: 4px; }
.lgw-tc button:focus-visible:not(.lgw-tc-c) { outline: 2px solid var(--tc-ink); outline-offset: 2px; }

.lgw-tc-cap {
  margin: 0 .6rem 1rem;
  font-family: var(--vh-display, 'Oswald', sans-serif);
  font-weight: 500;
  font-size: 1.05rem;
  line-height: 1.2;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--tc-quiet);
}
.lgw-tc-grid + .lgw-tc-cap { margin-top: 1.8rem; }
.lgw-tc-sep {
  height: 0;
  margin: 1.4rem .6rem;
  border: 0;
  border-top: 1px solid var(--tc-hair);
}
.lgw-tc-empty {
  padding: 2.8rem .6rem;
  text-align: center;
  font-size: 1.35rem;
  line-height: 1.45;
  color: var(--tc-quiet);
}

/* ── stitched text only: the machine colours only ─────────────────────── */
.lgw-tc .lgw-tc-mach {
  padding: 1.1rem 1.4rem;
  background: var(--tc-cream);
  border: 1px solid var(--tc-hair);
  border-radius: 10px;
  font-size: 1.35rem;
  line-height: 1.45;
  color: var(--tc-ink);
  text-wrap: balance;
}
.lgw-tc .lgw-tc-more {
  margin: 1.8rem .6rem 0;
  padding-top: 1.4rem;
  border-top: 1px dashed var(--tc-hair2);
  font-size: 1.3rem;
  line-height: 1.45;
  text-align: center;
  color: var(--tc-quiet);
}
.lgw-tc-more b { font-weight: 500; color: var(--tc-ink); }
.lgw-tc--machine { --tc-dot: 4.6rem; }
.lgw-tc--machine .lgw-tc-grid { row-gap: 1.6rem; }

/* ── foot ──────────────────────────────────────────────────────────────── */
.lgw-tc .lgw-tc-f {
  flex: none;
  padding: 1.3rem var(--tc-pad) 1.5rem;
  background: var(--tc-paper);
  border-top: 1px solid var(--tc-hair);
  font-size: 1.3rem;
  line-height: 1.4;
  color: var(--tc-quiet);
}
.lgw-tc-f a {
  color: var(--tc-ink);
  font-weight: 500;
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-color: var(--tc-hair2);
}
.lgw-tc-f a:hover { text-decoration-color: var(--tc-ink); }

/* ── the phone bottom sheet ────────────────────────────────────────────── */
.lgw-tc--phone { --tc-dot: 4.4rem; --tc-pad: 1.6rem; }
.lgw-tc--phone.lgw-tc--machine { --tc-dot: 4.8rem; }
.lgw-tc--phone .lgw-tc-h { padding-top: .8rem; }
.lgw-tc--phone .lgw-tc-grab {
  display: block;
  width: 4rem;
  height: .4rem;
  margin: 0 auto 1.2rem;
  border-radius: 2px;
  background: #D8D2C6;
}
.lgw-tc--phone .lgw-tc-title { font-size: 2.8rem; }
.lgw-tc--phone .lgw-tc-c span { font-size: 1.2rem; }
/* phone tap targets: 44px tabs and search field; the x keeps its 36px
   face inside an invisible 46px hit area */
.lgw-tc--phone .lgw-tc-tab { height: 4.4rem; }
.lgw-tc--phone .lgw-tc-search { height: 4.6rem; }
.lgw-tc--phone .lgw-tc-x { position: relative; }
.lgw-tc--phone .lgw-tc-x::before { content: ""; position: absolute; inset: -6px; }
.lgw-tc--phone .lgw-tc-f { padding-bottom: calc(2.6rem + env(safe-area-inset-bottom, 0px)); }

@media (prefers-reduced-motion: no-preference) {
  .lgw-tc-c i { transition: box-shadow 120ms ease; }
}

/* ── the text-only prompt (static/js/lg2_thread_check.js on the quantities
   pages, the studio's own above Continue): one quiet line, the colour's
   dot, the sentence and a text button into the machine colours. Never a
   block. ─────────────────────────────────────────────────────────────── */
.lg2-tprompt {
  margin: 1rem 0 .4rem;
  padding: 1.1rem 1.3rem;
  background: #FBF9F4;
  border: 1px solid #E6E1D8;
  border-radius: 8px;
  font-family: var(--vh-body, 'Cooper Hewitt', 'DM Sans', sans-serif);
  font-size: 1.3rem;
  line-height: 1.5;
  color: var(--vh-ink, #1B1A17);
}
.lg2-tprompt[hidden] { display: none; }
.lg2-tprompt-line { margin: 0; }
.lg2-tprompt-line + .lg2-tprompt-line { margin-top: .9rem; }
.lg2-tprompt-dot {
  display: inline-block;
  width: 1.1rem;
  height: 1.1rem;
  margin-right: .6rem;
  vertical-align: -.1rem;
  border-radius: 50%;
  box-shadow: inset 0 0 0 1px rgba(27, 26, 23, .2);
}
.lg2-tprompt-btn {
  display: inline;
  margin: 0;
  padding: .2rem 0;
  background: none;
  border: 0;
  border-bottom: 1px solid currentColor;
  font: inherit;
  font-weight: 600;
  color: var(--vh-ink, #1B1A17);
  cursor: pointer;
}
.lg2-tprompt-btn:hover { border-bottom-color: transparent; }
.lg2-tprompt-btn:focus-visible { outline: 2px solid var(--vh-ink, #1B1A17); outline-offset: 2px; }
.lg2-tprompt-err { margin: .6rem 0 0; color: var(--vh-stop, #8A2A1E); }

/* Review's blocks, one owner (studio panels, 2026-10-10). The Garment block,
   every embroidery location and each garment of a several-garment order share
   one structure, built by the engine's reviewBlock(): a head row (an Oswald
   small caps label on the left, quiet text actions on the right) over a two
   column list of facts (the label in the quiet body face, the value in the
   body face, numbers in Oswald). Blocks sit flat on the panel, a hairline
   between them, equal padding. A location's Threads are its last fact row.
   The phone has no Review step since Design 2; should these blocks ever paint
   under body.lgm-on, their facts stack in one column. */

/* the run of blocks: a hairline above each, and one under the last */
:is(body.lgw-on, body.lgm-on) .lgw-rv-block {
  display: block;
  margin: 0;
  padding: .8rem 0 2rem;
  border: 0;
  border-top: 1px solid var(--vh-line);
  border-radius: 0;
  background: none;
}
:is(body.lgw-on, body.lgm-on) .lgw-order-facts.lgw-rv-block { margin-top: 1.6rem; }
:is(body.lgw-on, body.lgm-on) .lgw-review-locations { display: block; margin: 0; }
:is(body.lgw-on, body.lgm-on) :is(.lgw-review-locations, .lgw-gl-review) > .lgw-rv-block:last-of-type {
  border-bottom: 1px solid var(--vh-line);
}

/* the head row: the label, then the block's quiet actions at the right */
:is(body.lgw-on, body.lgm-on) .lgw-rv-head {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .4rem 1.2rem;
  min-height: var(--st-control-min, 4.4rem);
  margin: 0 0 .4rem;
}
:is(body.lgw-on, body.lgm-on) .lgw-rv-label {
  flex: 1 1 auto;
  min-width: 0;
  margin: 0;
  font: 500 1.4rem/1.3 var(--vh-display);
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--vh-ink);
  overflow-wrap: anywhere;
}
/* one quiet text button for every action in a block (Edit garment, Edit
   location, Remove unused spot, Edit artwork, Edit text, Add artwork): no
   box, a hover fill, the touch height kept. Its padding hangs past the right
   edge so its words line up with the block's. */
:is(body.lgw-on, body.lgm-on) .lgw-rv-act {
  display: inline-flex;
  flex: 0 0 auto;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  min-width: var(--st-control-min, 4.4rem);
  min-height: var(--st-control-min, 4.4rem);
  margin: 0 -1.2rem 0 0;
  padding: .9rem 1.2rem;
  border: 1px solid transparent;
  border-radius: var(--sv-r-ctl, 8px);
  background: transparent;
  box-shadow: none;
  color: var(--vh-ink);
  font: 500 var(--st-utility-size, 1.4rem)/1.35 var(--vh-body);
  letter-spacing: normal;
  text-transform: none;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  transition: none;
}
@media (hover: hover) {
  :is(body.lgw-on, body.lgm-on) .lgw-rv-act:hover { background: var(--st-control-hover, #F1EDE4); }
}

/* the facts: label, value */
:is(body.lgw-on, body.lgm-on) .lgw-rv-facts {
  display: flex;
  flex-direction: column;
  gap: .8rem;
  margin: 0;
  padding: 0;
}
body.lgw-on .lgw-rv-row {
  display: grid;
  grid-template-columns: 7.6rem minmax(0, 1fr);
  column-gap: 1.2rem;
  align-items: baseline;
}
body.lgm-on .lgw-rv-row { display: block; }
:is(body.lgw-on, body.lgm-on) .lgw-rv-k {
  margin: 0;
  font: 400 1.4rem/1.5 var(--vh-body);
  letter-spacing: normal;
  text-transform: none;
  color: var(--vh-muted);
}
:is(body.lgw-on, body.lgm-on) .lgw-rv-v {
  min-width: 0;
  margin: 0;
  font: 400 1.5rem/1.5 var(--vh-body);
  letter-spacing: normal;
  text-transform: none;
  text-align: left;
  color: var(--vh-ink);
  overflow-wrap: anywhere;
}
:is(body.lgw-on, body.lgm-on) :is(.lgw-rv-num, .lgw-rv-v .lgw-gp-money) {
  font: 500 1.6rem/1.3 var(--vh-display);
  letter-spacing: .01em;
}

/* a piece: its name, size and any note, its own quiet action at the right
   (centred on the name's line) */
:is(body.lgw-on, body.lgm-on) .lgw-rv-piece {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: .4rem 1.2rem;
}
:is(body.lgw-on, body.lgm-on) .lgw-rv-piece-words { flex: 1 1 auto; min-width: 0; }
:is(body.lgw-on, body.lgm-on) .lgw-rv-piece-words > p { margin: 0; }
:is(body.lgw-on, body.lgm-on) .lgw-review-status { margin-top: .4rem; font-size: 1.4rem; }
:is(body.lgw-on, body.lgm-on) .lgw-review-piece-actions { display: flex; flex: 0 0 auto; margin: -1.1rem 0; }
:is(body.lgw-on, body.lgm-on) .lgw-review-piece--empty .lgw-review-piece-name { color: var(--vh-muted); }

/* a location's last row: Threads, a dot and name per thread */
:is(body.lgw-on, body.lgm-on) .lgw-review-threads .lgw-rv-v {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .4rem 1.4rem;
}
/* the name carries the chip's baseline, so Threads lines up with it */
:is(body.lgw-on, body.lgm-on) .lgw-review-thread { display: inline-flex; align-items: baseline; gap: .6rem; min-width: 0; }
:is(body.lgw-on, body.lgm-on) .lgw-review-swdot { display: block; flex: 0 0 auto; align-self: center; width: 1.4rem; height: 1.4rem; }
:is(body.lgw-on, body.lgm-on) .lgw-review-thread-nm { overflow-wrap: anywhere; }
:is(body.lgw-on, body.lgm-on) .lgw-review-threads-note { margin: 0; color: var(--vh-muted); }

/* several garments: the same block per garment, its photo at the head row's
   right; the garment on the canvas carries the selected-swatch ring */
body.lgw-on .lgw-gl-review { margin: 1.6rem 0 2rem; }
body.lgw-on .lgw-gl-review[hidden] { display: none; }
body.lgw-on .lgw-gl-review-t {
  margin: 0 0 1.2rem;
  font: 600 1.6rem/1.3 var(--sv-title-font, var(--vh-display));
  color: var(--vh-ink);
}
body.lgw-on .lgw-gl-row { cursor: pointer; }
body.lgw-on .lgw-gl-row .lgw-gl-ph { width: 4.4rem; height: 4.4rem; }
body.lgw-on .lgw-gl-row--on .lgw-gl-ph { box-shadow: 0 0 0 2px var(--sv-panel, #FDFCF7), 0 0 0 4px var(--vh-ink); }
body.lgw-on .lgw-gl-fee { margin: 1.2rem 0 0; font: 400 1.3rem/1.5 var(--vh-body); color: var(--vh-ink); }

/* ===========================================================================
   lg2_phone.css: the sizes pages below 1100 wide, Design 2 "The stage"
   (Joel 2026-09-30): the one garment page (drive B1, logo_quantities.html)
   and the several garments page (drive B2, logo_quantities_lines.html, its
   own parts at the foot of this file). Built only from the PC tool's kit
   (briefs PLAN.md section 1): Oswald titles and money, Cooper Hewitt text,
   white cards on hairlines, 10 / 8 / 6 px corners, the ink main button, the
   check badge, the dotted canvas. No Bevan, no numbered sections, no ruled
   black lines, no square letterpress boxes, no Palette M.

   At 1100 and up every .lgq part is display:none and nothing else here
   applies, so the page above (vintage.css .lg2-*) is unchanged. Below 1100
   the old matrix stays laid out but invisible: its inputs are the one
   source of truth that the price call, the text thread re-check and
   Checkout read, and js/lg2_phone.js sets them.
   =========================================================================== */
/* the studio below 1100 (studio_sheet.css, Design 2 "The sheet") hosts the
   same tokens on its workspace (.lgm-ws) and its sheets over the page
   (.lgm-q), so its bar and sheets are this kit */
.lg2, .lgm-ws, .lgm-q {
  --q-ink: #181510; --q-panel: #FDFCF7; --q-white: #FFFFFF; --q-cream: #FAF6EE;
  --q-hair: #E6E1D8; --q-hair-strong: #CFCAC0; --q-key-edge: #8A867E;
  --q-muted: #59554E; --q-quiet: #6B675F; --q-sel: #F6F3EC; --q-hover: #F1EDE4;
  --q-ok: #3E6448; --q-stop: #9B3D32; --q-off: #A09B93; --q-press: #2C271F;
  --q-display: 'Oswald', 'Arial Narrow', sans-serif;
  --q-body: 'Cooper Hewitt', 'DM Sans', system-ui, sans-serif;
  --q-sh-stage: 0 12px 34px rgba(24, 21, 16, .07);
  --q-sh-tool: 0 6px 18px rgba(24, 21, 16, .07);
  --q-sh-bar: 0 -6px 18px rgba(24, 21, 16, .07);
  --q-sh-sheet: 0 30px 80px rgba(24, 21, 16, .38);
  --q-veil: rgba(24, 21, 16, .46);
  --q-ease: cubic-bezier(.2, .7, .2, 1);
  --q-tick: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 6.2l2.2 2.2 4.8-5' fill='none' stroke='%23FDFCF7' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  --q-gutter: 1.6rem;
  --q-bar-h: 7.2rem;
}

/* ── which page shows ─────────────────────────────────────────────────── */
@media (min-width: 1100px) {
  .lgq, .lgq-bar, .lgq-veil, .lgq-sheet { display: none !important; }
}
@media (max-width: 1099.98px) {
  .lg2 { position: relative; }
  .lg2 > .lg2-head, .lg2 > .lg2-reorder-banner, .lg2 > .lg2-bar { display: none !important; }
  /* laid out, invisible, out of the flow: the inputs keep their boxes */
  .lg2 > main.lg2-shell { position: absolute; left: 0; top: 0; width: 100%; height: 1px; overflow: hidden;
    visibility: hidden; pointer-events: none; }
  /* room under the footer for the pinned bar (the bar's own 7.2rem: the
     --q-bar-h custom property lives on .lg2, below body, so body cannot
     read it) */
  body { padding-bottom: 7.2rem; }
}

/* ── the kit on this page ─────────────────────────────────────────────── */
.lgq, .lgq-bar, .lgq-sheet { font: 400 1.4rem/1.45 var(--q-body); color: var(--q-ink); -webkit-font-smoothing: antialiased; }
.lgq *, .lgq-bar *, .lgq-sheet * { box-sizing: border-box; }
/* zero specificity, so every button's own rule below wins */
:where(.lgq, .lgq-bar, .lgq-sheet) button { font: inherit; color: inherit; cursor: pointer; -webkit-tap-highlight-color: transparent; }
.lgq :focus-visible, .lgq-bar :focus-visible, .lgq-sheet :focus-visible { outline: 2px solid var(--q-ink); outline-offset: 2px; }
.lgq-money { font-family: var(--q-display); font-weight: 500; font-variant-numeric: tabular-nums; letter-spacing: .02em; }
.lgq [hidden], .lgq-bar [hidden], .lgq-sheet [hidden] { display: none !important; }

/* the secondary button (Edit design) */
.lgq-btn-sec { display: inline-flex; align-items: center; justify-content: center; gap: .8rem; height: 4.4rem; padding: 0 1.4rem;
  border: 1px solid var(--q-hair-strong); border-radius: 8px; background: var(--q-panel); color: var(--q-ink);
  font: 600 1.5rem/1 var(--q-body); text-decoration: none; white-space: nowrap; transition: border-color 120ms ease, background 120ms ease; }
.lgq-btn-sec:hover { border-color: var(--q-ink); }
.lgq-btn-sec:active { border-color: var(--q-ink); background: var(--q-hover); }

/* ── the canvas: dotted cream, the garment on its white stage ─────────── */
.lgq-canvas { padding: 1.2rem var(--q-gutter) 0;
  background: var(--q-cream) radial-gradient(rgba(24, 21, 16, .045) 1px, transparent 1.2px); background-size: 22px 22px; }
.lgq-insp { display: flex; gap: 1.6rem; }
.lgq-stage { --st-w: 104; --st-h: 128; position: relative; display: flex; flex: none; width: calc(var(--st-w) * .1rem);
  height: calc(var(--st-h) * .1rem); padding: .6rem; overflow: hidden; background: var(--q-white);
  border: 1px solid var(--q-hair); border-radius: 10px; box-shadow: var(--q-sh-stage); }
.lgq-stage::after { content: ""; position: absolute; top: 0; right: 0; z-index: 2; width: 2rem; height: 2rem;
  background: var(--q-ink) var(--q-tick) center / 1.2rem 1.2rem no-repeat; border-bottom-left-radius: 6px;
  transform: scale(0); opacity: 0; transform-origin: top right; }
.lgq-stage.ready::after { transform: none; opacity: 1; }
.lgq-stage.pop::after { animation: lgq-pop 280ms var(--q-ease); }
@keyframes lgq-pop { 0% { transform: scale(0); opacity: 0; } 70% { transform: scale(1.12); opacity: 1; } 100% { transform: none; opacity: 1; } }
.lgq-st-ph { position: relative; display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;
  transition: opacity 150ms ease; }
.lgq-st-ph.fade { opacity: 0; transition: none; }
.lgq-mock { display: block; max-width: 100%; max-height: 100%; object-fit: contain; }
/* the design tile (shared/_lg2_design_tile.html) moves in here when there is
   no studio picture for this colour: scaled from its own 124 px */
.lgq-tile-slot { --tw: 92; position: relative; display: block; width: calc(var(--tw) * .1rem); height: calc(var(--tw) * .1rem); }
.lgq-tile-slot:empty { display: none; }
.lgq-tile-slot .lg2-tile { position: absolute; left: 0; top: 0; transform: scale(calc(var(--tw) / 124)); transform-origin: 0 0; }
.lgq-insp-t { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; justify-content: center; }
.lgq-name { margin: 0; font: 600 2rem/2.4rem var(--q-display); letter-spacing: .005em; color: var(--q-ink); text-transform: none; }
.lgq-meta { margin: .2rem 0 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); overflow-wrap: anywhere; }
.lgq-meta--spot { margin-top: 0; }
.lgq-price { display: flex; align-items: baseline; gap: .6rem; margin: .4rem 0 0; }
.lgq-pr { font-size: 2rem; line-height: 2.4rem; color: var(--q-ink); }
.lgq-each { font: 400 1.2rem/1.6rem var(--q-body); color: var(--q-quiet); }
.lgq-edit { align-self: flex-start; margin-top: .8rem; }

/* Front / Back, only for a design on both sides: the kit's pair of choices */
.lgq-sides { display: flex; gap: .8rem; margin-top: 1.2rem; }
.lgq-sides button, .lgq-pair-b { min-height: 4.4rem; padding: 0 1.4rem; border: 1px solid var(--q-hair-strong); border-radius: 8px;
  background: var(--q-white); font: 500 1.3rem/1.2 var(--q-body); color: var(--q-ink); transition: background 120ms ease, border-color 120ms ease; }
.lgq-sides button[aria-pressed="true"], .lgq-pair-b[aria-pressed="true"] { background: var(--q-ink); border-color: var(--q-ink); color: #FFFFFF; }

/* a quiet notice: cream, 6 px corners, the small ink dot (PLAN 8.2) */
.lgq-notice { position: relative; margin: 1.2rem 0 0; padding: .8rem 1.2rem .8rem 2.6rem; background: var(--q-cream);
  border: 1px solid var(--q-hair); border-radius: 6px; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-ink); }
.lgq-notice::before { content: ""; position: absolute; left: 1.2rem; top: 1.4rem; width: 7px; height: 7px; border-radius: 99px; background: var(--q-ink); }
.lgq-notice b { font-weight: 600; }
.lgq-slot:empty { display: none; }
/* ── the price track on a floating white plate ────────────────────────── */
.lgq-plate { position: relative; margin-top: 1.2rem; padding: 1.2rem 1.6rem; overflow: hidden; background: var(--q-white);
  border: 1px solid var(--q-hair); border-radius: 10px; box-shadow: var(--q-sh-tool); }
.lgq-track { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); column-gap: 4px; align-items: center; height: 8px; }
.lgq-tr-st { display: flex; gap: 2px; height: 4px; transition: gap 200ms var(--q-ease); }
.lgq-tr-st i { flex: 1 1 0; border-radius: 1px; background: var(--q-hair); transform-origin: left center; }
.lgq-tr-st i.on { background: var(--q-ink); }
.lgq-tr-st i.sew { animation: lgq-sew 120ms ease-out; }
@keyframes lgq-sew { from { transform: scaleX(.15); } to { transform: none; } }
.lgq-track.met .lgq-tr-st { gap: 0; }
.lgq-track.met .lgq-tr-st i { border-radius: 0; }
.lgq-track.met .lgq-tr-st i:first-child { border-radius: 2px 0 0 2px; }
.lgq-track.met .lgq-tr-st i:last-child { border-radius: 0 2px 2px 0; }
.lgq-tr-ln { position: relative; height: 4px; border-radius: 2px; background: var(--q-hair); overflow: hidden; }
.lgq-tr-ln b { position: absolute; left: 0; top: 0; bottom: 0; width: 0; background: var(--q-ink); border-radius: 2px; transition: width 200ms var(--q-ease); }
.lgq-tr-labels { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); column-gap: 4px; margin-top: .8rem; }
.lgq-tr-l { display: flex; align-items: baseline; justify-content: flex-end; gap: 4px; white-space: nowrap; }
.lgq-tr-l em { font: 500 1.2rem/1.6rem var(--q-display); font-style: normal; letter-spacing: .04em; color: var(--q-quiet); }
.lgq-tr-l span { font: 500 1.4rem/1.8rem var(--q-display); font-variant-numeric: tabular-nums; letter-spacing: .02em; color: var(--q-muted); }
.lgq-tr-l.on em, .lgq-tr-l.on span { color: var(--q-ink); }
.lgq-tr-l.on span { font-weight: 600; }
.lgq-status { margin: .4rem 0 0; font: 400 1.4rem/2rem var(--q-body); color: var(--q-muted); border-radius: 4px; }
.lgq-status b { font-weight: 600; color: var(--q-ink); }
.lgq-status .ok { color: var(--q-ok); font-weight: 700; margin-right: 4px; }
.lgq-status.pulse { animation: lgq-pulse 600ms ease; }
@keyframes lgq-pulse { 0%, 100% { background: transparent; } 30% { background: var(--q-hover); } }
.lgq-price-wait .lgq-bar-total, .lgq-price-wait .lgq-sum-total { opacity: .45; transition: opacity 150ms ease; }

/* ── colour tabs: the one in use is a panel coloured tab joined to the panel ── */
.lgq-ctabs { display: flex; align-items: flex-end; gap: .8rem; margin: 1.2rem calc(-1 * var(--q-gutter)) 0; padding: 0 var(--q-gutter);
  overflow-x: auto; scrollbar-width: none; }
.lgq-ctabs::-webkit-scrollbar { display: none; }
.lgq-ctab { position: relative; display: inline-flex; align-items: center; gap: .8rem; flex: none; height: 4.4rem; margin-bottom: 4px;
  padding: 0 1.4rem 0 1.2rem; background: var(--q-white); border: 1px solid var(--q-hair-strong); border-radius: 8px;
  color: var(--q-ink); font: 600 1.4rem/1 var(--q-body); white-space: nowrap; }
.lgq-ctab.on { z-index: 1; height: 5.2rem; margin-bottom: -1px; padding-bottom: 4px; background: var(--q-panel);
  border-color: var(--q-hair); border-bottom-color: var(--q-panel); border-radius: 10px 10px 0 0; }
.lgq-ct-c { font: 500 1.2rem/1 var(--q-body); color: var(--q-muted); font-variant-numeric: tabular-nums; }
.lgq-ctab.on .lgq-ct-c { color: var(--q-ink); }
.lgq-ctab .lgq-chev-s { width: 6px; height: 6px; margin: -3px 0 0 2px; border-right: 1.5px solid var(--q-ink); border-bottom: 1.5px solid var(--q-ink); transform: rotate(45deg); }
.lgq-ctab--pick .lgq-ct-n { color: var(--q-muted); font-weight: 500; }
.lgq-ctab-add { display: inline-flex; align-items: center; gap: .8rem; flex: none; height: 4.4rem; margin-bottom: 4px; padding: 0 1.4rem;
  border: 1px dashed var(--q-hair-strong); border-radius: 8px; background: transparent; color: var(--q-ink); font: 600 1.4rem/1 var(--q-body); }
.lgq-ctab-add:active { border-style: solid; border-color: var(--q-ink); }
.lgq-ctab-add[aria-disabled="true"] { opacity: .45; }
.lgq-swatch { display: inline-block; flex: none; width: 1.6rem; height: 1.6rem; border-radius: 50%; background: var(--q-hair) center / cover no-repeat;
  box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22); }
.lgq-swatch--none { background: transparent; box-shadow: inset 0 0 0 1px var(--q-hair-strong); border: 1px dashed var(--q-hair-strong); }
.lgq-plus { position: relative; width: 12px; height: 12px; flex: none; }
.lgq-plus::before, .lgq-plus::after { content: ""; position: absolute; left: 0; top: 5px; width: 12px; height: 2px; background: currentColor; border-radius: 1px; }
.lgq-plus::after { transform: rotate(90deg); }

/* ── the panel: this colour's sizes as rows (the PC Text panel pattern) ── */
.lgq-panel { position: relative; padding: .4rem var(--q-gutter) 4rem; background: var(--q-panel); border-top: 1px solid var(--q-hair); }
.lgq-srow { display: flex; align-items: center; justify-content: space-between; gap: 1.2rem; min-height: 5.6rem; padding: .4rem 0; }
.lgq-srow + .lgq-srow { border-top: 1px solid var(--q-hair); }
.lgq-sr-l { display: flex; flex-direction: column; min-width: 0; }
.lgq-sr-s { font: 600 1.5rem/2rem var(--q-body); color: var(--q-ink); }
.lgq-sr-x { font: 400 1.2rem/1.6rem var(--q-body); color: var(--q-quiet); }
.lgq-quick { display: flex; gap: .8rem; }
.lgq-quick button { height: 4.4rem; min-width: 5.6rem; padding: 0 1.2rem; border: 1px solid var(--q-hair-strong); border-radius: 8px;
  background: var(--q-panel); font: 500 1.6rem/1 var(--q-display); font-variant-numeric: tabular-nums; letter-spacing: .02em;
  transition: background 120ms ease, border-color 120ms ease; -webkit-touch-callout: none; }
.lgq-quick button[aria-pressed="true"] { background: var(--q-ink); border-color: var(--q-ink); color: #FFFFFF; }

/* the size stepper: the thread count pill at the tool key height */
.lgq-step { display: inline-flex; align-items: stretch; width: 13.6rem; height: 4.8rem; flex: none; background: var(--q-white);
  border: 1px solid var(--q-hair-strong); border-radius: 10px; overflow: hidden; transition: border-color 120ms ease; }
.lgq-step.has { border-color: var(--q-ink); }
.lgq-step:focus-within { outline: 2px solid var(--q-ink); outline-offset: 2px; }
.lgq-key { position: relative; flex: 0 0 4.4rem; padding: 0; border: 0; background: transparent; touch-action: manipulation;
  -webkit-user-select: none; user-select: none; -webkit-touch-callout: none; transition: background 120ms ease; }
.lgq-key::before, .lgq-key.plus::after { content: ""; position: absolute; left: 50%; top: 50%; width: 14px; height: 2px; margin: -1px 0 0 -7px;
  background: var(--q-ink); border-radius: 1px; }
.lgq-key.plus::after { transform: rotate(90deg); }
.lgq-key.flash { background: var(--q-hover); }
.lgq-key.dim { cursor: default; }
.lgq-key.dim::before { opacity: .28; }
.lgq-key:focus-visible { outline-offset: -2px; }
.lgq-num { position: relative; flex: 1 1 auto; min-width: 0; }
.lgq-num::before, .lgq-num::after { content: ""; position: absolute; top: 1.2rem; bottom: 1.2rem; width: 1px; background: var(--q-hair); pointer-events: none; }
.lgq-num::before { left: 0; }
.lgq-num::after { right: 0; }
.lgq-num input { display: block; width: 100%; height: 100%; margin: 0; padding: 0; border: 0; border-radius: 0; background: transparent;
  text-align: center; font: 500 1.8rem/1 var(--q-display); font-variant-numeric: tabular-nums; letter-spacing: .02em; color: var(--q-ink);
  caret-color: var(--q-ink); -moz-appearance: textfield; appearance: none; box-shadow: none; }
.lgq-num input:focus { outline: none; }
.lgq-num input.zero { color: var(--q-quiet); font-weight: 400; }
.lgq-cap { margin: .8rem 0 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
.lgq-cap a { color: var(--q-ink); font-weight: 600; }

/* the foot of the panel: Size guide on the left, Remove on the right */
.lgq-pfoot { display: flex; align-items: center; justify-content: space-between; gap: 1.2rem; min-height: 4.8rem; border-top: 1px solid var(--q-hair); }
.lgq-p-rm { display: flex; align-items: center; gap: 1.6rem; }
.lgq-link { min-height: 4.4rem; display: inline-flex; align-items: center; padding: 0; border: 0; background: none; color: var(--q-muted);
  font: 400 1.3rem/1 var(--q-body); text-decoration: underline; text-underline-offset: .2em; }
.lgq-link--ink { color: var(--q-ink); font-weight: 600; }
.lgq-red { min-height: 4.4rem; padding: 0 2px; border: 0; background: none; color: var(--q-stop); font: 500 1.3rem/1 var(--q-body); }
.lgq-red:hover { text-decoration: underline; }
/* confirm in place, as the PC tool asks (Remove / Keep) */
.lgq-confirm { display: flex; align-items: center; flex-wrap: wrap; gap: .8rem 1.2rem; min-height: 4.8rem; padding: .8rem 0; }
.lgq-cf-q { flex: 1 1 16rem; margin: 0; font: 600 1.6rem/2.2rem var(--q-display); letter-spacing: .005em; }
.lgq-cf-acts { display: flex; gap: .8rem; }
.lgq-cf-yes, .lgq-cf-no { height: 4.4rem; padding: 0 1.4rem; border-radius: 8px; font: 600 1.4rem/1 var(--q-body); }
.lgq-cf-yes { border: 1px solid var(--q-stop); background: var(--q-stop); color: #FFFFFF !important; }
.lgq-cf-no { border: 1px solid var(--q-key-edge); background: var(--q-panel); }

/* ── rows: label on the left, the control on the right, hairlines between ── */
.lgq-rows { display: block; width: 100%; background: var(--q-white); border: 1px solid var(--q-hair); border-radius: 10px; }
.lgq-row { display: flex; align-items: center; gap: 1.2rem; width: 100%; min-height: 5.6rem; margin: 0; padding: .8rem 1.6rem;
  border: 0; background: none; text-align: left; color: var(--q-ink); }
.lgq-row + .lgq-row, .lgq-row + .lgq-row-open, .lgq-row-open + .lgq-row { border-top: 1px solid var(--q-hair); }
.lgq-row-t { flex: 1 1 auto; min-width: 0; font: 600 1.5rem/2rem var(--q-body); color: var(--q-ink); }
.lgq-row-s { display: block; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
.lgq-chev { flex: none; width: 8px; height: 8px; margin: 0 4px 3px 0; border-right: 2px solid var(--q-ink); border-bottom: 2px solid var(--q-ink);
  transform: rotate(45deg); transition: transform 120ms ease; }
.lgq-row[aria-expanded="true"] .lgq-chev { transform: rotate(-135deg); margin-bottom: -3px; }
.lgq-chev--r { transform: rotate(-45deg); margin: 0 2px 0 0; }
.lgq-row-open { padding: 1.2rem 1.6rem 1.6rem; }
.lgq-row-open .lgq-row-s { margin-top: .8rem; }
.lgq-style { margin-top: 1.6rem; }
.lgq-row--pair { flex-wrap: wrap; }
.lgq-pair { display: flex; gap: .8rem; flex-wrap: wrap; }
.lgq-pair--grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); width: 100%; }
.lgq-sum-row { margin-top: 1.6rem; padding: 0; text-align: left; }
.lgq-sum-row .lgq-row { pointer-events: none; }
.lgq-sum-total { font-size: 1.6rem; line-height: 2rem; }

/* the proof promise: the info block, with the notice's quiet ink dot (never
   a tick box a customer could think to press) */
.lgq-tan { background: var(--q-cream); border: 1px solid var(--q-hair); border-radius: 10px; padding: 1.6rem; }
.lgq-promise { display: flex; gap: 1.2rem; margin-top: 1.6rem; }
.lgq-p-mark { flex: none; width: 7px; height: 7px; margin-top: .7rem; border-radius: 99px; background: var(--q-ink); }
.lgq-p-body { min-width: 0; }
.lgq-promise .lg2-os-assure { padding: 0; font: 400 1.4rem/2rem var(--q-body); color: var(--q-muted); }
.lgq-promise .lg2-os-assure strong { display: block; margin-bottom: .4rem; font: 600 1.5rem/2rem var(--q-body); color: var(--q-ink); }
.lgq-promise .lg2-os-reorder { margin-top: .8rem; padding: 0; border: 0; background: none; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
.lgq-how { margin-top: 1.6rem; }
/* What happens after you pay: the page's own How this works steps, read as
   a list (their numerals are not shown on this layout) */
.lgq-how .lg2-px { display: block; border: 0; border-radius: 0; background: none; }
.lgq-how .lg2-px-step { position: relative; display: block; padding: 0 0 0 1.6rem; border: 0; font: 400 1.4rem/2rem var(--q-body); color: var(--q-muted); }
.lgq-how .lg2-px-step + .lg2-px-step { margin-top: .8rem; }
.lgq-how .lg2-px-step::before { content: ""; position: absolute; left: 0; top: .7rem; width: 6px; height: 6px; border-radius: 99px; background: var(--q-ink); }
.lgq-how .lg2-px-step .n { display: none; }
.lgq-how .lg2-px-step .t { display: inline; margin: 0; font: 600 1.4rem/2rem var(--q-body); letter-spacing: 0; color: var(--q-ink); }
.lgq-how .lg2-px-step .t::after { content: ". "; }
.lgq-how .lg2-px-step .d { display: inline; margin: 0; font: inherit; color: inherit; }
.lgq-how .lg2-gate { margin: 1.2rem 0 0; padding: 0; border: 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
.lgq-how .lg2-gate strong { color: var(--q-ink); font-weight: 600; }
.lgq-how .lg2-escalate { margin: 1.2rem 0 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
.lgq-how .lg2-escalate a { display: inline-flex; align-items: center; min-height: 4.4rem; color: var(--q-ink); font-weight: 600;
  text-decoration: underline; text-underline-offset: .2em; }

/* ── the bar: where you stand on the left, Check out on the right ─────── */
.lgq-bar { position: fixed; left: 0; right: 0; bottom: 0; z-index: 50; display: flex; align-items: center; gap: 1.2rem;
  height: var(--q-bar-h); padding: 1.2rem var(--q-gutter); background: var(--q-panel); border-top: 1px solid var(--q-hair); box-shadow: var(--q-sh-bar); }
.lgq-bar-l { flex: 1 1 auto; min-width: 0; height: 4.8rem; display: flex; flex-direction: column; justify-content: center;
  margin: 0; padding: 0; border: 0; background: none; text-align: left; }
.lgq-bar-top { display: flex; align-items: center; gap: .6rem; min-width: 0; }
.lgq-bar-total { font-size: 2.2rem; line-height: 2.6rem; color: var(--q-ink); transition: opacity 150ms ease; }
.lgq-bar-words { font: 600 1.6rem/2.6rem var(--q-body); color: var(--q-ink); }
.lgq-bar-up { width: 16px; height: 16px; display: grid; place-items: center; flex: none; }
.lgq-bar-up::before { content: ""; width: 7px; height: 7px; margin-top: 4px; border-left: 2px solid var(--q-ink); border-top: 2px solid var(--q-ink); transform: rotate(45deg); }
.lgq-bar-line { display: block; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.lgq-bar-line.need { color: var(--q-ink); font-weight: 500; }
.lgq-bar-line.err { color: var(--q-stop); font-weight: 500; }
.lgq-mini-spin { display: inline-block; width: 10px; height: 10px; margin-right: 6px; vertical-align: -1px; border: 1.5px solid var(--q-hair-strong);
  border-top-color: var(--q-ink); border-radius: 50%; animation: lgq-spin .8s linear infinite; }
.lgq-btn-main { display: inline-flex; align-items: center; justify-content: center; gap: .8rem; flex: 0 0 auto; min-width: 14.8rem; height: 4.8rem;
  padding: 0 2rem; border: 0; border-radius: 8px; background: var(--q-ink); color: #FFFFFF !important; font: 600 1.6rem/1 var(--q-body);
  white-space: nowrap; transition: background 150ms ease, transform 100ms ease; }
.lgq-btn-main:active { background: var(--q-press); transform: translateY(1px); }
.lgq-btn-main.off, .lgq-btn-main.off:active { background: var(--q-off); transform: none; cursor: default; }
.lgq-spin { width: 14px; height: 14px; border: 2px solid rgba(255, 255, 255, .35); border-top-color: #FFFFFF; border-radius: 50%; animation: lgq-spin .8s linear infinite; }
@keyframes lgq-spin { to { transform: rotate(360deg); } }
/* ── sheets: the picker sheet, rising from the bottom ─────────────────── */
.lgq-veil { position: fixed; inset: 0; z-index: 70; background: var(--q-veil); opacity: 0; pointer-events: none; transition: opacity 180ms var(--q-ease); }
.lgq-veil.on { opacity: 1; pointer-events: auto; }
.lgq-veil.under-bar { z-index: 45; }
.lgq-sheet { position: fixed; left: 0; right: 0; bottom: 0; z-index: 80; max-height: calc(100% - 8.8rem); overflow: auto; overscroll-behavior: contain;
  padding: .8rem var(--q-gutter) 2.4rem; background: var(--q-panel); border-radius: 16px 16px 0 0; box-shadow: var(--q-sh-sheet);
  transform: translateY(10px); opacity: 0; visibility: hidden;
  transition: transform 180ms var(--q-ease), opacity 180ms var(--q-ease), visibility 0s 180ms; }
.lgq-sheet.on { transform: none; opacity: 1; visibility: visible; transition: transform 180ms var(--q-ease), opacity 180ms var(--q-ease); }
.lgq-sheet:focus { outline: none; }
/* the receipt rises from the bar, which stays under it and keeps working */
.lgq-sheet--bar { bottom: var(--q-bar-h); z-index: 48; max-height: calc(100% - var(--q-bar-h) - 8.8rem); box-shadow: 0 -18px 44px rgba(24, 21, 16, .22); }
.lgq-grab { width: 36px; height: 4px; margin: 0 auto 1.2rem; border-radius: 2px; background: var(--q-hair-strong); }
.lgq-sheet-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1.2rem; }
.lgq-title { margin: 0; font: 600 2.4rem/2.8rem var(--q-display); letter-spacing: .005em; color: var(--q-ink); text-transform: none; }
.lgq-sub { margin: .4rem 0 1.6rem; font: 400 1.4rem/2rem var(--q-body); color: var(--q-muted); }
.lgq-x { display: grid; place-items: center; width: 4.4rem; height: 4.4rem; flex: none; padding: 0; border: 1px solid var(--q-hair); border-radius: 8px;
  background: var(--q-white); color: var(--q-ink); }
.lgq-x svg { width: 14px; height: 14px; }
.lgq-sheet-note { margin: 1.6rem 0 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }

/* the receipt: the order summary facts on the info block */
.lgq-receipt-tan { margin-top: .4rem; }
.lgq-facts { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: .8rem 1.6rem; margin: 0; }
.lgq-facts dt { margin: 0; font: 400 1.4rem/2rem var(--q-body); color: var(--q-ink); }
.lgq-facts dt small { display: block; font: 400 1.2rem/1.6rem var(--q-body); color: var(--q-quiet); }
.lgq-facts dd { margin: 0; text-align: right; font: 500 1.5rem/2rem var(--q-display); font-variant-numeric: tabular-nums; letter-spacing: .02em; color: var(--q-ink); white-space: nowrap; }
.lgq-facts dd.word { font: 500 1.4rem/2rem var(--q-body); letter-spacing: 0; }
.lgq-facts .rule { grid-column: 1 / -1; height: 1px; margin: .4rem 0; background: var(--q-hair); }
.lgq-facts dt.tot { font: 600 1.5rem/2.8rem var(--q-body); }
.lgq-facts dd.tot { font: 600 2.4rem/2.8rem var(--q-display); }
.lgq-facts .nudge { grid-column: 1 / -1; margin: 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
.lgq-err { margin-top: 1.2rem; padding: 1.2rem 1.6rem; border: 1px solid var(--q-hair); border-radius: 10px; background: var(--q-white); }
.lgq-err p { margin: 0; font: 500 1.4rem/2rem var(--q-body); color: var(--q-stop); }
.lgq-err-acts { display: flex; flex-wrap: wrap; gap: 0 1.6rem; }
.lgq-extras { margin-top: 1.6rem; }
.lgq-tick { width: 2.4rem; height: 2.4rem; flex: none; border: 1px solid var(--q-hair-strong); border-radius: 6px; background: var(--q-white);
  transition: background 120ms ease, border-color 120ms ease; }
[aria-pressed="true"] > .lgq-tick { border-color: var(--q-ink); background: var(--q-ink) var(--q-tick) center / 1.4rem 1.4rem no-repeat; }
.lgq-field { display: block; width: 100%; min-height: 9.2rem; padding: 1rem 1.2rem; border: 1px solid var(--q-hair-strong); border-radius: 8px;
  background: var(--q-white); font: 400 1.5rem/1.4 var(--q-body); color: var(--q-ink); resize: vertical; }
.lgq-field:focus { outline: 2px solid var(--q-ink); outline-offset: 1px; }
.lgq-count { margin: .6rem 0 0; text-align: right; font: 500 1.2rem/1.6rem var(--q-display); letter-spacing: .1em; text-transform: uppercase; color: var(--q-quiet); }
.lgq-lbl { display: block; margin: 0 0 .6rem; font: 600 1.3rem/1.8rem var(--q-body); }

/* the colour sheet: the garment's colour dots */
.lgq-sw-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1.6rem .4rem; }
.lgq-sw-pick { display: flex; flex-direction: column; align-items: center; gap: 1rem; min-height: 8.4rem; padding: .6rem .2rem .4rem;
  border: 0; border-radius: 8px; background: none; }
.lgq-sw-pick .lgq-swatch { position: relative; width: 4rem; height: 4rem; transition: transform 120ms ease; }
.lgq-sw-pick:active .lgq-swatch { transform: scale(1.08); }
.lgq-sw-pick.cur .lgq-swatch { box-shadow: 0 0 0 3px var(--q-panel), 0 0 0 5px var(--q-ink), inset 0 0 0 1px rgba(24, 21, 16, .22); }
.lgq-sw-pick.added .lgq-swatch::after { content: ""; position: absolute; inset: 0; border-radius: 50%; background: rgba(24, 21, 16, .55) var(--q-tick) center / 1.8rem 1.8rem no-repeat; }
.lgq-sw-nm { font: 400 1.3rem/1.6rem var(--q-body); color: var(--q-muted); text-align: center; }
.lgq-sw-pick.cur .lgq-sw-nm { color: var(--q-ink); font-weight: 600; }
.lgq-sw-pick[aria-disabled="true"] { cursor: default; }
.lgq-sw-pick[aria-disabled="true"] .lgq-sw-nm { color: var(--q-quiet); }

/* the size guide table */
.lgq-sz-h { margin: 1.6rem 0 .4rem; font: 600 1.7rem/2.2rem var(--q-display); letter-spacing: .005em; }
.lgq-sz { width: 100%; border-collapse: collapse; font: 400 1.4rem/2rem var(--q-body); }
.lgq-sz th, .lgq-sz td { padding: 1rem .4rem; text-align: right; border-top: 1px solid var(--q-hair); }
.lgq-sz thead th { border-top: 0; padding-top: 0; font: 500 1.2rem/1.6rem var(--q-display); letter-spacing: .08em; text-transform: uppercase; color: var(--q-quiet); }
.lgq-sz th:first-child, .lgq-sz td:first-child { text-align: left; font-weight: 600; }
.lgq-sz td { font-family: var(--q-display); font-weight: 500; font-variant-numeric: tabular-nums; }

/* ── the rarer page parts, moved here from the page above (same elements) ── */
/* stitched width, 90 to 110 per cent (reorders): the kit's width stepper row */
.lgq-slot .lg2-rb-scale { display: flex; align-items: center; flex-wrap: wrap; gap: .8rem 1.2rem; margin-top: 1.2rem; padding: .8rem 1.2rem;
  background: var(--q-white); border: 1px solid var(--q-hair); border-radius: 10px; }
.lgq-slot .lg2-rb-scale .lbl { flex: 1 1 auto; font: 600 1.5rem/2rem var(--q-body); letter-spacing: 0; text-transform: none; color: var(--q-ink); }
.lgq-slot .lg2-rb-scale .stepbtn { width: 4.4rem; height: 4.4rem; border-radius: 8px; border: 1px solid var(--q-hair-strong); background: var(--q-white);
  font: 500 2rem/1 var(--q-display); color: var(--q-ink); }
.lgq-slot .lg2-rb-scale .val { min-width: 11ch; font: 500 1.7rem/1 var(--q-display); text-align: center; }
.lgq-slot .lg2-rb-scale .reset { min-height: 4.4rem; font: 400 1.3rem/1 var(--q-body); color: var(--q-muted); }
.lgq-slot .lg2-rb-scale .hint { flex-basis: 100%; font: 400 1.2rem/1.6rem var(--q-body); color: var(--q-quiet); }
/* thread colours (reorders and locker applies with a stitch file) */
.lgq-slot .lg2-threads { margin-top: 1.2rem; padding: .8rem 1.2rem; background: var(--q-white); border: 1px solid var(--q-hair); border-radius: 10px; }
.lgq-slot .lg-threads-lbl, .lgq-slot .lg2-rt-lbl { padding: 0; background: none; font: 600 1.3rem/1.8rem var(--q-body); letter-spacing: 0; text-transform: none; color: var(--q-ink); }
.lgq-slot .lg-threads-row { justify-content: flex-start; gap: .6rem; margin-top: .6rem; padding: 0; background: none; border: 0; box-shadow: none; }
.lgq-slot .lg-ts-chip { padding: .6rem 1.2rem .6rem .6rem; border-color: var(--q-hair); font: 500 1.3rem/1 var(--q-body); color: var(--q-ink); }
.lgq-slot .lg-ts-chip.changed { box-shadow: 0 0 0 2px var(--q-panel), 0 0 0 3px var(--q-ink); }
.lgq-slot .lg-ts-dot { width: 1.8rem; height: 1.8rem; }
.lgq-slot .lg-threads-proof, .lgq-slot .lg-threads-note { margin: .6rem 0 0; padding: 0; background: none; font: 400 1.2rem/1.6rem var(--q-body); color: var(--q-quiet); }
.lgq-slot .lg-threads-err { font: 500 1.3rem/1.8rem var(--q-body); }
.lgq-slot .lg-threads-reset { min-height: 4.4rem; font: 500 1.3rem/1 var(--q-body); }
.lgq-slot .lg2-rt { margin: .8rem 0 0; padding: 0; gap: 0 .4rem; }
/* each colour's stitch colours: a 28 px dot drawn inside a 44 px target */
.lgq-slot .lg2-rt-sw { width: 4.4rem; height: 4.4rem; margin: 0; border: .8rem solid transparent;
  background-clip: padding-box !important; /* the engine paints an inline background shorthand */
  box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22); }
.lgq-slot .lg2-rt-sw:hover { transform: none; box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22); }
.lgq-slot .lg2-rt-sw.changed { box-shadow: inset 0 0 0 2px var(--q-ink), inset 0 0 0 3.5px var(--q-panel); }
.lgq-slot .lg2-rt-reset { min-height: 4.4rem; font: 400 1.3rem/1 var(--q-body); }
/* the text thread prompt (a text only order whose thread is not threaded) */
.lgq-slot .lg2-tprompt { margin-top: 1.6rem; padding: 1.2rem 1.6rem; background: var(--q-cream); border: 1px solid var(--q-hair); border-radius: 10px;
  font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-ink); }
.lgq-slot .lg2-tprompt button { min-height: 4.4rem; font-size: 1.3rem; }

@media (prefers-reduced-motion: reduce) {
  .lgq *, .lgq *::before, .lgq *::after, .lgq-bar *, .lgq-sheet, .lgq-sheet *, .lgq-veil, .lgq-stage::after {
    animation: none !important; transition: none !important; }
}
/* ── a tablet and the classic band (561 to 1099): the same page with more
   room. From 768 the stage card and the price track stay in view on the
   left, the colour tabs and their panel run down the right; the same pinned
   bar throughout. ── */
/* a big phone on its side or a small tablet: the phone column, centred */
@media (min-width: 561px) and (max-width: 767.98px) {
  .lg2 { --q-gutter: max(2.4rem, calc((100vw - 60rem) / 2)); }
  .lgq-sheet { left: 50%; right: auto; width: min(56rem, 100%); transform: translate(-50%, 10px); }
  .lgq-sheet.on { transform: translate(-50%, 0); }
}
@media (min-width: 768px) and (max-width: 1099.98px) {
  .lg2 { --q-gutter: 2rem; }
  .lgq { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); grid-template-rows: auto 1fr; column-gap: 2rem;
    align-items: start; padding: 2.4rem var(--q-gutter) 4.8rem;
    background: var(--q-cream) radial-gradient(rgba(24, 21, 16, .045) 1px, transparent 1.2px); background-size: 22px 22px; }
  .lgq-canvas { display: contents; }
  .lgq-left { grid-column: 1; grid-row: 1 / span 2; position: sticky; top: calc(var(--nav-height, 6.4rem) + 1.6rem); }
  .lgq-stage { --st-w: 136; --st-h: 168; }
  .lgq-tile-slot { --tw: 124; }
  .lgq-ctabs { grid-column: 2; grid-row: 1; margin: 0; padding: 0; }
  .lgq-panel { grid-column: 2; grid-row: 2; padding: .4rem 2rem 2.4rem; border: 1px solid var(--q-hair); border-radius: 0 10px 10px 10px; }
  .lgq-sheet { left: 50%; right: auto; width: min(56rem, 100%); transform: translate(-50%, 10px); }
  .lgq-sheet.on { transform: translate(-50%, 0); }
}

/* ===========================================================================
   The several garments page (drive B2, logo_quantities_lines.html): the same
   parts, plus the garment chips over the stage, a stage for a garment with no
   photo, and the names on each piece set in the kit.
   =========================================================================== */
/* the tool's garment chips over the canvas; ink is the one on the stage */
.lgq-gchips { display: flex; gap: .8rem; margin: 0 calc(-1 * var(--q-gutter)) 1.2rem; padding: 0 var(--q-gutter);
  overflow-x: auto; scrollbar-width: none; }
.lgq-gchips::-webkit-scrollbar { display: none; }
.lgq-gchip { display: inline-flex; align-items: center; gap: 1rem; flex: none; height: 4.8rem; padding: .4rem 1.4rem .4rem .4rem;
  background: var(--q-white); border: 1px solid var(--q-hair-strong); border-radius: 8px; color: var(--q-ink); text-align: left;
  transition: background 120ms ease, border-color 120ms ease; }
.lgq-gchip.on { background: var(--q-ink); border-color: var(--q-ink); color: #FFFFFF; }
.lgq-gc-ph { display: grid; place-items: center; width: 3.8rem; height: 3.8rem; flex: none; padding: 2px; overflow: hidden;
  background: var(--q-white); border: 1px solid var(--q-hair); border-radius: 4px; }
.lgq-gc-img { display: block; max-width: 100%; max-height: 100%; object-fit: contain; }
.lgq-gc-w { display: flex; flex-direction: column; align-items: flex-start; }
.lgq-gc-n { font: 600 1.3rem/1.6rem var(--q-display); letter-spacing: .04em; text-transform: uppercase; }
.lgq-gc-s { font: 400 1.2rem/1.6rem var(--q-body); color: var(--q-muted); white-space: nowrap; font-variant-numeric: tabular-nums; }
.lgq-gchip.on .lgq-gc-s { color: rgba(253, 252, 247, .78); }
.lgq-gc-ok { color: var(--q-ok); font-weight: 700; }
.lgq-gchip.on .lgq-gc-ok { color: #FFFFFF; }
/* a garment with no photo: its colour and its name on the white stage */
.lgq-st-none { display: flex; flex-direction: column; align-items: center; gap: .8rem; }
.lgq-st-none .lgq-swatch { width: 4rem; height: 4rem; }
.lgq-st-nm { font: 500 1.2rem/1.6rem var(--q-body); color: var(--q-quiet); }
/* names on each piece (PLAN 8.2): the page's own section, moved in below the
   sizes, set in the kit: a title, one card of rows, 46 px text boxes, no
   numbered head, no ruled line */
#lgq-names-slot .lg2-prs { margin: 2.4rem 0 0; }
/* polish 3 item 5: why the names hold Checkout, under the names */
#lgq-names-slot .lgq-prs-why { margin: 1.2rem 0 0; font: 400 1.4rem/2rem var(--q-body); color: var(--q-ink); text-wrap: pretty; }
#lgq-names-slot .lgq-prs-why[hidden] { display: none; }
#lgq-names-slot .lg2-sec-head { display: block; margin: 0; padding: 0; border: 0; }
#lgq-names-slot .lg2-sec-head .num, #lgq-names-slot .lg2-sec-head .s, #lgq-names-slot .lg2-prs-h,
#lgq-names-slot .lg2-prs-eyebrow { display: none; }
#lgq-names-slot .lg2-sec-head .t { display: block; font: 600 2rem/2.4rem var(--q-display); letter-spacing: .005em; color: var(--q-ink); }
#lgq-names-slot .lg2-prs-sub { max-width: none; margin: .4rem 0 1.2rem; font: 400 1.4rem/2rem var(--q-body); color: var(--q-muted); }
#lgq-names-slot .lg2-prs-card { background: var(--q-white); border: 1px solid var(--q-hair); border-radius: 10px; }
#lgq-names-slot .lg2-prs-card-head { min-height: 5.6rem; padding: .6rem 1.6rem; border-bottom: 1px solid var(--q-hair); }
#lgq-names-slot .lg2-prs-toggle { flex: 1 1 auto; justify-content: space-between; font: 600 1.5rem/2rem var(--q-body); color: var(--q-ink); }
/* the switch keeps its look and gets a 44 px target */
#lgq-names-slot .lg2-switch { width: 5.6rem; height: 4.4rem; margin-right: -.8rem; border-radius: 8px; background: transparent; }
#lgq-names-slot .lg2-switch::before { content: ""; position: absolute; left: .8rem; top: 1.1rem; width: 4rem; height: 2.2rem;
  border-radius: 99px; background: var(--q-hair-strong); transition: background 120ms ease; }
#lgq-names-slot .lg2-switch[aria-checked="true"]::before { background: var(--q-ink); }
#lgq-names-slot .lg2-switch .knob { z-index: 1; top: 1.35rem; left: 1.05rem; }
#lgq-names-slot .lg2-prs-piece { gap: 1.2rem; padding: 1.2rem 1.6rem; border-bottom: 1px solid var(--q-hair); }
#lgq-names-slot .lg2-prs-swatch { width: 4.8rem; height: 4.8rem; font-size: 1.2rem; }
#lgq-names-slot .lg2-prs-piece-t { font: 600 1.7rem/2.2rem var(--q-display); letter-spacing: .005em; text-transform: none; overflow-wrap: anywhere; }
#lgq-names-slot .lg2-prs-piece-s { font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
#lgq-names-slot .lg2-prs-price, #lgq-names-slot .lg2-prs-off, #lgq-names-slot .lg2-prs-empty { margin: 0; padding: 1.2rem 1.6rem;
  font: 400 1.4rem/2rem var(--q-body); font-style: normal; color: var(--q-muted); }
#lgq-names-slot .lg2-prs-price { border-bottom: 1px solid var(--q-hair); }
#lgq-names-slot .lg2-prs-tbl, #lgq-names-slot .lg2-prs-tbl tbody { display: block; width: 100%; }
#lgq-names-slot .lg2-prs-tbl[hidden], #lgq-names-slot .lg2-prs-tbl thead { display: none; }
#lgq-names-slot .lg2-prs-tbl tr.prs-line-hd { display: block; padding: 1.2rem 1.6rem .4rem; }
#lgq-names-slot .lg2-prs-tbl tr.prs-line-hd td { display: block; padding: 0; border: 0; background: none;
  font: 500 1.2rem/1.6rem var(--q-display); letter-spacing: .08em; text-transform: uppercase; color: var(--q-quiet); }
#lgq-names-slot .lg2-prs-tbl tr.prs-row { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; grid-template-areas: "sz pc ct" "in in in";
  align-items: center; gap: .6rem 1rem; padding: 1rem 1.6rem 1.2rem; border-bottom: 1px solid var(--q-hair); border-radius: 4px; }
#lgq-names-slot .lg2-prs-tbl tr.prs-row td { display: block; width: auto; padding: 0; border: 0; }
#lgq-names-slot .lg2-prs-tbl tr.prs-row td.sz { grid-area: sz; font: 600 1.5rem/2rem var(--q-body); }
#lgq-names-slot .lg2-prs-tbl tr.prs-row td.pc { grid-area: pc; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
#lgq-names-slot .lg2-prs-tbl tr.prs-row td.ct { grid-area: ct; }
#lgq-names-slot .lg2-prs-tbl tr.prs-row td:nth-child(3) { grid-area: in; }
#lgq-names-slot .prs-in { display: block; width: 100%; max-width: none; height: 4.6rem; padding: 0 1.2rem; border: 1px solid var(--q-hair-strong);
  border-radius: 8px; background: var(--q-white); font: 400 1.6rem/1.2 var(--q-body); color: var(--q-ink); }
#lgq-names-slot .prs-in:focus { outline: 2px solid var(--q-ink); outline-offset: 1px; border-color: var(--q-ink); }
#lgq-names-slot .prs-count { font: 500 1.2rem/1.6rem var(--q-display); letter-spacing: .08em; }
#lgq-names-slot .lg2-prs-foot { flex-wrap: wrap; gap: 0 1.2rem; padding: .4rem 1.6rem; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
#lgq-names-slot .lg2-prs-foot .lnk { display: inline-flex; align-items: center; min-height: 4.4rem; font-weight: 600; color: var(--q-ink); }
#lgq-names-slot .lg2-prs-paste { padding: 0 1.6rem 1.6rem; }
#lgq-names-slot .lg2-prs-paste textarea { max-width: none; min-height: 9.2rem; padding: 1rem 1.2rem; border: 1px solid var(--q-hair-strong); border-radius: 8px;
  font: 400 1.6rem/1.4 var(--q-body); }
#lgq-names-slot .lg2-prs-paste textarea:focus { outline: 2px solid var(--q-ink); outline-offset: 1px; }
#lgq-names-slot .lg2-prs-paste .row { flex-wrap: wrap; font: 400 1.3rem/1.8rem var(--q-body); }
/* Fill the rows: the kit's secondary button (ink stays Check out's alone) */
#lgq-names-slot .lg2-prs-btn { height: 4.4rem; padding: 0 1.4rem; border: 1px solid var(--q-hair-strong); border-radius: 8px; background: var(--q-panel);
  color: var(--q-ink); font: 600 1.5rem/1 var(--q-body); letter-spacing: 0; text-transform: none; }
#lgq-names-slot .lg2-prs-btn:hover, #lgq-names-slot .lg2-prs-btn:active { background: var(--q-panel); color: var(--q-ink); border-color: var(--q-ink); }
#lgq-names-slot .pulse { animation: lgq-pulse 600ms ease; }
/* a tablet and the classic band: the chips run over both columns */
@media (min-width: 768px) and (max-width: 1099.98px) {
  .lgq--chips { grid-template-rows: auto auto 1fr; }
  .lgq--chips .lgq-gchips { grid-column: 1 / -1; grid-row: 1; margin: 0 0 1.6rem; padding: 0; }
  .lgq--chips .lgq-left { grid-row: 2 / span 2; }
  .lgq--chips .lgq-ctabs { grid-row: 2; }
  .lgq--chips .lgq-panel { grid-row: 3; }
}

/* ===========================================================================
   Drive B3: the parts that change the saved order (both pages). Add another
   garment (the dashed add button and the dashed + Garment chip, the Add a
   garment sheet), + Colour and Remove on the several garments page, the
   Adjust it line, Share for approval. The kit only (PLAN 1.4 and 1.5).
   =========================================================================== */
/* Add (dashed): clear, 1 px dashed #CFCAC0, ink label 600 14 px, 48 px */
.lgq-btn-add { display: flex; align-items: center; justify-content: center; gap: .8rem; width: 100%; height: 4.8rem; margin-top: 1.6rem;
  padding: 0 1.6rem; border: 1px dashed var(--q-hair-strong); border-radius: 8px; background: transparent; color: var(--q-ink);
  font: 600 1.4rem/1 var(--q-body); transition: border-color 120ms ease; }
.lgq-btn-add:active { border-style: solid; border-color: var(--q-ink); }
.lgq-btn-add[aria-disabled="true"] { opacity: .45; }
.lgq-gchip-add { display: inline-flex; align-items: center; gap: .8rem; flex: none; height: 4.8rem; padding: 0 1.4rem;
  border: 1px dashed var(--q-hair-strong); border-radius: 8px; background: transparent; color: var(--q-ink); font: 600 1.4rem/1 var(--q-body); }
.lgq-gchip-add:active { border-style: solid; border-color: var(--q-ink); }
.lgq-gchip-add[aria-disabled="true"] { opacity: .45; }
/* the line under a garment just added: where the design sits, Adjust it */
.lgq-notice-act { display: inline-flex; align-items: center; min-height: 4.4rem; margin: -1.3rem 0; padding: 0; border: 0; background: none;
  color: var(--q-ink); font: 600 1.3rem/1.8rem var(--q-body); text-decoration: underline; text-underline-offset: .2em; vertical-align: baseline; }
.lgq-notice--act { padding-top: 1.2rem; padding-bottom: 1.2rem; }
.lgq-notice--act::before { top: 1.8rem; }
/* the Add a garment sheet: the picker's category chips, then its cards */
.lgq-cats { display: flex; gap: .8rem; margin: 0 calc(-1 * var(--q-gutter)) 1.6rem; padding: 0 var(--q-gutter); overflow-x: auto; scrollbar-width: none; }
.lgq-cats::-webkit-scrollbar { display: none; }
.lgq-cat { display: inline-flex; align-items: center; gap: .8rem; flex: none; height: 4.4rem; padding: 0 1.4rem; background: var(--q-white);
  border: 1px solid var(--q-hair); border-radius: 8px; color: var(--q-ink); transition: border-color 120ms ease, box-shadow 120ms ease; }
.lgq-cat.on { border-color: var(--q-ink); box-shadow: 0 0 0 1px var(--q-ink); }
.lgq-cat-n { font: 600 1.35rem/1 var(--q-body); }
.lgq-cat-c { font: 500 1.2rem/1 var(--q-body); color: var(--q-muted); font-variant-numeric: tabular-nums; }
.lgq-gcards { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .8rem; }
.lgq-gcard { display: flex; flex-direction: column; align-items: flex-start; min-width: 0; padding: .8rem .8rem 1.2rem; text-align: left;
  background: var(--q-white); border: 1px solid var(--q-hair); border-radius: 10px; color: var(--q-ink);
  transition: border-color 120ms ease, box-shadow 120ms ease; }
.lgq-gcard:active { border-color: var(--q-hair-strong); box-shadow: 0 10px 24px -18px rgba(24, 21, 16, .45); }
.lgq-gcard-ph { display: grid; place-items: center; width: 100%; height: 13.2rem; margin-bottom: .8rem; overflow: hidden; border-radius: 6px; background: var(--q-white); }
.lgq-gcard-ph img { display: block; max-width: 100%; max-height: 100%; object-fit: contain; }
.lgq-gcard-t { font: 500 1.2rem/1.6rem var(--q-display); letter-spacing: .12em; text-transform: uppercase; color: var(--q-quiet); }
.lgq-gcard-n { margin-top: .2rem; font: 600 1.4rem/1.8rem var(--q-body); color: var(--q-ink); overflow-wrap: anywhere; }
.lgq-gcard-m { margin-top: .2rem; font: 400 1.2rem/1.6rem var(--q-body); color: var(--q-muted); }
.lgq-gcard-p { margin-top: .6rem; font: 500 1.8rem/2.2rem var(--q-display); font-variant-numeric: tabular-nums; letter-spacing: .02em; color: var(--q-ink); }
.lgq-gcard-p small { font: 400 1.2rem/1.6rem var(--q-body); letter-spacing: 0; color: var(--q-quiet); }
.lgq-gcard.in { cursor: default; background: var(--q-sel); }
.lgq-gcard.in .lgq-gcard-ph img { opacity: .55; }
/* the chosen garment: its photo in the colour picked, the dots, Add */
.lgq-back svg { width: 14px; height: 14px; }
.lgq-gpick-h { flex: 1 1 auto; min-width: 0; }
.lgq-gpick-h .lgq-title { margin-top: .2rem; }
.lgq-gpick { display: flex; align-items: center; justify-content: center; height: 20rem; margin: 1.2rem 0; overflow: hidden; background: var(--q-white);
  border: 1px solid var(--q-hair); border-radius: 10px; box-shadow: var(--q-sh-stage); }
.lgq-gpick-ph { display: flex; align-items: center; justify-content: center; width: 100%; height: 20rem; padding: .8rem; }
.lgq-gpick-ph img { display: block; max-width: 100%; max-height: 18.4rem; object-fit: contain; }
.lgq-gpick-ph .lgq-swatch { width: 6.4rem; height: 6.4rem; }
.lgq-gpick-m { margin: 0 0 1.2rem; font: 400 1.4rem/2rem var(--q-body); color: var(--q-muted); }
.lgq-gpick-c { font-weight: 400; color: var(--q-muted); }
.lgq-sw-grid--g { margin-bottom: 1.6rem; }
.lgq-wide { display: flex; width: 100%; }
.lgq-btn-main[aria-disabled="true"] { cursor: default; }
.lgq-err-line { margin: 0 0 1.2rem; font: 500 1.4rem/2rem var(--q-body); color: var(--q-stop); }
.lgq-sheet-note--first { margin-top: 0; }
.lgq-sheet .lgq-mini-spin { margin-right: .8rem; }
/* Share for approval: a secondary full width button below the order summary,
   and the studio's share sheet in the kit (text box 46 px, PLAN 1.6) */
.lgq-share { margin-top: 2.4rem; }
.lgq-share .lgq-btn-sec { width: 100%; height: 4.8rem; }
.lgq-share-s { margin: .8rem 0 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
.lgq-field--one { min-height: 0; height: 4.6rem; padding: 0 1.2rem; resize: none; }
.lgq-lbl--gap { margin-top: 1.6rem; }
.lgq-opt { font-weight: 400; color: var(--q-muted); }
.lgq-sheet-note--tight { margin-top: .8rem; }
.lgq-share-f .lgq-btn-main { margin-top: 1.6rem; }
.lgq-share-f .lgq-err-line { margin: 1.2rem 0 0; }
.lgq-hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
.lgq-sheet > .lgq-btn-sec.lgq-wide { height: 4.8rem; margin-top: .8rem; }
/* the arrival estimate under the receipt's facts (the studio's Review card's) */
.lgq-arrive { margin: 1.2rem 0 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
/* the moment the page moves on by itself (a garment handed back from the studio) */
.lgq-moving { position: fixed; inset: 0; z-index: 90; display: flex; align-items: center; justify-content: center; padding: 2.4rem;
  background: rgba(250, 246, 238, .92); }
.lgq-moving-t { display: flex; align-items: center; gap: .8rem; margin: 0; padding: 1.6rem 2rem; background: #FDFCF7; border: 1px solid #E6E1D8;
  border-radius: 10px; box-shadow: 0 18px 44px rgba(24, 21, 16, .12); font: 600 1.5rem/2rem 'Cooper Hewitt', 'DM Sans', system-ui, sans-serif; color: #181510; }
.lgq-moving-t .lgq-mini-spin { display: inline-block; width: 12px; height: 12px; border: 1.5px solid #CFCAC0; border-top-color: #181510;
  border-radius: 50%; animation: lgq-spin .8s linear infinite; }
.lgq-err-line--foot { margin: .8rem 0 0; }
/* Remove Bone and Remove caps side by side, wrapping when the words are long */
.lgq-p-rm { flex-wrap: wrap; justify-content: flex-end; }

/* Live stock Part B (PB-5): the sizes' limits on a phone. lg2_stock.js sets
   them on the page's own inputs (only while a stock switch is on), the
   steppers read them. A size's line under it ("only 3 left", "None left",
   "Not made in 3XL"), plus off at what is left, a size with none left off;
   a colour sold out since says so once above its sizes; the colour sheet
   keeps an out colour in its place, greyed with the studio's thin diagonal. */
.lgq-sr-left { font: 400 1.2rem/1.6rem var(--q-body); color: var(--q-quiet); }
.lgq-sr-left[hidden] { display: none; }
.lgq-sr-left.over { color: var(--q-stop); font-weight: 600; }
.lgq-sr-left.hit { color: var(--q-ink); font-weight: 600; }
.lgq-key.plus.dim { cursor: default; }
.lgq-key.plus.dim::before, .lgq-key.plus.dim::after { opacity: .28; }
.lgq-num input:disabled { color: var(--q-off); background: transparent; opacity: 1; -webkit-text-fill-color: var(--q-off); }
.lgq-quick button:disabled { opacity: .4; cursor: default; }
.lgq-out-line { margin: 0 0 1.2rem; font: 400 1.4rem/2rem var(--q-body); color: var(--q-stop); }
.lgq-sw-pick.out .lgq-swatch { opacity: .45; }
.lgq-sw-pick.out .lgq-swatch::after { content: ""; position: absolute; inset: 0; border-radius: 50%; pointer-events: none;
  background: linear-gradient(to top right, transparent calc(50% - 2px), rgba(250, 246, 238, .92) calc(50% - 2px), rgba(250, 246, 238, .92) calc(50% - .6px), #181510 calc(50% - .6px), #181510 calc(50% + .6px), rgba(250, 246, 238, .92) calc(50% + .6px), rgba(250, 246, 238, .92) calc(50% + 2px), transparent calc(50% + 2px)); }

/* ===========================================================================
   studio_sheet.css: the studio below 1100 wide, Design 2 "The sheet"
   (Joel 2026-09-30, drive S1; C:\Tools\_drives\phone-comp\studio\out\
   STUDIO_PLAN.md is the specification). The garment first: the canvas (the
   PC's dotted cream) fills everything between the site header and the bar,
   the white stage on it with Front / Back, Hide borders and Undo in its top
   band, the four tools floating at the canvas foot in one white plate, and a
   tool opening as a sheet that sits on the bar with no veil, the garment
   staying whole and live above it. The bar is the sizes pages' own
   (lg2_phone.css .lgq-bar; its tokens ride .lgm-q, the workspace).

   Loaded last, so it owns the layout studio_phone.css used to own; the
   inspector, text and picker rules there still dress the panels' contents.
   Everything is scoped to body.lgm-on (below 1100). Nothing here applies at
   1100 and up. The PC kit's values only (PLAN.md section 1): 10 / 8 / 6 px
   corners, hairline #E6E1D8, control edge #CFCAC0, Oswald money and titles,
   Cooper Hewitt text, the 180 ms sheet on cubic-bezier(.2,.7,.2,1).
   =========================================================================== */

/* phone parts: never shown at 1100 and up */
.lgm-price-line, .lgw-tonal-short { display: none; }

/* the bar's own rule pads body for a page that scrolls under a fixed bar;
   the studio's bar is the workspace's last row instead */
body.lgm-on { padding-bottom: 0; }

/* ── the workspace: [return notice] / canvas / sheet / bar ─────────────── */
body.lgm-on .lgm-ws {
  grid-template-areas: "top" "canvas" "editor" "footer";
  grid-template-columns: minmax(0, 1fr);
  grid-template-rows: auto minmax(0, 1fr) auto var(--q-bar-h);
  background: var(--q-panel);
  font: 400 1.4rem/1.45 var(--q-body);
}
/* the top line now holds only the return notice; its two old buttons stay
   in the DOM for the shell's code (Review is retired on the phone) */
body.lgm-on .lgm-topline { display: none; }
body.lgm-on .lgm-topline:has(#lg-return-status:not([hidden])) { display: flex; }
body.lgm-on .lgm-topline > #lgm-garment-open,
body.lgm-on .lgm-topline > #lgm-review-open { display: none; }
body.lgm-on .lgm-camera-tools,
body.lgm-on .lgm-context { display: none; }

/* ── the canvas: dotted cream, the stage 12 px in, room for the plate ───── */
body.lgm-on .lgm-canvas {
  grid-area: canvas; position: relative; display: flex; flex-direction: column; min-width: 0; min-height: 0;
  padding: 12px 12px 84px;
  background: var(--q-cream) radial-gradient(rgba(24, 21, 16, .045) 1px, transparent 1.2px);
  background-size: 22px 22px;
  transition: padding-bottom 180ms var(--q-ease);
}
body.lgm-on .lgm-stage {
  position: relative; display: flex; flex-direction: column; flex: 1 1 auto; min-width: 0; min-height: 0; overflow: hidden;
  background: var(--q-white); border: 1px solid var(--q-hair); border-radius: 10px; box-shadow: var(--q-sh-stage);
}

/* the stage's top band: Front and Back left, Hide borders and Undo right */
body.lgm-on .lgm-band {
  position: relative; z-index: 6; display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: 8px;
  flex: none; min-height: 56px; padding: 8px 8px 0; container: lgm-band / inline-size;
}
body.lgm-on .lgm-band #lgm-views { display: flex; align-items: center; flex: 0 1 auto; min-width: 0; padding: 0; border: 0; background: none; }
body.lgm-on .lgm-band #lgm-views .lgw-angles { display: flex; gap: 8px; min-width: 0; padding: 0; overflow: visible; }
body.lgm-on .lgm-band #lgm-views .lgw-angle {
  position: relative; display: inline-flex; align-items: center; gap: 8px; flex: none;
  min-width: 0; height: 44px; min-height: 44px; padding: 0 12px 0 5px;
  background: var(--q-white); border: 1px solid var(--q-hair); border-radius: 8px; box-shadow: none;
  color: var(--q-ink); font: 600 1.4rem/1 var(--q-body); text-align: left;
  transition: border-color 120ms ease, box-shadow 120ms ease;
}
body.lgm-on .lgm-band #lgm-views .lgw-ang-ph {
  display: grid; place-items: center; width: 32px; height: 32px; flex: none; overflow: hidden;
  background: #FFFFFF; border: 0; border-radius: 6px;
}
body.lgm-on .lgm-band #lgm-views .lgw-ang-an { display: block; font: 600 1.4rem/1 var(--q-body); letter-spacing: 0; text-transform: none; white-space: nowrap; }
body.lgm-on .lgm-band #lgm-views .lgw-ang-tick,
body.lgm-on .lgm-band #lgm-views .lgw-ang-sub { display: none; }
body.lgm-on .lgm-band #lgm-views .lgw-angle.lgw-ang-on .lgw-ang-an::after { content: none; }
/* the side in view: the picker's chosen edge, an ink ring and the check badge */
body.lgm-on .lgm-band #lgm-views .lgw-angle.lgw-ang-on {
  background: var(--q-white); border-color: var(--q-ink); box-shadow: inset 0 0 0 1px var(--q-ink);
  padding-right: 24px;
}
body.lgm-on .lgm-band #lgm-views .lgw-angle.lgw-ang-on::after {
  content: ""; position: absolute; top: -1px; right: -1px; width: 18px; height: 18px;
  background: var(--q-ink) var(--q-tick) center / 11px 11px no-repeat;
  border-radius: 0 8px 0 6px;
}
/* a phone (under 768 wide) shows the side cards as plain keys, so Front,
   Back, Hide borders and Undo sit on one line; a tablet keeps the photos */
@media (max-width: 767.98px) {
  body.lgm-on .lgm-band #lgm-views .lgw-ang-ph { display: none; }
  body.lgm-on .lgm-band #lgm-views .lgw-angle { padding: 0 12px; }
  body.lgm-on .lgm-band #lgm-views .lgw-angle.lgw-ang-on { padding-right: 22px; }
}
/* a narrow band (a phone under 430 wide, or the canvas beside a panel)
   keeps Front, Back, Hide borders and Undo on one line: the side cards drop
   their little photo there */
@container lgm-band (max-width: 389.98px) {
  body.lgm-on .lgm-band #lgm-views .lgw-ang-ph { display: none; }
  body.lgm-on .lgm-band #lgm-views .lgw-angle { padding: 0 12px; }
  body.lgm-on .lgm-band #lgm-views .lgw-angle.lgw-ang-on { padding-right: 22px; }
}
/* the narrowest bands (the smallest phones) tighten the keys a little */
@container lgm-band (max-width: 339.98px) {
  body.lgm-on .lgm-band #lgm-views .lgw-angles, body.lgm-on .lgm-band-keys { gap: 6px; }
  body.lgm-on .lgm-band #lgm-views .lgw-angle { padding: 0 9px; font-size: 1.3rem; --lgm-ang-fs: 1.3rem; }
  body.lgm-on .lgm-band #lgm-views .lgw-ang-an { font-size: 1.3rem; }
  body.lgm-on .lgm-band #lgm-views .lgw-angle.lgw-ang-on { padding-right: 20px; }
  body.lgm-on .lgm-key--borders { padding: 0 9px; font-size: 1.2rem; }
}
/* A cap's band holds three sides. Under 424 px of band its side keys read
   Left and Right (the names a screen reader hears stay "Left side" and
   "Right side", and the short word takes the band's own label size), and
   under 366 and 324 px it tightens in two steps more, so the cap's band is
   one line on every phone too, Show borders included. Only a cap has side
   views: every other garment's band is as it was. */
@container lgm-band (max-width: 423.98px) {
  body.lgm-on .lgm-band #lgm-views .lgw-angle[data-lgw-view$=" side"] .lgw-ang-an { font-size: 0; }
  body.lgm-on .lgm-band #lgm-views .lgw-angle[data-lgw-view$=" side"] .lgw-ang-an::before { font-size: var(--lgm-ang-fs, 1.4rem); }
  body.lgm-on .lgm-band #lgm-views .lgw-angle[data-lgw-view="Left side"] .lgw-ang-an::before { content: "Left"; content: "Left" / ""; }
  body.lgm-on .lgm-band #lgm-views .lgw-angle[data-lgw-view="Right side"] .lgw-ang-an::before { content: "Right"; content: "Right" / ""; }
}
@container lgm-band (max-width: 365.98px) {
  body.lgm-on .lgm-band:has([data-lgw-view$=" side"]) #lgm-views .lgw-angles,
  body.lgm-on .lgm-band:has([data-lgw-view$=" side"]) .lgm-band-keys { gap: 6px; }
  body.lgm-on .lgm-band:has([data-lgw-view$=" side"]) #lgm-views .lgw-angle { padding: 0 9px; }
  body.lgm-on .lgm-band:has([data-lgw-view$=" side"]) #lgm-views .lgw-angle.lgw-ang-on { padding-right: 20px; }
}
@container lgm-band (max-width: 339.98px) {
  body.lgm-on .lgm-band:has([data-lgw-view$=" side"]) .lgm-key--borders { padding: 0 9px; font-size: 1.2rem; }
}
/* the smallest phones: 12 px labels, 4 px gaps, the keys 4 px into the
   band's padding; Left and Undo are drawn 40 px wide and tap 44 */
@container lgm-band (max-width: 323.98px) {
  body.lgm-on .lgm-band:has([data-lgw-view$=" side"]) #lgm-views { margin-left: -4px; }
  body.lgm-on .lgm-band:has([data-lgw-view$=" side"]) #lgm-views .lgw-angles { gap: 4px; }
  body.lgm-on .lgm-band:has([data-lgw-view$=" side"]) .lgm-band-keys { gap: 4px; margin: 0 -4px 0 -4px; }
  body.lgm-on .lgm-band:has([data-lgw-view$=" side"]) #lgm-views .lgw-angle { min-width: 40px; padding: 0 6px; font-size: 1.2rem; --lgm-ang-fs: 1.2rem; }
  body.lgm-on .lgm-band:has([data-lgw-view$=" side"]) #lgm-views .lgw-angle.lgw-ang-on { padding-right: 19px; }
  body.lgm-on .lgm-band:has([data-lgw-view$=" side"]) #lgm-views .lgw-angle:not([data-lgw-view$=" side"]) .lgw-ang-an { font-size: 1.2rem; }
  body.lgm-on .lgm-band:has([data-lgw-view$=" side"]) .lgm-key--borders { padding: 0 6px; font-size: 1.2rem; }
  body.lgm-on .lgm-band:has([data-lgw-view$=" side"]) .lgm-key--undo { position: relative; width: 40px; min-width: 40px; }
  body.lgm-on .lgm-band:has([data-lgw-view$=" side"]) :is(#lgm-views .lgw-angle, .lgm-key--undo)::before {
    content: ""; position: absolute; top: -1px; bottom: -1px; left: -3px; right: -3px;
  }
}
body.lgm-on .lgm-band-keys { display: flex; align-items: center; gap: 8px; flex: none; }
body.lgm-on .lgm-key {
  display: inline-flex; align-items: center; justify-content: center; height: 44px; min-width: 44px; padding: 0 12px;
  border: 1px solid var(--q-hair-strong); border-radius: 8px; background: var(--q-white); color: var(--q-ink);
  font: 600 1.3rem/1 var(--q-body); white-space: nowrap; cursor: pointer; -webkit-tap-highlight-color: transparent;
  transition: border-color 120ms ease, background 120ms ease;
}
body.lgm-on .lgm-key:active { border-color: var(--q-ink); background: var(--q-hover); }
body.lgm-on .lgm-key[aria-pressed="true"] { border-color: var(--q-ink); box-shadow: inset 0 0 0 1px var(--q-ink); }
body.lgm-on .lgm-key--undo { width: 44px; padding: 0; }
body.lgm-on .lgm-key--undo svg { width: 18px; height: 18px; transition: opacity 120ms ease; }
body.lgm-on .lgm-key--undo[aria-disabled="true"] { cursor: default; }
body.lgm-on .lgm-key--undo[aria-disabled="true"]:active { border-color: var(--q-hair-strong); background: var(--q-white); }
body.lgm-on .lgm-key--undo[aria-disabled="true"] svg { opacity: .3; }
body.lgm-on .lgm-key:focus-visible,
body.lgm-on .lgm-band #lgm-views .lgw-angle:focus-visible { outline: 2px solid var(--q-ink); outline-offset: 2px; }

/* Hide borders (T1's rules, vintage.css, read both shells): on the phone the
   spot's name tag goes with its dashed box, so no label floats alone */
body.lgm-on.lgw-borders-off .lg-bound .tag { visibility: hidden; }

/* the garment's room: the stage's white, under the band */
body.lgm-on .lgm-ws[data-phone-workspace] .lgm-room {
  grid-area: auto; position: relative; flex: 1 1 auto; width: auto; height: auto; min-height: 0;
  visibility: visible; pointer-events: auto; background: transparent;
}
/* Fit: the whole garment again, only while moved in */
body.lgm-on .lgm-fit {
  position: absolute; right: 8px; bottom: 8px; z-index: 5; height: 44px; padding: 0 16px;
  border: 1px solid var(--q-hair-strong); border-radius: 8px; background: var(--q-panel); color: var(--q-ink);
  box-shadow: var(--q-sh-tool); font: 600 1.4rem/1 var(--q-body); cursor: pointer;
}
body.lgm-on .lgm-fit[hidden] { display: none; }
/* N unused spots: the PC's cream notice with its ink dot, on the stage */
body.lgm-on #lgm-empty-open.lgm-unused {
  position: absolute; left: 8px; bottom: 8px; z-index: 5; display: flex; align-items: center; max-width: calc(100% - 96px);
  min-height: 44px; margin: 0; padding: 4px 12px 4px 26px; background: var(--q-cream); border: 1px solid var(--q-hair);
  border-radius: 6px; box-shadow: var(--q-sh-tool); color: var(--q-ink); font: 400 1.3rem/1.8rem var(--q-body);
  text-align: left; text-decoration: underline; text-underline-offset: .2em; cursor: pointer;
}
body.lgm-on #lgm-empty-open.lgm-unused::before { content: ""; position: absolute; left: 12px; top: 50%; width: 7px; height: 7px; margin-top: -3.5px; border-radius: 99px; background: var(--q-ink); }
body.lgm-on #lgm-empty-open.lgm-unused[hidden] { display: none; }

/* ── the tools: one floating white plate at the canvas foot ─────────────── */
body.lgm-on .lgm-plate {
  position: absolute; left: var(--q-gutter); right: var(--q-gutter); bottom: 12px; z-index: 8; display: flex; height: 60px;
  background: var(--q-panel); border: 1px solid var(--q-hair); border-radius: 8px; box-shadow: var(--q-sh-tool); overflow: hidden;
  transition: transform 180ms var(--q-ease), opacity 120ms ease;
}
body.lgm-on .lgm-pkey {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px; flex: 1 1 0; min-width: 0;
  padding: 0 0 2px; border: 0; border-radius: 0; background: transparent; color: var(--q-ink); cursor: pointer;
  -webkit-tap-highlight-color: transparent; transition: background 120ms ease;
}
body.lgm-on .lgm-pkey + .lgm-pkey { border-left: 1px solid var(--q-hair); }
body.lgm-on .lgm-pkey:active { background: var(--q-hover); }
body.lgm-on .lgm-pkey:focus-visible { outline: 2px solid var(--q-ink); outline-offset: -4px; }
/* the PC rail's own icons (app/static/images/studio/rail), in ink */
body.lgm-on .lgm-pkey-ico { display: block; width: 24px; height: 24px; background: currentColor;
  -webkit-mask: var(--lgm-ico) center / contain no-repeat; mask: var(--lgm-ico) center / contain no-repeat; }
body.lgm-on .lgm-pkey-ico--garment { --lgm-ico: url("../images/studio/rail/rail-garment.svg"); }
body.lgm-on .lgm-pkey-ico--logo { --lgm-ico: url("../images/studio/rail/rail-design.svg"); }
body.lgm-on .lgm-pkey-ico--text { --lgm-ico: url("../images/studio/rail/rail-text.svg"); }
body.lgm-on .lgm-pkey-ico--saved { --lgm-ico: url("../images/studio/rail/rail-library.svg"); }
body.lgm-on .lgm-pkey-l { font: 600 1.3rem/1.6rem var(--q-body); white-space: nowrap; }

/* ── the bar: the sizes pages' own, as the workspace's last row ─────────── */
body.lgm-on .lgm-ws[data-phone-workspace] .lgm-footer.lgq-bar {
  grid-area: footer; position: relative; left: auto; right: auto; bottom: auto; z-index: 50;
  display: flex; align-items: center; gap: 1.2rem; min-width: 0; height: var(--q-bar-h);
  padding: 1.2rem var(--q-gutter); border-top: 1px solid var(--q-hair); background: var(--q-panel); box-shadow: var(--q-sh-bar);
}
body.lgm-on #lgm-price-seat {
  position: relative; display: flex; flex-direction: column; justify-content: center; flex: 1 1 auto; min-width: 0; height: 4.8rem;
}
/* the price each: the engine's own served strings (#lgw-foot-price), set as
   the bar's figure and line; its See the math key spans the whole left side */
body.lgm-on .lgm-footer .lgw-foot-price { display: flex; flex-direction: column; justify-content: center; min-width: 0; color: var(--q-ink); font: inherit; }
body.lgm-on .lgm-footer .lgw-foot-price[hidden] { display: none; }
body.lgm-on .lgm-footer .lgw-price-row { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
body.lgm-on .lgm-footer .lgw-price-v {
  font: 500 2.2rem/2.6rem var(--q-display); font-variant-numeric: tabular-nums; letter-spacing: .02em; color: var(--q-ink);
}
/* "est. per piece" reads "each" here, with the bar's up chevron after it */
body.lgm-on .lgm-footer .lgw-price-k { display: inline-flex; align-items: center; gap: 6px; font-size: 0; line-height: 0; color: var(--q-muted); }
body.lgm-on .lgm-footer .lgw-price-k::before { content: "each"; font: 400 1.3rem/2.6rem var(--q-body); }
body.lgm-on .lgm-footer .lgw-price-k::after {
  content: ""; width: 7px; height: 7px; margin: 4px 4px 0; border-left: 2px solid var(--q-ink); border-top: 2px solid var(--q-ink); transform: rotate(45deg);
}
body.lgm-on .lgm-footer .lgw-price-dot { display: none; }
body.lgm-on #lgm-price-seat .lgw-price-math {
  position: absolute; inset: 0; z-index: 1; width: 100%; min-height: 0; margin: 0; padding: 0;
  border: 0; border-radius: 8px; background: none; color: transparent; font-size: 0; text-decoration: none; cursor: pointer;
}
body.lgm-on #lgm-price-seat .lgw-price-math:focus-visible { outline: 2px solid var(--q-ink); outline-offset: 2px; }
body.lgm-on .lgm-footer .lgw-price-note { display: none; }
body.lgm-on .lgm-footer .lgm-price-line,
body.lgm-on .lgm-pe-line,
body.lgm-on .lgm-bar-msg {
  display: block; min-width: 0; margin: 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* an empty garment: "from $X each" (the server's own from price) and the minimum */
body.lgm-on .lgm-price-empty { display: flex; flex-direction: column; justify-content: center; min-width: 0; }
body.lgm-on #lgm-price-seat:has(#lgw-foot-price:not([hidden])) .lgm-price-empty { display: none; }
body.lgm-on .lgm-pe-top { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
body.lgm-on .lgm-pe-top[hidden] { display: none; }
body.lgm-on .lgm-pe-top::before { content: "from"; font: 400 1.3rem/2.6rem var(--q-body); color: var(--q-muted); }
body.lgm-on .lgm-pe-top::after { content: "each"; font: 400 1.3rem/2.6rem var(--q-body); color: var(--q-muted); }
body.lgm-on .lgm-pe-from { font: 500 2.2rem/2.6rem var(--q-display); font-variant-numeric: tabular-nums; letter-spacing: .02em; color: var(--q-ink); }
/* the one line: a message (checking a file, a file that did not open, why
   Choose sizes is off) takes the price line's place while it stands */
body.lgm-on .lgm-bar-msg { order: 2; }
body.lgm-on .lgm-bar-msg[hidden] { display: none; }
body.lgm-on .lgm-bar-msg.lgm-err { color: var(--q-stop); font-weight: 500; }
/* R-014: a refused file's reason (or a save that failed) takes the whole
   seat, up to three lines, instead of an ellipsis under the price */
body.lgm-on .lgm-bar-msg.lgm-err:not([hidden]) { display: -webkit-box; white-space: normal; line-height: 1.6rem; -webkit-box-orient: vertical; -webkit-line-clamp: 3; line-clamp: 3; }
body.lgm-on #lgm-price-seat:has(.lgm-bar-msg.lgm-err:not([hidden])) > :not(.lgm-bar-msg) { display: none; }
body.lgm-on #lgm-price-seat:has(.lgm-bar-msg:not([hidden])) :is(.lgm-price-line, .lgm-pe-line) { display: none; }
/* fix 1b (R-018 follow-up): why Choose sizes is off (a logo that does not
   fit, signed out, a design to restore) wraps to two lines at most, under
   the price. The second line takes the bar's own padding (the seat's lines
   stay centred in it), so the bar keeps its height and the stage its size:
   at 375 the stage is height-bound, and a taller bar would shrink it. */
body.lgm-on .lgm-bar-msg:not(.lgm-err):not([hidden]) {
  display: -webkit-box; white-space: normal; line-height: 1.6rem; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2;
}
body.lgm-on #lgm-price-seat:has(> .lgm-bar-msg:not(.lgm-err):not([hidden])) > * { flex-shrink: 0; }
body.lgm-on .lgm-mini-spin { display: inline-block; width: 10px; height: 10px; margin-right: 6px; vertical-align: -1px;
  border: 1.5px solid var(--q-hair-strong); border-top-color: var(--q-ink); border-radius: 50%; animation: lgm-spin .8s linear infinite; }
@keyframes lgm-spin { to { transform: rotate(360deg); } }

/* the main button: "Add your logo" on an empty garment, then the engine's
   own Continue, "Choose sizes"; one ink seat, the labels cross fade */
body.lgm-on .lgm-ws[data-phone-workspace] #lgm-cta-slot {
  display: grid; flex: 0 1 auto; width: auto; min-width: min(14.8rem, 55%); max-width: 70%;
}
body.lgm-on #lgm-cta-slot > * { grid-area: 1 / 1; }
body.lgm-on #lgm-cta-slot #lgm-add-logo,
body.lgm-on .lgm-ws[data-phone-workspace] #lgm-cta-slot #lg-continue {
  display: inline-flex; align-items: center; justify-content: center; gap: .8rem; width: 100%; min-width: 0; height: auto; min-height: 4.8rem;
  max-width: none; margin: 0; padding: .4rem 20px; border: 0; border-radius: 8px;
  background: var(--q-ink); color: #FFFFFF; box-shadow: none; font: 600 1.6rem/1.15 var(--q-body); text-align: center;
  letter-spacing: normal; text-transform: none; white-space: normal; cursor: pointer; opacity: 1;
  transition: background 150ms ease, transform 100ms ease, opacity 150ms ease, visibility 0s;
}
body.lgm-on #lgm-cta-slot #lgm-add-logo:active,
body.lgm-on #lgm-cta-slot #lg-continue:active:not(:disabled) { background: var(--q-press); transform: translateY(1px); }
body.lgm-on .lgm-ws[data-phone-workspace] #lgm-cta-slot #lg-continue:disabled { background: var(--q-off); color: #FFFFFF; opacity: 1; cursor: default; }
body.lgm-on #lg-continue .lg-cont-more { display: none; }
body.lgm-on #lgm-cta-slot #lgm-add-logo:focus-visible,
body.lgm-on #lgm-cta-slot #lg-continue:focus-visible { outline: 2px solid var(--q-ink); outline-offset: 2px; }
/* which label is up: the design decides (body[data-studio-has-artwork]) */
body.lgm-on[data-studio-has-artwork="true"] #lgm-cta-slot #lgm-add-logo,
body.lgm-on:not([data-studio-has-artwork="true"]) .lgm-ws[data-phone-workspace] #lgm-cta-slot #lg-continue {
  opacity: 0; visibility: hidden; pointer-events: none;
  transition: background 150ms ease, opacity 150ms ease, visibility 0s 150ms;
}
/* a logo on its way: "Adding your logo" with the small turning mark, off */
body.lgm-on .lgm-ws.lgm-adding #lgm-add-logo { background: var(--q-off); cursor: default; }
body.lgm-on .lgm-ws.lgm-adding #lgm-add-logo .lgm-add-l::before {
  content: ""; display: inline-block; width: 14px; height: 14px; margin-right: 8px; vertical-align: -2px;
  border: 2px solid rgba(255, 255, 255, .35); border-top-color: #FFFFFF; border-radius: 50%; animation: lgm-spin .8s linear infinite;
}

/* ── a tool's sheet: the sizes pages' sheet (16 px top corners, the grab,
   an Oswald title, the ✕ key), sitting on the bar with no veil, only as tall
   as its tool needs (at most 300 px), and never so tall that the canvas has
   less than 39.1 per cent of the screen (330 px on a 390 by 844 phone) ── */
body.lgm-on .lgm-ws[data-phone-workspace] {
  --lgm-sheet-max: clamp(14rem, calc(var(--lgm-visible-height, 100dvh) * .609 - var(--lgw-top, var(--nav-height)) - var(--q-bar-h)), 300px);
}
body.lgm-on .lgm-ws[data-phone-workspace] .lgm-sheet {
  grid-area: editor; position: relative; z-index: 9; display: flex; flex-direction: column; min-width: 0; min-height: 0;
  max-height: var(--lgm-sheet-max); overflow: hidden;
  background: var(--q-panel); border: 0; border-top: 1px solid var(--q-hair); border-radius: 16px 16px 0 0;
  box-shadow: var(--q-sh-bar);
  animation: lgm-sheet-in 180ms var(--q-ease);
}
@keyframes lgm-sheet-in { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
body.lgm-on .lgm-ws[data-phone-surface="canvas"] .lgm-sheet { display: none; }
body.lgm-on .lgm-grab { flex: none; width: 36px; height: 4px; margin: 8px auto 12px; border-radius: 2px; background: var(--q-hair-strong); }
body.lgm-on .lgm-ws[data-phone-workspace] #lgm-editor-tools {
  display: flex; flex-wrap: nowrap; align-items: center; justify-content: space-between; gap: 12px; flex: none;
  min-height: 0; margin: 0 0 4px; padding: 0 var(--q-gutter); border: 0;
}
body.lgm-on .lgm-ws[data-phone-workspace] #lgm-sheet-title {
  flex: 1 1 auto; min-width: 0; margin: 0; font: 600 2.4rem/2.8rem var(--q-display); letter-spacing: .005em;
  text-transform: none; color: var(--q-ink); overflow-wrap: anywhere;
}
body.lgm-on .lgm-ws[data-phone-workspace] #lgm-sheet-done {
  display: grid; place-items: center; flex: none; width: 44px; height: 44px; min-width: 44px; min-height: 44px; padding: 0;
  font-size: 0; white-space: nowrap; overflow: hidden;
  border: 1px solid var(--q-hair); border-radius: 8px; background: var(--q-white); color: var(--q-ink); text-decoration: none; cursor: pointer;
}
body.lgm-on #lgm-sheet-done .lgm-done-t { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
body.lgm-on #lgm-sheet-done .lgm-close-x { width: 14px; height: 14px; margin: 0; color: var(--q-ink); }
body.lgm-on #lgm-sheet-done:focus-visible { outline: 2px solid var(--q-ink); outline-offset: 2px; }
body.lgm-on .lgm-ws[data-phone-workspace] .lgm-body {
  flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; scroll-padding-block: 12px;
}
body.lgm-on .lgm-ws[data-phone-workspace] .lgm-body .lg-step { padding: 4px var(--q-gutter) 16px; }
/* with a sheet up the plate steps aside and the canvas gives back its foot */
body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-canvas { padding-bottom: 12px; }
body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-plate { opacity: 0; transform: translateY(24px); pointer-events: none; visibility: hidden;
  transition: transform 180ms var(--q-ease), opacity 120ms ease, visibility 0s 180ms; }

/* ── the kit's rows, chevrons, adds and asking in place (PLAN.md 1.4, 1.6) ── */
body.lgm-on .lgm-ws .lgm-row {
  display: flex; align-items: center; gap: 12px; width: 100%; min-height: 56px; margin: 0; padding: 6px 0;
  border: 0; border-top: 1px solid var(--q-hair); border-radius: 0; background: none; color: var(--q-ink);
  font: inherit; text-align: left; cursor: pointer; -webkit-tap-highlight-color: transparent; transition: background 120ms ease;
}
body.lgm-on .lgm-ws .lgm-row:active { background: var(--q-hover); }
body.lgm-on .lgm-ws .lgm-row:focus-visible { outline: 2px solid var(--q-ink); outline-offset: -2px; }
body.lgm-on .lgm-row-t { flex: 1 1 auto; min-width: 0; font: 600 1.5rem/2rem var(--q-body); }
body.lgm-on .lgm-row-v { display: inline-flex; align-items: center; min-width: 0; max-width: 55%; font: 400 1.4rem/2rem var(--q-body);
  color: var(--q-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
body.lgm-on .lgm-chev { flex: none; width: 8px; height: 8px; margin: 0 4px 0 0; border-right: 2px solid var(--q-ink); border-bottom: 2px solid var(--q-ink);
  transform: rotate(-45deg); transition: transform 120ms ease; }
body.lgm-on .lgm-row[aria-expanded="true"] .lgm-chev { transform: rotate(45deg); margin-top: -4px; }
body.lgm-on .lgm-adds { display: flex; gap: 8px; padding: 12px 0 16px; border-top: 1px solid var(--q-hair); }
body.lgm-on .lgm-ws .lgm-add {
  display: flex; align-items: center; justify-content: center; gap: 8px; flex: 1 1 0; min-width: 0; height: 48px; margin: 0; padding: 0 12px;
  border: 1px dashed var(--q-hair-strong); border-radius: 8px; background: transparent; color: var(--q-ink);
  font: 600 1.4rem/1 var(--q-body); white-space: nowrap; cursor: pointer; transition: border-color 120ms ease;
}
body.lgm-on .lgm-ws .lgm-add:active { border-style: solid; border-color: var(--q-ink); }
body.lgm-on .lgm-plus { position: relative; width: 12px; height: 12px; flex: none; color: inherit; }
body.lgm-on .lgm-plus::before, body.lgm-on .lgm-plus::after { content: ""; position: absolute; left: 0; top: 5px; width: 12px; height: 2px; border-radius: 1px; background: currentColor; }
body.lgm-on .lgm-plus::after { transform: rotate(90deg); }

/* ── the piece sheet: the picked logo (or words) in Joel's PC order, out of
   the inspector and the phone's placement seat as one column ── */
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body .lg-step.lgw-active > .lg-step-body { display: flex; flex-direction: column; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body :is(#lgw-ins, #lgm-placement-tools, #lg-tools, #lg-tools > .lg-nudge > .lg-nudge-arrows) { display: contents; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body :is(#lgw-ins, #lgm-placement-tools, #lg-tools) > * { order: 90; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body :is(#lgm-resize, #lgm-size-note, #lg-tool-borders, #lg-tool-center, #lg-tool-del,
  #lg-spots, #lgw-ins-spots-lbl, #lgw-ins-size-lbl, #lg-tool-nudge, #lg-flip, #lgw-ins-hint) { display: none !important; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-id { order: 10; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-th-lbl { order: 20; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads { order: 21; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-tonal-warning { order: 22; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-promise { order: 23; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-textseat { order: 25; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-size { order: 31; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-sizenote { order: 32; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-limit { order: 33; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-center { order: 34; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgm-row-turn { order: 40; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-pt-rot { order: 41; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-pt-strip { order: 42; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lg-tool-dup { order: 43; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lg-tool-pin { order: 44; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgm-row-spot { order: 50; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-spots { order: 52; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-spots-hint { order: 53; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgm-move-artwork { order: 54; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgm-move-note { order: 55; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lg-tools .lg-tool--nudge { order: 56; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-arrange { order: 57; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-add { order: 58; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-split { order: 59; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-puff { order: 70; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgm-adds { order: 80; }
/* Turn and flip, and Spot, open in place (data-phone-row); words have no
   Width row of their own here (theirs is in their Text rows), so no turn */
body.lgm-on .lgm-ws[data-phone-tool="piece"]:not([data-phone-row="turn"]) #lgm-body :is(#lgw-pt-rot, #lgw-pt-strip, #lg-tool-dup, #lg-tool-pin) { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="piece"]:not([data-phone-row="spot"]) #lgm-body :is(#lgw-ins-spots, #lgw-ins-spots-hint, #lgm-move-artwork,
  #lgm-move-note, #lg-tools .lg-tool--nudge, #lgw-ins-arrange, #lgw-ins-add, #lgw-ins-split) { display: none; }
body.lgm-on .lgm-ws:not([data-phone-tool="piece"]) :is(#lgm-row-turn, #lgm-row-spot, #lgm-adds) { display: none; }
body.lgm-on .lgm-ws[data-phone-row="turn"] #lgm-body :is(#lgw-pt-rot, #lgw-pt-strip),
body.lgm-on .lgm-ws[data-phone-row="spot"] #lgm-body :is(#lgw-ins-spots, #lgm-move-note) { margin: 4px 0 12px; }
/* S3: the spot cards, the PC's Placement cards two to a row (STUDIO_PLAN
   4.7): 64 px, the spot's name in Oswald capitals 13 px over "up to 4.3 in"
   in 12 px, the spot in use ink with a white label; "In use" and a spot too
   small are off; a move that changes the price says by how much */
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-spots:not([hidden]) {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; padding: 0;
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-spots > .lgw-ins-spot {
  display: flex; flex-direction: column; align-items: flex-start; justify-content: center; gap: 2px;
  width: auto; min-width: 0; min-height: 64px; height: auto; margin: 0; padding: 8px 12px;
  border: 1px solid var(--q-hair-strong); border-radius: 8px; background: var(--q-panel); color: var(--q-ink);
  font: 500 1.3rem/1.6rem var(--q-display); letter-spacing: .06em; text-transform: uppercase; text-align: left;
  white-space: nowrap; box-shadow: none; transform: none; cursor: pointer; -webkit-tap-highlight-color: transparent;
  transition: background 120ms ease, border-color 120ms ease, color 120ms ease;
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-spots > .lgw-ins-spot.lgw-ins-spot--on { background: var(--q-ink); border-color: var(--q-ink); color: #FFFFFF; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-spots > .lgw-ins-spot:disabled { opacity: .5; cursor: default; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-spots > .lgw-ins-spot:not(:disabled):not(.lgw-ins-spot--on):active { border-color: var(--q-ink); background: var(--q-hover); }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-spots > .lgw-ins-spot:focus-visible { outline: 2px solid var(--q-ink); outline-offset: 2px; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-spots .lgw-ins-fit {
  display: block; max-width: 100%; margin: 0; white-space: normal;
  font: 400 1.2rem/1.6rem var(--q-body); letter-spacing: 0; text-transform: none; color: var(--q-muted);
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-spots .lgm-spot-price { font-weight: 600; color: var(--q-ink); white-space: nowrap; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-spots .lgw-ins-spot--on :is(.lgw-ins-fit, .lgm-spot-price) { color: rgba(253, 252, 247, .78); }
/* the line under the cards: "Shrunk to 4.3 in to fit the left chest." */
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgm-spot-note { order: 52; margin: -4px 0 12px; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
body.lgm-on .lgm-ws[data-phone-tool="piece"]:not([data-phone-row="spot"]) #lgm-body #lgm-spot-note,
body.lgm-on .lgm-ws:not([data-phone-tool="piece"]) #lgm-spot-note,
body.lgm-on #lgm-spot-note[hidden] { display: none; }
/* S3: Turn and flip as two lines of the kit's pairs (STUDIO_PLAN 4.4), the
   chosen one ink; the PC's rotation row and flip keys step aside (the pairs
   make the same engine calls); Duplicate and Pin stay under the pairs, and
   the layer keys when pieces overlap */
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgm-turns { order: 41; display: flex; flex-direction: column; gap: 8px; margin: 4px 0 12px; }
/* R-009: the turn's own "Shrunk to ..." line, under the keys */
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgm-turn-note { margin: 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
body.lgm-on #lgm-turn-note[hidden] { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="piece"]:not([data-phone-row="turn"]) #lgm-body #lgm-turns,
body.lgm-on .lgm-ws[data-phone-piece="text"] #lgm-body #lgm-turns,
body.lgm-on .lgm-ws:not([data-phone-tool="piece"]) #lgm-turns { display: none; }
body.lgm-on .lgm-ws #lgm-body #lgw-pt-rot,
body.lgm-on .lgm-ws #lgm-body #lgw-pt-strip .lgw-pt-key[data-lgw-pt^="flip"],
body.lgm-on .lgm-ws #lgm-body #lgw-pt-strip:not(:has(> .lgw-pt-key[data-lgw-pt="back"]:not([hidden]))) { display: none !important; }
body.lgm-on .lgm-turn-l { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
body.lgm-on .lgm-turn-l[hidden] { display: none; }
body.lgm-on .lgm-turn-t { flex: none; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
body.lgm-on .lgm-seg { display: inline-flex; flex-wrap: wrap; justify-content: flex-end; gap: 6px; min-width: 0; }
body.lgm-on .lgm-ws .lgm-pair {
  min-width: 44px; min-height: 44px; margin: 0; padding: 0 10px; border: 1px solid var(--q-hair-strong); border-radius: 8px;
  background: var(--q-panel); color: var(--q-ink); font: 600 1.4rem/1 var(--q-body); font-variant-numeric: tabular-nums;
  white-space: nowrap; box-shadow: none; cursor: pointer; -webkit-tap-highlight-color: transparent;
  transition: background 120ms ease, border-color 120ms ease, color 120ms ease;
}
body.lgm-on .lgm-ws .lgm-pair[aria-pressed="true"] { background: var(--q-ink); border-color: var(--q-ink); color: #FFFFFF; }
body.lgm-on .lgm-ws .lgm-pair:focus-visible { outline: 2px solid var(--q-ink); outline-offset: 2px; }
/* S3: the Width stepper's feel - a press steps, a hold repeats, the spent
   key fades to 30 per cent; the readout and the badge on the garment count
   in tenths with figures that never shuffle */
body.lgm-on .lgm-ws #lgm-body #lgw-ins-size .lgw-ins-sizebtn {
  touch-action: manipulation; -webkit-user-select: none; user-select: none; -webkit-touch-callout: none;
}
body.lgm-on .lgm-ws #lgm-body #lgw-ins-size .lgw-ins-sizebtn.lgm-held { background: var(--q-hover); }
body.lgm-on .lg-logo .dim { font-variant-numeric: tabular-nums; }
/* the spot's limit line steps aside (the line under Width says it at the
   largest); a logo too tall for its spot still says so */
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-limit:not(:has(.lgw-ins-fit--no)) { display: none !important; }
/* an empty side's outline (the comp's back state): the side's first spot as
   the PC's dashed box and name tag; Hide borders hides it with the rest */
#lgm-side-bound { pointer-events: none; }
body:not(.lgm-on) #lgm-side-bound, body.lgw-borders-off #lgm-side-bound { display: none !important; }
/* S3: an empty side's offer in the Logo sheet (the comp's back state): the
   logo's card, Put it here with the price each, the dashed Upload another */
body.lgm-on .lgm-ws[data-phone-tool="offer"] #lgm-body > .lg-ticket,
body.lgm-on .lgm-ws[data-phone-tool="offer"] #lgm-hint-slot { display: none; }
body.lgm-on .lgm-offer:not([hidden]) { display: flex; flex-direction: column; gap: 12px; padding: 4px var(--q-gutter) 16px; }
body.lgm-on .lgm-offer[hidden] { display: none; }
body.lgm-on .lgm-offer-card { display: flex; align-items: center; gap: 12px; min-height: 56px; }
body.lgm-on .lgm-offer-ph {
  display: grid; place-items: center; width: 44px; height: 44px; flex: none; padding: 4px; overflow: hidden;
  background: #FFFFFF; border: 1px solid var(--q-hair); border-radius: 6px;
}
body.lgm-on .lgm-offer-ph img { display: block; max-width: 100%; max-height: 100%; object-fit: contain; }
body.lgm-on .lgm-offer-w { display: flex; flex-direction: column; min-width: 0; }
body.lgm-on .lgm-offer-t { font: 600 1.5rem/2rem var(--q-body); color: var(--q-ink); }
body.lgm-on .lgm-offer-sub { font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
body.lgm-on .lgm-ws .lgm-offer-put {
  display: flex; align-items: center; justify-content: center; width: 100%; height: 48px; margin: 0; padding: 0 16px;
  border: 1px solid var(--q-hair-strong); border-radius: 8px; background: var(--q-panel); color: var(--q-ink);
  font: 600 1.5rem/1 var(--q-body); cursor: pointer; -webkit-tap-highlight-color: transparent;
}
body.lgm-on .lgm-ws .lgm-offer-put:active { border-color: var(--q-ink); background: var(--q-hover); }
body.lgm-on .lgm-ws .lgm-offer-put[hidden] { display: none; }
body.lgm-on .lgm-ws .lgm-offer .lgm-add { flex: none; width: 100%; }
/* the bar's figure rolls like a till when it changes (STUDIO_PLAN 5.8) */
body.lgm-on .lgm-footer .lgw-price-v { display: inline-block; }
/* S3: one design on more than one garment (STUDIO_PLAN 4.8): the garment
   chips above the stage in the band's own style, the one on the stage ink, a
   dashed + at the end; one line under them for a few seconds */
body.lgm-on .lgm-gchips:not([hidden]) {
  display: flex; gap: 8px; flex: none; margin: 0 -12px 8px; padding: 0 12px; overflow-x: auto; scrollbar-width: none;
}
body.lgm-on .lgm-gchips::-webkit-scrollbar { display: none; }
body.lgm-on .lgm-ws .lgm-gchip {
  display: inline-flex; align-items: center; gap: 10px; flex: none; height: 48px; margin: 0; padding: 4px 14px 4px 4px;
  background: var(--q-white); border: 1px solid var(--q-hair-strong); border-radius: 8px; color: var(--q-ink); text-align: left;
  box-shadow: none; cursor: pointer; -webkit-tap-highlight-color: transparent;
  transition: background 120ms ease, border-color 120ms ease, color 120ms ease;
}
body.lgm-on .lgm-ws .lgm-gchip--on { background: var(--q-ink); border-color: var(--q-ink); color: #FFFFFF; }
body.lgm-on .lgm-gchip-ph {
  display: grid; place-items: center; width: 38px; height: 38px; flex: none; overflow: hidden;
  background: #FFFFFF; border: 1px solid var(--q-hair); border-radius: 4px;
}
body.lgm-on .lgm-gchip-ph img { display: block; width: 100%; height: 100%; object-fit: contain; }
body.lgm-on .lgm-gchip-w { display: flex; flex-direction: column; align-items: flex-start; min-width: 0; }
body.lgm-on .lgm-gchip-n { font: 500 1.3rem/1.6rem var(--q-display); letter-spacing: .04em; text-transform: uppercase; white-space: nowrap; }
body.lgm-on .lgm-gchip-c { font: 400 1.2rem/1.6rem var(--q-body); color: var(--q-muted); white-space: nowrap; }
body.lgm-on .lgm-gchip--on .lgm-gchip-c { color: rgba(253, 252, 247, .78); }
body.lgm-on .lgm-ws .lgm-gchip-add {
  display: grid; place-items: center; flex: none; width: 48px; height: 48px; margin: 0; padding: 0;
  border: 1px dashed var(--q-hair-strong); border-radius: 8px; background: transparent; color: var(--q-ink); cursor: pointer;
}
body.lgm-on .lgm-ws .lgm-gchip-add:disabled { opacity: .3; cursor: default; }

/* C5 (Joel's pick, 4 Oct 2026): one garment's line above the stage - the
   chips row's own chip, white, filling the row: the photo, the garment's
   name and colour, Change; the dashed + after it. It takes the row's 56 px
   from the stage's margin; the garment draws at the same size. A raised
   sheet (the chart, the fonts, typing) has the garment to itself. */
body.lgm-on .lgm-ws .lgm-gchip--line { flex: 1 1 auto; min-width: 0; padding-right: 6px; }
body.lgm-on .lgm-gchip--line .lgm-gchip-w { flex: 1 1 auto; min-width: 0; }
body.lgm-on .lgm-gchip--line .lgm-gchip-n { overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
body.lgm-on .lgm-gchip-chg {
  display: inline-flex; align-items: center; flex: none; min-height: 44px; padding: 0 8px;
  font: 600 1.4rem/1 var(--q-body); color: var(--q-ink); text-decoration: underline; text-underline-offset: .2em;
}
body.lgm-on .lgm-ws.lgm-gline[data-phone-raised] .lgm-gchips { display: none; }
body.lgm-on .lgm-ws[data-phone-raised] #lgm-lb { display: none; }
/* a short phone (under 700 tall) gives a sheet's garment the whole canvas:
   the line steps aside while a tool sheet is open (one tap away on the plate
   again when it lowers) */
@media (max-width: 560px) and (max-height: 699.98px) {
  body.lgm-on .lgm-ws.lgm-gline:not([data-phone-surface="canvas"]) .lgm-gchips { display: none; }
}
/* the bar: never "from" once a piece is on; a piece not yet priced dims
   the figure while "Pricing…" stands in for its line */
body.lgm-on .lgm-ws.lgm-unpriced .lgm-pe-top::before { content: none; }
body.lgm-on .lgm-ws.lgm-unpriced #lgm-pe-from { opacity: .4; transition: opacity .15s ease; }
body.lgm-on .lgm-gnote {
  position: absolute; left: 8px; right: 8px; top: 64px; z-index: 7; margin: 0; padding: 10px 12px 10px 28px;
  background: var(--q-cream); border: 1px solid var(--q-hair); border-radius: 8px; box-shadow: var(--q-sh-tool);
  font: 400 1.4rem/2rem var(--q-body); color: var(--q-ink); pointer-events: none;
  transition: opacity 220ms ease, transform 220ms ease;
}
body.lgm-on .lgm-gnote::before { content: ""; position: absolute; left: 12px; top: 17px; width: 6px; height: 6px; border-radius: 50%; background: var(--q-ink); }
body.lgm-on .lgm-gnote[hidden] { display: none; }
body.lgm-on .lgm-gnote.lgm-gnote--out { opacity: 0; transform: translateY(-4px); }
/* C3 (Joel's pick, 4 Oct 2026): the card under the garment chips when a
   piece has no spot on the garment just added: where the rest went, then
   the piece's question and its two answers. Not placed, not priced until
   the customer chooses. */
body.lgm-on .lgm-lb {
  position: relative; flex: none; margin: 0 0 8px; padding: 10px 12px 12px 30px;
  background: var(--q-cream); border: 1px solid var(--q-hair); border-radius: 8px; box-shadow: var(--q-sh-tool);
  font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-ink); text-transform: none; letter-spacing: 0; text-align: left;
}
body.lgm-on .lgm-lb[hidden] { display: none; }
body.lgm-on .lgm-lb::before { content: ""; position: absolute; left: 13px; top: 16px; width: 7px; height: 7px; border-radius: 50%; background: var(--q-ink); }
body.lgm-on .lgm-lb p { margin: 0; }
body.lgm-on .lgm-lb .lgm-lb-done { color: var(--q-muted); }
body.lgm-on .lgm-lb .lgm-lb-done[hidden] { display: none; }
body.lgm-on .lgm-lb .lgm-lb-q { font: 600 1.4rem/2rem var(--q-body); }
body.lgm-on .lgm-lb .lgm-lb-done:not([hidden]) + .lgm-lb-q { margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--q-hair); }
body.lgm-on .lgm-lb .lgm-lb-sub { display: block; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
body.lgm-on .lgm-lb .lgm-lb-acts { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
body.lgm-on .lgm-ws .lgm-lb .lgm-lb-put {
  height: 44px; margin: 0; padding: 0 12px; border: 1px solid var(--q-hair-strong); border-radius: 8px; background: var(--q-white);
  color: var(--q-ink); font: 600 1.4rem/1 var(--q-body); cursor: pointer;
}
body.lgm-on .lgm-ws .lgm-lb .lgm-lb-off {
  min-height: 44px; margin: 0; padding: 0 6px; border: 0; background: none; color: var(--q-ink); font: 600 1.4rem/1 var(--q-body);
  text-decoration: underline; text-underline-offset: .2em; cursor: pointer;
}
body.lgm-on .lgm-lb :is(.lgm-lb-put, .lgm-lb-off):focus-visible { outline: 2px solid var(--q-ink); outline-offset: 2px; }
/* the Garment sheet's foot: Add another garment; Add to my design and
   Cancel while one is being added; Remove this garment, asking in place */
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body .lg-step.lgw-active > .lg-step-body > #lgm-gmore { order: 4; }
body.lgm-on .lgm-gmore { display: flex; flex-direction: column; gap: 8px; padding: 8px 0 4px; }
body.lgm-on .lgm-ws:not([data-phone-tool="garment"]) #lgm-gmore,
body.lgm-on .lgm-ws #lgm-body .lg-step:has(.lgw-picker.lgw-pk-open) #lgm-gmore { display: none; }
body.lgm-on .lgm-gmore [hidden] { display: none !important; }
body.lgm-on .lgm-ws .lgm-gmore .lgm-add { flex: none; width: 100%; }
body.lgm-on .lgm-gadding { display: flex; gap: 8px; }
body.lgm-on .lgm-ws .lgm-gadd-go {
  flex: 1 1 auto; height: 48px; margin: 0; padding: 0 16px; border: 1px solid var(--q-ink); border-radius: 8px;
  background: var(--q-ink); color: #FFFFFF; font: 600 1.5rem/1 var(--q-body); cursor: pointer;
}
body.lgm-on .lgm-ws .lgm-gadd-cancel {
  flex: none; height: 48px; margin: 0; padding: 0 16px; border: 1px solid var(--q-hair-strong); border-radius: 8px;
  background: var(--q-panel); color: var(--q-ink); font: 600 1.5rem/1 var(--q-body); cursor: pointer;
}
body.lgm-on .lgm-grm { padding-top: 8px; border-top: 1px solid var(--q-hair); }
body.lgm-on .lgm-ws .lgm-grm-b {
  display: inline-flex; align-items: center; min-height: 44px; margin: 0; padding: 0 2px; border: 0; background: none;
  color: var(--q-stop); font: 500 1.4rem/1 var(--q-body); cursor: pointer;
}
body.lgm-on .lgm-grm-ask:not([hidden]) { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px; min-height: 56px; }
/* S3 (STUDIO_PLAN 5.1): "Stitching your preview" is the tool's ink label at
   the stage's foot, its underline running like a stitch line; the flat
   picture the preview replaces fades out over it */
body.lgm-on .lgw-dg-chip:not([hidden]) {
  top: auto; bottom: 12px; left: 50%; right: auto; z-index: 6; max-width: calc(100% - 24px); transform: translateX(-50%);
  padding: 7px 12px 9px; border-radius: 4px; background: var(--q-ink); color: #FFFFFF; box-shadow: none;
  font: 600 1.2rem/1.6rem var(--q-display); letter-spacing: .1em; text-transform: uppercase; white-space: nowrap;
}
body.lgm-on .lgw-dg-chip .tx { position: relative; display: inline-block; vertical-align: top; }
body.lgm-on .lgw-dg-chip .rule {
  display: block; position: absolute; left: 0; right: 0; bottom: -3px; height: 1.5px; opacity: 1;
  background-image: repeating-linear-gradient(90deg, #FFFFFF 0 6px, transparent 6px 10px); background-size: 20px 1.5px;
  animation: lgm-stitch-run 700ms linear infinite;
}
@keyframes lgm-stitch-run { to { background-position: 20px 0; } }
body.lgm-on .lg-logo img.lgm-art-was { position: absolute; left: 0; top: 0; width: 100%; height: 100%; pointer-events: none; }
@media (prefers-reduced-motion: reduce) {
  body.lgm-on .lgw-dg-chip .rule { animation: none; }
}
/* the words' Text rows end in their own Spot row (it opens the same cards) */
body.lgm-on .lgm-ws:not([data-phone-tool="text"]) #lgm-row-tspot, #lgm-row-tspot[hidden] { display: none; }
/* the phone's own nodes inside shared panels stay off the PC shell */
body:not(.lgm-on) :is(#lgm-turns, #lgm-spot-note, #lgm-gmore, #lgm-gchips, #lgm-gnote, #lgm-offer,
  #lgm-row-turn, #lgm-row-spot, #lgm-adds, #lgm-row-tspot, #lgm-lb) { display: none !important; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body :is(#lg-tool-dup, #lg-tool-pin, #lgm-move-artwork) {
  align-self: flex-start; min-height: 44px; margin: 0 0 8px; padding: 0 14px; border: 1px solid var(--q-hair-strong); border-radius: 8px;
  background: var(--q-panel); color: var(--q-ink); font: 600 1.4rem/1 var(--q-body); box-shadow: none; text-transform: none; letter-spacing: 0;
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body :is(#lg-tool-pin, #lgm-move-artwork)[aria-pressed="true"] { background: var(--q-ink); border-color: var(--q-ink); color: #FFFFFF; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lg-tools .lg-tool--nudge {
  align-self: flex-start; width: 44px; height: 44px; min-height: 44px; margin: 0 0 8px; padding: 0; border: 1px solid var(--q-hair-strong); border-radius: 8px; background: var(--q-white);
}

/* the file card: a picture of the file on white, its name, where it sits;
   Swap file and the quiet red Remove on the right (Remove asks in place) */
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-id {
  display: flex; flex-wrap: wrap; align-items: center; gap: 4px 12px; min-height: 56px; margin: 0; padding: 6px 0;
  border: 0; border-radius: 0; background: none;
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-id .lgw-ins-thumb {
  display: grid; place-items: center; width: 44px; height: 44px; flex: none; padding: 4px; overflow: hidden;
  background: #FFFFFF; border: 1px solid var(--q-hair); border-radius: 6px;
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-id .lgw-ins-f { display: flex; flex-direction: column; flex: 1 1 0; min-width: 0; gap: 0; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-nm { font: 600 1.5rem/2rem var(--q-body); color: var(--q-ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-side { font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); letter-spacing: 0; text-transform: none; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-upstat { order: 3; font: 400 1.2rem/1.6rem var(--q-body); color: var(--q-quiet); }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body :is(#lgw-ins-swap, #lgw-ins-remove) {
  display: inline-flex; align-items: center; flex: none; min-width: 0; min-height: 44px; max-width: none; margin: 0; padding: 0 2px;
  border: 0; border-radius: 0; background: none; font: 500 1.3rem/1 var(--q-body); letter-spacing: 0; text-transform: none; white-space: nowrap; cursor: pointer;
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-swap { color: var(--q-ink); text-decoration: underline; text-underline-offset: .2em; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-remove { display: inline-flex; color: var(--q-stop); text-decoration: none; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-remove:active { text-decoration: underline; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body :is(#lgw-ins-swap, #lgw-ins-remove)[hidden] { display: none; }
/* asking in place: the PC's "Remove this piece?" with Remove and Keep */
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-idconfirm { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-id.lgw-ins-confirming > :not(#lgw-ins-idconfirm) { display: none !important; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-id.lgw-ins-confirming > #lgw-ins-idconfirm {
  display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px; width: 100%; min-height: 56px;
}
body.lgm-on .lgm-ws .lgw-ins-confirm-q { flex: 1 1 150px; margin: 0; font: 600 1.6rem/2.2rem var(--q-display); letter-spacing: .005em; color: var(--q-ink); }
body.lgm-on .lgm-ws .lgw-ins-confirm-actions { display: flex; gap: 8px; }
body.lgm-on .lgm-ws :is(.lgw-ins-confirm-yes, .lgw-ins-confirm-no) { height: 44px; min-height: 44px; padding: 0 14px; border-radius: 8px; font: 600 1.4rem/1 var(--q-body); cursor: pointer; }
body.lgm-on .lgm-ws .lgw-ins-confirm-yes { border: 1px solid var(--q-stop); background: var(--q-stop); color: #FFFFFF; }
body.lgm-on .lgm-ws .lgw-ins-confirm-no { border: 1px solid var(--q-key-edge); background: var(--q-panel); color: var(--q-ink); }

/* the thread colours: one chip per colour (a 20 px dot and the name), each a
   tap into today's chart; the count stepper stays in the label row */
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-th-lbl {
  display: flex; align-items: center; flex-wrap: wrap; gap: 4px 12px; margin: 0; padding: 14px 0 4px; border-top: 1px solid var(--q-hair);
  font: 600 1.5rem/2rem var(--q-body); color: var(--q-ink); letter-spacing: 0; text-transform: none;
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads {
  display: flex; flex-direction: row; flex-wrap: nowrap; align-items: center; gap: 8px; min-width: 0; margin: 0 calc(-1 * var(--q-gutter)); padding: 4px var(--q-gutter) 8px; overflow-x: auto; scrollbar-width: none;
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads::-webkit-scrollbar { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-th {
  display: inline-flex; align-items: center; gap: 8px; flex: none; width: auto; min-width: 0; height: 44px; min-height: 44px; margin: 0;
  padding: 0 12px 0 10px; border: 1px solid var(--q-hair-strong); border-radius: 8px; background: var(--q-white); color: var(--q-ink);
  font: 600 1.4rem/1 var(--q-body); white-space: nowrap; box-shadow: none;
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-thdot { width: 20px; height: 20px; flex: none; border-radius: 50%; box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22); }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads :is(.lgw-ins-thno, .lgw-ins-thchg) { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-thnm { font: 600 1.4rem/1 var(--q-body); white-space: nowrap; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-thnote { flex: 1 0 100%; margin: 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); white-space: normal; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-promise { margin: 0 0 12px; font: 400 1.2rem/1.6rem var(--q-body); font-style: normal; color: var(--q-quiet); }
/* R-013: the PC's line on what the count does, under the stepper */
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-th-lbl > #lgw-ins-clcopy:not([hidden]) {
  display: block; flex: 1 0 100%; margin: 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); letter-spacing: 0; text-transform: none; text-wrap: pretty;
}

/* ── C2 (Joel's pick, 4 Oct 2026): the thread plan. Each colour the file
   holds sits beside the thread we sew for it (the file's swatch, an arrow,
   the thread's dot and name), two to a row; the background is a dashed line
   of the plan ("Not sewn, the background"); then "3 colors read from your
   file · Fewer · More" and "What you pick is what we sew." A tile is the
   row it was: a tap opens the chart on that thread. The PC's label row,
   stepper and footnote stay the PC's. ── */
.lgw-ins-planh, .lgw-ins-plancount, .lgw-ins-planhelp, .lgw-ins-thfrom, .lgw-ins-tharr, .lgw-ins-thplan { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body :is(#lgw-ins-th-lbl, #lgw-ins-promise) { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-planh:not([hidden]) {
  display: block; order: 20; margin: 0; padding: 10px 0 6px; border-top: 1px solid var(--q-hair);
  font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted);
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-planh b { font-weight: 600; color: var(--q-ink); }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; margin: 0; padding: 0 0 4px; overflow: visible;
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-th {
  display: flex; align-items: center; gap: 7px; width: auto; min-width: 0; height: 46px; min-height: 46px; padding: 0 10px;
  font: 600 1.4rem/1.8rem var(--q-body); text-align: left;
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-thnote { grid-column: 1 / -1; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-th--from .lgw-ins-thfrom {
  display: block; order: -3; flex: none; width: 16px; height: 16px; border-radius: 3px; box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22);
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-th--from .lgw-ins-tharr {
  display: block; order: -2; position: relative; flex: none; width: 12px; height: 8px;
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-tharr::before {
  content: ""; position: absolute; left: 0; right: 2px; top: 3.25px; height: 1.5px; background: var(--q-key-edge);
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-tharr::after {
  content: ""; position: absolute; right: 1px; top: 1px; width: 5px; height: 5px;
  border-right: 1.5px solid var(--q-key-edge); border-top: 1.5px solid var(--q-key-edge); transform: rotate(45deg);
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-thdot { order: -1; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-thnm { min-width: 0; overflow: hidden; text-overflow: ellipsis; font: 600 1.4rem/1.8rem var(--q-body); }
/* a colour or the background that is not sewn: a dashed tile and dot */
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads :is(.lgw-ins-th--bg, .lgw-ins-th--off) .lgw-ins-thnm { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads :is(.lgw-ins-th--bg, .lgw-ins-th--off) .lgw-ins-thplan {
  display: block; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis;
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-thplan small {
  display: block; overflow: hidden; text-overflow: ellipsis; font: 400 1.2rem/1.5rem var(--q-body); color: var(--q-muted);
}
@media (max-width: 380px) {
  body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-th { gap: 6px; padding: 0 8px; }
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-th--off { border-style: dashed; background: transparent; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-th--off .lgw-ins-thplan { font-weight: 500; color: var(--q-muted); }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-threads .lgw-ins-th--off .lgw-ins-thdot {
  background: transparent !important; border: 1.5px dashed var(--q-key-edge); box-shadow: none;
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-plancount:not([hidden]) {
  display: flex; align-items: center; flex-wrap: wrap; column-gap: 8px; order: 23; min-height: 44px; margin: 0;
  font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted);
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-plancount b { font-weight: 600; color: var(--q-ink); }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-plancount .lgw-ins-plansep { font-style: normal; color: var(--q-hair-strong); }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-plancount .lgw-ins-planstep {
  min-height: 44px; margin: 0; padding: 0 2px; border: 0; background: none; color: var(--q-ink); font: 600 1.3rem/1 var(--q-body);
  text-decoration: underline; text-underline-offset: .2em; cursor: pointer;
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-plancount .lgw-ins-planstep:disabled { opacity: .3; cursor: default; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-plancount .lgw-ins-planstep:focus-visible { outline: 2px solid var(--q-ink); outline-offset: 2px; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body .lgw-ins-plancount--one :is(.lgw-ins-planstep, .lgw-ins-plansep) { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-planhelp:not([hidden]) {
  display: block; order: 24; margin: -8px 0 10px; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted);
}

/* Width: the label (and how tall) left, the sizes pages' stepper right; the
   size M note and the spot's limit under it, then Center */
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-size,
body.lgm-on .lgm-ws:is([data-phone-tool="piece"], [data-phone-tool="text"]) #lgm-body .lgw-ins-size--text {
  display: grid; grid-template-columns: minmax(0, 1fr) 44px auto 44px; grid-template-rows: auto auto; align-items: center; column-gap: 0;
  min-height: 60px; margin: 0; padding: 6px 0; border: 0; border-top: 1px solid var(--q-hair); background: none;
}
body.lgm-on .lgm-ws #lgm-body #lgw-ins-size[hidden] { display: none; }
body.lgm-on .lgm-ws #lgm-body #lgw-ins-size .lgw-ins-size-w { grid-column: 1; grid-row: 1; align-self: end; font: 600 1.5rem/2rem var(--q-body); color: var(--q-ink); letter-spacing: 0; text-transform: none; }
body.lgm-on .lgm-ws #lgm-body #lgw-ins-size .lgw-ins-size-meta { grid-column: 1; grid-row: 2; align-self: start; margin: 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
body.lgm-on .lgm-ws #lgm-body #lgw-ins-size .lgw-ins-sizebtn {
  grid-row: 1 / span 2; display: grid; place-items: center; width: 44px; height: 48px; min-width: 44px; min-height: 48px; margin: 0; padding: 0;
  border: 1px solid var(--q-hair-strong); background: var(--q-white); color: var(--q-ink); font: 500 2rem/1 var(--q-body); box-shadow: none;
}
body.lgm-on .lgm-ws #lgm-body #lgw-ins-size #lgw-ins-size-minus { grid-column: 2; border-right: 0; border-radius: 10px 0 0 10px; }
body.lgm-on .lgm-ws #lgm-body #lgw-ins-size #lgw-ins-size-plus { grid-column: 4; border-left: 0; border-radius: 0 10px 10px 0; }
body.lgm-on .lgm-ws #lgm-body #lgw-ins-size .lgw-ins-sizebtn:disabled { opacity: 1; color: rgba(24, 21, 16, .28); cursor: default; }
body.lgm-on .lgm-ws #lgm-body #lgw-ins-size .lgw-ins-size-val {
  grid-column: 3; grid-row: 1 / span 2; position: relative; display: grid; place-items: center; min-width: 64px; height: 48px; padding: 0 6px;
  border-top: 1px solid var(--q-hair-strong); border-bottom: 1px solid var(--q-hair-strong); background: var(--q-white);
  font: 500 1.7rem/1 var(--q-display); font-variant-numeric: tabular-nums; letter-spacing: .02em; color: var(--q-ink); white-space: nowrap;
}
body.lgm-on .lgm-ws #lgm-body #lgw-ins-size .lgw-ins-size-val::before,
body.lgm-on .lgm-ws #lgm-body #lgw-ins-size .lgw-ins-size-val::after { content: ""; position: absolute; top: 12px; bottom: 12px; width: 1px; background: var(--q-hair); }
body.lgm-on .lgm-ws #lgm-body #lgw-ins-size .lgw-ins-size-val::before { left: 0; }
body.lgm-on .lgm-ws #lgm-body #lgw-ins-size .lgw-ins-size-val::after { right: 0; }
body.lgm-on .lgm-ws:is([data-phone-tool="piece"], [data-phone-tool="text"]) #lgm-body #lgw-ins-sizenote:not([hidden]),
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-limit:not([hidden]) {
  display: block; margin: 0 0 4px; font: 400 1.2rem/1.6rem var(--q-body); color: var(--q-quiet);
}
body.lgm-on .lgm-ws #lgm-body #lgw-ins-limit * { font-size: 1.2rem; }
body.lgm-on .lgm-ws:is([data-phone-tool="piece"], [data-phone-tool="text"]) #lgm-body #lgw-ins-center:not([hidden]) {
  display: inline-flex; align-items: center; align-self: flex-start; gap: 8px; min-height: 44px; margin: 4px 0 12px; padding: 0 16px 0 12px;
  border: 1px solid var(--q-hair-strong); border-radius: 8px; background: var(--q-panel); color: var(--q-ink); font: 600 1.4rem/1 var(--q-body);
}
body.lgm-on .lgm-ws #lgm-body #lgw-ins-center .lgw-ins-center-ico { display: inline-grid; place-items: center; width: 18px; height: 18px; }
body.lgm-on .lgm-ws #lgm-body #lgw-ins-center .lgw-ins-center-ico svg { width: 16px; height: 16px; }

/* the 3D puff on a cap front: a row with the kit's tick box */
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-puff:not([hidden]) {
  display: flex; align-items: center; gap: 12px; min-height: 56px; margin: 0; padding: 6px 0; border-top: 1px solid var(--q-hair);
  font: 600 1.5rem/2rem var(--q-body); color: var(--q-ink); cursor: pointer;
}
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-puff .lgw-ins-pufftick { width: 24px; height: 24px; flex: none; margin: 0; accent-color: var(--q-ink); }
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-puff .lgw-ins-pufffee { font-weight: 400; color: var(--q-muted); }

/* the tonal warning: one quiet line under the thread chips (no box, no
   Dismiss); the short words are the shell's own (tonalSync) */
body.lgm-on .lgm-ws #lgm-body #lgw-tonal-warning:not([hidden]) {
  display: block; margin: 0 0 8px; padding: 0; border: 0; border-radius: 0; background: none; box-shadow: none;
}
body.lgm-on .lgm-ws #lgm-body #lgw-tonal-warning::before { display: none; }
body.lgm-on .lgm-ws #lgm-body #lgw-tonal-warning :is(#lgw-tonal-dismiss, .lgw-tonal-dot) { display: none; }
body.lgm-on .lgm-ws #lgm-body #lgw-tonal-warning #lgw-tonal-copy { display: none; margin: 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
body.lgm-on .lgm-ws #lgm-body #lgw-tonal-warning .lgw-tonal-short { display: block; margin: 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
body.lgm-on .lgm-ws #lgm-body #lgw-tonal-warning .lgw-tonal-short:empty { display: none; }
body.lgm-on .lgm-ws #lgm-body #lgw-tonal-warning:has(.lgw-tonal-short:empty) #lgw-tonal-copy { display: block; }

/* ── the Logo sheet with no logo yet: where it lands, two other ways in ── */
body.lgm-on .lgm-ws:not([data-phone-tool="add"]) #lgm-logo-start { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="add"] #lgm-body #lgm-placement-tools { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="add"] #lgm-body #lgw-ins > :not(#lgm-logo-start):not(#lgw-ins-preupload-seat):not(#lgw-ins-placement-live) { display: none !important; }
body.lgm-on .lgm-ws[data-phone-tool="add"] #lgm-body #lgw-ins { display: flex; flex-direction: column; }
body.lgm-on .lgm-ws[data-phone-tool="add"] #lgm-body #lgm-logo-start { display: block; order: -1; padding: 4px 0 8px; }
body.lgm-on .lgm-tan { margin: 0 0 8px; padding: 12px 16px; background: var(--q-cream); border: 1px solid var(--q-hair); border-radius: 10px; }
body.lgm-on .lgm-tan-p { margin: 0; font: 400 1.4rem/2rem var(--q-body); color: var(--q-ink); }
body.lgm-on .lgm-tan-s { margin: 4px 0 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
body.lgm-on .lgm-ws[data-phone-tool="add"] #lgm-body #lgw-ins-preupload-seat .lgw-preupload-facts { margin: 8px 0 0; padding: 12px 0 0; border-top: 1px solid var(--q-hair); }

/* ── the Garment sheet: the garment card (Change opens today's picker), its
   colours as dots in one row, the style pair (the engine's own controls) ── */
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body .lg-step.lgw-active > .lg-step-head { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body .lg-step.lgw-active > .lg-step-body { display: flex; flex-direction: column; }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body .lg-step.lgw-active > .lg-step-body > * { order: 5; }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body .lg-step.lgw-active > .lg-step-body > #lgw-prod { order: 1; }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body .lg-step.lgw-active > .lg-step-body > #lgw-picker { order: 2; }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body .lg-step.lgw-active > .lg-step-body > .lgx-c-opts { order: 3; }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body .lgw-gar-copy { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body .lgx-c-opts { display: flex; flex-direction: column; margin: 0 0 8px; }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body .lg-step:has(.lgw-picker.lgw-pk-open) .lgx-c-opts { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body .lgx-optrow:not([hidden]) { display: flex; flex-direction: column; gap: 6px; padding: 8px 0; border: 0; }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body .lgx-optrow--color { order: -1; }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body .lgx-optlbl { font: 600 1.5rem/2rem var(--q-body); color: var(--q-ink); letter-spacing: 0; text-transform: none; }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body .lgx-opts { display: flex; flex-wrap: wrap; gap: 6px; }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body .lgx-opts .lg-style {
  min-width: 44px; min-height: 44px; margin: 0; padding: 0 12px; border: 1px solid var(--q-hair-strong); border-radius: 8px;
  background: var(--q-panel); color: var(--q-ink); font: 500 1.3rem/1 var(--q-body); letter-spacing: 0; text-transform: none; white-space: nowrap; box-shadow: none;
}
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body .lgx-opts .lg-style.active { background: var(--q-ink); border-color: var(--q-ink); color: #FFFFFF; }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body #lg-color-stack .lg-swatches:not([hidden]) {
  display: flex; flex-wrap: wrap; gap: 2px; margin: 0 -6px; padding: 0; border: 0; background: none;
}
/* each swatch paints its own colour (its inline background) as a 32 px dot
   inside a 44 px key: the paint is clipped to the content box */
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body #lg-color-stack .lg-sw {
  position: relative; display: block; width: 44px; height: 44px; min-width: 44px; min-height: 44px; margin: 0; padding: 6px;
  border: 0; border-radius: 50%; box-shadow: none; cursor: pointer;
  background-clip: content-box !important; background-origin: content-box !important;
  transition: transform 120ms ease;
}
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body #lg-color-stack .lg-sw::after {
  content: ""; position: absolute; inset: 6px; border-radius: 50%; box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22); pointer-events: none;
  transition: box-shadow 120ms ease;
}
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body #lg-color-stack .lg-sw.active::after { box-shadow: 0 0 0 3px var(--q-panel), 0 0 0 5px var(--q-ink), inset 0 0 0 1px rgba(24, 21, 16, .22); }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body #lg-color-stack .lg-sw:active { transform: scale(1.08); }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body #lg-color-stack .lg-sw[aria-disabled="true"] { opacity: .45; }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body #lg-color-stack .lg-sw:focus-visible { outline: 2px solid var(--q-ink); outline-offset: -2px; }
/* past 8 colors the row shows the first 8 and ends in "+N more", the key of
   the color menu (pmSync in js/studio/03_engine.js keeps it last in the
   group); a chosen color past the first 8 takes the eighth slot, as on the
   PC's color dock. The key is inset like a dot, so it lines up under them. */
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body #lg-color-stack .lg-sw:nth-child(n+9):not(.active),
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body #lg-color-stack .lg-swatches:has(> .lg-sw.active:nth-child(n+9)) > .lg-sw:nth-child(8) { display: none; }
.lgm-cmore { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body #lg-color-stack .lgm-cmore:not([hidden]) {
  display: inline-flex; align-items: center; justify-content: center; min-height: 44px; margin: 0 6px; padding: 0 14px;
  border: 1px solid var(--q-hair-strong); border-radius: 8px; background: var(--q-panel); box-shadow: none;
  color: var(--q-ink); font: 600 1.5rem/2rem var(--q-body); letter-spacing: 0; text-transform: none; white-space: nowrap; cursor: pointer;
}
@media (hover: hover) {
  body.lgm-on .lgm-ws[data-phone-tool="garment"] #lgm-body #lg-color-stack .lgm-cmore:hover { border-color: var(--q-ink); }
}
/* Change garment: the picker opens in the sheet, raised to the most the
   garment allows (the canvas keeps its 39.1 per cent) */
body.lgm-on .lgm-ws[data-phone-tool="garment"]:has(.lgw-picker.lgw-pk-open) .lgm-sheet {
  max-height: calc(var(--lgm-visible-height, 100dvh) * .609 - var(--lgw-top, var(--nav-height)) - var(--q-bar-h));
}

/* the hint seat keeps the engine's notes (an applied file, an out colour,
   a size advisory); the tonal line belongs under the thread chips only */
body.lgm-on .lgm-ws #lgm-hint-slot #lgw-tonal-warning { display: none !important; }

/* ── the Text sheet: the PC Text panel's own rows (studio_visual.css reads
   both shells); the phone's two old controls are the rows' duplicates ── */
body.lgm-on .lgm-ws #lgm-body :is(#lgt-words-label, .lgt-phone-font) { display: none; }
/* Joel's order: the words, font and caps first, then thread, size (Center
   under it), rotation, then the rest - the layering keys come last here */
body.lgm-on .lgm-ws #lgm-body #lgt-seat { display: flex; flex-direction: column; }
body.lgm-on .lgm-ws #lgm-body #lgt-seat > #lgt-pt-strip { order: 1; margin-top: 12px; }
/* ── C4 (Joel's pick, 4 Oct 2026): the Text sheet is the Logo sheet's twin.
   The words box, Font (the studio's own sample), Thread, Width, Spot, then
   Turn (the logo's pairs) and one More row that opens Capitals, a second
   line and names on each piece: about 400 px closed. The PC's size extras
   (the slider, quick widths, notes, stitch count, Center) and its rotation
   row stay the PC's. ── */
.lgm-caps-lbl { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body #lgt-seat > * { order: 30; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body #lgt-seat > #lgt-row-words { order: 1; padding: 4px 0 12px; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body #lgt-seat > #lgt-row-font { order: 2; min-height: 56px; padding: 6px 0; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body #lgt-seat > .lgt-th { order: 3; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body #lgt-seat > .lgt-row--size { order: 4; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body #lgt-seat > #lgm-row-tspot { order: 5; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body #lgt-seat > #lgm-row-tturn { order: 6; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body #lgt-seat > #lgm-tturns { order: 7; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body #lgt-seat > #lgt-pt-strip { order: 8; margin-top: 0; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body #lgt-seat > #lgm-row-tmore { order: 9; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body #lgt-seat > #lgt-row-caps { order: 10; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body #lgt-seat > #lgt-row-addline { order: 11; padding-top: 12px; border-top: 1px solid var(--q-hair); }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body #lgt-seat > #lgt-row-pp { order: 12; }
/* Turn and More open in place; closed, their rows wait */
body.lgm-on .lgm-ws[data-phone-tool="text"]:not([data-phone-trow="turn"]) #lgm-body :is(#lgm-tturns, #lgt-pt-strip) { display: none !important; }
body.lgm-on .lgm-ws[data-phone-tool="text"]:not([data-phone-trow="more"]) #lgm-body :is(#lgt-row-caps, #lgt-row-addline, #lgt-row-pp) { display: none !important; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body #lgm-tturns { display: flex; flex-direction: column; gap: 8px; padding: 0 0 12px; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body :is(#lgm-row-tturn, #lgm-row-tmore)[hidden] { display: none; }
body.lgm-on .lgm-ws #lgm-body .lgm-row-sub { display: block; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
/* the PC's parts the phone's rows stand in for */
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body :is(#lgt-size-head, .lgt-size-row, #lgw-ins-center, #lgt-quick, #lgt-size-note, #lgt-meter, #lgt-pt-rot) { display: none !important; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body #lgt-seat > .lgt-row--size { padding: 0; border-top: 0; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body :is(#lgt-row-words > .lgt-row-lbl, #lgt-caps-lbl) {
  position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap;
}
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body .lgm-caps-lbl { display: inline; }
/* Thread: a row like Font's - the label, then the thread's dot and name and
   the chevron; the whole row opens the chart */
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body #lgt-seat > .lgt-th {
  position: relative; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; min-height: 56px; padding: 6px 0;
}
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body .lgt-th > .lgt-th-t { font: 600 1.5rem/2rem var(--q-body); color: var(--q-ink); letter-spacing: 0; text-transform: none; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body .lgt-th #lgt-th-cur {
  display: inline-flex; align-items: center; gap: 8px; min-height: 44px; margin: 0; padding: 0 4px 0 0; border: 0; background: none; box-shadow: none;
  font: 400 1.4rem/2rem var(--q-body); color: var(--q-muted); cursor: pointer;
}
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body .lgt-th #lgt-th-cur::before { content: ""; position: absolute; left: 0; right: 0; top: 0; height: 56px; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body .lgt-th #lgt-th-cur::after {
  content: ""; flex: none; width: 8px; height: 8px; margin: 0 4px 0 6px; border-right: 2px solid var(--q-ink); border-bottom: 2px solid var(--q-ink); transform: rotate(-45deg);
}
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body .lgt-th #lgt-th-cur .lgw-cl-swdot { width: 20px; height: 20px; border-radius: 50%; box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22); }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body .lgt-th #lgt-th-cur .lgw-cl-swnm { font: inherit; color: inherit; }
body.lgm-on .lgm-ws[data-phone-tool="text"] #lgm-body .lgt-th > .lgw-tonal { flex: 1 0 100%; }

/* C6 (Joel's pick, 4 Oct 2026): "Open this design?" on a saved tile says
   that the design on the garment is saved first (it is, then the other
   opens) */
body.lgm-on .lgw-ds-openask .lgw-ds-openl { flex: 1 0 100%; margin: 0; font: 400 1.2rem/1.6rem var(--q-body); color: var(--q-muted); text-align: center; }

/* every tap in a sheet is at least 44 by 44: the custom quote link, Log in,
   and the PC Text rows' pair keys, second line key and thread row */
body.lgm-on .lgm-ws #lgm-body .lg-step-body > p a[href="/get-a-quote"] { display: inline-flex; align-items: center; min-height: 44px; vertical-align: middle; }
body.lgm-on .lgm-ws #lgm-body #lgw-lib-login { display: inline-flex; align-items: center; justify-content: center; min-height: 44px; min-width: 44px; }
body.lgm-on .lgm-ws #lgm-body .lgt-seg-btn { min-height: 44px; min-width: 44px; }
body.lgm-on .lgm-ws #lgm-body #lgt-add-line { min-height: 48px; }
body.lgm-on .lgm-ws #lgm-body #lgt-th-cur { min-height: 44px; }
/* the PC rows' small keys reach 44 px in a sheet: the rotation chips and
   Reset, the words' width presets, and the two sliders (today's phone gave
   the size slider 44 px; the track stays centred in the taller box) */
body.lgm-on .lgm-ws #lgm-body :is(.lgw-pt-chip, .lgt-quick-btn) { min-height: 44px; }
body.lgm-on .lgm-ws #lgm-body :is(#lgt-size, #lgw-pt-rot-slider, #lgt-pt-rot-slider) { min-height: 44px; }

/* ── the Saved sheet: Save design and Share for approval side by side, the
   saved designs, logos on file (T1's tiles as they are), Start over last ── */
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgm-saved-top .lgw-foot-act {
  display: flex; flex-wrap: wrap; gap: 8px; margin: 4px 0 8px; padding: 0; border: 0; background: none;
}
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgm-saved-top :is(#lgw-save, #lgw-share) {
  display: inline-flex; align-items: center; justify-content: center; flex: 1 1 0; min-width: 0; height: 44px; min-height: 44px; margin: 0; padding: 0 12px;
  border: 1px solid var(--q-hair-strong); border-radius: 8px; background: var(--q-panel); color: var(--q-ink);
  font: 600 1.5rem/1 var(--q-body); letter-spacing: 0; text-transform: none; white-space: nowrap; box-shadow: none; cursor: pointer;
}
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgm-saved-top #lgw-save { order: 1; }
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgm-saved-top #lgw-share { order: 2; }
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgm-saved-top :is(#lgw-save, #lgw-share):disabled { opacity: 1; color: rgba(24, 21, 16, .38); cursor: default; }
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgm-saved-top #lgw-save-note { order: 3; flex: 1 0 100%; margin: 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-ink); }
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgm-saved-top #lgw-save-note:empty { display: none; }
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgm-saved-top #lgw-cta-seat { display: none; }
body.lgm-on .lgm-ws #lgm-body .lgm-pieces-row { justify-content: space-between; margin: 0 0 4px; font: 600 1.5rem/2rem var(--q-body); }
body.lgm-on .lgm-ws #lgm-body .lgm-pieces-row[hidden] { display: none; }
/* saved designs first, then logos on file */
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgw-lib-sections:not([hidden]) { display: flex; flex-direction: column; }
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgw-lib-sections > #lgw-ds-h2 { order: 1; }
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgw-lib-sections > #lgw-ds-list { order: 2; }
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgw-lib-sections > #lgw-ds-soon { order: 3; }
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgw-lib-sections > .lgw-ds-h2--first { order: 4; }
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgw-lib-sections > #lgw-ds-locker { order: 5; }
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgw-lib-sections .lgw-ds-h2 {
  display: block; margin: 8px 0; padding: 0; border: 0; font: 600 1.5rem/2rem var(--q-body); color: var(--q-ink); letter-spacing: 0; text-transform: none;
}
/* a saved design's name ends in dots when long, never cut in the middle */
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body .lgw-lib-name { display: block; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Start over, quiet at the very foot, asking in place */
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgm-saved-foot { display: flex; flex-direction: column; align-items: center; padding: 12px 0 16px; }
body.lgm-on .lgm-ws #lgm-body .lgm-so {
  min-height: 44px; margin: 0; padding: 0 12px; border: 0; background: none; color: var(--q-muted);
  font: 500 1.3rem/1 var(--q-body); text-decoration: underline; text-underline-offset: .2em; cursor: pointer;
}
body.lgm-on .lgm-ws #lgm-body .lgm-so[hidden], body.lgm-on .lgm-ws #lgm-body .lgm-so-ask[hidden] { display: none; }
body.lgm-on .lgm-ws #lgm-body .lgm-so-ask { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px; width: 100%; min-height: 56px; padding: 6px 0; border-top: 1px solid var(--q-hair); }
body.lgm-on .lgm-ws #lgm-body .lgm-so-q { flex: 1 1 180px; margin: 0; font: 600 1.6rem/2.2rem var(--q-display); letter-spacing: .005em; color: var(--q-ink); }
body.lgm-on .lgm-ws #lgm-body .lgm-so-acts { display: flex; gap: 8px; }
body.lgm-on .lgm-ws #lgm-body :is(.lgm-so-yes, .lgm-so-no) { height: 44px; padding: 0 14px; border-radius: 8px; font: 600 1.4rem/1 var(--q-body); cursor: pointer; }
body.lgm-on .lgm-ws #lgm-body .lgm-so-yes { border: 1px solid var(--q-stop); background: var(--q-stop); color: #FFFFFF; }
body.lgm-on .lgm-ws #lgm-body .lgm-so-no { border: 1px solid var(--q-key-edge); background: var(--q-panel); color: var(--q-ink); }

/* ── the price sheet (What the price is made of, every line the server's):
   the sizes pages' sheet over the page, rising from the bar's left side ── */
body.lgm-on #lgw-math.lgw-math { padding: 0; align-items: flex-end; }
body.lgm-on #lgw-math .lgw-mx-card {
  position: absolute; left: 0; right: 0; bottom: 0; width: auto; max-width: none; max-height: calc(100% - 8.8rem); margin: 0;
  padding: 8px var(--q-gutter) 24px; border: 0; border-radius: 16px 16px 0 0; background: var(--q-panel); box-shadow: var(--q-sh-sheet);
  animation: lgm-sheet-in 180ms var(--q-ease);
}
body.lgm-on #lgw-math .lgw-mx-card::before { content: ""; display: block; width: 36px; height: 4px; margin: 0 auto 12px; border-radius: 2px; background: var(--q-hair-strong); }
body.lgm-on #lgw-math .lgw-mx-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 0; border: 0; }
body.lgm-on #lgw-math .lgw-mx-title { margin: 0; font: 600 2.4rem/2.8rem var(--q-display); letter-spacing: .005em; text-transform: none; color: var(--q-ink); }
body.lgm-on #lgw-math #lgw-mx-close {
  display: grid; place-items: center; width: 44px; height: 44px; min-width: 44px; min-height: 44px; padding: 0;
  border: 1px solid var(--q-hair); border-radius: 8px; background: var(--q-white); color: var(--q-ink); font: 400 1.4rem/1 var(--q-body);
}
body.lgm-on #lgw-math .lgw-mx-scrim { background: var(--q-veil); }
/* nothing under 12 px on the phone: the receipt's lines at the kit's sizes */
body.lgm-on #lgw-math .lgw-mx-kt { font: 500 1.3rem/1.8rem var(--q-display); letter-spacing: .06em; }
body.lgm-on #lgw-math .lgw-mx-ks { font: 400 1.2rem/1.6rem var(--q-body); color: var(--q-quiet); }
body.lgm-on #lgw-math .lgw-mx-v { font: 500 1.5rem/2rem var(--q-display); font-variant-numeric: tabular-nums; letter-spacing: .02em; }
body.lgm-on #lgw-math .lgw-mx-note { font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
/* plan 4.2: the four prices each at 12, 24, 48 and 100 (the server's ladder) */
body.lgm-on #lgw-math .lgm-mx-lt { margin: 16px 0 0; font: 600 1.3rem/1.8rem var(--q-body); color: var(--q-ink); }
body.lgm-on #lgw-math .lgm-mx-ladder { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; margin: 8px 0 0; }
body.lgm-on #lgw-math .lgm-mx-step { padding: 8px 4px; border: 1px solid var(--q-hair); border-radius: 8px; background: var(--q-white); text-align: center; }
body.lgm-on #lgw-math .lgm-mx-q { display: block; font: 500 1.2rem/1.6rem var(--q-display); letter-spacing: .06em; color: var(--q-quiet); }
body.lgm-on #lgw-math .lgm-mx-p { display: block; font: 500 1.5rem/2rem var(--q-display); font-variant-numeric: tabular-nums; color: var(--q-ink); }

/* ── Share for approval: the studio's own sheet, over the page on a veil ── */
body.lgm-on .lgm-ws[data-phone-tool="library"] #lgm-body #lgw-share[hidden] { display: none; }
body.lgm-on :is(#lgw-sfa, #lgw-lis).lgw-lis { position: fixed; inset: 0; z-index: 90; display: block; }
body.lgm-on :is(#lgw-sfa, #lgw-lis).lgw-lis[hidden] { display: none; }
body.lgm-on :is(#lgw-sfa, #lgw-lis) .lgw-lis-scrim { position: absolute; inset: 0; background: var(--q-veil); }
body.lgm-on :is(#lgw-sfa, #lgw-lis) .lgw-lis-card {
  position: absolute; left: 0; right: 0; bottom: 0; top: auto; width: auto; max-width: none; max-height: calc(100% - 8.8rem); overflow: auto;
  overscroll-behavior: contain; margin: 0; padding: 8px var(--q-gutter) 24px; transform: none; border: 0; border-radius: 16px 16px 0 0;
  background: var(--q-panel); box-shadow: var(--q-sh-sheet); animation: lgm-sheet-in 180ms var(--q-ease);
}
body.lgm-on :is(#lgw-sfa, #lgw-lis) .lgw-lis-card::before { content: ""; display: block; width: 36px; height: 4px; margin: 0 auto 12px; border-radius: 2px; background: var(--q-hair-strong); }
body.lgm-on :is(#lgw-sfa, #lgw-lis) .lgw-lis-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
body.lgm-on :is(#lgw-sfa, #lgw-lis) .lgw-lis-title { margin: 0; font: 600 2.4rem/2.8rem var(--q-display); letter-spacing: .005em; text-transform: none; color: var(--q-ink); }
body.lgm-on #lgw-sfa #lgw-sfa-close {
  display: grid; place-items: center; width: 44px; height: 44px; min-width: 44px; padding: 0; border: 1px solid var(--q-hair); border-radius: 8px;
  background: var(--q-white); color: var(--q-ink); font: 400 1.4rem/1 var(--q-body);
}
body.lgm-on :is(#lgw-sfa, #lgw-lis) .lgw-lis-sub { margin: 4px 0 16px; font: 400 1.4rem/2rem var(--q-body); color: var(--q-muted); }
body.lgm-on :is(#lgw-sfa, #lgw-lis) .lgw-lis-label { display: block; margin: 0 0 6px; font: 600 1.3rem/1.8rem var(--q-body); color: var(--q-ink); letter-spacing: 0; text-transform: none; }
body.lgm-on :is(#lgw-sfa, #lgw-lis) .lgw-lis-input { display: block; width: 100%; height: 46px; padding: 0 12px; border: 1px solid var(--q-hair-strong); border-radius: 8px; background: var(--q-white); font: 400 1.6rem/1.3 var(--q-body); }
body.lgm-on :is(#lgw-sfa, #lgw-lis) .lgw-lis-textarea { height: 92px; padding: 10px 12px; resize: none; }
body.lgm-on :is(#lgw-sfa, #lgw-lis) .lgw-lis-field { margin-top: 12px; }
body.lgm-on :is(#lgw-sfa, #lgw-lis) .lgw-lis-count { margin: 6px 0 0; text-align: right; font: 500 1.2rem/1.6rem var(--q-display); letter-spacing: .1em; text-transform: uppercase; color: var(--q-quiet); }
body.lgm-on #lgw-sfa #lgw-sfa-send {
  display: flex; align-items: center; justify-content: center; width: 100%; height: 48px; margin: 16px 0 0; padding: 0 20px; border: 0; border-radius: 8px;
  background: var(--q-ink); color: #FFFFFF; font: 600 1.6rem/1 var(--q-body); letter-spacing: 0; text-transform: none;
}
body.lgm-on :is(#lgw-sfa, #lgw-lis) .lgw-lis-stay { margin: 12px 0 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
body.lgm-on :is(#lgw-sfa, #lgw-lis) .lgw-lis-hp { position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden; }
body.lgm-on :is(#lgw-sfa, #lgw-lis) .lgw-lis-err:not([hidden]) { margin: 12px 0 0; font: 500 1.3rem/1.8rem var(--q-body); color: var(--q-stop); }

/* R-003: Log in to save on the phone, the share sheet's own bottom sheet
   (the same rules above) with its own keys */
body.lgm-on #lgw-lis .lgw-lis-x {
  display: grid; place-items: center; width: 44px; height: 44px; min-width: 44px; padding: 0; border: 1px solid var(--q-hair); border-radius: 8px;
  background: var(--q-white); color: var(--q-ink); font: 400 1.4rem/1 var(--q-body);
}
body.lgm-on #lgw-lis .lgw-lis-what { margin: 0 0 12px; font: 400 1.4rem/2rem var(--q-body); color: var(--q-muted); }
body.lgm-on #lgw-lis .lgw-lis-what[hidden],
body.lgm-on #lgw-lis .lgw-lis-pw[hidden],
body.lgm-on #lgw-lis .lgw-lis-form[hidden] { display: none; }
body.lgm-on #lgw-lis .lgw-lis-pw { margin-top: 12px; }
body.lgm-on #lgw-lis .lgw-lis-send {
  display: flex; align-items: center; justify-content: center; width: 100%; height: 48px; margin: 16px 0 0; padding: 0 20px; border: 0; border-radius: 8px;
  background: var(--q-ink); color: #FFFFFF; font: 600 1.6rem/1 var(--q-body); letter-spacing: 0; text-transform: none;
}
body.lgm-on #lgw-lis .lgw-lis-alt { margin: 8px 0 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
body.lgm-on #lgw-lis .lgw-lis-swap {
  display: inline-flex; align-items: center; min-height: 44px; padding: 0; border: 0; background: none;
  color: var(--q-ink); font: 600 1.3rem/1.8rem var(--q-body); text-decoration: underline; text-underline-offset: 3px; cursor: pointer;
}

/* the thread chart's "Email us": a 44 px tap area on the phone (Cowork's promise) */
body.lgm-on .lgw-tc--phone .lgw-tc-f a { display: inline-flex; align-items: center; min-height: 44px; padding: 0 4px; margin: -12px -4px; }

/* typing (today's behaviour until drive S2): the words own the screen
   above the keyboard; the canvas stays laid out, invisible, so nothing on
   the garment changes size */
body.lgm-on .lgm-ws[data-phone-workspace].lgm-keyboard { grid-template-rows: auto 0 minmax(0, 1fr) 0; }
body.lgm-on .lgm-ws[data-phone-workspace].lgm-keyboard .lgm-canvas {
  position: absolute; top: 0; left: 0; width: 100%; height: 330px; visibility: hidden; pointer-events: none;
}
body.lgm-on .lgm-ws[data-phone-workspace].lgm-keyboard .lgm-footer.lgq-bar { display: none; }
body.lgm-on .lgm-ws[data-phone-workspace].lgm-keyboard .lgm-sheet { max-height: none; border-radius: 0; animation: none; }
body.lgm-on .lgm-ws[data-phone-workspace].lgm-keyboard .lgm-grab { display: none; }

/* ── the raised sheet (phone studio S2, STUDIO_PLAN.md 4.6): the thread
   chart (and the fonts, and typing) rises in place of the tool's sheet in
   180 ms on the kit's curve, the garment staying in view above it and never
   under 39.1 per cent of the screen (330 px on a 390 by 844 phone) ── */
body.lgm-on .lgm-ws[data-phone-workspace] {
  --lgm-raise-h: max(14rem, calc(var(--lgm-visible-height, 100dvh) * .609 - var(--lgw-top, var(--nav-height)) - var(--q-bar-h)));
}
body.lgm-on .lgm-raise { display: none; }
body.lgm-on .lgm-ws[data-phone-raised] .lgm-raise { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
body.lgm-on .lgm-ws[data-phone-raised] .lgm-body { display: none; }
body.lgm-on .lgm-ws[data-phone-workspace]:is([data-phone-raised="chart"], [data-phone-raised="fonts"]) .lgm-sheet { height: var(--lgm-raise-h); max-height: none; animation: none; }
/* Done, a word on the kit's secondary key, in place of the ✕ */
body.lgm-on .lgm-ws[data-phone-workspace]:is([data-phone-raised="chart"], [data-phone-raised="fonts"]) #lgm-sheet-done {
  width: auto; min-width: 72px; padding: 0 16px; font: 600 1.6rem/1 var(--q-body); color: var(--q-ink);
}
body.lgm-on #lgm-sheet-done .lgm-done-w { display: none; }
body.lgm-on .lgm-ws:is([data-phone-raised="chart"], [data-phone-raised="fonts"]) #lgm-sheet-done .lgm-done-w { display: inline; }
body.lgm-on .lgm-ws:is([data-phone-raised="chart"], [data-phone-raised="fonts"]) #lgm-sheet-done .lgm-close-x { display: none; }
/* the piece's thread chips: the one being changed in the ink edge */
body.lgm-on .lgm-raise-chips {
  display: flex; gap: 8px; flex: none; min-width: 0; padding: 0 var(--q-gutter) 8px; overflow-x: auto; scrollbar-width: none;
}
body.lgm-on .lgm-raise-chips::-webkit-scrollbar { display: none; }
body.lgm-on .lgm-raise-chips:empty { display: none; }
body.lgm-on .lgm-tchip {
  display: inline-flex; align-items: center; gap: 8px; flex: none; height: 44px; margin: 0; padding: 0 14px 0 10px;
  border: 1px solid var(--q-hair-strong); border-radius: 8px; background: var(--q-white); color: var(--q-ink);
  font: 600 1.4rem/1 var(--q-body); white-space: nowrap; cursor: pointer; transition: border-color 120ms ease, box-shadow 120ms ease;
}
body.lgm-on .lgm-tchip[aria-pressed="true"] { border-color: var(--q-ink); box-shadow: inset 0 0 0 1px var(--q-ink); cursor: default; }
body.lgm-on .lgm-tchip-dot { width: 20px; height: 20px; flex: none; border-radius: 50%; box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22); transition: background-color 120ms ease; }
body.lgm-on .lgm-tchip:focus-visible { outline: 2px solid var(--q-ink); outline-offset: 2px; }
/* typing on the garment: the words box is the sheet (46 px, 16 px text,
   Done on its right, one line and the count under it), sitting on the
   keyboard; the rest of the Text rows wait under it */
.lgm-words-done, .lgm-words-line { display: none; }
body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised="typing"] .lgm-sheet { height: auto; max-height: none; animation: none; }
body.lgm-on .lgm-ws[data-phone-raised="typing"] :is(.lgm-grab, #lgm-editor-tools, .lgm-raise, #lgm-hint-slot) { display: none; }
body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised="typing"] .lgm-body { display: block; flex: none; overflow: visible; }
body.lgm-on .lgm-ws[data-phone-raised="typing"] #lgt-panel > :not(#lgt-seat),
body.lgm-on .lgm-ws[data-phone-raised="typing"] #lgt-seat > :not(#lgt-row-words),
body.lgm-on .lgm-ws[data-phone-raised="typing"] #lgt-row-words > :is(label, .lgt-row-lbl) { display: none !important; }
body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised="typing"] .lgm-body .lg-step#lgt-panel { padding: 12px var(--q-gutter) 8px; }
body.lgm-on .lgm-ws[data-phone-raised="typing"] #lgt-row-words {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 6px 8px; margin: 0; padding: 0; border: 0;
}
body.lgm-on .lgm-ws[data-phone-raised="typing"] #lgt-row-words #lgt-input {
  order: 1; height: 46px; min-height: 46px; margin: 0; font-size: 16px;
}
body.lgm-on .lgm-ws[data-phone-raised="typing"] .lgm-words-done {
  order: 2; display: grid; place-items: center; height: 46px; min-width: 72px; margin: 0; padding: 0 16px;
  border: 1px solid var(--q-hair-strong); border-radius: 8px; background: var(--q-white); color: var(--q-ink); font: 600 1.6rem/1 var(--q-body); cursor: pointer;
}
body.lgm-on .lgm-ws[data-phone-raised="typing"] .lgm-words-done:focus-visible { outline: 2px solid var(--q-ink); outline-offset: 2px; }
body.lgm-on .lgm-ws[data-phone-raised="typing"] .lgm-words-line {
  order: 3; grid-column: 1 / -1; display: flex; justify-content: space-between; gap: 12px; margin: 0;
  font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted);
}
/* R-020: a character no stitch font sews, named in the stop colour */
body.lgm-on .lgm-ws[data-phone-raised="typing"] .lgm-words-hint--stop { color: var(--q-stop); font-weight: 500; }
body.lgm-on .lgm-ws[data-phone-raised="typing"] .lgm-words-count { flex: none; font: 500 1.3rem/1.8rem var(--q-display); letter-spacing: .06em; font-variant-numeric: tabular-nums; }
/* the fonts as rows: each name written in its own stitched face (drawn
   from the font's preview pack; the plain name until it lands, and for a
   screen reader always), the one in use ticked */
body.lgm-on .lgm-raise-list { display: none; }
body.lgm-on .lgm-ws[data-phone-raised="fonts"] :is(.lgm-raise-chips, .lgm-raise-mount) { display: none; }
body.lgm-on .lgm-ws[data-phone-raised="fonts"] .lgm-raise-list { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
body.lgm-on .lgm-fonts {
  flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 0 var(--q-gutter) 16px;
  -webkit-mask-image: linear-gradient(transparent 0, #000 8px, #000 calc(100% - 16px), transparent);
  mask-image: linear-gradient(transparent 0, #000 8px, #000 calc(100% - 16px), transparent);
}
body.lgm-on .lgm-frow {
  display: flex; align-items: center; justify-content: space-between; gap: 12px; width: 100%; min-height: 56px; margin: 0; padding: 8px 0;
  border: 0; border-bottom: 1px solid var(--q-hair); border-radius: 0; background: none; color: var(--q-ink); text-align: left; cursor: pointer;
}
body.lgm-on .lgm-frow:focus-visible { outline: 2px solid var(--q-ink); outline-offset: -2px; }
body.lgm-on .lgm-frow-face { position: relative; display: flex; align-items: center; flex: 1 1 auto; min-width: 0; height: 36px; }
body.lgm-on .lgm-frow-cv { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; transition: opacity 150ms ease; pointer-events: none; }
body.lgm-on .lgm-frow-nm { font: 400 1.6rem/2rem var(--q-body); color: var(--q-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; transition: opacity 150ms ease; }
body.lgm-on .lgm-frow--drawn .lgm-frow-cv { opacity: 1; }
body.lgm-on .lgm-frow--drawn .lgm-frow-nm { opacity: 0; }
body.lgm-on .lgm-frow-tick { flex: none; width: 24px; height: 24px; border-radius: 50%; }
body.lgm-on .lgm-frow[aria-pressed="true"] .lgm-frow-tick { background: var(--q-ink) var(--q-tick) center / 12px 12px no-repeat; }
body.lgm-on .lgm-frow[aria-pressed="true"] .lgm-frow-nm { color: var(--q-ink); font-weight: 600; }
/* the chart, mounted in the sheet (lgw_threads.js, its sheet host) */
body.lgm-on .lgm-raise-mount { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
body.lgm-on .lgw-tc-layer--sheet { position: relative; inset: auto; z-index: auto; display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
body.lgm-on .lgw-tc-layer--sheet .lgw-tc-scrim { display: none; }
body.lgm-on .lgw-tc--sheet {
  --tc-dot: 40px; --tc-pad: var(--q-gutter);
  position: relative; inset: auto; flex: 1 1 auto; min-height: 0; width: 100%; background: transparent; color: var(--q-ink);
  font: 400 1.4rem/1.4 var(--q-body);
}
body.lgm-on .lgw-tc--sheet .lgw-tc-h { display: none; }
body.lgm-on .lgw-tc--sheet .lgw-tc-tools { gap: 8px; padding: 0 0 4px; }
body.lgm-on .lgw-tc--sheet .lgw-tc-none { min-height: 44px; margin: 12px 8px 0; }
body.lgm-on .lgw-tc--sheet .lgw-tc-mach { margin: 0 var(--q-gutter); font-size: 1.3rem; line-height: 1.8rem; }
/* Search leads the families and stays put; the families slide under it,
   the one in view in ink */
body.lgm-on .lgw-tc--sheet .lgw-tc-fams {
  display: flex; gap: 8px; min-width: 0; padding: 0 var(--q-gutter); overflow-x: auto; overscroll-behavior-x: contain; scrollbar-width: none;
}
body.lgm-on .lgw-tc--sheet .lgw-tc-fams::-webkit-scrollbar { display: none; }
body.lgm-on .lgw-tc--sheet .lgw-tc-rail { display: flex; gap: 8px; padding: 0; background: none; border: 0; border-radius: 0; }
body.lgm-on .lgw-tc--sheet :is(.lgw-tc-tab, .lgw-tc-find) {
  display: inline-flex; align-items: center; gap: 8px; flex: none; grid-column: auto; width: auto; height: 44px; padding: 0 14px 0 12px;
  border: 1px solid var(--q-hair-strong); border-radius: 8px; background: var(--q-white); color: var(--q-ink);
  font: 500 1.4rem/1 var(--q-body); white-space: nowrap; cursor: pointer;
  transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease;
}
body.lgm-on .lgw-tc--sheet .lgw-tc-tab i { width: 12px; height: 12px; }
body.lgm-on .lgw-tc--sheet .lgw-tc-tab[aria-selected="true"] { background: var(--q-ink); border-color: var(--q-ink); color: #FFFFFF; }
body.lgm-on .lgw-tc--sheet .lgw-tc-find {
  position: sticky; left: 0; z-index: 1;
  box-shadow: calc(-1 * var(--q-gutter) - 1px) 0 0 0 var(--q-panel), 8px 0 0 0 var(--q-panel);
}
body.lgm-on .lgw-tc--sheet .lgw-tc-find svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.8; }
body.lgm-on .lgw-tc--sheet .lgw-tc-find[hidden] { display: none; }
/* the search: the box (16 px text, so a phone never zooms) and the key
   that puts it away; the families come back */
body.lgm-on .lgw-tc--sheet:not(.lgw-tc--search) .lgw-tc-findrow { display: none; }
body.lgm-on .lgw-tc--sheet.lgw-tc--search .lgw-tc-fams { display: none; }
body.lgm-on .lgw-tc--sheet .lgw-tc-findrow { display: flex; gap: 8px; padding: 0 var(--q-gutter); }
body.lgm-on .lgw-tc--sheet .lgw-tc-search { flex: 1 1 auto; min-width: 0; height: 44px; border-color: var(--q-hair-strong); background: var(--q-white); }
body.lgm-on .lgw-tc--sheet .lgw-tc-search:focus-within { border-color: var(--q-ink); box-shadow: inset 0 0 0 1px var(--q-ink); }
body.lgm-on .lgw-tc--sheet .lgw-tc-search input { height: 44px; margin: -1px 0; font-size: 16px; color: var(--q-ink); } /* the whole 44 px box is the input */
/* the box's own edge shows focus (ink), so the input inside draws none */
body.lgm-on .lgm-ws #lgw-tc.lgw-tc--sheet .lgw-tc-search input:is(:focus, :focus-visible) { outline: none; box-shadow: none; }
body.lgm-on .lgw-tc--sheet .lgw-tc-search input::-webkit-search-cancel-button { -webkit-appearance: none; appearance: none; display: none; }
body.lgm-on .lgw-tc--sheet .lgw-tc-unfind {
  display: grid; place-items: center; flex: none; width: 44px; height: 44px; padding: 0;
  border: 1px solid var(--q-hair); border-radius: 8px; background: var(--q-white); color: var(--q-ink); cursor: pointer;
}
body.lgm-on .lgw-tc--sheet .lgw-tc-unfind svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; }
body.lgm-on .lgw-tc--sheet .lgw-tc-unfind[hidden] { display: none; }
/* the quiet match, said once above the dots */
body.lgm-on .lgw-tc--sheet .lgw-tc-note { margin: 0 var(--q-gutter); font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
body.lgm-on .lgw-tc--sheet .lgw-tc-note b { font-weight: 600; color: var(--q-ink); }
/* the dots: 40 px, five to a row, each name in 12 px with 8 px clear of the
   next (a long word breaks where a person would; a three line name makes its
   row taller); rows settle on the top edge as they scroll */
body.lgm-on .lgw-tc--sheet .lgw-tc-body { flex: 1 1 auto; min-height: 0; border-top: 0; }
body.lgm-on .lgw-tc--sheet .lgw-tc-scroll {
  padding: 8px calc(var(--q-gutter) - 8px) 16px; scroll-snap-type: y proximity; scroll-padding-top: 8px;
  -webkit-mask-image: linear-gradient(transparent 0, #000 8px, #000 calc(100% - 16px), transparent);
  mask-image: linear-gradient(transparent 0, #000 8px, #000 calc(100% - 16px), transparent);
}
body.lgm-on .lgw-tc--sheet .lgw-tc-grid { grid-template-columns: repeat(5, minmax(0, 1fr)); row-gap: 8px; column-gap: 0; }
body.lgm-on .lgw-tc--sheet .lgw-tc-c {
  justify-content: flex-start; gap: 6px; min-width: 0; min-height: 84px; padding: 4px 4px 2px; border-radius: 8px; scroll-snap-align: start;
}
body.lgm-on .lgw-tc--sheet .lgw-tc-c i { transition: box-shadow 120ms ease; }
body.lgm-on .lgw-tc--sheet .lgw-tc-c span {
  -webkit-line-clamp: 3; min-height: 0; max-width: 100%; padding-bottom: 1px; font-size: 1.2rem; line-height: 1.6rem; color: var(--q-muted);
  hyphens: manual; -webkit-hyphens: manual;
}
body.lgm-on .lgw-tc--sheet .lgw-tc-c:hover i { box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22), 0 0 0 3px var(--q-panel), 0 0 0 4px var(--q-hair-strong); }
body.lgm-on .lgw-tc--sheet .lgw-tc-c.on i {
  box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22), 0 0 0 3px var(--q-panel), 0 0 0 5px var(--q-ink);
  animation: lgm-ring-hop 120ms var(--q-ease);
}
body.lgm-on .lgw-tc--sheet .lgw-tc-c.on span { color: var(--q-ink); font-weight: 600; }
body.lgm-on .lgw-tc--sheet .lgw-tc-c .lgw-tc-check { display: none; }
@keyframes lgm-ring-hop { from { transform: scale(.84); } to { transform: none; } }
body.lgm-on .lgw-tc--sheet .lgw-tc-cap { margin: 4px 8px 8px; font-size: 1.2rem; }
body.lgm-on .lgw-tc--sheet .lgw-tc-sep { margin: 8px 8px 12px; border-top-color: var(--q-hair); }
body.lgm-on .lgw-tc--sheet :is(.lgw-tc-empty, .lgw-tc-more) { padding: 12px 8px; font-size: 1.4rem; line-height: 2rem; color: var(--q-muted); }
/* a colour code: the customer's colour, then the five closest real threads */
body.lgm-on .lgw-tc--sheet .lgw-tc-grid--code { grid-template-columns: repeat(6, minmax(0, 1fr)); }
body.lgm-on .lgw-tc--sheet .lgw-tc-yours { display: flex; flex-direction: column; align-items: center; gap: 6px; min-width: 0; padding: 4px 4px 2px; }
body.lgm-on .lgw-tc--sheet .lgw-tc-yours i { width: 40px; height: 40px; border-radius: 6px; box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22); }
body.lgm-on .lgw-tc--sheet .lgw-tc-yours span { font: 600 1.2rem/1.6rem var(--q-body); color: var(--q-ink); text-align: center; }
body.lgm-on .lgw-tc--sheet .lgw-tc-codeline { margin: 4px 8px 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
/* with the keyboard up (the chart's search, typing): the workspace follows
   the visual viewport (iOS pans it), the garment keeps the space above the
   sheet, moved in close, and the sheet shrinks to what is being typed */
body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised].lgm-keyboard {
  grid-template-rows: auto minmax(0, 1fr) auto 0; transform: translateY(var(--lgm-vv-top, 0px));
}
body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised].lgm-keyboard .lgm-canvas {
  position: relative; top: auto; left: auto; width: auto; height: auto; visibility: visible; pointer-events: auto; padding-bottom: 8px;
}
body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised].lgm-keyboard .lgm-sheet {
  height: auto; max-height: none; border-radius: 16px 16px 0 0; animation: none;
}
body.lgm-on .lgm-ws[data-phone-raised].lgm-keyboard :is(.lgm-grab, #lgm-editor-tools, .lgm-raise-chips) { display: none; }
/* searching with the keyboard up: the box, then the matches in one row
   right above the keyboard (a tap on one chooses it and the keyboard goes) */
body.lgm-on .lgm-ws.lgm-keyboard .lgw-tc--sheet .lgw-tc-tools { padding: 6px 0 4px; }
body.lgm-on .lgm-ws.lgm-keyboard .lgw-tc--sheet .lgw-tc-body { flex: none; height: 58px; }
body.lgm-on .lgm-ws.lgm-keyboard .lgw-tc--sheet .lgw-tc-scroll {
  display: flex; overflow-x: auto; overflow-y: hidden; padding: 0 calc(var(--q-gutter) - 8px) 4px; scroll-snap-type: x proximity;
  -webkit-mask-image: none; mask-image: none; scrollbar-width: none;
}
body.lgm-on .lgm-ws.lgm-keyboard .lgw-tc--sheet .lgw-tc-grid { display: contents; }
body.lgm-on .lgm-ws.lgm-keyboard .lgw-tc--sheet :is(.lgw-tc-c, .lgw-tc-yours) { flex: 1 0 58px; max-width: 76px; min-height: 50px; gap: 2px; padding: 2px 2px 0; }
body.lgm-on .lgm-ws.lgm-keyboard .lgw-tc--sheet :is(.lgw-tc-c, .lgw-tc-yours) i { width: 30px; height: 30px; }
body.lgm-on .lgm-ws.lgm-keyboard .lgw-tc--sheet :is(.lgw-tc-c, .lgw-tc-yours) span {
  display: block; width: 100%; -webkit-line-clamp: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
body.lgm-on .lgm-ws.lgm-keyboard .lgw-tc--sheet :is(.lgw-tc-cap, .lgw-tc-sep, .lgw-tc-codeline, .lgw-tc-f, .lgw-tc-none, .lgw-tc-more) { display: none; }
body.lgm-on .lgm-ws.lgm-keyboard .lgw-tc--sheet .lgw-tc-empty { flex: 1 0 100%; padding: 14px 8px 0; font-size: 1.3rem; line-height: 1.8rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* the foot scrolls with the dots: "Email us." with a 44 px tap area */
body.lgm-on .lgw-tc--sheet .lgw-tc-f { margin: 12px 8px 0; padding: 0; border-top: 0; background: none; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
body.lgm-on .lgw-tc--sheet .lgw-tc-f a {
  display: inline-flex; align-items: center; min-height: 44px; padding: 0 4px; margin: -13px -4px; color: var(--q-ink); font-weight: 600;
}
body.lgm-on .lgw-tc--sheet .lgw-tc-f a:focus-visible { outline: 2px solid var(--q-ink); outline-offset: -2px; }

/* ── C1 (Joel's pick, 4 Oct 2026): the chart takes the sheet. The title
   row keeps its 44 px and carries the line about what a pick means; the
   quiet-match note is one line. Under 700 px tall the title folds into the
   thread chips (Done rides at their end), the dots sit closer, and the
   garment gives way to a strip moved in close on the piece (the camera's
   close-up, phoneStrip), so three rows of dots show whole. ── */
.lgm-sheet-sub { display: none; }
body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised="chart"]:not(.lgm-keyboard) #lgm-editor-tools {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; grid-template-rows: auto auto; align-content: center;
  column-gap: 12px; row-gap: 0; min-height: 44px;
}
body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised="chart"]:not(.lgm-keyboard) #lgm-sheet-title { grid-area: 1 / 1; font-size: 2rem; line-height: 2.4rem; }
body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised="chart"]:not(.lgm-keyboard) .lgm-sheet-sub {
  display: block; grid-area: 2 / 1; min-width: 0; margin: 0; font: 400 1.3rem/1.6rem var(--q-body); color: var(--q-muted);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised="chart"]:not(.lgm-keyboard) #lgm-sheet-done { grid-area: 1 / 2 / 3 / 3; }
body.lgm-on .lgw-tc--sheet .lgw-tc-note { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* rows settle clean on the top edge (the studio's 12 px focus margin
   would leave the row above showing in the fade) */
body.lgm-on .lgw-tc--sheet .lgw-tc-c { scroll-margin-top: 0; }
@media (max-width: 560px) and (max-height: 699.98px) {
  /* the sheet takes what three rows of dots need (the grab 18, the chips
     52, the families and the note 70, then 8 + three 79 px rows + two 8 px
     gaps + the 16 px fade), the strip keeps at least 104 px */
  body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised="chart"]:not(.lgm-keyboard) {
    --lgm-raise-h: min(418px, calc(var(--lgm-visible-height, 100dvh) - var(--lgw-top, var(--nav-height)) - var(--q-bar-h) - 104px));
  }
  body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised="chart"]:not(.lgm-keyboard) .lgm-grab { margin: 6px auto 8px; }
  body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised="chart"]:not(.lgm-keyboard) #lgm-editor-tools {
    position: absolute; top: 18px; right: var(--q-gutter); z-index: 2; display: block; min-height: 0; margin: 0; padding: 0;
  }
  body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised="chart"]:not(.lgm-keyboard) #lgm-sheet-title {
    position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap;
  }
  body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised="chart"]:not(.lgm-keyboard) .lgm-sheet-sub { display: none; }
  body.lgm-on .lgm-ws[data-phone-raised="chart"]:not(.lgm-keyboard) .lgm-raise-chips {
    padding-right: calc(var(--q-gutter) + 80px);
    -webkit-mask-image: linear-gradient(90deg, #000 calc(100% - var(--q-gutter) - 108px), transparent calc(100% - var(--q-gutter) - 80px));
    mask-image: linear-gradient(90deg, #000 calc(100% - var(--q-gutter) - 108px), transparent calc(100% - var(--q-gutter) - 80px));
  }
  body.lgm-on .lgm-ws[data-phone-raised="chart"]:not(.lgm-keyboard) .lgw-tc--sheet .lgw-tc-tools { padding-bottom: 0; }
  body.lgm-on .lgm-ws[data-phone-raised="chart"]:not(.lgm-keyboard) .lgw-tc--sheet .lgw-tc-c { min-height: 76px; padding: 2px 4px 0; gap: 4px; }
  /* the strip: no band, tags or Fit, the stage 8 px in */
  body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised="chart"]:not(.lgm-keyboard) .lgm-canvas { padding: 8px; }
  body.lgm-on .lgm-ws[data-phone-raised="chart"]:not(.lgm-keyboard) :is(.lgm-band, #lgm-zoom-fit, #lgm-empty-open, #lgm-gchips, #lgm-lb) { display: none !important; }
  body.lgm-on .lgm-ws[data-phone-raised="chart"]:not(.lgm-keyboard) :is(#lg-bound-tag, #lg-dim) { visibility: hidden; }
}

/* ── tablets and the classic band (561 to 1099): the same studio with more
   room. Portrait keeps the sheet on the bar, centred at the sizes pages'
   56rem sheet width and allowed taller; landscape (and a phone on its side)
   sets the stage on the left and the open tool as a panel on the right, the
   plate staying up so a tool is always one tap away. ── */
@media (min-width: 561px) {
  body.lgm-on .lgm-ws[data-phone-workspace] { --q-gutter: 2.4rem; }
  body.lgm-on .lgm-plate { left: 50%; right: auto; width: min(480px, calc(100% - 2 * var(--q-gutter))); transform: translateX(-50%); }
  body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-plate { transform: translate(-50%, 24px); }
  body.lgm-on .lgm-canvas { padding: 16px 16px 88px; }
  body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-canvas { padding-bottom: 16px; }
  body.lgm-on .lgm-band { height: 60px; padding: 10px 10px 0; }
}
@media (min-width: 561px) and (orientation: portrait) {
  body.lgm-on .lgm-ws[data-phone-workspace] {
    --lgm-sheet-max: min(440px, calc(var(--lgm-visible-height, 100dvh) * .609 - var(--lgw-top, var(--nav-height)) - var(--q-bar-h)));
  }
  body.lgm-on .lgm-ws[data-phone-workspace] .lgm-sheet { justify-self: center; width: min(56rem, 100%); border-left: 1px solid var(--q-hair); border-right: 1px solid var(--q-hair); }
}
@media (min-width: 561px) and (orientation: landscape) {
  body.lgm-on .lgm-ws[data-phone-workspace] {
    grid-template-areas: "top top" "canvas editor" "footer footer";
    grid-template-columns: minmax(0, 1fr) 0;
    grid-template-rows: auto minmax(0, 1fr) var(--q-bar-h);
  }
  body.lgm-on .lgm-ws[data-phone-workspace]:not([data-phone-surface="canvas"]) { grid-template-columns: minmax(0, 1fr) min(400px, 44%); }
  /* S2: a raised sheet fills the panel (the garment beside it keeps its room) */
  body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised] .lgm-sheet { height: auto; }
  /* ... and keeps it with the keyboard up: the garment beside the panel */
  body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised].lgm-keyboard {
    grid-template-columns: minmax(0, 1fr) min(400px, 44%); grid-template-rows: auto minmax(0, 1fr) 0;
  }
  body.lgm-on .lgm-ws[data-phone-workspace][data-phone-raised].lgm-keyboard .lgm-plate { display: none; }
  body.lgm-on .lgm-ws[data-phone-workspace] .lgm-sheet {
    max-height: none; height: auto; border-top: 0; border-left: 1px solid var(--q-hair); border-radius: 0;
    box-shadow: -6px 0 18px rgba(24, 21, 16, .07); animation-name: lgm-panel-in;
  }
  body.lgm-on .lgm-ws[data-phone-workspace] .lgm-grab { height: 0; margin: 0 0 16px; background: none; }
  body.lgm-on .lgm-ws[data-phone-tool="garment"]:has(.lgw-picker.lgw-pk-open) .lgm-sheet { max-height: none; }
  /* the plate stays up beside an open panel; the tool in use reads chosen */
  body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-plate { opacity: 1; visibility: visible; pointer-events: auto; transform: translateX(-50%); }
  body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-canvas { padding-bottom: 88px; }
  body.lgm-on .lgm-pkey[aria-pressed="true"] { background: var(--q-sel); box-shadow: inset 0 -2px 0 var(--q-ink); }
  body.lgm-on .lgm-ws[data-phone-workspace].lgm-keyboard { grid-template-columns: 0 minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr) 0; }
}
@keyframes lgm-panel-in { from { opacity: 0; transform: translateX(10px); } to { opacity: 1; transform: none; } }
/* a phone on its side (a short landscape screen): a tighter canvas, band and
   plate, so the garment keeps a useful height beside the panel */
@media (max-height: 500px) and (orientation: landscape) {
  body.lgm-on .lgm-canvas, body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-canvas { padding: 8px 8px 68px; }
  body.lgm-on .lgm-band { min-height: 52px; height: auto; padding: 4px 6px 0; }
  body.lgm-on .lgm-plate { bottom: 8px; height: 52px; }
  body.lgm-on .lgm-pkey { flex-direction: row; gap: 8px; }
}

@media (prefers-reduced-motion: reduce) {
  body.lgm-on .lgm-ws[data-phone-workspace] .lgm-sheet { animation: none !important; }
  body.lgm-on .lgw-tc--sheet .lgw-tc-c.on i, body.lgm-on .lgw-tc--sheet .lgw-tc-c i, body.lgm-on .lgm-tchip,
  body.lgm-on .lgm-tchip-dot, body.lgm-on .lgw-tc--sheet :is(.lgw-tc-tab, .lgw-tc-find) { animation: none !important; transition: none !important; }
  body.lgm-on .lgm-canvas, body.lgm-on .lgm-plate, body.lgm-on .lgm-pkey, body.lgm-on .lgm-key,
  body.lgm-on .lgm-band #lgm-views .lgw-angle, body.lgm-on #lgm-cta-slot > *, body.lgm-on .lgm-key--undo svg { transition: none !important; }
  body.lgm-on .lgm-mini-spin, body.lgm-on .lgm-ws.lgm-adding #lgm-add-logo .lgm-add-l::before { animation: none !important; }
}
/* R-023: the Text sheet's notes read at 12 px at least */
body.lgm-on :is(#lgt-size-note, #lgt-meter) { font-size: 1.2rem; }
/* R-007 (fix 2's item 8): what the approver answered, in the Saved sheet;
   the PC reads the same words on the Review card */
body:not(.lgm-on) .lgw-save-approval { display: none; }
body.lgm-on .lgw-save-approval:not([hidden]) { flex: 1 0 100%; margin: 0; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); text-wrap: pretty; }
/* fix 1b: Send again, under the Saved sheet's line about a design changed since it was shared */
body.lgm-on .lgw-save-approval .lgw-sfa-again {
  display: block; min-height: 44px; margin-top: .6rem; padding: 0 1.6rem; border: 1px solid var(--q-hair-strong);
  border-radius: 8px; background: transparent; color: var(--q-ink); font: 600 1.4rem/1 var(--q-body); cursor: pointer;
}

/* ── polish 1 (P10): a short phone gets a canvas worth looking at ──────────
   While a tool's sheet is open on a phone under 800 px tall (the sheet at
   its 300 px cap left the garment a strip from 700 to 800, where the
   garment line came back), the band steps aside as the garment line does
   and the canvas sits 6 px in, so the garment has the canvas to itself;
   one tap on Done brings both back. Under 700 px tall the canvas folds the
   rest too: the tools show their icons (each name stays for screen
   readers), the garment line is 44 px, the canvas 8 px in. ── */
@media (max-width: 560px) and (max-height: 799.98px) {
  body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-band { display: none; }
  body.lgm-on .lgm-ws.lgm-gline:not([data-phone-surface="canvas"]) .lgm-gchips { display: none; }
  body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-canvas { padding: 6px 8px; }
}
@media (max-width: 560px) and (max-height: 699.98px) {
  body.lgm-on .lgm-canvas { padding: 8px 8px 64px; }
  body.lgm-on .lgm-plate { bottom: 8px; height: 48px; }
  body.lgm-on .lgm-pkey-l { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  body.lgm-on .lgm-gchips:not([hidden]) { margin: 0 -8px 6px; padding: 0 8px; }
  body.lgm-on .lgm-ws .lgm-gchip { height: 44px; }
  body.lgm-on .lgm-gchip-ph { width: 34px; height: 34px; }
  body.lgm-on .lgm-ws .lgm-gchip-add { width: 44px; height: 44px; }
}
/* a phone on its side: stage left, the garment line and the tools right,
   so the garment takes the canvas's whole height (the plain fold left it
   under 100 px). The tools stand two by two; the left-behind card, when a
   piece waits, sits between them and the line. ── */
@media (max-height: 500px) and (orientation: landscape) {
  body.lgm-on .lgm-canvas, body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-canvas {
    display: grid; grid-template-columns: minmax(0, 1fr) 236px; grid-template-rows: auto minmax(0, auto) minmax(0, 1fr);
    grid-template-areas: "stage gline" "stage lb" "stage plate"; column-gap: 8px; padding: 8px;
  }
  body.lgm-on .lgm-canvas > .lgm-stage { grid-area: stage; }
  body.lgm-on .lgm-canvas > .lgm-gchips:not([hidden]) { grid-area: gline; margin: 0 0 8px; padding: 0; }
  body.lgm-on .lgm-canvas > .lgm-lb { grid-area: lb; margin: 0 0 8px; overflow-y: auto; }
  body.lgm-on .lgm-plate, body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-plate {
    grid-area: plate; align-self: end; position: relative; left: auto; right: auto; bottom: auto; width: auto; height: auto;
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); transform: none;
  }
  body.lgm-on .lgm-pkey { min-height: 52px; justify-content: flex-start; padding: 0 10px; }
  body.lgm-on .lgm-pkey + .lgm-pkey { border-left: 0; }
  body.lgm-on .lgm-pkey:nth-child(even) { border-left: 1px solid var(--q-hair); }
  body.lgm-on .lgm-pkey:nth-child(n+3) { border-top: 1px solid var(--q-hair); }
  /* with a tool's panel open the band and the garment line step aside (as
     on a short phone) and the tools stand in a rail of icons, the names
     kept for screen readers */
  body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-canvas { grid-template-columns: minmax(0, 1fr) 52px; }
  body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) :is(.lgm-band, .lgm-gchips, #lgm-lb) { display: none; }
  body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-plate { grid-template-columns: minmax(0, 1fr); align-self: start; }
  body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-pkey { justify-content: center; padding: 0; }
  body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-pkey:nth-child(n) { border-left: 0; }
  body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-pkey + .lgm-pkey { border-top: 1px solid var(--q-hair); }
  body.lgm-on .lgm-ws:not([data-phone-surface="canvas"]) .lgm-pkey-l { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
}

/* polish 1 (P13): under the spot cards while Spot is open, why a trucker
   offers the cap front alone (its sides are mesh) */
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-mesh { order: 52; margin: -4px 0 12px; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-muted); }
body.lgm-on .lgm-ws[data-phone-tool="piece"]:not([data-phone-row="spot"]) #lgm-body #lgw-ins-mesh,
body.lgm-on .lgm-ws:not([data-phone-tool="piece"]) #lgw-ins-mesh,
body.lgm-on #lgw-ins-mesh[hidden] { display: none; }

/* polish 1 (P15): a row of chips that runs past the sheet's edge says it
   scrolls, whatever the chips' widths: while more chips wait to the right
   (data-more-right, set from the row's scroll), its right end carries a
   short fade with a chevron; at the row's end both go. The thread chips over
   the chart and the chart's families, phone and tablet. A chip scrolled into
   view stops clear of it. A short phone's chart row keeps C1's own fade,
   where Done sits. */
body.lgm-on :is(.lgm-raise-chips, .lgw-tc--sheet .lgw-tc-fams) { scroll-padding-inline-end: 52px; }
body.lgm-on :is(#lgm-raise, .lgw-tc--sheet .lgw-tc-tools) { position: relative; }
body.lgm-on :is(#lgm-raise, .lgw-tc--sheet .lgw-tc-tools)[data-more-right]::after {
  content: ""; position: absolute; z-index: 3; right: 0; top: var(--lgm-more-top, 0px); width: 52px; height: var(--lgm-more-h, 44px);
  pointer-events: none;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 16'%3E%3Cpath d='M2.5 2l6 6-6 6' fill='none' stroke='%23181510' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") right 12px center / 9px 14px no-repeat,
    linear-gradient(90deg, transparent, var(--tc-paper, var(--q-panel)) 46%);
}
@media (max-width: 560px) and (max-height: 699.98px) {
  body.lgm-on .lgm-ws[data-phone-raised="chart"]:not(.lgm-keyboard) #lgm-raise::after { content: none; }
}

/* polish 1 (U5): the Turn keys, every eighth turn now, stand two rows of
   four; the Width stepper's signs are drawn alike (the key's own ink) */
body.lgm-on .lgm-seg.lgm-seg--turn { display: grid; grid-template-columns: repeat(4, minmax(52px, 1fr)); }
body.lgm-on .lgm-ws #lgm-body #lgw-ins-size .lgw-ins-sizebtn .lgw-sign { width: 16px; height: 16px; }

/* polish 1 (P5): a small or very thin logo file's quiet line, after the
   uploaded status in the Logo sheet's header */
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-ins-res { order: 4; margin-top: 4px; font: 400 1.3rem/1.8rem var(--q-body); color: var(--q-ink); text-wrap: pretty; }
body.lgm-on #lgw-ins-res[hidden] { display: none; }

  /* Desktop Studio: the masthead becomes the tool's ink title bar. The
     separate .lgw-bar remains a hidden shell anchor below; it no longer
     paints or consumes workspace height. */
  @media (min-width:1100px) {
    #site-header.site-header--scrolled {
      --nav-bg: var(--vh-ink);
      --nav-fg: var(--vh-white);
      --nav-fg-muted: var(--vh-line);
      --nav-border: rgba(253,252,247,.14);
      --nav-blur: 0px;
    }
    #site-header.site-header--scrolled .nav-link--primary {
      background: var(--vh-white);
      border-color: var(--vh-white);
      color: var(--vh-ink) !important;
    }
    #site-header.site-header--scrolled .nav-link--primary.nav-link--active::after {
      display: none;
    }
    #site-header.site-header--scrolled .cart-badge {
      background: var(--vh-white);
      color: var(--vh-ink);
    }
  }

/* ==========================================================================
   The color menu (Joel 2026-10-10). A garment with more than 25 colors opens
   its "+N more" (the canvas color dock's key, the full-screen garment
   picker's) as a dialog of its own, built by the engine (cmBuild in
   js/studio/03_engine.js): the garment's name and count, every color as a
   named swatch in the strip's order (the picks, a thin rule, the extras),
   the current one ringed, a search past 40 colors. The swatch language is
   the studio's: a circle with a 1px edge, selected = a 2px ink ring at a 3px
   offset, the name under it (selected ink 600, others muted), no box around
   a swatch. A centred card over a scrim at 1100 and up; on the phone shell a
   full-height sheet like the studio's other phone sheets (the kit's tokens
   ride .lgm-q on the layer); there the Garment sheet's own "+N more" opens
   it past 8 colors (2026-10-11; the key is styled in studio_sheet.css).
   ========================================================================== */
.lgw-cm-layer {
  position: fixed;
  inset: 0;
  z-index: 80;                       /* over the full-screen garment picker (72) */
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 3.2rem;
}
.lgw-cm-layer[hidden],
.lgw-cm-layer [hidden] { display: none !important; }
html.lgw-cm-lock,
html.lgw-cm-lock body { overflow: hidden; }
.lgw-cm-scrim {
  position: absolute;
  inset: 0;
  background: rgba(24, 21, 16, .46);
  cursor: pointer;
}
.lgw-cm {
  position: relative;
  display: flex;
  flex-direction: column;
  width: min(68rem, 100%);
  max-height: min(80rem, 100%);
  overflow: hidden;
  box-sizing: border-box;
  background: var(--vh-white, #FDFCF7);
  color: var(--vh-ink, #181510);
  border: 1px solid #E6E1D8;
  border-radius: 12px;
  box-shadow: 0 30px 80px rgba(24, 21, 16, .38);
  font-family: var(--vh-body, 'Cooper Hewitt', 'DM Sans', sans-serif);
  font-size: 1.4rem;
  line-height: 1.4;
  text-align: left;
  animation: lgwCmIn 180ms cubic-bezier(.2, .7, .2, 1);
}
.lgw-cm.lgw-cm--find { height: min(80rem, 100%); }   /* filtering never resizes the card */
.lgw-cm:focus { outline: none; }
.lgw-cm *,
.lgw-cm *::before,
.lgw-cm *::after { box-sizing: border-box; }
@keyframes lgwCmIn {
  from { opacity: 0; transform: translateY(10px); }
  to   { opacity: 1; transform: none; }
}

/* ── head: eyebrow, the garment's name, the count, the close key, search ── */
.lgw-cm-head {
  flex: none;
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  column-gap: 1.6rem;
  align-items: start;
  padding: 2.4rem 2.8rem 1.8rem;
  border-bottom: 1px solid #E6E1D8;
}
.lgw-cm .lgw-cm-eye {
  margin: 0 0 .8rem;
  font-family: var(--vh-display, 'Oswald', sans-serif);
  font-weight: 500;
  font-size: 1.2rem;
  line-height: 1;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: #6B675F;
}
.lgw-cm .lgw-cm-title {
  margin: 0;
  font-family: var(--vh-display, 'Oswald', sans-serif);
  font-weight: 600;
  font-size: 3rem;
  line-height: 1.05;
  letter-spacing: .005em;
  text-transform: none;
  color: var(--vh-ink, #181510);
}
.lgw-cm .lgw-cm-count {
  margin: .6rem 0 0;
  font-size: 1.4rem;
  line-height: 1.4;
  color: #59554E;
}
.lgw-cm .lgw-cm-x {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 4.4rem;
  height: 4.4rem;
  margin: 0;
  padding: 0;
  background: #FFFFFF;
  border: 1px solid #CFCAC0;
  border-radius: 8px;
  color: var(--vh-ink, #181510);
  cursor: pointer;
}
.lgw-cm-x svg { width: 1.4rem; height: 1.4rem; }
.lgw-cm .lgw-cm-x:hover { border-color: var(--vh-ink, #181510); }
.lgw-cm-search {
  grid-column: 1 / -1;
  display: flex;
  align-items: center;
  gap: .8rem;
  height: 4.4rem;
  margin: 1.6rem 0 0;
  padding: 0 1.2rem;
  background: #FFFFFF;
  border: 1px solid #CFCAC0;
  border-radius: 8px;
  color: #6B675F;
  cursor: text;
}
.lgw-cm-search svg { flex: none; width: 1.5rem; height: 1.5rem; }
.lgw-cm-search:focus-within { border-color: var(--vh-ink, #181510); }
.lgw-cm .lgw-cm-search input {
  flex: 1;
  min-width: 0;
  height: 100%;
  margin: 0;
  padding: 0;
  background: transparent;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  outline: none;
  font-family: inherit;
  font-size: 1.5rem;
  color: var(--vh-ink, #181510);
  -webkit-appearance: none;
  appearance: none;
}
.lgw-cm-search input::placeholder { color: #8A867E; opacity: 1; }
.lgw-cm-search input::-webkit-search-decoration { -webkit-appearance: none; }
/* the box's own clear key, in ink */
.lgw-cm-search input::-webkit-search-cancel-button {
  -webkit-appearance: none;
  appearance: none;
  width: 1.4rem;
  height: 1.4rem;
  background: var(--vh-ink, #181510);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='M2 2l10 10M12 2L2 12' stroke='black' stroke-width='1.8' stroke-linecap='round'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='M2 2l10 10M12 2L2 12' stroke='black' stroke-width='1.8' stroke-linecap='round'/%3E%3C/svg%3E") center / contain no-repeat;
  cursor: pointer;
}

/* ── the swatches ───────────────────────────────────────────────────────── */
.lgw-cm-body {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
  padding: 2rem 2rem 2.4rem;
  scrollbar-width: thin;
  scrollbar-color: #D8D2C6 transparent;
}
.lgw-cm-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(9.6rem, 1fr));
  align-items: start;
  gap: 1.8rem .4rem;
}
.lgw-cm .lgw-cm-sw {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .7rem;
  min-width: 0;
  margin: 0;
  padding: .6rem .4rem .4rem;
  background: none;
  border: 0;
  border-radius: 8px;
  font: inherit;
  letter-spacing: 0;
  text-transform: none;
  text-align: center;
  color: inherit;
  cursor: pointer;
}
.lgw-cm-dot {
  position: relative;
  flex: none;
  width: 4rem;
  height: 4rem;
  border-radius: 50%;
  box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22);
}
.lgw-cm-sw:hover .lgw-cm-dot {
  box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22), 0 0 0 2px var(--vh-white, #FDFCF7), 0 0 0 3px #CFCAC0;
}
.lgw-cm-sw.lgw-pk-sel .lgw-cm-dot,
.lgw-cm-sw.lgw-pk-sel:hover .lgw-cm-dot {
  box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22), 0 0 0 3px var(--vh-white, #FDFCF7), 0 0 0 5px var(--vh-ink, #181510);
}
.lgw-cm-nm,
.lgw-cm-note {
  display: block;
  max-width: 100%;
  font-size: 1.3rem;
  line-height: 1.3;
  color: #59554E;
  overflow-wrap: break-word;
}
.lgw-cm-note { margin-top: -.4rem; font-size: 1.2rem; }
.lgw-cm-sw.lgw-pk-sel .lgw-cm-nm { color: var(--vh-ink, #181510); font-weight: 600; }
/* live stock Part B: an out color stays listed, greyed with a thin diagonal
   (the strip's mark); its "Out of stock" reads in ink */
.lgw-cm-sw[aria-disabled="true"] { cursor: not-allowed; }
.lgw-cm-sw[aria-disabled="true"] .lgw-cm-dot { opacity: .45; }
.lgw-cm-sw[aria-disabled="true"]:hover .lgw-cm-dot { box-shadow: inset 0 0 0 1px rgba(24, 21, 16, .22); }
.lgw-cm-sw[aria-disabled="true"] .lgw-cm-dot::after {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: linear-gradient(to top right, transparent calc(50% - 2px), rgba(250, 246, 238, .92) calc(50% - 2px), rgba(250, 246, 238, .92) calc(50% - .6px), #181510 calc(50% - .6px), #181510 calc(50% + .6px), rgba(250, 246, 238, .92) calc(50% + .6px), rgba(250, 246, 238, .92) calc(50% + 2px), transparent calc(50% + 2px));
}
.lgw-cm-sw[aria-disabled="true"] .lgw-cm-note { color: var(--vh-ink, #181510); }
/* the extras follow Joel's picks after a thin rule, as on the strip */
.lgw-cm-rule {
  grid-column: 1 / -1;
  height: 0;
  margin: 0 .6rem;
  border-top: 1px solid #E6E1D8;
}
.lgw-cm .lgw-cm-empty,
.lgw-cm .lgw-cm-wait {
  margin: 0;
  padding: 2.4rem .6rem 0;
  font-size: 1.4rem;
  line-height: 1.45;
  text-align: center;
  color: #6B675F;
}
.lgw-cm .lgw-cm-empty:empty { padding: 0; }
.lgw-cm-sw:focus { outline: none; }
.lgw-cm-sw:focus-visible .lgw-cm-dot { outline: 2px solid var(--vh-ink, #181510); outline-offset: 5px; }
.lgw-cm-x:focus-visible { outline: 2px solid var(--vh-ink, #181510); outline-offset: 2px; }

@media (prefers-reduced-motion: reduce) {
  .lgw-cm { animation: none; }
}

/* ── the phone shell: a full-height sheet over the page, the kit's sheet ── */
body.lgm-on .lgw-cm-layer { z-index: 90; padding: 0; align-items: flex-end; }
body.lgm-on .lgw-cm-scrim { background: var(--q-veil); }
body.lgm-on .lgw-cm {
  width: 100%;
  height: calc(100% - 8.8rem);
  max-height: none;
  padding-top: 8px;
  border: 0;
  border-radius: 16px 16px 0 0;
  background: var(--q-panel);
  box-shadow: var(--q-sh-sheet);
  animation: lgm-sheet-in 180ms var(--q-ease);
}
body.lgm-on .lgw-cm::before {
  content: "";
  flex: none;
  display: block;
  width: 36px;
  height: 4px;
  margin: 0 auto 12px;
  border-radius: 2px;
  background: var(--q-hair-strong);
}
body.lgm-on .lgw-cm-head { align-items: center; padding: 0 var(--q-gutter) 12px; border-bottom-color: var(--q-hair); }
body.lgm-on .lgw-cm .lgw-cm-eye { display: none; }
body.lgm-on .lgw-cm .lgw-cm-title { font: 600 2.4rem/2.8rem var(--q-display); }
body.lgm-on .lgw-cm .lgw-cm-count { margin-top: 2px; font: 400 1.4rem/2rem var(--q-body); color: var(--q-muted); }
body.lgm-on .lgw-cm .lgw-cm-x { width: 44px; height: 44px; border-color: var(--q-hair); background: var(--q-white); }
body.lgm-on .lgw-cm-search { height: 46px; margin-top: 12px; border-color: var(--q-hair-strong); }
/* 16px, so a phone does not zoom the page to the box */
body.lgm-on .lgw-cm .lgw-cm-search input { font-size: 1.6rem; }
body.lgm-on .lgw-cm-body { padding: 14px var(--q-gutter) calc(24px + env(safe-area-inset-bottom, 0px)); }
body.lgm-on .lgw-cm-grid { grid-template-columns: repeat(auto-fill, minmax(76px, 1fr)); gap: 14px 4px; }
body.lgm-on .lgw-cm .lgw-cm-sw { min-height: 44px; padding: 4px 2px; }
body.lgm-on .lgw-cm-dot { width: 44px; height: 44px; }
@media (prefers-reduced-motion: reduce) {
  body.lgm-on .lgw-cm { animation: none; }
}

/* The 3D puff picker (js/studio/05_puff.js; Joel 2026-10-18): the block
   under the 3D puff tick, and the stage while a piece is picked. Vintage:
   ink on cream and white, ink the accent; the studio's error red marks a
   shape raised at the customer's risk. */

/* ── the block ── */
.lgw-puff { margin: .8rem 0 0; font: 400 1.4rem/1.5 var(--vh-body); color: var(--vh-ink); }
.lgw-puff[hidden], .lgw-puff [hidden] { display: none !important; }
.lgw-puff-note { margin: 0 0 .8rem; color: var(--vh-muted); }
.lgw-puff-pick { display: flex; flex-direction: column; gap: 1rem; padding: 1.2rem 1.3rem;
  border: 1px solid var(--vh-line); background: var(--vh-white); }
.lgw-puff-pick .lgw-puff-note { margin: 0; }
.lgw-puff-how { margin: 0; }
.lgw-puff-chips { display: flex; flex-wrap: wrap; gap: .6rem; }
.lgw-puff-chip { display: inline-flex; align-items: center; gap: .6rem; padding: .3rem .9rem;
  border: 1px solid var(--vh-line); border-radius: 99px; background: var(--vh-cream);
  font: 600 1.25rem/1.4 var(--vh-body); font-variant-numeric: tabular-nums; color: var(--vh-muted); }
.lgw-puff-chip--raised { border-color: var(--vh-ink); background: var(--vh-white); color: var(--vh-ink); }
.lgw-puff-chip--raised::before { content: ""; width: .8rem; height: .8rem; border-radius: 50%;
  background: var(--vh-ink); box-shadow: .1rem .2rem .2rem rgba(24, 21, 16, .35); }
.lgw-puff-chip--risk { border-color: var(--vh-stop); background: var(--vh-stop-tint); color: var(--vh-stop); }
.lgw-puff-acts { display: flex; flex-wrap: wrap; gap: .8rem; }
.lgw-puff :is(.lgw-puff-btn, .lgw-puff-edit, .lgw-puff-step, .lgw-puff-done) {
  box-sizing: border-box; min-height: max(44px, 4.4rem); padding: .8rem 1.2rem; margin: 0;
  border: 1px solid #817866; border-radius: 0; background: var(--vh-white); color: var(--vh-ink);
  font: 500 1.5rem/1.3 var(--vh-body); text-align: center; cursor: pointer; }
.lgw-puff :is(.lgw-puff-btn, .lgw-puff-edit, .lgw-puff-step, .lgw-puff-done):hover:not(:disabled) { border-color: var(--vh-ink); }
.lgw-puff :is(button, input):focus-visible { outline: 2px solid var(--vh-ink); outline-offset: 2px; }
.lgw-puff :is(.lgw-puff-btn--ink, .lgw-puff-done) { border-color: var(--vh-ink); background: var(--vh-ink); color: var(--vh-cream); }
.lgw-puff button:disabled { opacity: .45; cursor: default; }
.lgw-puff-auto { display: flex; align-items: center; gap: .9rem; min-height: max(44px, 4.4rem); font-weight: 500; cursor: pointer; }
.lgw-puff-auto input { flex: none; width: 1.8rem; height: 1.8rem; margin: 0; accent-color: var(--vh-ink); cursor: pointer; }
.lgw-puff-ask { display: flex; flex-direction: column; gap: .8rem; padding: 1rem 1.1rem;
  border: 1px solid var(--vh-ink); background: var(--vh-cream); }
.lgw-puff-ask-t { margin: 0; font-weight: 500; }
.lgw-puff-foot { display: flex; align-items: center; justify-content: space-between; gap: .8rem; }
.lgw-puff .lgw-puff-done { min-width: 10rem; font-family: var(--vh-display); letter-spacing: .1em; text-transform: uppercase; }
.lgw-puff-note--nudge { animation: lgw-puff-nudge .6s ease; }
@keyframes lgw-puff-nudge { 25% { transform: translateX(-3px); } 75% { transform: translateX(3px); } }
@media (prefers-reduced-motion: reduce) { .lgw-puff-note--nudge { animation: none; } }

/* ── the stage while picking: one layer over the stage takes every press;
   the piece's grips, stalk, size tag and remove key are down (the
   selection ring stays: it says which piece is being picked) ── */
.lg-puff-hit { position: absolute; inset: 0; z-index: 40; touch-action: none; outline: none; }
.lg-puff-hit[hidden] { display: none !important; }
.lg-puff-hit:focus-visible { outline: 2px solid var(--vh-ink); outline-offset: -4px; }
.lg-logo--puffing :is(.hnd, .lg-rot, .dim, .lgw-rmx) { display: none !important; }
.lg-stage--puffing .lg-rotate { display: none !important; }
/* the canvas tools (borders, nudge, duplicate, pin, delete) wait for Done */
body.lg-puffing:not(.lgm-on) #lg-tools { display: none !important; }

/* the panel while picking: the piece's other rows wait for Done */
#lgw-ins.lgw-ins--puffing > :not(#lgw-ins-id):not(#lgw-ins-puff):not(#lgw-puff) { display: none !important; }

/* ── the phone: the block sits under the tick in the piece sheet; while
   picking the sheet holds the tick and the picker alone, so the piece can
   fill the stage above it ── */
body.lgm-on .lgm-ws[data-phone-tool="piece"] #lgm-body #lgw-puff { order: 71; margin: 0 0 12px; font-size: 1.5rem; }
body.lgm-on .lgm-ws[data-phone-puff] #lgm-body #lgw-ins-id,
body.lgm-on .lgm-ws[data-phone-puff] #lgm-body :is(#lgm-placement-tools, #lg-tools) > *,
body.lgm-on .lgm-ws[data-phone-puff] #lgm-body :is(#lgm-row-turn, #lgm-turns, #lgm-row-spot, #lgm-spot-note,
  #lgm-move-artwork, #lgm-move-note, #lgm-adds, #lgw-ins-mesh) { display: none !important; }
body.lgm-on .lgm-ws[data-phone-puff] #lgm-body #lgw-puff .lgw-puff-pick { padding: 10px 12px; gap: 8px; }
body.lgm-on .lgm-ws[data-phone-puff] #lgm-body #lgw-puff .lgw-puff-acts { flex-wrap: nowrap; }
body.lgm-on .lgm-ws[data-phone-puff] #lgm-body #lgw-puff .lgw-puff-acts > .lgw-puff-btn { flex: 1 1 0; font-size: 1.4rem; padding: 6px 8px; }
