/* Layout: header, then a full-height 3D/map viewport; on the right one settings pane at a time, picked from an icon rail. Phones: view on top, pane below, rail as a bottom tab bar.
   Look: a paper survey map. Each pane wears a map-layer colour (--pc) on its rail icon, header, sliders, switches and selected options,
   and a patch of one contour sheet behind its header (--tp picks the patch), fading out down the pane. */
:root{
  --paper:#F1EADA; --card:#FBF7EE; --rail:#E6DCC6; --ink:#2B2620; --muted:#6F6453; --line:#D9CCB0; --line2:#C4B08A;
  --red:#B5452B; --green:#4F7A3A; --brown:#8A5A2B; --blue:#2F6E9E; --purple:#6E4F8A; --ochre:#A87314; --slate:#3D4650;
  --pc:var(--ink); --pc-ink:#FBF7EE;
  --f-display:"Barlow Condensed","Arial Narrow",system-ui,sans-serif;
  --f-body:"Barlow",system-ui,-apple-system,"Segoe UI",sans-serif;
  --f-mono:"IBM Plex Mono",ui-monospace,Menlo,monospace;
  --topo:url(../img/contours.svg); /* real contours around Moro Rock and Alta Peak, Sequoia NP: tools/contours.html */
  color-scheme:light;
}
.pane[data-pane="place"]{--tp:0 0}
.pane[data-pane="place"],.rail [data-pane="place"]{--pc:var(--green)}
.pane[data-pane="surface"]{--tp:-300px -40px}
.pane[data-pane="surface"],.rail [data-pane="surface"]{--pc:var(--brown)}
.pane[data-pane="water"]{--tp:-600px 0}
.pane[data-pane="water"],.rail [data-pane="water"]{--pc:var(--blue)}
.pane[data-pane="base"]{--tp:-120px -300px}
.pane[data-pane="base"],.rail [data-pane="base"]{--pc:var(--purple)}
.pane[data-pane="light"]{--tp:-420px -260px}
.pane[data-pane="light"],.rail [data-pane="light"]{--pc:var(--ochre)}
.pane[data-pane="camera"]{--tp:-600px -340px}
.pane[data-pane="camera"],.rail [data-pane="camera"]{--pc:var(--slate)}
.pane[data-pane="labels"]{--tp:-40px -180px}
.pane[data-pane="labels"],.rail [data-pane="labels"]{--pc:var(--red)}
.pane[data-pane="export"]{--tp:-330px -150px}
*{box-sizing:border-box}
[hidden]{display:none!important}
html,body{margin:0;height:100%;background:var(--paper);color:var(--ink);font-family:var(--f-body);font-size:14px;line-height:1.4}
.app{height:100%;height:100dvh;display:flex;flex-direction:column} /* dvh: the visible area, so nothing sits under a phone browser's toolbar */

/* header: a map's neatline */
.top{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 16px;border-bottom:3px double var(--line2);flex-wrap:wrap;background:var(--paper)}
.eyebrow{font-family:var(--f-mono);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
h1{font-family:var(--f-display);font-weight:800;font-size:28px;line-height:1;letter-spacing:.03em;text-transform:uppercase;margin:0}
h1 span{color:var(--red)}
.top-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.top-actions input{width:200px}
input[type=text],input[type=number],input[type=search]{font:inherit;padding:7px 9px;background:var(--card);border:1px solid var(--line);color:var(--ink);border-radius:5px;min-width:0}
input[type=text]:focus,input[type=number]:focus,input[type=search]:focus{border-color:var(--line2);outline:none}
input[type=color]{width:34px;height:28px;padding:2px;border:1px solid var(--line);border-radius:5px;background:var(--card);cursor:pointer}
.btn{font-family:var(--f-display);font-weight:700;font-size:15px;letter-spacing:.06em;text-transform:uppercase;border:1px solid var(--line2);background:var(--card);color:var(--ink);padding:6px 14px;border-radius:5px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:6px;box-shadow:0 1px 0 var(--line)}
.btn:hover{border-color:var(--ink)}
.btn.primary{background:var(--pc);border-color:var(--pc);color:var(--pc-ink);box-shadow:none}
.btn.primary:hover{filter:brightness(1.1)}
.btn.sm{font-size:13px;padding:4px 10px}
.btn.icon{padding:6px 8px}.btn.icon svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.btn[aria-pressed="true"]{background:var(--ink);border-color:var(--ink);color:var(--paper)}
.hist{display:inline-flex;gap:4px}
.btn.wide{width:100%}
.btn:disabled{opacity:.4;cursor:default}
:focus-visible{outline:2px solid var(--red);outline-offset:2px}

/* viewport */
.main{flex:1;min-height:0;display:grid;grid-template-columns:minmax(0,1fr) auto}
.view{position:relative;min-width:0;min-height:0;display:flex}
.stage{position:absolute;inset:0}
.stage canvas{width:100%;height:100%;display:block;touch-action:none}
.stage[data-bg="studio"]{background:radial-gradient(120% 90% at 50% 20%,#4a4741 0%,#24221f 72%)}
.stage[data-bg="dark"]{background:#161513}
.stage[data-bg="light"]{background:#E9E4DA}
.stage[data-bg="clear"]{background:repeating-conic-gradient(#d8d2c4 0 25%,#ebe5d8 0 50%) 0 0/24px 24px}
.mapwrap{position:absolute;inset:0;z-index:2}
#map{position:absolute;inset:0}
.map-actions{position:absolute;right:12px;bottom:34px;display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;--pc:var(--green)}
.map-hint{position:absolute;left:12px;max-width:calc(100% - 72px);box-sizing:border-box;top:46px;margin:0;padding:3px 8px;border-radius:4px;background:rgba(24,26,24,.6);font-size:12px;color:#fff}
.view-tabs{position:absolute;top:12px;left:12px;z-index:3;box-shadow:0 1px 4px #0003}
.ex-pill{position:absolute;top:12px;left:50%;transform:translateX(-50%);z-index:3;display:flex;align-items:center;gap:10px;max-width:calc(100% - 200px);background:var(--paper);border:1px solid var(--line2);border-radius:999px;padding:4px 4px 4px 14px;font-size:13px;box-shadow:0 1px 4px #0003;white-space:nowrap}
.ex-pill span{overflow:hidden;text-overflow:ellipsis}
.ex-pill button{font:inherit;font-family:var(--f-display);font-weight:700;letter-spacing:.05em;text-transform:uppercase;font-size:12px;border:0;border-radius:999px;background:var(--ink);color:var(--paper);padding:4px 12px;cursor:pointer}
.ex-pill[hidden]{display:none}
.ex-pill i{font-style:normal}
@media (max-width:520px){.ex-pill{left:auto;right:10px;transform:none;max-width:calc(100% - 120px);font-size:12px;padding-left:10px;gap:6px}.ex-pill i{display:none}.ex-pill button{font-size:11px;padding:4px 9px}}
.map-search{position:absolute;top:12px;left:118px;width:min(320px,calc(100% - 178px));z-index:3}
.map-search input{width:100%;box-sizing:border-box;font-size:13px;padding:6px 9px;box-shadow:0 1px 4px #0003}
.map-search ul{list-style:none;margin:4px 0 0;padding:4px 0;background:var(--card);border:1px solid var(--line);border-radius:5px;max-height:50vh;overflow:auto;box-shadow:0 6px 20px #0003}
.map-search li button{display:block;width:100%;text-align:left;background:none;border:0;color:var(--ink);font:inherit;padding:6px 10px;cursor:pointer}
.map-search li button:hover,.map-search li button:focus-visible{background:var(--paper)}
.map-search small{display:block;color:var(--muted);font-size:11.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.map-search li.none{padding:6px 10px;color:var(--muted)}
.status{position:absolute;left:12px;bottom:12px;z-index:3;font-family:var(--f-mono);font-size:12px;background:var(--card);color:var(--ink);border:1px solid var(--line);padding:6px 10px;border-radius:5px;max-width:70%;box-shadow:0 1px 4px #0003}
.status:empty{display:none}
.view:has(.mapwrap:not([hidden])) .status{bottom:72px} /* clear of the map's buttons */
.status.err{color:var(--red);border-color:var(--red)}
.credits{position:absolute;right:12px;bottom:12px;z-index:1;margin:0;font-family:var(--f-mono);font-size:10.5px;color:var(--muted);background:#F1EADAcc;padding:2px 7px;border-radius:4px;pointer-events:none}
.view:has(.mapwrap:not([hidden])) .credits{display:none}

/* segmented options */
.seg{display:inline-flex;border:1px solid var(--line2);border-radius:5px;overflow:hidden;background:var(--card)}
.seg button{font-family:var(--f-mono);font-size:11px;letter-spacing:.06em;text-transform:uppercase;background:transparent;color:var(--muted);border:0;padding:6px 9px;cursor:pointer;white-space:nowrap}
.seg button+button{border-left:1px solid var(--line)}
.seg button:hover{color:var(--ink);background:var(--paper)}
.seg button[aria-pressed="true"]{background:var(--pc);color:var(--pc-ink)}
.seg.full{display:flex}.seg.full button{flex:1;padding-inline:4px;letter-spacing:.03em}
/* in the narrow pane a labelled option row stacks: label above, options full width (not when a colour swatch shares the row) */
.pane .row:has(>.seg):not(:has(>input)){flex-direction:column;align-items:stretch;gap:5px}
.pane .row:has(>.seg):not(:has(>input))>.seg{display:flex}.pane .row:has(>.seg):not(:has(>input))>.seg button{flex:1;padding-inline:4px}
.seg.grid3{display:grid;grid-template-columns:repeat(3,1fr)}
.seg.grid3 button:nth-child(4){border-left:0}
.seg.grid3 button:nth-child(n+4){border-top:1px solid var(--line)}

/* the side: one pane + the rail */
.side{display:flex;min-height:0;border-left:1px solid var(--line2)}
.panel{width:300px;background:var(--paper);overflow:auto;padding:0 14px 18px}
.side.collapsed .panel{display:none}
.pane{display:flex;flex-direction:column;gap:10px;position:relative}
/* the sheet tiles: a pane wider than its patch (phones, tablets) would otherwise run off the edge, which Safari paints solid */
.pane::before{content:"";position:absolute;left:-14px;right:-14px;top:0;height:380px;background:var(--pc);opacity:.2;pointer-events:none;
  -webkit-mask:var(--topo) var(--tp,0 0)/900px auto repeat,linear-gradient(#000 0 70px,transparent 100%);-webkit-mask-composite:source-in;
  mask:var(--topo) var(--tp,0 0)/900px auto repeat,linear-gradient(#000 0 70px,transparent 100%);mask-composite:intersect}
.pane>*{position:relative}
.ph{padding:16px 0 8px}
.ph h2{display:flex;align-items:center;gap:9px;font-family:var(--f-display);font-weight:800;font-size:24px;letter-spacing:.05em;text-transform:uppercase;margin:0;color:var(--pc)}
.ph h2 svg{width:30px;height:30px;padding:5px;border-radius:7px;background:var(--pc);fill:none;stroke:var(--pc-ink);stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;flex:none}
.card{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:10px 11px;display:flex;flex-direction:column;gap:9px;box-shadow:0 1px 0 var(--line)}
.pane>.btn.wide{margin-top:2px}
.card>.btn.sm{align-self:flex-start}
.sub{font-family:var(--f-mono);font-weight:500;font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--pc);margin:0}
.sw.sub-sw>span{font-family:var(--f-mono);font-weight:500;font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--pc)}
.rail{display:flex;flex-direction:column;gap:2px;padding:8px 5px;overflow-y:auto;scrollbar-width:none;background:var(--rail);border-left:1px solid var(--line2)}
.rail button{--c:var(--pc);display:flex;flex-direction:column;align-items:center;gap:3px;width:58px;padding:8px 0 7px;border:0;border-radius:7px;background:none;color:var(--c);cursor:pointer;font-family:var(--f-mono);font-size:9.5px;font-weight:500;letter-spacing:.08em;text-transform:uppercase}
.rail svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.rail button:hover{background:var(--paper)}
.rail button[aria-current="true"]{background:var(--pc);color:var(--pc-ink)}

/* rows and controls */
.row{display:flex;align-items:center;gap:8px;justify-content:space-between;flex-wrap:wrap}
.lbl{font-size:13px;color:var(--muted)}
.mono{font-family:var(--f-mono);font-size:12px}
.hint{font-size:12px;color:var(--muted);margin:0}
.hint a{color:inherit}
.tok input{flex:1}
.keyform{display:grid;gap:8px}
.keyhow{margin:0;padding-left:20px;font-size:12px;color:var(--muted);line-height:1.45}.keyhow li+li{margin-top:3px}.keyhow a{color:var(--ink)}
.keyhow code{font-size:11px;background:var(--card);border:1px solid var(--line);border-radius:3px;padding:0 3px}
.kmsg:empty{display:none}.kmsg.err{color:var(--red)}
.keyform.on .keyhow,.keyform.on input{display:none}
.keybox{margin:0 0 12px;border:1px solid var(--line);border-radius:8px;padding:8px 10px;background:var(--card)}
.keybox summary{cursor:pointer;font-family:var(--f-display);font-weight:700;letter-spacing:.05em;text-transform:uppercase;font-size:13px}
.keybox[open] summary{margin-bottom:8px}
.row.end{justify-content:flex-end}
.ftdlg .kicker{margin:0;font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
.ftdlg h2{margin-top:2px}
.ftrack{display:flex;gap:14px;align-items:center;margin:0 0 14px}
.ftrack canvas{width:180px;height:120px;flex:none;background:var(--card);border:1px solid var(--line);border-radius:8px}
.ftrack b{font-family:var(--f-display);font-size:18px;text-transform:uppercase;letter-spacing:.04em}
.ftrack label{margin-top:8px}
.ftopts{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.ftopts section{border:1px solid var(--line);border-radius:8px;padding:10px 12px;background:var(--card);display:grid;gap:8px;align-content:start}
.ftopts .sub{margin:0}
.ftopts #ftFree{justify-self:start}
.ftopts.one{grid-template-columns:1fr}
@media (max-width:620px){.ftopts{grid-template-columns:1fr}.ftrack canvas{width:120px;height:80px}}
.seg button:disabled{opacity:.4;cursor:not-allowed}
.pane .row>.hint{flex:1;min-width:120px}
.sl{display:grid;grid-template-columns:92px minmax(0,1fr) 54px;align-items:center;gap:8px;font-size:13px;color:var(--muted)}
.sl output{font-family:var(--f-mono);font-size:11.5px;color:var(--ink);text-align:right}
input[type=range]{width:100%;accent-color:var(--pc)}
.sw{display:flex;align-items:center;justify-content:space-between;font-size:13.5px;cursor:pointer}
.sw input{appearance:none;-webkit-appearance:none;margin:0;width:36px;height:20px;border-radius:999px;background:var(--line);position:relative;cursor:pointer;flex:none}
.sw input::before{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px #0003;transition:transform .15s}
.sw input:checked{background:var(--pc)}
.sw input:checked::before{transform:translateX(16px)}
.pair{display:grid;grid-template-columns:1fr 1fr;gap:6px}
.colors{display:flex;gap:6px}
.num{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--muted)}.num input{width:70px}
.routes{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}
.routes li{display:flex;justify-content:space-between;align-items:center;font-size:13px;background:var(--paper);border:1px solid var(--line);padding:5px 8px;border-radius:5px}
.routes button{background:none;border:0;color:var(--muted);cursor:pointer;font-size:16px}
.peaklist>summary{font-size:13px;color:var(--muted);cursor:pointer;padding:2px 0}
.peaklist>*:not(summary){margin-top:6px}
.peaklist li label{display:flex;align-items:center;gap:8px;cursor:pointer;flex:1}
.peaklist li input{accent-color:var(--pc)}
.peaklist li small{color:var(--muted)}
.peaklist .hint{margin:6px 0 0}
.flash{animation:flash 1.6s ease-out;border-radius:5px}
@keyframes flash{0%,30%{background:color-mix(in srgb,var(--pc) 22%,transparent);box-shadow:0 0 0 6px color-mix(in srgb,var(--pc) 22%,transparent)}100%{background:transparent;box-shadow:0 0 0 6px transparent}}

/* dialogs */
dialog{background:var(--paper);color:var(--ink);border:1px solid var(--line2);border-radius:10px;width:min(480px,92vw);padding:18px;box-shadow:0 12px 40px #0004}
dialog::backdrop{background:rgba(43,38,32,.45)}
dialog h2{font-family:var(--f-display);text-transform:uppercase;letter-spacing:.05em;margin:0 0 10px}
.exdlg{width:min(720px,94vw)}
.exdlg .hint{margin:0 0 12px}
.excards{list-style:none;margin:0 0 12px;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px}
.excards button{all:unset;box-sizing:border-box;cursor:pointer;display:flex;flex-direction:column;width:100%;height:100%;background:var(--card);border:1px solid var(--line);border-radius:8px;overflow:hidden}
.excards button:hover,.excards button:focus-visible{border-color:var(--ink);outline:none}
.excards img{width:100%;aspect-ratio:3/2;object-fit:cover;background:#2f2c27;display:block}
.excards li:last-child{grid-column:1/-1}
.excards li:last-child button{display:grid;grid-template-columns:auto 1fr;grid-template-rows:auto auto;align-items:center}
.excards .own{grid-row:1/3;width:64px;height:100%;min-height:54px;display:grid;place-items:center;border-right:1px solid var(--line);font-family:var(--f-display);font-size:28px;color:var(--muted)}
.excards li:last-child small{padding-bottom:8px}
.excards b{font-family:var(--f-display);text-transform:uppercase;letter-spacing:.04em;font-size:15px;padding:8px 10px 2px}
.excards small{font-size:12px;color:var(--muted);padding:0 10px 10px;line-height:1.35}
@media (max-width:520px){.excards{grid-template-columns:1fr 1fr;gap:8px}.excards img{aspect-ratio:2/1}.excards b{font-size:13px;padding:6px 8px 2px}.excards small{font-size:11px;padding:0 8px 8px}}
#browseEx{margin:0 0 14px}
.projlist{list-style:none;margin:0 0 14px;padding:0;display:flex;flex-direction:column;gap:6px;max-height:50vh;overflow:auto}
.projlist li{display:flex;justify-content:space-between;align-items:center;gap:8px;background:var(--card);border:1px solid var(--line);padding:8px 10px;border-radius:6px}
.projlist li small{color:var(--muted);font-family:var(--f-mono);font-size:11px}
.projlist .acts{display:flex;gap:6px}
dialog.find{margin:12vh auto auto;padding:0;width:min(440px,92vw);overflow:hidden}
.find input{width:100%;border:0;border-bottom:1px solid var(--line);border-radius:0;padding:12px 14px;font-size:15px;background:var(--card)}
.find input:focus-visible{outline:none}
.find ul{list-style:none;margin:0;padding:4px 0;max-height:50vh;overflow:auto}
.find ul:empty{display:none}
.find li{display:flex;justify-content:space-between;gap:12px;padding:7px 14px;cursor:pointer;font-size:13.5px}
.find li small{font-family:var(--f-mono);font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);white-space:nowrap}
.find li[aria-selected="true"]{background:var(--rail)}

@media (max-width:820px){
  /* the view takes what's left; the pane sizes to its content, up to ~half the screen */
  .main{grid-template-columns:1fr;grid-template-rows:minmax(140px,1fr) auto}
  .side{flex-direction:column;border-left:0;border-top:1px solid var(--line2)}
  .panel{width:auto;max-height:48dvh}
  .side:has(.pane[data-pane="place"]:not([hidden])) .panel{max-height:32dvh} /* the map needs the room more than Place's few controls */
  .pane::before{height:260px}
  .rail{flex-direction:row;justify-content:space-around;border-left:0;border-top:1px solid var(--line2);padding:4px 4px calc(4px + env(safe-area-inset-bottom))}
  .rail button{width:auto;flex:1}
  /* header on one row: no brand or project name, short controls; the row scrolls sideways if it still doesn't fit */
  .top{flex-wrap:nowrap;padding:6px 8px;gap:6px}
  .brand{display:none}
  .top-actions{flex-wrap:nowrap;gap:5px;overflow-x:auto;scrollbar-width:none;width:100%}
  .top-actions{justify-content:space-between}
  #projName{display:none} /* renamed on desktop; Save still uses the name */
  .credits{font-size:9px;right:8px;bottom:8px;left:auto;max-width:calc(100% - 16px);text-align:right}
  .top-actions .btn{font-size:13px;padding:5px 8px;flex:none}
  .top-actions .btn.icon{padding:5px 6px}
  .map-hint{display:none}
  /* map buttons in one sideways-scrolling row above Mapbox's logo; Build is in the Place pane */
  .map-actions{left:8px;right:8px;bottom:30px;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;justify-content:flex-start;gap:6px}
  .map-actions .btn{flex:none}
  #mapBuild{display:none}
}
/* short screens (a phone on its side): one-row header, icon-only rail, no map instructions */
@media (max-height:520px) and (min-width:821px){
  .top{flex-wrap:nowrap;padding:5px 10px}
  .brand{display:none}
  .top-actions{flex-wrap:nowrap;width:100%;justify-content:flex-end;gap:5px}
  .top-actions .btn{font-size:13px;padding:4px 9px}
  .top-actions input{width:160px;padding:4px 8px}
  .rail{padding:4px;gap:1px}
  .rail button{width:42px;padding:7px 0}
  .rail button span{display:none}
  .map-hint{display:none}
  .ph{padding-top:8px}
}
@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}
