/* The design system's element rules: the reset, the box model, the body,
   headings, links, bold and focus. Every page layout loads this file, after
   palette.css and before parts.css. Emails load no stylesheet: they keep
   their inline CSS.

   The reset is the one the app was drawn on while it still loaded Tailwind
   (its "preflight"), so a part looks the same on every page: no element
   brings a margin, a border, a list mark, an underline or a heading size of
   its own, and a part sets each one it wants. */

*, *::before, *::after { box-sizing: border-box; border: 0 solid var(--line); }
html { line-height: 1.5; -webkit-text-size-adjust: 100%; tab-size: 4; -webkit-tap-highlight-color: transparent; }
body { margin: 0; font-family: var(--font-sans); font-size: var(--text-body); line-height: 1.5; color: var(--ink); background: var(--desk); font-variant-numeric: tabular-nums; }
h1, h2, h3, h4, h5, h6 { font-size: inherit; font-weight: inherit; }
blockquote, dl, dd, figure, h1, h2, h3, h4, h5, h6, hr, p, pre { margin: 0; }
hr { height: 0; color: inherit; border-top-width: 1px; }
a { color: var(--ink); text-decoration: inherit; }
b, strong { font-weight: 600; }
code, kbd, samp, pre { font-family: var(--font-mono); font-size: 1em; }
small { font-size: 80%; }
sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
sub { bottom: -0.25em; }
sup { top: -0.5em; }
table { text-indent: 0; border-color: inherit; border-collapse: collapse; }
button, input, optgroup, select, textarea { margin: 0; padding: 0; font: inherit; letter-spacing: inherit; color: inherit; }
button, select { text-transform: none; }
button, input:where([type=button]), input:where([type=reset]), input:where([type=submit]) { -webkit-appearance: button; background-color: transparent; background-image: none; }
button, [role=button] { cursor: pointer; }
:disabled { cursor: default; }
input::placeholder, textarea::placeholder { color: var(--edge); opacity: 1; }
textarea { resize: vertical; }
progress { vertical-align: baseline; }
[type=search] { -webkit-appearance: textfield; outline-offset: -2px; }
::-webkit-search-decoration { -webkit-appearance: none; }
::-webkit-file-upload-button { -webkit-appearance: button; font: inherit; }
summary { display: list-item; }
fieldset, legend { margin: 0; padding: 0; }
menu, ol, ul { list-style: none; margin: 0; padding: 0; }
dialog { padding: 0; }
img, svg, video, canvas, audio, iframe, embed, object { display: block; vertical-align: middle; }
img, video { max-width: 100%; height: auto; }
[hidden]:where(:not([hidden=until-found])) { display: none; }
:focus-visible { outline: 2px solid var(--accent-frame); outline-offset: 2px; }

/* Body text wraps "pretty", so a single word never stays alone on the last
   line (Lee, 2026-10-01). Only the wrapping style is set, never the wrapping
   mode, so a thing that must stay on one line still does. Headings ask for
   balance where they want it; inputs, code and table cells are left alone. */
p, li, dd, blockquote, figcaption { text-wrap-style: pretty; }

/* IBM Plex Mono, self-hosted (public/fonts): the charts' axis words
   (custom/echarts_setup.js, Ui::Core::Charts::GaugeChart) and the marketing
   home page's drawings still name it. */
@font-face { font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 400; font-display: swap; src: url("/fonts/IBMPlexMono-Regular.woff2") format('woff2'); }
@font-face { font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 500; font-display: swap; src: url("/fonts/IBMPlexMono-Medium.woff2") format('woff2'); }
@font-face { font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 600; font-display: swap; src: url("/fonts/IBMPlexMono-SemiBold.woff2") format('woff2'); }
