Theming

Custom Theme

Build your own theme with custom styling.

NuGrid's theming system allows you to create custom themes that match your application's design.

Interactive Demo

Using the UI Prop

The simplest way to customize styling is with the ui prop:

<template>
  <NuGrid
    :data="data"
    :columns="columns"
    :ui="{
      base: 'border-separate border-spacing-0',
      thead: '[&>tr]:bg-gray-100 dark:[&>tr]:bg-gray-800',
      th: 'py-3 px-4 font-semibold text-left',
      td: 'py-2 px-4 border-b border-gray-200',
      tr: 'hover:bg-gray-50 dark:hover:bg-gray-800/50',
    }"
  />
</template>

UI Slots Reference

SlotDescription
rootRoot container element
baseTable element itself
theadTable header
tbodyTable body
tfootTable footer
trTable rows
thHeader cells
tdBody cells

Registering a Custom Theme

For reusable themes, register them globally:

// plugins/nugrid-themes.ts
import { registerTheme } from '@nu-grid/nuxt'

registerTheme('corporate', {
  theme: {
    slots: {
      root: 'font-sans',
      base: 'border-collapse',
      thead: 'bg-blue-900 text-white',
      th: 'py-3 px-4 font-bold uppercase text-sm tracking-wide',
      tbody: '',
      tr: 'hover:bg-blue-50 dark:hover:bg-blue-900/20',
      td: 'py-2 px-4 border-b border-gray-200',
    },
  },
})

Then use it:

<template>
  <NuGrid theme="corporate" :data="data" :columns="columns" />
</template>

Extending the Default Theme

Build on top of the default theme:

import { getTheme, registerTheme } from '@nu-grid/nuxt'

const defaultTheme = getTheme('default')

registerTheme('my-theme', {
  theme: {
    ...defaultTheme.theme,
    slots: {
      ...defaultTheme.theme.slots,
      // Override specific slots
      th: 'py-4 px-6 font-bold bg-primary text-white',
      td: 'py-3 px-6',
    },
  },
})

Dark Mode Support

Themes automatically support dark mode through Tailwind's dark: variant:

registerTheme('dual-mode', {
  theme: {
    slots: {
      thead: 'bg-gray-100 dark:bg-gray-900',
      th: 'text-gray-900 dark:text-gray-100',
      tr: 'hover:bg-gray-50 dark:hover:bg-gray-800',
      td: 'border-gray-200 dark:border-gray-700',
    },
  },
})

Focus and Selection Styling

Customize focus and selection appearance:

<template>
  <NuGrid
    :data="data"
    :columns="columns"
    :ui="{
      td: `
        border-b border-gray-200
        [tr[data-focused=true]_&]:bg-blue-100
        [tr[data-focused=true]_&]:dark:bg-blue-900/30
        [tr[data-selected=true]_&]:bg-green-100
        [tr[data-selected=true]_&]:dark:bg-green-900/30
      `,
    }"
  />
</template>

Complete Custom Theme Example

registerTheme('dashboard', {
  theme: {
    slots: {
      root: 'rounded-lg overflow-hidden shadow-lg',
      base: 'w-full border-collapse',
      thead: 'bg-gradient-to-r from-purple-600 to-blue-600 text-white',
      th: 'py-4 px-6 font-semibold text-left text-sm uppercase tracking-wider',
      tbody: 'divide-y divide-gray-200 dark:divide-gray-700',
      tr: `
        transition-colors duration-150
        hover:bg-gray-50 dark:hover:bg-gray-800/50
        [&[data-selected=true]]:bg-purple-50 dark:[&[data-selected=true]]:bg-purple-900/20
      `,
      td: 'py-3 px-6 text-sm',
      tfoot: 'bg-gray-50 dark:bg-gray-800 font-medium',
    },
  },
})
NuGrid uses tailwind-variants internally for theme composition, allowing powerful variant-based styling patterns.