Skip to main content
vd3
  • Home
  • Docs
  • Foundation
  • Color palette
  • Typography
  • Icons
  • Golden ratio
  • Grid system
  • Shadows & glow
  • Theme
  • Theme switcher
  • Theme customizer
  • Core
  • Button
  • Badge
  • Alert
  • Card
  • Dropdown
  • Menu
  • Popover
  • Doc Search
  • Floating Action Button
  • Ripple
  • Expanding Cards
  • Spotlight
  • Timeline
  • Template
  • Navigation
  • Feedback
  • Modal
  • Toast
  • Tooltip
  • Chip
  • Skeleton
  • Preloader
  • Data display
  • Avatar
  • Table
  • Collection
  • Breadcrumb
  • Interactive
  • Tabs
  • Accordion
  • Flow
  • Draggable
  • Search
  • Canvas
  • Charts
  • Flowchart
  • Hex Grid
  • Draw
  • Media
  • Music Player
  • Image Box
  • Editors
  • Code Editor
  • Effects
  • Glass
  • Morph
  • Parallax
  • Forms
  • Form controls
  • Form validation
  • Datepicker
  • Timepicker
  • Rating
  • Switch
  • Slider
  • Stepper
  • Autocomplete
  • Transfer
  • Tree
  • Pagination
  • Button group
  • Primitives
  • Progress
  • Spinner
  • Code snippet
  • Icon
  • Layout
  • Primitives
  • Separator
  • Sidenav
  • Sticky
  • Waypoint (Scrollspy)
  • Off-canvas
  • Navbar
  • Footer
Dropdown

Toggleable contextual overlays for displaying lists of links, actions, or custom content. Dropdowns support directional placement, glass styling, split buttons, and dark mode out of the box.

Basic Dropdown
  • Edit
  • Duplicate
  • Archive
  • Delete
<!-- Basic dropdown -->
<div class="vd-dropdown">
  <button class="vd-btn vd-btn-primary vd-dropdown-toggle" data-vd-dropdown-toggle>
    Actions <i class="ph ph-caret-down"></i>
  </button>
  <ul class="vd-dropdown-menu">
    <li><a class="vd-dropdown-item" href="#">Edit</a></li>
    <li><a class="vd-dropdown-item" href="#">Duplicate</a></li>
    <li><a class="vd-dropdown-item" href="#">Archive</a></li>
    <li><div class="vd-dropdown-divider"></div></li>
    <li><a class="vd-dropdown-item vd-dropdown-item-danger" href="#">Delete</a></li>
  </ul>
</div>
Split Button & Glass
  • Save & Publish
  • Save as Draft
  • Profile
  • Settings
<!-- Split button: primary action + caret -->
<div class="vd-dropdown vd-dropdown-split">
  <button class="vd-btn vd-btn-primary">Save</button>
  <button class="vd-btn vd-btn-primary vd-dropdown-toggle" data-vd-dropdown-toggle aria-label="Save options">
    <i class="ph ph-caret-down"></i>
  </button>
  <ul class="vd-dropdown-menu">
    <li><a class="vd-dropdown-item" href="#">Save & Publish</a></li>
    <li><a class="vd-dropdown-item" href="#">Save as Draft</a></li>
  </ul>
</div>

<!-- Glass variant -->
<div class="vd-dropdown vd-dropdown-glass">
  <button class="vd-btn vd-btn-outline vd-dropdown-toggle" data-vd-dropdown-toggle>
    Glass Menu <i class="ph ph-caret-down"></i>
  </button>
  <ul class="vd-dropdown-menu">
    <li><a class="vd-dropdown-item" href="#">Profile</a></li>
    <li><a class="vd-dropdown-item" href="#">Settings</a></li>
  </ul>
</div>
Placement Variants
  • Item
  • Another
  • Item
  • Item
<!-- Dropup (opens above) -->
<div class="vd-dropdown vd-dropdown-dropup">
  <button class="vd-btn vd-dropdown-toggle" data-vd-dropdown-toggle>Dropup</button>
  <ul class="vd-dropdown-menu"><li><a class="vd-dropdown-item" href="#">Item</a></li></ul>
</div>

<!-- Dropright (opens to the right) -->
<div class="vd-dropdown vd-dropdown-dropright">
  <button class="vd-btn vd-dropdown-toggle" data-vd-dropdown-toggle>Dropright</button>
  <ul class="vd-dropdown-menu"><li><a class="vd-dropdown-item" href="#">Item</a></li></ul>
</div>

<!-- Static alignment override -->
<div class="vd-dropdown">
  <button class="vd-btn vd-dropdown-toggle" data-vd-dropdown-toggle>End-aligned</button>
  <ul class="vd-dropdown-menu vd-dropdown-menu-end">
    <li><a class="vd-dropdown-item" href="#">Item</a></li>
  </ul>
</div>
Engine wiring
import { ref } from 'vue';
import { useDropdown } from "@vanduo-oss/vd3";

const root = ref<HTMLElement | null>(null);
const dropdown = useDropdown(root);   // wires every .vd-dropdown inside root; cleanup on unmount

// Programmatic control via the returned controller
dropdown.open('#my-dropdown');   // pass a selector (resolved inside root) or the element
API Reference

Modifier classes

ClassDescription
.vd-dropdownRoot container. Holds toggle + menu.
.vd-dropdown-toggleClickable trigger (button or anchor). `data-vd-dropdown-toggle` is also accepted.
.vd-dropdown-menuThe menu element. Visibility toggled via `.is-open`.
.vd-dropdown-itemA menu item. Disabled variants: `.is-disabled` / `.disabled`.
.vd-dropdown-dividerHorizontal rule between item groups.
.vd-dropdown-item-dangerItem styled as destructive action.
.vd-dropdown-splitContainer modifier: split-button variant (action + caret toggle).
.vd-dropdown-glassContainer modifier: glass-styled menu (uses `--vd-glass-*` tokens).
.vd-dropdown-dropupContainer modifier: opens upward instead of downward.
.vd-dropdown-dropright / .vd-dropdown-dropleftContainer modifier: horizontal placement.
.vd-dropdown-menu-end / .vd-dropdown-menu-start / .vd-dropdown-menu-topAuto-applied to position the menu; can also be set statically.

Base classes

ClassDescription
.vd-dropdownContainer with `position: relative`. Click capture boundary.
.vd-dropdown-toggleButton with caret; receives `aria-haspopup="true"` and `aria-expanded` toggling.
.vd-dropdown-menuAbsolute-positioned menu, hidden by default, fade-in on `.is-open`.
.vd-dropdown-itemBlock-level link/button. Focusable. Hover/focus highlight via `--vd-color-primary-rgb`.
.vd-dropdown-divider1px line via `--vd-border-color`; vertical margin uses Fibonacci scale.
.vd-dropdown-item-dangerForeground `--vd-color-red-6` / `--vd-color-red-5`; signals destructive action.

CSS Variables

VariableDefaultDescription
--vd-dropdown-bgvar(--vd-color-gray-0)Menu background
--vd-dropdown-textvar(--vd-color-gray-9)Menu foreground
--vd-dropdown-border-colorvar(--vd-border-color)Menu border
--vd-dropdown-radiusvar(--vd-border-radius)Menu corner radius
--vd-dropdown-shadowvar(--vd-shadow-md)Menu elevation shadow
--vd-dropdown-min-width12remMenu minimum width
--vd-dropdown-padding0.5remItem vertical/horizontal padding
--vd-dropdown-z-index1050Stacking above page content
Accessibility
  • Trigger carries aria-haspopup="true" and toggles aria-expanded.
  • Menu carries role="menu" and aria-hidden mirroring its open state.
  • Arrow keys cycle items, Home/End jump, Escape closes, typeahead jumps to the first matching label.
  • Focus is restored to the trigger when the menu closes.

vd3ui

Quick Links

  • Home
  • Docs
  • Changelog
  • About

Resources

  • GitHub
  • NPM
  • Kilo OSS
  • License

2026, Vanduo UI. MIT License.