ray-menuray-menu

Styling

Customize the appearance of Ray Menu

Styling

Ray Menu uses CSS custom properties (variables) for theming, making it easy to customize the appearance.

CSS Variables

VariableDefaultDescription
--ray-menu-bg#ffffffBackground color
--ray-menu-bg-hover#f3f4f6Hover background
--ray-menu-text#1f2937Text color
--ray-menu-text-muted#6b7280Muted text color
--ray-menu-border#e5e7ebBorder color
--ray-menu-highlight#3b82f6Highlight/accent color
--ray-menu-radius12pxBorder radius
--ray-menu-shadow0 10px 40px rgba(0,0,0,0.15)Box shadow
--ray-menu-size200pxMenu diameter
--ray-menu-item-gap4pxGap between items

Basic Theming

ray-menu {
  --ray-menu-bg: #1a1a2e;
  --ray-menu-text: #eaeaea;
  --ray-menu-highlight: #e94560;
  --ray-menu-border: #16213e;
}

Dark Mode

Ray Menu automatically respects prefers-color-scheme:

@media (prefers-color-scheme: dark) {
  ray-menu {
    --ray-menu-bg: #1f2937;
    --ray-menu-text: #f9fafb;
    --ray-menu-border: #374151;
    --ray-menu-bg-hover: #374151;
  }
}

Or use a class-based approach:

.dark ray-menu {
  --ray-menu-bg: #1f2937;
  --ray-menu-text: #f9fafb;
}

React Inline Styles

Pass CSS variables via the style prop:

<RayMenu
  style={
    {
      "--ray-menu-bg": "#1a1a2e",
      "--ray-menu-highlight": "#e94560",
    } as React.CSSProperties
  }
>
  {/* items */}
</RayMenu>

Sizing

Control the menu size:

ray-menu {
  --ray-menu-size: 250px; /* larger menu */
}

Or per-instance:

<ray-menu style="--ray-menu-size: 180px">
  <!-- compact menu -->
</ray-menu>

Custom Icons

Style icon slots:

ray-menu-item [slot="icon"] {
  width: 20px;
  height: 20px;
  fill: currentColor;
}

ray-menu-item:hover [slot="icon"] {
  fill: var(--ray-menu-highlight);
}

Animation

Customize transitions:

ray-menu {
  --ray-menu-transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}

Bubble Variant

When using variant="bubble", additional CSS variables are available:

VariableDefaultDescription
--ray-bubble-fillrgba(50, 50, 60, 0.7)Bubble background
--ray-bubble-fill-hoverrgba(100, 180, 255, 0.5)Bubble hover fill
--ray-bubble-strokergba(255, 255, 255, 0.15)Bubble border
--ray-bubble-stroke-hoverrgba(100, 180, 255, 0.8)Bubble hover border
ray-menu[variant="bubble"] {
  --ray-bubble-fill: rgba(30, 30, 50, 0.8);
  --ray-bubble-fill-hover: rgba(255, 107, 107, 0.5);
  --ray-bubble-stroke-hover: rgba(255, 107, 107, 0.8);
}

Bubble Submenu Styles

When a bubble submenu is open, parent-level bubbles are dimmed and the selected parent is highlighted. These states use data attributes that can be targeted with CSS:

SelectorDescription
.ray-menu-bubble[data-dimmed="true"]Dimmed parent bubble (opacity: 0.3)
.ray-menu-bubble[data-selected="true"]Selected parent bubble (highlighted)
.ray-menu-bubble[data-submenu="true"]Submenu child bubble (animated in)
.ray-menu-connectorDashed connector line

The submenu entry animation (ray-bubble-pop) can be customized:

ray-menu .ray-menu-bubble[data-submenu="true"] {
  animation-duration: 300ms;
}

Examples

Minimal Theme

ray-menu.minimal {
  --ray-menu-bg: transparent;
  --ray-menu-border: transparent;
  --ray-menu-shadow: none;
  --ray-menu-text: #333;
}

Glassmorphism

ray-menu.glass {
  --ray-menu-bg: rgba(255, 255, 255, 0.1);
  --ray-menu-border: rgba(255, 255, 255, 0.2);
  --ray-menu-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
  backdrop-filter: blur(10px);
}

On this page