/* ============================================================
   LATITUDE SCREEN & RAIL — DEMONSTRATION SITE
   Design direction: ENGINEERING DRAWING SHEET
   Drafting paper ground, blueprint grid, ink-blue linework,
   graphite text, one annotation red used only for refusals
   and callouts. No external requests of any kind.
   ============================================================ */

:root{
  --paper:      #eef2f7;
  --paper-2:    #f8fafc;
  --paper-3:    #e3eaf2;
  --grid-min:   rgba(120,152,186,.16);
  --grid-maj:   rgba(120,152,186,.30);

  --ink:        #12406f;   /* linework */
  --ink-2:      #1b5798;
  --ink-3:      #6e8dae;

  --gr:         #262c33;   /* graphite text */
  --gr-2:       #4c5661;
  --gr-3:       #77828e;

  --red:        #bf2a1c;   /* annotation red — refusals + callouts ONLY */
  --red-wash:   #fbeceb;

  --rule:       #a6bacd;
  --rule-2:     #c6d4e1;

  /* paper values — the sheet is not one dead white */
  --paper-4:    #e9eff6;   /* title block + schedule field sit ON the sheet */
  --paper-5:    #fdfefe;   /* highlight side of the sheet gradient */
  --grid-fine:  rgba(120,152,186,.085);

  /* screen-mesh charcoal — every woven mesh on this site is drawn in it */
  --mesh:       #38434f;
  --mesh-2:     #5f6c7b;
  --mesh-3:     #8b96a2;

  /* anodized bronze — every aluminum extrusion is drawn in it */
  --brz:        #8a6435;
  --brz-2:      #b0854f;
  --brz-3:      #d7c3a4;
  --brz-wash:   #f7f1e7;

  --sans: "Helvetica Neue", Helvetica, "Arial Narrow", Arial, "Liberation Sans", system-ui, sans-serif;
  --mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, "Liberation Mono", "Courier New", monospace;


  /* ⭐ THE ONE ACCENT — 11 Sep 2026. Drawing blue. It is NOT --ink: --ink is
     linework, it is everywhere, and a colour that is everywhere cannot point
     at anything. --acc appears in five places only: the mark, the offer strip,
     one phrase of the h1, the primary button, and focus. */
  --acc:        #1f5fa8;
  --acc-dk:     #17497f;   /* small type on paper — --acc alone is 5.8:1, this is 7.9:1 */
  --acc-wash:   #e9f0fa;

  --shell: 1180px;
}

*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;
  font-family:var(--sans);
  font-size:var(--t5);
  line-height:1.62;
  color:var(--gr);
  background-color:var(--paper);
  /* A real sheet has paper tone and print density. Three layers of wash sit
     under two tiers of grid: 24px fine, 120px coarse, with an 8px ghost tier
     that only shows up where the wash is lightest. */
  background-image:
    radial-gradient(130% 90% at 8% -12%, rgba(255,255,255,.92), rgba(255,255,255,0) 58%),
    radial-gradient(100% 75% at 98% 4%, rgba(196,216,236,.50), rgba(196,216,236,0) 62%),
    linear-gradient(174deg, rgba(250,245,236,.62) 0%, rgba(250,245,236,0) 30%, rgba(206,221,236,.42) 100%),
    linear-gradient(var(--grid-maj) 1px, transparent 1px),
    linear-gradient(90deg, var(--grid-maj) 1px, transparent 1px),
    linear-gradient(var(--grid-min) 1px, transparent 1px),
    linear-gradient(90deg, var(--grid-min) 1px, transparent 1px),
    linear-gradient(var(--grid-fine) 1px, transparent 1px),
    linear-gradient(90deg, var(--grid-fine) 1px, transparent 1px);
  background-size:
    100% 100%, 100% 100%, 100% 100%,
    120px 120px, 120px 120px,
    24px 24px, 24px 24px,
    8px 8px, 8px 8px;
  background-position:
    0 0, 0 0, 0 0,
    -1px -1px, -1px -1px, -1px -1px, -1px -1px, -1px -1px, -1px -1px;
  overflow-x:hidden;
}
img,svg{max-width:100%}
a{color:var(--ink-2)}

.shell{width:100%;max-width:var(--shell);margin:0 auto;padding:0 20px}

/* ---------- demonstration strip ---------- */
.demostrip{
  display:flex;align-items:flex-start;gap:.6rem;
  background:var(--ink);color:#e8f0f9;
  padding:.6rem 20px;
  font-size:var(--t2);line-height:1.5;
  letter-spacing:.01em;
  border-bottom:2px solid var(--red);
}
.demostrip b{color:#fff;font-weight:700;letter-spacing:.04em;text-transform:uppercase;font-size:var(--t1)}
.demostrip a{color:#ffd9d4;text-decoration:underline;text-underline-offset:2px;white-space:nowrap}
.demostrip__dot{
  flex:none;width:9px;height:9px;margin-top:.42rem;border-radius:50%;
  background:var(--red);box-shadow:0 0 0 3px rgba(191,42,28,.28);
}

/* ---------- lettering ---------- */
.lbl{
  display:inline-block;
  font-family:var(--mono);
  font-size:var(--t1);
  letter-spacing:.18em;
  text-transform:uppercase;
  color:var(--ink);
}
.lbl--red{color:var(--red)}
h1,h2,h3,h4{
  font-family:var(--sans);
  font-weight:700;
  font-stretch:semi-condensed;
  letter-spacing:-.005em;
  color:var(--gr);
  margin:0 0 .55rem;
  line-height:1.14;
}
h1{font-size:var(--t8);letter-spacing:-.025em;line-height:1.055}
h2{font-size:var(--t8);letter-spacing:-.019em;line-height:1.09}
h3{font-size:var(--t6);letter-spacing:-.008em}
h4{font-size:var(--t4);letter-spacing:.02em}
p{margin:0 0 1rem}
.mono{font-family:var(--mono)}
.dim{font-family:var(--mono);font-size:var(--t3);color:var(--ink);letter-spacing:.02em}

/* ---------- header ---------- */
.top{
  position:sticky;top:0;z-index:60;
  background:rgba(248,250,252,.96);
  border-bottom:1px solid var(--rule);
}
.top__in{display:flex;align-items:center;gap:1rem;min-height:64px;flex-wrap:wrap}
.brand{display:flex;align-items:center;gap:.7rem;text-decoration:none;color:inherit;padding:.5rem 0}
.brand__mk{
  flex:none;width:38px;height:38px;border:1.5px solid var(--ink);
  display:grid;place-items:center;background:var(--paper-2);
}
.brand__mk svg{display:block;width:26px;height:26px}
.brand__nm{display:block;font-weight:700;font-stretch:semi-condensed;font-size:var(--t5);letter-spacing:.01em;line-height:1.1}
.brand__sub{display:block;font-family:var(--mono);font-size:var(--t1);letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3)}
.nav{margin-left:auto}
.nav ul{display:flex;flex-wrap:wrap;gap:.15rem;list-style:none;margin:0;padding:0}
.nav a{
  display:block;padding:.42rem .6rem;text-decoration:none;color:var(--gr-2);
  font-size:var(--t3);font-weight:600;letter-spacing:.02em;border-bottom:2px solid transparent;
}
.nav a:hover{color:var(--ink);border-bottom-color:var(--ink)}
.nav a[aria-current="page"]{color:var(--ink);border-bottom-color:var(--red)}
.top__act{display:flex;align-items:center;gap:.55rem;flex-wrap:wrap}
.tel{
  font-family:var(--mono);font-size:var(--t3);font-weight:600;color:var(--gr);
  text-decoration:none;letter-spacing:.01em;white-space:nowrap;
}
.tel span{display:block;font-size:var(--t1);letter-spacing:.16em;text-transform:uppercase;color:var(--ink-3)}

.btn{
  display:inline-block;padding:.58rem 1.05rem;text-decoration:none;cursor:pointer;
  font-family:var(--mono);font-size:var(--t1);font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  border:1.5px solid var(--ink);background:var(--ink);color:#fff;
}
.btn:hover{background:var(--ink-2);border-color:var(--ink-2)}
.btn--line{background:transparent;color:var(--ink)}
.btn--line:hover{background:var(--paper-3);color:var(--ink)}

/* ---------- dimension rule between sections ---------- */
.dimrule{position:relative;height:1px;background:var(--rule);margin:0;border:0}
.dimrule::before,.dimrule::after{
  content:"";position:absolute;top:-5px;width:1px;height:11px;background:var(--rule);
}
.dimrule::before{left:0}
.dimrule::after{right:0}

.sec{padding:4.2rem 0}
.sec--tight{padding:2.7rem 0}
.sec__hd{max-width:64ch;margin-bottom:2rem}
.sec__hd p{color:var(--gr-2)}
.sec__hd .lbl{margin-bottom:.55rem}

/* ---------- hero ---------- */
.hero,
.showcase{padding:2.4rem 0 2.6rem;border-bottom:1px solid var(--rule)}
.hero__grid{display:grid;grid-template-columns:minmax(0,1fr);gap:1.8rem}
.hero__lede{font-size:var(--t5);color:var(--gr-2);max-width:58ch}
.hero__act{display:flex;flex-wrap:wrap;gap:.6rem;margin:1.3rem 0 .8rem}
.hero__note{font-family:var(--mono);font-size:var(--t2);color:var(--ink-3);letter-spacing:.02em;max-width:52ch}

/* the drawing frame */
.sheet{
  position:relative;background:var(--paper-2);
  border:1.5px solid var(--ink);padding:10px;
}
.sheet__in{border:1px solid var(--rule-2);padding:14px 14px 0}
.sheet__hd{
  display:flex;justify-content:space-between;gap:1rem;flex-wrap:wrap;
  font-family:var(--mono);font-size:var(--t1);letter-spacing:.16em;text-transform:uppercase;
  color:var(--ink-3);border-bottom:1px solid var(--rule-2);padding-bottom:.5rem;margin-bottom:.6rem;
}
.sheet__fig{overflow-x:auto}
.sheet svg{display:block;width:100%;height:auto}
.sheet__hint{display:none;margin:.5rem 0 0;font-family:var(--mono);font-size:var(--t1);letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3);text-align:center}
@media (max-width:820px){
  .sheet__fig svg{min-width:640px}
  .sheet__hint{display:block}
}

/* title block */
.tblock{
  border:1.5px solid var(--ink);background:var(--paper-2);
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  margin-top:10px;
}
.tblock__row{
  grid-column:1/-1;border-bottom:1px solid var(--rule);
  padding:.5rem .7rem;
}
.tblock__cell{border-top:1px solid var(--rule);border-right:1px solid var(--rule);padding:.44rem .7rem}
.tblock__cell:nth-child(even){border-right:0}
.tblock dt{
  font-family:var(--mono);font-size:var(--t1);letter-spacing:.17em;text-transform:uppercase;color:var(--ink-3);
}
.tblock dd{margin:.1rem 0 0;font-family:var(--mono);font-size:var(--t2);color:var(--gr);letter-spacing:.01em}
.tblock__nm{font-weight:700;font-stretch:semi-condensed;font-size:var(--t5);letter-spacing:.06em;text-transform:uppercase;color:var(--ink)}
.tblock__sh{font-family:var(--mono);font-size:var(--t1);letter-spacing:.13em;text-transform:uppercase;color:var(--gr-2);margin-top:.1rem}

/* ---------- the record (schedule table field) ---------- */
.rec{border:1.5px solid var(--ink);background:var(--paper-2)}
.rec__hd{
  display:flex;justify-content:space-between;align-items:baseline;gap:.8rem;flex-wrap:wrap;
  background:var(--ink);color:#e8f0f9;padding:.55rem .85rem;
  font-family:var(--mono);font-size:var(--t1);letter-spacing:.15em;text-transform:uppercase;
}
.rec__meta{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));border-bottom:1px solid var(--rule)}
.rec__m{padding:.5rem .85rem;border-right:1px solid var(--rule);border-top:1px solid var(--rule-2)}
.rec__m:nth-child(even){border-right:0}
.rec__m dt{font-family:var(--mono);font-size:var(--t1);letter-spacing:.16em;text-transform:uppercase;color:var(--ink-3)}
.rec__m dd{margin:.08rem 0 0;font-family:var(--mono);font-size:var(--t2);color:var(--gr)}
.rec__scroll{overflow-x:auto}
.rec table{width:100%;border-collapse:collapse;min-width:520px}
.rec th{
  text-align:left;font-family:var(--mono);font-size:var(--t1);letter-spacing:.16em;text-transform:uppercase;
  color:var(--ink-3);font-weight:400;padding:.5rem .85rem;border-bottom:1px solid var(--rule);
}
.rec td{padding:.6rem .85rem;border-bottom:1px solid var(--rule-2);vertical-align:top;font-size:var(--t4)}
.rec td:last-child,.rec th:last-child{text-align:right;font-family:var(--mono);white-space:nowrap}
.rec__it{display:block;font-weight:600;color:var(--gr)}
.rec__sp{display:block;font-family:var(--mono);font-size:var(--t1);color:var(--gr-3);letter-spacing:.01em;margin-top:.12rem}
.rec__ref{font-family:var(--mono);font-size:var(--t1);color:var(--ink-3);white-space:nowrap}
tr.is-declined{background:var(--red-wash)}
tr.is-declined .rec__it{color:var(--red);text-transform:uppercase;letter-spacing:.04em}
tr.is-declined td:last-child{color:var(--red);font-weight:700}
tr.is-declined .rec__ref{color:var(--red)}
.rec__why{
  border-top:1.5px solid var(--red);background:var(--red-wash);
  padding:.9rem .85rem;font-size:var(--t4);color:var(--gr);
}
.rec__why b{color:var(--red);text-transform:uppercase;letter-spacing:.06em;font-size:var(--t2);font-family:var(--mono)}
.rec__ft{
  display:flex;justify-content:space-between;gap:.8rem;flex-wrap:wrap;
  border-top:1px solid var(--rule);padding:.55rem .85rem;
  font-family:var(--mono);font-size:var(--t1);color:var(--gr-2);
}
.rec__tot{color:var(--gr);font-weight:700}

/* ---------- spec table (services) ---------- */
.spectbl{overflow-x:auto;border:1.5px solid var(--ink);background:var(--paper-2)}
.spectbl table{width:100%;border-collapse:collapse;min-width:640px}
.spectbl caption{
  caption-side:top;text-align:left;background:var(--ink);color:#e8f0f9;
  padding:.55rem .85rem;font-family:var(--mono);font-size:var(--t1);letter-spacing:.15em;text-transform:uppercase;
}
.spectbl th{
  text-align:left;font-family:var(--mono);font-size:var(--t1);letter-spacing:.16em;text-transform:uppercase;
  color:var(--ink-3);font-weight:400;padding:.55rem .85rem;border-bottom:1px solid var(--rule);
}
.spectbl td{padding:.75rem .85rem;border-bottom:1px solid var(--rule-2);vertical-align:top;font-size:var(--t4);color:var(--gr-2)}
.spectbl tr:last-child td{border-bottom:0}
.spectbl a{font-weight:700;color:var(--ink);text-decoration:none;font-stretch:semi-condensed;font-size:var(--t5)}
.spectbl a:hover{text-decoration:underline}
.spectbl .c-spec{font-family:var(--mono);font-size:var(--t2);color:var(--ink);white-space:nowrap}
.spectbl .c-ref{font-family:var(--mono);font-size:var(--t1);color:var(--ink-3);white-space:nowrap}

/* ---------- callout ---------- */
.callout{
  position:relative;border-left:2px solid var(--red);background:var(--paper-2);
  padding:.9rem 1rem;margin:1.4rem 0;
}
.callout__n{
  display:inline-grid;place-items:center;width:22px;height:22px;border-radius:50%;
  border:1.5px solid var(--red);color:var(--red);
  font-family:var(--mono);font-size:var(--t1);font-weight:700;margin-right:.5rem;vertical-align:-4px;
}
.callout p:last-child{margin-bottom:0}

.note{
  border:1px dashed var(--rule);background:var(--paper-2);padding:.9rem 1rem;margin:1.4rem 0;
  font-size:var(--t4);color:var(--gr-2);
}
.note b{color:var(--gr)}
.note p:last-child{margin-bottom:0}

/* ---------- generic prose + grids ---------- */
.prose{max-width:70ch}
.prose h3{margin-top:1.9rem}
.prose ul{padding-left:1.1rem;margin:0 0 1rem}
.prose li{margin-bottom:.45rem}
.cols{display:grid;grid-template-columns:minmax(0,1fr);gap:1.6rem}
@media (min-width:860px){
  .cols{grid-template-columns:repeat(2,minmax(0,1fr));gap:2.4rem}
  .cols--3{grid-template-columns:repeat(3,minmax(0,1fr))}
}
.card{border:1px solid var(--rule);background:var(--paper-2);padding:1.1rem}
.card .lbl{display:block;margin-bottom:.4rem}
.card p:last-child{margin-bottom:0}
.card h3{margin-bottom:.4rem}

.steps{list-style:none;margin:0;padding:0;counter-reset:s}
.steps li{
  position:relative;padding:0 0 1.5rem 3.1rem;border-left:1px solid var(--rule);margin-left:.9rem;
}
.steps li:last-child{border-left-color:transparent;padding-bottom:0}
.steps li::before{
  counter-increment:s;content:counter(s,decimal-leading-zero);
  position:absolute;left:-15px;top:0;width:30px;height:30px;
  display:grid;place-items:center;background:var(--paper-2);border:1.5px solid var(--ink);
  color:var(--ink);font-family:var(--mono);font-size:var(--t1);font-weight:700;
}
.steps h3{margin-bottom:.35rem}
.steps p:last-child{margin-bottom:0}
.steps .dim{display:block;margin-top:.35rem}

.faq{border-top:1px solid var(--rule)}
.faq details{border-bottom:1px solid var(--rule-2);padding:.9rem 0}
.faq summary{cursor:pointer;font-weight:700;font-stretch:semi-condensed;font-size:var(--t5);color:var(--gr);list-style:none}
.faq summary::-webkit-details-marker{display:none}
.faq summary::before{content:"+ ";font-family:var(--mono);color:var(--red)}
.faq details[open] summary::before{content:"\2212 "}
.faq .a{padding-top:.7rem;max-width:70ch;color:var(--gr-2)}
.faq .a p:last-child{margin-bottom:0}

.empty{
  border:1px dashed var(--ink-3);background:var(--paper-2);padding:1.6rem;text-align:center;
}
.empty b{display:block;font-family:var(--mono);font-size:var(--t2);letter-spacing:.13em;text-transform:uppercase;color:var(--ink);margin-bottom:.4rem}
.empty span{display:block;max-width:52ch;margin:0 auto;font-size:var(--t4);color:var(--gr-2)}

/* ---------- form ---------- */
.form{border:1.5px solid var(--ink);background:var(--paper-2);padding:1.2rem}
.form .fg{margin-bottom:1rem}
.form label{
  display:block;font-family:var(--mono);font-size:var(--t1);letter-spacing:.16em;text-transform:uppercase;
  color:var(--ink);margin-bottom:.3rem;
}
.form input,.form select,.form textarea{
  width:100%;padding:.6rem .7rem;border:1px solid var(--rule);background:#fff;
  font-family:var(--sans);font-size:var(--t4);color:var(--gr);
}
.form textarea{min-height:120px;resize:vertical}
.form input:focus,.form select:focus,.form textarea:focus{outline:2px solid var(--ink);outline-offset:-1px}
.form .hint{font-size:var(--t2);color:var(--gr-3);margin:.3rem 0 0}

/* ---------- footer ---------- */
.foot{border-top:2px solid var(--ink);background:var(--paper-2);padding:2.2rem 0 1.4rem;margin-top:1rem}
.foot__grid{display:grid;grid-template-columns:minmax(0,1fr);gap:1.5rem}
@media (min-width:760px){.foot__grid{grid-template-columns:1.4fr 1fr 1fr 1fr}}
.foot h4{font-family:var(--mono);font-size:var(--t1);letter-spacing:.16em;text-transform:uppercase;color:var(--ink-3);margin-bottom:.6rem}
.foot ul{list-style:none;margin:0;padding:0}
.foot li{margin-bottom:.3rem}
.foot a{color:var(--gr-2);text-decoration:none;font-size:var(--t4)}
.foot a:hover{color:var(--ink);text-decoration:underline}
.foot p{font-size:var(--t4);color:var(--gr-2)}
.foot__bar{
  border-top:1px solid var(--rule);margin-top:1.6rem;padding-top:1rem;
  font-family:var(--mono);font-size:var(--t1);color:var(--gr-3);letter-spacing:.02em;
}
.foot__bar p{font-size:var(--t1);color:var(--gr-3);font-family:var(--mono)}

/* ---------- chat launcher (bottom LEFT — host page owns the right) ---------- */
.chatbtn{
  position:fixed;left:16px;bottom:16px;z-index:90;
  display:flex;align-items:center;gap:.5rem;
  border:1.5px solid var(--ink);background:var(--ink);color:#fff;
  padding:.6rem .9rem;cursor:pointer;
  font-family:var(--mono);font-size:var(--t1);letter-spacing:.14em;text-transform:uppercase;
}
.chatbtn:hover{background:var(--ink-2)}
.chatbtn i{width:8px;height:8px;border-radius:50%;background:#7fe0a8;display:block}
.chatpanel{
  position:fixed;left:16px;bottom:16px;z-index:95;width:min(360px,calc(100vw - 32px));
  background:var(--paper-2);border:1.5px solid var(--ink);display:none;flex-direction:column;
  max-height:min(560px,calc(100vh - 32px));
  box-shadow:0 10px 34px rgba(18,64,111,.22);
}
.chatpanel.is-open{display:flex}
.chatpanel__hd{
  display:flex;align-items:center;justify-content:space-between;gap:.5rem;
  background:var(--ink);color:#e8f0f9;padding:.55rem .7rem;
  font-family:var(--mono);font-size:var(--t1);letter-spacing:.14em;text-transform:uppercase;
}
.chatpanel__hd button{background:none;border:0;color:#e8f0f9;font-size:var(--t6);cursor:pointer;line-height:1;padding:0 .2rem}
.chatlog{padding:.8rem;overflow-y:auto;flex:1;font-size:var(--t4);min-height:150px}
.msg{margin-bottom:.7rem;max-width:92%}
.msg p{margin:0;padding:.55rem .7rem;border:1px solid var(--rule);background:#fff}
.msg--bot p{border-left:2px solid var(--ink)}
.msg--me{margin-left:auto}
.msg--me p{background:var(--ink);color:#fff;border-color:var(--ink)}
.chatops{border-top:1px solid var(--rule);padding:.6rem;display:flex;flex-wrap:wrap;gap:.4rem}
.chatops button{
  border:1px solid var(--ink);background:var(--paper-2);color:var(--ink);cursor:pointer;
  padding:.42rem .6rem;font-family:var(--sans);font-size:var(--t2);text-align:left;
}
.chatops button:hover{background:var(--paper-3)}
.chatops input{
  flex:1;min-width:150px;padding:.45rem .6rem;border:1px solid var(--rule);font-size:var(--t4);font-family:var(--sans);
}
.chatnote{
  padding:.45rem .7rem;border-top:1px solid var(--rule-2);
  font-family:var(--mono);font-size:var(--t1);letter-spacing:.06em;color:var(--gr-3);
}

@media (min-width:980px){
  .hero__grid{grid-template-columns:minmax(0,1fr) minmax(0,1.12fr);gap:2.4rem;align-items:start}
  .hero,
  .showcase{padding:3.2rem 0 3.4rem}
  .tblock{grid-template-columns:repeat(3,minmax(0,1fr))}
  .tblock__cell:nth-child(even){border-right:1px solid var(--rule)}
  .tblock__cell:last-child{border-right:0}
  .rec__meta{grid-template-columns:repeat(4,minmax(0,1fr))}
  .rec__m:nth-child(even){border-right:1px solid var(--rule)}
  .rec__m:last-child{border-right:0}
}
@media (max-width:520px){
  .top__in{min-height:0;padding-top:.5rem;padding-bottom:.5rem}
  .nav{margin-left:0;width:100%;order:3}
  .nav ul{gap:0}
  .nav a{padding:.3rem .45rem;font-size:var(--t2)}
  .sec{padding:2.9rem 0}
  .sec--tight{padding:2.1rem 0}
  .chatbtn{left:10px;bottom:10px;padding:.5rem .7rem;font-size:var(--t1)}
  .chatpanel{left:10px;bottom:10px}
}
@media print{
  /* ⛔ superseded — the notice is a chip in .utilbar now */
  .chatbtn,.chatpanel,.top{display:none}
  body{background-image:none}
}

/* ============================================================
   ENRICHMENT PASS — paper depth, two working hues, motion,
   drawn details, and designed slots for photographs to come.
   Nothing below loads anything. Motion only ever ENHANCES:
   every drawing is complete with the stylesheet alone.
   ============================================================ */

/* ---------- paper depth ---------- */
.sheet{
  background:linear-gradient(158deg,var(--paper-5) 0%,var(--paper-2) 42%,#eef4fa 100%);
  box-shadow:5px 5px 0 0 rgba(18,64,111,.055);
}
.sheet__in{background:transparent}
.tblock{background:linear-gradient(180deg,var(--paper-2) 0%,var(--paper-4) 100%)}
.tblock__row{background:var(--paper-2)}
.rec{background:linear-gradient(180deg,var(--paper-2) 0%,var(--paper-4) 340px,var(--paper-4) 100%)}
.rec__hd,.spectbl caption,.meshcmp__hd{
  background:linear-gradient(180deg,var(--ink-2) 0%,var(--ink) 100%);
}
.spectbl{background:linear-gradient(180deg,var(--paper-2) 0%,var(--paper-4) 100%)}
.card{background:linear-gradient(172deg,var(--paper-2) 0%,var(--paper-4) 100%)}
.foot{background:linear-gradient(180deg,var(--paper-2) 0%,var(--paper-4) 100%)}
.top{backdrop-filter:saturate(1.4) blur(3px);-webkit-backdrop-filter:saturate(1.4) blur(3px)}

h1,h2,h3,h4{overflow-wrap:break-word}

/* the coarse tier gets a corner tick where two majors cross — print density */
.sec{position:relative}

/* ---------- the two working hues ---------- */
/* bronze = aluminum extrusion. charcoal = woven mesh. red stays rare. */
.spectbl .c-spec{color:var(--brz)}
.spectbl .c-ref{color:var(--ink-3)}
.tag-mesh,.tag-brz{
  display:inline-block;font-family:var(--mono);font-size:var(--t1);letter-spacing:.14em;
  text-transform:uppercase;padding:.14rem .42rem;border:1px solid currentColor;
}
.tag-mesh{color:var(--mesh)}
.tag-brz{color:var(--brz)}

/* ---------- motion ---------- */
@keyframes lsr-rise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
@keyframes lsr-fade{from{opacity:0}to{opacity:1}}
@keyframes lsr-draw{from{stroke-dashoffset:var(--dl,900)}to{stroke-dashoffset:0}}
@keyframes lsr-pop{from{opacity:0;transform:scale(.78)}to{opacity:1;transform:none}}
@keyframes lsr-dot{0%,100%{box-shadow:0 0 0 3px rgba(191,42,28,.30)}50%{box-shadow:0 0 0 7px rgba(191,42,28,.06)}}
@keyframes lsr-sweep{from{transform:scaleX(0)}to{transform:scaleX(1)}}

/* Section reveals. The class is added by script; without it, everything is
   already in its finished state. Never the other way round. */
.rv.is-in{animation:lsr-rise .55s cubic-bezier(.22,.68,.34,1) both;animation-delay:var(--d,0s)}

.demostrip__dot{animation:lsr-dot 3.4s ease-in-out infinite}

/* --- the drawing draws itself --- */
/* Default (no .is-in): complete, static, visible. */
.drw .d-deck,.drw .d-post,.drw .d-beam,.drw .d-door,.drw .d-dim,
.drw .d-a,.drw .d-b{stroke-dashoffset:0}

.drw.is-in .d-deck{stroke-dasharray:920;animation:lsr-draw .5s ease-out both;--dl:920}
.drw.is-in .d-post{stroke-dasharray:620;animation:lsr-draw .5s ease-out .16s both;--dl:620}
.drw.is-in .d-beam{stroke-dasharray:1700;animation:lsr-draw .58s ease-out .34s both;--dl:1700}
.drw.is-in .d-mesh{animation:lsr-fade .5s ease-out .62s both}
.drw.is-in .d-door{stroke-dasharray:760;animation:lsr-draw .42s ease-out .74s both;--dl:760}
.drw.is-in .d-dim{stroke-dasharray:880;animation:lsr-draw .44s ease-out .92s both;--dl:880}
.drw.is-in .d-txt{animation:lsr-fade .38s ease-out 1.06s both}
.drw.is-in .d-note{animation:lsr-pop .4s cubic-bezier(.2,1.35,.4,1) 1.2s both;transform-box:fill-box;transform-origin:50% 50%}

/* compact variant used by the detail drawings */
.drw.is-in .d-a{stroke-dasharray:820;animation:lsr-draw .46s ease-out both;--dl:820}
.drw.is-in .d-b{stroke-dasharray:620;animation:lsr-draw .46s ease-out .17s both;--dl:620}
.drw.is-in .d-c{animation:lsr-fade .42s ease-out .34s both}
.drw.is-in .d-d{animation:lsr-fade .36s ease-out .52s both}

/* ---------- hover + focus, 150–250ms ---------- */
a{transition:color .18s ease,background-color .18s ease,border-color .18s ease,text-decoration-color .18s ease}
.nav a{transition:color .18s ease,border-bottom-color .2s ease,background-color .18s ease}
.nav a:hover{background:var(--paper-3)}
.btn{transition:background-color .18s ease,border-color .18s ease,color .18s ease,transform .18s ease,box-shadow .18s ease}
.btn:hover{transform:translateY(-2px);box-shadow:0 2px 0 0 rgba(18,64,111,.5)}
.btn:active{transform:translateY(0);box-shadow:none}
.btn--line:hover{box-shadow:0 2px 0 0 var(--brz-2)}
.tel{transition:color .18s ease}
.tel:hover{color:var(--ink)}
.brand__mk{transition:border-color .2s ease,background-color .2s ease}
.brand:hover .brand__mk{border-color:var(--brz);background:var(--brz-wash)}

.spectbl tbody tr{transition:background-color .2s ease}
.spectbl tbody tr:hover{background:var(--brz-wash)}
.spectbl tbody td:first-child{position:relative}
.spectbl tbody td:first-child::before{
  content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--brz);
  transform:scaleX(0);transform-origin:left center;transition:transform .2s ease;
}
.spectbl tbody tr:hover td:first-child::before{transform:scaleX(1)}
.spectbl a{transition:color .18s ease}
.spectbl tbody tr:hover a{color:var(--brz)}

.rec tbody tr{transition:background-color .2s ease}
.rec tbody tr:hover{background:var(--paper-3)}
.rec tbody tr.is-declined{transition:background-color .2s ease}
.rec tbody tr.is-declined:hover{background:#f7dcd8}

.card{transition:border-color .2s ease,transform .2s ease,box-shadow .2s ease}
.card:hover{border-color:var(--ink-3)}
.steps li::before{transition:background-color .2s ease,color .2s ease,border-color .2s ease}
.steps li:hover::before{background:var(--ink);color:#fff}
.faq summary{transition:color .18s ease}
.faq summary:hover{color:var(--ink)}
.faq details{transition:background-color .2s ease}
.faq details[open]{background:linear-gradient(90deg,rgba(233,239,246,.7),rgba(233,239,246,0))}
.chatops button{transition:background-color .18s ease,border-color .18s ease,color .18s ease}
.chatbtn{transition:background-color .18s ease,transform .18s ease}
.chatbtn:hover{transform:translateY(-2px)}
.form input,.form select,.form textarea{transition:border-color .18s ease,background-color .18s ease}
.form input:hover,.form select:hover,.form textarea:hover{border-color:var(--ink-3)}
a:focus-visible,button:focus-visible,summary:focus-visible,input:focus-visible,
select:focus-visible,textarea:focus-visible{outline:2px solid var(--brz);outline-offset:2px}

/* ---------- detail drawings ---------- */
.dtlgrid{display:grid;grid-template-columns:minmax(0,1fr);gap:1.1rem}
@media (min-width:680px){.dtlgrid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (min-width:1020px){.dtlgrid--3{grid-template-columns:repeat(3,minmax(0,1fr))}}
.dtl{
  border:1px solid var(--rule);
  background:linear-gradient(168deg,var(--paper-2) 0%,var(--paper-4) 100%);
  padding:10px 10px 0;
  transition:border-color .2s ease,transform .2s ease,box-shadow .2s ease;
}
.dtl:hover{border-color:var(--ink);transform:translateY(-2px);box-shadow:4px 4px 0 0 rgba(18,64,111,.07)}
.dtl__hd{
  display:flex;justify-content:space-between;align-items:baseline;gap:.7rem;
  font-family:var(--mono);font-size:var(--t1);letter-spacing:.15em;text-transform:uppercase;
  color:var(--ink-3);border-bottom:1px solid var(--rule-2);padding-bottom:.42rem;
}
.dtl__hd b{color:var(--ink);font-weight:700;letter-spacing:.15em}
.dtl__fig{padding:.55rem 0 .35rem}
.dtl svg{display:block;width:100%;height:auto}
.dtl__cap{
  margin:0 -10px;padding:.6rem .75rem;border-top:1px solid var(--rule-2);
  background:var(--paper-2);font-size:var(--t3);color:var(--gr-2);
}
.dtl__cap b{display:block;color:var(--gr);font-size:var(--t4);font-stretch:semi-condensed;margin-bottom:.12rem}
.dtl__cap a{font-family:var(--mono);font-size:var(--t1);letter-spacing:.13em;text-transform:uppercase;text-decoration:none;border-bottom:1px solid currentColor}

/* a single detail, full width, on a service page */
.dtl--wide{max-width:640px}

/* ---------- mesh comparison ---------- */
.meshcmp{border:1.5px solid var(--ink);background:var(--paper-2)}
.meshcmp__hd{
  display:flex;justify-content:space-between;align-items:baseline;gap:.8rem;flex-wrap:wrap;
  color:#e8f0f9;padding:.55rem .85rem;
  font-family:var(--mono);font-size:var(--t1);letter-spacing:.15em;text-transform:uppercase;
}
.meshcmp__grid{display:grid;grid-template-columns:minmax(0,1fr)}
@media (min-width:760px){.meshcmp__grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
.meshcmp__c{padding:.95rem;border-top:1px solid var(--rule-2);transition:background-color .2s ease}
.meshcmp__c:hover{background:var(--paper-4)}
@media (min-width:760px){
  .meshcmp__c{border-top:0;border-right:1px solid var(--rule-2)}
  .meshcmp__c:last-child{border-right:0}
}
.meshcmp__c h3{font-size:var(--t5);margin-bottom:.15rem}
.meshcmp__w{font-family:var(--mono);font-size:var(--t1);letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3);display:block;margin-bottom:.5rem}
.meshcmp__c p{font-size:var(--t3);color:var(--gr-2);margin:.55rem 0 0}
.meshcmp__c svg{display:block;width:100%;height:auto;border:1px solid var(--rule-2);background:#fff}
.meshcmp__ft{border-top:1px solid var(--rule);padding:.85rem}
.meshcmp__bar{
  position:relative;height:12px;border:1px solid var(--rule);
  background:linear-gradient(90deg,var(--brz-3) 0%,var(--brz-2) 30%,var(--mesh-2) 70%,var(--mesh) 100%);
}
.meshcmp__bar span{position:absolute;top:-1px;bottom:-1px;width:1px;background:rgba(255,255,255,.75)}
.meshcmp__lg{
  display:flex;justify-content:space-between;gap:.8rem;margin-top:.4rem;
  font-family:var(--mono);font-size:var(--t1);letter-spacing:.11em;text-transform:uppercase;color:var(--gr-2);
}
.meshcmp__lg b{color:var(--mesh)}
.meshcmp__lg i{font-style:normal;color:var(--brz)}

/* ---------- designed slots for photographs not yet taken ---------- */
.figgrid{display:grid;grid-template-columns:minmax(0,1fr);gap:1.1rem}
@media (min-width:760px){.figgrid{grid-template-columns:repeat(2,minmax(0,1fr))}}
.figslot{
  border:1.5px solid var(--ink);
  background:linear-gradient(158deg,var(--paper-5) 0%,var(--paper-2) 50%,var(--paper-4) 100%);
  padding:9px;
  transition:border-color .2s ease,box-shadow .2s ease;
}
.figslot:hover{box-shadow:4px 4px 0 0 rgba(18,64,111,.07)}
.figslot__in{
  position:relative;border:1px solid var(--rule-2);overflow:hidden;
  aspect-ratio:3 / 2;
  background:
    linear-gradient(178deg,rgba(255,255,255,.85) 0%,rgba(255,255,255,0) 46%),
    linear-gradient(158deg,#f4f8fc 0%,#e6eef6 52%,#dbe6f1 100%);
}
.figslot__in svg{position:absolute;inset:0;display:block;width:100%;height:100%}
.figslot__tag{
  position:absolute;left:0;top:0;z-index:2;
  background:var(--ink);color:#eaf1f8;
  font-family:var(--mono);font-size:var(--t1);letter-spacing:.16em;text-transform:uppercase;
  padding:.3rem .55rem;
}
.figslot__stamp{
  position:absolute;right:8px;bottom:8px;z-index:2;
  border:1px dashed var(--brz);color:var(--brz);background:rgba(255,255,255,.74);
  font-family:var(--mono);font-size:var(--t1);letter-spacing:.14em;text-transform:uppercase;
  padding:.22rem .45rem;
}
.figslot__cap{
  display:flex;justify-content:space-between;align-items:baseline;gap:.7rem;flex-wrap:wrap;
  padding:.6rem .1rem .1rem;
  font-family:var(--mono);font-size:var(--t1);letter-spacing:.05em;color:var(--gr-2);line-height:1.5;
}
.figslot__cap b{color:var(--ink);letter-spacing:.13em;text-transform:uppercase;font-size:var(--t1);white-space:nowrap}

/* Belt and braces. The script sets .is-drawn a beat after the animation should
   have finished; from then on the finished state is forced. So a drawing can be
   left incomplete by nothing — not a failed script, not a frozen clock, not a
   browser that ignores @keyframes. The default, with no script at all, is
   already the complete drawing. */
.rv.is-drawn,.drw.is-drawn{animation:none !important;opacity:1 !important;transform:none !important}
.drw.is-drawn [class^="d-"]{
  animation:none !important;stroke-dashoffset:0 !important;opacity:1 !important;transform:none !important;
}

/* ---------- reduced motion: the drawing simply appears complete ---------- */
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{
    animation-duration:.001ms !important;
    animation-delay:0s !important;
    animation-iteration-count:1 !important;
    transition-duration:.001ms !important;
    scroll-behavior:auto !important;
  }
  .drw.is-in [class^="d-"]{stroke-dashoffset:0 !important;opacity:1 !important;transform:none !important}
}


/* ═══ 📱 MOBILE MENU — added 8 Sep 2026. See tools/navfix notes.
   ⛔ Do not give this a colour. The panel IS this site's own <nav>, so it
   keeps this site's own paper and rules; the button rides on currentColor.
   ⛔ Do not raise the breakpoint without re-measuring — 860 is where these
   nav rows start wrapping, which is the thing being fixed. */
.navbtn { display: none; }
.navq { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0;
        overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
@media (max-width: 860px) {
  .navbtn {
    display: inline-flex; align-items: center; gap: .55rem;
    padding: .5rem .8rem; border-radius: .5rem; cursor: pointer;
    font: inherit; font-size:var(--t3); letter-spacing: .06em; text-transform: uppercase;
    color: currentColor;
    border: 1px solid currentColor;
    background: transparent;
    opacity: .85;
  }
  .navbtn__ico { position: relative; width: 15px; height: 2px; background: currentColor; }
  .navbtn__ico::before, .navbtn__ico::after {
    content: ""; position: absolute; left: 0; width: 15px; height: 2px; background: currentColor;
  }
  .navbtn__ico::before { top: -5px; }
  .navbtn__ico::after  { top:  5px; }
  .navq:focus-visible + .navbtn { outline: 2px solid currentColor; outline-offset: 2px; }

  /* the demo's own nav, closed */
  nav[aria-label="Main"], nav[aria-label="Primary"] { display: none; }
  .navq:checked ~ nav[aria-label="Main"],
  .navq:checked ~ nav[aria-label="Primary"] { display: block; width: 100%; }

  /* ⚠️ the lists inside are flex rows on every one of these sites; they have to
     stack, and the row gap has to become a tap target. */
  nav[aria-label="Main"] ul, nav[aria-label="Primary"] ul {
    display: block; margin: 0; padding: 0; list-style: none;
  }
  nav[aria-label="Main"] li, nav[aria-label="Primary"] li { display: block; }
  nav[aria-label="Main"] li a, nav[aria-label="Primary"] li a,
  nav[aria-label="Main"] > a, nav[aria-label="Primary"] > a {
    display: block; padding: .7rem .2rem; line-height: 1.2;
  }
  nav[aria-label="Main"] li + li, nav[aria-label="Primary"] li + li {
    border-top: 1px solid currentColor;
  }
  nav[aria-label="Main"] li + li, nav[aria-label="Primary"] li + li { border-top-color: color-mix(in srgb, currentColor 18%, transparent); }
}

/* ══════════════════════════════════════════════════════════════════════════
   ⭐ THE PROFESSIONAL PASS — 11 Sep 2026.
   Same five gaps the roofing demo had, measured against the reference client rebuild:
   no brand MARK, no colour in the headline, an accent that appeared nowhere,
   no offer strip, and a primary button that was the same navy as the
   linework — so nothing on the page was the loudest thing.

   ⚠️ THIS IS THE LIGHT-GROUND VERSION. The roofing template's strip and
   button are dark gradients over a near-black page. Re-derived here for
   blueprint paper: the strip is a pale wash of the accent, and every small
   piece of accent type is --acc-dk, not --acc, because --acc on this paper is
   5.8:1 and the tag is 10.5px mono.
   ⛔ No photograph closes this gap. The hero sheet says "Drawing, not a
   photograph" in its own header, and that line is the demo's honesty.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── the mark ─────────────────────────────────────────────────────────── */
/* A cage corner: eave beam on two uprights, the bay between them hatched as
   mesh. currentColor, so the hover below recolours it with one property. */
.brand__mk{color:var(--acc)}
.nav__mark{display:block;width:26px;height:26px;flex:0 0 auto;color:inherit;
  transition:transform .2s ease}
.brand:hover .brand__mk{border-color:var(--acc);background:var(--acc-wash);color:var(--acc-dk)}
.brand:hover .nav__mark{transform:translateY(-1px)}

/* ── the headline carries the colour ──────────────────────────────────── */
/* <em> so it is still emphasis with styles off; the slant comes off because
   the display face is already semi-condensed and leans on weight. */
h1 .hl{font-style:normal;color:var(--acc)}

/* ── the offer strip ──────────────────────────────────────────────────── */
/* ⭐ the reference site's coupon bar in this trade's own words, and every clause of it is
   lifted off the home page. ⛔ It must never carry a price, a rating or a
   count this demo has not published elsewhere. */
.offerbar{
  border-bottom:1px solid var(--rule-2);
  background-image:linear-gradient(180deg,
    color-mix(in srgb, var(--acc) 7%, var(--paper-2)),
    color-mix(in srgb, var(--acc) 14%, var(--paper-3)));
}
.offerbar__in{display:flex;align-items:center;gap:14px;flex-wrap:wrap;padding:9px 20px}
.offerbar__tag{
  font-family:var(--mono);font-size:var(--t1);text-transform:uppercase;letter-spacing:.14em;
  color:var(--acc-dk);background:var(--paper-2);
  border:1px solid color-mix(in srgb, var(--acc) 45%, transparent);
  border-radius:999px;padding:3px 9px;flex:0 0 auto;
}
.offerbar__msg{margin:0;font-size:var(--t3);line-height:1.45;color:var(--gr-2);flex:1 1 340px;min-width:0}
.offerbar__msg b{color:var(--gr);font-weight:700}
.offerbar__go{
  flex:0 0 auto;font-family:var(--mono);font-size:var(--t1);text-transform:uppercase;
  letter-spacing:.09em;color:var(--acc-dk);text-decoration:none;white-space:nowrap;
  border-bottom:1px solid color-mix(in srgb, var(--acc) 55%, transparent);padding-bottom:2px;
}
.offerbar__go:hover{color:var(--acc);border-bottom-color:var(--acc)}
@media (max-width:640px){
  .offerbar__go{display:none}        /* the hero button is a screen below it */
  .offerbar__msg{font-size:var(--t2)}
}

/* ── the primary button is the accent ─────────────────────────────────── */
/* 🔴 It was --ink, the same navy the drawings are ruled in. An accent that is
   also the linework points at nothing. */
.btn{background:var(--acc);border-color:var(--acc);color:#fff}
.btn:hover{background:var(--acc-dk);border-color:var(--acc-dk);color:#fff;
  box-shadow:0 2px 0 0 color-mix(in srgb, var(--acc) 55%, transparent)}

/* ── depth on the drawn hero ──────────────────────────────────────────── */
/* ⭐ The flat 5px offset reads as paper on paper. A real cast shadow is what
   separates the reference site's rendered instrument from a vector pasted on a page. */
.hero .sheet{
  box-shadow:5px 5px 0 0 rgba(18,64,111,.055),
             0 26px 46px -22px rgba(18,64,111,.42);
  filter:contrast(1.03) saturate(1.04);
}

@media (prefers-reduced-motion:reduce){
  .brand:hover .nav__mark{transform:none}
}

/* 🔴 AND THE GHOST HAS TO BE RESTATED AFTER IT. `.btn--line` is declared ~400
   lines above; the `.btn` rule in this block is the SAME specificity and LATER
   in an unlayered file, so it won background and border and BOTH buttons
   rendered solid blue. Two primaries is no primary. ⛔ Any future `.btn` rule
   appended below this point must restate the ghost again. */
.btn--line{background:transparent;border-color:var(--rule);color:var(--gr)}
.btn--line:hover{background:var(--acc-wash);border-color:var(--acc);color:var(--acc-dk);
  box-shadow:0 2px 0 0 var(--brz-2)}

/* ── 📐 THE DAY, AS THE CUSTOMER HAS IT — 11 Sep 2026 ─────────────────────
   ⭐ The old h1 led with the STRUCTURE — our argument, and a good one, but it
   is the engineering that sells us, not the thing the customer is buying. What
   a homeowner buys from a screen company is a room the house had stopped using.
   So the headline names the trade and the town, the accent carries the room,
   and this section walks the job from the tape measure to sitting out there.
   ⛔ Every beat is something two owner-supervised crews could really do.
   Nothing here says a date is held or a slot confirmed — the beats are labelled
   "day one / day four" as a SEQUENCE, not as a calendar promise. Day two is a
   REFUSAL, and it is the pet-mesh line already on the record further down.
   ⭐ COLOUR DISCIPLINE, AND IT IS THIS SITE'S OWN RULE. Annotation red is
   reserved for refusals and callouts, so the refused beat — and only it — is
   ruled in --red. Drawing blue marks exactly ONE beat: the moment the room
   comes back. Every other timestamp is graphite, like the rest of the sheet. */
.sec--day .day{list-style:none;margin:0;padding:0;display:grid;gap:0}
.day__i{
  display:grid;grid-template-columns:5.5rem 1fr;gap:0 1.5rem;
  padding:1.3rem 0;border-top:1px dashed var(--rule-2);align-items:start;
}
.day__i:first-child{border-top:1px solid var(--rule)}
.day__t{
  font-family:var(--mono);font-size:var(--t2);letter-spacing:.07em;font-weight:700;
  color:var(--gr-3);padding-top:.3rem;font-variant-numeric:tabular-nums;
}
.day__t em{
  display:block;font-style:normal;font-weight:400;font-size:var(--t1);
  letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);margin-top:.22rem;
}
.day__i h3{font-size:var(--t6);line-height:1.3;margin:0 0 .4rem;color:var(--gr)}
.day__i p{margin:0;font-size:var(--t4);line-height:1.65;color:var(--gr-2);max-width:62ch}
.day__i p b{color:var(--red);font-weight:700}
/* ⛔ annotation red, and only on the beat that was refused */
.day__i--no{background:linear-gradient(90deg,var(--red-wash),transparent 62%)}
.day__i--no .day__t{color:var(--red)}
.day__i--no .day__t em{color:var(--red)}
/* ⭐ ONE marked beat — the room coming back is the promise in the headline */
.day__i--live .day__t{color:var(--acc-dk)}
.day__i--live .day__t::after{
  content:"";display:block;width:5px;height:5px;border-radius:50%;
  background:var(--acc);margin-top:.5rem;
}
.day__foot{
  margin:0;padding-top:1.3rem;border-top:1px solid var(--rule);
  font-size:var(--t4);line-height:1.65;color:var(--gr-2);max-width:66ch;
}
.day__foot b{color:var(--gr);font-weight:700}
@media (max-width:34rem){
  .day__i{grid-template-columns:1fr;gap:.35rem}
  .day__t{padding-top:0}
  .day__t em{display:inline;margin-left:.55rem}
  .day__i--no{padding-left:.7rem}
  .day__i--live .day__t::after{display:inline-block;margin:0 0 .1rem .5rem;vertical-align:middle}
}

/* 🔴 THE GRID HAD THREE CHILDREN AND TWO COLUMNS. `.day__i` holds a timestamp,
   an <h3> and a <p>. Auto-placement puts the timestamp at 1/1, the heading at
   1/2 and then wraps the PARAGRAPH back to 2/1 — the timestamp column — so every
   beat's prose rendered in an 84px ribbon one or two words wide and ~330px tall.
   It looked like a layout, so nothing about it read as an error.
   ⛔ Both text children must be pinned to column 2 explicitly. Never rely on
   auto-placement to keep a two-column row on one row. */
.day__i h3,.day__i p{grid-column:2}
@media (max-width:34rem){ .day__i h3,.day__i p{grid-column:1} }

/* ── 📷 PHOTOGRAPHS ───────────────────────────────────────────────────────
   🔴 11 Sep 2026. Owner: "need photos!!" and "no stick diagrams". This demo
   shipped with none, and a page of line drawings reads as a prototype rather
   than as a business's site.

   ⭐ PORTABLE ON PURPOSE. Thirteen demos, thirteen different token names —
   --soil/--panel/--hair here, --paper/--rule/--gr there, light and dark both.
   A component written against one demo's variables is a component that has to
   be rewritten twelve times and will be wrong in four of them. So this uses
   `currentColor` and plain rgba, and inherits the page's own ink.

   ⛔ Every CC BY / CC BY-SA frame carries its credit IN the frame. Attribution
   is a licence term, not a courtesy, and "we'll add the credits later" is
   exactly how a licence gets breached. */
.photo{position:relative;margin:0;line-height:0;border-radius:4px;overflow:hidden;
  border:1px solid rgba(128,128,128,.28)}
.photo img{width:100%;display:block;object-fit:cover;filter:saturate(1.03) contrast(1.02)}
.photo--hero img{height:clamp(260px,34vw,430px)}
.photo--band img{height:clamp(190px,26vw,320px)}
.photo--tall img{height:clamp(240px,30vw,380px)}
/* ⚠️ the badge carries its OWN scrim rather than the frame carrying a gradient.
   A gradient tuned for a dark ground turns a light photo muddy along the bottom,
   and half these demos are light. */
.photo__cr{position:absolute;right:8px;bottom:8px;z-index:2;
  font-size:var(--t1);letter-spacing:.04em;line-height:1.45;font-weight:500;
  color:rgba(255,255,255,.88);background:rgba(0,0,0,.52);padding:3px 7px;border-radius:2px;
  text-shadow:0 1px 2px rgba(0,0,0,.5)}
.photo__cr a{color:inherit;text-decoration:underline;text-underline-offset:2px}
.photo__cap{line-height:1.55;font-size:var(--t2);opacity:.72;padding-top:9px}

/* ── 🚪 THE WAY OUT STAYS ON SCREEN ───────────────────────────────────────
   🔴 11 Sep 2026, owner: "need to be able and x out of all the demo sites if
   you view on mobile dont let people get stuck somewher with out easy exit."

   This banner is the only route from a demo back to us, and it sat at the top
   of the document as a static block. On a phone, two swipes down a service page
   and it is gone — a visitor who arrived on a shared link has no way back and
   no reason to think one exists. ⚠️ The link was always there and was always
   unreachable, which is the same shape as the embed's close button being parked
   off-screen above the iframe.

   ⭐ Sticky on phones only. On a desktop the banner is in view at the top of a
   page people can see all of, and pinning it would just spend vertical room. */
@media (max-width: 640px) {
  .demostrip {
    position: sticky;
    top: 0;
    z-index: 90;
  }
  /* ⚠️ AND THE LINK HAS TO BE HITTABLE, NOT MERELY PRESENT. It is inline text
     inside a sentence, so on a 375px screen it wrapped into two fragments 15px
     tall — measured, both genuinely tappable, and both far under the 44px a
     thumb needs. ⭐ Make it a control: one line, real padding, no wrap. */
  .demostrip a {
    display: inline-block;
    margin-top: 4px;
    padding: 11px 12px;
    white-space: nowrap;
    font-weight: 700;
  }
}


/* 🔴 INSIDE OUR OWN FRAME THE BANNER IS DUPLICATE — 11 Sep 2026. Owner, looking
   at the embed on the home page: "take all of this off this is awfull they know
   that". He is right about that surface: our own chrome prints a disclosure
   directly under the frame, in our voice, so the demo's banner made two stacked
   notices — which reads as nervous rather than as honest.
   ⛔ A STANDALONE PAGE KEEPS IT. There the banner is the ONLY notice, and these
   pages carry a live telephone line: an invented business with a working number
   and nothing saying so is a trap, not a demo.
   ⚠️ Fails in the honest direction — with JavaScript off, nothing is hidden.
   ⛔ If the note under the frame is ever removed, delete this rule first. */
html[data-embedded] .utilbar .demostrip { display: none !important; }




/* ── 🏝️ THE PHOTOGRAPH IS THE HERO — 15 Sep 2026 ─────────────────────────────
   Owner: "lanie screen repiar needs pic of real linae", then "make sure the pc
   is full hero with the picture". The photo was already on the page and already
   fetchpriority=high; it just sat BELOW a tall hero, so the first thing anyone
   saw on a trade that sells a room you sit in was an elevation drawing.
   ⭐ The drawing has not been thrown away — it keeps the section underneath,
   where the technical argument lives and where "Drawing, not a photograph" is
   the point being made. Only the label, the headline and the two buttons moved
   up onto the photograph. */
.lanaihero{
  position:relative; isolation:isolate;
  /* 🔴 WAS `align-items:end` — owner: "the tilte and words in hero are to low
     needs to move way hire". Bottom-aligned put the headline in the last third
     of a 508px hero, reading as a caption under a picture rather than as the
     opening line of the page. Centred, it sits where the eye lands.
     ⚠️ The scrim was weighted to the BOTTOM for buttons that are no longer
     there, so its vertical layer was re-cut with the type — re-measured after,
     not assumed. */
  display:flex; flex-direction:column; justify-content:center;
  min-height:clamp(330px,62vh,600px);
  overflow:hidden; background:#07182a;
  border-bottom:1px solid var(--rule);
}
.lanaihero>img{
  position:absolute; inset:0; z-index:0;
  width:100%; height:100%; object-fit:cover; object-position:center 62%;
}
/* 🔴 TWO GRADIENTS, NOT ONE, AND BOTH ARE LOAD-BEARING. The horizontal one
   carries the headline; the vertical one holds the buttons, which sit low over
   pale concrete where the horizontal scrim has already thinned out. ⛔ Every
   reading below was measured on the GLYPH boxes, not the element boxes — a <h1>
   is a block spanning the column, so sampling its box reads bright sky the
   letters never touch. See [[measure-the-glyphs-not-the-element-box]]. */
.lanaihero__scrim{
  position:absolute; inset:0; z-index:1;
  background:
    linear-gradient(90deg, rgba(5,18,32,.93) 0%, rgba(5,18,32,.86) 38%,
                           rgba(5,18,32,.46) 70%, rgba(5,18,32,.24) 100%),
    linear-gradient(0deg,  rgba(5,18,32,.42) 0%, rgba(5,18,32,.30) 50%,
                           rgba(5,18,32,.14) 100%);
}
/* 🔴 `padding-block`, NOT THE SHORTHAND. This read
   `padding:clamp(...) 0 clamp(...)` and the `0` silently wiped the `0 20px`
   that `.shell` contributes — so the label, the headline and both buttons sat
   flush against the left edge of the screen with no gutter at all. A shorthand
   that only means to set the vertical sides always sets the horizontal ones
   too, and on a class whose whole job is the gutter that is invisible until you
   measure it. Measured at 375px: left edge 0, should be 20. */
.lanaihero__in{
  position:relative; z-index:2;
  padding-block:clamp(2rem,5vw,3.4rem) clamp(1.9rem,4.5vw,3rem);
}
.lanaihero h1{color:#fff; max-width:20ch; text-wrap:balance}
.lanaihero .h1__where{color:#fff}
/* ⛔ NOT var(--acc). #1f5fa8 is a navy built for white paper and reads 2.4:1 on
   this scrim — it is the brand colour and it is illegible here, which is the
   trap. This is the same hue lifted until it passes. */
.lanaihero .hl{color:#8ec8ff}
.lanaihero .lbl{color:rgba(255,255,255,.88)}
.lanaihero .hero__act{margin-top:1.4rem;display:flex;flex-wrap:wrap;gap:.7rem}
/* ⛔ .btn--line is a hairline in --rule on paper; over a photograph it vanishes.
   WCAG 2.2 asks 3:1 for a control's own boundary, not just its label. */
.lanaihero .btn--line{
  border-color:rgba(255,255,255,.62); color:#fff;
  background:rgba(7,22,38,.42); -webkit-backdrop-filter:blur(3px); backdrop-filter:blur(3px);
}
.lanaihero .btn--line:hover{background:rgba(7,22,38,.66);border-color:#fff}
.lanaihero .photo__cr{position:absolute;right:10px;bottom:9px;z-index:3}

@media (max-width:640px){
  /* ⚠️ Shorter, and the scrim goes mostly vertical — at 365px the headline
     spans the full width, so a left-weighted gradient leaves its right-hand
     words over bright sky. */
  .lanaihero{min-height:clamp(300px,52vh,420px)}
  .lanaihero__scrim{
    background:
      linear-gradient(0deg,  rgba(5,18,32,.80) 0%, rgba(5,18,32,.72) 50%,
                             rgba(5,18,32,.55) 100%),
      linear-gradient(90deg, rgba(5,18,32,.55) 0%, rgba(5,18,32,.30) 100%);
  }
  .lanaihero h1{max-width:none}
}


/* ── 💬 THE LAUNCHER — 15 Sep 2026 ───────────────────────────────────────────
   Owner: "ask about your cage? and the button is old schoo".
   ⛔ THE LABEL FIRST. "Cage" is what the trade calls it to each other. A
   homeowner does not think of the room off their kitchen as a cage, and a sales
   surface should use the customer's word, not the installer's.
   ⭐ THE SHAPE SECOND. It was a hard rectangle in uppercase mono with a 1.5px
   border — the look of a 2013 support widget. A pill, a real shadow and a
   settled dot read as something maintained.
   ⚠️ AND IT WAS 34px TALL. WCAG 2.2 §2.5.8 asks 24px minimum and 44px is the
   target anyone actually hits with a thumb; this is the control that opens the
   only conversation on the page. */
.chatbtn{
  border-radius:999px;
  border:1px solid rgba(255,255,255,.14);
  min-height:44px;
  padding:.5rem 1.15rem .5rem .95rem;
  gap:.55rem;
  font-size:var(--t1);
  letter-spacing:.06em;
  text-transform:none;
  font-family:var(--sans,system-ui),system-ui,sans-serif;
  font-weight:600;
  background:var(--ink);
  box-shadow:0 10px 26px -10px rgba(7,24,42,.62), 0 2px 6px rgba(7,24,42,.28);
  transition:background-color .18s ease, transform .18s ease, box-shadow .18s ease;
}
.chatbtn:hover{
  transform:translateY(-2px);
  box-shadow:0 16px 34px -12px rgba(7,24,42,.68), 0 3px 8px rgba(7,24,42,.3);
}
/* ⭐ The dot is the only thing on the button that says "somebody is there".
   A slow pulse, and ⛔ stopped entirely under reduced-motion — it is decoration,
   and decoration is the first thing that should hold still. */
.chatbtn i{
  width:9px;height:9px;
  box-shadow:0 0 0 0 rgba(127,224,168,.55);
  animation:chatpulse 2.8s ease-out infinite;
}
@keyframes chatpulse{
  0%{box-shadow:0 0 0 0 rgba(127,224,168,.5)}
  70%{box-shadow:0 0 0 7px rgba(127,224,168,0)}
  100%{box-shadow:0 0 0 0 rgba(127,224,168,0)}
}
@media (prefers-reduced-motion:reduce){
  .chatbtn i{animation:none}
  .chatbtn:hover{transform:none}
}
@media (max-width:640px){
  .chatbtn{left:12px;bottom:12px;padding:.5rem 1rem .5rem .85rem;font-size:var(--t1)}
}


/* 🔴 THE LAUNCHER WAS SITTING ON THE HERO'S CALL TO ACTION — 15 Sep 2026.
   Measured at 375x812 the moment the photograph became the hero: the pill
   occupied 12–214 x 756–800 and "Request a measure" occupied 0–375 x 782–822.
   They overlapped, and the one being covered is the button the whole page is
   built to get pressed. ⭐ Bottom-RIGHT instead — the hero's buttons are
   left-aligned, and nothing else on this site is fixed in that corner. */
.chatbtn{left:auto;right:16px}
@media (max-width:640px){ .chatbtn{left:auto;right:12px} }


/* 🔴 ON A PHONE THE PILL COVERED THE HERO'S OWN BUTTONS — 15 Sep 2026.
   Measured at 375x812: the launcher held 161–363 x 756–800 while "Request a
   measure" held 20–202 x 731–771 and "How a job goes" 20–176 x 782–822. It
   clipped the right end of BOTH — and the one it clipped first is the button
   this entire page exists to get pressed.
   ⚠️ The bounding box of `.hero__act` is full-width, so an overlap test against
   the CONTAINER says "covered" whether or not a button really is. This was
   measured against the buttons themselves; the container test would have been
   right here by accident and wrong the next time.
   ⭐ Icon-only below 640px: a 52px circle at 311–363, clear of both. The label
   survives as the accessible name, so nothing is lost to a screen reader. */
@media (max-width:640px){
  .chatbtn__t{display:none}
  .chatbtn{
    width:52px;height:52px;min-height:52px;padding:0;
    justify-content:center;border-radius:50%;
  }
  .chatbtn i{width:11px;height:11px}
}


/* ── 🧭 THE UTILITY BAR — 15 Sep 2026 ────────────────────────────────────────
   Owner: "take this off of each site no header saying this we can just put
   demo site", then "make it a real banner with social and open close".
   🔴 WHAT THE OLD BANNER WAS. A four-line full-width notice in 16px type, and
   the first thing on the page. It was written when the disclosure was the only
   thing above the fold worth protecting — but it read as an apology for the
   site rather than as part of it, and on a phone it spent 190px before the
   business was named.
   ⭐ IT IS NOT GONE, IT IS EARNING ITS ROOM. The strip a real local contractor
   would carry — hours, service area, phone — with the demo notice as one chip
   inside it. `class="demostrip"` is kept because the sync guard checks for it
   on every page, and because the sentence it carries is still the one that makes
   a live telephone number on an invented company honest.
   ⛔ Do not reduce this to the words "Demo site" alone while the pages carry a
   working line. The tail after the dash is the part that does the work. */
.utilbar{
  background:var(--ink); color:rgba(255,255,255,.92);
  border-bottom:1px solid rgba(255,255,255,.14);
  font-size:var(--t2); line-height:1.4;
}
.utilbar__in{
  display:flex; align-items:center; justify-content:space-between;
  gap:.9rem; min-height:38px; padding-block:.3rem; flex-wrap:wrap;
}
.utilbar__hours{margin:0;display:flex;align-items:center;gap:.45rem;flex:0 1 auto;min-width:0}
.utilbar__hours b{font-weight:600;color:#fff}
.utilbar__sep{opacity:.45}
.utilbar__hours>span:last-child{opacity:.72}
.utilbar__right{display:flex;align-items:center;gap:.9rem;flex-wrap:wrap;min-width:0}
.utilbar__lnk{
  color:rgba(255,255,255,.88); text-decoration:none;
  border-bottom:1px solid rgba(255,255,255,.26); padding-bottom:1px;
}
.utilbar__lnk:hover{color:#fff;border-bottom-color:#fff}

/* ⭐ THE DOT CARRIES THE STATE, AND COLOUR IS NOT THE ONLY CARRIER — the words
   beside it say "Open now" or "Closed" outright. WCAG 1.4.1: nothing here is
   knowable by hue alone. */
.utilbar__dot{
  width:8px;height:8px;border-radius:50%;flex:0 0 auto;
  background:#7fe0a8; box-shadow:0 0 0 0 rgba(127,224,168,.5);
}
.utilbar__hours[data-state="open"] .utilbar__dot{background:#7fe0a8;animation:utilpulse 3s ease-out infinite}
.utilbar__hours[data-state="soon"] .utilbar__dot{background:#ffc861;animation:none}
.utilbar__hours[data-state="shut"] .utilbar__dot{background:#9aa6b1;animation:none}
@keyframes utilpulse{
  0%{box-shadow:0 0 0 0 rgba(127,224,168,.5)}
  70%{box-shadow:0 0 0 6px rgba(127,224,168,0)}
  100%{box-shadow:0 0 0 0 rgba(127,224,168,0)}
}
@media (prefers-reduced-motion:reduce){ .utilbar__dot{animation:none !important} }

/* the demo notice, now a chip rather than a banner */
.utilbar .demostrip{
  display:inline-flex; align-items:center; gap:.4rem;
  padding:.16rem .55rem; border-radius:999px;
  background:rgba(255,255,255,.10); border:1px solid rgba(255,255,255,.22);
  font-size:var(--t1); color:#fff;
}
.utilbar .demostrip b{text-transform:uppercase;letter-spacing:.08em;font-size:var(--t1);font-weight:700}
.utilbar .demostrip a{color:#ffd9d4;text-decoration:underline;text-underline-offset:2px}
.utilbar .demostrip__dot{width:7px;height:7px;border-radius:50%;background:#ff6a55;display:block}

@media (max-width:860px){
  /* ⚠️ The tail is the first thing to go, not the notice. Under 860px the chip
     keeps "DEMO SITE" and the full sentence stays one tap away on every page
     of the site; above it, the sentence is right there. */
  .utilbar__demotail{display:none}
  .utilbar__in{gap:.55rem}
  .utilbar__right{gap:.7rem}
}
@media (max-width:560px){
  .utilbar{font-size:var(--t1)}
  .utilbar__hours>span:last-child, .utilbar__sep{display:none}
  .utilbar__lnk:first-child{display:none}   /* service area is in the menu anyway */
}


/* 🔴 A 52px CIRCLE WITH NOTHING IN IT — 15 Sep 2026, caught by the owner on a
   screenshot within a minute of it shipping. Hiding the label on phones left
   the button holding only its status dot, so the control that opens the only
   conversation on the site read as an empty bubble.
   ⭐ THE DOT WAS NEVER AN ICON. It is a presence light that made sense BESIDE
   words and meant nothing alone. Now there is a real speech bubble, and the dot
   is a badge on the rim — which is what a status light actually is. */
.chatbtn__ico{width:19px;height:19px;flex:0 0 auto;display:block}
.chatbtn{position:fixed}
.chatbtn i{
  position:absolute;top:6px;right:6px;
  width:9px;height:9px;border-radius:50%;
  border:2px solid var(--ink);
  box-sizing:content-box;
}
@media (max-width:640px){
  .chatbtn__ico{width:23px;height:23px}
  .chatbtn i{top:8px;right:8px;width:9px;height:9px}
}


/* 🔴 39px MENU ITEMS — measured at 375x812, all eight of them. WCAG 2.2 §2.5.8
   asks 24px as a floor and 44 is what a thumb actually lands on; this is the
   only navigation on a phone. ⛔ Not a padding tweak — min-height, so a
   one-word item ("FAQ") is as tall as a two-word one. */
@media (max-width:860px){
  .nav ul li a{
    min-height:44px; display:flex; align-items:center;
  }
}

/* ⛔ THE NOTICE MUST NOT BECOME A DEAD END WHEN ITS TAIL HIDES. Under 860px the
   chip shows only the words DEMO SITE, and these pages carry a working phone
   line — so the whole chip is the link to the explanation rather than the tail
   being the only way there. 44px on a phone, like anything else you tap. */
.utilbar .demostrip{text-decoration:none;cursor:pointer}
.utilbar .demostrip:hover{background:rgba(255,255,255,.18);border-color:rgba(255,255,255,.38)}
@media (max-width:860px){
  .utilbar .demostrip{min-height:30px}
}
@media (max-width:560px){
  .utilbar .demostrip{min-height:34px;padding-inline:.7rem}
}


/* ⚖️ THE PHOTOGRAPH'S CREDIT, OFF THE PHOTOGRAPH — 15 Sep 2026.
   Owner: "i dont want the credity there", of the overlay sitting on the hero.
   ⛔ IT IS NOT OPTIONAL AND IT HAS NOT BEEN REMOVED. The image is CC BY 3.0 and
   attribution is a term of the licence, not a courtesy — a demo of ours shipped
   a CC BY-SA hero with the credit stripped once already, which is why
   check-photo-credits.mjs exists. ⭐ CC BY lets you attribute "in any reasonable
   manner": the footer is on the same page, on every page, and satisfies it.
   ⛔ If this photograph is ever swapped for a CC0 or Pexels one, delete the
   credit WITH it — and not before. */
.photocredit{
  margin:.75rem 0 0;
  font-size:var(--t1); line-height:1.4; opacity:.38; letter-spacing:.01em;
}
.photocredit a{color:inherit;text-decoration:underline;text-underline-offset:2px}


/* ══ 🧭 THE HEADER, REBUILT — 15 Sep 2026 ═══════════════════════════════════
   Owner: "still broken", "the menu looks old school", "needs to look excellent".
   🔴 MEASURED AT 768px BEFORE TOUCHING ANYTHING: the header was 111px tall in
   FOUR stacked rows, and the telephone number appeared TWICE — once in the new
   utility bar and once in the header beside the button. `flex-wrap:wrap` on
   `.top__in` let every element find its own line as soon as the brand and the
   nav could not share one, so the site opened on a column of controls.
   ⭐ ONE ROW AT EVERY WIDTH. Brand left, navigation right on a wide screen, a
   single button and a trigger on a narrow one. The phone lives in the utility
   bar and nowhere else. */
.top__in{
  flex-wrap:nowrap;
  gap:1.25rem;
  min-height:68px;
}
.brand{flex:0 1 auto;min-width:0}
.brand__nm{white-space:nowrap}
.brand__sub{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.top__act{flex:0 0 auto;flex-wrap:nowrap;margin-left:auto}

/* ── the desktop navigation ──────────────────────────────────────────────── */
@media (min-width:1024px){
  .navbtn, .navscrim, .navclose{display:none !important}
  .nav{margin-left:auto;order:0;width:auto}
  .nav ul{flex-wrap:nowrap;gap:.1rem}
  .nav a{
    position:relative; padding:.5rem .7rem; border-bottom:0; border-radius:.4rem;
    font-size:var(--t3); color:var(--gr-2);
  }
  /* ⭐ the underline grows from the middle instead of a 2px border switching on
     — the same information, without the click-clack of a hard border toggle */
  .nav a::after{
    content:""; position:absolute; left:50%; right:50%; bottom:.28rem; height:2px;
    background:var(--acc); border-radius:2px;
    transition:left .22s ease, right .22s ease;
  }
  .nav a:hover{color:var(--ink);background:var(--acc-wash)}
  .nav a:hover::after, .nav a[aria-current="page"]::after{left:.7rem;right:.7rem}
  .nav a[aria-current="page"]{color:var(--ink)}
}

/* ── the panel, below 1024 ───────────────────────────────────────────────── */
@media (max-width:1023px){
  .navbtn{
    display:inline-flex !important; align-items:center; gap:.5rem;
    order:3; margin-left:.2rem; flex:0 0 auto;
    min-height:44px; padding:0 .85rem;
    border:1px solid var(--rule); border-radius:999px;
    background:var(--paper-2); color:var(--gr);
    font:600 .78rem/1 var(--sans,system-ui),system-ui,sans-serif;
    letter-spacing:.06em; text-transform:uppercase; cursor:pointer;
  }
  .navbtn:hover{border-color:var(--acc);color:var(--acc)}

  /* 🔴 A SLIDING PANEL, NOT A LIST THAT PUSHES THE PAGE DOWN. The old menu
     expanded inside the header and shoved the hero 320px down the screen, so
     opening the menu moved the thing you were looking at. This sits over the
     page and leaves it where it was. */
  .nav{
    position:fixed; top:0; right:0; bottom:0; left:auto;
    width:min(87vw,370px); z-index:80; margin:0; order:0;
    display:block !important;
    background:var(--paper-2);
    border-left:1px solid var(--rule);
    box-shadow:-30px 0 70px -40px rgba(8,30,55,.55);
    padding:4.6rem 1.15rem 2rem;
    overflow-y:auto; overscroll-behavior:contain;
    transform:translateX(102%);
    transition:transform .3s cubic-bezier(.32,.72,0,1);
    visibility:hidden;
  }
  .navq:checked ~ .nav{transform:translateX(0);visibility:visible}

  .navscrim{
    position:fixed; inset:0; z-index:79; display:block;
    background:rgba(8,24,42,.5);
    -webkit-backdrop-filter:blur(2px); backdrop-filter:blur(2px);
    opacity:0; pointer-events:none; transition:opacity .3s ease;
  }
  .navq:checked ~ .navscrim{opacity:1;pointer-events:auto}

  .navclose{
    position:absolute; top:.95rem; right:.95rem;
    width:44px; height:44px; display:grid; place-items:center;
    border:1px solid var(--rule); border-radius:50%;
    background:var(--paper); color:var(--gr);
    font-size:var(--t7); line-height:1; cursor:pointer;
  }
  .navclose:hover{border-color:var(--acc);color:var(--acc)}
  .navclose:focus-visible{outline:2px solid var(--acc);outline-offset:2px}

  .nav ul{flex-direction:column;flex-wrap:nowrap;gap:0}
  .nav ul li a{
    min-height:54px; display:flex; align-items:center;
    padding:.5rem .35rem; font-size:var(--t5); font-weight:600;
    color:var(--gr); border-bottom:1px solid var(--rule-2); border-radius:0;
  }
  .nav ul li:last-child a{border-bottom:0}
  .nav ul li a[aria-current="page"]{color:var(--acc)}
  /* ⛔ The panel is fixed, so the page behind must not scroll under it. */
  .navq:checked ~ .nav{overscroll-behavior:contain}
}

@media (prefers-reduced-motion:reduce){
  .nav{transition:none}
  .navscrim{transition:none}
  .nav a::after{transition:none}
}

/* ⛔ 520px used to re-flow the nav inline; the panel replaces that entirely. */
@media (max-width:520px){
  .nav{margin-left:0;width:min(87vw,370px);order:0}
  .nav ul{gap:0}
  .nav a{padding:.5rem .35rem;font-size:var(--t5)}
  .brand__sub{display:none}
}

/* 🔴 NO STATUS LIGHT WITHOUT A STATUS — 15 Sep 2026. Six of these demos publish
   no hours at all, and one publishes "by appointment". The dot is a status
   light: green, beside a company name with nothing behind it, it silently says
   OPEN NOW about a business whose hours nobody ever wrote. It only appears once
   the script has decided a real state from real published hours.
   ⚠️ This shipped for one sync because the fix was written into a script that
   died on an assertion BEFORE the file was saved — the edit was reported and
   never landed. Verify the artefact, not the log line. */
.utilbar__hours:not([data-state]) .utilbar__dot{display:none}




/* 🔴 THE HERO BUTTONS — 15 Sep 2026. Owner: "make sure the buttons are spread
   out and even across heros", "not sqished into the tiltles".
   Measured at 1280 before touching anything: rv-powersports had its buttons
   touching the headline at a gap of ZERO, because its row is `.hero__cta` and
   the rule only named `.btnrow` and `.hero__act`. The rest sat at 22px with an
   11px gap between them and heights running 40 to 53.
   ⭐ One rule, all three row names, and a floor under the height so a row of
   buttons reads as a row rather than as two different controls. */
.lanaihero .btnrow,
.lanaihero .hero__act,
.lanaihero .hero__cta{
  margin-top:clamp(1.6rem,2.6vw,2.2rem);
  display:flex; flex-wrap:wrap; align-items:center;
  gap:.85rem;
}
.lanaihero .btn{
  min-height:48px;
  display:inline-flex; align-items:center; justify-content:center;
  padding-inline:1.25rem;
}
@media (max-width:560px){
  /* ⚠️ Full width and stacked on a phone — two half-width buttons side by side
     put both under the 48px the thumb needs in the direction that matters. */
  .lanaihero .btnrow,.lanaihero .hero__act,.lanaihero .hero__cta{gap:.65rem}
  .lanaihero .btn{width:100%}
}


/* ── 👥 THE SOCIAL MARKS — 15 Sep 2026. Owner: "put fake no link social on the
   headers", after twice being told there is nowhere honest to point them.
   ⛔ THEY ARE NOT LINKS, AND THAT IS THE POINT. These companies are invented,
   so a social icon could only lead to an invented profile, to somebody else's
   real account, or to nothing — and a control that goes nowhere is worse than
   no control. They are `<span>` marks, `aria-hidden`, not focusable and not
   clickable: an illustration of where a real client's profiles sit in the bar,
   on a page that already says it is a demonstration.
   ⛔ Do not turn these into <a> on a real build without real profiles behind
   them. Bots On Staff's own Facebook and Instagram have never published once. */
.utilbar__social{display:inline-flex;align-items:center;gap:.55rem;opacity:.62}
.utilbar__social svg{width:15px;height:15px;display:block}
@media (max-width:560px){ .utilbar__social{display:none} }


/* 🔴 THE GHOST BUTTON, RESTATED BELOW `.btn` — 15 Sep 2026.
   The polish gate refused four demos for this and it was right: adding a
   `.lanaihero .btn` block after the ghost rules puts the outline variant at the
   mercy of source order in unlayered CSS. It happens that the block above sets
   no background, so nothing rendered wrong — but "it happens to be fine" is not
   a property anyone can rely on while editing this file later.
   ⛔ Any new `.btn` rule goes ABOVE this, or this moves below it. */
.lanaihero .btn--ghost,
.lanaihero .btn--line,
.lanaihero .btn--out{
  border-color:rgba(255,255,255,.62);
  color:#fff;
  background:rgba(7,22,38,.42);
  -webkit-backdrop-filter:blur(3px); backdrop-filter:blur(3px);
}
.lanaihero .btn--ghost:hover,
.lanaihero .btn--line:hover,
.lanaihero .btn--out:hover{background:rgba(7,22,38,.66);border-color:#fff}

.lanaihero .btn--ghost{
  border-color:rgba(255,255,255,.62);
  color:#fff;
  background:rgba(7,22,38,.42);
}


/* ── 📣 THE OFFER BAND, ON THE PHOTOGRAPH — 15 Sep 2026 ──────────────────────
   Owner: "i dont think it needs the white section evry vist", then "figure it
   out in a great spot dont just throw it somewhere be creative".
   🔴 IT CANNOT SIMPLY GO. The polish gate requires an offer strip on every page
   and it is right to — it is the one line on a demonstration site that says what
   the shop actually promises. But as a white slab wedged between the header and
   the hero it interrupted the only picture on the page before anyone had seen it.
   ⭐ So it is pinned to the FOOT of the hero, over the photograph, on the same
   dark glass as the scrim. The promise now reads as part of the image instead of
   as an announcement above it, and the page opens header -> photograph -> story
   with nothing cutting across.
   ⛔ Its own backdrop is near-opaque on purpose: type over a photograph is the
   one thing on this estate that has been measured wrong twice, and a band that
   carries its own ground cannot drift when the picture changes. */
.lanaihero{padding-bottom:0}
.lanaihero .offerbar{
  position:absolute; left:0; right:0; bottom:0; z-index:3;
  background:rgba(6,19,34,.86);
  -webkit-backdrop-filter:blur(10px); backdrop-filter:blur(10px);
  border-top:1px solid rgba(255,255,255,.16);
  border-bottom:0;
}
.lanaihero .offerbar__in{
  display:flex; align-items:center; gap:1rem; flex-wrap:wrap;
  padding-block:.7rem;
}
.lanaihero .offerbar__tag{
  color:#fff; border-color:rgba(255,255,255,.45); background:rgba(255,255,255,.10);
}
.lanaihero .offerbar__msg{color:rgba(255,255,255,.92); margin:0}
.lanaihero .offerbar__msg b{color:#fff}
.lanaihero .offerbar__go{color:#fff; border-color:rgba(255,255,255,.5)}
/* ⚠️ the hero's own content must clear the band, or the buttons sit under it */
.lanaihero__in{padding-bottom:clamp(5.5rem,9vw,7rem)}
@media (max-width:860px){
  /* ⛔ On a phone the band would eat the picture. It goes back into the flow
     directly beneath the hero — still out from between the header and the photo,
     which is the thing that was wrong. */
  .lanaihero .offerbar{position:static;backdrop-filter:none;-webkit-backdrop-filter:none}
  .lanaihero__in{padding-bottom:clamp(1.9rem,4.5vw,3rem)}
}


/* ══ 🧭 THE HEADER, 2026 — 15 Sep 2026 ══════════════════════════════════════
   Owner: "the header need to be way better on each site look like proper 2026
   header trends", "make sure everyting looks as goos as outr customer sites".
   🔴 MEASURED FIRST, ALL TWELVE AT 1280: heights ran from 62px to 223px, only
   one was sticky, and eleven carried a telephone number that the new utility bar
   was already showing a few pixels above it.
   ⭐ This layer is keyed on the `header` ELEMENT, not on a class, because these
   demos call it .site, .top, .mast, .nav and .masthead — five names for one
   thing. Anything that needs a class name is done per demo.
   ⛔ It is deliberately visual-only: sticky, glass, a hairline that appears on
   scroll, and honest focus rings. It does not re-order anybody's markup. */
header{
  position:sticky; top:0; z-index:60;
  -webkit-backdrop-filter:saturate(1.3) blur(10px);
  backdrop-filter:saturate(1.3) blur(10px);
  transition:box-shadow .22s ease, border-color .22s ease;
}
/* ⭐ The rule under the header only appears once you have scrolled — a border
   that is always there is chrome, a border that arrives is depth. */
header::after{
  content:""; position:absolute; left:0; right:0; bottom:-1px; height:1px;
  background:currentColor; opacity:0; transition:opacity .22s ease;
  pointer-events:none;
}
html[data-scrolled] header::after{opacity:.16}
html[data-scrolled] header{box-shadow:0 10px 30px -22px rgba(0,0,0,.55)}

/* ⛔ 44px is not decoration. WCAG 2.2 §2.5.8, and on a phone this is the only
   navigation there is. */
@media (max-width:900px){
  header nav a{min-height:44px;display:flex;align-items:center}
}
/* a focus ring that is visible on both a light and a dark header */
header a:focus-visible, header button:focus-visible, header label:focus-visible{
  outline:2px solid currentColor; outline-offset:3px; border-radius:6px;
}


/* 🔴 STICKY WAS LOSING ON SPECIFICITY — 15 Sep 2026. `header{position:sticky}`
   is (0,0,1) and these demos set `.top{position:relative}` at (0,1,0), so five
   of twelve silently stayed put while the other seven pinned. Measured, not
   assumed: auto-detailing, drain-cleaning, mobile-repair, plumbing-hvac and
   rv-powersports all read `relative` after the layer went in.
   ⭐ `header[class]` is (0,1,1) and beats a single class without reaching for
   !important, which would then have to be fought later. */
header[class]{position:sticky;top:0;z-index:60}

/* 🔴 THE OFF-CANVAS MENU WAS WIDENING THE PAGE. Parked at translateX(102%) the
   panel still counted toward scrollWidth — 700px against a 371px viewport — so
   the whole site scrolled sideways on a phone with nothing visible to scroll to.
   ⛔ `overflow-x:hidden` would fix it and break `position:sticky` in the same
   stroke; `clip` does not create a scroll container, so the header still pins. */
html{overflow-x:clip}


/* 🔴 THE NAV WAS WRAPPING ONTO ITS OWN ROW — 15 Sep 2026, measured at 1280.
   These headers are flex rows that ran out of width, so the navigation dropped
   beneath the brand and the header doubled in height: 134, 138, 104, 223.
   A sticky header that tall eats a quarter of a laptop screen, and it is the
   clearest difference between these and the client sites.
   ⭐ One row, and the NAV is the part allowed to give — `min-width:0` lets it
   shrink, and if it still will not fit it scrolls sideways within itself rather
   than pushing the whole header down. ⛔ `scrollbar-width:none` hides the bar,
   not the ability to scroll; the items remain reachable by wheel, trackpad,
   touch and keyboard. */
@media (min-width:901px){
  header .top__in,
  header .masthead__row,
  header .brandline{flex-wrap:nowrap}
  header nav{min-width:0}
}
@media (min-width:901px){
  header nav ul{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;-ms-overflow-style:none}
  header nav ul::-webkit-scrollbar{display:none}
  header nav a{white-space:nowrap}
}


/* 🔴 ONE HERO WAS 83vh BECAUSE ITS HEADLINE WAS 104px — 15 Sep 2026.
   Owner: "make sure desktop hero are proper sixe". Measured at 1280: nine
   heroes sat at 62-66vh and auto-detailing at 83vh, and the cause was not the
   hero box at all — its <h1> renders at 104px over three lines, 306px of type.
   That size was tuned for a hero made ONLY of words; over a photograph it is
   shouting. ⭐ Capped to the size the rest already use, so the set reads as one
   family. ⛔ Still large text for contrast purposes (>=24px), so the 3:1
   threshold the probe applies is unchanged. */
.lanaihero h1{font-size:var(--t8);line-height:1.06}


/* ══════════════════════════════════════════════════════════════════════════
   ⚠️ HAND-EDITED — THIS SHEET NOW DIVERGES FROM ITS GENERATOR. 23 Sep 2026.
   The header at the top of this file says this demo is written out of
   ~/Desktop/demo-lanai/dist by tools/sync-demo.mjs and must not be edited by
   hand. Everything below this line was written BY HAND anyway, on the owner's
   instruction, and the generator knows nothing about it.
   ⛔ DO NOT RUN tools/sync-demo.mjs OR build.py FOR THIS DEMO. A sync would
   revert every rule below without printing a word — the exact failure the
   estate has already paid for once ("a hand-edit to a generated file reverts
   silently — build green, fix gone").
   ⭐ WHY THIS IS THE RIGHT WAY ROUND ANYWAY: the generator source lives outside
   this repo, is untracked and unbacked, and at least one of these demos
   provably no longer reproduces its published copy. public/demo IS in git. So
   public/demo is the authority now. If the generator is ever restored, port
   these blocks into it FIRST and diff its output before syncing anything.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── 1. ONE HERO, NOT TWO ─────────────────────────────────────────────────
   🔴 This page opened with <section class="lanaihero"> and then a SECOND
   <section class="hero"> immediately underneath. Ten of the thirteen demos
   did. Two hero bands is a stack, and a stack has no first thing to look at —
   the same defect the Cut Above home page was rebuilt six times for.
   ⭐ The second band is now `.showcase`: a content band that keeps its ground,
   its drawing and its photograph, and has no headline, no eyebrow and no lede
   restating what the h1 already said. The rules it needs were added to the
   `.hero` selectors above rather than duplicated, so the two cannot drift. */

/* ── 2. THE HEADLINE IS AT LEAST 3.0x BODY AT EVERY WIDTH ─────────────────
   🔴 Measured before this pass: the hero headline fell to **1.88x** body on a
   phone. `.lanaihero h1` capped it at 2rem — correctly, because 104px over
   three lines had made one hero 83vh — but the floor went with the ceiling.
   A headline under 2x body is not a headline, it is a bold paragraph.
   ⭐ THE FIX IS ARITHMETIC, NOT TASTE, and it is this pair:
        body  1rem (16px) up to 740px, 1rem above it
        h1    clamp(3rem, 7vw, …)
   The worst point is 741px, where body jumps to 16px while 7vw is only
   51.87px — 3.05x, the tightest the whole range gets. At 320px it is 48/16 =
   3.00x exactly. ⛔ Do not lower either number without recomputing 741px.
   ⚠️ The 3.5rem ceiling on the hero headline is deliberately unchanged: that
   number was measured, and raising it is how a hero became 83vh tall. */
@media (max-width:740px){ body{font-size:var(--t5)} }

/* ── 3. THE HERO IS THE DOCUMENT ──────────────────────────────────────────
   ⭐ The most persuasive object this business has is a job it turned DOWN: one
   real line on a real document, at $0.00, with a reason a customer can go and
   check. It was buried mid-page behind two hundred words of lede. It is now
   the offer strip itself, at the fold, and **$0.00 is a literal in the
   markup** — not a badge, not a rounded claim, not a rating. There are no
   ratings, stars or review counts anywhere on this site and there never will
   be; this is the honest version of the same job.
   ⛔ THE WRAPPER KEEPS `offerbar` IN ITS CLASS LIST ON PURPOSE.
   tools/check-demo-polish.mjs requires an offer strip on every page of every
   demo. Renaming the class here would strip it from the gate's view.
   ⚠️ COLOUR, AND WHY NOTHING COLOURED CARRIES TEXT. This band is
   rgba(6,19,34,.86) over a photograph, so with a white photo behind it it
   composites to roughly #293340 — dark, but not as dark as it looks in a
   screenshot of a dark picture. Every foreground below is white or near-white
   against that. The one coloured thing is the 3px flag rule, which carries no
   glyphs and so answers to the 3:1 non-text floor, not 4.5:1. */
.lanaihero .herodoc{ box-shadow:inset 0 3px 0 var(--doc-flag); }
.herodoc__in{
  display:grid;
  grid-template-columns:auto minmax(0,1fr) auto;
  align-items:center;
  column-gap:clamp(.8rem,2vw,1.5rem);
  row-gap:.5rem;
  padding-block:clamp(.8rem,1.7vw,1.1rem);
}
.herodoc__tag{
  grid-column:1; grid-row:1;
  font-family:var(--mono); font-size:var(--t1); font-weight:700;
  letter-spacing:.2em; text-transform:uppercase; white-space:nowrap;
  color:#fff; background:rgba(255,255,255,.12);
  border:1px solid rgba(255,255,255,.42); border-radius:2px;
  padding:.3rem .55rem; align-self:center;
}
.herodoc__it{
  grid-column:2; grid-row:1;
  font-weight:600; line-height:1.25; color:#fff;
  font-size:var(--t6);
  text-shadow:0 1px 2px rgba(0,0,0,.70);
}
/* ⛔ Not a muted grey. Over a picture the picture is already doing the
   de-emphasising, and a dimmed foreground on a busy ground is just an
   unreadable foreground. Near-full ink, plus a shadow that travels with the
   glyphs rather than a panel that darkens the photograph. */
.herodoc__why{
  display:block; margin-top:.22rem; max-width:52ch;
  font-family:var(--mono); font-style:normal; font-weight:400;
  font-size:var(--t2); line-height:1.5; letter-spacing:.01em;
  color:rgba(255,255,255,.93);
  text-shadow:0 1px 2px rgba(0,0,0,.70);
}
/* ⭐ tabular figures, so the amount reads as money in a column rather than as
   a word in a sentence. That is what makes it look like a document. */
.herodoc__amt{
  grid-column:3; grid-row:1;
  font-family:var(--mono); font-weight:700; color:#fff; white-space:nowrap;
  font-size:var(--t7); letter-spacing:-.01em;
  font-variant-numeric:tabular-nums;
  text-shadow:0 1px 2px rgba(0,0,0,.70);
}
/* ⛔ At 640px three columns stop fitting and the reason column collapses to a
   word per line. The flag and the amount stay together on the first row —
   they are the two things that must be read as one statement — and the line
   itself wraps underneath at full width. Nothing is lost at 320px. */
@media (max-width:640px){
  .herodoc__in{ grid-template-columns:auto minmax(0,1fr); }
  .herodoc__amt{ grid-column:2; grid-row:1; justify-self:end; }
  .herodoc__it{ grid-column:1 / -1; grid-row:2; }
}

/* ── 4. EIGHT STEPS, NOT THIRTY-SIX ───────────────────────────────────────
   🔴 This sheet declared **36 distinct font sizes**, including `1rem` and
   `16px` as two separate values for the same thing, and eleven separate sizes
   between 8.8px and 11.2px. That is not a scale, it is thirty-six independent
   decisions, and the middle of it was missing while the bottom was crowded.
   ⭐ Eight steps. Every font-size in this file now names one of them.
   ⛔ Do NOT add a ninth. If something needs a size that is not here, it is
   either the wrong element or the scale is wrong — change the token, once.
   ⚠️ The bottom step is 11px, which means the old 8.8–10.5px micro-labels all
   moved UP. They are letter-spaced uppercase mono chips, not prose, and 8.8px
   was below anything worth shipping. */
:root{
  --t1:.6875rem;  /* 11px — mono micro-labels, tracked uppercase chips */
  --t2:.75rem;    /* 12px — captions, table furniture */
  --t3:.8125rem;  /* 13px — small print, notes */
  --t4:.9375rem;  /* 15px — secondary prose */
  --t5:1rem;      /* 16px — BODY */
  --t6:1.125rem;  /* 18px — lede, h3 */
  --t7:clamp(1.5rem,3vw,2.25rem);   /* h2 */
  --t8:clamp(3rem,7vw,3.75rem);     /* h1 — see block 2 for the 3.0x proof */
}
h1{ font-size:var(--t8); }
h2{ font-size:var(--t7); }
h3{ font-size:var(--t6); }
h4{ font-size:var(--t3); }
.lanaihero h1{ font-size:var(--t8); line-height:1.04; }

/* the flag rule's colour: a light tint of --red, which this site already reserves for annotation and refusals ONLY. --red itself (#bf2a1c) is a paper colour and is far too dark to sit on this band */
:root{ --doc-flag:#ff9e91; }

/* ── 6. THE MARK IS BARE GEOMETRY NOW, SO THE BOX GOES ────────────────────
   The mark was a monoline glyph that needed a drawn box to have any presence.
   It is now a filled disc with a solid latitude band and two fainter ones —
   it carries its own weight, and a container around it would be a second
   frame on a page that is already a drawing sheet. */
.brand__mk{border:0;background:none;width:30px;height:30px}
.brand:hover .brand__mk{border:0;background:none}
.brand__mk svg,.nav__mark{width:30px;height:30px}

/* ── 7. GLASS — A RULED SLAB ──────────────────────────────────────────────
   Owner, 23 Sep 2026: "use glass buttons all the newest elements".
   ⛔ See the long note in the auto-detailing sheet: the alpha below clears
   4.5:1 with NO blur, because backdrop-filter is an enhancement and not a
   contrast mechanism. Measured by tools/check-hero-button-contrast.mjs.

   ⭐ THE MATERIAL IS A DRAWING-SHEET SLAB: square, a 1.5px ruled edge like
   every other line on this site, and one hairline of light along the top. No
   saturate — a drafting sheet is neutral and a saturating glass would be the
   one warm thing on it.
   ⚠️ NOT ONE NEW FONT SIZE. This sheet was just brought down to exactly eight
   type tokens and a glass restyle is the classic way a ninth gets in. */
.lanaihero .btn{
  border-radius:0;
  background:color-mix(in srgb, var(--ink) 88%, transparent);
  border:1.5px solid color-mix(in srgb, #fff 52%, var(--ink));
  color:#fff;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.34);
  -webkit-backdrop-filter:blur(10px);
  backdrop-filter:blur(10px);
}
.lanaihero .btn:hover{
  background:color-mix(in srgb, var(--ink) 95%, transparent);
  border-color:#fff; transform:translateY(-2px); box-shadow:inset 0 1px 0 rgba(255,255,255,.44);
}
.lanaihero .btn:focus-visible{
  outline:2px solid #fff; outline-offset:3px; box-shadow:0 0 0 5px rgba(7,22,38,.72);
}

/* ⛔ THE GHOST MUST BE RESTATED BELOW THE PRIMARY, and this is not bookkeeping.
   The sheet is unlayered, so `.lanaihero .btn` (0,2,0) beats `.btn--line`
   (0,1,0) and a secondary button in this hero would render as a SECOND
   PRIMARY — two identical solid slabs, no hierarchy, which is exactly the bug
   tools/check-demo-polish.mjs was written for after it shipped on roofing.
   ⚠️ There is only one button in this hero today. That is precisely why this
   has to be written now: the day somebody adds the second one, nothing would
   have told them. Clearer glass, and it still clears 4.5:1 with no blur. */
.lanaihero .btn--line,
.lanaihero .btn--out,
.lanaihero .btn--ghost{
  background:rgba(7,22,38,.66);
  border:1.5px solid rgba(255,255,255,.58);
  color:#fff;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.22);
}
.lanaihero .btn--line:hover,
.lanaihero .btn--out:hover,
.lanaihero .btn--ghost:hover{background:rgba(7,22,38,.80);border-color:#fff}
