This component no longer exists. It was in ruixen-ui’s manifest when we first indexed it and is not there now — the registry served its inventory on 2026-08-12 and this item was not on it. The install command below will fail. It is kept here because a tutorial somewhere still tells people to run it.
Better Time Picker
ruixen-ui/better-time-pickerRemovedComponent
iOS 26 liquid-glass time picker with column steppers, spring-animated values, and segmented AM/PM toggle.
Live preview
live · rendered by the registry
Rendered by ruixen-ui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://ruixen.com/r/better-time-picker.jsonSource
1"use client";23import * as React from "react";4import { motion } from "motion/react";56/* ── sound ── */7let _a: AudioContext, _b: AudioBuffer;8const tick = () => {9 if (typeof window === "undefined") return;10 if (!_a) {11 _a = new AudioContext();12 _b = _a.createBuffer(1, (_a.sampleRate * 0.003) | 0, _a.sampleRate);13 const d = _b.getChannelData(0);14 for (let i = 0; i < d.length; i++)15 d[i] = (Math.random() * 2 - 1) * (1 - i / d.length) ** 4;16 }17 const s = _a.createBufferSource();18 s.buffer = _b;19 const g = _a.createGain();20 g.gain.value = 0.08;21 s.connect(g).connect(_a.destination);22 s.start();23};2425/* ── theme ── */26const CSS = `27.tp{28 --tp-glass:linear-gradient(180deg,rgba(255,255,255,0.78),rgba(255,255,255,0.62));29 --tp-border:rgba(0,0,0,0.06);30 --tp-shadow:0 0 1px rgba(0,0,0,0.04),0 2px 8px rgba(0,0,0,0.04),inset 0 1px 0 rgba(255,255,255,0.8);31 --tp-dim:rgba(0,0,0,0.42);32 --tp-mid:rgba(0,0,0,0.55);33 --tp-hi:rgba(0,0,0,0.88);34 --tp-sep:rgba(0,0,0,0.06);35 --tp-btn:rgba(0,0,0,0.03);36 --tp-btn-h:rgba(0,0,0,0.07);37 --tp-seg-bg:rgba(0,0,0,0.04);38 --tp-seg-active:rgba(0,0,0,0.07);39 --tp-knob:#fff;40 --tp-knob-border:rgba(0,0,0,0.08);41 --tp-knob-shadow:0 1px 3px rgba(0,0,0,0.12)42}43.dark .tp,[data-theme="dark"] .tp{44 --tp-glass:linear-gradient(180deg,rgba(255,255,255,0.05),rgba(255,255,255,0.02));45 --tp-border:rgba(255,255,255,0.07);46 --tp-shadow:0 1px 3px rgba(0,0,0,0.08),inset 0 1px 0 rgba(255,255,255,0.04);47 --tp-dim:rgba(255,255,255,0.28);48 --tp-mid:rgba(255,255,255,0.5);49 --tp-hi:rgba(255,255,255,0.88);50 --tp-sep:rgba(255,255,255,0.06);51 --tp-btn:rgba(255,255,255,0.03);52 --tp-btn-h:rgba(255,255,255,0.07);53 --tp-seg-bg:rgba(255,255,255,0.04);54 --tp-seg-active:rgba(255,255,255,0.09);55 --tp-knob:#fff;56 --tp-knob-border:rgba(255,255,255,0.06);57 --tp-knob-shadow:0 1px 3px rgba(0,0,0,0.15)58}`;5960const MONO =61 "ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace";6263/* ── types ── */64interface BetterTimePickerProps {65 defaultHour?: number;66 defaultMinute?: number;67 use24?: boolean;68 minuteStep?: number;69 onChange?: (hour: number, minute: number) => void;70 sound?: boolean;71 style?: React.CSSProperties;72}7374/* ── component ── */75export default function BetterTimePicker({76 defaultHour = 12,77 defaultMinute = 0,78 use24 = false,79 minuteStep = 5,80 onChange,81 sound = true,82 style,83}: BetterTimePickerProps) {84 const [hour, setHour] = React.useState(defaultHour);85// … truncated
What it pulls in
npm packages
