Gooey Actions
motiq/gooey-actionsFreeComponent
A floating action button that blooms into satellite actions through a gooey metaball merge - blur plus alpha contrast under the hood - with underdamped springs (~18% overshoot, 45ms stagger) and per-satellite magnetic hover. Crisp icons ride an unfiltered twin layer sharing the same transforms. Real buttons with menu semantics, roving focus, and Escape-to-close; instant fade under reduced motion.
Live preview
live · rendered by the registry
Rendered by motiq on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://www.motiq.dev/r/gooey-actions.jsonSource
1"use client";23import * as React from "react";45import { cn } from "@/lib/utils";6import { useControllableState, useReducedMotion, useVisibilityPause } from "@/lib/motiq";78/* -------------------------------------------------------------------------- */9/* Types */10/* -------------------------------------------------------------------------- */1112export interface GooeyAction {13 /** Stable id passed back to `onSelect`. */14 id: string;15 /** Accessible name + hover/focus label chip text. */16 label: string;17 /** Optional glyph (an inline `<svg>` works best); falls back to the label initial. */18 icon?: React.ReactNode;19}2021export interface GooeyActionsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onSelect"> {22 /** The satellite actions — 3–6 read best in the arc. */23 actions: GooeyAction[];24 /** Distance from the core to each satellite, in px. */25 radius?: number;26 /** Arc the satellites spread across, in degrees (screen space, −90° is up). */27 arc?: [number, number];28 /** Per-satellite launch delay, in ms. */29 stagger?: number;30 /** Bloom spring stiffness (underdamped by design — the goo necks, then snaps). */31 stiffness?: number;32 /** Bloom spring damping. */33 damping?: number;34 /** Pointer distance, in px, within which a satellite leans toward the cursor. */35 magnetRange?: number;36 /** Accessible name for the core button and its menu. */37 label?: string;38 /** Controlled open state. */39 open?: boolean;40 /** Uncontrolled initial open state. */41 defaultOpen?: boolean;42 /** Fired whenever the bloom opens or closes. */43 onOpenChange?: (open: boolean) => void;44 /** Fired with the action id when a satellite is committed. */45 onSelect?: (id: string) => void;46 /** Tease the bloom every ~7s until the first interaction. */47 autoPeek?: boolean;48 /** Deterministic seed for the ambient ember phase (SSR-stable). */49 seed?: number;50 /** Stop the rAF loop when scrolled offscreen or the tab is hidden. */51 pauseWhenHidden?: boolean;52 /** Force the static, motion-free variant regardless of system preference. */53 reducedMotion?: boolean;54}5556/* -------------------------------------------------------------------------- */57/* Physics */58/* -------------------------------------------------------------------------- */5960interface Spring {61 x: number;62 v: number;63}6465// … truncated
What it pulls in
Other registry items
Files it writes
More from motiq
All 100 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Activity Streamactivity-stream | motiq | Components | Free | 1 dep | |
| Adaptive Safe-Zone Gridadaptive-safe-zone-grid | motiq | Components | Free | no deps | |
| Agent Run Timelineagent-run-timeline | motiq | Components | Free | 1 dep | |
| AI Response Streamai-response-stream | motiq | Components | Free | 1 dep | |
| Animated Accordionanimated-accordion | motiq | Components | Free | 2 deps | |
| Animated Buttonanimated-button | motiq | Components | Free | 1 dep | |
| Animated Dialoganimated-dialog | motiq | Components | Free | 2 deps | |
| Animated Gridanimated-grid | motiq | Components | Free | 2 deps |
