Skip to content

Long-press Radial Menu

A copy-paste mobile patterns component in pure HTML & CSS. Zero dependencies, framework-agnostic, MIT-licensed.

Mobile PatternsHTMLCSSany framework

Copy into your project

HTML
<div class="nuda-radial" role="menu" aria-label="Quick actions">
  <button type="button" class="nuda-radial__item" style="--angle:270deg" aria-label="Reply">…</button>
  <button type="button" class="nuda-radial__item" style="--angle:342deg" aria-label="Like">…</button>
  <button type="button" class="nuda-radial__item" style="--angle:54deg" aria-label="Star">…</button>
  <button type="button" class="nuda-radial__item" style="--angle:126deg" aria-label="Trash">…</button>
  <button type="button" class="nuda-radial__item" style="--angle:198deg" aria-label="Share">…</button>
  <div class="nuda-radial__center" aria-hidden="true"></div>
</div>
CSS
/* Long-press Radial Menu
   Ring of action buttons that emerge from a glowing center.
   Customize: --radial-accent, --radial-radius */

.nuda-radial {
  --radial-accent: #e4ff54;
  --radial-radius: 72px;
  position: relative;
  width: 200px;
  height: 200px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: system-ui;
}

.nuda-radial__center {
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: var(--radial-accent);
  box-shadow:
    0 0 0 10px rgba(228, 255, 84, 0.1),
    0 0 0 22px rgba(228, 255, 84, 0.05),
    0 0 24px rgba(228, 255, 84, 0.4);
  animation: nuda-radial-pulse 2s ease-in-out infinite;
}

.nuda-radial__item {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: 1px solid rgba(255, 255, 255, 0.1);
  background: #111114;
  color: #fafafa;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transform: translate(-50%, -50%)
    rotate(var(--angle))
    translateY(calc(-1 * var(--radial-radius)))
    rotate(calc(-1 * var(--angle)))
    scale(0.4);
  opacity: 0;
  animation: nuda-radial-pop 0.55s cubic-bezier(0.22, 1, 0.36, 1) forwards;
  animation-delay: 0.05s;
}

.nuda-radial__item:hover { background: #1a1a20; }

@keyframes nuda-radial-pop {
  to {
    transform: translate(-50%, -50%)
      rotate(var(--angle))
      translateY(calc(-1 * var(--radial-radius)))
      rotate(calc(-1 * var(--angle)))
      scale(1);
    opacity: 1;
  }
}

@keyframes nuda-radial-pulse {
  0%, 100% { transform: scale(1); }
  50% { transform: scale(0.92); }
}

@media (prefers-reduced-motion: reduce) {
  .nuda-radial__item,
  .nuda-radial__center { animation: none; }
  .nuda-radial__item { opacity: 1; }
}

How to use Long-press Radial Menu

Paste the HTML where you need it and the CSS into a global stylesheet (or a <style> tag). Every class is prefixed nuda- so it never collides with Tailwind or your own styles. Tweak the CSS custom properties to match your design system.

Works in React, Vue, Svelte, Astro, Next.js, Nuxt, Laravel Blade, Django, Rails — or a single .html file. No npm install, no build step.

More mobile patterns components

← Browse all NudaUI components