Vue Data UI: 67 Components That Make D3.js Obsolete
Stop wrestling with D3.js. Stop hand-crafting SVG paths at 2 AM. There's a better way to build stunning data visualizations in Vue 3—and it's completely open source.
Let me guess: you've been there. Your product manager wants a "simple dashboard" by Friday. You spend three days fighting with charting libraries that promise the world but deliver a nightmare of custom configurations, broken tooltips, and CSS wars. You've tried Chart.js, ApexCharts, maybe even Recharts. Each one forces you into a box you don't fit in. And D3.js? Beautiful results, sure—if you have six weeks and a PhD in coordinate mathematics.
What if I told you there's a Vue 3 component library with 67 ready-to-use visualization components that handles everything from sparklines to 3D bars to interactive world maps? A library built specifically for "eloquent data storytelling"—where the components are as expressive as your data demands?
Welcome to Vue Data UI. Created by graphieros, this isn't just another charting wrapper. It's a comprehensive, user-empowering ecosystem that transforms how Vue developers approach data visualization. And the best part? It's completely free, open source, and actively maintained with TypeScript support out of the box.
In this deep dive, I'll show you exactly why thousands of developers are switching to Vue Data UI, how to get started in under five minutes, and the advanced techniques that will make your dashboards irresistible. Let's expose what makes this library so powerful.
What Is Vue Data UI?
Vue Data UI is an open-source Vue 3 component library purpose-built for data visualization and "eloquent data storytelling." Created by the developer graphieros and hosted at github.com/graphieros/vue-data-ui, it represents a fundamentally different approach to charting in the Vue ecosystem.
Unlike generic charting libraries that treat Vue as an afterthought, Vue Data UI is natively designed for Vue 3's composition API, reactivity system, and slot-based architecture. Every component is a first-class Vue citizen—not a jQuery plugin wrapped in a thin veneer.
The library's philosophy centers on user empowerment through component granularity. Rather than forcing you into monolithic "chart types," Vue Data UI offers 67 distinct components across seven categories: Charts, Mini Charts, 3D visualizations, Tables, Rating components, Maps, and Utilities. This granularity means you compose exactly what you need, nothing more.
Why it's trending now:
- Vue 3 adoption is accelerating—developers need visualization tools that leverage Composition API,
<script setup>, and TypeScript - Dashboard complexity is exploding—static charts aren't enough; users demand interactive, exportable, customizable experiences
- Developer experience matters—the library's slot-based customization and theme system reduce "visualization debt"
- Bundle size consciousness—tree-shakeable imports mean you only ship what you use
The project's documentation site at vue-data-ui.graphieros.com provides interactive examples for every component, and the companion vue-data-ui-doc repository ensures transparency in how documentation is built.
With built-in TypeScript definitions, 9 pre-built themes, and zero external charting dependencies (no D3.js required in your bundle), Vue Data UI is positioned as the modern standard for Vue data visualization.
Key Features That Will Blow Your Mind
Vue Data UI isn't just comprehensive—it's intelligently designed at every layer. Here are the technical capabilities that separate it from the pack:
67 Specialized Components, Zero Bloat
The library organizes components into logical domains:
- 38 Chart components — From standard line/bar charts (
VueUiXy,VueUiXyCanvas) to exotic visualizations (VueUiChord,VueUiCirclePack,VueUiDag,VueUiGalaxy) - 8 Mini Charts — Sparklines, sparkbars, bullet charts, and trend indicators for dense dashboards
- 1 3D Component —
VueUi3dBarfor dimensional data presentation - 4 Table Components — Including heatmap tables and carousel tables with sparkline integration
- 2 Rating Components —
VueUiRatingandVueUiSmileyfor user feedback collection - 2 Map Components —
VueUiGeoandVueUiWorldfor geographic data visualization - 12 Utility Components — Dashboard layouts, KPI displays, timers, annotators, and icon systems
Universal Component Architecture
The VueDataUi universal component lets you dynamically switch chart types via prop—without losing slot functionality or event bindings:
<VueDataUi
component="VueUiXy"
:config="config"
:dataset="dataset"
/>
This dynamic component preserves #svg, #legend, #tooltip, and other slots when the wrapped component supports them.
Nine Production-Ready Themes
Instant visual transformation without CSS hacking:
| Theme | Vibe | Best For |
|---|---|---|
default |
Clean, professional | General purpose |
dark |
High-contrast dark mode | Night dashboards |
zen |
Minimal, calming | Health/wellness apps |
hack |
Terminal aesthetic | Developer tools |
concrete |
Industrial, serious | B2B analytics |
celebration |
Festive, colorful | Marketing dashboards |
celebrationNight |
Dark festive | Holiday dark mode |
minimal |
Ultra-stripped | Embedded widgets |
minimalDark |
Dark minimal | Status displays |
Enterprise-Grade Export & Interaction
Every major component exposes methods for:
- PDF generation (
generatePdf) - Image export (
generateImage,getImage) - CSV data export (
generateCsv) - Table toggle (
toggleTable) - Tooltip control (
toggleTooltip) - Fullscreen mode (via user options)
Smart Developer Experience
- Auto-loading skeletons — Set
config.loading: trueor passundefineddataset for automatic skeleton screens - Debug mode —
config.debug: truesurfaces development warnings, disabled in production - Smart label resizing — Auto-rotation and responsive text scaling
- Config introspection —
getVueDataUiConfig()extracts default configurations for any component
Real-World Use Cases Where Vue Data UI Dominates
1. SaaS Analytics Dashboards
You're building the next Stripe-style dashboard. You need sparklines in table rows, interactive region maps, funnel conversion tracking, and real-time KPI counters. Vue Data UI's VueUiTableSparkline, VueUiGeo, VueUiFunnel, and VueUiKpi components compose into a cohesive system—with shared theming and export functionality.
2. Financial Trading Interfaces
Candlestick charts (VueUiCandlestick), real-time gauge meters (VueUiGauge), and heatmap matrices (VueUiHeatmap) for correlation analysis. The VueUiXyCanvas component handles massive datasets with canvas rendering performance, while VueUiSparkTrend shows micro-movements without DOM overhead.
3. Healthcare & Scientific Visualization
Age pyramids (VueUiAgePyramid) for demographic studies, parallel coordinate plots (VueUiParallelCoordinatePlot) for multi-dimensional patient data, and ridgeline plots (VueUiRidgeline) for distribution comparison. The annotator utility (VueUiAnnotator) lets researchers mark and save observations directly on visualizations.
4. Social Media & Content Analytics
Word clouds (VueUiWordCloud) for hashtag analysis, chord diagrams (VueUiChord) for relationship mapping, and nested donuts (VueUiNestedDonuts) for engagement breakdowns. The VueUiCarouselTable auto-animates through top-performing content with pause/resume controls.
Step-by-Step Installation & Setup Guide
Get from zero to interactive chart in under three minutes.
Step 1: Install the Package
npm i vue-data-ui
Step 2: Import Global Styles
The CSS file is mandatory for proper rendering:
// main.js
import { createApp } from 'vue';
import App from './App.vue';
import 'vue-data-ui/style.css'; // Critical: include base styles
const app = createApp(App);
app.mount('#app');
Step 3: Choose Your Import Strategy
Option A: Global Registration (Best for prototypes, admin panels)
// main.js
import { VueUiRadar, VueUiXy, VueUiDonut } from 'vue-data-ui';
app.component('VueUiRadar', VueUiRadar);
app.component('VueUiXy', VueUiXy);
app.component('VueUiDonut', VueUiDonut);
Option B: Local, Tree-Shakeable Imports (Best for production, bundle size)
<script setup>
import { VueUiRadar, VueUiXy } from "vue-data-ui";
// Only these components end up in your bundle
</script>
Option C: Universal Dynamic Component (Best for dynamic chart type switching)
<script setup>
import { ref } from "vue";
import { VueDataUi } from "vue-data-ui";
import "vue-data-ui/style.css";
const config = ref({
theme: 'dark',
chart: { title: { text: 'Dynamic Chart' } }
});
const dataset = ref([
{ name: 'Series A', values: [10, 20, 30, 40, 50] },
{ name: 'Series B', values: [15, 25, 35, 45, 55] }
]);
// Switch component type dynamically
const currentChart = ref('VueUiXy');
</script>
<template>
<VueDataUi
:component="currentChart"
:config="config"
:dataset="dataset"
/>
</template>
Note: Three utility components cannot use the universal wrapper and must be imported individually:
Arrow,VueUiIcon, andVueUiPattern.
Step 4: Nuxt Integration
For Nuxt 3 projects, use the official boilerplate:
# Clone the starter template
git clone https://github.com/graphieros/vue-data-ui-nuxt
This pre-configures SSR compatibility, auto-imports, and client-only rendering guards for canvas-based components.
Step 5: TypeScript Configuration
Types ship automatically. No @types/ package needed:
// Your .vue files get full IntelliSense
import type { VueUiXyConfig, VueUiXyDatasetItem } from 'vue-data-ui';
const config: VueUiXyConfig = {
theme: 'zen',
chart: {
grid: { show: true }
}
};
REAL Code Examples From the Repository
Let's examine actual patterns from the Vue Data UI documentation, with detailed explanations of what's happening under the hood.
Example 1: Custom Tooltip with Slot Data
The #tooltip slot exposes rich context that most libraries hide from you. Here's how to build a multi-series tooltip with time labels:
<template>
<VueUiXy :dataset="dataset" :config="config">
<template #tooltip="{ timeLabel, datapoint }">
<!-- timeLabel exists for time-series components -->
<div class="custom-tooltip">
<span class="time-header">{{ timeLabel.text }}</span>
<!-- datapoint contains all series at this x-coordinate -->
<div
v-for="serie in datapoint"
:key="serie.id"
class="series-row"
>
<!-- Access individual series properties -->
<span
class="color-dot"
:style="{ backgroundColor: serie.color }"
/>
<span class="series-name">{{ serie.name }}</span>
<span class="series-value">{{ serie.value }}</span>
</div>
</div>
</template>
</VueUiXy>
</template>
<script setup>
import { ref } from 'vue';
import { VueUiXy } from 'vue-data-ui';
const config = ref({
theme: 'dark',
chart: {
title: { text: 'Revenue Trends' }
}
});
const dataset = ref([
{
name: 'Q1 Revenue',
series: [120, 150, 180, 220],
type: 'bar'
},
{
name: 'Q2 Projection',
series: [140, 170, 200, 250],
type: 'line'
}
]);
</script>
What's happening: The #tooltip slot receives an object with timeLabel (for temporal axes), datapoint (array of all series at hover position), plus seriesIndex, series, and config. This is far more powerful than a simple string formatter—you can render Vue components, conditionally style based on data values, or even embed child charts.
Example 2: SVG Overlay with ForeignObject
The #svg slot lets you inject arbitrary SVG elements—including HTML via foreignObject—directly into the chart's coordinate system:
<template>
<VueUiXy :dataset="dataset" :config="config">
<template #svg="{ svg }">
<!--
svg object contains: width, height, x, y (chart area dimensions)
Position elements using these coordinates for responsive placement
-->
<foreignObject
:x="svg.width - 150"
y="0"
height="100"
width="150"
>
<!-- HTML content inside SVG! -->
<div class="custom-caption">
<strong>Live Data</strong>
<span>Updated: {{ lastUpdated }}</span>
</div>
</foreignObject>
<!-- Pure SVG elements work too -->
<circle
:cx="svg.width / 2"
:cy="svg.height / 2"
r="5"
fill="red"
class="attention-marker"
/>
</template>
</VueUiXy>
</template>
<script setup>
import { ref } from 'vue';
import { VueUiXy } from 'vue-data-ui';
const lastUpdated = ref(new Date().toLocaleTimeString());
const dataset = ref([/* ... */]);
const config = ref({/* ... */});
</script>
The secret power: This pattern enables watermarks, annotations, custom legends, and interactive overlays that exist in the SVG's render tree—meaning they scale with the chart, export with PDF/image generation, and respect the coordinate system.
Example 3: Quick Custom Theme with Config Merge
Don't start from scratch. Derive from defaults and override selectively:
<script setup>
import { ref, computed } from 'vue';
import {
VueUiXy,
getVueDataUiConfig, // Extract default config for any component
mergeConfigs // Deep merge utility
} from 'vue-data-ui';
// Step 1: Get base config with color overrides
const customTheme = getVueDataUiConfig('vue_ui_xy', {
colorBackground: '#1A1A1A', // Deep charcoal background
colorTextPrimary: '#CD9077', // Warm terracotta text
colorTextSecondary: '#825848', // Muted brown labels
colorGrid: '#CD9077', // Matching grid lines
colorBorder: '#CD9077', // Consistent borders
});
// Step 2: Layer your specific chart configuration
const config = computed(() => {
return mergeConfigs({
defaultConfig: customTheme, // Your theme foundation
userConfig: {
chart: {
title: {
text: 'Q3 Performance',
subtitle: {
text: 'Revenue vs. Targets',
},
},
// Override theme for specific elements
grid: {
stroke: '#333333', // Darker grid than theme default
}
},
// Version 3 feature: manual loading state
loading: false,
// Version 3 feature: development warnings
debug: process.env.NODE_ENV === 'development'
},
});
});
const dataset = ref([
{
name: 'Actual',
series: [85, 92, 78, 95, 88],
type: 'bar',
color: '#CD9077' // Overrides theme color for this series
},
{
name: 'Target',
series: [90, 90, 90, 90, 90],
type: 'line',
color: '#4A90D9'
}
]);
</script>
<template>
<VueUiXy :config="config" :dataset="dataset" />
</template>
Why this matters: The getVueDataUiConfig + mergeConfigs pattern gives you type-safe, future-proof theming. When Vue Data UI adds new config options in v4, your merge strategy automatically includes them with sensible defaults.
Example 4: Watermark That Only Shows on Export
The #watermark slot exposes isPrinting—a boolean that's only true during PDF/image generation:
<template>
<VueUiDonut :config="config" :dataset="dataset">
<template #watermark="{ isPrinting }">
<div
v-if="isPrinting"
style="
font-size: 100px;
opacity: 0.1;
transform: rotate(-10deg);
pointer-events: none;
"
>
CONFIDENTIAL
</div>
</template>
</VueUiDonut>
</template>
Pro insight: This pattern solves the "watermark paradox"—you want watermarks on exports for legal protection, but you don't want them cluttering the interactive view. Vue Data UI handles this natively without CSS hacks or duplicate components.
Example 5: Custom User Options with Callback Override
Override default export behavior to integrate with your backend or analytics:
<script setup>
const config = ref({
userOptions: {
show: true,
showOnChartHover: true, // Appear only on hover
keepStateOnChartLeave: false, // Auto-hide when mouse exits
buttons: {
pdf: true,
img: true,
csv: true,
altCopy: true, // Copy raw data as JSON
fullscreen: false, // Disable fullscreen
table: true,
annotator: true
},
// Override what happens when buttons are clicked
callbacks: {
pdf: ({ chartElement, imageUri, base64 }) => {
// Send to your PDF microservice instead of downloading
fetch('/api/reports/pdf', {
method: 'POST',
body: JSON.stringify({ image: base64, page: 'dashboard' })
});
},
csv: (csvStr) => {
// Transform CSV format before download
const transformed = csvStr.replace(/,/g, ';');
const blob = new Blob([transformed], { type: 'text/csv' });
// Custom download logic...
}
}
}
});
</script>
Advanced Usage & Best Practices
Performance Optimization for Large Datasets
- Use
VueUiXyCanvasinstead ofVueUiXyfor >1000 data points—it renders to HTML5 Canvas instead of SVG DOM nodes - Leverage
VueUiSparklinevariants for dashboard grids—they're render-optimized and lack heavy interactive features - Set
:keyonVueDataUiuniversal component when switching types to force clean unmount/remount
Responsive Design Patterns
<template>
<div class="chart-container">
<VueUiXy
:config="responsiveConfig"
:dataset="dataset"
style="width: 100%; height: 100%;"
/>
</div>
</template>
<style>
.chart-container {
/* Aspect ratio preservation */
aspect-ratio: 16 / 9;
min-height: 300px;
}
/* Vue Data UI components respond to container size */
</style>
Slot Composition Strategy
Build reusable wrapper components that pre-configure slots:
<!-- BaseChart.vue -->
<template>
<VueDataUi :component="type" :config="mergedConfig" :dataset="dataset">
<template #watermark="{ isPrinting }">
<BrandWatermark v-if="isPrinting" />
</template>
<template #tooltip="tooltipData">
<SmartTooltip v-bind="tooltipData" :format="tooltipFormat" />
</template>
</VueDataUi>
</template>
Theme Switching at Runtime
<script setup>
const currentTheme = ref('default');
const themes = ['default', 'dark', 'zen', 'hack', 'concrete', 'celebration', 'celebrationNight', 'minimal', 'minimalDark'];
const config = computed(() => ({
theme: currentTheme.value,
// ... other config
}));
</script>
Comparison With Alternatives
| Feature | Vue Data UI | Chart.js + vue-chartjs | D3.js + Custom Vue | ApexCharts |
|---|---|---|---|---|
| Vue 3 Native | ✅ First-class | ⚠️ Wrapper layer | ❌ Manual binding | ⚠️ Wrapper layer |
| Component Count | 67 | ~8 | Unlimited (build yourself) | ~25 |
| TypeScript | ✅ Built-in | ⚠️ Community types | ❌ Manual | ⚠️ Partial |
| Tree Shaking | ✅ Yes | ⚠️ Partial | ✅ Yes | ❌ No |
| Slot Customization | ✅ Extensive | ❌ Limited | ✅ Unlimited | ❌ Limited |
| Theme System | ✅ 9 built-in | ❌ Manual CSS | ❌ Build yourself | ⚠️ 2 modes |
| Export (PDF/PNG/CSV) | ✅ Built-in | ❌ Plugin required | ❌ Build yourself | ⚠️ Plugin |
| Skeleton Loading | ✅ Auto | ❌ No | ❌ Build yourself | ❌ No |
| Learning Curve | Low-Medium | Low | Very High | Medium |
| Bundle Size (one chart) | ~15-50KB | ~60KB + wrapper | 300KB+ (D3 alone) | ~150KB |
| License | MIT | MIT | BSD | MIT |
The verdict: Choose Vue Data UI when you need rapid development, deep Vue integration, and production-ready features without the D3.js learning cliff. Choose D3.js only when you need completely bespoke visualizations that don't fit standard chart types.
FAQ: What Developers Ask About Vue Data UI
Is Vue Data UI free for commercial use?
Yes. It's MIT licensed. Use it in SaaS products, client projects, or internal tools without restriction. Attribution is appreciated but not required.
Does it work with Vue 2?
No. Vue Data UI is Vue 3 only, leveraging Composition API, <script setup>, and modern reactivity. For Vue 2, consider vue-chartjs or migrate to Vue 3.
How do I handle SSR/Nuxt?
Use the official Nuxt boilerplate. For canvas-based components (VueUiXyCanvas), wrap in <ClientOnly> or use the ssr: false pattern. SVG components generally hydrate fine.
Can I use my existing D3.js code with Vue Data UI?
Indirectly. Use the #svg slot to inject D3-generated elements into Vue Data UI's coordinate system. However, you'll lose built-in export functionality for D3 portions.
What's the browser support?
Modern browsers (Chrome, Firefox, Safari, Edge—last 2 versions). IE11 is not supported. Canvas components require HTML5 Canvas API.
How active is development?
Very. Version 3 shipped recently with non-breaking improvements: loading states, debug mode, smart labels, and expanded responsive support. Check GitHub issues for the roadmap.
Can I contribute new chart types?
Absolutely! The repository welcomes contributions. Follow the existing component patterns, include TypeScript definitions, and ensure slot compatibility with the universal component.
Conclusion: Your Data Deserves Better Than "Good Enough"
Here's the truth: most data visualizations are forgettable because the tools make expressiveness painful. You settle for a default line chart because customizing it takes too long. You skip the watermark because it's "just internal." You hardcode colors because theming is a nightmare.
Vue Data UI removes every one of these excuses.
With 67 components, 9 themes, deep slot architecture, and export-ready production features, it transforms data visualization from a chore into a competitive advantage. The universal component lets you prototype in minutes. The granular imports let you optimize for production. The TypeScript support keeps your codebase honest.
I've shown you the installation, the real code patterns, the advanced techniques. The rest is up to you.
Stop wrestling with visualization libraries that fight your framework. Start building dashboards that tell stories.
👉 Get started now: github.com/graphieros/vue-data-ui
⭐ Star the repo to support open-source development and stay updated on new components.
📖 Explore interactive docs: vue-data-ui.graphieros.com
The next time someone asks for a "simple dashboard," you'll smile—because simple just became effortless.