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 uselight-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
Underprefers-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.