@charset "utf-8";
/* ===========================================================================
   TULIP STREET DENTAL — Holland, Michigan
   Iron Digital MI · built to DESIGN_SYSTEM.md v1.0 · A3 · B2 · C3 · D5 · E4

   THE PALETTE IS THE CLIENT'S: white and a light pastel blue, plus a third
   color to differentiate. The third one is earned rather than picked — Holland
   holds the largest tulip festival in the United States, so a tulip red is the
   town's own color, and it is the exact opposite temperature to the clinical
   blue.

   THE RULE THAT MAKES A PASTEL PALETTE WORK: a pastel is a GROUND, never a
   text color and never a button. #DCEAF4 cannot hold white type at any size.
   So the blue exists twice — the pastel to sit on, and a deep blue to write
   and act in — and the same for the coral. Measured:
     ink #16242E      15.55 on white · 12.91 on pastel
     ink-2 #45596A     7.13 on white ·  5.92 on pastel
     blue #0C557F      7.87 on white ·  6.53 on pastel · white on it 7.87 (AAA)
     coral #B8371E     5.72 on white ·  4.75 on pastel · white on it 5.72
     coral-ink #A83019 6.65 on white ·  5.52 on pastel  (coral as TEXT)

   THE EXPRESSIVE CHANNEL — tenth in the series — IS THE ROUNDED TERMINAL.
   Every stroke on this site ends in a radius: the rules, the underlines, the
   progress arcs, the chart bars, the tooth diagram, the timer ring. A dentist
   sells the absence of sharp edges, so nothing here has one. Previous channels:
   width, weight, numeral, alignment, case, size set, optical size, oblique,
   type-as-image.

   THE INTERACTION SIGNATURE: IT SETTLES. Controls scale down a hair and lift
   their shadow on press, then settle. Never a bounce — a bounce is a toy, and
   this is a place people are already nervous about.

   THE TEXTURAL SIGNATURE IS THE ROUNDED TILE: soft 20px cards on a near-white
   ground with a single, decided, tinted shadow (light from above, blue-tinted,
   two layers — §4.2). Present in the first viewport.

   NOBODY REAL IS PICTURED AS STAFF. Portraits are drawn (portraits.py). The
   children's section contains no photographs of children at all.
   =========================================================================== */

:root {
  --white: #FCFDFE;
  --sky:   #EAF3FA;
  --pastel:#DCEAF4;
  --line:  #C9DCEA;
  --ink:   #16242E;
  --ink-2: #45596A;
  --blue:  #0C557F;
  --blue-hi:#0F6699;
  --coral: #B8371E;
  --coral-ink: #A83019;
  --coral-soft: #F7E7E2;
  --mint:  #E4F0E9;
  --gold:  #F6E9D8;

  /* NOTE: no serif display here at all. Fraunces is named in the §12 reflex
     list, and a soft rounded sans is the honest register for this subject. */
  --f-t: 'Nunito Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  --f-h: 'Baloo 2', 'Nunito Sans', sans-serif;

  /* minor third, 1.2, seven steps — a calm, close scale for a calm subject */
  --t-1: .8125rem; --t0: 1.0625rem; --t1: 1.275rem; --t2: 1.53rem;
  --t3: clamp(1.85rem, 1.3rem + 2.2vw, 2.2rem);
  --t4: clamp(2.3rem, 1.5rem + 3.4vw, 3.2rem);
  --t5: clamp(2.9rem, 1.6rem + 5.4vw, 4.4rem);

  --s1:4px; --s2:8px; --s3:12px; --s4:16px; --s5:24px;
  --s6:32px; --s7:48px; --s8:64px; --s9:96px; --s10:128px;

  --r: 20px;                     /* the corner language: one radius, everywhere */
  --r-sm: 12px;
  --ease: cubic-bezier(.22,.72,.28,1);
  --fast: 140ms; --mid: 260ms;
  --edge: 1140px;

  /* the one decided shadow: light from above, tinted to the blue, two layers */
  --lift: 0 1px 2px rgba(22,36,46,.07), 0 8px 22px rgba(12,85,127,.09);
  --lift-2: 0 1px 2px rgba(22,36,46,.09), 0 16px 34px rgba(12,85,127,.14);
}

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--white);color:var(--ink);
     font-family:var(--f-t);font-size:var(--t0);line-height:1.62}
img{max-width:100%;height:auto}
svg{max-width:100%}
::selection{background:var(--blue);color:#fff}
:root{accent-color:var(--blue);caret-color:var(--blue)}

a{color:var(--blue);text-underline-offset:3px;text-decoration-thickness:1.5px}
a:hover{color:var(--blue-hi)}
:where(a,button,input,select,textarea,summary,[tabindex]):focus-visible{
  outline:3px solid var(--blue);outline-offset:3px;border-radius:var(--r-sm)}

/* ============================================================== TYPE ROLES */
.h{font-family:var(--f-h);font-weight:700;line-height:1.1;margin:0;
   letter-spacing:-.005em;text-wrap:balance}
.h--1{font-size:var(--t5)}
.h--2{font-size:var(--t4)}
.h--3{font-size:var(--t3)}
.h--4{font-size:var(--t2)}
.lead{font-size:var(--t1);line-height:1.5;text-wrap:pretty}
.note{font-size:var(--t-1);line-height:1.55;color:var(--ink-2)}
.prose{max-width:62ch}
.prose p{margin:0 0 1em;text-wrap:pretty}
.prose p:last-child{margin-bottom:0}
.k{font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.09em;
   color:var(--ink-2)}
.hot{color:var(--coral-ink)}
.cool{color:var(--blue)}

/* ================================================================ LAYOUT */
.shell{width:min(100% - var(--s5)*2, var(--edge));margin-inline:auto}
.band{padding-block:var(--s9)}
.band--tight{padding-block:var(--s7)}
.sky{background:var(--sky)}
.pastel{background:var(--pastel)}
.skip{position:absolute;left:-9999px;background:var(--ink);color:#fff;
      padding:var(--s3) var(--s5);z-index:90;border-radius:0 0 var(--r-sm) 0}
.skip:focus{left:0;top:0}

/* the divider idiom: a rounded rule, never a hairline */
.rule{border:0;height:4px;border-radius:999px;background:var(--line);margin:0}
.rule--short{width:72px;background:var(--coral)}

/* ================================================================== MAST */
.mast{background:var(--white);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:50}
.mast__in{display:flex;align-items:center;gap:var(--s3) var(--s6);padding-block:var(--s3);
          flex-wrap:wrap}
.brand{display:inline-flex;align-items:center;gap:var(--s3);min-height:44px;
       text-decoration:none;color:var(--ink)}
.brand__mark{width:38px;height:38px;flex:none;color:var(--blue)}
/* the mark grows a little when you head home -- the one place motion is a wink */
.brand:hover .brand__mark{transform:scale(1.06)}
.brand__mark{transition:transform var(--land) var(--ease)}
@media (prefers-reduced-motion:reduce){.brand:hover .brand__mark{transform:none}}
.brand__n{font-family:var(--f-h);font-weight:700;font-size:1.25rem;line-height:1.05}
.brand__sub{display:block;font-size:.7rem;color:var(--ink-2);font-weight:600;letter-spacing:.04em}
.nav{display:flex;flex-wrap:wrap;gap:0 var(--s5);margin-left:auto}
.nav a{display:inline-flex;align-items:center;min-height:44px;color:var(--ink);
       text-decoration:none;font-weight:600;font-size:var(--t-1)}
.nav a:hover{text-decoration:underline;text-underline-offset:6px}
.nav a[aria-current="page"]{color:var(--blue);text-decoration:underline;
  text-decoration-thickness:3px;text-underline-offset:7px}

/* ============================================================= IT SETTLES
   The one interaction signature. Press and the control eases DOWN a hair and
   its shadow tightens, then settles — the opposite of a bounce, because this
   is a place people arrive at already tense. Touch gets it on :active. */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--s2);
  min-height:52px;padding:var(--s3) var(--s6);border:2px solid transparent;
  border-radius:999px;font:inherit;font-weight:700;font-size:var(--t0);
  text-decoration:none;cursor:pointer;background:var(--blue);color:#fff;
  box-shadow:var(--lift);
  transition:transform var(--fast) var(--ease),box-shadow var(--fast) var(--ease),
             background var(--fast) var(--ease)}
.btn:hover{background:var(--blue-hi);box-shadow:var(--lift-2)}
.btn:active{transform:scale(.972);box-shadow:0 1px 2px rgba(22,36,46,.12)}
.btn--coral{background:var(--coral)}
.btn--coral:hover{background:#C94024}
.btn--ghost{background:transparent;color:var(--blue);border-color:var(--blue);box-shadow:none}
.btn--ghost:hover{background:var(--pastel);color:var(--blue)}
.btn--lg{min-height:60px;font-size:var(--t1);padding-inline:var(--s7)}
@media (prefers-reduced-motion:reduce){
  .btn{transition:background var(--fast) var(--ease)}
  .btn:active{transform:none}          /* the state still lands; it does not travel */
}

/* ================================================================= TILES */
.tile{background:var(--white);border-radius:var(--r);padding:var(--s6);
      box-shadow:var(--lift)}
.tile--flat{box-shadow:none;border:1px solid var(--line)}
.grid{display:grid;gap:var(--s5)}
.grid--2{grid-template-columns:repeat(2,1fr)}
.grid--3{grid-template-columns:repeat(3,1fr)}
.grid--4{grid-template-columns:repeat(4,1fr)}
.two{display:grid;grid-template-columns:1.05fr .95fr;gap:var(--s8);align-items:center}
.fig{margin:0}
.fig img{display:block;width:100%;border-radius:var(--r)}
.fig figcaption{margin-top:var(--s3);font-size:var(--t-1);color:var(--ink-2);max-width:60ch}

/* ================================================================== HERO */
.hero{padding-block:var(--s8) var(--s7)}
.hero__ctas{display:flex;flex-wrap:wrap;gap:var(--s3);margin-top:var(--s6)}
.hero__pts{display:flex;flex-wrap:wrap;gap:var(--s2) var(--s6);margin-top:var(--s6)}
.hero__pts span{display:inline-flex;align-items:center;gap:var(--s2);font-weight:600;
                font-size:var(--t-1)}

/* ================================================================== TEAM */
.person{background:var(--white);border-radius:var(--r);overflow:hidden;
        box-shadow:var(--lift);display:flex;flex-direction:column}
.person__img{display:block;width:100%;height:auto;aspect-ratio:1;
             object-fit:cover;background:var(--sky)}
.person__body{padding:var(--s5);display:flex;flex-direction:column;gap:var(--s2);flex:1}
.person__role{font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;
  color:#fff;background:var(--blue);align-self:flex-start;padding:3px 10px;border-radius:999px}
.person__role--desk{background:var(--coral)}
.person__name{font-family:var(--f-h);font-weight:700;font-size:var(--t2);line-height:1.15}
.person__fact{margin-top:auto;padding-top:var(--s3);border-top:1px solid var(--line);
              font-size:var(--t-1);color:var(--ink-2)}

/* ============================================================== SCHEDULER
   Provider-first, not calendar-first: you pick a face, then a day. That is the
   order patients actually think in — "can I see my hygienist" comes before
   "is Tuesday free" — and it is a different shape from the calendar-first
   booker built for the HVAC project. */
.steps{display:grid;gap:var(--s6)}
.step{background:var(--white);border-radius:var(--r);box-shadow:var(--lift);padding:var(--s6)}
.step__n{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;
  border-radius:999px;background:var(--pastel);color:var(--blue);font-weight:800;
  font-family:var(--f-h);margin-right:var(--s3)}
.step[data-done="true"] .step__n{background:var(--blue);color:#fff}
.opts{display:grid;gap:var(--s3);margin-top:var(--s5)}
.opts--2{grid-template-columns:1fr 1fr}
.opt{display:flex;gap:var(--s4);align-items:center;padding:var(--s4);border-radius:var(--r-sm);
  border:2px solid var(--line);background:var(--white);cursor:pointer;text-align:left;
  font:inherit;color:inherit;
  transition:border-color var(--fast) var(--ease),transform var(--fast) var(--ease)}
.opt:hover{border-color:var(--blue)}
.opt:active{transform:scale(.99)}
.opt[aria-pressed="true"]{border-color:var(--blue);background:var(--sky)}
.opt img{width:64px;height:64px;border-radius:999px;flex:none;background:var(--sky)}
.opt__n{font-weight:700}
.opt__d{display:block;font-size:var(--t-1);color:var(--ink-2)}
.slots{display:flex;flex-wrap:wrap;gap:var(--s2);margin-top:var(--s5)}
.slot{min-height:48px;padding:var(--s2) var(--s5);border-radius:999px;border:2px solid var(--line);
  background:var(--white);font:inherit;font-weight:700;cursor:pointer;
  transition:transform var(--fast) var(--ease)}
.slot:active{transform:scale(.97)}
.slot[aria-pressed="true"]{background:var(--blue);border-color:var(--blue);color:#fff}
.slot:disabled{color:var(--ink-2);background:var(--sky);border-color:var(--sky);
  text-decoration:line-through;cursor:not-allowed}
.days{display:flex;flex-wrap:wrap;gap:var(--s2);margin-top:var(--s5)}
.day{min-height:64px;min-width:64px;padding:var(--s2) var(--s3);border-radius:var(--r-sm);
  border:2px solid var(--line);background:var(--white);font:inherit;cursor:pointer;
  display:flex;flex-direction:column;align-items:center;justify-content:center;line-height:1.2}
.day b{font-family:var(--f-h);font-size:var(--t1)}
.day small{font-size:.7rem;color:var(--ink-2);text-transform:uppercase;letter-spacing:.06em}
.day[aria-pressed="true"]{background:var(--blue);border-color:var(--blue);color:#fff}
.day[aria-pressed="true"] small{color:#DCEAF4}
.day:disabled{background:var(--sky);color:var(--ink-2);cursor:not-allowed;border-color:var(--sky)}
.summary{background:var(--pastel);border-radius:var(--r);padding:var(--s6);position:sticky;
         top:96px}
.summary dt{font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;
            color:var(--ink-2)}
.summary dd{margin:2px 0 var(--s4);font-weight:700}

/* ================================================================== FORMS */
.form{display:grid;gap:var(--s6)}
.field{display:grid;gap:var(--s2)}
.field > label{font-weight:700}
.field input[type=text],.field input[type=tel],.field input[type=email],
.field input[type=date],.field select,.field textarea{
  min-height:52px;padding:var(--s3) var(--s4);border:2px solid var(--line);
  border-radius:var(--r-sm);font:inherit;background:var(--white);color:var(--ink);width:100%}
.field textarea{min-height:120px;resize:vertical}
.field input:focus-visible,.field select:focus-visible,.field textarea:focus-visible{
  border-color:var(--blue)}
.field .hint{font-size:var(--t-1);color:var(--ink-2)}
.field .err{font-size:var(--t-1);color:var(--coral-ink);font-weight:700}
.field[data-invalid="true"] input,.field[data-invalid="true"] select{border-color:var(--coral)}
.checks{display:grid;gap:var(--s2)}
.check{display:flex;gap:var(--s3);align-items:flex-start;padding:var(--s3) var(--s4);
  border:2px solid var(--line);border-radius:var(--r-sm);cursor:pointer}
.check:has(input:checked){border-color:var(--blue);background:var(--sky)}
.check input{margin-top:3px;width:20px;height:20px;flex:none}
.progress{display:flex;gap:var(--s2);align-items:center;margin-bottom:var(--s6)}
.progress span{height:8px;border-radius:999px;background:var(--line);flex:1}
.progress span[data-on="true"]{background:var(--blue)}

/* ================================================================== KIDS
   Louder on purpose: bigger type, more color, more motion. Everything here
   is still a real button with a real label — a section for children is the
   LAST place to trade accessibility for delight. */
.kids{background:linear-gradient(180deg,var(--sky),var(--white) 70%)}
.kidcard{border-radius:28px;padding:var(--s6);box-shadow:var(--lift)}
.kidcard--blue{background:var(--pastel)}
.kidcard--coral{background:var(--coral-soft)}
.kidcard--mint{background:var(--mint)}
.kidcard--gold{background:var(--gold)}

.timer{display:grid;place-items:center;gap:var(--s4)}
.timer__ring{width:min(78vw,300px);height:min(78vw,300px)}
.timer__ring circle{fill:none;stroke-linecap:round}
.timer__track{stroke:var(--white);stroke-width:18}
.timer__arc{stroke:var(--blue);stroke-width:18;
  transition:stroke-dashoffset .95s linear,stroke .3s var(--ease)}
.timer__t{font-family:var(--f-h);font-weight:800;font-size:2.6rem;fill:var(--ink)}
.timer__q{font-family:var(--f-h);font-weight:700;font-size:var(--t2);text-align:center}
.quads{display:grid;grid-template-columns:1fr 1fr;gap:var(--s2);max-width:320px;margin-inline:auto}
.quad{padding:var(--s3);border-radius:var(--r-sm);background:var(--white);text-align:center;
  font-weight:700;font-size:var(--t-1);border:2px solid transparent}
.quad[data-on="true"]{border-color:var(--blue);background:var(--sky)}
.quad[data-done="true"]{background:var(--blue);color:#fff}
@media (prefers-reduced-motion:reduce){.timer__arc{transition:none}}

.sortgame{display:grid;gap:var(--s5)}
.bins{display:grid;grid-template-columns:1fr 1fr;gap:var(--s4)}
.bin{border-radius:var(--r);padding:var(--s5);min-height:150px;border:3px dashed var(--line);
     text-align:center}
.bin--any{background:var(--mint);border-color:#9CC7AE}
.bin--some{background:var(--gold);border-color:#DEBF8A}
.bin h3{margin:0 0 var(--s2)}
.foods{display:flex;flex-wrap:wrap;gap:var(--s2);justify-content:center}
.food{min-height:48px;padding:var(--s2) var(--s4);border-radius:999px;border:2px solid var(--line);
  background:var(--white);font:inherit;font-weight:700;cursor:pointer;
  transition:transform var(--fast) var(--ease)}
.food:active{transform:scale(.95)}
.food[data-placed="true"]{opacity:.5;cursor:default}
.score{font-family:var(--f-h);font-weight:800;font-size:var(--t3)}

.toothchart{display:grid;grid-template-columns:repeat(auto-fit,minmax(96px,1fr));gap:var(--s3)}
.tooth{border:none;background:var(--white);border-radius:var(--r-sm);padding:var(--s4) var(--s2);
  box-shadow:var(--lift);cursor:pointer;font:inherit;text-align:center;
  transition:transform var(--fast) var(--ease)}
.tooth:hover{transform:translateY(-3px)}
.tooth[aria-pressed="true"]{background:var(--pastel)}
.tooth svg{width:38px;height:44px}
.tooth b{display:block;font-family:var(--f-h);font-size:var(--t-1);margin-top:4px}

/* ================================================================ FOOTER */
.foot{background:var(--sky);padding-block:var(--s8);margin-top:var(--s9)}
.foot__cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:var(--s6)}
.foot h2{font-size:var(--t-1);font-weight:800;color:var(--ink-2);margin:0 0 var(--s3)}
.foot ul{list-style:none;margin:0;padding:0}
.foot li{min-height:38px;padding-block:4px}
.foot a{display:inline-flex;align-items:center;min-height:44px}
.disclaim{margin-top:var(--s6);padding-top:var(--s5);border-top:1px solid var(--line)}

/* ============================================================= RESPONSIVE */
@media (max-width:900px){
  .two{grid-template-columns:1fr;gap:var(--s6)}
  .grid--3,.grid--4{grid-template-columns:1fr 1fr}
  .opts--2{grid-template-columns:1fr}
  .summary{position:static}
  .band{padding-block:var(--s8)}
}
@media (max-width:600px){
  .grid--2,.grid--3,.grid--4{grid-template-columns:1fr}
  .bins{grid-template-columns:1fr}
  .shell{width:min(100% - var(--s4)*2,var(--edge))}
}
@media (forced-colors:active){
  .tile,.person,.step,.kidcard{border:1px solid CanvasText}
  .opt[aria-pressed="true"],.slot[aria-pressed="true"],.day[aria-pressed="true"],
  .quad[data-done="true"]{outline:3px solid CanvasText;outline-offset:-5px}
  .btn{border-color:CanvasText}
}
@media print{
  .mast,.nav,.foot,.btn,.skip{display:none!important}
  body{background:#fff}
  .tile,.step{box-shadow:none;border:1px solid #999}
}

/* ---------- Built by Iron Digital MI ----------
   currentColor throughout so the line inherits whatever the footer already is.
   The mark itself is never recolored. */
.id-by { margin: 1.6em 0 0; }
.id-by a { display: inline-flex; align-items: center; gap: .6em;
  color: inherit; text-decoration: none; font-size: .8125rem; line-height: 1.3; }
.id-by a:hover span, .id-by a:focus-visible span { text-decoration: underline; }
.id-by img { width: 26px; height: 26px; display: block; flex: 0 0 auto; }
.id-by b { font-weight: 700; }
