Vize

Musea

⚠️ Work in Progress: Vize is under active development and is not yet ready for production use. Musea's API and art file format may change without notice.

Musea (/mjuːˈziːə/) is Vize's built-in component gallery — a Storybook alternative for exploring, documenting, and developing Vue components. The name is the plural of "museum": a place to display and appreciate works of art.

Unlike Storybook, which requires a separate build pipeline and its own configuration ecosystem, Musea is integrated directly into the Vize toolchain. It uses *.art.vue files to define component stories with a declarative, Vue-native syntax.

Overview

Musea Component Gallery — Home

The gallery provides a dashboard showing all registered components, their variant counts, categories, tags, and status badges. Components are organized into categories (e.g., "Components", "Preview") and can be searched, filtered, and browsed from the sidebar.

Installation

npm install @vizejs/vite-plugin-musea

Usage

Via CLI

vize musea

Via Vite Plugin

// vite.config.js
import { defineConfig } from 'vite';
import musea from '@vizejs/vite-plugin-musea';

export default defineConfig({
  plugins: [musea()],
});

Via Nuxt

// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@vizejs/nuxt'],
  vize: {
    musea: {
      include: ['**/*.art.vue'],
      tokensPath: 'assets/tokens.json',
      previewCss: ['assets/styles/main.css'],
      previewSetup: 'musea.preview.ts',
    },
  },
});

Art Files

Musea uses *.art.vue files to define component stories. Each art file describes how a component should be displayed in the gallery, including its variants, metadata, and usage examples.

Basic Structure

<script setup lang="ts">
import MyButton from './MyButton.vue'
</script>

<art
  title="MyButton"
  component="./MyButton.vue"
  category="Components"
  status="ready"
  tags="button, ui, input"
>
  <variant name="Default" default>
    <MyButton type="button">Click me</MyButton>
  </variant>

  <variant name="Outlined">
    <MyButton type="button" outlined>Click me</MyButton>
  </variant>

  <variant name="Icon">
    <MyButton type="button" icon>
      <svg><!-- icon --></svg>
    </MyButton>
  </variant>
</art>

Art File Anatomy

Element Description
<script setup> Import the target component and any dependencies
<art> Root element containing metadata and variants
title Display name in the gallery
component Relative path to the source component
category Grouping in the sidebar (e.g., "Components", "Preview")
status Component status badge: ready, wip, deprecated
tags Comma-separated tags for search and filtering
<variant> A named configuration of the component
default attribute Marks the variant shown by default

Real-World Example

Here is an art file from the Vue Fes Japan 2026 conference website:

<script setup lang="ts">
import VFHeading from './VFHeading.vue'
</script>

<art
  title="VFHeading"
  component="./VFHeading.vue"
  category="Components"
  status="ready"
  tags="heading, typography"
>
  <variant name="Default" default>
    <VFHeading :level="2">Section Title</VFHeading>
  </variant>

  <variant name="H1">
    <VFHeading :level="1">Page Title</VFHeading>
  </variant>

  <variant name="H3">
    <VFHeading :level="3">Subsection Title</VFHeading>
  </variant>

  <variant name="With Anchor">
    <VFHeading :level="2" anchor="section-id">
      Linked Section
    </VFHeading>
  </variant>
</art>

Component Detail View

Musea Component Detail — Variants

When you select a component from the sidebar, Musea shows a detail view with:

  • Component header — Name, status badge, variant count, category, and tags

  • Preview toolbar — Background color controls (Light, Dark, Transparent, custom), outline mode, and measurement overlay

  • Tab navigation — Variants, Props, Docs, A11y, and VRT (Visual Regression Testing)

  • Variant selector — Switch between variants defined in the art file

  • Live preview — The component rendered in an isolated iframe

  • Source actions — Copy template, view source, fullscreen, open in new tab

Props Panel

Musea Props Panel

The Props tab provides an interactive props playground:

  • Live Preview — Component updates in real-time as you change props

  • Props Controls — Auto-generated controls based on the component's prop definitions (dropdowns for enums, toggles for booleans, text inputs for strings)

  • Slot editor — Edit slot content directly with a code editor

  • Usage snippet — Auto-generated template code reflecting the current prop values

  • Current Values — JSON representation of all current prop values

Design Tokens

Musea Design Tokens

Musea includes a Design Tokens viewer that reads from a JSON token file (e.g., Style Dictionary output). It displays:

  • Color tokens — Visual swatches organized by category (Primary, Purple, Orange, Navy, etc.)

  • Typography tokens — Font sizes and line heights with previews for each heading level and body text

  • Spacing and layout tokens — Border radius, z-index, breakpoints

  • Semantic tokens — Tokens that reference other tokens, showing the resolved values

  • Primitive vs. Semantic classification — Filter tokens by type

  • Edit and delete — Modify tokens directly from the gallery UI

Configure the tokens path in your Musea configuration:

musea({
  tokensPath: 'assets/tokens.json',
})

The token file should follow the Style Dictionary format or a compatible JSON structure.

Preview Configuration

Musea renders each variant in an isolated iframe. You can customize the preview environment:

Preview CSS

Inject stylesheets into the preview iframe to ensure components render with your project's styles:

musea({
  previewCss: [
    'assets/styles/main.css',
    'assets/styles/musea-preview.css',
  ],
})

Preview Setup

Provide a setup function that runs before each preview. This is useful for installing plugins (vue-i18n, vue-router), registering global components, or configuring mock data:

// musea.preview.ts
import { createI18n } from 'vue-i18n'
import { createRouter, createMemoryHistory } from 'vue-router'
import type { MuseaPreviewSetup } from '@vizejs/vite-plugin-musea'

export default ((app) => {
  // Install i18n
  const i18n = createI18n({
    locale: 'en',
    messages: { en: { /* ... */ }, ja: { /* ... */ } },
  })
  app.use(i18n)

  // Install router (with stub routes for NuxtLink compatibility)
  const router = createRouter({
    history: createMemoryHistory(),
    routes: [
      { path: '/', component: { template: '<div />' } },
    ],
  })
  app.use(router)
}) satisfies MuseaPreviewSetup

Features

Keyboard Shortcuts

Shortcut Action
⌘K Open component search
⌘B Toggle sidebar
Alt+O Toggle outline mode
Alt+M Toggle measurement overlay

Component Search

The search bar (⌘K) provides fuzzy search across all component names and tags, allowing you to quickly navigate to any component in the gallery.

Accessibility Audit (A11y)

The A11y tab runs accessibility checks on the rendered component, reporting issues based on WAI-ARIA best practices.

Visual Regression Testing (VRT)

The VRT tab provides visual regression testing capabilities, allowing you to capture and compare component snapshots across changes.

VS Code Support

The Vize Art VS Code extension provides syntax highlighting for *.art.vue files, making it easier to author story files with proper syntax support.

AI Integration

Musea integrates with AI assistants through the MCP server. The MCP server exposes component metadata, story information, and gallery navigation to AI tools, enabling:

  • AI-assisted component discovery and usage

  • Automated documentation generation

  • Intelligent code generation with correct props and slots