Calamansi UI: Animated React UI Components for Next.js

Animated React UI with liquid transitions, spring motion, dashboard widgets, navigation, inputs, and an AI status orb.

Calamansi UI is a React component registry that adds animated navigation, cards, widgets, inputs, and AI status UI to your Next.js projects.

It focuses on interaction-heavy pieces such as a magnifying Dock, Gooey Nav, Dynamic Island, Duration Picker, and Matrix Orb.

Each item installs as editable TSX source through the shadcn CLI.

Features

  • Motion-based spring transitions for navigation, cards, widgets, counters, and liquid effects.
  • GSAP animation for the interactive Calamansi mascot.
  • Squircle design across many cards and navigation components.
  • Four recurring palettes: white, calamansi, slate, and citrus.
  • Controlled and uncontrolled state APIs for Dynamic Island, Duration Picker, Gooey Nav, Sidebar, and GitHub Activity.
  • Registry dependencies for shared utils, squircle, and liquid helpers.
  • TypeScript source styled with Tailwind CSS.

Use Cases

  • Application navigation with a magnifying Dock, animated Sidebar, Gooey Nav, or compact Dynamic Island.
  • Dashboard home screens with task, morning, and GitHub activity widgets.
  • Timer controls, session settings, and other hours-and-minutes inputs with Duration Picker.
  • AI voice and chat states with a Matrix Orb that reacts to idle, listening, and thinking states.

How To Use It

1. Initialize shadcn

Run the initializer when the project does not already have components.json:

npx shadcn@latest init

2. Install a Component

Install the Dock:

npx shadcn@latest add fujiDevv/calamansi-ui/dock

Use the following GitHub registry address for other items:

npx shadcn@latest add fujiDevv/calamansi-ui/calamansi
npx shadcn@latest add fujiDevv/calamansi-ui/dynamic-island
npx shadcn@latest add fujiDevv/calamansi-ui/duration-picker
npx shadcn@latest add fujiDevv/calamansi-ui/matrix-orb

Basic Usage

DynamicIsland works in controlled or uncontrolled mode. Its default state is compact, and clicking it expands or collapses the content when interactive is active.

import { DynamicIsland } from "@/components/ui/dynamic-island";
export function FocusTimerIsland() {
  return (
    <DynamicIsland
      title="Focus Timer"
      trailing={<span>24:18</span>}
      expandedContent={
        <div className="space-y-2">
          <p className="text-sm font-medium">Deep work session</p>
          <p className="text-sm opacity-70">24 minutes remaining</p>
        </div>
      }
    />
  );
}

Controlled Duration Picker Example

Use value and onChange when application state owns the duration. onConfirm fires when the tick is pressed or Enter is used in either field.

"use client";
import { useState } from "react";
import { DurationPicker } from "@/components/ui/duration-picker";
export function SessionLengthPicker() {
  const [duration, setDuration] = useState({
    hours: 1,
    minutes: 30,
  });
  return (
    <DurationPicker
      value={duration}
      onChange={setDuration}
      onConfirm={(value) => console.log("Saved duration:", value)}
      maxHours={12}
      variant="calamansi"
    />
  );
}

Available Components

CategoryComponentsMain Use
DisplayCalamansi Mascot, Task Widget, Morning Widget, GitHub ActivityMascot and dashboard content
EffectsSpotlight Card, Tilt Card, Marquee, Number TickerAnimated surfaces and content
NavigationDock, Dynamic Island, Gooey Nav, SidebarApplication navigation and compact actions
InputsDuration PickerHours and minutes input
AIMatrix OrbListening, thinking, and idle status

Component API Highlights

ComponentKey API
Calamansisize, texture, variant, mood, interactive, followCursor, pressable
Dock / DockItemreach, size, magnify, panelHeight, variant, label, onClick
Dynamic Islandstate, defaultState, onStateChange, title, leading, trailing, expandedContent, pulse
Duration Pickervalue, defaultValue, onChange, onConfirm, editing, maxHours, maxMinutes, variant, size
Matrix Orbstate, level, variant, color, size, lobes, gooey, labels, caption
GitHub Activityusername, contributions, repos, year, months, showMonths, open, onOpenChange

Registry Files and Dependencies

Registry ItemPackagesPurpose
utilsclsx, tailwind-mergecn() class helper
squirclefigma-squircle, react-use-measureShared squircle surface
liquidmotion, figma-squircle, react-use-measureShared liquid and metaball effects

Styling and Customization

Edit the installed TSX files directly for deeper style changes. Many components expose variant for the white, calamansi, slate, and citrus palettes, then use Tailwind classes and local constants for component-specific styling.

The Calamansi mascot reads standard theme variables such as --primary, --primary-foreground, and --background. It also recognizes --calamansi-leaf and --calamansi-blush for mascot-specific colors.

Alternatives and Related Resources

FAQs

Q: Does Matrix Orb capture microphone audio itself?
A: No. MatrixOrb receives an external value through level. Capture and normalize the audio signal in the application, then pass a value from 0 to 1 to the component.

Q: Can the Calamansi mascot run as a static element?
A: Yes. Set interactive={false} to disable its interactive behavior. followCursor and pressable also control those behaviors individually.

Q: Can application state control whether Duration Picker is open?
A: Yes. Use editing with onEditingChange for controlled editing state. Use defaultEditing for an uncontrolled initial state.

Q: Does GitHub Activity need a backend endpoint?
A: No. Its built-in username mode performs browser-side requests. Pass contributions and repos when the application already owns or fetches that data.

fujiDevv

fujiDevv

Leave a Reply

Your email address will not be published. Required fields are marked *