{ "$schema": "https://ui.shadcn.com/schema/registry.json", "name": "appcn", "homepage": "https://appcn.vercel.app", "items": [ { "name": "cn", "type": "registry:lib", "title": "cn", "description": "Class name merge helper for NativeWind (clsx + tailwind-merge).", "dependencies": ["clsx", "tailwind-merge"], "files": [ { "path": "../../packages/ui/src/lib/cn.ts", "type": "registry:lib", "target": "lib/cn.ts" } ] }, { "name": "motion", "type": "registry:lib", "title": "motion", "description": "Shared motion tokens — durations, easings, and spring presets.", "dependencies": ["react-native-reanimated"], "files": [ { "path": "../../packages/ui/src/lib/motion.ts", "type": "registry:lib", "target": "lib/motion.ts" } ] }, { "name": "haptics", "type": "registry:lib", "title": "haptics", "description": "Safe expo-haptics wrapper — fire-and-forget, no-ops on web.", "dependencies": ["expo-haptics"], "files": [ { "path": "../../packages/ui/src/lib/haptics.ts", "type": "registry:lib", "target": "lib/haptics.ts" } ] }, { "name": "button", "type": "registry:component", "title": "Button", "description": "Pressable with variants and a Reanimated press-scale.", "dependencies": ["class-variance-authority", "react-native-reanimated"], "registryDependencies": ["@app-cn/cn"], "files": [ { "path": "../../packages/ui/src/components/button.tsx", "type": "registry:component", "target": "components/ui/button.tsx" } ] }, { "name": "stream-bubble", "type": "registry:component", "title": "Stream Bubble", "description": "AI assistant message: thinking, token streaming, tool chips, settle.", "dependencies": ["react-native-reanimated"], "registryDependencies": ["@app-cn/cn", "@app-cn/motion"], "files": [ { "path": "../../packages/ui/src/ai/stream-bubble.tsx", "type": "registry:component", "target": "components/ui/stream-bubble.tsx" } ] }, { "name": "prompt-input", "type": "registry:component", "title": "Prompt Input", "description": "AI composer: auto-grow, attachment chips, and a send button that morphs into a stop with a spinning ring.", "dependencies": ["react-native-reanimated"], "registryDependencies": ["@app-cn/cn", "@app-cn/motion", "@app-cn/haptics"], "files": [ { "path": "../../packages/ui/src/ai/prompt-input.tsx", "type": "registry:component", "target": "components/ui/prompt-input.tsx" } ] }, { "name": "reasoning-trace", "type": "registry:component", "title": "Reasoning Trace", "description": "Collapsible chain-of-thought with a thinking shimmer that auto-collapses when the answer lands.", "dependencies": ["react-native-reanimated"], "registryDependencies": ["@app-cn/cn", "@app-cn/motion", "@app-cn/haptics"], "files": [ { "path": "../../packages/ui/src/ai/reasoning-trace.tsx", "type": "registry:component", "target": "components/ui/reasoning-trace.tsx" } ] }, { "name": "voice-sphere", "type": "registry:component", "title": "Voice Sphere", "description": "True-3D particle sphere voice indicator — Fibonacci-distributed particles, GLSL equator wave, primary-to-accent gradient. Built on react-three-fiber.", "dependencies": [ "three", "@react-three/fiber", "expo-gl", "react-native-reanimated" ], "registryDependencies": ["@app-cn/cn"], "files": [ { "path": "../../packages/ui/src/ai/voice-sphere.tsx", "type": "registry:component", "target": "components/ui/voice-sphere.tsx" } ] }, { "name": "chat", "type": "registry:component", "title": "Chat", "description": "The AI chat block: streaming assistant bubbles, a docked composer, inline reasoning, starter prompts, and magnetic stream-follow.", "dependencies": [ "react-native-reanimated", "react-native-safe-area-context", "expo-clipboard" ], "registryDependencies": [ "@app-cn/cn", "@app-cn/motion", "@app-cn/haptics", "@app-cn/stream-bubble", "@app-cn/prompt-input", "@app-cn/reasoning-trace" ], "files": [ { "path": "../../packages/ui/src/ai/chat.tsx", "type": "registry:component", "target": "components/ui/chat.tsx" } ] } ] }