Skip to content

ThemeProvider & Theming

All components read their visual design from the nearest ThemeProvider in the React tree. Wrap your app (or any subtree) with it.

Basic usage

tsx
import { ThemeProvider } from '@itsmemyk/react-tree-grid'

function App() {
  return (
    <ThemeProvider theme="light">
      {/* Grid, Tree, TreeGrid components */}
    </ThemeProvider>
  )
}

theme accepts "light" (default) or "dark".

Theme overrides

Pass overrides to customise individual design tokens without creating a full custom theme:

tsx
<ThemeProvider
  theme="light"
  overrides={{
    colorPrimary: '#e91e63',
    fontFamily: 'Inter, sans-serif',
    radiusMd: '2px',
  }}
>
  {/* ... */}
</ThemeProvider>

Every key in overrides maps directly to a CSS variable (see the full reference below).

Switching themes at runtime

tsx
import { useState } from 'react'
import { ThemeProvider } from '@itsmemyk/react-tree-grid'
import type { ThemeName } from '@itsmemyk/react-tree-grid'

function App() {
  const [theme, setTheme] = useState<ThemeName>('light')

  return (
    <ThemeProvider theme={theme}>
      <button onClick={() => setTheme(t => t === 'light' ? 'dark' : 'light')}>
        Toggle theme
      </button>
      {/* components */}
    </ThemeProvider>
  )
}

Overriding via CSS

You don't need ThemeProvider to customise the look. Every token is a CSS custom property set on the theme root element. Override them on any ancestor element and they cascade into the grid:

css
/* globals.css */
.my-grid-wrapper {
  --react-tree-grid-color-primary: #e91e63;
  --react-tree-grid-color-header-background: #1a237e;
  --react-tree-grid-color-header-text: #ffffff;
  --react-tree-grid-font-family: 'Roboto', sans-serif;
  --react-tree-grid-radius-md: '2px';
}
tsx
<div className="my-grid-wrapper">
  <ThemeProvider>
    <Grid columns={columns} data={data} style={{ height: 400 }} />
  </ThemeProvider>
</div>

TIP

CSS overrides take precedence over ThemeProvider because they are applied on an ancestor element and the browser cascade resolves them first.

CSS Variables Reference

All tokens follow the naming convention --react-tree-grid-{token-in-kebab-case}. The table below lists every variable, its default light-theme value, and what it controls.

Colour

CSS VariableLight defaultDescription
--react-tree-grid-color-primary#1976d2Primary accent — sort arrows, selection highlight, active states
--react-tree-grid-color-primary-hover#1565c0Hovered state of primary-coloured elements
--react-tree-grid-color-secondary#9c27b0Secondary accent colour
--react-tree-grid-color-danger#d32f2fDestructive / error colour
--react-tree-grid-color-success#2e7d32Success / positive colour
--react-tree-grid-color-warning#ed6c02Warning colour
--react-tree-grid-color-background#ffffffPage / container background
--react-tree-grid-color-surface#f5f5f5Alternating row, footer, and group panel background
--react-tree-grid-color-text#212121Primary text colour
--react-tree-grid-color-text-secondary#757575Muted / secondary text colour
--react-tree-grid-color-border#e0e0e0Cell and container border colour
CSS VariableLight defaultDescription
--react-tree-grid-color-header-background#f5f5f5Header row background colour
--react-tree-grid-color-header-text#212121Header cell text colour
--react-tree-grid-color-row-hoverrgba(0,0,0,0.04)Row and header-cell hover tint
--react-tree-grid-color-row-selectedrgba(25,118,210,0.08)Selected row background tint
--react-tree-grid-color-sort-active#1976d2Active (asc / desc) sort-arrow colour
--react-tree-grid-color-sort-idlergba(0,0,0,0.35)Idle (unsorted column) sort-arrow colour

Styling the header

--react-tree-grid-color-header-background and --react-tree-grid-color-header-text are the dedicated tokens for the column header row. Set them independently of the rest of the surface colours:

tsx
<ThemeProvider
  theme="light"
  overrides={{
    colorHeaderBackground: '#1976d2',
    colorHeaderText: '#ffffff',
  }}
>
  <Grid ... />
</ThemeProvider>

Typography

CSS VariableLight defaultDescription
--react-tree-grid-font-familysystem-ui, …Font stack for all grid text
--react-tree-grid-font-size-sm12pxSmall text (tooltips, badges)
--react-tree-grid-font-size-md14pxDefault cell and header text size
--react-tree-grid-font-size-lg16pxLarge text
--react-tree-grid-font-weight-normal400Regular weight
--react-tree-grid-font-weight-medium500Header and label weight
--react-tree-grid-font-weight-bold700Bold weight

Spacing

CSS VariableLight defaultDescription
--react-tree-grid-spacing-xs4pxExtra-small gap
--react-tree-grid-spacing-sm8pxSmall gap / cell padding
--react-tree-grid-spacing-md16pxMedium gap
--react-tree-grid-spacing-lg24pxLarge gap
--react-tree-grid-spacing-xl32pxExtra-large gap

Shape

CSS VariableLight defaultDescription
--react-tree-grid-radius-sm2pxSmall border-radius (cells)
--react-tree-grid-radius-md4pxMedium border-radius (inputs, dropdowns)
--react-tree-grid-radius-lg8pxLarge border-radius (modals, badges)

Shadow

CSS VariableLight defaultDescription
--react-tree-grid-shadow-sm0 1px 3px rgba(0,0,0,0.12)Subtle shadow (tooltips)
--react-tree-grid-shadow-md0 4px 6px rgba(0,0,0,0.12)Medium shadow (dropdowns)
--react-tree-grid-shadow-lg0 8px 24px rgba(0,0,0,0.16)Heavy shadow (modals)

Z-index

CSS VariableLight defaultDescription
--react-tree-grid-z-index-dropdown1000Dropdown menus
--react-tree-grid-z-index-modal1100Modals
--react-tree-grid-z-index-popup1200Popups
--react-tree-grid-z-index-tooltip1300Tooltips

Matching a UI library's look

Use overrides to make the grid blend into an existing design system. Pass only the tokens that differ — everything else inherits from the base theme.

Bootstrap 5

tsx
<ThemeProvider
  theme="light"
  overrides={{
    colorPrimary: '#0d6efd',
    colorSuccess: '#198754',
    colorWarning: '#ffc107',
    colorDanger: '#dc3545',
    colorSurface: '#f8f9fa',
    colorBorder: '#dee2e6',
    colorText: '#212529',
    colorTextSecondary: '#6c757d',
    colorHeaderBackground: '#0d6efd',
    colorHeaderText: '#ffffff',
    fontSizeMd: '16px',
    radiusMd: '6px',
    radiusLg: '12px',
  }}
>
  <Grid ... />
</ThemeProvider>

Material UI

tsx
<ThemeProvider
  theme="light"
  overrides={{
    colorPrimary: '#1976d2',
    colorSurface: '#fafafa',
    colorBorder: 'rgba(0,0,0,0.12)',
    colorHeaderBackground: '#673ab7',
    colorHeaderText: '#ffffff',
    fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
    fontWeightMedium: '500',
    radiusSm: '0px',
  }}
>
  <Grid ... />
</ThemeProvider>

See the Styling story in the live demo for an interactive comparison.

Released under the MIT License.