1.0 beta · Vue 3 · TypeScript
A professional toolkit — typed, accessible, themeable. Tables, filters, forms and overlays that agree with each other. Windows 98 and modern in the box; your own look in one call.
Vue 3.5+ Tailwind CSS v4 TypeScript MIT
1–25 of 70
1–25 of 70
Live — sort, select and filter this table. View source →
Themes
A theme is token values and nothing else — the same markup, one attribute apart. Windows 98 and modern ship in the box; yours is one defineTheme() call.
data-theme="win98"data-theme="modern"defineTheme()import { defineTheme } from 'rowkit/theme'
const violet = {
'--color-control-primary': '#5b3df5',
'--color-control-primary-hover': '#4f33e0',
'--color-control-primary-active': '#4327c9',
'--color-checked': '#5b3df5',
'--radius-md': '10px',
}
export const acme = defineTheme({
name: 'acme', // <html data-theme="acme">
extends: 'modern',
light: violet,
dark: violet,
})Components
21 components today — controls, data, overlays and the window around them. Each with keyboard support, a docs page and stories in both themes.
Actions, from the default one Enter takes to a quiet link.
One value from a list, with search for long ones.
Status at a glance, in the colour and the word.
Progress you can measure, and work you cannot.
Search and the filters applied to a list.
Pages and page size for a long list.
On or off, with a label you can click.
Sort, select, load and empty — typed rows.
Why rowkit
The parts you would otherwise write and test yourself — done once, with the tests to prove it.
Generics carry your row type from DataTable into its slots, sort and selection. Strict TypeScript, no any.
WAI-ARIA patterns, full keyboard support, and an accessibility check on every story in CI — in both themes.
Focus scope, dismissable layers, positioning and scroll lock written for rowkit, with no behaviour library underneath.
313 design tokens, each described. Change a few for your brand or define a whole theme of your own.
Overlays teleport after mount; nothing reads the window on the server. Works in Nuxt with the Vite plugin.
AGENTS.md ships in the package — every prop, event and slot, generated from the source you installed.
In code
The table at the top of this page is this code. Your rows are typed, state is yours through v-model, and every part takes your classes.
<script setup lang="ts">
import { DataTable, FilterBar, Pagination } from 'rowkit'
import { columns, useUsers } from './users'
const { rows, total, filters, search, sort, selected, page } = useUsers()
</script>
<template>
<FilterBar v-model:search="search" :filters="filters" />
<DataTable
v-model:sort="sort"
v-model:selected="selected"
:rows="rows"
:columns="columns"
caption="Users"
selectable="multiple"
/>
<Pagination v-model:page="page" :total="total" />
</template>Questions
data-theme="modern" on <html> for the modern look — light and dark — or define your own.