update
This commit is contained in:
		@@ -1,12 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "kevisual dev",
 | 
			
		||||
  "image": "docker.cnb.cool/kevisual/dev-env:latest",
 | 
			
		||||
  "customizations": {
 | 
			
		||||
    "vscode": {
 | 
			
		||||
      "extensions": [
 | 
			
		||||
        "dbaeumer.vscode-eslint"
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "postCreateCommand": ""
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,2 +1,6 @@
 | 
			
		||||
node_modules
 | 
			
		||||
dist
 | 
			
		||||
.DS_Store
 | 
			
		||||
 | 
			
		||||
.astro
 | 
			
		||||
 | 
			
		||||
dist
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								.vscode/setting.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.vscode/setting.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "workbench.editorAssociations": {
 | 
			
		||||
    // "*.md": "vscode.markdown.preview.editor" // 预览打开
 | 
			
		||||
    "*.md": "default" // 默认打开
 | 
			
		||||
  }
 | 
			
		||||
} 
 | 
			
		||||
							
								
								
									
										39
									
								
								astro.config.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								astro.config.mjs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
import { defineConfig } from 'astro/config';
 | 
			
		||||
import mdx from '@astrojs/mdx';
 | 
			
		||||
import react from '@astrojs/react';
 | 
			
		||||
import sitemap from '@astrojs/sitemap';
 | 
			
		||||
import pkgs from './package.json';
 | 
			
		||||
import tailwindcss from '@tailwindcss/vite';
 | 
			
		||||
const isDev = process.env.NODE_ENV === 'development';
 | 
			
		||||
 | 
			
		||||
let target = process.env.VITE_API_URL || 'https://localhost:51015';
 | 
			
		||||
const apiProxy = { target: target, changeOrigin: true, ws: true, rewriteWsOrigin: true, secure: false, cookieDomainRewrite: 'localhost' };
 | 
			
		||||
let proxy = {
 | 
			
		||||
  '/root/': {
 | 
			
		||||
    target: `${target}/root/`,
 | 
			
		||||
  },
 | 
			
		||||
  '/api': apiProxy,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const basename = isDev ? undefined : `${pkgs.basename}`;
 | 
			
		||||
export default defineConfig({
 | 
			
		||||
  base: basename,
 | 
			
		||||
  integrations: [
 | 
			
		||||
    mdx(),
 | 
			
		||||
    react(), //
 | 
			
		||||
    // sitemap(), // sitemap must be site has a domain
 | 
			
		||||
  ],
 | 
			
		||||
  
 | 
			
		||||
  vite: {
 | 
			
		||||
    plugins: [tailwindcss()],
 | 
			
		||||
    define: {
 | 
			
		||||
      basename: JSON.stringify(basename || ''),
 | 
			
		||||
    },
 | 
			
		||||
    server: {
 | 
			
		||||
      port: 7008,
 | 
			
		||||
      host: '0.0.0.0',
 | 
			
		||||
      allowedHosts: true,
 | 
			
		||||
      proxy,
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										22
									
								
								components.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								components.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
{
 | 
			
		||||
  "$schema": "https://ui.shadcn.com/schema.json",
 | 
			
		||||
  "style": "new-york",
 | 
			
		||||
  "rsc": false,
 | 
			
		||||
  "tsx": true,
 | 
			
		||||
  "tailwind": {
 | 
			
		||||
    "config": "",
 | 
			
		||||
    "css": "src/styles/global.css",
 | 
			
		||||
    "baseColor": "neutral",
 | 
			
		||||
    "cssVariables": true,
 | 
			
		||||
    "prefix": ""
 | 
			
		||||
  },
 | 
			
		||||
  "iconLibrary": "lucide",
 | 
			
		||||
  "aliases": {
 | 
			
		||||
    "components": "@/components",
 | 
			
		||||
    "utils": "@/lib/utils",
 | 
			
		||||
    "ui": "@/components/ui",
 | 
			
		||||
    "lib": "@/lib",
 | 
			
		||||
    "hooks": "@/hooks"
 | 
			
		||||
  },
 | 
			
		||||
  "registries": {}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,11 +0,0 @@
 | 
			
		||||
import { build } from 'esbuild';
 | 
			
		||||
 | 
			
		||||
build({
 | 
			
		||||
  entryPoints: ['src/index.ts'],
 | 
			
		||||
  bundle: true,
 | 
			
		||||
  outfile: 'dist/index.js',
 | 
			
		||||
  platform: 'browser',
 | 
			
		||||
  target: 'esnext',
 | 
			
		||||
  sourcemap: false,
 | 
			
		||||
  format: 'esm',
 | 
			
		||||
}).catch(() => process.exit(1));
 | 
			
		||||
							
								
								
									
										70
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								package.json
									
									
									
									
									
								
							@@ -1,51 +1,59 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "@kevisual/kevisual-login",
 | 
			
		||||
  "version": "0.0.4",
 | 
			
		||||
  "name": "@kevisual/kevisual-home",
 | 
			
		||||
  "version": "0.0.5",
 | 
			
		||||
  "description": "",
 | 
			
		||||
  "main": "index.js",
 | 
			
		||||
  "basename": "/user/login",
 | 
			
		||||
  "basename": "/user/home",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "dev": "vite",
 | 
			
		||||
    "dev:web": "cross-env WEB_DEV=true vite --mode web",
 | 
			
		||||
    "build": "vite build",
 | 
			
		||||
    "esbuild": "node esbuild.config.mjs",
 | 
			
		||||
    "preview": "vite preview",
 | 
			
		||||
    "pub": "envision deploy ./dist -k login -v 0.0.4 -u -o user"
 | 
			
		||||
    "dev": "astro dev",
 | 
			
		||||
    "build": "astro build",
 | 
			
		||||
    "preview": "astro preview",
 | 
			
		||||
    "ui": "pnpm dlx shadcn@latest add ",
 | 
			
		||||
    "pub": "envision deploy ./dist -k home -v 0.0.5 -u"
 | 
			
		||||
  },
 | 
			
		||||
  "keywords": [],
 | 
			
		||||
  "author": "abearxiong <xiongxiao@xiongxiao.me>",
 | 
			
		||||
  "author": "abearxiong <xiongxiao@xiongxiao.me> (https://www.xiongxiao.me)",
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "type": "module",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@floating-ui/dom": "^1.7.1",
 | 
			
		||||
    "@kevisual/query": "0.0.28",
 | 
			
		||||
    "@astrojs/mdx": "^4.3.8",
 | 
			
		||||
    "@astrojs/react": "^4.4.0",
 | 
			
		||||
    "@astrojs/sitemap": "^3.6.0",
 | 
			
		||||
    "@floating-ui/dom": "^1.7.4",
 | 
			
		||||
    "@kevisual/query": "0.0.29",
 | 
			
		||||
    "@kevisual/query-login": "^0.0.6",
 | 
			
		||||
    "@kevisual/system-lib": "^0.0.22",
 | 
			
		||||
    "@kevisual/system-ui": "^0.0.3",
 | 
			
		||||
    "@kevisual/registry": "^0.0.1",
 | 
			
		||||
    "@radix-ui/react-slot": "^1.2.3",
 | 
			
		||||
    "@tailwindcss/vite": "^4.1.16",
 | 
			
		||||
    "astro": "^5.15.1",
 | 
			
		||||
    "class-variance-authority": "^0.7.1",
 | 
			
		||||
    "clsx": "^2.1.1",
 | 
			
		||||
    "dayjs": "^1.11.13",
 | 
			
		||||
    "lodash-es": "^4.17.21",
 | 
			
		||||
    "dayjs": "^1.11.18",
 | 
			
		||||
    "es-toolkit": "^1.41.0",
 | 
			
		||||
    "github-markdown-css": "^5.8.1",
 | 
			
		||||
    "lucide-react": "^0.548.0",
 | 
			
		||||
    "nanoid": "^5.1.6",
 | 
			
		||||
    "qrcode": "^1.5.4",
 | 
			
		||||
    "react-dom": "^19.1.0",
 | 
			
		||||
    "react": "^19.2.0",
 | 
			
		||||
    "react-dom": "^19.2.0",
 | 
			
		||||
    "react-toastify": "^11.0.5",
 | 
			
		||||
    "zustand": "^5.0.5"
 | 
			
		||||
    "tailwind-merge": "^3.3.1",
 | 
			
		||||
    "zustand": "^5.0.8"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@kevisual/router": "0.0.22",
 | 
			
		||||
    "@kevisual/ssl": "^0.0.1",
 | 
			
		||||
    "@kevisual/router": "0.0.30",
 | 
			
		||||
    "@kevisual/store": "0.0.9",
 | 
			
		||||
    "@kevisual/types": "^0.0.10",
 | 
			
		||||
    "@tailwindcss/vite": "^4.1.8",
 | 
			
		||||
    "@types/qrcode": "^1.5.5",
 | 
			
		||||
    "@types/react": "^19.1.6",
 | 
			
		||||
    "@types/react-dom": "^19.1.6",
 | 
			
		||||
    "@vitejs/plugin-basic-ssl": "^2.0.0",
 | 
			
		||||
    "@vitejs/plugin-react": "^4.5.1",
 | 
			
		||||
    "cross-env": "^7.0.3",
 | 
			
		||||
    "esbuild": "^0.25.5",
 | 
			
		||||
    "react": "^19.1.0",
 | 
			
		||||
    "tailwindcss": "^4.1.8",
 | 
			
		||||
    "vite": "^6.3.5"
 | 
			
		||||
    "@tailwindcss/vite": "^4.1.16",
 | 
			
		||||
    "@types/qrcode": "^1.5.6",
 | 
			
		||||
    "@types/react": "^19.2.2",
 | 
			
		||||
    "@types/react-dom": "^19.2.2",
 | 
			
		||||
    "@vitejs/plugin-basic-ssl": "^2.1.0",
 | 
			
		||||
    "dotenv": "^17.2.3",
 | 
			
		||||
    "react": "^19.2.0",
 | 
			
		||||
    "tailwindcss": "^4.1.16",
 | 
			
		||||
    "tw-animate-css": "^1.4.0",
 | 
			
		||||
    "vite": "^7.1.12"
 | 
			
		||||
  },
 | 
			
		||||
  "pnpm": {
 | 
			
		||||
    "onlyBuiltDependencies": [
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								packages/user-login/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								packages/user-login/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
node_modules
 | 
			
		||||
dist
 | 
			
		||||
							
								
								
									
										54
									
								
								packages/user-login/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								packages/user-login/package.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "@kevisual/kevisual-login",
 | 
			
		||||
  "version": "0.0.4",
 | 
			
		||||
  "description": "",
 | 
			
		||||
  "main": "index.js",
 | 
			
		||||
  "basename": "/user/login",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "dev": "vite",
 | 
			
		||||
    "build": "vite build",
 | 
			
		||||
    "preview": "vite preview",
 | 
			
		||||
    "pub": "envision deploy ./dist -k login -v 0.0.4 -u -o user"
 | 
			
		||||
  },
 | 
			
		||||
  "keywords": [],
 | 
			
		||||
  "author": "abearxiong <xiongxiao@xiongxiao.me>",
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "type": "module",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@floating-ui/dom": "^1.7.4",
 | 
			
		||||
    "@kevisual/query": "0.0.29",
 | 
			
		||||
    "@kevisual/query-login": "^0.0.6",
 | 
			
		||||
    "@kevisual/system-lib": "^0.0.22",
 | 
			
		||||
    "@kevisual/system-ui": "^0.0.3",
 | 
			
		||||
    "clsx": "^2.1.1",
 | 
			
		||||
    "dayjs": "^1.11.18",
 | 
			
		||||
    "lodash-es": "^4.17.21",
 | 
			
		||||
    "qrcode": "^1.5.4",
 | 
			
		||||
    "react-dom": "^19.2.0",
 | 
			
		||||
    "react-toastify": "^11.0.5",
 | 
			
		||||
    "zustand": "^5.0.8"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@kevisual/router": "0.0.30",
 | 
			
		||||
    "@kevisual/ssl": "^0.0.1",
 | 
			
		||||
    "@kevisual/store": "0.0.9",
 | 
			
		||||
    "@kevisual/types": "^0.0.10",
 | 
			
		||||
    "@tailwindcss/vite": "^4.1.16",
 | 
			
		||||
    "@types/qrcode": "^1.5.6",
 | 
			
		||||
    "@types/react": "^19.2.2",
 | 
			
		||||
    "@types/react-dom": "^19.2.2",
 | 
			
		||||
    "@vitejs/plugin-basic-ssl": "^2.1.0",
 | 
			
		||||
    "@vitejs/plugin-react": "^5.1.0",
 | 
			
		||||
    "cross-env": "^10.1.0",
 | 
			
		||||
    "esbuild": "^0.25.11",
 | 
			
		||||
    "react": "^19.2.0",
 | 
			
		||||
    "tailwindcss": "^4.1.16",
 | 
			
		||||
    "vite": "^7.1.12"
 | 
			
		||||
  },
 | 
			
		||||
  "pnpm": {
 | 
			
		||||
    "onlyBuiltDependencies": [
 | 
			
		||||
      "@tailwindcss/oxide",
 | 
			
		||||
      "esbuild"
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2445
									
								
								packages/user-login/pnpm-lock.yaml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										2445
									
								
								packages/user-login/pnpm-lock.yaml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
NGWvli5lGpEkByyt
 | 
			
		||||
							
								
								
									
										58
									
								
								packages/user-login/public/config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								packages/user-login/public/config.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
export const silkyConfig = {
 | 
			
		||||
  captchaAppId: '196626989',
 | 
			
		||||
  wxLogin: {
 | 
			
		||||
    appid: 'wxea912643e8747b44',
 | 
			
		||||
    redirect_uri: 'https://kevisual.silkyai.cn/api/wx/login',
 | 
			
		||||
  },
 | 
			
		||||
  wxmpLogin: {
 | 
			
		||||
    loginUrl: `https://kevisual.xiongxiao.me/root/mini-web/login.html`,
 | 
			
		||||
  },
 | 
			
		||||
  loginWay: ['account', 'wechat', 'phone', 'wechat-mp'],
 | 
			
		||||
  loginSuccess: '/root/center/',
 | 
			
		||||
  loginSuccessIsNew: '/root/center/',
 | 
			
		||||
  beian: '浙ICP备2024137660号-1',
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const currentUrl = new URL(window.location.href);
 | 
			
		||||
const redirect = currentUrl.origin + currentUrl.pathname;
 | 
			
		||||
export const kevisualConfig = {
 | 
			
		||||
  loginWay: ['account', 'wechat'],
 | 
			
		||||
  loginSuccess: '/root/center/',
 | 
			
		||||
  loginSuccessIsNew: '/root/center/',
 | 
			
		||||
  wxLogin: {
 | 
			
		||||
    appid: 'wx9378885c8390e09b',
 | 
			
		||||
    redirect_uri: redirect,
 | 
			
		||||
  },
 | 
			
		||||
  beian: '浙ICP备2025158778号',
 | 
			
		||||
  logo: 'https://kevisual.xiongxiao.me/root/center/panda.png',
 | 
			
		||||
  logoStyle: {
 | 
			
		||||
    borderRadius: '50%',
 | 
			
		||||
    marginTop: '10px',
 | 
			
		||||
    margin: '30px auto',
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const kevisualXiongxiaoConfig = {
 | 
			
		||||
  ...kevisualConfig,
 | 
			
		||||
  loginWay: ['account', 'wechat-mp'],
 | 
			
		||||
  wxLogin: {
 | 
			
		||||
    appid: 'wxff97d569b1db16b6',
 | 
			
		||||
    redirect_uri: redirect,
 | 
			
		||||
  },
 | 
			
		||||
  wxmpLogin: {
 | 
			
		||||
    loginUrl: `${currentUrl.origin}/root/mini-web/login.html`,
 | 
			
		||||
  },
 | 
			
		||||
  logo: 'https://kevisual.xiongxiao.me/root/center/panda.png',
 | 
			
		||||
  beian: '蜀ICP备16031039号-2',
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const url = new URL(window.location.href);
 | 
			
		||||
const isKevisual = url.hostname === 'kevisual.cn';
 | 
			
		||||
const isKevisualXiongxiao = url.hostname === 'kevisual.xiongxiao.me';
 | 
			
		||||
export const config = isKevisual ? kevisualConfig : isKevisualXiongxiao ? kevisualXiongxiaoConfig : silkyConfig;
 | 
			
		||||
 | 
			
		||||
if (isKevisual || isKevisualXiongxiao) {
 | 
			
		||||
  // document.title = '杭州余杭逸文设计工作室';
 | 
			
		||||
} else {
 | 
			
		||||
  document.title = 'SilkyAI';
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2
									
								
								packages/user-login/src/modules/basename.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								packages/user-login/src/modules/basename.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
// @ts-ignore
 | 
			
		||||
export const basename = DEV_SERVER ? '/' : BASE_NAME;
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
import clsx from 'clsx';
 | 
			
		||||
import LogoBannerH from '@/assets/logo-baner-h.png';
 | 
			
		||||
 | 
			
		||||
import { Beian } from '@/modules/beian/beian';
 | 
			
		||||
import { useUserStore } from '../store';
 | 
			
		||||
@@ -70,7 +69,7 @@ export const LoginWrapper = (props: Props) => {
 | 
			
		||||
            overflow: 'hidden',
 | 
			
		||||
            ...config?.logoStyle,
 | 
			
		||||
          }}>
 | 
			
		||||
          <img src={config?.logo || LogoBannerH} />
 | 
			
		||||
          <img src={config?.logo} />
 | 
			
		||||
        </div>
 | 
			
		||||
        <div className='mt-4 text-[#F39800] font-bold text-xl'>欢迎回来</div>
 | 
			
		||||
        {loginWay.length > 1 && <div className='text-sm text-yellow-400 mt-2'>请选择登陆方式</div>}
 | 
			
		||||
							
								
								
									
										41
									
								
								packages/user-login/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								packages/user-login/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
{
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    "jsx": "react-jsx",
 | 
			
		||||
    "target": "ES2020",
 | 
			
		||||
    "useDefineForClassFields": true,
 | 
			
		||||
    "lib": [
 | 
			
		||||
      "ES2020",
 | 
			
		||||
      "DOM",
 | 
			
		||||
      "DOM.Iterable"
 | 
			
		||||
    ],
 | 
			
		||||
    "module": "ESNext",
 | 
			
		||||
    "skipLibCheck": true,
 | 
			
		||||
    /* Bundler mode */
 | 
			
		||||
    "moduleResolution": "bundler",
 | 
			
		||||
    "allowImportingTsExtensions": true,
 | 
			
		||||
    "isolatedModules": true,
 | 
			
		||||
    "moduleDetection": "force",
 | 
			
		||||
    "noEmit": true,
 | 
			
		||||
    "baseUrl": "./",
 | 
			
		||||
    "typeRoots": [
 | 
			
		||||
      "node_modules/@types",
 | 
			
		||||
      "node_modules/@kevisual/types",
 | 
			
		||||
    ],
 | 
			
		||||
    "paths": {
 | 
			
		||||
      "@/*": [
 | 
			
		||||
        "src/*"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    /* Linting */
 | 
			
		||||
    "strict": true,
 | 
			
		||||
    "noImplicitAny": false,
 | 
			
		||||
    "noUnusedLocals": false,
 | 
			
		||||
    "noUnusedParameters": false,
 | 
			
		||||
    "noFallthroughCasesInSwitch": true
 | 
			
		||||
  },
 | 
			
		||||
  "include": [
 | 
			
		||||
    "src",
 | 
			
		||||
    "typings.d.ts",
 | 
			
		||||
    "snippets"
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
import { defineConfig } from 'vite';
 | 
			
		||||
import basicSsl from '@kevisual/ssl';
 | 
			
		||||
import basicSsl from '@vitejs/plugin-basic-ssl';
 | 
			
		||||
// import react from '@vitejs/plugin-react';
 | 
			
		||||
import dayjs from 'dayjs';
 | 
			
		||||
import path from 'path';
 | 
			
		||||
							
								
								
									
										5048
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										5048
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2
									
								
								pnpm-workspace.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								pnpm-workspace.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
packages:
 | 
			
		||||
  - "packages/user-login"
 | 
			
		||||
@@ -1,18 +1,3 @@
 | 
			
		||||
export const silkyConfig = {
 | 
			
		||||
  captchaAppId: '196626989',
 | 
			
		||||
  wxLogin: {
 | 
			
		||||
    appid: 'wxea912643e8747b44',
 | 
			
		||||
    redirect_uri: 'https://kevisual.silkyai.cn/api/wx/login',
 | 
			
		||||
  },
 | 
			
		||||
  wxmpLogin: {
 | 
			
		||||
    loginUrl: `https://kevisual.xiongxiao.me/root/mini-web/login.html`,
 | 
			
		||||
  },
 | 
			
		||||
  loginWay: ['account', 'wechat', 'phone', 'wechat-mp'],
 | 
			
		||||
  loginSuccess: '/root/center/',
 | 
			
		||||
  loginSuccessIsNew: '/root/center/',
 | 
			
		||||
  beian: '浙ICP备2024137660号-1',
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const currentUrl = new URL(window.location.href);
 | 
			
		||||
const redirect = currentUrl.origin + currentUrl.pathname;
 | 
			
		||||
export const kevisualConfig = {
 | 
			
		||||
@@ -48,11 +33,6 @@ const kevisualXiongxiaoConfig = {
 | 
			
		||||
 | 
			
		||||
const url = new URL(window.location.href);
 | 
			
		||||
const isKevisual = url.hostname === 'kevisual.cn';
 | 
			
		||||
const isKevisualXiongxiao = url.hostname === 'kevisual.xiongxiao.me';
 | 
			
		||||
export const config = isKevisual ? kevisualConfig : isKevisualXiongxiao ? kevisualXiongxiaoConfig : silkyConfig;
 | 
			
		||||
export const config = isKevisual ? kevisualConfig : kevisualXiongxiaoConfig;
 | 
			
		||||
 | 
			
		||||
if (isKevisual || isKevisualXiongxiao) {
 | 
			
		||||
  // document.title = '杭州余杭逸文设计工作室';
 | 
			
		||||
} else {
 | 
			
		||||
  document.title = 'SilkyAI';
 | 
			
		||||
}
 | 
			
		||||
document.title = '杭州余杭逸文设计工作室';
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 12 KiB  | 
							
								
								
									
										46
									
								
								src/components/html.astro
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/components/html.astro
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
---
 | 
			
		||||
import '../styles/global.css';
 | 
			
		||||
export interface Props {
 | 
			
		||||
  title?: string;
 | 
			
		||||
  description?: string;
 | 
			
		||||
  lang?: string;
 | 
			
		||||
  charset?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const { title = 'Light Code', description = 'A lightweight code editor', lang = 'zh-CN', charset = 'UTF-8' } = Astro.props;
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
<!doctype html>
 | 
			
		||||
<html lang={lang}>
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset={charset} />
 | 
			
		||||
    <meta name='viewport' content='width=device-width, initial-scale=1.0' />
 | 
			
		||||
    <meta name='description' content={description} />
 | 
			
		||||
    <title>{title}</title>
 | 
			
		||||
    <!-- 样式 -->
 | 
			
		||||
    <slot name='head' />
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    <slot />
 | 
			
		||||
 | 
			
		||||
    <!-- 脚本 -->
 | 
			
		||||
    <slot name='scripts' />
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
<style>
 | 
			
		||||
  html {
 | 
			
		||||
    font-family: system-ui, sans-serif;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  html,
 | 
			
		||||
  body {
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    padding: 0;
 | 
			
		||||
    min-height: 100vh;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  * {
 | 
			
		||||
    box-sizing: border-box;
 | 
			
		||||
  }
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										60
									
								
								src/components/ui/button.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/components/ui/button.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,60 @@
 | 
			
		||||
import * as React from "react"
 | 
			
		||||
import { Slot } from "@radix-ui/react-slot"
 | 
			
		||||
import { cva, type VariantProps } from "class-variance-authority"
 | 
			
		||||
 | 
			
		||||
import { cn } from "@/lib/utils"
 | 
			
		||||
 | 
			
		||||
const buttonVariants = cva(
 | 
			
		||||
  "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
 | 
			
		||||
  {
 | 
			
		||||
    variants: {
 | 
			
		||||
      variant: {
 | 
			
		||||
        default: "bg-primary text-primary-foreground hover:bg-primary/90",
 | 
			
		||||
        destructive:
 | 
			
		||||
          "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
 | 
			
		||||
        outline:
 | 
			
		||||
          "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
 | 
			
		||||
        secondary:
 | 
			
		||||
          "bg-secondary text-secondary-foreground hover:bg-secondary/80",
 | 
			
		||||
        ghost:
 | 
			
		||||
          "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
 | 
			
		||||
        link: "text-primary underline-offset-4 hover:underline",
 | 
			
		||||
      },
 | 
			
		||||
      size: {
 | 
			
		||||
        default: "h-9 px-4 py-2 has-[>svg]:px-3",
 | 
			
		||||
        sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
 | 
			
		||||
        lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
 | 
			
		||||
        icon: "size-9",
 | 
			
		||||
        "icon-sm": "size-8",
 | 
			
		||||
        "icon-lg": "size-10",
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    defaultVariants: {
 | 
			
		||||
      variant: "default",
 | 
			
		||||
      size: "default",
 | 
			
		||||
    },
 | 
			
		||||
  }
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
function Button({
 | 
			
		||||
  className,
 | 
			
		||||
  variant,
 | 
			
		||||
  size,
 | 
			
		||||
  asChild = false,
 | 
			
		||||
  ...props
 | 
			
		||||
}: React.ComponentProps<"button"> &
 | 
			
		||||
  VariantProps<typeof buttonVariants> & {
 | 
			
		||||
    asChild?: boolean
 | 
			
		||||
  }) {
 | 
			
		||||
  const Comp = asChild ? Slot : "button"
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <Comp
 | 
			
		||||
      data-slot="button"
 | 
			
		||||
      className={cn(buttonVariants({ variant, size, className }))}
 | 
			
		||||
      {...props}
 | 
			
		||||
    />
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export { Button, buttonVariants }
 | 
			
		||||
							
								
								
									
										17
									
								
								src/content.config.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/content.config.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
// @ts-ignore
 | 
			
		||||
import { defineCollection, z } from 'astro:content';
 | 
			
		||||
import { glob, file } from 'astro/loaders'; // 不适用于旧版 API
 | 
			
		||||
 | 
			
		||||
const docs = defineCollection({
 | 
			
		||||
  // loader: glob({ pattern: '**/*.md', base: './src/data/blogs' }),
 | 
			
		||||
  loader: glob({ pattern: '**/[^_]*.md', base: './src/data/docs' }),
 | 
			
		||||
  schema: z.object({
 | 
			
		||||
    title: z.string().optional(),
 | 
			
		||||
    description: z.string().optional(),
 | 
			
		||||
    // pubDate: z.coerce.date(),
 | 
			
		||||
    // updatedDate: z.coerce.date().optional(),
 | 
			
		||||
  }),
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export const collections = { docs };
 | 
			
		||||
							
								
								
									
										16
									
								
								src/data/docs/home.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/data/docs/home.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
# 首页描述
 | 
			
		||||
 | 
			
		||||
所有的页面的登录入口在当前页面,
 | 
			
		||||
 | 
			
		||||
## 功能设计
 | 
			
		||||
 | 
			
		||||
- 登录
 | 
			
		||||
- 记录文本
 | 
			
		||||
- 上传文件和内容
 | 
			
		||||
- 导航配置
 | 
			
		||||
- 命令执行
 | 
			
		||||
- 历史记录
 | 
			
		||||
 | 
			
		||||
## 任务管理
 | 
			
		||||
 | 
			
		||||
- [ ]  登录功能
 | 
			
		||||
							
								
								
									
										8
									
								
								src/data/docs/simpalte-template.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/data/docs/simpalte-template.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
---
 | 
			
		||||
title: 'astro 例子'
 | 
			
		||||
tags: ['astro', 'simple', 'template']
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## astro-simplate-template
 | 
			
		||||
 | 
			
		||||
astro 是一个非常好的
 | 
			
		||||
							
								
								
									
										24
									
								
								src/layouts/blank.astro
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/layouts/blank.astro
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
---
 | 
			
		||||
import '../styles/global.css';
 | 
			
		||||
import '../styles/theme.css';
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
<html lang='zh-CN'>
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset='UTF-8' />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
			
		||||
    <title>AI Pages</title>
 | 
			
		||||
    <style>
 | 
			
		||||
      html,
 | 
			
		||||
      body {
 | 
			
		||||
        width: 100%;
 | 
			
		||||
        min-height: 100vh;
 | 
			
		||||
        margin: 0;
 | 
			
		||||
        padding: 0;
 | 
			
		||||
      }
 | 
			
		||||
    </style>
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    <slot />
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										61
									
								
								src/layouts/mdx.astro
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								src/layouts/mdx.astro
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
---
 | 
			
		||||
export interface Props {
 | 
			
		||||
  children: any;
 | 
			
		||||
}
 | 
			
		||||
import '../styles/global.css';
 | 
			
		||||
import '../styles/theme.css';
 | 
			
		||||
import 'github-markdown-css/github-markdown-light.css';
 | 
			
		||||
export interface Props {
 | 
			
		||||
  title?: string;
 | 
			
		||||
  description?: string;
 | 
			
		||||
  lang?: string;
 | 
			
		||||
  charset?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const { title = 'Light Code', description = 'A lightweight code editor', lang = 'zh-CN', charset = 'UTF-8' } = Astro.props;
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
<html lang='zh-CN'>
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset='UTF-8' />
 | 
			
		||||
    <meta name='viewport' content='width=device-width, initial-scale=1.0' />
 | 
			
		||||
    <title>Docs</title>
 | 
			
		||||
    <link
 | 
			
		||||
      rel='stylesheet'
 | 
			
		||||
      href='https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.8.1/github-markdown-light.min.css'
 | 
			
		||||
      integrity='sha512-X175XRJAO6PHAUi8AA7GP8uUF5Wiv+w9bOi64i02CHKDQBsO1yy0jLSKaUKg/NhRCDYBmOLQCfKaTaXiyZlLrw=='
 | 
			
		||||
      crossorigin='anonymous'
 | 
			
		||||
      referrerpolicy='no-referrer'
 | 
			
		||||
    />
 | 
			
		||||
    <style>
 | 
			
		||||
      html,
 | 
			
		||||
      body {
 | 
			
		||||
        width: 100%;
 | 
			
		||||
        height: 100%;
 | 
			
		||||
        margin: 0;
 | 
			
		||||
        padding: 0;
 | 
			
		||||
        overflow: hidden;
 | 
			
		||||
      }
 | 
			
		||||
      body {
 | 
			
		||||
        display: flex;
 | 
			
		||||
        flex-direction: column;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
      }
 | 
			
		||||
    </style>
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    <div>
 | 
			
		||||
      <slot name='header' />
 | 
			
		||||
    </div>
 | 
			
		||||
    <main class='p-2 flex-1 overflow-hidden'>
 | 
			
		||||
      <div class='markdown-body h-full scrollbar border-gray-200 overflow-auto px-6 py-2 w-[800px] border my-4 rounded-md shadow-md'>
 | 
			
		||||
        <slot />
 | 
			
		||||
      </div>
 | 
			
		||||
    </main>
 | 
			
		||||
    <footer>
 | 
			
		||||
      <slot name='footer'>
 | 
			
		||||
        <p>Copyrignt © 2025</p>
 | 
			
		||||
      </slot>
 | 
			
		||||
    </footer>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										6
									
								
								src/lib/utils.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/lib/utils.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
import { clsx, type ClassValue } from "clsx"
 | 
			
		||||
import { twMerge } from "tailwind-merge"
 | 
			
		||||
 | 
			
		||||
export function cn(...inputs: ClassValue[]) {
 | 
			
		||||
  return twMerge(clsx(inputs))
 | 
			
		||||
}
 | 
			
		||||
@@ -1,2 +1,4 @@
 | 
			
		||||
// @ts-ignore
 | 
			
		||||
export const basename = DEV_SERVER ? '/' : BASE_NAME;
 | 
			
		||||
export const basename = BASE_NAME;
 | 
			
		||||
 | 
			
		||||
console.log(basename);
 | 
			
		||||
							
								
								
									
										9
									
								
								src/pages/demos/base.astro
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/pages/demos/base.astro
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
---
 | 
			
		||||
import Html from '@/components/html.astro';
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
<Html>
 | 
			
		||||
  <main>
 | 
			
		||||
   
 | 
			
		||||
  </main>
 | 
			
		||||
</Html>
 | 
			
		||||
							
								
								
									
										23
									
								
								src/pages/docs/[...id].astro
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/pages/docs/[...id].astro
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
---
 | 
			
		||||
import { getCollection, render } from 'astro:content';
 | 
			
		||||
import Main from '@/layouts/mdx.astro';
 | 
			
		||||
// 1. 为每个集合条目生成一个新路径
 | 
			
		||||
export async function getStaticPaths() {
 | 
			
		||||
  const posts = await getCollection('docs');
 | 
			
		||||
  return posts.map((post) => ({
 | 
			
		||||
    params: { id: post.id },
 | 
			
		||||
    props: { post },  
 | 
			
		||||
  }));
 | 
			
		||||
}
 | 
			
		||||
type Post = {
 | 
			
		||||
  data: { title: string };
 | 
			
		||||
};
 | 
			
		||||
// 2. 对于你的模板,你可以直接从 prop 获取条目
 | 
			
		||||
const { post } = Astro.props as { post: Post };
 | 
			
		||||
const { Content } = await render(post);
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
<Main>
 | 
			
		||||
  <!-- <h1 slot={'header'}>{post.data.title}</h1> -->
 | 
			
		||||
  <Content />
 | 
			
		||||
</Main>
 | 
			
		||||
							
								
								
									
										23
									
								
								src/pages/docs/index.astro
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/pages/docs/index.astro
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
---
 | 
			
		||||
import { getCollection } from 'astro:content';
 | 
			
		||||
const posts = await getCollection('docs');
 | 
			
		||||
console.log('post', posts);
 | 
			
		||||
import { basename } from '@/modules/basename';
 | 
			
		||||
import Blank from '@/layouts/blank.astro';
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
<Blank>
 | 
			
		||||
  <main class='max-w-3xl mx-auto'>
 | 
			
		||||
    <h1>My posts</h1>
 | 
			
		||||
    <ul class='p-2 m-2'>
 | 
			
		||||
      {
 | 
			
		||||
        posts.map((post) => (
 | 
			
		||||
          <li>
 | 
			
		||||
            {/* <a href={`${basename}/demo/${post.id}`}>{post.data.title}</a> */}
 | 
			
		||||
            <a href={`/docs/${post.id}/`}>{post.data.title}</a>
 | 
			
		||||
          </li>
 | 
			
		||||
        ))
 | 
			
		||||
      }
 | 
			
		||||
    </ul>
 | 
			
		||||
  </main>
 | 
			
		||||
</Blank>
 | 
			
		||||
							
								
								
									
										46
									
								
								src/pages/index.astro
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/pages/index.astro
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
---
 | 
			
		||||
console.log('Hello from index.astro');
 | 
			
		||||
import '../styles/global.css';
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
<html lang='en'>
 | 
			
		||||
  <head>
 | 
			
		||||
    <title>Home</title>
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    <h1 onclick="{onClick}">Welcome to my website!</h1>
 | 
			
		||||
    <div class='bg-amber-50 w-20 h-20 rounded-full'></div>
 | 
			
		||||
    <div id='root'></div>
 | 
			
		||||
    <script type='importmap' data-vite-ignore is:inline>
 | 
			
		||||
      {
 | 
			
		||||
        "imports": {
 | 
			
		||||
          "react": "https://esm.sh/react@19.1.0",
 | 
			
		||||
          "react-dom": "https://esm.sh/react-dom@19.1.0/client.js",
 | 
			
		||||
          "react-toastify": "https://esm.sh/react-toastify@11.0.5"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    </script>
 | 
			
		||||
    <script type='module' data-vite-ignore is:inline>
 | 
			
		||||
      import { Button, message } from 'https://esm.sh/antd?standalone';
 | 
			
		||||
      import React from 'react';
 | 
			
		||||
      import { ToastContainer, toast } from 'react-toastify';
 | 
			
		||||
      import { createRoot } from 'react-dom';
 | 
			
		||||
      setTimeout(() => {
 | 
			
		||||
        toast.loading('Hello from index.astro');
 | 
			
		||||
        window.toast = toast;
 | 
			
		||||
        console.log('message', toast);
 | 
			
		||||
      }, 1000);
 | 
			
		||||
      console.log('Hello from index.astro', Button);
 | 
			
		||||
      const root = document.getElementById('root');
 | 
			
		||||
      const render = createRoot(root);
 | 
			
		||||
      const App = () => {
 | 
			
		||||
        const button = React.createElement(Button, null, 'Hello');
 | 
			
		||||
        const messageEl = React.createElement(ToastContainer, null, 'Hello');
 | 
			
		||||
        const wrapperMessage = React.createElement('div', null, [button, messageEl]);
 | 
			
		||||
        return wrapperMessage;
 | 
			
		||||
      };
 | 
			
		||||
      // render.render(React.createElement(Button, null, 'Hello'), root);
 | 
			
		||||
      render.render(App(), root);
 | 
			
		||||
    </script>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										120
									
								
								src/styles/global.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								src/styles/global.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,120 @@
 | 
			
		||||
@import 'tailwindcss';
 | 
			
		||||
@import "tw-animate-css";
 | 
			
		||||
 | 
			
		||||
@custom-variant dark (&:is(.dark *));
 | 
			
		||||
 | 
			
		||||
@theme inline {
 | 
			
		||||
  --radius-sm: calc(var(--radius) - 4px);
 | 
			
		||||
  --radius-md: calc(var(--radius) - 2px);
 | 
			
		||||
  --radius-lg: var(--radius);
 | 
			
		||||
  --radius-xl: calc(var(--radius) + 4px);
 | 
			
		||||
  --color-background: var(--background);
 | 
			
		||||
  --color-foreground: var(--foreground);
 | 
			
		||||
  --color-card: var(--card);
 | 
			
		||||
  --color-card-foreground: var(--card-foreground);
 | 
			
		||||
  --color-popover: var(--popover);
 | 
			
		||||
  --color-popover-foreground: var(--popover-foreground);
 | 
			
		||||
  --color-primary: var(--primary);
 | 
			
		||||
  --color-primary-foreground: var(--primary-foreground);
 | 
			
		||||
  --color-secondary: var(--secondary);
 | 
			
		||||
  --color-secondary-foreground: var(--secondary-foreground);
 | 
			
		||||
  --color-muted: var(--muted);
 | 
			
		||||
  --color-muted-foreground: var(--muted-foreground);
 | 
			
		||||
  --color-accent: var(--accent);
 | 
			
		||||
  --color-accent-foreground: var(--accent-foreground);
 | 
			
		||||
  --color-destructive: var(--destructive);
 | 
			
		||||
  --color-border: var(--border);
 | 
			
		||||
  --color-input: var(--input);
 | 
			
		||||
  --color-ring: var(--ring);
 | 
			
		||||
  --color-chart-1: var(--chart-1);
 | 
			
		||||
  --color-chart-2: var(--chart-2);
 | 
			
		||||
  --color-chart-3: var(--chart-3);
 | 
			
		||||
  --color-chart-4: var(--chart-4);
 | 
			
		||||
  --color-chart-5: var(--chart-5);
 | 
			
		||||
  --color-sidebar: var(--sidebar);
 | 
			
		||||
  --color-sidebar-foreground: var(--sidebar-foreground);
 | 
			
		||||
  --color-sidebar-primary: var(--sidebar-primary);
 | 
			
		||||
  --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
 | 
			
		||||
  --color-sidebar-accent: var(--sidebar-accent);
 | 
			
		||||
  --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
 | 
			
		||||
  --color-sidebar-border: var(--sidebar-border);
 | 
			
		||||
  --color-sidebar-ring: var(--sidebar-ring);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
:root {
 | 
			
		||||
  --radius: 0.625rem;
 | 
			
		||||
  --background: oklch(1 0 0);
 | 
			
		||||
  --foreground: oklch(0.145 0 0);
 | 
			
		||||
  --card: oklch(1 0 0);
 | 
			
		||||
  --card-foreground: oklch(0.145 0 0);
 | 
			
		||||
  --popover: oklch(1 0 0);
 | 
			
		||||
  --popover-foreground: oklch(0.145 0 0);
 | 
			
		||||
  --primary: oklch(0.205 0 0);
 | 
			
		||||
  --primary-foreground: oklch(0.985 0 0);
 | 
			
		||||
  --secondary: oklch(0.97 0 0);
 | 
			
		||||
  --secondary-foreground: oklch(0.205 0 0);
 | 
			
		||||
  --muted: oklch(0.97 0 0);
 | 
			
		||||
  --muted-foreground: oklch(0.556 0 0);
 | 
			
		||||
  --accent: oklch(0.97 0 0);
 | 
			
		||||
  --accent-foreground: oklch(0.205 0 0);
 | 
			
		||||
  --destructive: oklch(0.577 0.245 27.325);
 | 
			
		||||
  --border: oklch(0.922 0 0);
 | 
			
		||||
  --input: oklch(0.922 0 0);
 | 
			
		||||
  --ring: oklch(0.708 0 0);
 | 
			
		||||
  --chart-1: oklch(0.646 0.222 41.116);
 | 
			
		||||
  --chart-2: oklch(0.6 0.118 184.704);
 | 
			
		||||
  --chart-3: oklch(0.398 0.07 227.392);
 | 
			
		||||
  --chart-4: oklch(0.828 0.189 84.429);
 | 
			
		||||
  --chart-5: oklch(0.769 0.188 70.08);
 | 
			
		||||
  --sidebar: oklch(0.985 0 0);
 | 
			
		||||
  --sidebar-foreground: oklch(0.145 0 0);
 | 
			
		||||
  --sidebar-primary: oklch(0.205 0 0);
 | 
			
		||||
  --sidebar-primary-foreground: oklch(0.985 0 0);
 | 
			
		||||
  --sidebar-accent: oklch(0.97 0 0);
 | 
			
		||||
  --sidebar-accent-foreground: oklch(0.205 0 0);
 | 
			
		||||
  --sidebar-border: oklch(0.922 0 0);
 | 
			
		||||
  --sidebar-ring: oklch(0.708 0 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.dark {
 | 
			
		||||
  --background: oklch(0.145 0 0);
 | 
			
		||||
  --foreground: oklch(0.985 0 0);
 | 
			
		||||
  --card: oklch(0.205 0 0);
 | 
			
		||||
  --card-foreground: oklch(0.985 0 0);
 | 
			
		||||
  --popover: oklch(0.205 0 0);
 | 
			
		||||
  --popover-foreground: oklch(0.985 0 0);
 | 
			
		||||
  --primary: oklch(0.922 0 0);
 | 
			
		||||
  --primary-foreground: oklch(0.205 0 0);
 | 
			
		||||
  --secondary: oklch(0.269 0 0);
 | 
			
		||||
  --secondary-foreground: oklch(0.985 0 0);
 | 
			
		||||
  --muted: oklch(0.269 0 0);
 | 
			
		||||
  --muted-foreground: oklch(0.708 0 0);
 | 
			
		||||
  --accent: oklch(0.269 0 0);
 | 
			
		||||
  --accent-foreground: oklch(0.985 0 0);
 | 
			
		||||
  --destructive: oklch(0.704 0.191 22.216);
 | 
			
		||||
  --border: oklch(1 0 0 / 10%);
 | 
			
		||||
  --input: oklch(1 0 0 / 15%);
 | 
			
		||||
  --ring: oklch(0.556 0 0);
 | 
			
		||||
  --chart-1: oklch(0.488 0.243 264.376);
 | 
			
		||||
  --chart-2: oklch(0.696 0.17 162.48);
 | 
			
		||||
  --chart-3: oklch(0.769 0.188 70.08);
 | 
			
		||||
  --chart-4: oklch(0.627 0.265 303.9);
 | 
			
		||||
  --chart-5: oklch(0.645 0.246 16.439);
 | 
			
		||||
  --sidebar: oklch(0.205 0 0);
 | 
			
		||||
  --sidebar-foreground: oklch(0.985 0 0);
 | 
			
		||||
  --sidebar-primary: oklch(0.488 0.243 264.376);
 | 
			
		||||
  --sidebar-primary-foreground: oklch(0.985 0 0);
 | 
			
		||||
  --sidebar-accent: oklch(0.269 0 0);
 | 
			
		||||
  --sidebar-accent-foreground: oklch(0.985 0 0);
 | 
			
		||||
  --sidebar-border: oklch(1 0 0 / 10%);
 | 
			
		||||
  --sidebar-ring: oklch(0.556 0 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@layer base {
 | 
			
		||||
  * {
 | 
			
		||||
    @apply border-border outline-ring/50;
 | 
			
		||||
  }
 | 
			
		||||
  body {
 | 
			
		||||
    @apply bg-background text-foreground;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										98
									
								
								src/styles/theme.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								src/styles/theme.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,98 @@
 | 
			
		||||
@import 'tailwindcss';
 | 
			
		||||
 | 
			
		||||
@theme {
 | 
			
		||||
  /* --color-primary: #ffc107;
 | 
			
		||||
  --color-secondary: #ffa000;
 | 
			
		||||
  --color-text-primary: #000000;
 | 
			
		||||
  --color-text-secondary: #000000;
 | 
			
		||||
  --color-success: #28a745; */
 | 
			
		||||
 | 
			
		||||
  --color-scrollbar-thumb: #999999;
 | 
			
		||||
  --color-scrollbar-track: rgba(0, 0, 0, 0.1);
 | 
			
		||||
  --color-scrollbar-thumb-hover: #666666;
 | 
			
		||||
  --scrollbar-color: #ffc107;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
html,
 | 
			
		||||
body {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  font-size: 16px;
 | 
			
		||||
  font-family: 'Montserrat', sans-serif;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* font-family */
 | 
			
		||||
@utility font-family-mon {
 | 
			
		||||
  font-family: 'Montserrat', sans-serif;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@utility font-family-rob {
 | 
			
		||||
  font-family: 'Roboto', sans-serif;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@utility font-family-int {
 | 
			
		||||
  font-family: 'Inter', sans-serif;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@utility font-family-orb {
 | 
			
		||||
  font-family: 'Orbitron', sans-serif;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@utility font-family-din {
 | 
			
		||||
  font-family: 'DIN', sans-serif;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@utility flex-row-center {
 | 
			
		||||
  @apply flex flex-row items-center justify-center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@utility flex-col-center {
 | 
			
		||||
  @apply flex flex-col items-center justify-center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@utility scrollbar {
 | 
			
		||||
  overflow: auto;
 | 
			
		||||
 | 
			
		||||
  /* 整个滚动条 */
 | 
			
		||||
  &::-webkit-scrollbar {
 | 
			
		||||
    width: 3px;
 | 
			
		||||
    height: 3px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &::-webkit-scrollbar-track {
 | 
			
		||||
    background-color: var(--color-scrollbar-track);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* 滚动条有滑块的轨道部分 */
 | 
			
		||||
  &::-webkit-scrollbar-track-piece {
 | 
			
		||||
    background-color: transparent;
 | 
			
		||||
    border-radius: 1px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* 滚动条滑块(竖向:vertical 横向:horizontal) */
 | 
			
		||||
  &::-webkit-scrollbar-thumb {
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
    background-color: var(--color-scrollbar-thumb);
 | 
			
		||||
    border-radius: 5px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* 滚动条滑块hover */
 | 
			
		||||
  &::-webkit-scrollbar-thumb:hover {
 | 
			
		||||
    background-color: var(--color-scrollbar-thumb-hover);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* 同时有垂直和水平滚动条时交汇的部分 */
 | 
			
		||||
  &::-webkit-scrollbar-corner {
 | 
			
		||||
    display: block;
 | 
			
		||||
    /* 修复交汇时出现的白块 */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ul,
 | 
			
		||||
menu {
 | 
			
		||||
  list-style: disc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ol {
 | 
			
		||||
  list-style: decimal;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,41 +1,14 @@
 | 
			
		||||
{
 | 
			
		||||
  "extends": "@kevisual/types/json/frontend.json",
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    "jsx": "react-jsx",
 | 
			
		||||
    "target": "ES2020",
 | 
			
		||||
    "useDefineForClassFields": true,
 | 
			
		||||
    "lib": [
 | 
			
		||||
      "ES2020",
 | 
			
		||||
      "DOM",
 | 
			
		||||
      "DOM.Iterable"
 | 
			
		||||
    ],
 | 
			
		||||
    "module": "ESNext",
 | 
			
		||||
    "skipLibCheck": true,
 | 
			
		||||
    /* Bundler mode */
 | 
			
		||||
    "moduleResolution": "bundler",
 | 
			
		||||
    "allowImportingTsExtensions": true,
 | 
			
		||||
    "isolatedModules": true,
 | 
			
		||||
    "moduleDetection": "force",
 | 
			
		||||
    "noEmit": true,
 | 
			
		||||
    "baseUrl": "./",
 | 
			
		||||
    "typeRoots": [
 | 
			
		||||
      "node_modules/@types",
 | 
			
		||||
      "node_modules/@kevisual/types",
 | 
			
		||||
    ],
 | 
			
		||||
    "baseUrl": ".",
 | 
			
		||||
    "paths": {
 | 
			
		||||
      "@/*": [
 | 
			
		||||
        "src/*"
 | 
			
		||||
        "./src/*"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    /* Linting */
 | 
			
		||||
    "strict": true,
 | 
			
		||||
    "noImplicitAny": false,
 | 
			
		||||
    "noUnusedLocals": false,
 | 
			
		||||
    "noUnusedParameters": false,
 | 
			
		||||
    "noFallthroughCasesInSwitch": true
 | 
			
		||||
  },
 | 
			
		||||
  "include": [
 | 
			
		||||
    "src",
 | 
			
		||||
    "typings.d.ts",
 | 
			
		||||
    "snippets"
 | 
			
		||||
  ]
 | 
			
		||||
    "src/**/*",
 | 
			
		||||
  ],
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user