/* ==========================================================================
   base.css — reset, shell, header, footer, and the shared atoms
   (button / badge / tag / eyebrow / focus / motion / print).
   No colour literals: tokens.css only.
   ========================================================================== */

/* --- reset ---------------------------------------------------------------- */
*{box-sizing:border-box}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
body{
  margin:0;
  font-family:var(--body);
  font-size:15px;
  line-height:1.65;
  color:var(--ink);
  background:var(--canvas);
  -webkit-font-smoothing:antialiased;
}
img,svg,picture{max-width:100%}
img{height:auto}
a{color:inherit;text-decoration:none}
button{font:inherit;cursor:pointer}
h1,h2,h3,h4{font-family:var(--display);color:var(--navy);text-wrap:balance;margin:0}
/* Japanese headings break between phrases (e.g. never "ご / 相談") */
:lang(ja) :is(h1,h2,h3,h4){word-break:auto-phrase}
p{margin:0 0 10px}
ul,ol{margin:0;padding-left:20px}
hr{border:0;border-top:1px solid var(--line);margin:24px 0}
table{border-collapse:collapse;font-variant-numeric:tabular-nums}

/* components set display (e.g. .card{display:flex}), which would otherwise
   beat the UA rule and keep [hidden] elements visible */
[hidden]{display:none !important}

.mono{font-family:var(--mono)}
.visually-hidden{
  position:absolute;width:1px;height:1px;margin:-1px;padding:0;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;
}

/* --- shell ---------------------------------------------------------------- */
.shell{
  max-width:var(--shell-max);
  margin:0 auto;
  background:var(--paper);
  min-height:100vh;
  box-shadow:0 0 0 1px var(--line);
}
.site-main{padding:0 var(--pad-x) 40px}

/* --- header --------------------------------------------------------------- */
.site-header{
  position:sticky;top:0;z-index:30;
  min-height:var(--header-h);
  background:color-mix(in srgb,var(--paper) 92%,transparent);
  backdrop-filter:blur(14px);
  border-bottom:1px solid var(--line);
}
@supports not (background:color-mix(in srgb,red 92%,transparent)){
  .site-header{background:var(--paper)}
}
.nav{
  height:var(--header-h);
  display:flex;align-items:center;gap:30px;
  padding:0 var(--pad-x);
}
.brand{
  font-family:var(--display);font-weight:800;font-size:19px;letter-spacing:-.03em;
  color:var(--navy);display:flex;align-items:center;gap:10px;white-space:nowrap;
}
.brand i{
  width:30px;height:30px;border-radius:9px;
  background:var(--navy);color:var(--paper);
  display:grid;place-items:center;font-style:normal;font-size:12px;letter-spacing:.02em;
  font-family:var(--display);font-weight:800;
}
:root[data-theme="dark"] .brand i{color:var(--canvas)}
@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]) .brand i{color:var(--canvas)}
}
.navlinks{display:flex;gap:26px;font-size:14px;font-weight:500;color:var(--slate)}
.navlinks a{padding:24px 0 21px;border-bottom:3px solid transparent;transition:color var(--t)}
.navlinks a:hover{color:var(--navy)}
.navlinks a.active{color:var(--navy);border-color:var(--blue);font-weight:700}

.lang{margin-left:auto;display:flex;gap:4px;font-family:var(--mono);font-size:11.5px}
.lang button{
  border:0;background:transparent;color:var(--slate);
  padding:5px 9px;border-radius:7px;letter-spacing:.06em;
  transition:background-color var(--t),color var(--t);
}
.lang button:hover{color:var(--navy)}
.lang button[aria-pressed="true"]{background:var(--blue-soft);color:var(--blue);font-weight:600}

/* ≤600px fallback row: the four nav links as a horizontally scrolling strip.
   No hamburger menu (01 §3). Hidden above 600px. */
.navmobile{display:none}

/* --- footer --------------------------------------------------------------- */
.site-footer{
  margin:0 var(--pad-x);
  padding:22px 0 26px;
  border-top:1px solid var(--line);
  color:var(--slate);font-size:12.5px;
}
.footer-inner{display:flex;justify-content:space-between;gap:8px 20px;align-items:baseline;flex-wrap:wrap}
.site-footer .links{display:flex;gap:14px;flex-wrap:wrap;font-family:var(--mono);font-size:11.5px}
.site-footer .links a{transition:color var(--t)}
.site-footer .links a:hover{color:var(--blue)}

/* --- button --------------------------------------------------------------- */
.btn{
  display:inline-flex;align-items:center;gap:8px;
  border:1px solid var(--line);background:var(--paper);color:var(--navy);
  border-radius:var(--r-btn);padding:11px 16px;
  font-family:var(--display);font-weight:700;font-size:14px;line-height:1.2;
  transition:transform var(--t),border-color var(--t),box-shadow var(--t);
}
.btn:hover{border-color:var(--blue);transform:translateY(-1px)}
.btn.primary{background:var(--navy);color:var(--on-navy);border-color:var(--navy)}
.btn.primary:hover{border-color:var(--blue)}
.btn svg{width:15px;height:15px;flex:none}
.btn small{font-family:var(--mono);font-weight:400;font-size:11.5px;color:inherit;opacity:.75}

/* --- badge ---------------------------------------------------------------- */
.badge{
  display:inline-block;font-family:var(--mono);font-size:11px;
  padding:3px 8px;border-radius:var(--r-badge);font-weight:600;letter-spacing:.02em;
  white-space:nowrap;
}
.badge.research{background:var(--blue-soft);color:var(--blue)}
.badge.project{background:var(--tint);color:var(--slate);border:1px solid var(--line)}
.badge.progress{background:var(--warn-soft);color:var(--warn)}
.badge.done{background:var(--ok-soft);color:var(--ok)}
.badge.app{background:var(--teal-soft);color:var(--teal)}
.badge.maintained{background:var(--ok-soft);color:var(--ok)}
.badge.maintained::before{
  content:"";display:inline-block;width:6px;height:6px;border-radius:50%;
  background:currentColor;margin-right:6px;vertical-align:1px;
}

/* --- tag ------------------------------------------------------------------ */
.tag{
  font-family:var(--mono);font-size:11px;padding:4px 8px;
  border-radius:var(--r-badge);background:var(--tint);
  border:1px solid var(--line);color:var(--slate);
}
.tagrow{display:flex;gap:6px;flex-wrap:wrap;margin-top:14px}

/* --- shared inline atoms --------------------------------------------------- */
.eyebrow{
  font-family:var(--mono);font-size:12px;letter-spacing:.1em;text-transform:uppercase;
  color:var(--blue);font-weight:600;margin-bottom:14px;
}
.textlink{color:var(--blue);font-weight:700;font-size:14px;white-space:nowrap}
.textlink:hover{text-decoration:underline}

/* --- focus ---------------------------------------------------------------- */
a:focus-visible,button:focus-visible,[tabindex]:focus-visible{
  outline:2px solid var(--blue);outline-offset:3px;border-radius:var(--r-badge);
}

/* --- anchors -------------------------------------------------------------- */
:target{scroll-margin-top:var(--anchor-offset)}

/* --- breakpoints ---------------------------------------------------------- */
@media (max-width:960px){
  .nav{gap:18px}
  .navlinks{gap:16px}
}
@media (max-width:600px){
  .navlinks{display:none}
  .navmobile{
    display:flex;gap:18px;overflow-x:auto;-webkit-overflow-scrolling:touch;
    padding:0 var(--pad-x) 10px;
    font-family:var(--mono);font-size:12px;color:var(--slate);
    border-bottom:1px solid var(--line);
    background:var(--paper);
    scrollbar-width:none;
  }
  .navmobile::-webkit-scrollbar{display:none}
  .navmobile a{white-space:nowrap;padding:4px 0;border-bottom:2px solid transparent}
  .navmobile a.active{color:var(--navy);font-weight:600;border-color:var(--blue)}
  .footer-inner{flex-direction:column}
}

/* --- motion --------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{
    transition-duration:.001ms !important;
    animation-duration:.001ms !important;
    animation-iteration-count:1 !important;
    scroll-behavior:auto !important;
  }
}

/* --- print ---------------------------------------------------------------- */
@media print{
  .site-header,.navmobile,.site-footer,.lang,.filters,.toc,.pager{display:none !important}
  body{background:none;font-size:11pt}
  .shell{box-shadow:none;max-width:none}
  .site-main{padding:0}
  a{text-decoration:underline}
  .card,.rblock,.detail-section{break-inside:avoid}
}
