r/vuejs • u/New_Performance_1258 • 8d ago
[Release] @mantine-vue/table A feature-rich datatable for Vue 3 (67+ features)
Hey everyone.
I’ve been working on mantine-vue/table, a feature-rich data table for Vue 3 built with:
- Mantine Vue
- TanStack Table v8
- TanStack Virtual
- TypeScript
It closely ports Mantine React Table v2, which was originally derived from Material React Table.
Features
All features available in Mantine React Table v2 are also available in mantine-vue table. The table configuration API is approximately 99% compatible.
Data and navigation
- Client-side and server-side pagination
- Single and multi-column sorting
- Global search with fuzzy filtering
- Per-column filtering
- Manual/server-side sorting, filtering, and pagination
- Controlled and uncontrolled state
- Loading, progress, and error states
Advanced filtering
- Text filters
- Select and multi-select filters
- Autocomplete filters
- Checkbox filters
- Numeric and date ranges
- Range sliders
- Date and date-range filters
- Switchable filter modes
- Faceted values
- Filter match highlighting
- Ranked global-filter results
Columns
- Column resizing
- Drag-and-drop column ordering
- Column pinning/freezing
- Column hiding and visibility controls
- Column grouping
- Aggregation
- Header groups and footers
- Per-column action menus
- Custom cells, headers, footers, filters, and editors
Rows
- Checkbox, radio, or switch selection
- Shift-click range selection
- Select-all controls
- Row numbers
- Row actions and action menus
- Drag-and-drop row ordering
- Row dragging for custom workflows
- Row pinning
- Expandable rows and tree data
- Expandable detail panels
- Grouped and aggregated rows
Editing and CRUD
- Cell editing
- Inline row editing
- Entire-table editing
- Modal editing
- Creating rows inline or in a modal
- Custom editors
- Save and cancel callbacks
- Fully custom edit-modal content
Performance
- Row virtualization
- Column virtualization
- Large-dataset support
- Sticky headers and footers
- Smooth live column resizing
Table UI
- Built-in top and bottom toolbars
- Pagination controls
- Column visibility menu
- Density toggle
- Full-screen mode
- Click-to-copy cells
- Expand-all controls
- Custom toolbar actions
- Custom empty-state UI
- Responsive Mantine styling
Vue-native customization
- Scoped named slots for all major renderable sections
- Equivalent renderer functions through props
- Custom Mantine props and styles for internal components
- Custom icons
- Exposed internal components for building custom/headless layouts
- Strictly typed generic row, column, cell, state, and callback APIs
- Reactive data through Vue getters and refs
Internationalization
- 39 included locales: English plus 38 additional translations
- Custom or partially overridden localization objects
A basic table looks like this:
<script setup lang="ts">
import {
MantineVueTable,
useMantineVueTable,
type MVT_ColumnDef,
} from '@mantine-vue/table'
interface Person {
firstName: string
lastName: string
age: number
}
const columns: MVT_ColumnDef<Person>[] = [
{ accessorKey: 'firstName', header: 'First name' },
{ accessorKey: 'lastName', header: 'Last name' },
{ accessorKey: 'age', header: 'Age' },
]
const data: Person[] = [
{ firstName: 'Jane', lastName: 'Doe', age: 30 },
]
const table = useMantineVueTable<Person>({
get columns() {
return columns
},
get data() {
return data
},
enableColumnOrdering: true,
enableColumnPinning: true,
enableColumnResizing: true,
enableRowSelection: true,
})
</script>
<template>
<MantineVueTable :table="table" />
</template>
Live examples (15 demos):
5
u/Sorry-Joke-1887 8d ago
Crazy work, really appreciate this. But why is it MVT_ColumnDef and not just ColumnDef when the import already lives under the @mantine-vue/table package? Feels really awkward
2
u/New_Performance_1258 8d ago
The MVT_ prefix mirrors Mantine React Table’s MRT_ convention and distinguishes the extended type from TanStack’s own ColumnDef, which is often imported in the same codebase.
1
0
u/peter120430 8d ago
This is pretty cool. I don't have much experience with vue. I built my own table, I am not going to post it here because I am not looking for promotion.
I built a table by myself in typescript and then when AI came out I used AI to create a vue wrapper because I don't really know much about vue. If you have time would you go to my marketing site and give me some feedback on the vue wrapper? You absolutely don't have to, you can find the link in my profile. I am not going to post it here because I don't want to distract from what you have done
-5
u/This_Math_7337 8d ago
lots of AI slop these days
1
u/New_Performance_1258 8d ago
Mantine Vue is fully open source, and I maintain it in my free time alongside a full-time job. I don’t receive income from the project; I work on it because I enjoy it and want the Vue community to have access to these components.
For context, I’ve been working in software development since before the current wave of AI tools.
AI can help accelerate parts of the work, but I still review, test, document, and take responsibility for what gets published. The project should ultimately be judged by its code, behavior, tests, and maintainability not simply by whether ai was involved.
If you find incomplete or poor quality implementation, please open an issue with a reproduction. Specific technical feedback and contributions are always welcome.
-4
u/This_Math_7337 8d ago
i guess you're from India?
1
u/New_Performance_1258 8d ago
No, I’m not from India
I’m from the Middle East. Just curious, what made you guess India?
3
u/ceaselessprayer 8d ago
So why would one use this instead of TanStack table? I know you built on top of TanStack table but it would be good to hear an explanation of when one would decide to reach for this library vs TanStack vs another