/* ══════════════════════════════════════════════════════════
   tokens.css — design values defined ONCE for the whole site.

   Loaded first by every page, including 404.html (which is
   otherwise standalone). Nothing here styles anything; it only
   declares values that the other stylesheets read.

   Change a value here and it changes everywhere — that is the
   entire point of the file. Never hardcode one of these values
   somewhere else "just this once".
   ══════════════════════════════════════════════════════════ */

:root {
  /* ── Palette ────────────────────────────────────────────
     Mac SE/30 platinum, black and white. Deliberately one
     world — there is no dark mode. Defined here so that every
     page, including the standalone 404, sees the same values.
     (A page that redefines one of these locally will drift; the
     404 was missing --titlebar entirely, which is why its title
     bar came out transparent.) */
  --canvas:       #DDDBD7;
  --canvas-dot:   rgba(0,0,0,0.065);
  --sidebar:      #C6C4C0;
  --sidebar-edge: #9A9896;
  --win:          #FFFFFF;
  --titlebar:     #111111;
  --tb-text:      #FFFFFF;
  --border:       #111111;
  --rule:         #D8D8D8;
  --text:         #0F0F0F;
  --muted:        #606060;
  --ghost:        #AAAAAA;
  --warn:         #8A6A00;

  /* ── Type ───────────────────────────────────────────── */
  --ui:    'Space Mono', 'Courier New', monospace;
  --prose: 'Lora', Georgia, serif;

  /* ── Layout / breakpoint ───────────────────────────────
     Media queries cannot read a custom property, so the 900px
     literal still has to appear in each @media rule. What must
     NOT be duplicated is the *decision*: --mobile is published
     here and read by windows.js, so CSS alone decides when the
     layout is stacked. Without it the breakpoint lived in six
     stylesheets AND in JS, where the two could silently disagree
     — windows draggable while visually stacked. */
  --mobile: 0;

  /* ── Platinum ───────────────────────────────────────────
     The greys that make up scrollbars, the window frame strip
     and the grow box. Named by role in the bevel, not by shade,
     so the 3D edges stay coherent if the palette is retuned. */
  --metal-track: #CECCC8;
  --metal-face:  #C8C6C2;
  --metal-thumb: #B2B0AC;
  --metal-light: #E0DEDC;
  --metal-mid:   #D0CECC;
  --metal-edge:  #A0A09E;
  --metal-dark:  #8A8886;
  --metal-line:  #888888;

  /* ── Hover tints, one per surface kind ── */
  --hover-light: #F0EEEA;
  --hover-metal: #D2D0CC;
  --hover-dark:  #333333;
  --hover-thumb: #9E9C98;
  --hover-press: #A8A6A2;   /* a metal control while held down */
  --hover-grip:  #BAB8B4;   /* the grow box under the pointer */

  /* ── Surfaces ───────────────────────────────────────────
     Tints for things sitting on white or platinum. Named for the
     job they do, so a component that needs "a faint row hover"
     doesn't invent its own shade. */
  --surface-hover: #F8F7F5;   /* row hover on white */
  --surface-sunk:  #E8E6E2;   /* inset panel, review thumb */
  --surface-tile:  #D4D2CE;   /* empty photo tile */
  --code-bg:       #EFEDE9;
  --code-edge:     #D8D6D2;
  --label:         #3A3A38;   /* small uppercase section labels */
  --label-soft:    #404040;   /* the same idea, one step lighter */
  --dim:           #BEBCB8;   /* placeholder glyphs */

  /* ── Hairlines, faintest to firmest ── */
  --rule-faint:  #DEDEDE;
  --rule-strong: #C8C8C8;
  --ghost-fill:  #DDDDDD;

  /* ── Motion ─────────────────────────────────────────────
     Two speeds only. Anything slower reads as sluggish on a UI
     that is otherwise instant. */
  --t-fast: 0.08s;
  --t-base: 0.15s;

  /* ── Layers ─────────────────────────────────────────────
     Named so nobody has to guess whether 190 beats 100.
     Canvas windows get their own running z-index above --z-window
     (see windows.js); everything here is a fixed band. */
  --z-window:  10;
  --z-bar:     100;
  --z-overlay: 190;
  --z-popup:   200;

  /* ── Cursor ─────────────────────────────────────────────
     The pointing hand, needed by anything clickable — including
     the window closebox, which 404.html uses without chrome.css. */
  --cursor-hand: url("data:image/svg+xml,%3Csvg height='32' viewBox='0 0 32 32' width='32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd' transform='translate(9 8)'%3E%3Cpath d='m3.8852309 13.5522788c.15029277.1354048.25406355.2326609.57471053.5372549.31406586.2983172.46594413.439273.60482646.5572091.05791893.0487853.10729946.1792495.12686364.3731628.01609788.1595565.01049553.3375341-.0090192.5090254-.00674888.0593077-.01325791.1020883-.01698742.1224696-.04186639.2287942.13249226.4401222.36507344.4424801.20929712.0021219.37056581.00472.79741331.0123273.10679864.0019014.10679864.0019014.21395196.0037648 1.16029156.0199598 1.75290683.01448 2.1782236-.039003.45462139-.05716.92282087-.6061887 1.32754658-1.2951218.3429437.6096032.818651 1.2048784 1.2990136 1.282277.1525992.0243739.3372104.0319365.5511764.0270146.1595258-.0036697.328349-.0141847.4987188-.0294071.1284742-.0114791.2308379-.0230173.2919821-.0309462.2259121-.0292954.3737346-.2515956.31337-.4712558-.0130388-.0474468-.0339905-.1345046-.0551176-.2441066-.0244927-.1270617-.0421932-.2511642-.0502379-.3642189-.0051002-.0716765-.0061057-.1365707-.0028638-.1926702.0056365-.097781.007395-.1525378.0101327-.2790463.0010457-.0470941.0010457-.0470941.0024433-.0883088.0052898-.134881.0234093-.2629524.0820463-.5422232.0251901-.1212103.1472903-.3531692.3395862-.6402332.0572734-.0854992.1198813-.1747825.1869659-.2669588.127207-.1747861.2641214-.3514011.4010853-.5204043.0820457-.1012383.1454717-.1769623.1807968-.2180763.2962199-.424403.6120842-1.1191696.7281396-1.5253635.111416-.3904017.2005405-1.10937558.2553074-1.81604479.0300143-.40088807.0411211-.72405394.0411211-1.23097561.0000507-.08891816.0000507-.08891816.0002032-.16234685.0002858-.12025251.0003032-.16573976-.0000887-.22195195-.0010706-.15358041-.0055478-.30580145-.0203882-.6940256-.0319191-.81365149-.4778003-1.3396911-1.1348711-1.44115781-.5589865-.08632026-1.2393839.37795756-1.2393839.37795756s-.1514404-.5228127-.2537197-.6842075c-.1661957-.25934741-.5941748-.58982828-.9213451-.65421118-.3365014-.0653413-.7354024-.05811592-1.1017193.00667481-.3207944.05740454-.64034865.34382687-.82518751.65277182-.13223727.22039488-.00786932-.01169164-.14013104-.2396787-.1830552-.31402315-.60932935-.59522407-1.01524567-.67822294-.34396352-.07112559-.73801897-.04403625-1.09795562.06293793-.46304125.13836397-.53675291.49073282-.55516748.38984626-.06158674-.3382385-.06727482-.3160095-.105656-.55729603-.14258072-.89527436-.30213161-1.51473549-.54406219-2.05528331.01391678.0310773-.08860981-.20214701-.12592279-.28256779-.06461002-.13925416-.12910532-.2652956-.19999629-.38652204-.21850342-.37364978-.46891278-.65340904-.7830908-.81233894-.54561037-.27629378-1.3634177-.14183064-1.75105565.31064856-.38495968.44966797-.4491432 1.20149287-.3521966 2.13184003.03702376.36121263.16678627 1.02066144.28444961 1.50812387.04160602.1691894.07805979.32348903.14491578.60851331.01149723.04848415.01149723.04848415.02309483.09698036.05172236.21571896.09707607.39320067.15122332.5879629-.00568154-.02030261.09701461.344086.11888835.42472961.00727686.02691587.00727686.02691587.01448296.05395339.04082856.15377935.08074083.31959314.14309954.5963099.03412572.1521447.06742545.31468601.09999775.48699018.08883553.46993091.089274.37207374.00375852.27186198-.05907319-.06922522-.11463055-.13209255-.16830659-.19003644-.09976937-.10770214-.19148509-.19677225-.2785569-.2678141-.6343975-.51905295-1.02312991-.74839425-1.55681885-.79878106-.87541567-.08410158-1.70619803.53426712-1.83111632 1.36882761-.07682697.51169638-.05207639.74723271.18463583 1.19942735.13026223.24432805.35060714.53942202.76172732 1.04735429.02515953.031068.02515953.031068.05030428.06206416.50464537.62186746.55962098.69095396.67961467.86473786.32435479.4706845 1.1139501 1.8221455 1.25748612 2.0035872z' fill='%23000'/%3E%3Cpath d='m1.68266944 9.2716401c-.02488625-.03067752-.02488625-.03067752-.04970567-.06132555-.37729166-.46613768-.58418002-.74321015-.68156241-.9258495-.15281729-.29195235-.1611316-.37107459-.10605794-.73788601.06473349-.43247455.53181583-.78013371 1.01829549-.73339767.33660502.03178017.63068475.20527903 1.15339692.63295262.0565942.04617564.12482853.1124417.20288232.19670163.04616569.04983637.09513192.10524534.14800114.16720042.0794093.0930562.34702847.42052231.30761424.37286894.05814283.06991619.09971852.12407704.14721655.19045018.0941062.13434104.14705111.20894642.21874992.30454484-.0336171-.04487143.21473082.29843305.26732159.34863333.27859812.26593456.68203289.04195871.65675979-.31244785-.00421914-.05916537-.01812774-.12308431-.04717934-.23466885-.11487425-.81923739-.15505751-1.08218312-.24678252-1.56739907-.03407352-.18024544-.06905328-.35098727-.10521102-.5121905-.06435409-.28557213-.10635725-.46007245-.14994794-.62425526-.00774801-.02907063-.00774801-.02907063-.01552357-.05783095-.02300644-.08481964-.12725123-.45470311-.12030828-.42989063-.05134381-.18468043-.0945453-.35373996-.14431997-.56133562-.01130896-.04728909-.01130896-.04728909-.02259904-.09489949-.06649254-.28350912-.10387999-.44176072-.14606063-.6132721-.10998732-.45567652-.23425389-1.08719519-.2671036-1.40768017-.07546665-.72422018-.02339381-1.33418457.17582284-1.56688778.15554834-.1815673.59641015-.25405339.84271752-.12932486.16107512.0814814.32204278.26131571.47435101.521769.05764302.09857191.11172763.20426801.16708381.32357735.0335256.07225783.13292567.29837003.12172905.27336705.21032209.46992469.354801 1.03086841.48791736 1.86671535.03939531.24766201.08813662.52823537.15063928.87150416.01857903.10178746.01857903.10178746.03722922.20314381.30139226 1.63533599.27933797 1.51139381.28367122 1.64182468.01580667.47578071.71810567.4869267.74900255.01188722.00979855-.15065269.00630989-.2851661-.01107827-.67146517-.00245496-.05465243-.00245496-.05465243-.00481877-.10910149-.01521525-.35590459-.01433687-.56066672.00670546-.67705709.03834708-.21223125.22887-.4499778.40434754-.50241339.24641865-.07323589.51640341-.09179599.73269877-.04707051.20703808.0423346.44864736.20171736.51796318.32062499.08353628.14399789.15516008.36337367.21006107.63530456.04431149.21947986.07480439.45493493.0962536.70624261.00667352.0781897.01103024.13859819.01772256.23854675.00285005.04183594.00285005.04183594.00568968.07635213.00160285.01731471.00160285.01731471.00551199.04467336.00303535.01917374.00303535.01917374.01734216.06773608.00727602.13782339.00727602.13782339.56081544.18893151.16530264-.19982737.16530264-.19982737.16077268-.23486454.02708074-.1183491.04365279-.250265.06727822-.49813693.01508098-.16112409.02268576-.24033521.03157416-.32249887.036794-.34012028.0835164-.55621578.140511-.65120691.0707148-.11819408.3197845-.28280909.4314962-.30279961.2805348-.04961763.5886064-.0551978.8264635-.00901194.1077347.021202.3705429.22413969.4327499.32121002.1277282.20156171.2519621.8513817.3219188 1.49611734-.0110122.04228902-.0110122.04228902.1607163.28760404.5903408-.06730286.5903408-.06730286.5737568-.17389206.0155734-.03799147.0279666-.08191522.0455068-.15013809.0421947-.1597068.0701719-.25243998.1118273-.35635899.0288165-.07188915.0591935-.13335501.0903398-.18227881.120675-.18992919.4330876-.31896311.7070596-.2766556.2942545.0454396.4817569.26665023.4998934.72896761.0145423.38042999.0188438.52667972.0198445.67022961.0003693.0529684.0003531.09548963.0000723.21509672-.0001536.07391241-.0001536.07391241-.000205.16397385 0 .48892448-.010469.79353263-.0389535 1.17400348-.0506294.653266-.1361064 1.34281542-.228649 1.66708482-.094456.330596-.3764591.9508823-.5997469 1.2734975-.0158389.0153017-.0838055.0964468-.1706932.2036597-.1445918.1784155-.2892331.364998-.4248114.5512865-.0725632.099704-.140705.1968792-.2036767.2908847-.2436695.3637558-.4000227.6607868-.4506249.9042828-.0664376.3164194-.0901813.4842425-.0973169.666189-.0017426.0515155-.0017426.0515155-.0028439.1014735-.0025547.1180556-.0040857.165727-.0090621.2520573-.0052398.0906702-.0037444.1871795.0035093.2891187.0103883.145992.0000001.3454812.0000001.3454812s-.1266332-.0118299-.2678551-.0085813c-.1725177.0039685-.3159859-.0019087-.4151297-.0177442-.143046-.0230487-.5293508-.5064503-.7271506-.8830611-.3022704-.5764228-1.03604858-.5484427-1.33684295-.0394061-.27130191.4618137-.65965243.9172085-.77493336.9317029-.37460536.047106-.95471158.0524702-2.07175566.0332544-.10679478-.0018572-.10679478-.0018572-.21348729-.0037567-.42889761-.0076439-.41241496.0647655-.40363307-.0124079.02506967-.2203068.02222332-.1790312.00000011-.3992999-.03726222-.36933-.15125405-.6704984-.38877094-.8705429-.12286946-.1043424-.26983033-.2407345-.56500741-.5211097-.33722428-.3203411-.44283686-.4193233-.57299128-.5337266l-.80130455-.8907189c-.08795856-.1124788-.86002339-1.4339349-1.21248613-1.9454077-.13710846-.19857111-.18839645-.26302343-.71461353-.9114734zm9.50873056.0037599v3.459c0 .5.75.5.75 0v-3.459c0-.5-.75-.5-.75 0zm-2.03159602-.00057241.016 3.47300001c.00230346.4999947.7522955.4965395.74999204-.0034552l-.016-3.47299999c-.00230346-.4999947-.7522955-.49653951-.74999204.00345518zm-1.20911102 3.45357381-.021-3.42599996c-.00306475-.4999906-.75305066-.49539349-.74998592.00459712l.021 3.42600004c.00306475.4999906.75305066.4953935.74998592-.0045972z' fill='%23fff'/%3E%3C/g%3E%3C/svg%3E") 13 5, pointer;

  /* ── Depth ──────────────────────────────────────────────
     One flat, hard-edged drop shadow for the whole site: windows,
     the reviews table, photo tiles, buttons, the 404 dialog. No
     blur, no second layer, no per-component variation — the
     cut-paper look only reads as deliberate if it is consistent.

     --shadow-press pairs with it: a control that is being pressed
     drops its shadow and moves by exactly the shadow's offset, so
     it looks like it has been pushed flat against the page. If you
     change the offset below, change this to match. */
  --shadow:       2px 2px 0 #000;
  --shadow-press: translate(2px, 2px);
}

/* The single place the mobile decision is made. */
@media (max-width: 900px) {
  :root { --mobile: 1; }
}
