Files
docmost/apps/client/src/styles/a11y-overrides.css
T

74 lines
2.7 KiB
CSS

/*
* Accessibility-driven overrides on top of Mantine's default component styles.
* Each rule documents the WCAG criterion it addresses and the measured
* contrast before/after.
*/
/* Mantine's default disabled menu item uses opacity: 0.5 on the active text
* color, which collapses to ~3.94:1 on white — below WCAG AA 4.5:1.
* (WCAG 1.4.3 exempts "inactive" UI components, but the text becomes hard
* to read.) Force opacity back to 1 and use the dimmed color so the item
* still feels subdued vs. active items but is comfortably readable
* (~7.56:1 on white).
*/
.mantine-Menu-item[data-disabled] {
opacity: 1;
color: var(--mantine-color-dimmed);
}
/* Mantine variant="default" inputs ship with --mantine-color-default-border
* = gray.4 (#ced4da), which on white is only 1.49:1 — fails WCAG AA 3:1
* for non-text. Bump to gray.6 (3.32:1) on the input itself rather than
* overriding the variable globally, because the same variable backs Card
* borders, dividers, and other subtle outlines we want to keep airy.
*/
.mantine-Input-input[data-variant="default"] {
border-color: var(--mantine-color-gray-6);
}
/* better contrast for disabled inputs */
.mantine-Input-input:disabled,
.mantine-Input-input[data-disabled] {
opacity: 0.7;
color: var(--mantine-color-dimmed);
-webkit-text-fill-color: var(--mantine-color-dimmed);
}
/* Spotlight's selected action ships as primary-filled blue with white text,
* but our custom action children (gray badge, dimmed snippet, gray icons)
* keep their light-surface colors on it and drop below WCAG AA 4.5:1
* (WCAG 1.4.3). Use a gray selection one step above the gray-0/dark-6
* hover instead - it matches the app's selection styling (we use no blue
* fills) and keeps every child at its already-passing resting contrast.
*/
.mantine-Spotlight-action[data-selected] {
background-color: light-dark(
var(--mantine-color-gray-1),
var(--mantine-color-dark-5)
);
color: var(--mantine-color-text);
--action-description-color: var(--mantine-color-dimmed);
--action-description-opacity: 1;
}
/* Result actions are tab stops (tabIndex restored via ref); give keyboard
* focus the same gray treatment as arrow-key selection so both navigation
* modes read identically (WCAG 2.4.7 focus visible).
*/
.mantine-Spotlight-action:focus-visible {
background-color: light-dark(
var(--mantine-color-gray-1),
var(--mantine-color-dark-5)
);
}
/* The skip-link target main is tabindex="-1", so clicks in readonly content
* focus it and overlays (e.g. the lightbox) return focus to it on close,
* ringing the whole content region. The skip link's purpose is reading
* position, not a visible ring around everything, so suppress the outline.
*/
#main-content:focus,
#main-content:focus-visible {
outline: none;
}