Vanilla UI Kit

Single-file, zero-dependency UI components for vanilla JavaScript. Drop in one script tag — no build step, no framework. Beautiful by default, automatic light/dark, fully keyboard-accessible, headless when you want.

GitHub
<script src="https://cdn.jsdelivr.net/gh/vanilla-ui-kit/components/dist/vanilla-ui-kit.js"></script>
<script>
  new DatePicker('#date')
  Toast.success('Saved')
</script>

Components

Every component is one standalone file — use one, some, or the whole family. Together they share one theme engine, one positioning engine, one line of unified theming.

DatePicker

Date picker

Single, range, multi-pane, presets, min/max, disabled dates. Follows your page's theme on its own.

Toast

Toasts / notifications

Stacked notifications with actions, promise tracking, hover-pause, and six positions.

Tooltip

Tooltips / popovers

Hover, click, focus or manual triggers, four placements with auto-flip, interactive panels.

Menu

Dropdown / context menus

Action menus with icons, hints, submenus, typeahead, and one-shot context menus at any coordinates.

Modal

Modals / dialogs

Native <dialog> top layer, focus management, and promise-based alert, confirm, and prompt.

Tabs

Tabs

Enhance your markup or build from data. Roving tabindex, arrow keys, animated indicator.

Select

Select / combobox

The styleable select. Search, multiple with tags, groups — and your native form keeps working.

CommandPalette

Command palette

Ctrl/⌘+K. Fuzzy matching with highlights, groups, recents, and a zero-setup static registry.

Form

Forms

Reactive values and errors, async validation, fetch submission with server error mapping, and a silent honeypot built in.

PhoneInput

Phone input

International phone field: SVG flags, searchable country dropdown, as-you-type formatting, validation, E.164 output.

Drawer

Drawers / side sheets

Slide-in panels from any side on the same native-dialog machinery as Modal.

Autocomplete

Autocomplete / typeahead

Free-text suggestions from arrays or async sources, race-safe, with match highlighting.

Slider

Slider

Single and dual-thumb ranges with marks, tooltips, and full keyboard support.

Popconfirm

Popconfirm

Inline are-you-sure anchored to the button. A promise, not a modal.

Segmented

Segmented control

The modern radio group with an animated sliding thumb.

Upload

File upload / dropzone

Drag-and-drop, paste, image previews, per-file progress with retry.

NumberInput

Number / currency input

Thousands grouping while you type, steppers with acceleration, raw values for forms.

Progress

Progress / skeletons

Bars, spinners, and shimmering skeleton placeholders that restore what they cover.

Pagination

Pagination

Constant-width ellipsis logic, go-to jump, and totals — the data-page workhorse.

EmptyState

Empty states

Icon, title, description, action — the screen every app forgets to design.

Rating

Rating

Stars or hearts, half-steps, fractional averages, keyboard accessible.

The contract

Every component keeps the same promises.

One file eachUMD, ES5, SSR-safe. CDN, npm, or copy-paste.
Zero dependenciesNo framework, no build step, nothing else to load.
Headless when you wantstyles: false injects nothing; bring your own CSS.
Converging, not coupledWith the optional core: one theme engine, one config call.
AccessibleWAI-ARIA patterns, full keyboard support, reduced motion.
IsolatedA salt namespace keeps host-page CSS from breaking things.
// One call themes the whole family:
VC.config({ theme: 'dark', accent: '#b45309', radius: '10px' })