Xzero UI
Pro library

Date reelPro

A 3D wheel date and time picker (like iOS reels) with momentum scrolling, snapping, curved perspective, and full keyboard support.

$ pnpm dlx shadcn@4.23.0 add @xzero-ui-pro/date-reel
Live · keyboard ready

When to use

When not to use

Installation

Register both Xzero UI namespaces in your project's components.json:

{
  "registries": {
    "@xzero-ui": "https://mcp.xzero.co.uk/r/{name}.json",
    "@xzero-ui-pro": "https://mcp.xzero.co.uk/r/pro/{name}.json"
  }
}
npx shadcn@4.23.0 add @xzero-ui-pro/date-reel

Install xzero-foundation once, and import @/components/xzero/foundation.css in your app root. No Xzero token is used by this snapshot. For sample portraits, photos, fonts, or logos, download https://mcp.xzero.co.uk/install-assets.mjs and run node xzero-install-assets.mjs <receiving-project>.

Usage

import { DateReel } from "@/components/xzero/date-reel/date-reel";

export function SendLater({ onSchedule }: { onSchedule: (at: Date) => Promise<void> }) {
  return (
    <DateReel
      title="Send later"
      today={new Date(2026, 8, 24)}
      defaultValue={new Date(2026, 8, 25, 9, 0)}
      onConfirm={onSchedule}
    />
  );
}

API reference

DateReel

A 3D reel date and time picker, like the wheels on a phone. Each column is a curved drum laid on a real cylinder: flick it and it keeps your momentum, glides and snaps into a glass lens, and a drag past the first or last entry stretches like rubber. A summary above reads the moment back in words as the reels turn ("Tomorrow at 9:00 AM"), quick picks spin every reel to a preset, and an optional confirm button settles in place.

PropTypeDefaultDescription
mode"datetime" | "date" | "time""datetime"Which reels to show: day, hour, minute and AM or PM; month, day and year; or time only.
valueDate–Controlled value. When it changes from outside, every reel spins to it along the short way around.
defaultValueDateSep 24, 2026 9:30 AMStarting value when uncontrolled. Pass a fixed date so the first render matches on server and client.
onChange(value: Date) => void–Called once when the reels come to rest on a new moment, not on every frame.
todayDateDay of the first valueStart of today, used for the Today entry and relative words such as Tomorrow or In 12 days. Pass new Date() after mount in an app.
minDateDate30 days before today (100 years in date mode)Earliest selectable day. The day and year reels stop here with a rubber band.
maxDateDateA year after today (10 years in date mode)Latest selectable day.
minuteStep1 | 5 | 10 | 15 | 305Minutes between entries on the minute reel.
hourCycle12 | 241212 hour clock with an AM or PM reel, or a 24 hour clock.
localestring"en-US"BCP 47 locale for day and month names, the time format, the AM and PM words and relative phrases.
presets{ label: string; value: Date | ((today: Date) => Date) }[] | falseThis evening, Tomorrow, MondayQuick picks under the reels. Choosing one spins every reel to it with a small stagger. The chip that matches the current value is marked pressed. false hides them.
titlestring–Optional heading above the summary, such as "Send later".
onConfirm(value: Date) => void | Promise<void>–Adds a primary button. Return a promise to show pending, success and failure in place without changing its width.
labelsDateReelLabels–Words for localization: reel names (day, month, date, year, hour, minute, period), the at joiner, the quick picks group name and the confirm button states.
introbooleantrueSpins the reels into place, one after another, the first time the picker scrolls into view.
speednumber1Multiplies the speed of glides, snaps and the intro.
pausedbooleanfalseStops automatic motion. Reels still follow a drag and land on the nearest entry at once.
accentstring–Any CSS color for the active reel in the lens and the chosen quick pick. Defaults to the theme accent.
labelstring"Date and time"Accessible name of the picker group.
classNamestring–Class on the root element.
styleCSSProperties–Inline styles on the root element.

Keyboard interactions

KeysAction
TabMoves between reels, the quick picks and the confirm button.
Arrow up / Arrow downTurns the focused reel one entry.
Page up / Page downTurns by a larger step: a week of days, 3 or 6 hours, 15 minutes, 10 years.
Home / EndJumps to the first or last entry of the reel.
Arrow left / Arrow rightMoves focus to the neighbouring reel.
Type a number or lettersJumps to the matching entry, such as 4 for 4 o'clock, 45 for :45, p for PM or ma for March.

Accessibility

Motion

Responsive behavior

Performance

Notes for AI

Also in data

Guidance for AI tools

Date reel: A 3D wheel date and time picker (like iOS reels) with momentum scrolling, snapping, curved perspective, and full keyboard support. Follow the declared prop types and do not invent props. Keep keyboard access, reduced motion support, and both light and dark themes intact when adapting it.

Full library index: https://ui.xzero.co.uk/llms.txt

Browse all components