+
-
{title}
+
+
{title}
+ {meta}
+
{description ?
{description}
: null}
- {actions ?
{actions}
: null}
+ {actions ?
{actions}
: null}
)
}
diff --git a/frontend/src/components/app/AppSection.tsx b/frontend/src/components/app/AppSection.tsx
new file mode 100644
index 0000000..057ce47
--- /dev/null
+++ b/frontend/src/components/app/AppSection.tsx
@@ -0,0 +1,25 @@
+import type * as React from 'react'
+
+import { Card, CardContent, CardHeader } from '@/components/ui/card'
+
+type AppSectionProps = {
+ title: string
+ description?: string
+ action?: React.ReactNode
+ children: React.ReactNode
+}
+
+export function AppSection({ title, description, action, children }: AppSectionProps) {
+ return (
+
+
+
+
{title}
+ {description ?
{description}
: null}
+
+ {action}
+
+ {children}
+
+ )
+}
diff --git a/frontend/src/components/app/AppSidebar.tsx b/frontend/src/components/app/AppSidebar.tsx
new file mode 100644
index 0000000..81940c8
--- /dev/null
+++ b/frontend/src/components/app/AppSidebar.tsx
@@ -0,0 +1,63 @@
+import { Bot, BriefcaseBusiness, Database, Home, Library, Settings, ShieldCheck, Ticket } from 'lucide-react'
+
+import { cn } from '@/lib/utils'
+
+const navGroups = [
+ {
+ label: '工作台',
+ items: [{ href: '#/', label: '运营总览', icon: Home }]
+ },
+ {
+ label: '业务处理',
+ items: [
+ { href: '#/tickets', label: '工单中心', icon: Ticket },
+ { href: '#/tickets/new', label: '创建工单', icon: BriefcaseBusiness },
+ { href: '#/solutions', label: '解决方案库', icon: Library }
+ ]
+ },
+ {
+ label: '平台能力',
+ items: [
+ { href: '#/knowledge', label: '知识库', icon: Database },
+ { href: '#/agents', label: 'Agent 配置', icon: Bot },
+ { href: '#/system', label: '系统治理', icon: ShieldCheck },
+ { href: '#/design-system', label: '设计系统', icon: Settings }
+ ]
+ }
+]
+
+export function AppSidebar() {
+ return (
+
+ )
+}
diff --git a/frontend/src/components/app/AppStatusBadge.tsx b/frontend/src/components/app/AppStatusBadge.tsx
index 8c49c32..d11492a 100644
--- a/frontend/src/components/app/AppStatusBadge.tsx
+++ b/frontend/src/components/app/AppStatusBadge.tsx
@@ -10,6 +10,6 @@ const STATUS_LABELS: Record
= {
}
export function AppStatusBadge({ status }: { status: string }) {
- const variant = status === 'resolved' || status === 'closed' ? 'success' : 'info'
+ const variant = status === 'resolved' || status === 'closed' ? 'success' : status === 'pending_confirm' ? 'warning' : 'info'
return {STATUS_LABELS[status] ?? status}
}
diff --git a/frontend/src/components/app/AppTopbar.tsx b/frontend/src/components/app/AppTopbar.tsx
new file mode 100644
index 0000000..1e854f2
--- /dev/null
+++ b/frontend/src/components/app/AppTopbar.tsx
@@ -0,0 +1,28 @@
+import { Bell, ChevronRight, UserRound } from 'lucide-react'
+
+import { Badge } from '@/components/ui/badge'
+import { Button } from '@/components/ui/button'
+import { Separator } from '@/components/ui/separator'
+
+export function AppTopbar() {
+ return (
+
+ )
+}