From fd30741151114d35e5641a03b7213ffd96eba23b Mon Sep 17 00:00:00 2001 From: xion Date: Sat, 15 Mar 2025 23:54:53 +0800 Subject: [PATCH] temp: add resources --- .npmrc | 4 +- package.json | 3 + packages/components/package.json | 31 + packages/components/src/button/index.tsx | 5 + packages/components/src/clsx/index.ts | 7 + packages/components/src/index.tsx | 1 + packages/components/src/theme/index.tsx | 64 ++ packages/components/tsconfig.json | 36 + packages/resources/.gitignore | 27 + packages/resources/index.html | 32 + packages/resources/package.json | 40 + packages/resources/src/app.ts | 12 + packages/resources/src/assets/index.css | 20 + packages/resources/src/main.ts | 50 ++ packages/resources/src/modules/basename.ts | 2 + packages/resources/src/modules/query.ts | 3 + packages/resources/src/pages/App.tsx | 39 + .../resources/src/pages/file/FileIcon.tsx | 92 +++ packages/resources/src/pages/file/index.tsx | 50 ++ .../src/pages/file/list/FileCard.tsx | 27 + .../src/pages/file/list/FileTable.tsx | 52 ++ packages/resources/src/pages/layout/Left.tsx | 112 +++ packages/resources/src/pages/main.tsx | 4 + packages/resources/src/pages/main/index.tsx | 22 + .../src/pages/message/ToastLogin.tsx | 21 + .../resources/src/pages/message/toastify.ts | 5 + .../resources/src/pages/modules/MenuList.tsx | 30 + .../resources/src/pages/settings/index.tsx | 104 +++ .../resources/src/pages/statistic/index.tsx | 32 + packages/resources/src/pages/store/layout.ts | 61 ++ .../resources/src/pages/store/resource.ts | 79 ++ .../resources/src/pages/store/settings.ts | 65 ++ .../resources/src/pages/store/statistic.ts | 31 + packages/resources/src/pages/upload/index.tsx | 71 ++ .../src/pages/upload/utils/upload-chunk.ts | 88 +++ .../src/pages/upload/utils/upload.ts | 73 ++ packages/resources/tsconfig.json | 39 + packages/resources/vite.config.mjs | 80 ++ pnpm-lock.yaml | 690 +++++++++++++++++- pnpm-workspace.yaml | 2 + 40 files changed, 2174 insertions(+), 32 deletions(-) create mode 100644 packages/components/package.json create mode 100644 packages/components/src/button/index.tsx create mode 100644 packages/components/src/clsx/index.ts create mode 100644 packages/components/src/index.tsx create mode 100644 packages/components/src/theme/index.tsx create mode 100644 packages/components/tsconfig.json create mode 100644 packages/resources/.gitignore create mode 100644 packages/resources/index.html create mode 100644 packages/resources/package.json create mode 100644 packages/resources/src/app.ts create mode 100644 packages/resources/src/assets/index.css create mode 100644 packages/resources/src/main.ts create mode 100644 packages/resources/src/modules/basename.ts create mode 100644 packages/resources/src/modules/query.ts create mode 100644 packages/resources/src/pages/App.tsx create mode 100644 packages/resources/src/pages/file/FileIcon.tsx create mode 100644 packages/resources/src/pages/file/index.tsx create mode 100644 packages/resources/src/pages/file/list/FileCard.tsx create mode 100644 packages/resources/src/pages/file/list/FileTable.tsx create mode 100644 packages/resources/src/pages/layout/Left.tsx create mode 100644 packages/resources/src/pages/main.tsx create mode 100644 packages/resources/src/pages/main/index.tsx create mode 100644 packages/resources/src/pages/message/ToastLogin.tsx create mode 100644 packages/resources/src/pages/message/toastify.ts create mode 100644 packages/resources/src/pages/modules/MenuList.tsx create mode 100644 packages/resources/src/pages/settings/index.tsx create mode 100644 packages/resources/src/pages/statistic/index.tsx create mode 100644 packages/resources/src/pages/store/layout.ts create mode 100644 packages/resources/src/pages/store/resource.ts create mode 100644 packages/resources/src/pages/store/settings.ts create mode 100644 packages/resources/src/pages/store/statistic.ts create mode 100644 packages/resources/src/pages/upload/index.tsx create mode 100644 packages/resources/src/pages/upload/utils/upload-chunk.ts create mode 100644 packages/resources/src/pages/upload/utils/upload.ts create mode 100644 packages/resources/tsconfig.json create mode 100644 packages/resources/vite.config.mjs create mode 100644 pnpm-workspace.yaml diff --git a/.npmrc b/.npmrc index 7446745..db88d76 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1,4 @@ //npm.xiongxiao.me/:_authToken=${ME_NPM_TOKEN} -//registry.npmjs.org/:_authToken=${NPM_TOKEN} \ No newline at end of file +//registry.npmjs.org/:_authToken=${NPM_TOKEN} + +ignore-workspace-root-check=true \ No newline at end of file diff --git a/package.json b/package.json index c1abb05..4300a30 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,8 @@ }, "dependencies": { "@ant-design/icons": "^5.6.1", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", "@icon-park/react": "^1.4.2", "@kevisual/codemirror": "^0.0.2", "@kevisual/container": "1.0.0", @@ -21,6 +23,7 @@ "@kevisual/system-ui": "^0.0.3", "@kevisual/ui": "^0.0.2", "@monaco-editor/react": "^4.7.0", + "@mui/material": "^6.4.7", "@tailwindcss/vite": "^4.0.12", "@uiw/react-textarea-code-editor": "^3.1.0", "@xyflow/react": "^12.4.4", diff --git a/packages/components/package.json b/packages/components/package.json new file mode 100644 index 0000000..3cf2660 --- /dev/null +++ b/packages/components/package.json @@ -0,0 +1,31 @@ +{ + "name": "@kevisual/center-components", + "version": "0.0.1", + "description": "center components", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "files": [ + "src" + ], + "keywords": [], + "author": "abearxiong ", + "license": "MIT", + "type": "module", + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@mui/material": "^6.4.7", + "react": "19.0.0", + "react-dom": "19.0.0" + }, + "exports": { + ".": "./src/index.tsx", + "./theme": "./src/theme/index.tsx", + "./button": "./src/button/index.tsx" + }, + "devDependencies": { + "clsx": "^2.1.1", + "tailwind-merge": "^3.0.2" + } +} \ No newline at end of file diff --git a/packages/components/src/button/index.tsx b/packages/components/src/button/index.tsx new file mode 100644 index 0000000..7c24765 --- /dev/null +++ b/packages/components/src/button/index.tsx @@ -0,0 +1,5 @@ +import MuiButton, { ButtonProps } from '@mui/material/Button'; + +export const Button = (props: ButtonProps) => { + return ; +}; diff --git a/packages/components/src/clsx/index.ts b/packages/components/src/clsx/index.ts new file mode 100644 index 0000000..de32246 --- /dev/null +++ b/packages/components/src/clsx/index.ts @@ -0,0 +1,7 @@ +import clsx, { ClassValue } from 'clsx'; +import { twMerge } from 'tailwind-merge'; + +export const clsxMerge = (...args: ClassValue[]) => { + return twMerge(clsx(...args)); +}; +export { clsx }; diff --git a/packages/components/src/index.tsx b/packages/components/src/index.tsx new file mode 100644 index 0000000..abd5fa0 --- /dev/null +++ b/packages/components/src/index.tsx @@ -0,0 +1 @@ +export * from './theme'; \ No newline at end of file diff --git a/packages/components/src/theme/index.tsx b/packages/components/src/theme/index.tsx new file mode 100644 index 0000000..810d48a --- /dev/null +++ b/packages/components/src/theme/index.tsx @@ -0,0 +1,64 @@ +import { createTheme, ThemeOptions } from '@mui/material/styles'; +import { useTheme as useMuiTheme, Theme } from '@mui/material/styles'; +import { amber } from '@mui/material/colors'; +export const themeOptions: ThemeOptions = { + palette: { + primary: { + main: '#ffc107', // amber[300] + }, + secondary: { + main: '#ffa000', // amber[500] + }, + divider: amber[200], + common: { + white: '#ffa000', + }, + text: { + primary: amber[600], + secondary: amber[600], + }, + background: { + default: '#ffffff', // 设置默认背景颜色 + // paper: '#f5f5f5', // 设置纸张背景颜色 + }, + }, + typography: { + // fontFamily: 'Roboto, sans-serif', + }, + components: { + MuiButtonBase: { + defaultProps: { + disableRipple: true, + }, + }, + MuiTextField: { + styleOverrides: { + root: { + '& .MuiOutlinedInput-root': { + '& fieldset': { + borderColor: amber[300], + }, + '&:hover fieldset': { + borderColor: amber[500], + }, + '& .MuiInputBase-input': { + color: amber[600], + }, + }, + '& .MuiInputLabel-root': { + color: amber[600], + }, + }, + }, + }, + }, +}; + +/** + * https://bareynol.github.io/mui-theme-creator/ + */ +export const theme = createTheme(themeOptions); + +export const useTheme = () => { + return useMuiTheme(); +}; diff --git a/packages/components/tsconfig.json b/packages/components/tsconfig.json new file mode 100644 index 0000000..aa72cb4 --- /dev/null +++ b/packages/components/tsconfig.json @@ -0,0 +1,36 @@ +{ + "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": {}, + /* Linting */ + "strict": true, + "noImplicitAny": false, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noFallthroughCasesInSwitch": true + }, + "include": [ + "src", + "typings.d.ts", + ] +} \ No newline at end of file diff --git a/packages/resources/.gitignore b/packages/resources/.gitignore new file mode 100644 index 0000000..e440e68 --- /dev/null +++ b/packages/resources/.gitignore @@ -0,0 +1,27 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +tsconfig.app.tsbuildinfo +tsconfig.node.tsbuildinfo \ No newline at end of file diff --git a/packages/resources/index.html b/packages/resources/index.html new file mode 100644 index 0000000..a4cb3fe --- /dev/null +++ b/packages/resources/index.html @@ -0,0 +1,32 @@ + + + + +AI Apps + + + + + + +
+ + + + + \ No newline at end of file diff --git a/packages/resources/package.json b/packages/resources/package.json new file mode 100644 index 0000000..7038575 --- /dev/null +++ b/packages/resources/package.json @@ -0,0 +1,40 @@ +{ + "name": "resources", + "version": "0.0.1", + "description": "", + "main": "index.js", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "keywords": [], + "author": "abearxiong ", + "license": "MIT", + "type": "module", + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@kevisual/center-components": "workspace:*", + "@kevisual/router": "^0.0.9", + "@kevisual/store": "^0.0.2", + "@mui/material": "^6.4.7", + "@types/lodash-es": "^4.17.12", + "@types/nprogress": "^0.2.3", + "@vitejs/plugin-basic-ssl": "^2.0.0", + "dayjs": "^1.11.13", + "immer": "^10.1.1", + "lodash-es": "^4.17.21", + "lucide-react": "^0.482.0", + "nanoid": "^5.1.3", + "nprogress": "^0.2.0", + "pretty-bytes": "^6.1.1", + "react": "19.0.0", + "react-dom": "19.0.0", + "react-dropzone": "^14.3.8", + "react-toastify": "^11.0.5", + "zustand": "^5.0.3" + }, + "devDependencies": { + "@kevisual/types": "^0.0.6" + } +} diff --git a/packages/resources/src/app.ts b/packages/resources/src/app.ts new file mode 100644 index 0000000..6a7fddf --- /dev/null +++ b/packages/resources/src/app.ts @@ -0,0 +1,12 @@ +import type { Page } from '@kevisual/store/page'; +import type { QueryRouterServer } from '@kevisual/router'; +import { basename } from './modules/basename'; +export const page = useContextKey('page', () => { + return new window.Page({ + basename, + }) as unknown as Page; +}); +export const app = useContextKey('app', () => { + console.error('app not found'); + return null as unknown as QueryRouterServer; +}); diff --git a/packages/resources/src/assets/index.css b/packages/resources/src/assets/index.css new file mode 100644 index 0000000..237fe8c --- /dev/null +++ b/packages/resources/src/assets/index.css @@ -0,0 +1,20 @@ +@import 'tailwindcss'; + +@layer components { + .test-loading { + @apply w-20 h-20 bg-gray-300 rounded-full animate-spin; + } +} +#root { + width: 100%; + height: 100%; +} +#ai-bot-root { + width: 100%; + height: 100%; + position: fixed; + top: 0; + left: -100px; + z-index: 9999; + pointer-events: none; +} diff --git a/packages/resources/src/main.ts b/packages/resources/src/main.ts new file mode 100644 index 0000000..504665e --- /dev/null +++ b/packages/resources/src/main.ts @@ -0,0 +1,50 @@ +import { page, app } from './app.ts'; +import { basename } from './modules/basename.ts'; +import './pages/main.tsx'; + +export const render = ({ renderRoot }) => { + renderRoot.innerHTML = ` +

Hello, World!

+ `; +}; +console.log('basename', basename, page, app); + +if (page) { + page.addPage('/', 'home'); + page.subscribe('home', () => { + render({ + renderRoot: document.getElementById('ai-root'), + }); + }); + page.addPage('', 'index'); + page.subscribe('index', () => { + const root = document.getElementById('ai-root') as HTMLElement; + root.innerHTML = ` +

Hello, World!

+ `; + }); +} + +if (app) { + app + .route({ + path: 'app-template', + key: 'render', + }) + .define(async (ctx) => { + let { renderRoot } = ctx.query; + if (!renderRoot) { + ctx.throw(404, 'renderRoot is required'); + } + if (typeof renderRoot === 'string') { + renderRoot = document.querySelector(renderRoot); + } + if (!renderRoot) { + ctx.throw(404, 'renderRoot not found'); + } + render({ + renderRoot, + }); + }) + .addTo(app); +} diff --git a/packages/resources/src/modules/basename.ts b/packages/resources/src/modules/basename.ts new file mode 100644 index 0000000..c4f3d9e --- /dev/null +++ b/packages/resources/src/modules/basename.ts @@ -0,0 +1,2 @@ +// @ts-ignore +export const basename = DEV_SERVER ? '/' : BASE_NAME; \ No newline at end of file diff --git a/packages/resources/src/modules/query.ts b/packages/resources/src/modules/query.ts new file mode 100644 index 0000000..f4660b4 --- /dev/null +++ b/packages/resources/src/modules/query.ts @@ -0,0 +1,3 @@ +import { QueryClient } from '@kevisual/query'; + +export const query = new QueryClient(); \ No newline at end of file diff --git a/packages/resources/src/pages/App.tsx b/packages/resources/src/pages/App.tsx new file mode 100644 index 0000000..8532ba2 --- /dev/null +++ b/packages/resources/src/pages/App.tsx @@ -0,0 +1,39 @@ +import { useEffect } from 'react'; +import { theme } from '@kevisual/center-components/theme'; +import { ThemeProvider } from '@mui/material/styles'; +import { Left } from './layout/Left'; +import { Main } from './main/index'; +import { ToastContainer } from 'react-toastify'; +import { useSettingsStore } from './store/settings'; +import { CircularProgress } from '@mui/material'; +import { useResourceStore } from './store/resource'; + +export const App = () => { + const { init, mounted, settings } = useSettingsStore(); + const { setPrefix, init: initResource } = useResourceStore(); + useEffect(() => { + init(); + initResource(); + }, []); + useEffect(() => { + if (settings.prefix && mounted) { + setPrefix(settings.prefix); + } + }, [mounted, settings.prefix]); + if (!mounted) { + return ( +
+ +
+ ); + } + + return ( + + +
+ + + + ); +}; diff --git a/packages/resources/src/pages/file/FileIcon.tsx b/packages/resources/src/pages/file/FileIcon.tsx new file mode 100644 index 0000000..61c4826 --- /dev/null +++ b/packages/resources/src/pages/file/FileIcon.tsx @@ -0,0 +1,92 @@ +import { FileText, Image, File, Video, Sheet, FileArchive, FolderClosedIcon } from 'lucide-react'; +import { SVGProps } from 'react'; + +export const PDFIcon = (props: SVGProps) => { + return ( + + + + ); +}; + +export const FilePowerpoint = (props: SVGProps) => { + return ( + + + + + ); +}; +export const getExtension = (name: string) => { + return name.split('.').pop(); +}; +export const getIcon = (name: string) => { + if (!name) { + return ; + } + const extension = getExtension(name); + switch (extension) { + case 'pdf': + return ; + case 'jpg': + case 'jpeg': + case 'gif': + case 'png': + return ; + case 'mp3': + case 'wav': + case 'ogg': + case 'm4a': + case 'aac': + case 'flac': + case 'wma': + case 'mp4': + return