Skip to main content
tally-react ships one stylesheet. Every selector is scoped under .tally, and every color, radius, font and size is a CSS custom property you can override.

Stylesheets

styles.css is required. fonts.css self-hosts Onest and JetBrains Mono through @fontsource-variable/onest and @fontsource-variable/jetbrains-mono. Leave it out and the system font stack takes over. The stylesheet is unlayered, so it survives Tailwind’s preflight and other resets without configuration. With Tailwind v4, import it into a layer when utilities should be able to override Tally classes:

Light and dark

Colors use light-dark() and follow color-scheme. Without a theme prop the grid follows prefers-color-scheme. theme="light" or theme="dark" sets data-theme on the root and forces one scheme.

Tokens

Override tokens on .tally, on a class you pass as className, or on any ancestor.
--tally-selection, --tally-selection-row and --tally-ring are mixed from --tally-accent, so changing the accent recolors selection and focus too.
Compact density sets --tally-row-height and --tally-font-size, and spacious density sets --tally-row-height, on .tally[data-density]. That selector wins over .tally. Override sizes per density with the same selector, such as .tally[data-density='compact'].

State attributes

State is exposed as data attributes for targeted overrides.

Reduced motion

Under prefers-reduced-motion: reduce the stylesheet turns off row transitions, the progress animation, chip and column entrance animations, skeleton shimmer and the detail sheet transition. AI column values appear without the reveal animation. See Custom renderers and editors to change the markup of a cell rather than its styles.