Vue 3 frontend framework for building specialized back-office applications on VirtoCommerce Platform.
vc-shell is a monorepo containing the core UI framework, CLI tools, shared configs, and reference applications for VirtoCommerce back-office development. It provides a complete Vue 3 design system, a blade-based navigation paradigm, and a dynamic module system for building extensible admin applications.
- Overview
- Tech Stack
- Monorepo Structure
- Getting Started
- Development
- Testing PR Previews
- Local Development via
portal:Protocol - Architecture
- Component Library
- Documentation
- Contributing
- License
- Blade Navigation β stacked panel navigation with
useBlade()composable for opening, closing, and communicating between blades - Component Library β Atomic Design hierarchy (atoms, molecules, organisms) with Tailwind CSS styling
- Dynamic Module System β runtime-loaded Vue plugins with semver compatibility and extension points
- VcDataTable β compositional table with declarative
<VcColumn>API, virtual scroll, column switching, global filters, drag-and-drop reorder, and state persistence - Rich Text Editor β Tiptap-based editor with tables, images, links, and markdown support
- Dashboard & Widgets β grid-based dashboard with GridStack, customizable widget system
- Responsive Design β mobile-first with dedicated mobile component variants
- i18n β built-in internationalization via vue-i18n
- Core Composables β reusable logic for API clients, assets, notifications, settings, permissions, and more
| Layer | Technology |
|---|---|
| Framework | Vue 3 (Composition API, <script setup>) |
| Language | TypeScript (strict mode) |
| Build | Vite 6 |
| Styling | Tailwind CSS (tw- prefix) + SCSS custom properties |
| Package Manager | Yarn 4 Berry (workspaces) |
| Testing | Vitest + Vue Test Utils |
| Storybook | Storybook 10 |
| Linting | ESLint 9 + Prettier |
| Charts | Unovis |
| Forms | VeeValidate |
vc-shell/
βββ framework/ # @vc-shell/framework β main UI library
β βββ core/ # API clients, composables, plugins, services
β β βββ api/ # Generated API clients
β β βββ composables/ # Composables (useBlade, useAsync, etc.)
β β βββ plugins/ # Modularity, extensions, AI agent
β β βββ services/ # Menu, Dashboard, Toolbar, GlobalSearch
β βββ ui/ # Vue components (Atomic Design)
β β βββ components/
β β βββ atoms/ # Base components (Button, Badge, Icon...)
β β βββ molecules/ # Form & interactive components (Input, Select, Editor...)
β β βββ organisms/ # Complex components (Table, Blade, Gallery...)
β βββ shell/ # App chrome: sidebar, auth, dashboard, settings
β βββ modules/ # Built-in modules (assets, assets-manager)
β βββ assets/styles/ # SCSS theme & CSS custom properties
β
βββ cli/ # CLI tools
β βββ api-client/ # @vc-shell/api-client-generator
β βββ create-vc-app/ # @vc-shell/create-vc-app β project scaffolder
β βββ migrate/ # @vc-shell/migrate β migration tool
β βββ vc-app-skill/ # @vc-shell/vc-app-skill β AI-assisted app generation
β
βββ configs/ # Shared configurations
β βββ ts-config/ # @vc-shell/ts-config
β βββ vite-config/ # @vc-shell/config-generator
β
βββ packages/ # Module Federation packages
β βββ mf-config/ # @vc-shell/mf-config
β βββ mf-host/ # @vc-shell/mf-host
β βββ mf-module/ # @vc-shell/mf-module
β
βββ apps/ # Apps for local framework development & debugging
β βββ ... # Place vc-shell apps here (see "Local Development via portal: Protocol")
β
βββ .storybook/ # Storybook configuration
- Node.js >= 22
- Yarn 4.x (Corepack:
corepack enable)
There are two official workflows for creating vc-shell applications:
- CLI scaffolder (
@vc-shell/create-vc-app) β deterministic project bootstrap from templates - AI skill (
@vc-shell/vc-app-skill) β intent-driven app and module generation in AI coding tools
Create a new project interactively:
npx @vc-shell/create-vc-app my-appOr use non-interactive flags:
npx @vc-shell/create-vc-app my-app --type standalone --module-name "Products" --dashboard --mocksAdd a module to an existing app:
npx @vc-shell/create-vc-app add-module ordersSee full options and project types in cli/create-vc-app/README.md.
Install skill runtime:
# Claude Code runtime (default)
npx @vc-shell/vc-app-skill@alpha install
# Codex runtime
npx @vc-shell/vc-app-skill@alpha install --runtime codexRestart your AI tool session, then use slash commands in your app workspace:
/vc-app create
/vc-app connect
/vc-app generate
/vc-app add-module orders
See full command reference in cli/vc-app-skill/README.md.
# Clone the repository
git clone https://github.com/VirtoCommerce/vc-shell.git
cd vc-shell
# Install dependencies (also sets up Husky git hooks)
yarn install
# Build all packages
yarn buildyarn build # Build all publishable packages
yarn build:framework # Build only @vc-shell/framework (hidden source maps)
yarn build:framework:debug # Build framework with full source maps (browser auto-loads)
yarn build:analyze # Build with bundle analyzer
yarn build:cli:config # Build @vc-shell/config-generator
yarn build:cli:api-client # Build @vc-shell/api-client-generator
yarn build:cli:create-vc-app # Build @vc-shell/create-vc-appyarn dev:storybook # Storybook dev server at :6006yarn test # Run tests (single run, CI-friendly)
yarn test:watch # Run tests in watch mode (interactive)
yarn test:unit # Run unit tests against framework/vitest.config
yarn test:coverage # Tests with coverage report
yarn test:storybook # Run Storybook interaction tests
yarn test:snapshot:update # Update Storybook snapshotsyarn lint # ESLint with --fix (dev)
yarn lint:check # ESLint verification (CI)
yarn format # Prettier --write (dev)
yarn format:check # Prettier verification (CI)
yarn stylelint # Stylelint --fix (dev)
yarn stylelint:check # Stylelint verification (CI)
yarn typecheck # Framework type check
yarn check # Umbrella: all verifications (lint + format + stylelint + typecheck + locales + circular + layers)yarn check:locales # Validate locale files
yarn check:circular # Detect circular dependencies (madge)
yarn check:layers # Enforce layer dependency directionGenerate TypeScript API clients from VirtoCommerce Platform modules:
yarn generate:api-clientSee RELEASING.md for the release process.
yarn release:dry # Dry run (preview changes)yarn clean # Remove all node_modules + dist directories
yarn changed # List commits since last release tag
yarn diff # Diff stats since last release tagEvery push to a PR in this repository automatically publishes preview versions of all managed packages to npm with a pr-<N> dist-tag. The preview workflow comments on the PR with install instructions.
Install a PR preview in a consuming project:
npm install @vc-shell/framework@pr-<N>See CONTRIBUTING.md β Testing PR Previews for details, including the fork-PR caveat and exact-commit install pattern.
This repository supports one local-linking approach: Yarn portal:.
If your app lives outside this monorepo and you want to debug against a local build of @vc-shell/framework without moving the app.
Quick setup β drop your app into apps/<name>/ (this directory is gitignored and not a Yarn workspace) and run:
yarn setup:appsThe script rewrites every @vc-shell/* dependency in the app's package.json to a portal: path pointing at the matching package in this repository, enables preserveSymlinks in app tsconfig and Vite config, stores a rollback snapshot at .vc-shell/setup-apps-backup.json, and runs yarn install inside the app directory. After setup, start the app from its own directory (cd apps/<name> && yarn dev).
To rollback app coupling and restore original files:
yarn unsetup:appsManual setup (same flow in full detail):
-
Build framework locally in the vc-shell clone:
yarn build:framework
The
portal:protocol symlinks to the package directory β it does not build on demand. Re-runyarn build:frameworkafter each framework change (no watch mode yet). -
Replace the
@vc-shell/*entries in your app'spackage.jsonwith absoluteportal:paths to the corresponding packages in this repository:{ "dependencies": { "@vc-shell/framework": "portal:/absolute/path/to/vc-shell/framework", "@vc-shell/config-generator": "portal:/absolute/path/to/vc-shell/configs/vite-config", "@vc-shell/api-client-generator": "portal:/absolute/path/to/vc-shell/cli/api-client" } }Include every
@vc-shell/*package the app actually imports β portal entries are not auto-discovered like workspace deps. -
Enable preserveSymlinks on the app side so the app's bundler and TypeScript follow the portal symlink back to the real package on disk. Skipping this creates two copies of Vue (one through the symlink, one through the app's own
node_modules), breaking reactivity with warnings like "Vue has already been registered".If you used
yarn setup:apps, this step is applied automatically.In the app's
tsconfig.json:{ "compilerOptions": { "preserveSymlinks": true } }In the app's Vite config:
export default defineConfig({ resolve: { preserveSymlinks: true, }, });
-
Match peer-dependency versions. The portal-linked framework brings its own
node_modules/; if the app has a differentvueorvue-routerversion, you still end up with dual instances. Verify with:# Inside the app yarn why vue # Inside the vc-shell clone yarn why vue
Both commands should report the same version. If they diverge, bump the app's
package.jsonto match the vc-shell framework peer range. -
Install and run the app as usual:
yarn install yarn dev # or whatever the app's dev script is called
- "Vue has already been registered" / lost reactivity β
preserveSymlinksis not enabled on either Vite or TypeScript. Check both configs. - Changes in
framework/not reflected in the app βportal:doesn't trigger rebuilds. Runyarn build:frameworkin the vc-shell clone after edits, then restart the app's dev server (Vite HMR may not pick up changes to symlinkeddist/). - Type errors after rebuild β stale
.tsbuildinfoordist/remnants. Clean vc-shell withyarn clean(and rebuild) before retrying. - Yarn refuses to install with lockfile conflicts β the app's
yarn.lockmay reference npm-registry versions of@vc-shell/*. Delete the app'syarn.lockand re-runyarn installso Yarn re-resolves through portal entries.
The framework build always generates .map files so source maps are available when you need them:
| Build command | Source maps | Browser auto-loads? |
|---|---|---|
yarn build:framework |
Hidden (.map files generated, no sourceMappingURL in bundle) |
No |
yarn build:framework:debug |
Full (.map files + sourceMappingURL comment) |
Yes |
For local debugging, use yarn build:framework:debug β Chrome DevTools will automatically load source maps and show original TypeScript/Vue sources.
For production builds, .map files are still generated (hidden mode) but not referenced from the bundle. To use them, open Chrome DevTools β Sources tab, right-click the JS file β "Add source map...", and point to the .map file.
See CONTRIBUTING.md for development setup, workflow, and PR requirements.
vc-shell follows a blade-first modular architecture:
- Blade Navigation β stacked panel UX with context-aware navigation and blade-to-blade messaging
- Module Runtime β modules are Vue plugins that register blades, locales, and notification contracts
- Extension Points β cross-module composition via named slots and registration APIs
For implementation details, patterns, and code examples, see:
The framework follows Atomic Design methodology:
VcBadge VcBanner VcButton VcCard VcContainer VcHint VcIcon VcImage VcLabel VcLink VcLoading VcProgress VcSkeleton VcStatus VcTooltip and more
VcInput VcSelect VcDatePicker VcEditor VcFileUpload VcCheckbox VcRadioGroup VcSwitch VcSlider VcAccordion VcDropdown VcPagination VcTextarea VcMultivalue VcColorInput VcInputCurrency and more
VcBlade VcDataTable VcGallery VcImageUpload VcPopup VcSidebar VcApp VcAuthLayout VcDynamicProperty
Explore all components interactively: Storybook
| Resource | Description |
|---|---|
| Storybook | Interactive component explorer |
| ARCHITECTURE.md | Architecture guide and patterns |
| create-vc-app README | Scaffolder usage and flags |
| vc-app-skill README | AI skill commands for app/module generation |
| WHATS_NEW.md | v2.0.0 feature highlights |
| MIGRATION_GUIDE.md | Migration from v1 to v2 |
| RELEASING.md | Release process documentation |
| CHANGELOG.md | Full changelog |
Copyright (c) Virto Solutions LTD. Licensed under the Virto Commerce Open Software License.