/* ==========================================================================
   yakoen.com — house stylesheet
   Ramp generated with: node ~/.claude/skills/website-build/scripts/ramp.mjs 186 clear
   Nothing floats: separation is a hairline, never a shadow.
   ========================================================================== */

:root {
  /* --- ramp — hue 186 (Koen teal), tint clear --- */
  --r0:  #0f1415;
  --r1:  #1b2628;
  --r2:  #283c3e;
  --r3:  #38585c;
  --r4:  #497479;
  --r5:  #5c9399;
  --r6:  #79a9af;
  --r7:  #99bec2;
  --r8:  #bcd5d7;
  --r9:  #cfe1e3;
  --r10: #dfebec;

  /* --- semantic roles: style from these, not the indices above --- */
  --page-bg:        var(--r10);
  --surface:        var(--r9);
  --surface-alt:    var(--r8);
  --border:         var(--r7);   /* decorative hairlines only */
  --border-strong:  var(--r4);   /* interactive controls + focus — 3:1 */
  --text-disabled:  var(--r6);
  --text-secondary: var(--r4);   /* large text / icons only */
  --text-muted:     var(--r3);   /* body-size secondary text — passes 4.5:1 */
  --text-primary:   var(--r1);
  --accent:         var(--r3);
  --accent-strong:  var(--r2);
  --on-accent:      var(--r10);

  /* --- functional: the only colours allowed to break the mono rule --- */
  --negative: #a2543d;
  --warning:  #b08334;
  --positive: #3f6b52;

  /* --- structural tokens: identical in every app and site --- */
  --radius:   8px;
  --hairline: 1px;
  --s1:  4px;
  --s2:  8px;
  --s3: 12px;
  --s4: 16px;
  --s6: 24px;
  --s8: 32px;
  --s12: 48px;
  --s16: 64px;
  --motion: 220ms;
  --curve: cubic-bezier(0.215, 0.61, 0.355, 1); /* ease-out-cubic */

  /* --- type: system stacks, nothing fetched from a CDN --- */
  --font-display: 'Iowan Old Style', 'Palatino Linotype', Palatino, Georgia, 'Times New Roman', serif;
  --font-body: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
  --font-mono: ui-monospace, 'Cascadia Code', Consolas, monospace;

  --measure: 62ch;
  --content: 1120px;
}

/* --------------------------------------------------------------- reset -- */

*, *::before, *::after { box-sizing: border-box; }
* { margin: 0; }

html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; scroll-padding-top: var(--s6); }

body {
  background: var(--page-bg);
  color: var(--text-primary);
  font-family: var(--font-body);
  font-size: 1rem;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  min-height: 100dvh;
}

img, picture, svg, video { display: block; max-width: 100%; height: auto; }
input, button, textarea, select { font: inherit; color: inherit; }
ul[role='list'], ol[role='list'] { list-style: none; padding: 0; }

/* ---------------------------------------------------------------- type -- */

h1, h2, h3 {
  font-family: var(--font-display);
  font-weight: 600;
  line-height: 1.15;
  letter-spacing: -0.01em;
  text-wrap: balance;
}

h1 { font-size: clamp(2.25rem, 1.4rem + 3.6vw, 4rem); }
h2 { font-size: clamp(1.5rem, 1.2rem + 1.5vw, 2.25rem); }
h3 { font-size: 1.25rem; }

p { max-width: var(--measure); text-wrap: pretty; }
p + p { margin-top: var(--s3); }

small, .caption {
  font-size: 0.875rem;
  color: var(--text-muted);
}

a {
  color: var(--accent);
  text-decoration-thickness: var(--hairline);
  text-underline-offset: 0.2em;
  transition: color var(--motion) var(--curve);
}
a:hover { color: var(--accent-strong); }

.eyebrow {
  font-size: 0.875rem;
  font-weight: 500;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--text-muted);
}

.lede { font-size: 1.125rem; }

/* --------------------------------------------------------------- focus -- */

:focus-visible {
  outline: 2px solid var(--border-strong);
  outline-offset: 2px;
  border-radius: calc(var(--radius) / 2);
}

.skip {
  position: absolute;
  left: var(--s4);
  top: -100px;
  padding: var(--s2) var(--s4);
  background: var(--accent);
  color: var(--on-accent);
  border-radius: var(--radius);
  z-index: 30;
  transition: top var(--motion) var(--curve);
}
.skip:focus { top: var(--s4); }

/* ------------------------------------------------------------- layout --- */

.page {
  max-width: var(--content);
  margin-inline: auto;
  padding-inline: var(--s4);
}

.section { padding-block: var(--s12); }
.section + .section { border-top: var(--hairline) solid var(--border); }

.stack > * + * { margin-top: var(--s4); }
.stack-tight > * + * { margin-top: var(--s2); }

.row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s3);
}

/* ------------------------------------------------------------- surface -- */

.card {
  background: var(--surface);
  border: var(--hairline) solid var(--border);
  border-radius: var(--radius);
  padding: var(--s4);
}

hr, .divider {
  border: 0;
  border-top: var(--hairline) solid var(--border);
  margin-block: var(--s4);
}

/* ------------------------------------------------------------- buttons -- */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--s2);
  min-height: 44px;
  padding: var(--s2) var(--s4);
  border: var(--hairline) solid transparent;
  border-radius: var(--radius);
  background: var(--accent);
  color: var(--on-accent);
  font-weight: 500;
  text-decoration: none;
  cursor: pointer;
  transition: background var(--motion) var(--curve),
              color var(--motion) var(--curve),
              border-color var(--motion) var(--curve);
}
.btn:hover { background: var(--accent-strong); color: var(--on-accent); }

.btn-outline {
  background: transparent;
  color: var(--accent-strong);
  border-color: var(--border-strong);
}
.btn-outline:hover { background: var(--surface-alt); color: var(--accent-strong); }

.btn-quiet { background: transparent; color: var(--accent-strong); border-color: var(--border-strong); }
.btn-quiet:hover { background: var(--surface-alt); color: var(--accent-strong); }
.btn-quiet[aria-expanded='true'] { background: var(--surface-alt); }

/* ==========================================================================
   Navigation — three size classes, each laid out natively.
   compact  < 600px   bottom bar, single column
   medium   600–1023  icon rail + second pane
   expanded >= 1024   extended rail with labels + multi-pane
   ========================================================================== */

.shell { display: grid; min-height: 100dvh; }

.nav {
  position: fixed;
  inset: auto 0 0 0;
  display: flex;
  justify-content: space-around;
  align-items: stretch;
  background: var(--page-bg);
  border-top: var(--hairline) solid var(--border);
  padding: var(--s1);
  z-index: 10;
}
.nav a {
  display: grid;
  justify-items: center;
  align-content: center;
  gap: var(--s1);
  padding: var(--s2);
  border-radius: var(--radius);
  color: var(--text-muted);
  text-decoration: none;
  font-size: 0.75rem;
  font-weight: 500;
  min-width: 44px;
  min-height: 44px;
  transition: background var(--motion) var(--curve), color var(--motion) var(--curve);
}
.nav a:hover { color: var(--text-primary); }
.nav a[aria-current='page'] { background: var(--surface-alt); color: var(--text-primary); }
.nav svg { width: 24px; height: 24px; stroke: currentColor; fill: none; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }

.nav .brand { display: none; }

.shell > main { padding-bottom: 80px; } /* clear the bottom bar */

@media (min-width: 600px) {
  .shell { grid-template-columns: 88px 1fr; }
  .shell > main { padding-bottom: 0; min-width: 0; }

  .nav {
    position: sticky;
    top: 0;
    inset: auto;
    height: 100dvh;
    flex-direction: column;
    justify-content: flex-start;
    gap: var(--s1);
    border-top: 0;
    border-right: var(--hairline) solid var(--border);
    padding: var(--s3) var(--s2);
  }
  .nav a { width: 100%; }
  .nav .brand {
    display: grid;
    font-family: var(--font-display);
    font-size: 1.125rem;
    font-weight: 600;
    color: var(--text-primary);
    margin-bottom: var(--s3);
  }
  .nav .brand[aria-current='page'] { background: transparent; }
}

@media (min-width: 1024px) {
  .shell { grid-template-columns: 224px 1fr; }

  .nav a {
    grid-auto-flow: column;
    justify-items: start;
    justify-content: start;
    gap: var(--s3);
    padding: var(--s3);
    font-size: 0.9375rem;
  }
  .nav .brand { font-size: 1.375rem; padding-inline: var(--s3); }
}

/* ---------------------------------------------------------------- hero -- */

.hero { padding-block: var(--s12) var(--s8); }
.hero h1 { max-width: 22ch; margin-top: var(--s3); }
.hero .lede { margin-top: var(--s6); }
.hero .row { margin-top: var(--s6); }

/* Signature element — the ramp itself, as a strip. */
.ramp-strip {
  display: grid;
  grid-template-columns: repeat(11, 1fr);
  height: 40px;
  max-width: 560px;
  margin-top: var(--s8);
  border: var(--hairline) solid var(--border);
  border-radius: var(--radius);
  overflow: hidden;
}
.ramp-strip span { display: block; }
.ramp-strip span + span { border-left: var(--hairline) solid var(--border); }
.ramp-strip span:nth-child(1)  { background: var(--r0); }
.ramp-strip span:nth-child(2)  { background: var(--r1); }
.ramp-strip span:nth-child(3)  { background: var(--r2); }
.ramp-strip span:nth-child(4)  { background: var(--r3); }
.ramp-strip span:nth-child(5)  { background: var(--r4); }
.ramp-strip span:nth-child(6)  { background: var(--r5); }
.ramp-strip span:nth-child(7)  { background: var(--r6); }
.ramp-strip span:nth-child(8)  { background: var(--r7); }
.ramp-strip span:nth-child(9)  { background: var(--r8); }
.ramp-strip span:nth-child(10) { background: var(--r9); }
.ramp-strip span:nth-child(11) { background: var(--r10); }
.ramp-strip + .caption { margin-top: var(--s2); }

@media (min-width: 1024px) {
  .hero { padding-block: var(--s16) var(--s12); }
}

/* ---------------------------------------------------------------- apps -- */

.section-head { max-width: var(--measure); }
.section-head p { margin-top: var(--s3); }

.app-grid {
  display: grid;
  gap: var(--s4);
  margin-top: var(--s6);
}

.app {
  display: grid;
  grid-template-columns: auto 1fr;
  grid-template-areas:
    'mark title'
    'mark status'
    'body body'
    'action action';
  column-gap: var(--s3);
  align-items: start;
}
.app .mark { grid-area: mark; }
.app h3 { grid-area: title; align-self: end; }
.app .status { grid-area: status; margin-top: var(--s1); }
.app > p:not(.status) { grid-area: body; margin-top: var(--s3); }
.app .btn { grid-area: action; justify-self: start; margin-top: var(--s4); }

/* The mark carries each app's own hue — colour as identity, not decoration. */
.mark {
  display: grid;
  place-items: center;
  width: 48px;
  height: 48px;
  border-radius: var(--radius);
  background: var(--app-accent, var(--accent));
  color: var(--on-accent);
  font-family: var(--font-display);
  font-size: 1.5rem;
  font-weight: 600;
  line-height: 1;
}

.status { font-size: 0.875rem; color: var(--text-muted); }

@media (min-width: 1024px) {
  .app-grid { grid-template-columns: 1fr 1fr; }
}

/* ==========================================================================
   Side panel — app details. Overlay on compact, inline from medium up.
   ========================================================================== */

.with-panel { display: grid; }

.panel {
  background: var(--surface);
  border: var(--hairline) solid var(--border);
  border-radius: var(--radius);
  padding: var(--s4);
}
.panel-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s3);
  padding-bottom: var(--s3);
  border-bottom: var(--hairline) solid var(--border);
}
.panel-head h3 { font-size: 1rem; font-family: var(--font-body); font-weight: 500; color: var(--text-muted); }
.panel-close { display: none; }
.panel-empty { padding-block: var(--s6); color: var(--text-muted); }
.panel article { padding-top: var(--s4); }
.panel article h3 { font-size: 1.5rem; }
.panel article .status { margin-top: var(--s1); }
.panel article p:not(.status) { margin-top: var(--s3); }
.panel dl {
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: var(--s1) var(--s4);
  margin-top: var(--s4);
  padding-top: var(--s4);
  border-top: var(--hairline) solid var(--border);
  font-size: 0.9375rem;
}
.panel dt { color: var(--text-muted); }
.panel dd { margin: 0; }
.panel .row { margin-top: var(--s4); }

/* compact: slides in over the content. Scoped to `.js` so that without
   JavaScript the panel simply stays inline (see the no-js block below). */
@media (max-width: 599px) {
  .js .panel {
    position: fixed;
    inset: 0 0 0 auto;
    width: min(92vw, 360px);
    border-radius: 0;
    border-width: 0 0 0 var(--hairline);
    transform: translateX(100%);
    transition: transform var(--motion) var(--curve);
    overflow-y: auto;
    z-index: 20;
  }
  .js .panel[data-open='true'] { transform: translateX(0); }
  .js .panel-close { display: inline-flex; }

  .js .panel-scrim {
    position: fixed;
    inset: 0;
    background: color-mix(in srgb, var(--r0) 45%, transparent);
    opacity: 0;
    pointer-events: none;
    transition: opacity var(--motion) var(--curve);
    z-index: 15;
  }
  .js .panel-scrim[data-open='true'] { opacity: 1; pointer-events: auto; }
}

/* medium and up: inline, main content stays visible */
@media (min-width: 600px) {
  .with-panel { grid-template-columns: minmax(0, 1fr) minmax(264px, 320px); gap: var(--s6); align-items: start; }
  .panel { position: sticky; top: var(--s4); }
  .panel-scrim { display: none; }
}

/* No JavaScript: show every app's details inline instead of behind a button. */
html:not(.js) .panel { margin-top: var(--s6); }
html:not(.js) .panel article[hidden] { display: block; }
html:not(.js) .panel article + article { border-top: var(--hairline) solid var(--border); margin-top: var(--s4); }
html:not(.js) .panel-empty, html:not(.js) .panel-close, html:not(.js) .app .btn, html:not(.js) .panel-scrim { display: none; }

/* -------------------------------------------------------- businesses --- */

.two-col { display: grid; gap: var(--s6); margin-top: var(--s6); }
@media (min-width: 1024px) { .two-col { grid-template-columns: 1fr 1fr; } }

.principles { display: grid; margin-top: var(--s6); }
.principles li { padding-block: var(--s4); border-top: var(--hairline) solid var(--border); }
.principles li:last-child { border-bottom: var(--hairline) solid var(--border); }
.principles strong { display: block; font-family: var(--font-display); font-size: 1.25rem; font-weight: 600; margin-bottom: var(--s1); }
@media (min-width: 600px) {
  .principles { grid-template-columns: 1fr 1fr; gap: 0 var(--s6); }
  .principles li:nth-last-child(2) { border-bottom: var(--hairline) solid var(--border); }
}

/* ------------------------------------------------------------- contact -- */

.contact-card { margin-top: var(--s6); display: grid; gap: var(--s4); }
.contact-card .email { font-size: 1.25rem; word-break: break-all; }
@media (min-width: 600px) {
  .contact-card { grid-template-columns: 1fr auto; align-items: center; }
}

footer.site-foot {
  padding-block: var(--s6);
  border-top: var(--hairline) solid var(--border);
  font-size: 0.875rem;
  color: var(--text-muted);
}
footer.site-foot .row { justify-content: space-between; }

/* ------------------------------------------------------- reduced motion -- */

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation: none !important;
    transition: none !important;
  }
}

/* ------------------------------------------------------------ utilities -- */

.visually-hidden {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}
