{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "glass-form", "type": "registry:ui", "title": "Glass Form", "description": "iOS 26 liquid-glass form system — grouped fields, toggles, segmented controls, and action buttons with backdrop blur.", "dependencies": [ "motion" ], "files": [ { "path": "registry/ruixenui/glass-form.tsx", "content": "\"use client\";\n\nimport * as React from \"react\";\nimport { motion } from \"motion/react\";\n\n/* ── sound ─────────────────────────────────────────────── */\nlet _a: AudioContext, _b: AudioBuffer;\nconst tick = () => {\n if (typeof window === \"undefined\") return;\n if (!_a) {\n _a = new AudioContext();\n _b = _a.createBuffer(1, (_a.sampleRate * 0.003) | 0, _a.sampleRate);\n const d = _b.getChannelData(0);\n for (let i = 0; i < d.length; i++)\n d[i] = (Math.random() * 2 - 1) * (1 - i / d.length) ** 4;\n }\n const s = _a.createBufferSource();\n s.buffer = _b;\n const g = _a.createGain();\n g.gain.value = 0.08;\n s.connect(g).connect(_a.destination);\n s.start();\n};\n\n/* ── theme ─────────────────────────────────────────────── */\n/* Light: frosted-white panels, soft outer shadows */\n/* Dark : original white-tint glass, inner glow */\nconst GLASS_CSS = `\n.gf{\n --gf-glass:linear-gradient(180deg,rgba(255,255,255,0.78),rgba(255,255,255,0.62));\n --gf-border:rgba(0,0,0,0.06);\n --gf-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);\n --gf-sep:rgba(0,0,0,0.06);\n --gf-dim:rgba(0,0,0,0.42);\n --gf-mid:rgba(0,0,0,0.55);\n --gf-hi:rgba(0,0,0,0.88);\n --gf-hover:rgba(0,0,0,0.025);\n --gf-toggle-on:#007AFF;\n --gf-toggle-off:rgba(0,0,0,0.1);\n --gf-seg-bg:rgba(0,0,0,0.04);\n --gf-seg-active:rgba(0,0,0,0.07);\n --gf-knob:#fff;\n --gf-knob-border:rgba(0,0,0,0.08);\n --gf-knob-shadow:0 1px 3px rgba(0,0,0,0.12);\n --gf-ghost:rgba(0,0,0,0.03);\n --gf-ghost-h:rgba(0,0,0,0.06)\n}\n.dark .gf,[data-theme=\"dark\"] .gf{\n --gf-glass:linear-gradient(180deg,rgba(255,255,255,0.05),rgba(255,255,255,0.02));\n --gf-border:rgba(255,255,255,0.07);\n --gf-shadow:0 1px 3px rgba(0,0,0,0.08),inset 0 1px 0 rgba(255,255,255,0.04);\n --gf-sep:rgba(255,255,255,0.06);\n --gf-dim:rgba(255,255,255,0.28);\n --gf-mid:rgba(255,255,255,0.5);\n --gf-hi:rgba(255,255,255,0.88);\n --gf-hover:rgba(255,255,255,0.015);\n --gf-toggle-on:#0A84FF;\n --gf-toggle-off:rgba(255,255,255,0.1);\n --gf-seg-bg:rgba(255,255,255,0.04);\n --gf-seg-active:rgba(255,255,255,0.09);\n --gf-knob:#fff;\n --gf-knob-border:rgba(255,255,255,0.06);\n --gf-knob-shadow:0 1px 3px rgba(0,0,0,0.15);\n --gf-ghost:rgba(255,255,255,0.02);\n --gf-ghost-h:rgba(255,255,255,0.05)\n}`;\n\n/* ── palette ───────────────────────────────────────────── */\nconst P = {\n glass: \"var(--gf-glass)\",\n glassBorder: \"var(--gf-border)\",\n glassShadow: \"var(--gf-shadow)\",\n separator: \"var(--gf-sep)\",\n dim: \"var(--gf-dim)\",\n mid: \"var(--gf-mid)\",\n hi: \"var(--gf-hi)\",\n accent: \"hsl(var(--primary))\",\n accentFg: \"hsl(var(--primary-foreground))\",\n toggleOn: \"var(--gf-toggle-on)\",\n toggleOff: \"var(--gf-toggle-off)\",\n segBg: \"var(--gf-seg-bg)\",\n segActive: \"var(--gf-seg-active)\",\n hoverRow: \"var(--gf-hover)\",\n knob: \"var(--gf-knob)\",\n knobBorder: \"var(--gf-knob-border)\",\n knobShadow: \"var(--gf-knob-shadow)\",\n ghost: \"var(--gf-ghost)\",\n ghostHover: \"var(--gf-ghost-h)\",\n};\n\n/* ── context ───────────────────────────────────────────── */\nconst FormCtx = React.createContext({ sound: true });\n\n/* ═══════════════════════════════════════════════════════════\n GlassForm — outer