Files
nxdns/admin/src/styles.css
T
mokhtar e656670dd4
Gates / frontend (push) Failing after 1m6s
Gates / package (push) Skipped
Gates / container (push) Skipped
Gates / test (push) Failing after 3m29s
Gates / test-aarch64 (push) Successful in 9m53s
CI / gates (push) Failing after 13m23s
admin: ui polish pass, thirty findings from the emil audit
selected states stop changing font weight, buttons gain a pressed scale and scoped 120ms transitions with a reduced-motion override, every loading and empty state reserves its height, charts measure before first paint, hit targets rise to the 44px enhanced target where layout permits, long domains clamp to two lines on an unpadded inner span, chips and name cells truncate, tabular figures on counts and time columns, a z-index layer scale replaces magic numbers and fixes the dialog-over-confirm tie, history's empty state gains a clear-filters action, page headings balance, font smoothing and color-scheme land on the html reset.
2026-09-01 23:23:07 +02:00

198 lines
4.8 KiB
CSS

/*
* The CSS entry (milestone 23, ruling 1). The StyleX plugin emits the compiled
* atomic rules into their own layers; what is left here is the element reset
* those rules are written against.
*
* The reset is not optional and not cosmetic. Tailwind's preflight used to
* supply it, so every StyleX style in `admin/src` is written assuming border-box
* sizing, no default margins, unstyled lists and form controls that inherit
* their font. Deleting this block does not restore browser defaults — it
* silently changes the meaning of every size and spacing value in the app.
* Rules are limited to what this app renders; it is not a general reset.
*
* The reset lives in its own cascade layer, declared here before StyleX emits
* its own. Layer order is priority order, and unlayered author CSS outranks
* every layer: leaving these rules unlayered silently beat every StyleX rule in
* the app, whatever the selector said.
*/
@layer reset {
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
/*
* This is not a reproduction of Tailwind's default stack, which is gone with
* the package; text metrics drift here, which ruling 7 accepts. The symbol
* families at the end are not decoration: `Select.tsx` renders U+25BE for its
* chevron, and Segoe UI does not carry that glyph, so on Windows the stack
* has to reach a font that does before it falls back to a substitute box.
*/
html {
line-height: 1.5;
-webkit-text-size-adjust: 100%;
/* The tokens carry both schemes; this tells the UA to match its own chrome — form controls, scrollbars. */
color-scheme: light dark;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-family:
system-ui,
-apple-system,
"Segoe UI",
Roboto,
"Helvetica Neue",
Arial,
sans-serif,
"Segoe UI Symbol",
"Noto Sans Symbols 2";
}
/* Headings carry their scale from StyleX, not from the user agent. */
h1,
h2,
h3,
h4,
h5,
h6 {
font-size: inherit;
font-weight: inherit;
}
ul,
ol,
menu {
list-style: none;
}
/* Links opt into colour and underline; the shell's nav wants neither. */
a {
color: inherit;
text-decoration: inherit;
}
code,
kbd,
samp,
pre {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 1em;
}
/* Without this the spinner stretches a number input taller than its row. */
::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
height: auto;
}
/* Firefox draws a red glow on an invalid field; the form shows its own error. */
:-moz-ui-invalid {
box-shadow: none;
}
table {
border-collapse: collapse;
text-indent: 0;
border-color: inherit;
}
/*
* Form controls: inherit type and colour, drop the user-agent chrome, and keep
* `appearance: button` so iOS Safari honours a button's border radius.
*/
button,
input,
select,
optgroup,
textarea {
font: inherit;
letter-spacing: inherit;
color: inherit;
background-color: transparent;
border: 0 solid;
border-radius: 0;
opacity: 1;
}
button,
input[type="button"],
input[type="reset"],
input[type="submit"] {
appearance: button;
}
/* A checkbox keeps its native chrome; the rules above would erase it. */
input[type="checkbox"],
input[type="radio"] {
appearance: auto;
}
/*
* WebKit lays a date/time input out from its own pseudo-elements, and an
* empty one comes out shorter than a filled one without these. The query log
* filters are two `datetime-local` inputs sitting in a row of controls, so
* the height has to hold whether or not a value is set.
*/
::-webkit-date-and-time-value {
min-height: 1lh;
text-align: inherit;
}
::-webkit-datetime-edit {
display: inline-flex;
}
::-webkit-datetime-edit-fields-wrapper {
padding: 0;
}
::-webkit-datetime-edit,
::-webkit-datetime-edit-year-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-minute-field,
::-webkit-datetime-edit-second-field,
::-webkit-datetime-edit-millisecond-field,
::-webkit-datetime-edit-meridiem-field {
padding-block: 0;
}
::placeholder {
opacity: 1;
}
/*
* Safari below 16.4 resolves `color-mix` against the wrong colour here and
* renders the placeholder invisible. The guard admits every engine that
* supports either a non-WebKit feature or one Safari only gained afterwards.
*/
@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {
::placeholder {
color: color-mix(in oklab, currentcolor 50%, transparent);
}
}
/* An inline SVG leaves a baseline gap under a full-width chart. */
svg,
img,
video,
canvas {
display: block;
vertical-align: middle;
}
img,
video {
max-width: 100%;
height: auto;
}
[hidden]:not([hidden="until-found"]) {
display: none !important;
}
}