/* ============================================================
   Salty Coconut — booking system
   Tokens come straight from the design handoff.
   ============================================================ */
:root{
  --ink:#1C1F17;
  --ink-hover:#262B1F;
  --ink-hover-2:#333829;
  --olive:#626657;
  --tan:#B29570;
  --tan-hover:#C4A87F;
  --tan-deep:#8E7452;
  --sand:#E8DCCB;
  --sand-text:#5A4A2E;
  --unpaid-bg:#F0E2CC;
  --unpaid-text:#8E6A32;
  --sage:#DDE3D3;
  --sage-text:#3F4A34;
  --canvas:#F4F0E8;
  --paper:#FDFBF6;
  --paper-alt:#F7F3EB;
  --cream:#E9E3D6;
  --body:#3A3E32;
  --muted:#6B6F5F;
  --faint:#A8AA9B;
  --faint-2:#BFC1B3;
  --danger:#9E5B4B;
  --hairline:rgba(28,31,23,.09);
  --hairline-strong:rgba(28,31,23,.16);
  --hairline-dark:rgba(233,227,214,.12);
  --serif:'Instrument Serif',Georgia,serif;
  --sans:Jost,system-ui,-apple-system,sans-serif;
}

*{box-sizing:border-box}
[hidden]{display:none !important}
html,body{margin:0;padding:0}
body{
  background:var(--canvas);
  color:var(--body);
  font-family:var(--sans);
  font-weight:400;
  -webkit-font-smoothing:antialiased;
}
a{color:var(--tan);text-decoration:none}
a:hover{color:var(--tan-deep)}
img{max-width:100%}
button,input,select,textarea{font:inherit;color:inherit}
::-webkit-scrollbar{width:9px;height:9px}
::-webkit-scrollbar-thumb{background:rgba(0,0,0,.18);border-radius:9px}
::-webkit-scrollbar-track{background:transparent}

/* ---------------------------------------------------- primitives */
.serif{font-family:var(--serif);font-weight:400;letter-spacing:.01em}
.kicker{font-size:10px;letter-spacing:.24em;text-transform:uppercase;color:var(--tan-deep)}
.label{font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--tan-deep)}
.label-on-ink{font-size:10px;letter-spacing:.22em;text-transform:uppercase;color:var(--tan)}
.muted{color:var(--muted)}
.faint{color:var(--faint)}
.lead{font-size:17px;line-height:1.65;color:#4A4E40;max-width:60ch;text-wrap:pretty}
h1,h2,h3{font-family:var(--serif);font-weight:400;margin:0;color:var(--ink);line-height:1.02}
.h-page{font-size:58px;line-height:1}
.h-xl{font-size:66px;line-height:1}
.h-card{font-size:26px}
.rule{height:1px;background:var(--hairline);border:0;margin:22px 0}
.rule-dark{height:1px;background:var(--hairline-dark);border:0;margin:22px 0}
.stack{display:flex;flex-direction:column}
.row{display:flex;align-items:center}
.spread{display:flex;align-items:center;justify-content:space-between;gap:16px}
.wrap{flex-wrap:wrap}
.grow{flex:1;min-width:0}
.right{text-align:right}

/* ---------------------------------------------------- surfaces */
/* Several pages cap their own width inline. Without an auto margin they hug
   the left edge on a wide screen; with no cap set, this changes nothing. */
.page{padding:44px 48px 90px;margin-inline:auto}
.page--wide{padding:56px 64px 90px;margin-inline:auto}
.card{background:var(--paper);border:1px solid var(--hairline);border-radius:16px;padding:26px 28px}
.card--tight{padding:22px 24px}
.card:hover{border-color:rgba(28,31,23,.14)}
.card-ink{background:var(--ink);color:var(--cream);border-radius:18px;padding:28px}
.panel{background:var(--canvas);border-radius:14px;padding:20px 22px}
.panel-alt{background:var(--paper-alt);border-radius:14px;padding:20px 22px}
.note-sand{background:var(--sand);color:var(--sand-text);border-radius:12px;padding:14px 18px;font-size:13.5px;line-height:1.6}
.dashed{border:1px dashed rgba(28,31,23,.22);border-radius:12px}

/* ---------------------------------------------------- chips & pills */
.chip{display:inline-block;font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;padding:6px 12px;border-radius:100px;white-space:nowrap}
.chip--sage{background:var(--sage);color:var(--sage-text)}
.chip--unpaid{background:var(--unpaid-bg);color:var(--unpaid-text)}
.chip--done{background:rgba(28,31,23,.08);color:#4A4E40}
.chip--chair{background:var(--tan);color:var(--ink)}
.chip--danger{background:rgba(158,91,75,.14);color:var(--danger)}
.chip--sand{background:var(--sand);color:var(--sand-text)}

.pill{display:inline-flex;align-items:center;gap:8px;padding:9px 15px;border-radius:100px;font-size:12.5px;cursor:pointer;transition:all .15s;background:transparent;border:1px solid var(--hairline-strong);color:#4A4E40}
.pill:hover{background:rgba(28,31,23,.05)}
.pill.is-on{background:var(--ink);color:var(--canvas);border-color:var(--ink)}
/* Badge on a category pill: how many services are picked inside it. */
.pill{position:relative}
.pill__mark{
  position:absolute;top:-6px;right:-6px;width:17px;height:17px;
  border-radius:50%;background:var(--olive);color:#fff;
  font-size:10px;line-height:1;display:grid;place-items:center;
  border:2px solid var(--paper);box-sizing:content-box;pointer-events:none;
}
.pill.is-on .pill__mark{border-color:var(--ink)}
.pill--tan.is-on{background:var(--tan);color:var(--ink);border-color:var(--tan)}

/* ---------------------------------------------------- buttons */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;font-size:11.5px;letter-spacing:.16em;text-transform:uppercase;padding:13px 22px;border-radius:100px;border:1px solid transparent;cursor:pointer;transition:all .15s;background:transparent;color:var(--ink)}
.btn--ink{background:var(--ink);color:var(--cream)}
.btn--ink:hover{background:var(--ink-hover-2)}
.btn--tan{background:var(--tan);color:var(--ink)}
.btn--tan:hover{background:var(--tan-hover)}
.btn--outline{border-color:var(--hairline-strong);color:var(--ink)}
.btn--outline:hover{background:rgba(28,31,23,.05)}
.btn--outline-cream{border-color:rgba(233,227,214,.28);color:var(--cream)}
.btn--outline-cream:hover{background:rgba(233,227,214,.1)}
.btn--sage{background:var(--sage);color:var(--sage-text);cursor:default}
.btn--danger{color:var(--danger)}
.btn--danger:hover{background:rgba(158,91,75,.08)}
.btn--wide{width:100%}
.btn--muted{background:rgba(233,227,214,.12);color:rgba(233,227,214,.55);cursor:not-allowed}
.btn[disabled]{cursor:not-allowed}
.btn--sm{padding:9px 15px;font-size:11px}

/* Header account link: same icon-plus-label shape as the pills beside it,
   but no border or fill at rest — it should read as "you", not as one more
   button competing for the eye. A tint marks it hovered or the active page. */
.head-link{
  display:inline-flex;align-items:center;gap:8px;padding:9px 14px;border-radius:100px;
  font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink);
  text-decoration:none;transition:background .15s;
}
.head-link:hover{background:rgba(28,31,23,.05)}
.head-link.is-on{background:rgba(28,31,23,.07)}

.btn-link{
  background:none;border:0;padding:2px 0;cursor:pointer;font-size:13px;color:var(--tan-deep);
  text-decoration:underline;text-decoration-color:rgba(142,116,82,.35);text-underline-offset:3px;
  transition:color .15s,text-decoration-color .15s;
}
.btn-link:hover{color:var(--ink);text-decoration-color:var(--ink);background:none}
.btn-link:focus-visible{outline:2px solid var(--tan);outline-offset:3px;border-radius:4px}
.btn-link.is-open{color:var(--ink);text-decoration-color:var(--ink)}

/* ---------------------------------------------------- forms */
.field{width:100%;padding:13px 16px;border-radius:10px;border:1px solid var(--hairline-strong);background:#fff;font-size:14.5px;color:var(--ink)}
.field:focus{outline:0;border-color:var(--ink)}
.field::placeholder{color:var(--faint-2)}
textarea.field{min-height:92px;resize:vertical;line-height:1.6}
/* Stroked chevron, same line weight as the disclosure one — not a solid triangle. */
select.field{
  appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8' fill='none'%3E%3Cpath d='M1 1.75L6 6.25L11 1.75' stroke='%238E7452' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-position:calc(100% - 15px) 50%;
  background-size:12px 8px;
  background-repeat:no-repeat;
  padding-right:40px;
}
select.field:hover{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8' fill='none'%3E%3Cpath d='M1 1.75L6 6.25L11 1.75' stroke='%231C1F17' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}

/* ---------------------------------------------------- service rows */
.svc{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 18px;border-radius:12px;cursor:pointer;transition:all .15s;background:#fff;border:1px solid rgba(28,31,23,.1)}
.svc:hover{border-color:rgba(28,31,23,.28)}
.svc.is-on{background:#EFEAE0;border-color:var(--ink)}
.svc__dot{width:20px;height:20px;border-radius:50%;flex:none;display:grid;place-items:center;font-size:11px;color:var(--canvas);background:transparent;border:1.5px solid rgba(28,31,23,.24)}
.svc.is-on .svc__dot{background:var(--ink);border-color:var(--ink)}
.svc__name{font-size:15px;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.svc__dur{font-size:11.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--tan-deep);margin-top:3px}
.svc__price{font-family:var(--serif);font-size:22px;color:var(--ink);flex:none}
.svc--compact{padding:11px 14px}
/* Name, when, who — in columns, so the eye reads down one service at a time
   instead of hunting a wrapped row. */
.part-row{display:grid;grid-template-columns:minmax(140px,1fr) 190px 160px;gap:10px;
  align-items:center;margin-top:12px}
@media (max-width:760px){.part-row{grid-template-columns:1fr 1fr;gap:8px}
  .part-row>span:first-child{grid-column:1 / -1}}
.svc--compact .svc__price{font-size:19px}

/* ---------------------------------------------------- stylist cards */
.person{width:132px;padding:18px 14px 16px;border-radius:14px;text-align:center;cursor:pointer;transition:all .15s;background:#fff;border:1px solid rgba(28,31,23,.1)}
.person:hover{border-color:rgba(28,31,23,.28)}
.person.is-on{background:#EFEAE0;border-color:var(--ink)}
.person__av{width:44px;height:44px;border-radius:50%;margin:0 auto;display:grid;place-items:center;font-size:16px;background:var(--sand);color:var(--sand-text)}
.person.is-on .person__av{background:var(--ink);color:var(--canvas)}
/* The stacked spacing belongs to the card; inside a pill the name sits inline. */
.person .person__name{font-size:14px;color:var(--ink);margin-top:10px}
.person .person__role{font-size:11px;color:var(--tan-deep);margin-top:2px}
.pill .person__name{font-size:13px;line-height:1;margin:0}
.av{border-radius:50%;display:grid;place-items:center;background:var(--sand);color:var(--sand-text);flex:none}

/* ---------------------------------------------------- day strip & times */
.daystrip{display:flex;gap:8px;overflow:auto;padding-bottom:4px}
.day{flex:none;width:82px;padding:12px 10px;border-radius:13px;text-align:center;cursor:pointer;transition:all .15s;background:#fff;border:1px solid rgba(28,31,23,.1);color:var(--ink)}
.day:hover{border-color:rgba(28,31,23,.28)}
.day.is-on{background:var(--ink);color:var(--canvas);border-color:var(--ink)}
.day__dow{font-size:10px;letter-spacing:.16em;text-transform:uppercase;opacity:.6}
.day__num{font-family:var(--serif);font-size:26px;line-height:1.15;margin-top:4px}
.day__free{font-size:10px;opacity:.6}
.times{display:flex;flex-wrap:wrap;gap:8px}
.time{padding:9px 15px;border-radius:100px;font-size:12.5px;cursor:pointer;transition:all .15s;background:#fff;border:1px solid rgba(28,31,23,.14);color:var(--ink)}
.time:hover{border-color:var(--ink)}
.time.is-on{background:var(--tan);color:var(--ink);border-color:var(--tan)}
.time.is-off{background:transparent;border:1px dashed rgba(28,31,23,.14);color:var(--faint-2);cursor:default;text-decoration:line-through}

/* ---------------------------------------------------- customer header */
.site-head{display:flex;align-items:center;justify-content:space-between;padding:18px 48px;background:var(--paper);border-bottom:1px solid rgba(28,31,23,.08);position:sticky;top:0;z-index:5}
.site-head__brand{display:flex;align-items:center;gap:12px;font-family:var(--serif);font-size:21px;color:var(--ink)}
.site-head__brand img{width:44px;height:44px;border-radius:50%}
.site-nav{display:flex;gap:30px;font-size:12.5px;letter-spacing:.12em;text-transform:uppercase;color:#4A4E40}
.site-nav a{color:#4A4E40}
.site-nav a:hover,.site-nav a.is-on{color:var(--tan)}

/* ---------------------------------------------------- booking layout */
.book-grid{display:grid;grid-template-columns:minmax(0,1fr) 348px;gap:40px;margin-top:40px;align-items:start}
.book-aside{position:sticky;top:98px}
.step{display:flex;align-items:baseline;gap:12px}
.step__no{font-family:var(--serif);font-size:28px;color:var(--tan)}

/* ---------------------------------------------------- staff chrome */
.staff-head{background:var(--ink);color:var(--cream);padding:26px 48px 30px}
.tabs{display:flex;gap:8px;flex-wrap:wrap}
.tab{display:flex;align-items:center;gap:9px;padding:8px 16px 8px 8px;border-radius:100px;cursor:pointer;font-size:13.5px;transition:all .15s;background:rgba(233,227,214,.08);color:rgba(233,227,214,.72);border:0}
.tab:hover{background:rgba(233,227,214,.14)}
.tab.is-on{background:var(--tan);color:var(--ink)}
.tab__av{width:26px;height:26px;border-radius:50%;display:grid;place-items:center;font-size:11px;flex:none;background:rgba(233,227,214,.16);color:var(--cream)}
.tab.is-on .tab__av{background:var(--ink);color:var(--cream)}
.stats{display:flex;gap:52px;flex-wrap:wrap;margin-top:26px}
.stat__n{font-family:var(--serif);font-size:40px;line-height:1}
.stat__l{font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:rgba(233,227,214,.5);margin-top:6px}
.stat--tan .stat__n{color:var(--tan)}
.viewswitch{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:16px 48px;background:var(--paper);border-bottom:1px solid var(--hairline)}
.nav-who{font-size:12.5px;color:var(--muted);white-space:nowrap}

/* ---------------------------------------------------- left rail */
.app{display:flex;min-height:100vh;background:var(--canvas)}
.app-main{flex:1;min-width:0}
.rail{
  width:232px;flex:none;background:var(--ink);color:var(--cream);
  padding:22px 16px;display:flex;flex-direction:column;gap:26px;
  position:sticky;top:0;height:100vh;overflow:auto;
}
.rail__brand{display:flex;align-items:center;gap:11px}
.rail__brand img{width:40px;height:40px;border-radius:50%;object-fit:cover}
.rail__name{font-family:var(--serif);font-size:19px;line-height:1.05;letter-spacing:.01em}
.rail__kicker{font-size:9px;letter-spacing:.22em;text-transform:uppercase;color:var(--tan);margin-top:3px}
.rail__nav{display:flex;flex-direction:column;gap:4px}
.rail__section{font-size:9.5px;letter-spacing:.2em;text-transform:uppercase;color:rgba(233,227,214,.42);padding:16px 10px 7px}
.rail__section:first-child{padding-top:0}
.rail__item{
  font-size:14px;padding:9px 11px;border-radius:9px;
  color:rgba(233,227,214,.68);transition:background .15s,color .15s;
}
.rail__item:hover{background:rgba(233,227,214,.07);color:var(--cream)}
.rail__item.is-on{background:rgba(233,227,214,.12);color:var(--canvas)}
.rail__foot{
  margin-top:auto;font-size:11px;line-height:1.8;color:rgba(233,227,214,.4);
  border-top:1px solid var(--hairline-dark);padding-top:14px;
}
.rail__foot a{color:rgba(233,227,214,.55);display:block}
.rail__foot a:hover{color:var(--tan)}

/* ---------------------------------------------------- phone bottom bar */
.bottombar{display:none}

@media (max-width:760px){
  .bottombar{
    display:grid;grid-template-columns:repeat(4,1fr);
    position:fixed;left:0;right:0;bottom:0;z-index:20;
    background:var(--ink);border-top:1px solid var(--hairline-dark);
    padding-bottom:env(safe-area-inset-bottom);
  }
  .bottombar__item{
    padding:14px 4px;text-align:center;font-size:11px;letter-spacing:.14em;
    text-transform:uppercase;color:rgba(233,227,214,.55);min-height:48px;
  }
  .bottombar__item.is-on{color:var(--tan)}
  /* keep the bar off the last row of content */
  .app-main{padding-bottom:64px}
  /* the rail's own copies of these links would just be duplicates down here */
  .rail__nav{display:none}
}

@media (max-width:900px){
  .app{display:block}
  .rail{
    width:auto;height:auto;position:static;flex-direction:row;align-items:center;
    gap:14px;overflow-x:auto;padding:14px 20px;
  }
  .rail__brand{flex:none}
  .rail__brand > div{display:none}
  .rail__nav{flex-direction:row;align-items:center;gap:6px}
  .rail__section{display:none}
  .rail__item{white-space:nowrap;padding:8px 12px}
  .rail__foot{margin:0 0 0 auto;border:0;padding:0;display:flex;gap:12px;white-space:nowrap}
}

/* ---------------------------------------------------- admin · staff table */
.staff-row{
  display:grid;
  grid-template-columns:minmax(0,1.6fr) minmax(0,1.1fr) minmax(0,1fr) 96px 108px;
  gap:16px;align-items:center;
  background:var(--paper);border:1px solid var(--hairline);border-radius:14px;
  padding:16px 20px;margin-bottom:8px;cursor:pointer;transition:all .15s;color:var(--ink);
}
.staff-row:hover{border-color:rgba(28,31,23,.28)}
.staff-row.is-on{background:#EFEAE0;border-color:var(--ink)}
.staff-row.is-on .staff-row__av{background:var(--ink);color:var(--cream)}
.staff-row.is-away{opacity:.62}
.staff-row.is-away .staff-row__av{background:rgba(28,31,23,.08);color:var(--muted)}
.staff-row--head{
  background:transparent;border:0;padding:0 20px 10px;cursor:default;margin-bottom:4px;
  font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--tan-deep);
}
.staff-row--head:hover{border-color:transparent}
.chip--ink{background:var(--ink);color:var(--cream)}
.cat-chip{
  display:inline-block;background:#EFEAE0;border:1px solid var(--hairline);
  border-radius:100px;padding:7px 14px;font-size:12px;color:var(--ink);
}
.cat-chip--add{border-style:dashed;background:transparent;color:var(--tan-deep)}
.cat-chip--add:hover{border-color:var(--ink);color:var(--ink)}

@media (max-width:1100px){
  .staff-row{grid-template-columns:minmax(0,1.4fr) minmax(0,1fr) 100px;row-gap:10px}
  .staff-row--head{display:none}
}

/* ---------------------------------------------------- admin · services table */
.svc-row{
  display:grid;
  grid-template-columns:minmax(0,1.5fr) minmax(0,1fr) 90px 84px 52px 86px;
  gap:16px;align-items:center;
  background:var(--paper);border:1px solid var(--hairline);border-radius:12px;
  padding:14px 20px;margin-bottom:8px;transition:all .15s;
}
.svc-row.is-off{background:transparent;border:1px dashed rgba(28,31,23,.18);opacity:.6}
.svc-row--head{
  background:transparent;border:0;padding:0 20px 10px;margin-bottom:4px;
  font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--tan-deep);
}
.svc-row__act{
  background:none;border:0;padding:0;cursor:pointer;
  font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--tan-deep);
}
.svc-row__act:hover{color:var(--ink)}
.svc-row__act--danger{color:var(--danger)}
.svc-row__act--danger:hover{color:var(--danger);text-decoration:underline}

.svc-edit{
  background:var(--paper);border:1px solid var(--ink);border-radius:16px;
  padding:26px 28px;margin:0 0 14px;
}
.stepper__btn{
  width:38px;height:38px;border-radius:50%;background:#fff;
  border:1px solid rgba(28,31,23,.18);cursor:pointer;font-size:18px;line-height:1;
  color:var(--ink);display:grid;place-items:center;flex:none;
}
.stepper__btn:hover{background:rgba(28,31,23,.05)}
/* Avatar-bearing pills: tighten the left edge and keep both halves centred. */
.pill--who,.pill--tan{padding-left:6px}
.pill .av{line-height:1}
.pill.is-on .av{background:var(--tan);color:var(--ink)}
.pill--tan.is-on .av{background:var(--ink);color:var(--cream)}

@media (max-width:1100px){
  .svc-row{grid-template-columns:minmax(0,1.4fr) 90px 52px 86px;row-gap:10px}
  .svc-row--head{display:none}
}

/* ---------------------------------------------------- client list */
/* Count pills in an ink header: the number sits in its own bubble. */
.pill--count{gap:9px;border-color:rgba(233,227,214,.28);color:var(--cream)}
.pill--count:hover{background:rgba(233,227,214,.1)}
.pill--count.is-on{background:var(--tan);color:var(--ink);border-color:var(--tan)}
.pill__count{
  display:inline-grid;place-items:center;min-width:20px;height:20px;padding:0 6px;
  border-radius:100px;background:rgba(233,227,214,.16);color:var(--cream);
  font-size:11px;line-height:1;
}
.pill--count.is-on .pill__count{background:var(--ink);color:var(--cream)}

.client-row{padding:16px 0;border-bottom:1px solid var(--hairline)}
/* The rule between rows shouldn't run along the bottom edge of the card. */
.client-item:last-child .client-row{border-bottom:0}

.cat-row{
  display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:14px;align-items:center;
  padding:12px 0;border-bottom:1px solid var(--hairline);
}
.cat-row:last-child{border-bottom:0}
@media (max-width:900px){
  .cat-row{grid-template-columns:minmax(0,1fr);row-gap:10px}
}

/* Sign-in is a single short form — centre it rather than stranding it top-left. */
.signin-page{
  max-width:520px;margin:0 auto;
  min-height:calc(100vh - 220px);
  display:flex;flex-direction:column;justify-content:center;
}

/* ---------------------------------------------------- pager */
.pager{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:22px}
.pager__page,.pager__step{
  min-width:36px;height:36px;padding:0 10px;border-radius:100px;
  display:inline-grid;place-items:center;font-size:13px;
  border:1px solid var(--hairline-strong);color:var(--ink);transition:all .15s;
}
.pager__page:hover,.pager__step:hover{background:rgba(28,31,23,.05);color:var(--ink)}
.pager__page.is-on{background:var(--ink);color:var(--cream);border-color:var(--ink)}
.pager__step.is-off{opacity:.35;pointer-events:none}
.pager__gap{color:var(--faint);padding:0 2px}

/* ---------------------------------------------------- colour pickers */
.swatch-row{display:flex;align-items:center;gap:12px;padding:6px 0}
.swatch{
  width:34px;height:34px;flex:none;padding:0;cursor:pointer;
  border:1px solid var(--hairline-strong);border-radius:9px;background:none;
}
.swatch::-webkit-color-swatch-wrapper{padding:2px}
.swatch::-webkit-color-swatch{border:0;border-radius:7px}
.swatch::-moz-color-swatch{border:0;border-radius:7px}
.swatch-row__hex{
  font-size:11.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);
  display:block;margin-top:2px;
}

/* settings rows: one inline form per record */
.settings-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:12px 0;border-bottom:1px solid var(--hairline)}
.settings-row:last-child{border-bottom:0}
.settings-row .field{flex:1 1 150px;min-width:0;padding:9px 12px;font-size:14px}
.settings-row .field[type=number]{flex:0 0 92px}
.settings-row.is-archived{opacity:.5}
.field--warn{border-color:var(--unpaid-text);background:var(--unpaid-bg)}
/* Disclosure chevron, drawn rather than typed: one line weight, and it turns
   instead of swapping glyph. Matches the hairline weight used elsewhere. */
details > summary{list-style:none;display:flex;align-items:center;gap:11px}
details > summary::-webkit-details-marker{display:none}
details > summary::before{
  content:'';
  width:7px;height:7px;flex:none;
  border-right:1.5px solid var(--tan-deep);
  border-bottom:1.5px solid var(--tan-deep);
  border-radius:1px;
  transform:rotate(-45deg);
  transform-origin:60% 60%;
  transition:transform .18s ease, border-color .18s ease;
}
details > summary:hover::before{border-color:var(--ink)}
details[open] > summary::before{transform:rotate(45deg)}
details > summary:focus-visible{outline:2px solid var(--tan);outline-offset:4px;border-radius:6px}

/* ---------------------------------------------------- staff timeline */
.tl{display:flex;flex-direction:column;gap:14px}
.tl-row{display:grid;grid-template-columns:96px minmax(0,1fr);gap:22px;align-items:start}
.tl-time{font-family:var(--serif);font-size:30px;text-align:right;line-height:1.1;color:var(--ink)}
.tl-row--next .tl-time{font-size:34px}
.tl-time__label{font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--tan-deep);margin-top:6px;font-family:var(--sans)}
.tl-time--gap{font-size:15px;color:var(--muted);font-family:var(--sans);padding-top:8px}
.appt{background:var(--paper);border:1px solid var(--hairline);border-radius:14px;padding:18px 22px;transition:all .15s}
.appt:hover{border-color:rgba(28,31,23,.28)}
.appt__name{font-size:19px;color:var(--ink)}
.appt__svc{font-size:13.5px;color:var(--muted);margin-top:4px}
.appt--done{background:transparent;border-color:var(--hairline);opacity:.55}
.appt--done .appt__name{text-decoration:line-through}
.appt--next{background:var(--ink);color:var(--cream);border-color:var(--ink);border-radius:16px;padding:24px 26px}
.appt--next .appt__name{font-family:var(--serif);font-size:30px;color:var(--cream)}
.appt--next .appt__svc{color:rgba(233,227,214,.68);font-size:14px}
.appt__note{color:var(--tan);font-size:13.5px;margin-top:12px;line-height:1.6}
.appt-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:20px}
.gap-row{border:1px dashed rgba(28,31,23,.22);border-radius:12px;padding:14px 20px;display:flex;align-items:center;justify-content:space-between;gap:16px;color:var(--muted);font-size:13.5px}

/* ---------------------------------------------------- week grid */
.week{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:10px;min-height:400px;margin-top:26px}
.week-col{background:var(--paper);border:1px solid var(--hairline);border-radius:14px;padding:14px 12px;display:flex;flex-direction:column;gap:8px}
.week-col--today{background:var(--ink);border-color:var(--ink);color:var(--cream)}
.week-col__head{display:flex;align-items:baseline;justify-content:space-between;gap:6px;padding-bottom:10px;border-bottom:1px solid var(--hairline)}
.week-col--today .week-col__head{border-color:var(--hairline-dark)}
.week-col__dow{font-size:10px;letter-spacing:.18em;text-transform:uppercase;opacity:.6}
.week-col__num{font-family:var(--serif);font-size:24px}
.blk{border-radius:10px;padding:8px 10px;font-size:12.5px;line-height:1.35;display:block;cursor:pointer;transition:all .15s}
.blk:hover{filter:brightness(.97)}
.blk__t{font-size:11.5px;opacity:.7}
.blk--g{background:var(--sage);color:var(--sage-text)}
.blk--t{background:var(--sand);color:var(--sand-text)}
.blk--n{background:var(--tan);color:var(--ink)}
.blk--d{background:rgba(28,31,23,.06);color:var(--muted);text-decoration:line-through}
.week-col--today .blk--d{background:rgba(233,227,214,.08);color:rgba(233,227,214,.5)}
.week-empty{font-size:12px;color:var(--faint);padding:10px 0}
.legend{display:flex;gap:18px;flex-wrap:wrap;font-size:11.5px;color:var(--muted);margin-top:20px;align-items:center}
.legend i{width:11px;height:11px;border-radius:3px;display:inline-block;margin-right:7px;vertical-align:-1px}

/* ---------------------------------------------------- availability */
.avail-row{display:grid;grid-template-columns:112px 44px 1fr 1fr 90px auto;gap:16px;align-items:center;padding:14px 16px;border-radius:12px;border:1px solid var(--hairline);background:var(--paper);margin-bottom:8px}
.avail-row.is-off{background:transparent;border-style:dashed;color:var(--muted)}
.avail-row__day{font-size:14.5px;color:var(--ink)}
.avail-row.is-off .avail-row__day{color:var(--muted)}
.avail-row__span{font-family:var(--serif);font-size:20px;color:var(--ink)}
.avail-row.is-off select{opacity:.4;pointer-events:none}
.switch{width:44px;height:24px;border-radius:100px;background:rgba(28,31,23,.14);position:relative;cursor:pointer;border:0;padding:0;transition:background .15s;flex:none}
.switch::after{content:'';position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:50%;background:#fff;transition:left .15s}
.switch.is-on{background:var(--olive)}
.switch.is-on::after{left:23px}
/* Driven straight off the checkbox: the label toggles the input, the input
   paints the switch. Nothing can set one without the other. */
input:checked + .switch{background:var(--olive)}
input:checked + .switch::after{left:23px}
.presets{display:flex;gap:6px;justify-content:flex-end;flex-wrap:wrap}
.preset{font-size:11px;padding:6px 11px;border-radius:100px;border:1px solid var(--hairline-strong);background:transparent;cursor:pointer;color:#4A4E40}
.preset:hover{background:rgba(28,31,23,.05)}

/* ---------------------------------------------------- admin */
.metrics{display:flex;border:1px solid var(--hairline);border-radius:16px;background:var(--paper);overflow:hidden;margin-top:32px}
.metric{flex:1;padding:24px 26px;border-right:1px solid var(--hairline);min-width:0}
.metric:last-child{border-right:0}
.metric__n{font-family:var(--serif);font-size:46px;line-height:1;color:var(--ink)}
.metric__n--danger{color:var(--danger)}
.metric__l{font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--tan-deep);margin-top:8px}
.floor-row{display:flex;align-items:center;gap:14px;padding:14px 0;border-bottom:1px solid var(--hairline)}
.floor-row:last-child{border-bottom:0}
.floor-row.is-leave{opacity:.45}
.bar{height:8px;border-radius:100px;background:rgba(28,31,23,.08);overflow:hidden;flex:1;min-width:60px}
.bar > i{display:block;height:100%;background:var(--olive);border-radius:100px}
.needs-line{display:flex;gap:10px;padding:12px 0;border-bottom:1px solid var(--hairline-dark);font-size:14px;line-height:1.5}
.needs-line:last-child{border-bottom:0}
.needs-line a{color:var(--tan)}
.chart{display:flex;align-items:flex-end;gap:10px;height:130px;margin-top:20px}
.chart .col{flex:1;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;gap:8px;height:100%}
.chart .col > i{display:block;width:100%;background:rgba(28,31,23,.12);border-radius:6px 6px 0 0}
.chart .col.is-today > i{background:var(--olive)}
.chart .col.is-next > i{background:rgba(98,102,87,.35)}
.chart .col span{font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}

/* ---------------------------------------------------- calendar */
.seg{display:inline-flex;background:var(--paper);border:1px solid var(--hairline);border-radius:100px;padding:4px}
.seg a{padding:9px 20px;border-radius:100px;font-size:11.5px;letter-spacing:.16em;text-transform:uppercase;color:#4A4E40}
.seg a.is-on{background:var(--ink);color:var(--cream)}
.cal-day{display:grid;gap:0;margin-top:26px;border:1px solid var(--hairline);border-radius:16px;background:var(--paper);overflow:hidden}
.cal-day__head{display:grid;border-bottom:1px solid var(--hairline)}
.cal-day__col-head{padding:14px 12px;display:flex;align-items:center;gap:10px;border-left:1px solid var(--hairline);font-size:13.5px}
.cal-day__col-head.is-leave{opacity:.45}
.cal-body{display:grid;position:relative}
.cal-rail{border-right:1px solid var(--hairline)}
.cal-rail__h{height:66px;padding:4px 10px;text-align:right;font-size:11.5px;color:var(--muted);border-bottom:1px solid var(--hairline)}
.cal-col{position:relative;border-left:1px solid var(--hairline)}
.cal-col__grid{position:absolute;inset:0}
.cal-col__grid i{display:block;height:66px;border-bottom:1px solid var(--hairline)}
.cal-blk{position:absolute;left:6px;right:6px;border-radius:10px;padding:7px 10px;font-size:12px;line-height:1.3;overflow:hidden;cursor:pointer}
.cal-blk--g{background:var(--sage);color:var(--sage-text)}
.cal-blk--t{background:var(--sand);color:var(--sand-text)}
.cal-blk--n{background:var(--ink);color:var(--cream)}
.cal-blk--n .cal-blk__t{color:var(--tan)}
.cal-blk--d{background:rgba(28,31,23,.05);color:var(--muted);text-decoration:line-through}
.cal-blk__t{font-size:11px;opacity:.75}
.cal-blk__one{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cal-blk[draggable=true]{cursor:grab}
.cal-blk[draggable=true]:active{cursor:grabbing}
.cal-blk--free{
  background:transparent;border:1px dashed rgba(28,31,23,.28);color:var(--muted);
  display:grid;place-items:center;font-size:11.5px;
}
.cal-blk--free:hover{border-color:var(--ink);color:var(--ink);background:rgba(28,31,23,.03)}
.cal-col.is-drop{background:rgba(178,149,112,.12);outline:2px dashed var(--tan);outline-offset:-2px}
.cal-leave{position:absolute;inset:0;background:repeating-linear-gradient(135deg,rgba(28,31,23,.05) 0 8px,transparent 8px 16px);display:grid;place-items:center;font-size:12px;color:var(--muted)}
.month{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:8px;margin-top:26px}
.month__dow{font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--tan-deep);padding-bottom:4px}
.mcell{position:relative;background:var(--paper);border:1px solid var(--hairline);border-radius:12px;padding:12px 12px 10px;min-height:104px;display:flex;flex-direction:column;color:var(--ink)}
/* Same olive tick as the booking screen: this day has something in it. */
.mcell__tick{
  position:absolute;top:9px;right:9px;width:17px;height:17px;
  border-radius:50%;background:var(--olive);color:#fff;
  font-size:10px;line-height:1;display:grid;place-items:center;pointer-events:none;
}
.mcell--today .mcell__tick{background:var(--tan);color:var(--ink)}
.mcell--out .mcell__tick{opacity:.6}
.mcell:hover{border-color:rgba(28,31,23,.28)}
.mcell__n{font-family:var(--serif);font-size:22px;line-height:1}
.mcell__c{font-size:11.5px;color:var(--muted);margin-top:4px}
.mcell--out{opacity:.4}
.mcell--today{background:var(--ink);color:var(--cream);border-color:var(--ink)}
.mcell--today .mcell__c{color:rgba(233,227,214,.6)}
.mcell--closed{border-style:dashed;background:transparent}
.mcell__bar{height:6px;border-radius:100px;background:var(--olive);margin-top:auto}
.mcell--today .mcell__bar{background:var(--tan)}

/* ---------------------------------------------------- misc */
.token-list{display:flex;flex-direction:column;gap:12px}
.line-item{display:flex;justify-content:space-between;gap:14px;font-size:14px}
.x-btn{width:26px;height:26px;border-radius:50%;border:1px solid rgba(158,91,75,.3);background:transparent;color:var(--danger);cursor:pointer;display:grid;place-items:center;font-size:13px;line-height:1;flex:none}
.x-btn:hover{background:rgba(158,91,75,.12)}
.flash{padding:12px 18px;border-radius:100px;font-size:12.5px;display:inline-block;margin-bottom:18px}
.flash--ok{background:var(--sage);color:var(--sage-text)}
.flash--err{background:rgba(158,91,75,.14);color:var(--danger)}
.empty{border:1px dashed rgba(28,31,23,.22);border-radius:14px;padding:34px;text-align:center;color:var(--muted)}
.two-col{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:30px;align-items:start}
.two-col--wide{grid-template-columns:1.4fr 1fr;gap:22px}

@media (max-width:1100px){
  .book-grid,.two-col,.two-col--wide{grid-template-columns:minmax(0,1fr)}
  .book-aside{position:static}
  .week{grid-template-columns:repeat(2,minmax(0,1fr))}
  .metrics{flex-wrap:wrap}
  .metric{flex:1 1 40%;border-bottom:1px solid var(--hairline)}
}
@media (max-width:760px){
  .page,.page--wide{padding:28px 20px 70px}
  .site-head,.staff-head,.viewswitch{padding-left:20px;padding-right:20px}
  /* Labels used to fight the brand for width and lose — "Salty Coconut" broke
     onto two lines and sat behind the pills. Icons carry the header on a phone
     instead: hide every label, drop the number (nowhere clean to put it next
     to icon-only buttons), one row, logo left, icons right. */
  .site-head{flex-wrap:nowrap}
  .site-head__brand{white-space:nowrap}
  .site-head .lbl{display:none}
  .site-head .btn,.site-head .head-link{padding:10px 12px;gap:0}
  .site-head__tel{display:none}
  .h-page,.h-xl{font-size:40px}
  .week{grid-template-columns:minmax(0,1fr)}
  .avail-row{grid-template-columns:1fr 44px;gap:10px}
  .avail-row .presets{grid-column:1/-1;justify-content:flex-start}
  .site-nav{display:none}
  .tl-row{grid-template-columns:64px minmax(0,1fr);gap:12px}
  .tl-time,.tl-row--next .tl-time{font-size:24px}
  .btn{padding:14px 20px}
  .metric{flex:1 1 100%}
  .stats{gap:22px 30px}
  .stat__n{font-size:32px}
  /* On the phone the next appointment is one big Complete, with SMS beside it. */
  .appt--next .appt-actions{display:flex;gap:8px}
  .appt--next .appt-actions form:first-child{flex:1 1 100%;order:-1}
  .appt--next .appt-actions .js-primary{width:100%}
  .appt--next .appt-actions > .btn,
  .appt--next .appt-actions > form:not(:first-child) .btn{flex:1 1 auto}
}

/* ---------------------------------------------------------------- busy state
   A form that talks to an SMTP server can sit for a couple of seconds. Without
   a spinner the button just looks dead, and people click it again. */
.spin{display:inline-block;width:13px;height:13px;margin-right:9px;vertical-align:-2px;
  border:2px solid currentColor;border-right-color:transparent;border-radius:50%;
  animation:sc-spin .62s linear infinite;opacity:.8}
@keyframes sc-spin{to{transform:rotate(360deg)}}
.btn[disabled]{opacity:.85}
.btn[aria-busy="true"]{cursor:progress}
@media (prefers-reduced-motion:reduce){.spin{animation-duration:2s}}

/* ------------------------------------------------------- prices page basket
   The prices list was read-only, which made it a dead end. Rows can be added
   now, and a tray rides the bottom carrying the basket to the booking form. */
.price-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:13px 0}
.addbtn{
  flex:none;border:1px solid rgba(28,31,23,.22);background:#fff;color:var(--ink);
  border-radius:999px;padding:7px 15px;font-size:11.5px;letter-spacing:.1em;
  text-transform:uppercase;cursor:pointer;transition:background .15s,color .15s,border-color .15s;
}
.addbtn:hover{border-color:var(--ink)}
.addbtn:focus-visible{outline:2px solid var(--tan);outline-offset:2px}
.addbtn.is-on{background:var(--ink);color:var(--cream);border-color:var(--ink)}

.picktray{
  position:fixed;left:0;right:0;bottom:0;z-index:30;
  background:var(--ink);color:var(--cream);border-top:1px solid var(--hairline-dark);
  padding:14px 0;padding-bottom:calc(14px + env(safe-area-inset-bottom));
  box-shadow:0 -12px 34px rgba(28,31,23,.18);
}
/* 1080 wide with 64px gutters — the same box the prices grid sits in, so the
   tray's text lines up with the columns above it instead of floating left. */
.picktray__inner{
  max-width:1080px;margin-inline:auto;padding-inline:64px;display:flex;align-items:center;
  justify-content:space-between;gap:18px;flex-wrap:wrap;
}
.picktray__count{
  font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:rgba(233,227,214,.65);
}
.picktray__names{
  font-family:var(--serif);font-size:19px;margin-top:5px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:52ch;
}
.picktray .btn-link{color:rgba(233,227,214,.7);text-decoration-color:rgba(233,227,214,.35)}
.picktray .btn-link:hover{color:var(--cream);text-decoration-color:var(--cream)}
/* keep the tray off the last row of the page */
body.has-tray{padding-bottom:104px}

@media (max-width:760px){
  .picktray__inner{padding-inline:20px}   /* matches the page gutters below 760 */
}
@media (max-width:620px){
  .picktray__inner{gap:12px}
  .picktray__names{font-size:16px;max-width:100%}
  .picktray__inner > .row{width:100%;justify-content:space-between}
  .picktray__inner > .row .btn{flex:1;text-align:center}
}

/* --------------------------------------------------- category delete
   The "move to" control only matters while deleting, so it lives inside a
   details panel and stays out of the row until it is needed. */
.cat-del{position:relative}
.cat-del > summary{
  cursor:pointer;list-style:none;display:inline-flex;align-items:center;justify-content:center;
}
/* Chrome draws its own triangle through ::marker, Safari through the -webkit one. */
.cat-del > summary::-webkit-details-marker{display:none}
.cat-del > summary::marker{content:""}
/* The global disclosure chevron belongs on section headings, not on a button. */
.cat-del > summary::before{display:none}
.cat-del[open] > summary{background:rgba(28,31,23,.06);border-color:var(--ink)}
/* Floated over the row rather than pushed into it, so opening one does not
   shove the other categories around. */
.cat-del__body{
  position:absolute;right:0;top:calc(100% + 8px);z-index:6;width:max-content;max-width:min(90vw,340px);
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  background:var(--paper);border:1px solid var(--hairline-strong);border-radius:14px;padding:14px 16px;
  box-shadow:0 18px 40px rgba(28,31,23,.16);
}
.cat-del__body .field{min-width:190px}
@media (max-width:900px){
  .cat-del__body{position:static;box-shadow:none;margin-top:10px;max-width:100%}
}

/* --------------------------------------------------- message log
   Every email and text a booking produced. A skip is not a failure — the
   rules said no — so it gets its own colour rather than sitting in red. */
.msg-log{margin-top:14px;display:flex;flex-direction:column;gap:2px}
.msg{display:flex;gap:12px;align-items:flex-start;padding:10px 0;border-bottom:1px solid var(--hairline)}
.msg:last-child{border-bottom:0}
.msg__dot{width:8px;height:8px;border-radius:50%;flex:none;margin-top:7px}
.msg__dot--sent{background:var(--sage-text)}
.msg__dot--skip{background:var(--tan)}
.msg__dot--fail{background:var(--danger)}
.msg__head{display:block;font-size:13.5px;color:var(--ink);text-transform:capitalize}
.msg__meta{display:block;font-size:12px;color:var(--muted);margin-top:2px}
.msg__why{display:block;font-size:12px;color:var(--tan-deep);margin-top:3px}

/* A block whose switches cannot matter right now — the master above it is on.
   Faded and inert, but still readable so the settings can be seen. */
.is-muted{opacity:.4;pointer-events:none}

/* --------------------------------------------------- legal pages
   Privacy and terms. One narrow column of prose: these are read, not
   skimmed for a button, so measure and line-height matter more than
   anything else on the page. */
.legal{max-width:68ch;margin:0 auto}
.legal h2{font-family:var(--serif);font-weight:400;font-size:26px;line-height:1.2;color:var(--ink);margin:42px 0 0}
.legal h3{font-size:15px;font-weight:600;color:var(--ink);margin:26px 0 0}
.legal p,.legal li{font-size:15.5px;line-height:1.7;color:#4A4E40}
.legal p{margin:12px 0 0}
.legal ul{margin:12px 0 0;padding-left:20px}
.legal li{margin:6px 0 0}
.legal a{color:var(--tan-deep)}
.legal dl{margin:12px 0 0}
.legal dt{font-size:15.5px;font-weight:600;color:var(--ink);margin-top:14px}
.legal dd{font-size:15.5px;line-height:1.7;color:#4A4E40;margin:2px 0 0}
.legal__updated{font-size:13px;color:var(--muted);margin-top:18px}

/* --------------------------------------------------- site footer
   The customer pages had nowhere to put the things nobody looks for until
   they need them: the address, and what we do with a mobile number. */
.site-foot{border-top:1px solid var(--hairline);margin-top:72px;padding:26px 28px 40px;
  display:flex;flex-wrap:wrap;gap:10px 26px;align-items:baseline;justify-content:center}
.site-foot a,.site-foot span{font-size:13px;color:var(--muted);text-decoration:none}
.site-foot a:hover{color:var(--tan-deep)}
