/* 03-generic/_reset.css — one small modern reset + the @font-face slot.
   (Self-host upgrade: add @font-face { font-family:"JetBrains Mono"; src:url("../fonts/…woff2") } here.) */
*, *::before, *::after { box-sizing: border-box; }
* { margin: 0; }
/* The HTML `hidden` attribute must win over component display rules (e.g. .o-stack's
   display:flex), so JS toggling `el.hidden` actually hides tab panels and dropdowns. */
[hidden] { display: none !important; }
html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
body {
  min-height: 100svh;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}
img, picture, video, canvas, svg { display: block; max-width: 100%; height: auto; }
input, button, textarea, select { font: inherit; color: inherit; }
p, h1, h2, h3, h4, h5, h6 { overflow-wrap: break-word; text-wrap: pretty; }
h1, h2, h3, h4 { text-wrap: balance; }
:target { scroll-margin-top: calc(var(--bar-h) + var(--space-lg)); }

/* the cursor-blink keyframe is owned here, no framework dependency */
@keyframes loom-blink { 0%, 49% { opacity: 1; } 50%, 100% { opacity: 0; } }
