# Yummy Admin **A free, batteries-included Vue 3 admin panel — beautiful by default, RTL-native, and multilingual.** [![CI](https://github.com/doroudi/YummyAdmin/actions/workflows/ci.yml/badge.svg)](https://github.com/doroudi/YummyAdmin/actions/workflows/ci.yml) [![Netlify Status](https://api.netlify.com/api/v1/badges/24e54305-5d97-447e-adba-ed0a7c18513e/deploy-status)](https://app.netlify.com/sites/yummy-admin/deploys) [![Vue 3](https://img.shields.io/badge/Vue-3.5-42b883?logo=vuedotjs&logoColor=white)](https://vuejs.org) [![Vite](https://img.shields.io/badge/Vite-rolldown-646cff?logo=vite&logoColor=white)](https://vite.dev) [![Naive UI](https://img.shields.io/badge/Naive%20UI-2-63b3ed)](https://www.naiveui.com) [![Apache ECharts](https://img.shields.io/badge/ECharts-6-aa344d?logo=apacheecharts&logoColor=white)](https://echarts.apache.org) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) [English](./README.md) · [فارسی](./README.fa-ir.md) · [简体中文](./README.zh-cn.md) Buy me a coffee Yummy Admin — dark mode

🌏 Live Demo  ·  🌑 Dark Mode  ·  Persian · Chinese

Yummy Admin — light mode
> [!NOTE] > **Looking for the Nuxt version?** YummyAdmin has been migrated to Nuxt to take advantage of SSR and the rest of its feature set — development continues there. > → **[github.com/doroudi/YummyAdmin.Nuxt](https://github.com/doroudi/YummyAdmin.Nuxt)** > > YummyAdmin.Nuxt ## Table of contents - [Yummy Admin](#yummy-admin) - [Table of contents](#table-of-contents) - [Overview](#overview) - [Features](#features) - [Charts](#charts) - [Tech stack](#tech-stack) - [Getting started](#getting-started) - [Scripts](#scripts) - [Project structure](#project-structure) - [Theming \& tokens](#theming--tokens) - [Internationalization](#internationalization) - [Deployment](#deployment) - [Using this as a template](#using-this-as-a-template) - [Support](#support) - [License](#license) ## Overview Yummy Admin is a production-shaped admin panel for e-commerce back offices: products, categories, brands, colors, orders, customers, invoices, reviews, comments, analytics and settings — all wired to a mockable API layer so the UI is fully explorable without a backend. It ships with full **RTL** layout support, **three locales**, a runtime **theme colour picker**, dark/light modes, and a component gallery (forms, typography, charts) that doubles as living documentation. ## Features **Framework & developer experience** - ⚡️ **Vue 3.5 + Vite (rolldown) + TypeScript** — fast dev server and fast builds - 🗂 **File-based routing** via `vite-plugin-pages`, with a Nuxt-style **layout system** - 📦 **Auto-imports** for components, composables, stores and Vue APIs - 🧩 **Vue Macros** (`defineOptions`, `defineSlots`, …) enabled out of the box - 🎨 **UnoCSS** with attributify mode and the web-fonts preset - 🧹 **Biome** for lint/format, enforced on commit through **Lefthook** **UI & theming** - 🖼 **[Naive UI](https://www.naiveui.com) 2** component library with runtime theme overrides - 🌗 **Dark / light / follow-system** modes - 🎨 **Runtime theme colour** — switching the accent repaints Naive UI *and* every chart - ↔️ **Full RTL support**, not an afterthought: mirrored layout, RTL-aware Naive UI styles, and locale-aware chart legends (including ECharts canvases) **Data & state** - 🍍 **Pinia** with `pinia-plugin-persistedstate` for durable UI preferences - 🎭 **[MSW](https://mswjs.io/) + Faker** — a production-like REST API with realistic latency in the browser, zero backend required - 🔌 **Axios**-based service layer (`src/common/api`) with a typed `ApiService` - 🔌 **WebSocket**-backed chat app **E-commerce ready** - 🛒 Products, categories, brands, colors, orders, customers, invoices, reviews and comments screens - 📊 Dashboards for **E-commerce** and **Analytics** with KPI cards and sparklines - 🧾 Data tables with filtering, sorting, pagination and bulk actions ## Charts Charts are built on **[Apache ECharts 6](https://echarts.apache.org)** through the **[uipkge](https://uipkge.dev/vue/charts) chart registry** — a set of copy-paste, theme-token-driven ECharts wrappers. **Why uipkge instead of`apexcharts`?** | | ApexCharts (previous) | uipkge + ECharts (current) | | --------------------- | --------------------------------------- | ------------------------------------------------------ | | Distribution | npm dependency, options-object API | Registry source vendored into `src/`, yours to edit | | Extensibility | Limited to Apex's option surface | Full ECharts option escape hatch per chart | | Chart families | ~20 | 66 — cartesian, circular, hierarchy, flow, distribution, maps | | Theming | CSS-var options per chart | `--chart-1..5` tokens resolved at runtime | | Dark mode / accent | Manual overrides | Automatic — one token change repaints every canvas | The primitives live in **`src/components/ui/charts/`** (see its [README](./src/components/ui/charts/README.md) for provenance and the substitutions applied for this project). The app-facing wrappers stay in `src/components/Charts/chart-components/`, so **page code was not affected by the migration**. ```vue ``` Every wrapper accepts `ChartData` (`{ labels, series }`) or `SimpleChartSeries[]` (`{ name, value }[]`) and renders through `BaseChart`, which also owns the loading, error, empty and footer states. Need something the wrappers don't cover? Pass a raw ECharts option through the `options` prop, or drop to the vendored `RawChart`. | Wrapper | Renders | | ------------- | ---------------------------------- | | `` / `` | Multi-series line / filled area | | `` | Vertical, grouped or stacked bars | | `` / `` | Share-of-total, with centre KPI | | ``| Radial bar (polar coordinate bar) | | ``| Spider chart with auto-computed axis maxima | | `` | Axis-less mini trend, used by `SummaryStatCard` and the revenue card | > Charts render to `` and resolve their colours from live CSS custom properties, so a theme or dark-mode switch repaints them without a re-mount. ## Tech stack | Layer | Choice | | -------------- | ------------------------------------------------------------------- | | Framework | Vue 3.5 (`