{title}
{description}
import { ArrowRight, GitBranch, GitPullRequest, MessagesSquare, Moon, ShieldCheck, Sun } from 'lucide-react' import type { LucideIcon } from 'lucide-react' import { useEffect, useState } from 'react' import { Navigate, Route, Routes } from 'react-router-dom' const features: { icon: LucideIcon; title: string; description: string; className: string }[] = [ { icon: GitBranch, title: 'Git 仓库', description: '分支、提交、差异与 LFS 大文件由同一套服务承载,克隆与推送使用标准 Git 协议。', className: 'md:col-span-4', }, { icon: GitPullRequest, title: '评审与看板', description: '合并请求、Issue 与看板按空间组织,讨论和变更放在同一处。', className: 'md:col-span-2', }, { icon: MessagesSquare, title: '团队聊天', description: '按空间划分的聊天房间,消息与通知直达相关成员。', className: 'md:col-span-2', }, { icon: ShieldCheck, title: '统一身份', description: '一个账户登录所有空间,二次验证、SSH 密钥与访问密钥集中管理,随时撤销可疑会话。', className: 'md:col-span-4', }, ] function useTheme() { const [theme, setTheme] = useState(() => { try { return localStorage.getItem('auth-theme') || 'system' } catch { return 'system' } }) const [systemDark, setSystemDark] = useState(() => matchMedia('(prefers-color-scheme: dark)').matches) const dark = theme === 'dark' || (theme === 'system' && systemDark) useEffect(() => { const media = matchMedia('(prefers-color-scheme: dark)') const update = () => setSystemDark(media.matches) media.addEventListener('change', update) return () => media.removeEventListener('change', update) }, []) useEffect(() => { document.documentElement.dataset.theme = dark ? 'dark' : 'light' }, [dark]) function toggle() { const next = dark ? 'light' : 'dark' setTheme(next) try { localStorage.setItem('auth-theme', next) } catch {} } return { dark, toggle } } function ProductPreview() { return (
{description}
GitDataAI 提供 Git 仓库托管、合并请求评审、Issue 看板与团队聊天,并用一套账户打通所有空间与应用的访问权限。
仓库、评审、看板与聊天按空间组织,权限与身份统一,减少在多个工具之间切换的上下文成本。