From dd100fd7ef367ff52ea3bcb20deac07a557c6c97 Mon Sep 17 00:00:00 2001 From: xiongxiao Date: Sun, 22 Mar 2026 13:54:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E7=89=88=E6=9C=AC=EF=BC=8C=E6=B7=BB=E5=8A=A0PWA=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E7=BB=84=E4=BB=B6=EF=BC=8C=E4=BC=98=E5=8C=96Sidebar?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=EF=BC=8C=E5=A2=9E=E5=8A=A0footer=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 32 ++++++------- public/auth.json | 29 ++++++++++-- src/agents/app.ts | 11 +---- src/agents/index.ts | 9 +++- src/components/a/PWAUpdate.tsx | 60 ++++++++++++++++++++++++ src/components/a/Sidebar.tsx | 21 +++++++-- src/pages/auth/store.ts | 5 +- src/pages/sidebar/components/Sidebar.tsx | 12 ++++- vite.config.ts | 33 +++++++++++++ 9 files changed, 175 insertions(+), 37 deletions(-) create mode 100644 src/components/a/PWAUpdate.tsx diff --git a/package.json b/package.json index 5847e6a..0a49093 100644 --- a/package.json +++ b/package.json @@ -17,19 +17,19 @@ "author": "abearxiong ", "license": "MIT", "dependencies": { - "@ai-sdk/anthropic": "^3.0.58", - "@ai-sdk/openai": "^3.0.41", - "@ai-sdk/openai-compatible": "^2.0.35", + "@ai-sdk/anthropic": "^3.0.63", + "@ai-sdk/openai": "^3.0.47", + "@ai-sdk/openai-compatible": "^2.0.37", "@base-ui/react": "^1.3.0", - "@kevisual/api": "^0.0.64", - "@kevisual/cnb": "^0.0.52", + "@kevisual/api": "^0.0.65", + "@kevisual/cnb": "^0.0.59", "@kevisual/cnb-ai": "^0.0.2", "@kevisual/context": "^0.0.8", "@kevisual/kv-login": "^0.1.18", - "@kevisual/router": "0.1.3", - "@tanstack/react-router": "^1.167.4", + "@kevisual/router": "0.1.6", + "@tanstack/react-router": "^1.168.1", "@uiw/react-codemirror": "^4.25.8", - "ai": "^6.0.116", + "ai": "^6.0.134", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", @@ -43,7 +43,7 @@ "re-resizable": "^6.11.2", "react": "^19.2.4", "react-dom": "^19.2.4", - "react-hook-form": "^7.71.2", + "react-hook-form": "^7.72.0", "react-resizable": "^3.1.3", "sonner": "^2.0.7", "vite-plugin-pwa": "^1.2.0", @@ -56,12 +56,12 @@ "devDependencies": { "@codemirror/lang-yaml": "^6.1.2", "@kevisual/gitea": "^0.0.6", - "@kevisual/query": "0.0.53", + "@kevisual/query": "0.0.55", "@kevisual/types": "^0.0.12", - "@tailwindcss/vite": "^4.2.1", - "@tanstack/react-query": "^5.90.21", - "@tanstack/react-router-devtools": "^1.166.9", - "@tanstack/router-plugin": "^1.166.13", + "@tailwindcss/vite": "^4.2.2", + "@tanstack/react-query": "^5.94.5", + "@tanstack/react-router-devtools": "^1.166.10", + "@tanstack/router-plugin": "^1.167.2", "@types/node": "^25.5.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", @@ -69,9 +69,9 @@ "@vitejs/plugin-react": "^6.0.1", "dotenv": "^17.3.1", "tailwind-merge": "^3.5.0", - "tailwindcss": "^4.2.1", + "tailwindcss": "^4.2.2", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", - "vite": "^8.0.0" + "vite": "^8.0.1" } } \ No newline at end of file diff --git a/public/auth.json b/public/auth.json index acf0250..3f2d7f0 100644 --- a/public/auth.json +++ b/public/auth.json @@ -22,20 +22,43 @@ }, "sync": { "AGENTS.md": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/AGENTS.md", + "tsconfig.json": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/tsconfig.json", "vite.config.ts": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/vite.config.ts", - "src/main.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/main.tsx", "public/auth.json": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/public/auth.json", - "src/agents/index.ts": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/agents/index.ts", - "src/modules/basename.ts": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/modules/basename.ts", + "public/demo.html": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/public/demo.html", "src/modules/query.ts": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/modules/query.ts", "src/routes/demo.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/routes/demo.tsx", "src/routes/index.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/routes/index.tsx", "src/routes/login.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/routes/login.tsx", "src/styles/theme.css": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/styles/theme.css", + "src/components/a/PWAUpdate.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/a/PWAUpdate.tsx", + "src/components/a/Sidebar.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/a/Sidebar.tsx", + "src/components/ui/badge.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/badge.tsx", + "src/components/ui/breadcrumb.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/breadcrumb.tsx", + "src/components/ui/button.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/button.tsx", + "src/components/ui/card.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/card.tsx", + "src/components/ui/checkbox.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/checkbox.tsx", + "src/components/ui/command.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/command.tsx", + "src/components/ui/dialog.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/dialog.tsx", + "src/components/ui/dropdown-menu.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/dropdown-menu.tsx", + "src/components/ui/input-group.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/input-group.tsx", + "src/components/ui/input.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/input.tsx", + "src/components/ui/kbd.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/kbd.tsx", + "src/components/ui/label.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/label.tsx", + "src/components/ui/menubar.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/menubar.tsx", + "src/components/ui/popover.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/popover.tsx", + "src/components/ui/select.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/select.tsx", + "src/components/ui/sheet.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/sheet.tsx", + "src/components/ui/skeleton.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/skeleton.tsx", + "src/components/ui/sonner.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/sonner.tsx", + "src/components/ui/tabs.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/tabs.tsx", + "src/components/ui/textarea.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/textarea.tsx", + "src/components/ui/tooltip.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/components/ui/tooltip.tsx", "src/pages/auth/index.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/pages/auth/index.tsx", "src/pages/auth/page.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/pages/auth/page.tsx", "src/pages/auth/store.ts": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/pages/auth/store.ts", "src/pages/demo/page.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/pages/demo/page.tsx", + "src/agents/app.ts": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/agents/app.ts", "src/pages/auth/hooks/index.ts": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/pages/auth/hooks/index.ts", "src/pages/auth/hooks/use-api-query.ts": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/pages/auth/hooks/use-api-query.ts", "src/pages/auth/modules/BaseHeader.tsx": "https://kevisual.cn/root/ai/kevisual/frontend/vite-react-template/src/pages/auth/modules/BaseHeader.tsx", diff --git a/src/agents/app.ts b/src/agents/app.ts index 4f08c35..20d1deb 100644 --- a/src/agents/app.ts +++ b/src/agents/app.ts @@ -1,10 +1,3 @@ -import { QueryRouterServer } from '@kevisual/router/browser' +import { QueryRouterServer } from "@kevisual/router/browser" import { useContextKey } from '@kevisual/context' -export const app = useContextKey('app', new QueryRouterServer()) - -// import '@kevisual/cnb-ai' - -const url = 'https://kevisual.cn/root/cnb-ai/dist/app.js' -setTimeout(() => { - import(/* @vite-ignore */url) -}, 2000) \ No newline at end of file +export const app = useContextKey('app', new QueryRouterServer()) \ No newline at end of file diff --git a/src/agents/index.ts b/src/agents/index.ts index 349bda6..46c8705 100644 --- a/src/agents/index.ts +++ b/src/agents/index.ts @@ -1 +1,8 @@ -export * from './app.ts' \ No newline at end of file +export * from './app.ts' + +// import '@kevisual/cnb-ai' + +const url = 'https://kevisual.cn/root/cnb-ai/dist/app.js' +setTimeout(() => { + import(/* @vite-ignore */url) +}, 2000) \ No newline at end of file diff --git a/src/components/a/PWAUpdate.tsx b/src/components/a/PWAUpdate.tsx new file mode 100644 index 0000000..d03f1b3 --- /dev/null +++ b/src/components/a/PWAUpdate.tsx @@ -0,0 +1,60 @@ +import { useState } from 'react'; +import { useRegisterSW } from 'virtual:pwa-register/react'; +import { Button } from '@/components/ui/button'; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from '@/components/ui/card'; + +function PWAUpdate() { + const { + needRefresh: [needRefresh, setNeedRefresh], + updateServiceWorker, + } = useRegisterSW({ + onNeedRefresh() { + setNeedRefresh(true); + }, + }); + + const [isLoading, setIsLoading] = useState(false); + + const handleUpdate = async () => { + setIsLoading(true); + await updateServiceWorker(true); + setIsLoading(false); + }; + + const handleDismiss = () => { + setNeedRefresh(false); + }; + + if (!needRefresh) { + return null; + } + + return ( +
+ + + 发现新版本 + 有新版本可用,点击立即更新 + + + + + + + +
+ ); +} + +export default PWAUpdate; diff --git a/src/components/a/Sidebar.tsx b/src/components/a/Sidebar.tsx index 31a177f..b395b4c 100644 --- a/src/components/a/Sidebar.tsx +++ b/src/components/a/Sidebar.tsx @@ -32,6 +32,7 @@ export interface SidebarProps { children?: React.ReactNode logo?: React.ReactNode title?: React.ReactNode + footer?: React.ReactNode defaultCollapsed?: boolean defaultWidth?: number minWidth?: number @@ -44,6 +45,7 @@ export function Sidebar({ children, logo, title, + footer, defaultCollapsed = false, defaultWidth = 208, minWidth = 120, @@ -172,7 +174,6 @@ export function Sidebar({ ) } - return ( <>
@@ -194,7 +195,7 @@ export function Sidebar({ > ) : ( // 收起状态 -