Vanduo is a zero-dependency UI framework built with HTML, CSS, and vanilla JavaScript. It ships a full component bundle, scoped runtime initialization, and a strict canonical --vd-* token API.
- Zero runtime dependencies
- 47+ components across layout, navigation, overlays, search, and effects
- Scoped runtime APIs for dynamic DOM work
- Strict design token API under
--vd-* - Built-in dark, light, and system theming
- Theme customizer with color, font, and radius controls
- Theme Switcher menu variant for icon-only light/dark/system selection in navbars
- Playwright-based browser coverage across Chromium, Firefox, and WebKit
- Leaner default CSS —
css/vanduo.cssnow bundles theregular+fillicon weights only (~45% smaller minified CSS). Need all six weights? Importcss/icons/icons-all.css. - No-icons core build — new
dist/vanduo-core.min.css(@vanduo-oss/framework/css/core) drops the bundled icons entirely (~123 KB lighter) for consumers who ship their own icon set. - Smaller package — the build ships only the icon weights the bundle actually uses into
dist/icons/, instead of all six. - TypeScript types — a hand-written
dist/vanduo.d.tsfor theVanduoruntime, exposed via thetypesfield. - In-repo changelog — a new CHANGELOG.md (Keep a Changelog), now validated by
check:versions. - Version-consistency now covers prose —
pnpm check:versionsvalidates README,SECURITY.md,llms.txt, andCHANGELOG.md, not just the dist banners. - Lint guard — raw
innerHTMLassignment is now flagged by ESLint outside the sanitization helpers. - Parallax & print fixes (now tested) — speed/direction classes and the print stylesheet's hide-list now use the canonical
vd-prefix, with new Playwright regression specs; removed the unused internaldoc-tabsstyles from the bundle.
- Rounded-corner background fixes — draggable surfaces and input-group addons use
background-clip: padding-boxso opaque fills no longer bleed past border arcs at largedata-radiuspresets. - Background-clip audit — Playwright
@auditharness attests/audit/background-clip-audit.spec.tsfor regression checks. - Normative API: openspec/specs/draggable/spec.md.
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.4.6/dist/vanduo.min.css">
<script src="https://cdn.jsdelivr.net/gh/vanduo-oss/framework@v1.4.6/dist/vanduo.min.js"></script>
<script>
Vanduo.init();
</script>Production tip: harden CDN tags with Subresource Integrity — add
integrity="sha384-…" crossorigin="anonymous". Copy the hash from jsdelivr.com (per-file "SRI" button) or generate it withopenssl dgst -sha384 -binary dist/vanduo.min.js | openssl base64 -A.
<link rel="stylesheet" href="dist/vanduo.min.css">
<script src="dist/vanduo.min.js"></script>
<script>
Vanduo.init();
</script>pnpm add @vanduo-oss/frameworkimport '@vanduo-oss/framework/css';
import { Vanduo } from '@vanduo-oss/framework';
Vanduo.init();Vanduo.init(root);
Vanduo.initComponents(root);
Vanduo.reinit('lazyLoad', root);
Vanduo.destroy(root);
Vanduo.destroyAll();
Vanduo.getComponent('docSearch');- Omit
rootto target the full document. - Pass an
Elementto initialize or destroy only a subtree. - Canonical component registry names use
lowerCamelCase. LazyLoadremains available as a compatibility alias forlazyLoadin1.4.x.
Vanduo 1.4.1 treats --vd-* as the only shipped custom-property namespace:
- Palette:
--vd-red-*,--vd-primary-*,--vd-gray-*, and related scales - Colors:
--vd-color-* - Backgrounds:
--vd-bg-* - Text:
--vd-text-* - Borders:
--vd-border-* - Shadows:
--vd-shadow-* - Components/effects:
--vd-btn-*,--vd-card-*,--vd-morph-*, and related internals
Legacy unprefixed token aliases were removed in 1.4.1; update custom themes and overrides to use the --vd-* equivalents.
.cta {
color: var(--vd-text-inverse);
background: var(--vd-color-primary);
border-color: var(--vd-border-color);
}More detail lives in TOKENS.md.
css/vanduo.cssremains the main framework entrypoint in1.4.1.- The main bundle still includes framework-wide form defaults for native inputs and textareas.
- New component styling should prefer
.vd-*hooks over new raw element selectors.
framework/
├── css/ # Foundation, utilities, effects, components
├── js/ # Runtime, lifecycle, components
├── dist/ # Built artifacts
├── tests/ # Playwright fixtures and specs
├── scripts/ # Build, verification, and inventory scripts
├── openspec/ # Spec-driven change proposals and component specs
└── docs/*.md # Release and architecture notes
corepack enable
pnpm install
pnpm run lint
pnpm run build
pnpm run check:versions
pnpm test
pnpm run stats:cssCI runs Chromium Desktop smoke tests on pull requests and the full cross-browser Playwright matrix on push to main (see .github/workflows/tests.yml and QA-Automation-Strategy.md).
- Changelog: CHANGELOG.md
- Architecture notes: ARCHITECTURE.md
- Token model: TOKENS.md
- Theme Switcher spec: openspec/specs/theme-switcher/spec.md
- Draggable spec: openspec/specs/draggable/spec.md
- Changelog policy: openspec/specs/changelog/spec.md
- QA strategy: QA-Automation-Strategy.md
- Contributor workflow: CONTRIBUTING.md
MIT - see LICENSE.
Third-party notices are listed in THIRD-PARTY-LICENSES.