From c34e597fe42ab49ee90f11dca107189ce46e546e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=9F=E8=B4=A4?= Date: Sun, 24 Mar 2024 22:34:20 +0800 Subject: [PATCH] merge --- .dumirc.ts | 5 +- .../__snapshots__/demo.test.tsx.snap | 0 .../__test__ => __test__}/demo.test.tsx | 0 .../__test__ => __test__}/index.test.tsx | 0 demos/chatgpt-nextjs/README.md | 36 - demos/chatgpt-nextjs/next-env.d.ts | 5 - demos/chatgpt-nextjs/next.config.js | 9 - demos/chatgpt-nextjs/package.json | 29 - .../src/app/api/openai/route.ts | 27 - .../chatgpt-nextjs/src/app/chatgpt/index.tsx | 35 - demos/chatgpt-nextjs/src/app/globals.css | 107 -- demos/chatgpt-nextjs/src/app/layout.tsx | 18 - demos/chatgpt-nextjs/src/app/page.tsx | 9 - demos/chatgpt-nextjs/tsconfig.json | 27 - demos/qwen-nextjs/README.md | 36 - demos/qwen-nextjs/next-env.d.ts | 5 - demos/qwen-nextjs/next.config.js | 9 - demos/qwen-nextjs/package.json | 28 - demos/qwen-nextjs/src/app/globals.css | 102 -- demos/qwen-nextjs/src/app/layout.tsx | 18 - demos/qwen-nextjs/src/app/page.tsx | 38 - demos/qwen-nextjs/src/app/qwen/route.ts | 35 - demos/qwen-nextjs/tsconfig.json | 27 - package.json | 6 +- pnpm-lock.yaml | 1494 ++++++----------- .../components/ChatList/ChatListItem.tsx | 99 -- .../components/ChatList/Extras/Assistant.tsx | 18 - .../components/ChatList/Extras/User.tsx | 22 - .../components/ChatList/Extras/index.ts | 8 - .../ChatList/Messages/Assistant.tsx | 9 - .../components/ChatList/Messages/Default.tsx | 12 - .../components/ChatList/Messages/Hello.tsx | 9 - .../components/ChatList/Messages/index.ts | 10 - src/ProChat/components/ChatList/OTPInput.tsx | 138 -- .../components/ChatList/SkeletonList.tsx | 34 - .../components/InputArea/ActionBar.tsx | 57 - .../InputArea/AutoCompleteTextArea.tsx | 54 - src/ProChat/index.tsx | 4 - src/ProChat/store/action.ts | 487 ------ src/ProChat/store/index.ts | 5 - src/ProChat/store/initialState.ts | 10 - src/ProChat/store/reducers/message.test.ts | 232 --- src/ProChat/store/reducers/message.ts | 114 -- src/ProChat/store/selectors/chat.ts | 105 -- src/ProChat/store/selectors/index.ts | 13 - src/ProChat/store/store.ts | 73 - src/ProChat/style/global.ts | 71 - src/ProChat/style/index.ts | 6 - src/ProChat/types/meta.ts | 23 - src/ProChat/utils/message.ts | 18 - src/ProChat/utils/storeDebug.ts | 11 - src/ProChat/utils/uuid.ts | 7 - src/components/Avatar/style.ts | 33 - .../ChatItem/components/Actions.tsx | 19 - src/components/ChatItem/components/Avatar.tsx | 45 - .../ChatItem/components/BorderSpacing.tsx | 13 - .../ChatItem/components/ErrorContent.tsx | 24 - src/components/ChatItem/index.tsx | 54 +- src/components/ChatItem/style.ts | 189 --- src/components/ChatItem/type.ts | 4 - .../components/ChatList/Loading.tsx | 0 src/components/ChatList/Messages/index.tsx | 13 + src/components/ChatList/SkeletonList.tsx | 12 + .../components/ChatList/index.tsx | 34 +- src/components/CopyButton/index.tsx | 4 +- .../Form/components/FormDivider.tsx | 8 - src/components/Form/components/FormFooter.tsx | 18 - src/components/Form/components/FormGroup.tsx | 68 - src/components/Form/components/FormItem.tsx | 37 - src/components/Form/components/FormTitle.tsx | 37 - src/components/Form/components/style.ts | 148 -- src/components/Form/index.tsx | 69 - src/components/Form/style.ts | 48 - src/components/Input/index.tsx | 57 - src/components/Input/style.ts | 54 - .../{ChatItem/components => }/Loading.tsx | 9 +- .../components => }/MessageContent.tsx | 21 +- src/{ => components}/ProChat/ProChat.tsx | 77 +- .../ProChat/demos/actions.tsx | 5 - .../ProChat/demos/bigData.tsx | 0 .../ProChat/demos/control.tsx | 0 .../ProChat/demos/default.tsx | 0 .../ProChat/demos/doc-mode.tsx | 0 .../ProChat/demos/draggable.tsx | 0 .../ProChat/demos/helloMessage.tsx | 0 .../ProChat/demos/initialChats.tsx | 0 .../ProChat/demos/loading.tsx | 0 src/{ => components}/ProChat/demos/meta.tsx | 0 .../ProChat/demos}/mocks/basic.ts | 0 .../ProChat/demos}/mocks/fullFeature.ts | 0 .../ProChat/demos}/mocks/sseResponse.ts | 0 .../ProChat/demos}/mocks/streamResponse.ts | 0 .../ProChat/demos}/mocks/threebody.ts | 0 src/{ => components}/ProChat/demos/modal.tsx | 0 .../ProChat/demos/no-stream.tsx | 0 .../ProChat/demos/renderInputArea.tsx | 0 .../ProChat/demos/request.tsx | 0 src/{ => components}/ProChat/demos/sse.tsx | 0 .../ProChat/demos/toBottomConfig.tsx | 0 .../ProChat/demos/use-ref.tsx | 0 src/{ => components}/ProChat/index.en-US.md | 94 -- src/{ => components}/ProChat/index.md | 96 -- src/components/ProChat/index.tsx | 2 + .../{Avatar => ProChatAvatar}/index.tsx | 20 +- src/components/ProChatInputArea/ActionBar.tsx | 53 + .../ProChatInputArea/AutoCompleteTextArea.tsx | 61 + .../ProChatInputArea}/StopLoading.tsx | 0 .../ProChatInputArea}/index.tsx | 118 +- .../{ChatItem/components => }/Title.tsx | 12 +- src/{ProChat => }/const/message.ts | 0 src/{ProChat => }/const/meta.ts | 0 src/hooks/useChatList.ts | 97 ++ src/hooks/useChatListActionsBar.tsx | 44 - src/{ProChat => }/hooks/useProChat.ts | 47 +- src/{ProChat => }/hooks/useRefFunction.ts | 0 src/index.ts | 10 +- src/locale/index.ts | 5 +- src/styles/colors.ts | 909 ---------- src/styles/index.ts | 1 - src/styles/stylish.ts | 238 --- src/{ProChat => }/types/chat.ts | 0 src/{ProChat => }/types/config.ts | 0 src/types/customStylish.ts | 9 - src/types/customToken.ts | 48 - src/types/index.ts | 2 - src/types/message.ts | 5 +- src/types/meta.ts | 11 +- src/{ProChat => }/utils/fetch.ts | 0 .../ChatItem => }/utils/formatTime.ts | 0 src/{ProChat => }/utils/merge.ts | 0 130 files changed, 970 insertions(+), 5766 deletions(-) rename {src/ProChat/__test__ => __test__}/__snapshots__/demo.test.tsx.snap (100%) rename {src/ProChat/__test__ => __test__}/demo.test.tsx (100%) rename {src/ProChat/__test__ => __test__}/index.test.tsx (100%) delete mode 100644 demos/chatgpt-nextjs/README.md delete mode 100644 demos/chatgpt-nextjs/next-env.d.ts delete mode 100644 demos/chatgpt-nextjs/next.config.js delete mode 100644 demos/chatgpt-nextjs/package.json delete mode 100644 demos/chatgpt-nextjs/src/app/api/openai/route.ts delete mode 100644 demos/chatgpt-nextjs/src/app/chatgpt/index.tsx delete mode 100644 demos/chatgpt-nextjs/src/app/globals.css delete mode 100644 demos/chatgpt-nextjs/src/app/layout.tsx delete mode 100644 demos/chatgpt-nextjs/src/app/page.tsx delete mode 100644 demos/chatgpt-nextjs/tsconfig.json delete mode 100644 demos/qwen-nextjs/README.md delete mode 100644 demos/qwen-nextjs/next-env.d.ts delete mode 100644 demos/qwen-nextjs/next.config.js delete mode 100644 demos/qwen-nextjs/package.json delete mode 100644 demos/qwen-nextjs/src/app/globals.css delete mode 100644 demos/qwen-nextjs/src/app/layout.tsx delete mode 100644 demos/qwen-nextjs/src/app/page.tsx delete mode 100644 demos/qwen-nextjs/src/app/qwen/route.ts delete mode 100644 demos/qwen-nextjs/tsconfig.json delete mode 100644 src/ProChat/components/ChatList/ChatListItem.tsx delete mode 100644 src/ProChat/components/ChatList/Extras/Assistant.tsx delete mode 100644 src/ProChat/components/ChatList/Extras/User.tsx delete mode 100644 src/ProChat/components/ChatList/Extras/index.ts delete mode 100644 src/ProChat/components/ChatList/Messages/Assistant.tsx delete mode 100644 src/ProChat/components/ChatList/Messages/Default.tsx delete mode 100644 src/ProChat/components/ChatList/Messages/Hello.tsx delete mode 100644 src/ProChat/components/ChatList/Messages/index.ts delete mode 100644 src/ProChat/components/ChatList/OTPInput.tsx delete mode 100644 src/ProChat/components/ChatList/SkeletonList.tsx delete mode 100644 src/ProChat/components/InputArea/ActionBar.tsx delete mode 100644 src/ProChat/components/InputArea/AutoCompleteTextArea.tsx delete mode 100644 src/ProChat/index.tsx delete mode 100644 src/ProChat/store/action.ts delete mode 100644 src/ProChat/store/index.ts delete mode 100644 src/ProChat/store/initialState.ts delete mode 100644 src/ProChat/store/reducers/message.test.ts delete mode 100644 src/ProChat/store/reducers/message.ts delete mode 100644 src/ProChat/store/selectors/chat.ts delete mode 100644 src/ProChat/store/selectors/index.ts delete mode 100644 src/ProChat/store/store.ts delete mode 100644 src/ProChat/style/global.ts delete mode 100644 src/ProChat/style/index.ts delete mode 100644 src/ProChat/types/meta.ts delete mode 100644 src/ProChat/utils/message.ts delete mode 100644 src/ProChat/utils/storeDebug.ts delete mode 100644 src/ProChat/utils/uuid.ts delete mode 100644 src/components/Avatar/style.ts delete mode 100644 src/components/ChatItem/components/Actions.tsx delete mode 100644 src/components/ChatItem/components/Avatar.tsx delete mode 100644 src/components/ChatItem/components/BorderSpacing.tsx delete mode 100644 src/components/ChatItem/components/ErrorContent.tsx delete mode 100644 src/components/ChatItem/style.ts rename src/{ProChat => }/components/ChatList/Loading.tsx (100%) create mode 100644 src/components/ChatList/Messages/index.tsx create mode 100644 src/components/ChatList/SkeletonList.tsx rename src/{ProChat => }/components/ChatList/index.tsx (50%) delete mode 100644 src/components/Form/components/FormDivider.tsx delete mode 100644 src/components/Form/components/FormFooter.tsx delete mode 100644 src/components/Form/components/FormGroup.tsx delete mode 100644 src/components/Form/components/FormItem.tsx delete mode 100644 src/components/Form/components/FormTitle.tsx delete mode 100644 src/components/Form/components/style.ts delete mode 100644 src/components/Form/index.tsx delete mode 100644 src/components/Form/style.ts delete mode 100644 src/components/Input/index.tsx delete mode 100644 src/components/Input/style.ts rename src/components/{ChatItem/components => }/Loading.tsx (56%) rename src/components/{ChatItem/components => }/MessageContent.tsx (56%) rename src/{ => components}/ProChat/ProChat.tsx (79%) rename src/{ => components}/ProChat/demos/actions.tsx (88%) rename src/{ => components}/ProChat/demos/bigData.tsx (100%) rename src/{ => components}/ProChat/demos/control.tsx (100%) rename src/{ => components}/ProChat/demos/default.tsx (100%) rename src/{ => components}/ProChat/demos/doc-mode.tsx (100%) rename src/{ => components}/ProChat/demos/draggable.tsx (100%) rename src/{ => components}/ProChat/demos/helloMessage.tsx (100%) rename src/{ => components}/ProChat/demos/initialChats.tsx (100%) rename src/{ => components}/ProChat/demos/loading.tsx (100%) rename src/{ => components}/ProChat/demos/meta.tsx (100%) rename src/{ProChat => components/ProChat/demos}/mocks/basic.ts (100%) rename src/{ProChat => components/ProChat/demos}/mocks/fullFeature.ts (100%) rename src/{ProChat => components/ProChat/demos}/mocks/sseResponse.ts (100%) rename src/{ProChat => components/ProChat/demos}/mocks/streamResponse.ts (100%) rename src/{ProChat => components/ProChat/demos}/mocks/threebody.ts (100%) rename src/{ => components}/ProChat/demos/modal.tsx (100%) rename src/{ => components}/ProChat/demos/no-stream.tsx (100%) rename src/{ => components}/ProChat/demos/renderInputArea.tsx (100%) rename src/{ => components}/ProChat/demos/request.tsx (100%) rename src/{ => components}/ProChat/demos/sse.tsx (100%) rename src/{ => components}/ProChat/demos/toBottomConfig.tsx (100%) rename src/{ => components}/ProChat/demos/use-ref.tsx (100%) rename src/{ => components}/ProChat/index.en-US.md (59%) rename src/{ => components}/ProChat/index.md (61%) create mode 100644 src/components/ProChat/index.tsx rename src/components/{Avatar => ProChatAvatar}/index.tsx (87%) create mode 100644 src/components/ProChatInputArea/ActionBar.tsx create mode 100644 src/components/ProChatInputArea/AutoCompleteTextArea.tsx rename src/{ProChat/components/InputArea => components/ProChatInputArea}/StopLoading.tsx (100%) rename src/{ProChat/components/InputArea => components/ProChatInputArea}/index.tsx (69%) rename src/components/{ChatItem/components => }/Title.tsx (66%) rename src/{ProChat => }/const/message.ts (100%) rename src/{ProChat => }/const/meta.ts (100%) create mode 100644 src/hooks/useChatList.ts delete mode 100644 src/hooks/useChatListActionsBar.tsx rename src/{ProChat => }/hooks/useProChat.ts (60%) rename src/{ProChat => }/hooks/useRefFunction.ts (100%) delete mode 100644 src/styles/colors.ts delete mode 100644 src/styles/index.ts delete mode 100644 src/styles/stylish.ts rename src/{ProChat => }/types/chat.ts (100%) rename src/{ProChat => }/types/config.ts (100%) delete mode 100644 src/types/customStylish.ts delete mode 100644 src/types/customToken.ts rename src/{ProChat => }/utils/fetch.ts (100%) rename src/{components/ChatItem => }/utils/formatTime.ts (100%) rename src/{ProChat => }/utils/merge.ts (100%) diff --git a/.dumirc.ts b/.dumirc.ts index c956c78a..311d3685 100644 --- a/.dumirc.ts +++ b/.dumirc.ts @@ -14,7 +14,10 @@ export default defineConfig({ footer: 'Made with ❤️ by 蚂蚁集团 - AFX & 数字科技', logo: 'https://mdn.alipayobjects.com/huamei_re70wt/afts/img/A*Mo27Sr3kS4kAAAAAAAAAAAAADmuEAQ/original', }, - mfsu: false, + title: '@ant-design/pro-chat', + resolve: { + docDirs: ['components/ProChat', 'docs'], + }, outputPath: 'docs-dist', html2sketch: {}, extraBabelPlugins: ['antd-style'], diff --git a/src/ProChat/__test__/__snapshots__/demo.test.tsx.snap b/__test__/__snapshots__/demo.test.tsx.snap similarity index 100% rename from src/ProChat/__test__/__snapshots__/demo.test.tsx.snap rename to __test__/__snapshots__/demo.test.tsx.snap diff --git a/src/ProChat/__test__/demo.test.tsx b/__test__/demo.test.tsx similarity index 100% rename from src/ProChat/__test__/demo.test.tsx rename to __test__/demo.test.tsx diff --git a/src/ProChat/__test__/index.test.tsx b/__test__/index.test.tsx similarity index 100% rename from src/ProChat/__test__/index.test.tsx rename to __test__/index.test.tsx diff --git a/demos/chatgpt-nextjs/README.md b/demos/chatgpt-nextjs/README.md deleted file mode 100644 index c4033664..00000000 --- a/demos/chatgpt-nextjs/README.md +++ /dev/null @@ -1,36 +0,0 @@ -This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). - -## Getting Started - -First, run the development server: - -```bash -npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev -``` - -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. - -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. - -This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. - -## Learn More - -To learn more about Next.js, take a look at the following resources: - -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. - -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! - -## Deploy on Vercel - -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. - -Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/demos/chatgpt-nextjs/next-env.d.ts b/demos/chatgpt-nextjs/next-env.d.ts deleted file mode 100644 index 4f11a03d..00000000 --- a/demos/chatgpt-nextjs/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/demos/chatgpt-nextjs/next.config.js b/demos/chatgpt-nextjs/next.config.js deleted file mode 100644 index 6b5521b7..00000000 --- a/demos/chatgpt-nextjs/next.config.js +++ /dev/null @@ -1,9 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - transpilePackages: [ - '@ant-design/pro-chat', - 'react-intersection-observer', - ], -}; - -module.exports = nextConfig; diff --git a/demos/chatgpt-nextjs/package.json b/demos/chatgpt-nextjs/package.json deleted file mode 100644 index a9da9f26..00000000 --- a/demos/chatgpt-nextjs/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "chatgpt-nextjs", - "version": "0.1.0", - "private": true, - "scripts": { - "build": "next build", - "dev": "next dev", - "lint": "next lint", - "start": "next start" - }, - "dependencies": { - "@ant-design/pro-chat": "^1.2.0", - "ai": "^2.2.31", - "antd": "^5.12.8", - "antd-style": "^3.6.1", - "next": "14.0.4", - "openai": "^4.24.7", - "react": "^18", - "react-dom": "^18" - }, - "devDependencies": { - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "eslint": "^8", - "eslint-config-next": "14.0.4", - "typescript": "^5" - } -} diff --git a/demos/chatgpt-nextjs/src/app/api/openai/route.ts b/demos/chatgpt-nextjs/src/app/api/openai/route.ts deleted file mode 100644 index 0117b65e..00000000 --- a/demos/chatgpt-nextjs/src/app/api/openai/route.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { OpenAIStream, StreamingTextResponse } from 'ai'; -import OpenAI from 'openai'; - -export async function POST(request: Request) { - const { messages = [] }: Partial<{ messages: Array }> = await request.json(); - - const openai = new OpenAI({ - apiKey: 'OpenAI Key', // your openai key - baseURL: 'base url', // if u dont need change baseUrl,you can delete this line - }); - - const PickMessages = messages.map((message) => { - return { - role: message.role, - content: message.content, - }; - }); - - const response = await openai.chat.completions.create({ - model: 'gpt-3.5-turbo', - messages: [...PickMessages], - stream: true, - }); - - const stream = OpenAIStream(response); - return new StreamingTextResponse(stream); -} diff --git a/demos/chatgpt-nextjs/src/app/chatgpt/index.tsx b/demos/chatgpt-nextjs/src/app/chatgpt/index.tsx deleted file mode 100644 index af545c7e..00000000 --- a/demos/chatgpt-nextjs/src/app/chatgpt/index.tsx +++ /dev/null @@ -1,35 +0,0 @@ -'use client'; -import { ProChat } from '@ant-design/pro-chat'; -import { useTheme } from 'antd-style'; -import { useEffect, useState } from 'react'; - -export default function Home() { - const theme = useTheme(); - const [showComponent, setShowComponent] = useState(false); - - useEffect(() => setShowComponent(true), []); - - return ( -
- {showComponent && ( - { - const response = await fetch('/api/openai', { - method: 'POST', - body: JSON.stringify({ messages: messages }), - }); - return response; - }} - /> - )} -
- ); -} diff --git a/demos/chatgpt-nextjs/src/app/globals.css b/demos/chatgpt-nextjs/src/app/globals.css deleted file mode 100644 index d4f491e1..00000000 --- a/demos/chatgpt-nextjs/src/app/globals.css +++ /dev/null @@ -1,107 +0,0 @@ -:root { - --max-width: 1100px; - --border-radius: 12px; - --font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', - 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', - 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace; - - --foreground-rgb: 0, 0, 0; - --background-start-rgb: 214, 219, 220; - --background-end-rgb: 255, 255, 255; - - --primary-glow: conic-gradient( - from 180deg at 50% 50%, - #16abff33 0deg, - #0885ff33 55deg, - #54d6ff33 120deg, - #0071ff33 160deg, - transparent 360deg - ); - --secondary-glow: radial-gradient( - rgba(255, 255, 255, 1), - rgba(255, 255, 255, 0) - ); - - --tile-start-rgb: 239, 245, 249; - --tile-end-rgb: 228, 232, 233; - --tile-border: conic-gradient( - #00000080, - #00000040, - #00000030, - #00000020, - #00000010, - #00000010, - #00000080 - ); - - --callout-rgb: 238, 240, 241; - --callout-border-rgb: 172, 175, 176; - --card-rgb: 180, 185, 188; - --card-border-rgb: 131, 134, 135; -} - -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; - - --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); - --secondary-glow: linear-gradient( - to bottom right, - rgba(1, 65, 255, 0), - rgba(1, 65, 255, 0), - rgba(1, 65, 255, 0.3) - ); - - --tile-start-rgb: 2, 13, 46; - --tile-end-rgb: 2, 5, 19; - --tile-border: conic-gradient( - #ffffff80, - #ffffff40, - #ffffff30, - #ffffff20, - #ffffff10, - #ffffff10, - #ffffff80 - ); - - --callout-rgb: 20, 20, 20; - --callout-border-rgb: 108, 108, 108; - --card-rgb: 100, 100, 100; - --card-border-rgb: 200, 200, 200; - } -} - -* { - box-sizing: border-box; - padding: 0; - margin: 0; -} - -html, -body { - max-width: 100vw; - overflow-x: hidden; -} - -body { - color: rgb(var(--foreground-rgb)); - background: linear-gradient( - to bottom, - transparent, - rgb(var(--background-end-rgb)) - ) - rgb(var(--background-start-rgb)); -} - -a { - color: inherit; - text-decoration: none; -} - -@media (prefers-color-scheme: dark) { - html { - color-scheme: dark; - } -} diff --git a/demos/chatgpt-nextjs/src/app/layout.tsx b/demos/chatgpt-nextjs/src/app/layout.tsx deleted file mode 100644 index 0f24671a..00000000 --- a/demos/chatgpt-nextjs/src/app/layout.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import type { Metadata } from 'next'; -import { Inter } from 'next/font/google'; -import './globals.css'; - -const inter = Inter({ subsets: ['latin'] }); - -export const metadata: Metadata = { - title: 'Create Next App', - description: 'Generated by create next app', -}; - -export default function RootLayout({ children }: { children: React.ReactNode }) { - return ( - - {children} - - ); -} diff --git a/demos/chatgpt-nextjs/src/app/page.tsx b/demos/chatgpt-nextjs/src/app/page.tsx deleted file mode 100644 index 92ba7b9a..00000000 --- a/demos/chatgpt-nextjs/src/app/page.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import Page from './chatgpt'; - -const Index = () => ( - <> - - -); - -export default Index; diff --git a/demos/chatgpt-nextjs/tsconfig.json b/demos/chatgpt-nextjs/tsconfig.json deleted file mode 100644 index e59724b2..00000000 --- a/demos/chatgpt-nextjs/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": ["./src/*"] - } - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/demos/qwen-nextjs/README.md b/demos/qwen-nextjs/README.md deleted file mode 100644 index c4033664..00000000 --- a/demos/qwen-nextjs/README.md +++ /dev/null @@ -1,36 +0,0 @@ -This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). - -## Getting Started - -First, run the development server: - -```bash -npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev -``` - -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. - -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. - -This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. - -## Learn More - -To learn more about Next.js, take a look at the following resources: - -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. - -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! - -## Deploy on Vercel - -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. - -Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/demos/qwen-nextjs/next-env.d.ts b/demos/qwen-nextjs/next-env.d.ts deleted file mode 100644 index 4f11a03d..00000000 --- a/demos/qwen-nextjs/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/demos/qwen-nextjs/next.config.js b/demos/qwen-nextjs/next.config.js deleted file mode 100644 index 6b5521b7..00000000 --- a/demos/qwen-nextjs/next.config.js +++ /dev/null @@ -1,9 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - transpilePackages: [ - '@ant-design/pro-chat', - 'react-intersection-observer', - ], -}; - -module.exports = nextConfig; diff --git a/demos/qwen-nextjs/package.json b/demos/qwen-nextjs/package.json deleted file mode 100644 index 496d369f..00000000 --- a/demos/qwen-nextjs/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "qwen-nextjs", - "version": "0.1.0", - "private": true, - "scripts": { - "build": "next build", - "dev": "next dev", - "lint": "next lint", - "start": "next start" - }, - "dependencies": { - "@ant-design/pro-chat": "^1.2.0", - "@ant-design/pro-editor": "^0.38.0", - "antd": "^5.12.8", - "antd-style": "^3.6.1", - "next": "14.0.4", - "react": "^18", - "react-dom": "^18" - }, - "devDependencies": { - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "eslint": "^8", - "eslint-config-next": "14.0.4", - "typescript": "^5" - } -} diff --git a/demos/qwen-nextjs/src/app/globals.css b/demos/qwen-nextjs/src/app/globals.css deleted file mode 100644 index cb1208fd..00000000 --- a/demos/qwen-nextjs/src/app/globals.css +++ /dev/null @@ -1,102 +0,0 @@ -:root { - --max-width: 1100px; - --border-radius: 12px; - --font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', 'Roboto Mono', - 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', 'Fira Mono', 'Droid Sans Mono', - 'Courier New', monospace; - - --foreground-rgb: 0, 0, 0; - --background-start-rgb: 214, 219, 220; - --background-end-rgb: 255, 255, 255; - - --primary-glow: conic-gradient( - from 180deg at 50% 50%, - #16abff33 0deg, - #0885ff33 55deg, - #54d6ff33 120deg, - #0071ff33 160deg, - transparent 360deg - ); - --secondary-glow: radial-gradient(rgba(255, 255, 255, 1), rgba(255, 255, 255, 0)); - - --tile-start-rgb: 239, 245, 249; - --tile-end-rgb: 228, 232, 233; - --tile-border: conic-gradient( - #00000080, - #00000040, - #00000030, - #00000020, - #00000010, - #00000010, - #00000080 - ); - - --callout-rgb: 238, 240, 241; - --callout-border-rgb: 172, 175, 176; - --card-rgb: 180, 185, 188; - --card-border-rgb: 131, 134, 135; -} - -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; - - --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); - --secondary-glow: linear-gradient( - to bottom right, - rgba(1, 65, 255, 0), - rgba(1, 65, 255, 0), - rgba(1, 65, 255, 0.3) - ); - - --tile-start-rgb: 2, 13, 46; - --tile-end-rgb: 2, 5, 19; - --tile-border: conic-gradient( - #ffffff80, - #ffffff40, - #ffffff30, - #ffffff20, - #ffffff10, - #ffffff10, - #ffffff80 - ); - - --callout-rgb: 20, 20, 20; - --callout-border-rgb: 108, 108, 108; - --card-rgb: 100, 100, 100; - --card-border-rgb: 200, 200, 200; - } -} - -* { - box-sizing: border-box; - padding: 0; - margin: 0; -} - -html, -body, -#root { - max-width: 100vw; - overflow-x: hidden; - height: 100%; -} - -body { - color: rgb(var(--foreground-rgb)); - background: linear-gradient(to bottom, transparent, rgb(var(--background-end-rgb))) - rgb(var(--background-start-rgb)); -} - -a { - color: inherit; - text-decoration: none; -} - -@media (prefers-color-scheme: dark) { - html { - color-scheme: dark; - } -} diff --git a/demos/qwen-nextjs/src/app/layout.tsx b/demos/qwen-nextjs/src/app/layout.tsx deleted file mode 100644 index 0f24671a..00000000 --- a/demos/qwen-nextjs/src/app/layout.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import type { Metadata } from 'next'; -import { Inter } from 'next/font/google'; -import './globals.css'; - -const inter = Inter({ subsets: ['latin'] }); - -export const metadata: Metadata = { - title: 'Create Next App', - description: 'Generated by create next app', -}; - -export default function RootLayout({ children }: { children: React.ReactNode }) { - return ( - - {children} - - ); -} diff --git a/demos/qwen-nextjs/src/app/page.tsx b/demos/qwen-nextjs/src/app/page.tsx deleted file mode 100644 index 3addb399..00000000 --- a/demos/qwen-nextjs/src/app/page.tsx +++ /dev/null @@ -1,38 +0,0 @@ -'use client'; -import { useState, useEffect } from 'react' -import { ProChat } from '@ant-design/pro-chat'; -import { useTheme } from 'antd-style'; - -export default function Home() { - - const theme = useTheme(); - const [showComponent, setShowComponent] = useState(false) - - useEffect(() => setShowComponent(true), []) - - return ( -
- { - showComponent && { - const response = await fetch('/api/qwen', { - method: 'POST', - body: JSON.stringify({ messages: messages }), - }); - const data = await response.json(); - return new Response(data.output?.text); - }} - /> - } -
- ); -} - diff --git a/demos/qwen-nextjs/src/app/qwen/route.ts b/demos/qwen-nextjs/src/app/qwen/route.ts deleted file mode 100644 index 64ae475d..00000000 --- a/demos/qwen-nextjs/src/app/qwen/route.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { NextResponse } from 'next/server'; - -export async function POST(request: Request) { - const { messages = [] }: Partial<{ messages: Array }> = await request.json(); - try { - const apiKey = 'Your-Api-Key'; // 你的 API 密钥 - const response = await fetch( - 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation', - { - method: 'POST', - headers: { - Authorization: 'Bearer ' + apiKey, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model: 'qwen-turbo', - input: { - messages: [ - { - role: 'system', - content: 'You are a helpful assistant.', - }, - ...messages, - ], - }, - parameters: {}, - }), - }, - ); - const data = await response.json(); - return NextResponse.json(data); - } catch (error) { - return NextResponse.error(); - } -} diff --git a/demos/qwen-nextjs/tsconfig.json b/demos/qwen-nextjs/tsconfig.json deleted file mode 100644 index e59724b2..00000000 --- a/demos/qwen-nextjs/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": ["./src/*"] - } - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/package.json b/package.json index 5ca2f135..9d315130 100644 --- a/package.json +++ b/package.json @@ -63,11 +63,15 @@ "dependencies": { "@ant-design/icons": "^5.3.0", "@babel/runtime": "^7.23.9", + "@types/classnames": "^2.3.1", + "classnames": "^2.5.1", "copy-to-clipboard": "^3.3.3", "dayjs": "^1.11.10", "lodash-es": "^4.17.21", "polished": "^4.3.1", - "rc-resize-observer": "^1.4.0" + "rc-resize-observer": "^1.4.0", + "rc-util": "^5.39.1", + "react-markdown": "^9.0.1" }, "devDependencies": { "@commitlint/cli": "^17.8.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 102e82c5..23016b6c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,12 +8,15 @@ dependencies: '@ant-design/icons': specifier: ^5.3.0 version: 5.3.5(react-dom@18.2.0)(react@18.2.0) - '@ant-design/pro-editor': - specifier: latest - version: 1.0.2(@emotion/react@11.11.4)(@types/react@18.2.31)(antd-style@3.6.1)(antd@5.15.3)(react-dom@18.2.0)(react@18.2.0) '@babel/runtime': specifier: ^7.23.9 version: 7.24.1 + '@types/classnames': + specifier: ^2.3.1 + version: 2.3.1 + classnames: + specifier: ^2.5.1 + version: 2.5.1 copy-to-clipboard: specifier: ^3.3.3 version: 3.3.3 @@ -29,6 +32,12 @@ dependencies: rc-resize-observer: specifier: ^1.4.0 version: 1.4.0(react-dom@18.2.0)(react@18.2.0) + rc-util: + specifier: ^5.39.1 + version: 5.39.1(react-dom@18.2.0)(react@18.2.0) + react-markdown: + specifier: ^9.0.1 + version: 9.0.1(@types/react@18.2.31)(react@18.2.0) optionalDependencies: antd: @@ -241,74 +250,6 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /@ant-design/pro-editor@1.0.2(@emotion/react@11.11.4)(@types/react@18.2.31)(antd-style@3.6.1)(antd@5.15.3)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-47zb/QpBWY9pn8j89s8CAf3EOvtGluKpyztwyePmd715WOHqG2Z9J1K4sqs7zE7G+i9ad18aNqldkwMuSXT5PA==} - peerDependencies: - antd: '>=5' - antd-style: '>=3' - react: '>=18' - react-dom: '>=18' - dependencies: - '@ant-design/icons': 5.3.5(react-dom@18.2.0)(react@18.2.0) - '@babel/runtime': 7.24.1 - '@dnd-kit/core': 6.1.0(react-dom@18.2.0)(react@18.2.0) - '@dnd-kit/modifiers': 6.0.1(@dnd-kit/core@6.1.0)(react@18.2.0) - '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.1.0)(react@18.2.0) - '@dnd-kit/utilities': 3.2.2(react@18.2.0) - '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.31)(react@18.2.0) - '@floating-ui/react': 0.24.8(react-dom@18.2.0)(react@18.2.0) - ahooks: 3.7.8(react@18.2.0) - antd: 5.15.3(react-dom@18.2.0)(react@18.2.0) - antd-style: 3.6.1(@types/react@18.2.31)(antd@5.15.3)(react-dom@18.2.0)(react@18.2.0) - classnames: 2.5.1 - color: 4.2.3 - copy-to-clipboard: 3.3.3 - diff: 5.2.0 - fast-deep-equal: 3.1.3 - highlight.js: 10.5.0 - immer: 9.0.21 - lodash.flatten: 4.4.0 - lodash.get: 4.4.2 - lodash.isempty: 4.4.0 - lodash.isequal: 4.5.0 - lodash.isnil: 4.0.0 - lodash.isobject: 3.0.2 - lodash.merge: 4.6.2 - lodash.omitby: 4.6.0 - lodash.template: 4.5.0 - lodash.union: 4.6.0 - lodash.unionby: 4.8.0 - lodash.uniq: 4.5.0 - nanoid: 5.0.6 - polished: 4.3.1 - rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0) - re-resizable: 6.9.11(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-copy-to-clipboard: 5.1.0(react@18.2.0) - react-dom: 18.2.0(react@18.2.0) - react-hotkeys-hook: 4.5.0(react-dom@18.2.0)(react@18.2.0) - react-layout-kit: 1.9.0(react@18.2.0) - react-markdown: 8.0.7(@types/react@18.2.31)(react@18.2.0) - react-rnd: 10.4.1(react-dom@18.2.0)(react@18.2.0) - react-window: 1.8.10(react-dom@18.2.0)(react@18.2.0) - reactflow: 11.10.4(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) - rehype-katex: 6.0.3 - remark-gfm: 3.0.1 - remark-math: 5.1.1 - rxjs: 7.8.1 - shikiji: 0.6.13 - type-fest: 3.13.1 - use-merge-value: 1.2.0(react@18.2.0) - yjs: 13.6.14 - zustand: 4.5.2(@types/react@18.2.31)(immer@9.0.21)(react@18.2.0) - zustand-middleware-yjs: 1.3.1(@types/react@18.2.31)(immer@9.0.21)(react@18.2.0) - zustand-utils: 1.3.2(react@18.2.0)(zustand@4.5.2) - transitivePeerDependencies: - - '@emotion/react' - - '@types/react' - - supports-color - dev: false - /@ant-design/react-slick@1.0.2(react@18.2.0): resolution: {integrity: sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ==} requiresBuild: true @@ -348,6 +289,7 @@ packages: dependencies: '@babel/highlight': 7.24.2 picocolors: 1.0.0 + dev: true /@babel/compat-data@7.24.1: resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} @@ -460,6 +402,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 + dev: true /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} @@ -511,10 +454,12 @@ packages: /@babel/helper-string-parser@7.24.1: resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-validator-option@7.23.5: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} @@ -540,6 +485,7 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 + dev: true /@babel/parser@7.24.1: resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} @@ -757,6 +703,7 @@ packages: '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + dev: true /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1092,61 +1039,6 @@ packages: engines: {node: '>=10'} requiresBuild: true - /@dnd-kit/accessibility@3.1.0(react@18.2.0): - resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} - peerDependencies: - react: '>=16.8.0' - dependencies: - react: 18.2.0 - tslib: 2.6.2 - dev: false - - /@dnd-kit/core@6.1.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - dependencies: - '@dnd-kit/accessibility': 3.1.0(react@18.2.0) - '@dnd-kit/utilities': 3.2.2(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - tslib: 2.6.2 - dev: false - - /@dnd-kit/modifiers@6.0.1(@dnd-kit/core@6.1.0)(react@18.2.0): - resolution: {integrity: sha512-rbxcsg3HhzlcMHVHWDuh9LCjpOVAgqbV78wLGI8tziXY3+qcMQ61qVXIvNKQFuhj75dSfD+o+PYZQ/NUk2A23A==} - peerDependencies: - '@dnd-kit/core': ^6.0.6 - react: '>=16.8.0' - dependencies: - '@dnd-kit/core': 6.1.0(react-dom@18.2.0)(react@18.2.0) - '@dnd-kit/utilities': 3.2.2(react@18.2.0) - react: 18.2.0 - tslib: 2.6.2 - dev: false - - /@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.1.0)(react@18.2.0): - resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==} - peerDependencies: - '@dnd-kit/core': ^6.0.7 - react: '>=16.8.0' - dependencies: - '@dnd-kit/core': 6.1.0(react-dom@18.2.0)(react@18.2.0) - '@dnd-kit/utilities': 3.2.2(react@18.2.0) - react: 18.2.0 - tslib: 2.6.2 - dev: false - - /@dnd-kit/utilities@3.2.2(react@18.2.0): - resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} - peerDependencies: - react: '>=16.8.0' - dependencies: - react: 18.2.0 - tslib: 2.6.2 - dev: false - /@emotion/babel-plugin@11.11.0: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: @@ -1161,6 +1053,7 @@ packages: find-root: 1.1.0 source-map: 0.5.7 stylis: 4.2.0 + dev: true /@emotion/cache@11.11.0: resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} @@ -1170,6 +1063,7 @@ packages: '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 stylis: 4.2.0 + dev: true /@emotion/css@11.11.2: resolution: {integrity: sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew==} @@ -1179,6 +1073,7 @@ packages: '@emotion/serialize': 1.1.3 '@emotion/sheet': 1.2.2 '@emotion/utils': 1.2.1 + dev: true /@emotion/hash@0.8.0: resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} @@ -1186,15 +1081,11 @@ packages: /@emotion/hash@0.9.1: resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} - - /@emotion/is-prop-valid@1.2.2: - resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} - dependencies: - '@emotion/memoize': 0.8.1 - dev: false + dev: true /@emotion/memoize@0.8.1: resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: true /@emotion/react@11.11.4(@types/react@18.2.31)(react@18.2.0): resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} @@ -1215,6 +1106,7 @@ packages: '@types/react': 18.2.31 hoist-non-react-statics: 3.3.2 react: 18.2.0 + dev: true /@emotion/serialize@1.1.3: resolution: {integrity: sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==} @@ -1224,6 +1116,7 @@ packages: '@emotion/unitless': 0.8.1 '@emotion/utils': 1.2.1 csstype: 3.1.3 + dev: true /@emotion/server@11.11.0(@emotion/css@11.11.2): resolution: {integrity: sha512-6q89fj2z8VBTx9w93kJ5n51hsmtYuFPtZgnc1L8VzRx9ti4EU6EyvF6Nn1H1x3vcCQCF7u2dB2lY4AYJwUW4PA==} @@ -1238,30 +1131,11 @@ packages: html-tokenize: 2.0.1 multipipe: 1.0.2 through: 2.3.8 + dev: true /@emotion/sheet@1.2.2: resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} - - /@emotion/styled@11.11.0(@emotion/react@11.11.4)(@types/react@18.2.31)(react@18.2.0): - resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} - peerDependencies: - '@emotion/react': ^11.0.0-rc.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.1 - '@emotion/babel-plugin': 11.11.0 - '@emotion/is-prop-valid': 1.2.2 - '@emotion/react': 11.11.4(@types/react@18.2.31)(react@18.2.0) - '@emotion/serialize': 1.1.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) - '@emotion/utils': 1.2.1 - '@types/react': 18.2.31 - react: 18.2.0 - dev: false + dev: true /@emotion/unitless@0.7.5: resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} @@ -1269,6 +1143,7 @@ packages: /@emotion/unitless@0.8.1: resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + dev: true /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} @@ -1276,12 +1151,15 @@ packages: react: '>=16.8.0' dependencies: react: 18.2.0 + dev: true /@emotion/utils@1.2.1: resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + dev: true /@emotion/weak-memoize@0.3.1: resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + dev: true /@esbuild-kit/cjs-loader@2.4.4: resolution: {integrity: sha512-NfsJX4PdzhwSkfJukczyUiZGc7zNNWZcEAyqeISpDnn0PTfzMJR1aR8xAIPskBejIxBJbIgCCMzbaYa9SXepIg==} @@ -1952,6 +1830,7 @@ packages: resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} dependencies: '@floating-ui/utils': 0.2.1 + dev: true /@floating-ui/dom@0.4.5: resolution: {integrity: sha512-b+prvQgJt8pieaKYMSJBXHxX/DYwdLsAWxKYqnO5dO2V4oo/TYBZJAUQCVNjTWWsrs6o4VDrNcP9+E70HAhJdw==} @@ -1964,6 +1843,7 @@ packages: dependencies: '@floating-ui/core': 1.6.0 '@floating-ui/utils': 0.2.1 + dev: true /@floating-ui/react-dom-interactions@0.3.1(@types/react@18.2.31)(react-dom@18.1.0)(react@18.1.0): resolution: {integrity: sha512-tP2KEh7EHJr5hokSBHcPGojb+AorDNUf0NYfZGg/M+FsMvCOOsSEeEF0O1NDfETIzDnpbHnCs0DuvCFhSMSStg==} @@ -2002,6 +1882,7 @@ packages: '@floating-ui/dom': 1.6.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + dev: true /@floating-ui/react@0.24.8(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-AuYeDoaR8jtUlUXtZ1IJ/6jtBkGnSpJXbGNzokBL87VDJ8opMq1Bgrc0szhK482ReQY6KZsMoZCVSb4xwalkBA==} @@ -2014,9 +1895,11 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tabbable: 6.2.0 + dev: true /@floating-ui/utils@0.2.1: resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + dev: true /@formatjs/ecma402-abstract@1.18.2: resolution: {integrity: sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==} @@ -2977,7 +2860,7 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@rc-component/portal': 1.1.2(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 + classnames: 2.5.1 rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) rc-resize-observer: 1.4.0(react-dom@18.2.0)(react@18.2.0) rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0) @@ -3002,114 +2885,6 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /@reactflow/background@11.3.9(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-byj/G9pEC8tN0wT/ptcl/LkEP/BBfa33/SvBkqE4XwyofckqF87lKp573qGlisfnsijwAbpDlf81PuFL41So4Q==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/core': 11.10.4(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) - classcat: 5.0.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.5.2(@types/react@18.2.31)(immer@9.0.21)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: false - - /@reactflow/controls@11.2.9(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-e8nWplbYfOn83KN1BrxTXS17+enLyFnjZPbyDgHSRLtI5ZGPKF/8iRXV+VXb2LFVzlu4Wh3la/pkxtfP/0aguA==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/core': 11.10.4(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) - classcat: 5.0.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.5.2(@types/react@18.2.31)(immer@9.0.21)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: false - - /@reactflow/core@11.10.4(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-j3i9b2fsTX/sBbOm+RmNzYEFWbNx4jGWGuGooh2r1jQaE2eV+TLJgiG/VNOp0q5mBl9f6g1IXs3Gm86S9JfcGw==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@types/d3': 7.4.3 - '@types/d3-drag': 3.0.7 - '@types/d3-selection': 3.0.10 - '@types/d3-zoom': 3.0.8 - classcat: 5.0.4 - d3-drag: 3.0.0 - d3-selection: 3.0.0 - d3-zoom: 3.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.5.2(@types/react@18.2.31)(immer@9.0.21)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: false - - /@reactflow/minimap@11.7.9(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-le95jyTtt3TEtJ1qa7tZ5hyM4S7gaEQkW43cixcMOZLu33VAdc2aCpJg/fXcRrrf7moN2Mbl9WIMNXUKsp5ILA==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/core': 11.10.4(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) - '@types/d3-selection': 3.0.10 - '@types/d3-zoom': 3.0.8 - classcat: 5.0.4 - d3-selection: 3.0.0 - d3-zoom: 3.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.5.2(@types/react@18.2.31)(immer@9.0.21)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: false - - /@reactflow/node-resizer@2.2.9(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-HfickMm0hPDIHt9qH997nLdgLt0kayQyslKE0RS/GZvZ4UMQJlx/NRRyj5y47Qyg0NnC66KYOQWDM9LLzRTnUg==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/core': 11.10.4(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) - classcat: 5.0.4 - d3-drag: 3.0.0 - d3-selection: 3.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.5.2(@types/react@18.2.31)(immer@9.0.21)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: false - - /@reactflow/node-toolbar@1.3.9(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-VmgxKmToax4sX1biZ9LXA7cj/TBJ+E5cklLGwquCCVVxh+lxpZGTBF3a5FJGVHiUNBBtFsC8ldcSZIK4cAlQww==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/core': 11.10.4(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) - classcat: 5.0.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - zustand: 4.5.2(@types/react@18.2.31)(immer@9.0.21)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: false - /@rollup/rollup-android-arm-eabi@4.13.0: resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} cpu: [arm] @@ -3809,183 +3584,11 @@ packages: resolution: {integrity: sha512-/DTccpHTaKomqussrn+ciEvfW4k6NAHzNzs/sts1TCqg333qNxOhy8TNIoQCmbGG3Tl8KdEhkGAssb1n3mTXiQ==} dev: true - /@types/d3-array@3.2.1: - resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} - dev: false - - /@types/d3-axis@3.0.6: - resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} - dependencies: - '@types/d3-selection': 3.0.10 - dev: false - - /@types/d3-brush@3.0.6: - resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} - dependencies: - '@types/d3-selection': 3.0.10 - dev: false - - /@types/d3-chord@3.0.6: - resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} - dev: false - - /@types/d3-color@3.1.3: - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - dev: false - - /@types/d3-contour@3.0.6: - resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} - dependencies: - '@types/d3-array': 3.2.1 - '@types/geojson': 7946.0.14 - dev: false - - /@types/d3-delaunay@6.0.4: - resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} - dev: false - - /@types/d3-dispatch@3.0.6: - resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==} - dev: false - - /@types/d3-drag@3.0.7: - resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} - dependencies: - '@types/d3-selection': 3.0.10 - dev: false - - /@types/d3-dsv@3.0.7: - resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} - dev: false - - /@types/d3-ease@3.0.2: - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - dev: false - - /@types/d3-fetch@3.0.7: - resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} - dependencies: - '@types/d3-dsv': 3.0.7 - dev: false - - /@types/d3-force@3.0.9: - resolution: {integrity: sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==} - dev: false - - /@types/d3-format@3.0.4: - resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} - dev: false - - /@types/d3-geo@3.1.0: - resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} - dependencies: - '@types/geojson': 7946.0.14 - dev: false - - /@types/d3-hierarchy@3.1.7: - resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} - dev: false - - /@types/d3-interpolate@3.0.4: - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} - dependencies: - '@types/d3-color': 3.1.3 - dev: false - - /@types/d3-path@3.1.0: - resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} - dev: false - - /@types/d3-polygon@3.0.2: - resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} - dev: false - - /@types/d3-quadtree@3.0.6: - resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} - dev: false - - /@types/d3-random@3.0.3: - resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} - dev: false - - /@types/d3-scale-chromatic@3.0.3: - resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} - dev: false - - /@types/d3-scale@4.0.8: - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} - dependencies: - '@types/d3-time': 3.0.3 - dev: false - - /@types/d3-selection@3.0.10: - resolution: {integrity: sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==} - dev: false - - /@types/d3-shape@3.1.6: - resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} - dependencies: - '@types/d3-path': 3.1.0 - dev: false - - /@types/d3-time-format@4.0.3: - resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} - dev: false - - /@types/d3-time@3.0.3: - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - dev: false - - /@types/d3-timer@3.0.2: - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - dev: false - - /@types/d3-transition@3.0.8: - resolution: {integrity: sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==} - dependencies: - '@types/d3-selection': 3.0.10 - dev: false - - /@types/d3-zoom@3.0.8: - resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + /@types/classnames@2.3.1: + resolution: {integrity: sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==} + deprecated: This is a stub types definition. classnames provides its own type definitions, so you do not need this installed. dependencies: - '@types/d3-interpolate': 3.0.4 - '@types/d3-selection': 3.0.10 - dev: false - - /@types/d3@7.4.3: - resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} - dependencies: - '@types/d3-array': 3.2.1 - '@types/d3-axis': 3.0.6 - '@types/d3-brush': 3.0.6 - '@types/d3-chord': 3.0.6 - '@types/d3-color': 3.1.3 - '@types/d3-contour': 3.0.6 - '@types/d3-delaunay': 6.0.4 - '@types/d3-dispatch': 3.0.6 - '@types/d3-drag': 3.0.7 - '@types/d3-dsv': 3.0.7 - '@types/d3-ease': 3.0.2 - '@types/d3-fetch': 3.0.7 - '@types/d3-force': 3.0.9 - '@types/d3-format': 3.0.4 - '@types/d3-geo': 3.1.0 - '@types/d3-hierarchy': 3.1.7 - '@types/d3-interpolate': 3.0.4 - '@types/d3-path': 3.1.0 - '@types/d3-polygon': 3.0.2 - '@types/d3-quadtree': 3.0.6 - '@types/d3-random': 3.0.3 - '@types/d3-scale': 4.0.8 - '@types/d3-scale-chromatic': 3.0.3 - '@types/d3-selection': 3.0.10 - '@types/d3-shape': 3.1.6 - '@types/d3-time': 3.0.3 - '@types/d3-time-format': 4.0.3 - '@types/d3-timer': 3.0.2 - '@types/d3-transition': 3.0.8 - '@types/d3-zoom': 3.0.8 + classnames: 2.5.1 dev: false /@types/debug@4.1.12: @@ -4011,11 +3614,9 @@ packages: resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} dependencies: '@types/estree': 1.0.5 - dev: true /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true /@types/fs-extra@11.0.1: resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==} @@ -4024,10 +3625,6 @@ packages: '@types/node': 20.11.30 dev: true - /@types/geojson@7946.0.14: - resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} - dev: false - /@types/glob@8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: @@ -4049,11 +3646,12 @@ packages: resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} dependencies: '@types/unist': 2.0.10 + dev: true /@types/hast@3.0.4: resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 2.0.10 dev: false /@types/hoist-non-react-statics@3.3.5: @@ -4083,10 +3681,6 @@ packages: '@types/istanbul-lib-report': 3.0.3 dev: true - /@types/js-cookie@2.2.7: - resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} - dev: false - /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true @@ -4097,14 +3691,6 @@ packages: '@types/node': 20.11.30 dev: true - /@types/katex@0.14.0: - resolution: {integrity: sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==} - dev: false - - /@types/katex@0.16.7: - resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} - dev: false - /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: @@ -4125,11 +3711,12 @@ packages: resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} dependencies: '@types/unist': 2.0.10 + dev: true /@types/mdast@4.0.3: resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 2.0.10 dev: false /@types/minimatch@5.1.2: @@ -4176,6 +3763,7 @@ packages: /@types/parse-json@4.0.2: resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + dev: true /@types/parse5@6.0.3: resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} @@ -5246,10 +4834,6 @@ packages: indent-string: 5.0.0 dev: true - /ahooks-v3-count@1.0.0: - resolution: {integrity: sha512-V7uUvAwnimu6eh/PED4mCDjE7tokeZQLKlxg9lCTMPhN+NjsSbtdacByVlR1oluXQzD3MOw55wylDmQo4+S9ZQ==} - dev: false - /ahooks@3.7.10(react@18.2.0): resolution: {integrity: sha512-/HLYif7sFA/5qSuWKrwvjDbf3bq+sdaMrUWS7XGCDRWdC2FrG/i+u5LZdakMYc6UIgJTMQ7tGiJCV7sdU4kSIw==} engines: {node: '>=8.0.0'} @@ -5267,25 +4851,6 @@ packages: tslib: 2.6.2 dev: true - /ahooks@3.7.8(react@18.2.0): - resolution: {integrity: sha512-e/NMlQWoCjaUtncNFIZk3FG1ImSkV/JhScQSkTqnftakRwdfZWSw6zzoWSG9OMYqPNs2MguDYBUFFC6THelWXA==} - engines: {node: '>=8.0.0'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@babel/runtime': 7.24.1 - '@types/js-cookie': 2.2.7 - ahooks-v3-count: 1.0.0 - dayjs: 1.11.10 - intersection-observer: 0.12.2 - js-cookie: 2.2.1 - lodash: 4.17.21 - react: 18.2.0 - resize-observer-polyfill: 1.5.1 - screenfull: 5.2.0 - tslib: 2.6.2 - dev: false - /ai@2.2.37(react@18.2.0)(solid-js@1.8.16)(svelte@4.2.12)(vue@3.4.21): resolution: {integrity: sha512-JIYm5N1muGVqBqWnvkt29FmXhESoO5TcDxw74OE41SsM+uIou6NPDDs0XWb/ABcd1gmp6k5zym64KWMPM2xm0A==} engines: {node: '>=14.6'} @@ -5403,6 +4968,7 @@ packages: engines: {node: '>=4'} dependencies: color-convert: 1.9.3 + dev: true /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -5445,6 +5011,7 @@ packages: transitivePeerDependencies: - '@types/react' - react-dom + dev: true /antd@5.15.3(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-53dpdGbfwipHVbqITmppp8N16i+BscMzz8NUNwaJgxwSvO9VQh/NfC/90lqGq3I2oBmxQ8TzRIxzFVKD/9OhlQ==} @@ -5546,6 +5113,7 @@ packages: engines: {node: '>=10'} dependencies: tslib: 2.6.2 + dev: true /aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} @@ -5808,6 +5376,7 @@ packages: '@babel/runtime': 7.24.1 cosmiconfig: 7.1.0 resolve: 1.22.8 + dev: true /babel-plugin-module-resolver@4.1.0: resolution: {integrity: sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==} @@ -6063,6 +5632,7 @@ packages: /buffer-from@0.1.2: resolution: {integrity: sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==} + dev: true /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -6150,6 +5720,7 @@ packages: /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + dev: true /camel-case@4.1.2: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} @@ -6232,6 +5803,7 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 + dev: true /chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} @@ -6282,7 +5854,6 @@ packages: /character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - dev: true /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -6361,10 +5932,6 @@ packages: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} dev: true - /classcat@5.0.4: - resolution: {integrity: sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==} - dev: false - /classnames@2.3.2: resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} dev: true @@ -6459,11 +6026,6 @@ packages: wrap-ansi: 7.0.0 dev: true - /clsx@1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} - dev: false - /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -6537,24 +6099,29 @@ packages: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 + dev: true /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 + dev: true /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true /color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 + dev: true /color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} @@ -6563,14 +6130,6 @@ packages: color-string: 1.9.1 dev: true - /color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - dev: false - /colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} dev: true @@ -6615,6 +6174,7 @@ packages: /commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + dev: true /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} @@ -6779,6 +6339,7 @@ packages: /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -6818,6 +6379,7 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true /cors@2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} @@ -6851,6 +6413,7 @@ packages: parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 + dev: true /cosmiconfig@8.3.6(typescript@5.4.3): resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} @@ -7148,71 +6711,6 @@ packages: resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==} dev: true - /d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - dev: false - - /d3-dispatch@3.0.1: - resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} - engines: {node: '>=12'} - dev: false - - /d3-drag@3.0.0: - resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} - engines: {node: '>=12'} - dependencies: - d3-dispatch: 3.0.1 - d3-selection: 3.0.0 - dev: false - - /d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - dev: false - - /d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} - dependencies: - d3-color: 3.1.0 - dev: false - - /d3-selection@3.0.0: - resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} - engines: {node: '>=12'} - dev: false - - /d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - dev: false - - /d3-transition@3.0.1(d3-selection@3.0.0): - resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} - engines: {node: '>=12'} - peerDependencies: - d3-selection: 2 - 3 - dependencies: - d3-color: 3.1.0 - d3-dispatch: 3.0.1 - d3-ease: 3.0.1 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-timer: 3.0.1 - dev: false - - /d3-zoom@3.0.0: - resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} - engines: {node: '>=12'} - dependencies: - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-transition: 3.0.1(d3-selection@3.0.0) - dev: false - /dargs@7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} @@ -7511,6 +7009,7 @@ packages: /diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} + dev: true /diffie-hellman@5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} @@ -7699,7 +7198,7 @@ packages: react-syntax-highlighter: 15.5.0(react@18.2.0) shiki-es: 0.2.0 use-merge-value: 1.2.0(react@18.2.0) - zustand: 4.5.2(@types/react@18.2.31)(immer@9.0.21)(react@18.2.0) + zustand: 4.5.2(@types/react@18.2.31)(react@18.2.0) zustand-utils: 1.3.2(react@18.2.0)(zustand@4.5.2) transitivePeerDependencies: - '@types/react' @@ -7816,6 +7315,7 @@ packages: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} dependencies: readable-stream: 2.3.8 + dev: true /duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} @@ -7924,6 +7424,7 @@ packages: /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + dev: true /env-ci@9.1.1: resolution: {integrity: sha512-Im2yEWeF4b2RAMAaWvGioXk6m0UNaIjD8hj28j2ij5ldnIFrDQT0+pzDvpbRkcjurhXhf/AsBKv8P2rtmGi9Aw==} @@ -7955,6 +7456,7 @@ packages: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 + dev: true /error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} @@ -8212,6 +7714,7 @@ packages: /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + dev: true /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} @@ -8221,10 +7724,12 @@ packages: /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + dev: true /escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + dev: true /eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@29.7.0)(typescript@5.4.3): resolution: {integrity: sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==} @@ -8404,6 +7909,10 @@ packages: resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} dev: true + /estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + dev: false + /estree-util-to-js@1.2.0: resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} dependencies: @@ -8566,6 +8075,7 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} @@ -8597,10 +8107,6 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fast-memoize@2.5.2: - resolution: {integrity: sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==} - dev: false - /fast-redact@3.5.0: resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} engines: {node: '>=6'} @@ -8771,6 +8277,7 @@ packages: /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: true /find-up@2.1.0: resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} @@ -9030,6 +8537,7 @@ packages: /function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true /function.prototype.name@1.1.6: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} @@ -9405,6 +8913,7 @@ packages: /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} + dev: true /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -9477,32 +8986,7 @@ packages: engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 - - /hast-util-from-dom@4.2.0: - resolution: {integrity: sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ==} - dependencies: - hastscript: 7.2.0 - web-namespaces: 2.0.1 - dev: false - - /hast-util-from-html-isomorphic@1.0.0: - resolution: {integrity: sha512-Yu480AKeOEN/+l5LA674a+7BmIvtDj24GvOt7MtQWuhzUwlaaRWdEPXAh3Qm5vhuthpAipFb2vTetKXWOjmTvw==} - dependencies: - '@types/hast': 2.3.10 - hast-util-from-dom: 4.2.0 - hast-util-from-html: 1.0.2 - unist-util-remove-position: 4.0.2 - dev: false - - /hast-util-from-html@1.0.2: - resolution: {integrity: sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A==} - dependencies: - '@types/hast': 2.3.10 - hast-util-from-parse5: 7.1.2 - parse5: 7.1.2 - vfile: 5.3.7 - vfile-message: 3.1.4 - dev: false + dev: true /hast-util-from-parse5@7.1.2: resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} @@ -9514,19 +8998,7 @@ packages: vfile: 5.3.7 vfile-location: 4.1.0 web-namespaces: 2.0.1 - - /hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 - devlop: 1.1.0 - hastscript: 8.0.0 - property-information: 6.4.1 - vfile: 6.0.1 - vfile-location: 5.0.2 - web-namespaces: 2.0.1 - dev: false + dev: true /hast-util-has-property@2.0.1: resolution: {integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==} @@ -9549,6 +9021,7 @@ packages: dependencies: '@types/hast': 2.3.10 '@types/unist': 2.0.10 + dev: true /hast-util-parse-selector@2.2.5: resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} @@ -9558,12 +9031,7 @@ packages: resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} dependencies: '@types/hast': 2.3.10 - - /hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - dependencies: - '@types/hast': 3.0.4 - dev: false + dev: true /hast-util-raw@7.2.3: resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} @@ -9598,24 +9066,6 @@ packages: zwitch: 2.0.4 dev: true - /hast-util-raw@9.0.2: - resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.2 - '@ungap/structured-clone': 1.2.0 - hast-util-from-parse5: 8.0.1 - hast-util-to-parse5: 8.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 - parse5: 7.1.2 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: false - /hast-util-to-estree@2.3.3: resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} dependencies: @@ -9654,21 +9104,26 @@ packages: zwitch: 2.0.4 dev: true - /hast-util-to-html@9.0.0: - resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==} + /hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} dependencies: + '@types/estree': 1.0.5 '@types/hast': 3.0.4 '@types/unist': 3.0.2 - ccount: 2.0.1 comma-separated-tokens: 2.0.3 - hast-util-raw: 9.0.2 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdxjs-esm: 2.0.1 property-information: 6.4.1 space-separated-tokens: 2.0.2 - stringify-entities: 4.0.3 - zwitch: 2.0.4 + style-to-object: 1.0.5 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color dev: false /hast-util-to-parse5@7.1.0: @@ -9682,35 +9137,15 @@ packages: zwitch: 2.0.4 dev: true - /hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: false - /hast-util-to-string@2.0.0: resolution: {integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==} dependencies: '@types/hast': 2.3.10 dev: true - /hast-util-to-text@3.1.2: - resolution: {integrity: sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==} - dependencies: - '@types/hast': 2.3.10 - '@types/unist': 2.0.10 - hast-util-is-element: 2.1.3 - unist-util-find-after: 4.0.1 - dev: false - /hast-util-whitespace@2.0.1: resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + dev: true /hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} @@ -9736,16 +9171,7 @@ packages: hast-util-parse-selector: 3.1.1 property-information: 6.4.1 space-separated-tokens: 2.0.2 - - /hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 - dev: false + dev: true /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} @@ -9762,10 +9188,6 @@ packages: heti-findandreplacedomtext: 0.5.0 dev: true - /highlight.js@10.5.0: - resolution: {integrity: sha512-xTmvd9HiIHR6L53TMC7TKolEj65zG1XU+Onr8oi86mYa+nLcIbxTTWkpW7CsEwv/vK7u1zb8alZIMLDqqN6KTw==} - dev: false - /highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} dev: true @@ -9788,6 +9210,7 @@ packages: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} dependencies: react-is: 16.13.1 + dev: true /homedir-polyfill@1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} @@ -9899,15 +9322,16 @@ packages: minimist: 1.2.8 readable-stream: 1.0.34 through2: 0.4.2 + dev: true + + /html-url-attributes@3.0.0: + resolution: {integrity: sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==} + dev: false /html-void-elements@2.0.1: resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} dev: true - /html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - dev: false - /html-webpack-plugin@5.5.0(webpack@5.91.0): resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} engines: {node: '>=10.13.0'} @@ -10123,9 +9547,6 @@ packages: queue: 6.0.1 dev: true - /immer@9.0.21: - resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} - /immutable@4.3.5: resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} dev: true @@ -10136,6 +9557,7 @@ packages: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 + dev: true /import-from@4.0.0: resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==} @@ -10189,6 +9611,7 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} @@ -10196,6 +9619,11 @@ packages: /inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: true + + /inline-style-parser@0.2.2: + resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + dev: false /inquirer@6.5.2: resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==} @@ -10227,6 +9655,7 @@ packages: /intersection-observer@0.12.2: resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} + dev: true /intl-messageformat@10.5.11: resolution: {integrity: sha512-eYq5fkFBVxc7GIFDzpFQkDOZgNayNTQn4Oufe8jw6YY6OHVw70/4pA3FyCsQ0Gb2DnvEJEMmN2tOaXUGByM+kg==} @@ -10261,7 +9690,6 @@ packages: /is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - dev: true /is-alphanumerical@1.0.4: resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} @@ -10275,7 +9703,6 @@ packages: dependencies: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - dev: true /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} @@ -10295,9 +9722,11 @@ packages: /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true /is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: true /is-arrow-function@2.0.3: resolution: {integrity: sha512-iDStzcT1FJMzx+TjCOK//uDugSe/Mif/8a+T0htydQ3qkJGvSweTZpVYz4hpJH0baloSPiAFQdA8WslAgJphvQ==} @@ -10341,6 +9770,7 @@ packages: /is-buffer@2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} + dev: true /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} @@ -10358,6 +9788,7 @@ packages: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: hasown: 2.0.2 + dev: true /is-data-view@1.0.1: resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} @@ -10379,7 +9810,6 @@ packages: /is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - dev: true /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} @@ -10484,7 +9914,6 @@ packages: /is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - dev: true /is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} @@ -10709,9 +10138,11 @@ packages: /isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: true /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -10740,10 +10171,6 @@ packages: unfetch: 5.0.0 dev: true - /isomorphic.js@0.2.5: - resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} - dev: false - /issue-parser@6.0.0: resolution: {integrity: sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==} engines: {node: '>=10.13'} @@ -11335,6 +10762,7 @@ packages: /js-cookie@2.2.1: resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + dev: true /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -11412,6 +10840,7 @@ packages: /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true /json-parse-even-better-errors@3.0.1: resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} @@ -11490,13 +10919,6 @@ packages: object.values: 1.2.0 dev: true - /katex@0.16.9: - resolution: {integrity: sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==} - hasBin: true - dependencies: - commander: 8.3.0 - dev: false - /keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: @@ -11523,6 +10945,7 @@ packages: /kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + dev: true /known-css-properties@0.29.0: resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==} @@ -11585,14 +11008,6 @@ packages: type-check: 0.4.0 dev: true - /lib0@0.2.93: - resolution: {integrity: sha512-M5IKsiFJYulS+8Eal8f+zAqf5ckm1vffW0fFDxfgxJ+uiVopvDdd3PxJmz0GsVi3YNO7QCFSq0nAsiDmNhLj9Q==} - engines: {node: '>=16'} - hasBin: true - dependencies: - isomorphic.js: 0.2.5 - dev: false - /lightningcss-darwin-arm64@1.22.1: resolution: {integrity: sha512-ldvElu+R0QimNTjsKpaZkUv3zf+uefzLy/R1R19jtgOfSRM+zjUCUgDhfEDRmVqJtMwYsdhMI2aJtJChPC6Osg==} engines: {node: '>= 12.0.0'} @@ -11698,6 +11113,7 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true /lines-and-columns@2.0.4: resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} @@ -11821,10 +11237,6 @@ packages: /lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - /lodash._reinterpolate@3.0.0: - resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} - dev: false - /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: true @@ -11837,19 +11249,13 @@ packages: resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} dev: true - /lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - dev: false - /lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - - /lodash.isempty@4.4.0: - resolution: {integrity: sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==} - dev: false + dev: true /lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: true /lodash.isfunction@3.0.9: resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} @@ -11859,14 +11265,6 @@ packages: resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} dev: true - /lodash.isnil@4.0.0: - resolution: {integrity: sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==} - dev: false - - /lodash.isobject@3.0.2: - resolution: {integrity: sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==} - dev: false - /lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} dev: true @@ -11881,15 +11279,12 @@ packages: /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true /lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} dev: true - /lodash.omitby@4.6.0: - resolution: {integrity: sha512-5OrRcIVR75M288p4nbI2WLAf3ndw2GD9fyNv3Bc15+WCxJDdZ4lYndSxGd7hnG6PVjiJTeJE2dHEGhIuKGicIQ==} - dev: false - /lodash.snakecase@4.1.1: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} dev: true @@ -11898,19 +11293,6 @@ packages: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true - /lodash.template@4.5.0: - resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} - dependencies: - lodash._reinterpolate: 3.0.0 - lodash.templatesettings: 4.2.0 - dev: false - - /lodash.templatesettings@4.2.0: - resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} - dependencies: - lodash._reinterpolate: 3.0.0 - dev: false - /lodash.throttle@4.1.1: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} dev: true @@ -11919,16 +11301,9 @@ packages: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: true - /lodash.union@4.6.0: - resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} - dev: false - - /lodash.unionby@4.8.0: - resolution: {integrity: sha512-e60kn4GJIunNkw6v9MxRnUuLYI/Tyuanch7ozoCtk/1irJTYBj+qNTxr5B3qVflmJhwStJBv387Cb+9VOfABMg==} - dev: false - /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true /lodash.uniqby@4.7.0: resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} @@ -11940,6 +11315,7 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true /log-symbols@2.2.0: resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} @@ -12106,6 +11482,7 @@ packages: /markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: true /marked-terminal@5.2.0(marked@5.1.2): resolution: {integrity: sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==} @@ -12154,6 +11531,7 @@ packages: '@types/mdast': 3.0.15 '@types/unist': 2.0.10 unist-util-visit: 4.1.2 + dev: true /mdast-util-directive@2.2.4: resolution: {integrity: sha512-sK3ojFP+jpj1n7Zo5ZKvoxP1MvLyzVG63+gm40Z/qI00avzdPCYxt7RBMgofwAva9gBjbDBWVRB/i+UD+fUCzQ==} @@ -12176,6 +11554,7 @@ packages: escape-string-regexp: 5.0.0 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 + dev: true /mdast-util-from-markdown@1.3.1: resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} @@ -12194,6 +11573,26 @@ packages: uvu: 0.5.6 transitivePeerDependencies: - supports-color + dev: true + + /mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false /mdast-util-frontmatter@1.0.1: resolution: {integrity: sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==} @@ -12210,6 +11609,7 @@ packages: ccount: 2.0.1 mdast-util-find-and-replace: 2.2.2 micromark-util-character: 1.2.0 + dev: true /mdast-util-gfm-footnote@1.0.2: resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} @@ -12217,12 +11617,14 @@ packages: '@types/mdast': 3.0.15 mdast-util-to-markdown: 1.5.0 micromark-util-normalize-identifier: 1.1.0 + dev: true /mdast-util-gfm-strikethrough@1.0.3: resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} dependencies: '@types/mdast': 3.0.15 mdast-util-to-markdown: 1.5.0 + dev: true /mdast-util-gfm-table@1.0.7: resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} @@ -12233,12 +11635,14 @@ packages: mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color + dev: true /mdast-util-gfm-task-list-item@1.0.2: resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} dependencies: '@types/mdast': 3.0.15 mdast-util-to-markdown: 1.5.0 + dev: true /mdast-util-gfm@2.0.2: resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} @@ -12252,14 +11656,7 @@ packages: mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color - - /mdast-util-math@2.0.2: - resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} - dependencies: - '@types/mdast': 3.0.15 - longest-streak: 3.1.0 - mdast-util-to-markdown: 1.5.0 - dev: false + dev: true /mdast-util-mdx-expression@1.3.2: resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} @@ -12273,6 +11670,39 @@ packages: - supports-color dev: true + /mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-jsx@3.1.2: + resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /mdast-util-mdxjs-esm@1.3.1: resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} dependencies: @@ -12285,11 +11715,32 @@ packages: - supports-color dev: true + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + /mdast-util-phrasing@3.0.1: resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} dependencies: '@types/mdast': 3.0.15 unist-util-is: 5.2.1 + dev: true + + /mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + dependencies: + '@types/mdast': 4.0.3 + unist-util-is: 6.0.0 + dev: false /mdast-util-to-hast@12.3.0: resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} @@ -12302,6 +11753,7 @@ packages: unist-util-generated: 2.0.1 unist-util-position: 4.0.4 unist-util-visit: 4.1.2 + dev: true /mdast-util-to-hast@13.1.0: resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} @@ -12328,11 +11780,32 @@ packages: micromark-util-decode-string: 1.1.0 unist-util-visit: 4.1.2 zwitch: 2.0.4 + dev: true + + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + dev: false /mdast-util-to-string@3.2.0: resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} dependencies: '@types/mdast': 3.0.15 + dev: true + + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + dependencies: + '@types/mdast': 4.0.3 + dev: false /mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} @@ -12353,10 +11826,6 @@ packages: fs-monkey: 1.0.5 dev: true - /memoize-one@5.2.1: - resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} - dev: false - /meow@10.1.5: resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -12425,6 +11894,28 @@ packages: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 + dev: true + + /micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false /micromark-extension-directive@2.2.1: resolution: {integrity: sha512-ZFKZkNaEqAP86IghX1X7sE8NNnx6kFNq9mSBRvEHjArutTCJZ3LYg6VH151lXVb1JHpmIcW/7rX25oMoIHuSug==} @@ -12454,6 +11945,7 @@ packages: micromark-util-sanitize-uri: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 + dev: true /micromark-extension-gfm-footnote@1.1.2: resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} @@ -12466,6 +11958,7 @@ packages: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 + dev: true /micromark-extension-gfm-strikethrough@1.0.7: resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} @@ -12476,6 +11969,7 @@ packages: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 + dev: true /micromark-extension-gfm-table@1.0.7: resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} @@ -12485,11 +11979,13 @@ packages: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 + dev: true /micromark-extension-gfm-tagfilter@1.0.2: resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} dependencies: micromark-util-types: 1.1.0 + dev: true /micromark-extension-gfm-task-list-item@1.0.5: resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} @@ -12499,6 +11995,7 @@ packages: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 + dev: true /micromark-extension-gfm@2.0.3: resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} @@ -12511,18 +12008,7 @@ packages: micromark-extension-gfm-task-list-item: 1.0.5 micromark-util-combine-extensions: 1.1.0 micromark-util-types: 1.1.0 - - /micromark-extension-math@2.1.2: - resolution: {integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==} - dependencies: - '@types/katex': 0.16.7 - katex: 0.16.9 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: false + dev: true /micromark-factory-destination@1.1.0: resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} @@ -12530,6 +12016,15 @@ packages: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 + dev: true + + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false /micromark-factory-label@1.1.0: resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} @@ -12538,12 +12033,30 @@ packages: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 + dev: true + + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false /micromark-factory-space@1.1.0: resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} dependencies: micromark-util-character: 1.2.0 micromark-util-types: 1.1.0 + dev: true + + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + dev: false /micromark-factory-title@1.1.0: resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} @@ -12552,6 +12065,16 @@ packages: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 + dev: true + + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false /micromark-factory-whitespace@1.1.0: resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} @@ -12560,12 +12083,23 @@ packages: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 + dev: true + + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false /micromark-util-character@1.2.0: resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} dependencies: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 + dev: true /micromark-util-character@2.1.0: resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} @@ -12578,6 +12112,13 @@ packages: resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} dependencies: micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false /micromark-util-classify-character@1.1.0: resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} @@ -12585,17 +12126,41 @@ packages: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 + dev: true + + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false /micromark-util-combine-extensions@1.1.0: resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} dependencies: micromark-util-chunked: 1.1.0 micromark-util-types: 1.1.0 + dev: true + + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + dev: false /micromark-util-decode-numeric-character-reference@1.1.0: resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} dependencies: micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false /micromark-util-decode-string@1.1.0: resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} @@ -12604,9 +12169,20 @@ packages: micromark-util-character: 1.2.0 micromark-util-decode-numeric-character-reference: 1.1.0 micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + dev: false /micromark-util-encode@1.1.0: resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + dev: true /micromark-util-encode@2.0.0: resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} @@ -12614,16 +12190,35 @@ packages: /micromark-util-html-tag-name@1.2.0: resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + dev: true + + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + dev: false /micromark-util-normalize-identifier@1.1.0: resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} dependencies: micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false /micromark-util-resolve-all@1.1.0: resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} dependencies: micromark-util-types: 1.1.0 + dev: true + + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + dependencies: + micromark-util-types: 2.0.0 + dev: false /micromark-util-sanitize-uri@1.2.0: resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} @@ -12631,6 +12226,7 @@ packages: micromark-util-character: 1.2.0 micromark-util-encode: 1.1.0 micromark-util-symbol: 1.1.0 + dev: true /micromark-util-sanitize-uri@2.0.0: resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} @@ -12647,9 +12243,20 @@ packages: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 + dev: true + + /micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false /micromark-util-symbol@1.1.0: resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + dev: true /micromark-util-symbol@2.0.0: resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} @@ -12657,6 +12264,7 @@ packages: /micromark-util-types@1.1.0: resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + dev: true /micromark-util-types@2.0.0: resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} @@ -12684,6 +12292,31 @@ packages: uvu: 0.5.6 transitivePeerDependencies: - supports-color + dev: true + + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} @@ -12791,6 +12424,7 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true /minipass@7.0.4: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} @@ -12867,6 +12501,7 @@ packages: /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + dev: true /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -12884,6 +12519,7 @@ packages: dependencies: duplexer2: 0.1.4 object-assign: 4.1.1 + dev: true /mute-stream@0.0.7: resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} @@ -12905,12 +12541,6 @@ packages: hasBin: true dev: true - /nanoid@5.0.6: - resolution: {integrity: sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA==} - engines: {node: ^18 || >=20} - hasBin: true - dev: false - /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true @@ -13208,6 +12838,7 @@ packages: /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + dev: true /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} @@ -13223,6 +12854,7 @@ packages: /object-keys@0.4.0: resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==} + dev: true /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} @@ -13624,6 +13256,7 @@ packages: engines: {node: '>=6'} dependencies: callsites: 3.1.0 + dev: true /parse-asn1@5.1.7: resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} @@ -13659,7 +13292,6 @@ packages: is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - dev: true /parse-git-config@0.2.0: resolution: {integrity: sha512-amapZFADOJtHvX2URcRfbzG2OFcW+UAwmdK2kht2N2vsH5Py65VxI5yZTlD2DjmxVhTz6htFoVCxROYUJaYOXQ==} @@ -13694,6 +13326,7 @@ packages: error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + dev: true /parse-json@7.1.1: resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} @@ -13724,6 +13357,7 @@ packages: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: entities: 4.5.0 + dev: true /parseley@0.12.1: resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} @@ -13784,6 +13418,7 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true /path-scurry@1.10.1: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} @@ -13802,6 +13437,7 @@ packages: /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + dev: true /path-type@5.0.0: resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} @@ -13841,6 +13477,7 @@ packages: /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -14495,6 +14132,7 @@ packages: /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true /process-warning@1.0.0: resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} @@ -14538,6 +14176,7 @@ packages: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 + dev: true /property-information@5.6.0: resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} @@ -14794,7 +14433,7 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@rc-component/trigger': 1.18.3(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 + classnames: 2.5.1 rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -14909,7 +14548,7 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@rc-component/trigger': 1.18.3(react-dom@18.2.0)(react@18.2.0) - classnames: 2.3.2 + classnames: 2.5.1 rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) rc-overflow: 1.3.2(react-dom@18.2.0)(react@18.2.0) rc-util: 5.39.1(react-dom@18.2.0)(react@18.2.0) @@ -15155,7 +14794,7 @@ packages: react-dom: '>=16.9.0' dependencies: '@babel/runtime': 7.24.1 - classnames: 2.3.2 + classnames: 2.5.1 rc-dropdown: 4.1.0(react-dom@18.2.0)(react@18.2.0) rc-menu: 9.12.4(react-dom@18.2.0)(react@18.2.0) rc-motion: 2.9.0(react-dom@18.2.0)(react@18.2.0) @@ -15290,27 +14929,6 @@ packages: strip-json-comments: 2.0.1 dev: true - /re-resizable@6.9.11(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-a3hiLWck/NkmyLvGWUuvkAmN1VhwAz4yOhS6FdMTaxCUVN9joIWkT11wsO68coG/iEYuwn+p/7qAmfQzRhiPLQ==} - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /re-resizable@6.9.6(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-0xYKS5+Z0zk+vICQlcZW+g54CcJTTmHluA7JUUgvERDxnKAnytylcyPsA+BSFi759s5hPlHmBRegFrwXs2FuBQ==} - peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 - dependencies: - fast-memoize: 2.5.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - /react-copy-to-clipboard@5.1.0(react@18.2.0): resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==} peerDependencies: @@ -15319,6 +14937,7 @@ packages: copy-to-clipboard: 3.3.3 prop-types: 15.8.1 react: 18.2.0 + dev: true /react-dom@18.1.0(react@18.1.0): resolution: {integrity: sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w==} @@ -15340,18 +14959,6 @@ packages: react: 18.2.0 scheduler: 0.23.0 - /react-draggable@4.4.5(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==} - peerDependencies: - react: '>= 16.3.0' - react-dom: '>= 16.3.0' - dependencies: - clsx: 1.2.1 - prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - /react-error-boundary@4.0.13(react@18.2.0): resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} peerDependencies: @@ -15399,16 +15006,6 @@ packages: shallowequal: 1.1.0 dev: true - /react-hotkeys-hook@4.5.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Samb85GSgAWFQNvVt3PS90LPPGSf9mkH/r4au81ZP1yOIFayLC3QAvqTgGtJ8YEDMXtPmaVBs6NgipHO6h4Mug==} - peerDependencies: - react: '>=16.8.1' - react-dom: '>=16.8.1' - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - /react-i18next@14.1.0(i18next@23.10.1)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-3KwX6LHpbvGQ+sBEntjV4sYW3Zovjjl3fpoHbUwSgFHf0uRBcbeCBLR5al6ikncI5+W0EFb71QXZmfop+J6NrQ==} peerDependencies: @@ -15454,6 +15051,7 @@ packages: /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: true /react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} @@ -15470,30 +15068,26 @@ packages: '@babel/runtime': 7.24.1 '@emotion/css': 11.11.2 react: 18.2.0 + dev: true - /react-markdown@8.0.7(@types/react@18.2.31)(react@18.2.0): - resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} + /react-markdown@9.0.1(@types/react@18.2.31)(react@18.2.0): + resolution: {integrity: sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==} peerDependencies: - '@types/react': '>=16' - react: '>=16' + '@types/react': '>=18' + react: '>=18' dependencies: - '@types/hast': 2.3.10 - '@types/prop-types': 15.7.12 + '@types/hast': 3.0.4 '@types/react': 18.2.31 - '@types/unist': 2.0.10 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 2.0.1 - prop-types: 15.8.1 - property-information: 6.4.1 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.0 + html-url-attributes: 3.0.0 + mdast-util-to-hast: 13.1.0 react: 18.2.0 - react-is: 18.2.0 - remark-parse: 10.0.2 - remark-rehype: 10.1.0 - space-separated-tokens: 2.0.2 - style-to-object: 0.4.4 - unified: 10.1.2 - unist-util-visit: 4.1.2 - vfile: 5.3.7 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + unified: 11.0.4 + unist-util-visit: 5.0.0 + vfile: 6.0.1 transitivePeerDependencies: - supports-color dev: false @@ -15507,19 +15101,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /react-rnd@10.4.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-0m887AjQZr6p2ADLNnipquqsDq4XJu/uqVqI3zuoGD19tRm6uB83HmZWydtkilNp5EWsOHbLGF4IjWMdd5du8Q==} - peerDependencies: - react: '>=16.3.0' - react-dom: '>=16.3.0' - dependencies: - re-resizable: 6.9.6(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-draggable: 4.4.5(react-dom@18.2.0)(react@18.2.0) - tslib: 2.3.1 - dev: false - /react-router-dom@6.3.0(react-dom@18.1.0)(react@18.1.0): resolution: {integrity: sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==} peerDependencies: @@ -15575,19 +15156,6 @@ packages: refractor: 3.6.0 dev: true - /react-window@1.8.10(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Y0Cx+dnU6NLa5/EvoHukUD0BklJ8qITCtVEPY1C/nL8wwoZ0b5aEw8Ff1dOVHw7fCzMt55XfJDd8S8W8LCaUCg==} - engines: {node: '>8.0.0'} - peerDependencies: - react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@babel/runtime': 7.24.1 - memoize-one: 5.2.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - /react@18.1.0: resolution: {integrity: sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ==} engines: {node: '>=0.10.0'} @@ -15602,25 +15170,6 @@ packages: dependencies: loose-envify: 1.4.0 - /reactflow@11.10.4(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-0CApYhtYicXEDg/x2kvUHiUk26Qur8lAtTtiSlptNKuyEuGti6P1y5cS32YGaUoDMoCqkm/m+jcKkfMOvSCVRA==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - dependencies: - '@reactflow/background': 11.3.9(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/controls': 11.2.9(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/core': 11.10.4(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/minimap': 11.7.9(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/node-resizer': 2.2.9(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) - '@reactflow/node-toolbar': 1.3.9(@types/react@18.2.31)(immer@9.0.21)(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - dev: false - /read-pkg-up@10.1.0: resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==} engines: {node: '>=16'} @@ -15685,6 +15234,7 @@ packages: inherits: 2.0.4 isarray: 0.0.1 string_decoder: 0.10.31 + dev: true /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -15696,6 +15246,7 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 + dev: true /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} @@ -15822,17 +15373,6 @@ packages: unist-util-visit: 4.1.2 dev: true - /rehype-katex@6.0.3: - resolution: {integrity: sha512-ByZlRwRUcWegNbF70CVRm2h/7xy7jQ3R9LaY4VVSvjnoVWwWVhNL60DiZsBpC5tSzYQOCvDbzncIpIjPZWodZA==} - dependencies: - '@types/hast': 2.3.10 - '@types/katex': 0.14.0 - hast-util-from-html-isomorphic: 1.0.0 - hast-util-to-text: 3.1.2 - katex: 0.16.9 - unist-util-visit: 4.1.2 - dev: false - /rehype-remove-comments@5.0.0: resolution: {integrity: sha512-sfiVT+u1in19sxo9vv/SDQVbHE2mADScNrpeVsUxBFl14zOMZnfPb6l4hR+lXqe10G13UFVqv5pt8zDbCR4JYQ==} dependencies: @@ -15884,15 +15424,7 @@ packages: unified: 10.1.2 transitivePeerDependencies: - supports-color - - /remark-math@5.1.1: - resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} - dependencies: - '@types/mdast': 3.0.15 - mdast-util-math: 2.0.2 - micromark-extension-math: 2.1.2 - unified: 10.1.2 - dev: false + dev: true /remark-parse@10.0.2: resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} @@ -15902,6 +15434,18 @@ packages: unified: 10.1.2 transitivePeerDependencies: - supports-color + dev: true + + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false /remark-rehype@10.1.0: resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} @@ -15910,6 +15454,17 @@ packages: '@types/mdast': 3.0.15 mdast-util-to-hast: 12.3.0 unified: 10.1.2 + dev: true + + /remark-rehype@11.1.0: + resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + mdast-util-to-hast: 13.1.0 + unified: 11.0.4 + vfile: 6.0.1 + dev: false /remote-origin-url@0.4.0: resolution: {integrity: sha512-HYhdsT2pNd0LP4Osb0vtQ1iassxIc3Yk1oze7j8dMJFciMkW8e0rdg9E/mOunqtSVHSzvMfwLDIYzPnEDmpk6Q==} @@ -15979,6 +15534,7 @@ packages: /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + dev: true /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} @@ -16015,6 +15571,7 @@ packages: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + dev: true /resolve@2.0.0-next.5: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} @@ -16157,17 +15714,12 @@ packages: tslib: 1.14.1 dev: true - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - dependencies: - tslib: 2.6.2 - dev: false - /sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} dependencies: mri: 1.2.0 + dev: true /safe-array-concat@1.1.2: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} @@ -16181,6 +15733,7 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -16253,6 +15806,7 @@ packages: /screenfull@5.2.0: resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} engines: {node: '>=0.10.0'} + dev: true /scroll-into-view-if-needed@3.1.0: resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} @@ -16457,12 +16011,6 @@ packages: deprecated: Please migrate to https://github.com/antfu/shikiji dev: true - /shikiji@0.6.13: - resolution: {integrity: sha512-4T7X39csvhT0p7GDnq9vysWddf2b6BeioiN3Ymhnt3xcy9tXmDcnsEFVxX18Z4YcQgEE/w48dLJ4pPPUcG9KkA==} - dependencies: - hast-util-to-html: 9.0.0 - dev: false - /shortid@2.2.16: resolution: {integrity: sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -16506,6 +16054,7 @@ packages: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} dependencies: is-arrayish: 0.3.2 + dev: true /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -16667,6 +16216,7 @@ packages: /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} + dev: true /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} @@ -16960,11 +16510,13 @@ packages: /string_decoder@0.10.31: resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: true /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 + dev: true /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -17069,6 +16621,13 @@ packages: resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} dependencies: inline-style-parser: 0.1.1 + dev: true + + /style-to-object@1.0.5: + resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + dependencies: + inline-style-parser: 0.2.2 + dev: false /stylelint-config-recommended@7.0.0(stylelint@15.11.0): resolution: {integrity: sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==} @@ -17139,6 +16698,7 @@ packages: /stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + dev: true /stylis@4.3.1: resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} @@ -17149,6 +16709,7 @@ packages: engines: {node: '>=4'} dependencies: has-flag: 3.0.0 + dev: true /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -17183,6 +16744,7 @@ packages: /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + dev: true /svelte@4.2.12: resolution: {integrity: sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==} @@ -17312,6 +16874,7 @@ packages: /tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + dev: true /table@6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} @@ -17452,6 +17015,7 @@ packages: dependencies: readable-stream: 1.0.34 xtend: 2.1.2 + dev: true /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -17468,6 +17032,7 @@ packages: /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true /timed-out@4.0.1: resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} @@ -17522,6 +17087,7 @@ packages: /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} + dev: true /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -17630,12 +17196,9 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib@2.3.1: - resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} - dev: false - /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true /tsutils@3.21.0(typescript@5.4.3): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -17712,6 +17275,7 @@ packages: /type-fest@3.13.1: resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} engines: {node: '>=14.16'} + dev: true /type-fest@4.13.1: resolution: {integrity: sha512-ASMgM+Vf2cLwDMt1KXSkMUDSYCxtckDJs8zsaVF/mYteIsiARKCVtyXtcK38mIKbLTctZP8v6GMqdNaeI3fo7g==} @@ -17888,6 +17452,19 @@ packages: is-plain-obj: 4.1.0 trough: 2.2.0 vfile: 5.3.7 + dev: true + + /unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.1 + dev: false /unique-filename@1.1.1: resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} @@ -17923,20 +17500,15 @@ packages: unist-util-visit-parents: 5.1.3 dev: true - /unist-util-find-after@4.0.1: - resolution: {integrity: sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - dev: false - /unist-util-generated@2.0.1: resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + dev: true /unist-util-is@5.2.1: resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} dependencies: '@types/unist': 2.0.10 + dev: true /unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} @@ -17948,6 +17520,7 @@ packages: resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} dependencies: '@types/unist': 2.0.10 + dev: true /unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} @@ -17955,17 +17528,18 @@ packages: '@types/unist': 3.0.2 dev: false - /unist-util-remove-position@4.0.2: - resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} dependencies: - '@types/unist': 2.0.10 - unist-util-visit: 4.1.2 + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 dev: false /unist-util-stringify-position@3.0.3: resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} dependencies: '@types/unist': 2.0.10 + dev: true /unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} @@ -17978,6 +17552,7 @@ packages: dependencies: '@types/unist': 2.0.10 unist-util-is: 5.2.1 + dev: true /unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} @@ -17992,6 +17567,7 @@ packages: '@types/unist': 2.0.10 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 + dev: true /unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} @@ -18124,6 +17700,7 @@ packages: react: '>= 16.x' dependencies: react: 18.2.0 + dev: true /use-sync-external-store@1.2.0(react@18.2.0): resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} @@ -18131,9 +17708,11 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: react: 18.2.0 + dev: true /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true /util.promisify@1.0.1: resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} @@ -18174,6 +17753,7 @@ packages: diff: 5.2.0 kleur: 4.1.5 sade: 1.8.1 + dev: true /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -18220,19 +17800,14 @@ packages: dependencies: '@types/unist': 2.0.10 vfile: 5.3.7 - - /vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} - dependencies: - '@types/unist': 3.0.2 - vfile: 6.0.1 - dev: false + dev: true /vfile-message@3.1.4: resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} dependencies: '@types/unist': 2.0.10 unist-util-stringify-position: 3.0.3 + dev: true /vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} @@ -18248,6 +17823,7 @@ packages: is-buffer: 2.0.5 unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 + dev: true /vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} @@ -18463,6 +18039,7 @@ packages: /web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: true /web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} @@ -18739,6 +18316,7 @@ packages: engines: {node: '>=0.4'} dependencies: object-keys: 0.4.0 + dev: true /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} @@ -18773,6 +18351,7 @@ packages: /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + dev: true /yaml@2.3.4: resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} @@ -18802,13 +18381,6 @@ packages: yargs-parser: 21.1.1 dev: true - /yjs@13.6.14: - resolution: {integrity: sha512-D+7KcUr0j+vBCUSKXXEWfA+bG4UQBviAwP3gYBhkstkgwy5+8diOPMx0iqLIOxNo/HxaREUimZRxqHGAHCL2BQ==} - engines: {node: '>=16.0.0', npm: '>=8.0.0'} - dependencies: - lib0: 0.2.93 - dev: false - /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -18836,17 +18408,6 @@ packages: commander: 9.5.0 dev: true - /zustand-middleware-yjs@1.3.1(@types/react@18.2.31)(immer@9.0.21)(react@18.2.0): - resolution: {integrity: sha512-mhMh4znmvTJQXUuSlwZe5LcUNBgd8E1oOhRmDHjNSQ0M5HpODiUZKelWqiCbgxB2Qv9CPxk5QXFQEQxInce9RQ==} - dependencies: - yjs: 13.6.14 - zustand: 4.5.2(@types/react@18.2.31)(immer@9.0.21)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - immer - - react - dev: false - /zustand-utils@1.3.2(react@18.2.0)(zustand@4.5.2): resolution: {integrity: sha512-c+X8whiqWKgl6r3jzzlNR6vp5ZHsqfIxbZN2uyv+GlqATKh//6GIneywm7tcq+8XZXINT8N9tnDH8npPdXDLEA==} peerDependencies: @@ -18856,9 +18417,10 @@ packages: '@babel/runtime': 7.24.1 fast-deep-equal: 3.1.3 react: 18.2.0 - zustand: 4.5.2(@types/react@18.2.31)(immer@9.0.21)(react@18.2.0) + zustand: 4.5.2(@types/react@18.2.31)(react@18.2.0) + dev: true - /zustand@4.5.2(@types/react@18.2.31)(immer@9.0.21)(react@18.2.0): + /zustand@4.5.2(@types/react@18.2.31)(react@18.2.0): resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} engines: {node: '>=12.7.0'} peerDependencies: @@ -18874,9 +18436,9 @@ packages: optional: true dependencies: '@types/react': 18.2.31 - immer: 9.0.21 react: 18.2.0 use-sync-external-store: 1.2.0(react@18.2.0) + dev: true /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} diff --git a/src/ProChat/components/ChatList/ChatListItem.tsx b/src/ProChat/components/ChatList/ChatListItem.tsx deleted file mode 100644 index 517ea971..00000000 --- a/src/ProChat/components/ChatList/ChatListItem.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import { FC, ReactNode } from 'react'; - -import { LLMRoleType } from '@/types/llm'; -import { ChatMessage } from '@/types/message'; - -import { useRefFunction } from '@/ProChat/hooks/useRefFunction'; -import ChatItem, { ChatItemProps } from '@/components/ChatItem'; - -export type OnMessageChange = (id: string, content: string) => void; -export type OnActionClick = (action: any, message: ChatMessage) => void; -export type RenderRole = LLMRoleType | 'default' | string; -export type RenderItem = FC<{ key: string } & ChatMessage>; -export type RenderMessage = FC; -export type RenderAction = FC; - -/** - * 聊天列表项的属性。 - * @template T 聊天列表项的额外数据类型。 - */ -export type ChatListItemProps> = ChatMessage & { - /** - * 是否正在加载。 - */ - loading?: boolean; - /** - * 聊天项的类名。 - * @default '' - */ - chatItemClassName?: string; - /** - * 聊天项的渲染函数。 - */ - chatItemRenderConfig?: ChatItemProps['chatItemRenderConfig']; - /** - * 原始数据。 - */ - originData?: ChatItemProps['originData']; -}; - -/** - * 聊天列表项组件。 - * @param props 组件属性。 - * @returns 聊天列表项组件。 - */ -const ChatListItem = (props: ChatListItemProps) => { - const { originData, loading, chatItemRenderConfig, chatItemClassName, ...item } = props; - - /** - * 渲染消息的函数。 - * @param editableContent 可编辑的内容。 - * @param data 聊天消息的数据。 - * @returns 渲染消息的组件。 - */ - const RenderMessage = useRefFunction( - ({ editableContent, data }: { data: ChatMessage; editableContent: ReactNode }) => { - if (!renderMessages || !item?.role) return; - let RenderFunction; - if (renderMessages?.[item.role]) RenderFunction = renderMessages[item.role]; - if (!RenderFunction && renderMessages?.['default']) - RenderFunction = renderMessages['default']; - if (!RenderFunction) return; - return ; - }, - ); - - /** - * 渲染消息额外内容的函数。 - * @param data 聊天消息的数据。 - * @returns 渲染消息额外内容的组件。 - */ - const MessageExtra = useRefFunction(({ data }: { data: ChatMessage }) => { - if (!renderMessagesExtra || !item?.role) return; - let RenderFunction; - if (renderMessagesExtra?.[item.role]) RenderFunction = renderMessagesExtra[item.role]; - if (renderMessagesExtra?.['default']) RenderFunction = renderMessagesExtra['default']; - if (!RenderFunction && !RenderFunction) return; - - return ; - }); - - return ( - } - placement={item.role === 'user' ? 'right' : 'left'} - primary={item.role === 'user'} - time={item.updateAt || item.createAt} - chatItemRenderConfig={chatItemRenderConfig} - > - - - ); -}; - -export default ChatListItem; diff --git a/src/ProChat/components/ChatList/Extras/Assistant.tsx b/src/ProChat/components/ChatList/Extras/Assistant.tsx deleted file mode 100644 index 30db4a2c..00000000 --- a/src/ProChat/components/ChatList/Extras/Assistant.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { Flex } from 'antd'; -import { RenderMessageExtra } from '../ChatListItem'; - -export const AssistantMessageExtra: RenderMessageExtra = ({ extra, ...rest }) => { - const showModelTag = extra?.fromModel && model !== extra?.fromModel; - const hasTranslate = !!extra?.translate; - - const showExtra = showModelTag || hasTranslate; - - const dom = messageItemExtraRender?.({ extra, ...rest }, 'assistant'); - if (!showExtra && !dom) return; - - return ( - - {dom} - - ); -}; diff --git a/src/ProChat/components/ChatList/Extras/User.tsx b/src/ProChat/components/ChatList/Extras/User.tsx deleted file mode 100644 index b7a74a3f..00000000 --- a/src/ProChat/components/ChatList/Extras/User.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { Divider, Flex } from 'antd'; -import { memo } from 'react'; - -import { RenderMessage } from '../ChatListItem'; - -export const UserMessageExtra: RenderMessage = memo( - ({ messageItemExtraRender, extra, ...rest }) => { - const hasTranslate = !!extra?.translate; - const dom = messageItemExtraRender?.({ extra, ...rest }); - if (!dom) return; - return ( - - {extra?.translate && ( -
- -
- )} - {dom} -
- ); - }, -); diff --git a/src/ProChat/components/ChatList/Extras/index.ts b/src/ProChat/components/ChatList/Extras/index.ts deleted file mode 100644 index 21837e9c..00000000 --- a/src/ProChat/components/ChatList/Extras/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { ChatListProps } from '..'; -import { AssistantMessageExtra } from './Assistant'; -import { UserMessageExtra } from './User'; - -export const renderMessagesExtra: ChatListProps['renderMessagesExtra'] = { - assistant: AssistantMessageExtra, - user: UserMessageExtra, -}; diff --git a/src/ProChat/components/ChatList/Messages/Assistant.tsx b/src/ProChat/components/ChatList/Messages/Assistant.tsx deleted file mode 100644 index 6059ad8a..00000000 --- a/src/ProChat/components/ChatList/Messages/Assistant.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { memo } from 'react'; - -import { RenderMessage } from '../ChatListItem'; -import { DefaultMessage } from './Default'; - -export const AssistantMessage: RenderMessage = memo(({ id, content, ...props }) => { - // todo: need a custom render - return ; -}); diff --git a/src/ProChat/components/ChatList/Messages/Default.tsx b/src/ProChat/components/ChatList/Messages/Default.tsx deleted file mode 100644 index 1d93a497..00000000 --- a/src/ProChat/components/ChatList/Messages/Default.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { memo } from 'react'; - -import { LOADING_FLAT } from '@/ProChat/const/message'; - -import { RenderMessage } from '../ChatListItem'; -import BubblesLoading from '../Loading'; - -export const DefaultMessage: RenderMessage = memo(({ id, editableContent, content }) => { - if (content === LOADING_FLAT) return ; - - return
{editableContent}
; -}); diff --git a/src/ProChat/components/ChatList/Messages/Hello.tsx b/src/ProChat/components/ChatList/Messages/Hello.tsx deleted file mode 100644 index 06bd1025..00000000 --- a/src/ProChat/components/ChatList/Messages/Hello.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { memo } from 'react'; -import { RenderMessage } from '../ChatListItem'; -import { DefaultMessage } from './Default'; - -export const HelloMessage: RenderMessage = memo((props) => { - const { content } = props; - if (typeof content === 'string') return ; - return content; -}); diff --git a/src/ProChat/components/ChatList/Messages/index.ts b/src/ProChat/components/ChatList/Messages/index.ts deleted file mode 100644 index 80b7daf3..00000000 --- a/src/ProChat/components/ChatList/Messages/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ChatListProps } from '..'; -import { AssistantMessage } from './Assistant'; -import { DefaultMessage } from './Default'; -import { HelloMessage } from './Hello'; - -export const renderMessages: ChatListProps['renderMessages'] = { - hello: HelloMessage, - assistant: AssistantMessage, - default: DefaultMessage, -}; diff --git a/src/ProChat/components/ChatList/OTPInput.tsx b/src/ProChat/components/ChatList/OTPInput.tsx deleted file mode 100644 index a7aed652..00000000 --- a/src/ProChat/components/ChatList/OTPInput.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import { Flex } from 'antd'; -import { createStyles } from 'antd-style'; -import { useMergedState } from 'rc-util'; -import React, { memo } from 'react'; - -const useStyles = createStyles( - ({ css, token }) => css` - width: ${token.controlHeight}px; - height: ${token.controlHeight}px; - - font-size: 16px; - color: ${token.colorText}; - text-align: center; - - background: ${token.colorBgContainer}; - border: 1px solid ${token.colorBorder}; - border-radius: 8px; - - &:focus, - &:focus-visible { - border-color: ${token.colorPrimary}; - outline: none; - } - `, -); - -/** - * Let's borrow some props from HTML "input". More info below: - * - * [Pick Documentation](https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys) - * - * [How to extend HTML Elements](https://reacthustle.com/blog/how-to-extend-html-elements-in-react-typescript) - */ -type PartialInputProps = Pick, 'className' | 'style'>; - -interface OtpInputProps extends PartialInputProps { - onChange?: (value: string) => void; - /** - * Number of characters/input for this component - */ - size?: number; - /** - * Validation pattern for each input. - * e.g: /[0-9]{1}/ for digits only or /[0-9a-zA-Z]{1}/ for alphanumeric - */ - validationPattern?: RegExp; - /** - * full value of the otp input, up to {size} characters - */ - value?: string; - defaultValue?: string; -} - -const handleKeyUp = (e: React.KeyboardEvent) => { - const current = e.currentTarget; - if (e.key === 'ArrowLeft' || e.key === 'Backspace') { - const prev = current.previousElementSibling as HTMLInputElement | null; - prev?.focus(); - prev?.setSelectionRange(0, 1); - return; - } - - if (e.key === 'ArrowRight') { - const prev = current.nextSibling as HTMLInputElement | null; - prev?.focus(); - prev?.setSelectionRange(0, 1); - return; - } -}; - -const OtpInput = memo((props) => { - const { - //Set the default size to 6 characters - size = 6, - //Default validation is digits - validationPattern = /\d/, - value: outerValue, - defaultValue, - onChange, - className, - ...restProps - } = props; - const [value, setValue] = useMergedState(defaultValue!, { onChange, value: outerValue }); - - const { styles, cx } = useStyles(); - // Create an array based on the size. - const arr = Array.from({ length: size }).fill('-'); - - const handleInputChange = (e: React.ChangeEvent, index: number) => { - const elem = e.target; - const val = e.target.value; - - // check if the value is valid - if (!validationPattern.test(val) && val !== '') return; - - // change the value using onChange props - const valueArr = value?.split('') || []; - valueArr[index] = val; - const newVal = valueArr.join('').slice(0, 6); - setValue(newVal); - - //focus the next element if there's a value - if (val) { - const next = elem.nextElementSibling as HTMLInputElement | null; - next?.focus(); - } - }; - - const handlePaste = (e: React.ClipboardEvent) => { - e.preventDefault(); - const val = e.clipboardData.getData('text').slice(0, Math.max(0, size)); - - setValue(val); - }; - - return ( - - {arr.map((_, index) => { - return ( - handleInputChange(e, index)} - onKeyUp={handleKeyUp} - onPaste={handlePaste} - pattern={validationPattern.source} - type="text" - value={value?.at(index) ?? ''} - /> - ); - })} - - ); -}); - -export default OtpInput; diff --git a/src/ProChat/components/ChatList/SkeletonList.tsx b/src/ProChat/components/ChatList/SkeletonList.tsx deleted file mode 100644 index e98a8dd9..00000000 --- a/src/ProChat/components/ChatList/SkeletonList.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { Flex, Skeleton } from 'antd'; -import { createStyles } from 'antd-style'; -import { memo } from 'react'; - -const useStyles = createStyles(({ css, prefixCls }) => ({ - user: css` - display: flex; - flex-direction: row-reverse; - gap: 16px; - - .${prefixCls}-skeleton-paragraph { - display: flex; - flex-direction: column; - align-items: flex-end; - } - `, -})); -const SkeletonList = memo(() => { - const { styles } = useStyles(); - - return ( - - - - - ); -}); -export default SkeletonList; diff --git a/src/ProChat/components/InputArea/ActionBar.tsx b/src/ProChat/components/InputArea/ActionBar.tsx deleted file mode 100644 index 3384919f..00000000 --- a/src/ProChat/components/InputArea/ActionBar.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { createStyles, cx } from 'antd-style'; - -import { ConfigProvider, Flex, FlexProps, Popconfirm } from 'antd'; - -import { gLocaleObject } from '@/locale'; -import { DeleteFilled } from '@ant-design/icons'; - -const useStyles = createStyles(({ css, token }) => ({ - extra: css` - color: ${token.colorTextTertiary}; - `, -})); - -export const ActionBar = ({ - className, - clearMessage, - actionsRender, - flexConfig, - locale, -}: { - className?: string; - locale: string; - flexConfig: FlexProps; -}) => { - const { styles, theme } = useStyles(); - const defaultDoms = [ - { - clearMessage(); - }} - > - - , - ]; - - return ( - - - {actionsRender?.(defaultDoms) ?? defaultDoms} - - - ); -}; - -export default ActionBar; diff --git a/src/ProChat/components/InputArea/AutoCompleteTextArea.tsx b/src/ProChat/components/InputArea/AutoCompleteTextArea.tsx deleted file mode 100644 index 5fe89fdf..00000000 --- a/src/ProChat/components/InputArea/AutoCompleteTextArea.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { AutoComplete, AutoCompleteProps, Input } from 'antd'; -import { TextAreaProps } from 'antd/es/input'; -import { useState } from 'react'; - -type AutoCompleteTextAreaProps = TextAreaProps & { - autoCompleteProps?: AutoCompleteProps; - autocompleteRequest?: (value: string) => Promise<{ value: string; label?: string }[]>; -}; - -export const AutoCompleteTextArea: React.FC = (props) => { - const { disabled, autoCompleteProps = {}, autocompleteRequest, ...rest } = props; - - const [options, setOptions] = useState<{ value: string; label: string }[]>([]); - const [open, setOpen] = useState(false); - return ( - { - setOpen(open); - }} - value={props.value} - onSelect={(value) => { - props.onChange?.({ target: { value } } as any); - setOptions([]); - }} - onSearch={async (value) => { - const result = await autocompleteRequest?.(value); - setOptions((result as any[]) || []); - }} - {...autoCompleteProps} - > - { - setOpen(false); - props.onFocus?.(e); - }} - onPressEnter={(e) => { - if (open && options.length > 0) return; - props.onPressEnter?.(e); - }} - /> - - ); -}; diff --git a/src/ProChat/index.tsx b/src/ProChat/index.tsx deleted file mode 100644 index d748f0e9..00000000 --- a/src/ProChat/index.tsx +++ /dev/null @@ -1,4 +0,0 @@ -export * from '../types/message'; - -export { ProChat } from './ProChat'; -export { useProChat, type ProChatInstance } from './hooks/useProChat'; diff --git a/src/ProChat/store/action.ts b/src/ProChat/store/action.ts deleted file mode 100644 index e3609300..00000000 --- a/src/ProChat/store/action.ts +++ /dev/null @@ -1,487 +0,0 @@ -import { merge, template } from 'lodash-es'; -import { StateCreator } from 'zustand/vanilla'; - -import { LOADING_FLAT } from '@/ProChat/const/message'; -import { ChatStore } from '@/ProChat/store/index'; -import { fetchSSE } from '@/ProChat/utils/fetch'; -import { isFunctionMessage } from '@/ProChat/utils/message'; -import { nanoid } from '@/ProChat/utils/uuid'; -import { ChatMessage } from '@/types/message'; - -import { ChatStreamPayload } from '@/ProChat/types/chat'; -import { getSlicedMessagesWithConfig } from '../utils/message'; -import { MessageDispatch, messagesReducer } from './reducers/message'; -import { chatSelectors } from './selectors'; - -const t = setNamespace('chat/message'); - -interface FetchChatModelOptions { - signal?: AbortSignal | undefined; -} - -/** - * 聊天操作 - */ -export interface ChatAction { - /** - * 清除消息 - */ - clearMessage: () => void; - - /** - * 删除消息 - * @param id - 消息 ID - */ - deleteMessage: (id: string) => void; - /** - * 分发消息 - * @param payload - 消息分发参数 - */ - dispatchMessage: (payload: MessageDispatch) => void; - /** - * 生成消息 - * @param messages - 聊天消息数组 - * @param options - 获取 SSE 选项 - */ - generateMessage: ( - messages: ChatMessage[], - assistantMessageId: string, - ) => Promise<{ isFunctionCall: boolean }>; - /** - * 实际获取 AI 响应 - * - * @param messages - 聊天消息数组 - * @param parentId - 父消息 ID,可选 - */ - realFetchAIResponse: (messages: ChatMessage[], parentId: string) => Promise; - - /** - * 重新发送消息 - * @param id - 消息 ID - */ - resendMessage: (id: string) => Promise; - /** - * 发送消息 - * @param text - 消息文本 - */ - sendMessage: (text: string) => Promise; - - /** - * 停止生成消息 - * @returns - */ - stopGenerateMessage: () => void; - - /** - * 切换 loading 状态 - * @param loading - * @param id - * @param action - * @returns - */ - toggleChatLoading: ( - loading: boolean, - id?: string, - action?: string, - ) => AbortController | undefined; - - /** - * 默认的数据请求方法 - * @param params - * @param options - * @returns - */ - defaultModelFetcher: ( - params: Partial, - options?: FetchChatModelOptions, - ) => Promise; - - /** - * 生成消息 ID - * @returns 消息 id - */ - getMessageId: (messages: ChatMessage[], parentId: string) => Promise; - - /** - * 用于更新一条消息的内容(目前仅用于平滑输出时候,其余情况请直接使用 dispatchMessage ) - */ - updateMessageContent: (id: string, content: string) => Promise; - - /** - * 创建一条平滑输出的内容 - */ - createSmoothMessage: (id: string) => { - startAnimation: (speed?: number) => Promise; - stopAnimation: () => void; - outputQueue: string[]; - isAnimationActive: boolean; - }; - - /** - * 获取当前 loading 生成的消息 id - * @returns 消息 id | undefined - */ - getChatLoadingId: () => string | undefined; -} - -export const chatAction: StateCreator = ( - set, - get, -) => ({ - clearMessage: async () => { - const { dispatchMessage, onResetMessage } = get(); - - // 重置消息,清空聊天记录,等待 onResetMessage 完成后再清空 - if (onResetMessage) await onResetMessage(); - - dispatchMessage({ type: 'resetMessages' }); - - // TODO: need callback after reset - }, - - deleteMessage: (id) => { - get().dispatchMessage({ id, type: 'deleteMessage' }); - }, - - updateMessageContent: async (id, content) => { - const { dispatchMessage, updateMessageContent } = get(); - dispatchMessage({ id, key: 'content', type: 'updateMessage', value: content }); - updateMessageContent(id, content); - }, - - dispatchMessage: (payload) => { - const { chatList, onChatsChange } = get(); - - const nextChats = messagesReducer(chatList, payload); - - set({ chatList: nextChats }, false, t('dispatchMessage')); - - onChatsChange?.(nextChats); - }, - generateMessage: async (messages, assistantId) => { - const { - dispatchMessage, - toggleChatLoading, - config, - defaultModelFetcher, - createSmoothMessage, - updateMessageContent, - } = get(); - const abortController = toggleChatLoading( - true, - assistantId, - t('generateMessage(start)', { assistantId, messages }) as string, - ); - - // ========================== // - // 对 messages 做统一预处理 // - // ========================== // - - // 1. 按参数设定截断长度 - const slicedMessages = getSlicedMessagesWithConfig(messages, config); - - // 2. 替换 inputMessage 模板 - const compilerMessages = (slicedMessages: ChatMessage[]) => { - const compiler = template(config.inputTemplate, { interpolate: /{{([\S\s]+?)}}/g }); - return slicedMessages.map((m) => { - if (m.role === 'user') { - try { - return { ...m, content: compiler({ text: m.content }) }; - } catch (error) { - console.error(error); - - return m; - } - } - return m; - }); - }; - const postMessages = !config.inputTemplate ? slicedMessages : compilerMessages(slicedMessages); - - // 3. 添加 systemRole - if (config.systemRole) { - postMessages.unshift({ content: config.systemRole, role: 'system' } as ChatMessage); - } - - const fetcher = () => - defaultModelFetcher( - { - messages: postMessages, - model: config.model, - ...config.params, - }, - { signal: abortController?.signal }, - ); - - let output = ''; - let isFunctionCall = false; - - const { startAnimation, stopAnimation, outputQueue, isAnimationActive } = - createSmoothMessage(assistantId); - - await fetchSSE(fetcher, { - onErrorHandle: (error) => { - dispatchMessage({ id: assistantId, key: 'error', type: 'updateMessage', value: error }); - }, - onAbort: async () => { - stopAnimation(); - }, - onFinish: async (content) => { - stopAnimation(); - if (outputQueue.length > 0 && !isFunctionCall) { - await startAnimation(15); - } - await updateMessageContent(assistantId, content); - }, - onMessageHandle: (text) => { - output += text; - - if (!isAnimationActive && !isFunctionCall) startAnimation(); - - if (abortController?.signal.aborted) { - // aborted 后停止当前输出 - return; - } else { - outputQueue.push(text); - } - - // TODO: need a function call judge callback - // 如果是 function call - if (isFunctionMessage(output)) { - isFunctionCall = true; - } - }, - }); - - let timeoutId; // 用于存储轮询队列的计时器id - const checkAndToggleChatLoading = () => { - clearTimeout(timeoutId); // 清除任何现有的计时器 - // 等待队列内容输出完毕 - if (outputQueue === undefined || outputQueue.length === 0 || outputQueue.toString() === '') { - // 当队列为空时 - toggleChatLoading(false, undefined, t('generateMessage(end)') as string); - clearTimeout(timeoutId); - } else { - // 如果队列不为空,则设置一个延迟或者使用某种形式的轮询来再次检查队列 - timeoutId = setTimeout(checkAndToggleChatLoading, 30); // CHECK_INTERVAL 是毫秒数,代表检查间隔时间 - } - }; - - checkAndToggleChatLoading(); - - return { isFunctionCall }; - }, - - realFetchAIResponse: async (messages, userMessageId) => { - const { dispatchMessage, generateMessage, config, getMessageId } = get(); - - // 添加一个空的信息用于放置 ai 响应,注意顺序不能反 - // 因为如果顺序反了,messages 中将包含新增的 ai message - const mid = await getMessageId(messages, userMessageId); - - dispatchMessage({ - id: mid, - message: LOADING_FLAT, - parentId: userMessageId, - role: 'assistant', - type: 'addMessage', - }); - - // TODO: need a callback before generate message - - // 为模型添加 fromModel 的额外信息 - // TODO: 此处需要model 信息 - dispatchMessage({ id: mid, key: 'fromModel', type: 'updateMessageExtra', value: config.model }); - - // 生成 ai message - await generateMessage(messages, mid); - - // todo: need callback after generate message - }, - - resendMessage: async (messageId) => { - // 1. 构造所有相关的历史记录 - const chatList = chatSelectors.currentChats(get()); - - const currentIndex = chatList.findIndex((c) => c.id === messageId); - if (currentIndex < 0) return; - - const currentMessage = chatList[currentIndex]; - - let contextMessages: ChatMessage[] = []; - - switch (currentMessage.role) { - case 'function': - case 'user': { - contextMessages = chatList.slice(0, currentIndex + 1); - break; - } - case 'assistant': { - // 消息是 AI 发出的因此需要找到它的 user 消息 - const userId = currentMessage.parentId; - const userIndex = chatList.findIndex((c) => c.id === userId); - // 如果消息没有 parentId,那么同 user/function 模式 - contextMessages = chatList.slice(0, userIndex < 0 ? currentIndex + 1 : userIndex + 1); - break; - } - } - - if (contextMessages.length <= 0) return; - - const { realFetchAIResponse } = get(); - - const latestMsg = contextMessages.filter((s) => s.role === 'user').at(-1); - - if (!latestMsg) return; - - await realFetchAIResponse(contextMessages, latestMsg.id); - }, - - sendMessage: async (message) => { - const { dispatchMessage, realFetchAIResponse } = get(); - - if (!message) return; - - const userId = nanoid(); - dispatchMessage({ id: userId, message, role: 'user', type: 'addMessage' }); - - // Todo: need a callback before send message - - // Get the current messages to generate AI response - const messages = chatSelectors.currentChats(get()); - - await realFetchAIResponse(messages, userId); - - // TODO: need a callback after send - }, - - stopGenerateMessage: () => { - const { abortController, toggleChatLoading, chatLoadingId, chatList, dispatchMessage } = get(); - // 如果当前 最后一条为 chatLoadingId 停止前需要清空 - if (chatList && chatList.length > 0) { - const lastChat = chatList[chatList.length - 1]; - if (lastChat.content === LOADING_FLAT) { - dispatchMessage({ - id: chatLoadingId, - key: 'content', - type: 'updateMessage', - value: '', - }); - } - } - - if (!abortController) return; - - abortController.abort(); - - toggleChatLoading(false); - }, - toggleChatLoading: (loading, id, action) => { - if (loading) { - const abortController = new AbortController(); - set({ abortController, chatLoadingId: id }, false, action); - return abortController; - } else { - set({ abortController: undefined, chatLoadingId: undefined }, false, action); - } - }, - - defaultModelFetcher: (params, options) => { - const { request } = get(); - const payload = merge( - { - model: initialModelConfig.model, - stream: true, - ...initialModelConfig.params, - }, - params, - ); - - if (typeof request === 'function') - return request(payload.messages as ChatMessage[], payload, options?.signal); - - const url = typeof request === 'string' ? request : '/api/openai/chat'; - - return fetch(url, { - body: JSON.stringify(payload), - headers: { 'Content-Type': 'application/json' }, - method: 'POST', - signal: options?.signal, - }); - }, - getMessageId: async (messages, parentId) => { - const { genMessageId } = get(); - if (typeof genMessageId === 'function') return genMessageId(messages, parentId); - return nanoid(); - }, - - createSmoothMessage: (id) => { - const { dispatchMessage } = get(); - - let buffer = ''; - // why use queue: https://shareg.pt/GLBrjpK - let outputQueue: string[] = []; - - // eslint-disable-next-line no-undef - let animationTimeoutId: NodeJS.Timeout | null = null; - let isAnimationActive = false; - - // when you need to stop the animation, call this function - const stopAnimation = () => { - isAnimationActive = false; - if (animationTimeoutId !== null) { - clearTimeout(animationTimeoutId); - animationTimeoutId = null; - } - }; - - // define startAnimation function to display the text in buffer smooth - // when you need to start the animation, call this function - const startAnimation = (speed = 2) => - new Promise((resolve) => { - if (isAnimationActive) { - resolve(); - return; - } - - isAnimationActive = true; - - const updateText = () => { - // 如果动画已经不再激活,则停止更新文本 - if (!isAnimationActive) { - clearTimeout(animationTimeoutId!); - animationTimeoutId = null; - resolve(); - } - - // 如果还有文本没有显示 - // 检查队列中是否有字符待显示 - if (outputQueue.length > 0) { - // 从队列中获取前两个字符(如果存在) - const charsToAdd = outputQueue.splice(0, speed).join(''); - buffer += charsToAdd; - - // 更新消息内容,这里可能需要结合实际情况调整 - dispatchMessage({ id, key: 'content', type: 'updateMessage', value: buffer }); - - // 设置下一个字符的延迟 - animationTimeoutId = setTimeout(updateText, 16); // 16 毫秒的延迟模拟打字机效果 - } else { - // 当所有字符都显示完毕时,清除动画状态 - isAnimationActive = false; - animationTimeoutId = null; - resolve(); - } - }; - - updateText(); - }); - - return { startAnimation, stopAnimation, outputQueue, isAnimationActive }; - }, - - getChatLoadingId: () => { - const { chatLoadingId } = get(); - return chatLoadingId; - }, -}); diff --git a/src/ProChat/store/index.ts b/src/ProChat/store/index.ts deleted file mode 100644 index f7c0c73e..00000000 --- a/src/ProChat/store/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ChatStore } from './store'; - -export * from './store'; - -export const { useStore, useStoreApi, Provider } = createContext>(); diff --git a/src/ProChat/store/initialState.ts b/src/ProChat/store/initialState.ts deleted file mode 100644 index 4dfe970f..00000000 --- a/src/ProChat/store/initialState.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { DEFAULT_AVATAR, DEFAULT_USER_AVATAR } from '@/ProChat/const/meta'; -import { ModelConfig } from '@/ProChat/types/config'; -import { MetaData } from '@/ProChat/types/meta'; -import { ChatMessage } from '@/types/message'; -import { AutoCompleteProps } from 'antd'; -import { TextAreaProps } from 'antd/es/input'; -import { ReactNode } from 'react'; -import { FlexBasicProps } from 'react-layout-kit/lib/FlexBasic'; -import { Locale } from '../../locale'; -import { ProChatChatReference } from '../ProChat'; diff --git a/src/ProChat/store/reducers/message.test.ts b/src/ProChat/store/reducers/message.test.ts deleted file mode 100644 index dbd12314..00000000 --- a/src/ProChat/store/reducers/message.test.ts +++ /dev/null @@ -1,232 +0,0 @@ -import { ChatMessage } from '@/types/message'; - -import { MessageDispatch, messagesReducer } from './message'; - -describe('messagesReducer', () => { - let initialState: ChatMessage[]; - - beforeEach(() => { - initialState = [ - { - id: 'message1', - content: 'Hello World', - createAt: 1629264000000, - updateAt: 1629264000000, - role: 'user', - }, - { - id: 'message2', - content: 'How are you?', - createAt: 1629264000000, - updateAt: 1629264000000, - role: 'system', - }, - ]; - }); - - describe('addMessage', () => { - it('should add a new message to the state', () => { - const payload: MessageDispatch = { - type: 'addMessage', - message: 'New Message', - role: 'user', - id: 'message3', - }; - - const newState = messagesReducer(initialState, payload); - - expect(Object.keys(newState)).toHaveLength(3); - // eslint-disable-next-line jest/valid-expect - expect(newState.some((m) => m.id === 'message1')); - // eslint-disable-next-line jest/valid-expect - expect(newState.some((m) => m.id === 'message2')); - // eslint-disable-next-line jest/valid-expect - expect(newState.some((m) => m.id === 'message3')); - expect(newState.find((m) => m.id === 'message3')).toEqual({ - id: 'message3', - content: 'New Message', - createAt: expect.any(Number), - updateAt: expect.any(Number), - parentId: undefined, - role: 'user', - }); - }); - - it('should use the provided id when adding a new message', () => { - const payload: MessageDispatch = { - type: 'addMessage', - id: 'customId', - message: 'New Message', - role: 'user', - }; - - const newState = messagesReducer(initialState, payload); - - expect(Object.keys(newState)).toHaveLength(3); - // eslint-disable-next-line jest/valid-expect - expect(newState.some((m) => m.id === 'message1')); - // eslint-disable-next-line jest/valid-expect - expect(newState.some((m) => m.id === 'message2')); - // eslint-disable-next-line jest/valid-expect - expect(newState.some((m) => m.id === 'customId')); - expect(newState.find((m) => m.id === 'customId')).toEqual({ - id: 'customId', - content: 'New Message', - createAt: expect.any(Number), - updateAt: expect.any(Number), - parentId: undefined, - role: 'user', - }); - }); - - it('should use the provided parentId when adding a new message', () => { - const payload: MessageDispatch = { - type: 'addMessage', - message: 'New Message', - id: 'message3', - role: 'user', - parentId: 'message1', - }; - - const newState = messagesReducer(initialState, payload); - - expect(newState.find((m) => m.id === 'message3')).toEqual({ - id: 'message3', - content: 'New Message', - createAt: expect.any(Number), - updateAt: expect.any(Number), - role: 'user', - parentId: 'message1', - }); - }); - - it('should use the provided parentId and quotaId when adding a new message', () => { - const payload: MessageDispatch = { - type: 'addMessage', - message: 'New Message', - id: 'message3', - role: 'user', - parentId: 'message1', - }; - - const newState = messagesReducer(initialState, payload); - - expect(newState.find((m) => m.id === 'message3')).toEqual({ - id: 'message3', - content: 'New Message', - createAt: expect.any(Number), - updateAt: expect.any(Number), - role: 'user', - parentId: 'message1', - }); - }); - }); - - describe('deleteMessage', () => { - it('should remove the specified message from the state', () => { - const payload: MessageDispatch = { - type: 'deleteMessage', - id: 'message1', - }; - - const newState = messagesReducer(initialState, payload); - - expect(Object.keys(newState)).toHaveLength(1); - // eslint-disable-next-line jest/valid-expect - expect(!newState.some((m) => m.id === 'message1')); - // eslint-disable-next-line jest/valid-expect - expect(newState.some((m) => m.id === 'message2')); - }); - - it('should not modify the state if the specified message does not exist', () => { - const payload: MessageDispatch = { - type: 'deleteMessage', - id: 'nonexistentMessage', - }; - - const newState = messagesReducer(initialState, payload); - - expect(newState).toEqual(initialState); - }); - }); - - describe('updateMessage', () => { - it('should update the specified message with the provided value', () => { - const payload: MessageDispatch = { - type: 'updateMessage', - id: 'message1', - key: 'content', - value: 'Updated Message', - }; - - const newState = messagesReducer(initialState, payload); - - const message1 = newState.find((m) => m.id === 'message1'); - expect(message1?.content).toBe('Updated Message'); - }); - - it('should not modify the state if the specified message does not exist', () => { - const payload: MessageDispatch = { - type: 'updateMessage', - id: 'nonexistentMessage', - key: 'content', - value: 'Updated Message', - }; - - const newState = messagesReducer(initialState, payload); - - expect(newState).toEqual(initialState); - }); - }); - - describe('updateMessageExtra', () => { - it('should update the specified message extra property with the provided value', () => { - const payload: MessageDispatch = { - type: 'updateMessageExtra', - id: 'message1', - key: 'translate', - value: { target: 'en', to: 'zh' }, - }; - - const newState = messagesReducer(initialState, payload); - const message1 = newState.find((m) => m.id === 'message1'); - expect(message1?.extra!.translate).toEqual({ target: 'en', to: 'zh' }); - }); - - it('should not modify the state if the specified message does not exist', () => { - const payload: MessageDispatch = { - type: 'updateMessageExtra', - id: 'nonexistentMessage', - key: 'translate', - value: { target: 'en', to: 'zh' }, - }; - - const newState = messagesReducer(initialState, payload); - - expect(newState).toEqual(initialState); - }); - }); - - describe('resetMessages', () => { - it('should reset the state to an empty object', () => { - const payload: MessageDispatch = { - type: 'resetMessages', - }; - - const newState = messagesReducer(initialState, payload); - - expect(newState).toEqual([]); - }); - }); - - describe('unimplemented type', () => { - it('should throw an error when an unimplemented type is provided', () => { - // @ts-ignore - const payload: MessageDispatch = { type: 'unimplementedType' }; - - expect(() => messagesReducer(initialState, payload)).toThrow( - '暂未实现的 type,请检查 reducer', - ); - }); - }); -}); diff --git a/src/ProChat/store/reducers/message.ts b/src/ProChat/store/reducers/message.ts deleted file mode 100644 index e0a7bd8c..00000000 --- a/src/ProChat/store/reducers/message.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { produce } from 'immer'; - -import { LLMRoleType } from '@/types/llm'; -import { ChatMessage } from '@/types/message'; -import { MetaData } from '@/types/meta'; -import { nanoid } from '../../utils/uuid'; - -interface AddMessage { - id?: string; - message: string; - meta?: MetaData; - parentId?: string; - quotaId?: string; - role: LLMRoleType; - type: 'addMessage'; -} - -interface DeleteMessage { - id: string; - type: 'deleteMessage'; -} - -interface ResetMessages { - topicId?: string; - type: 'resetMessages'; -} - -interface UpdateMessage { - id: string; - key: keyof ChatMessage; - type: 'updateMessage'; - value: ChatMessage[keyof ChatMessage]; -} -interface UpdateMessageExtra { - id: string; - key: string; - type: 'updateMessageExtra'; - value: any; -} - -export type MessageDispatch = - | AddMessage - | DeleteMessage - | ResetMessages - | UpdateMessage - | UpdateMessageExtra; - -export const messagesReducer = ( - state: ChatMessage[], - payload: MessageDispatch, -): ChatMessage[] => { - switch (payload.type) { - case 'addMessage': { - return produce(state, (draftState) => { - const mid = payload.id || nanoid(); - - draftState.push({ - content: payload.message, - createAt: Date.now(), - id: mid, - parentId: payload.parentId, - role: payload.role, - updateAt: Date.now(), - }); - }); - } - - case 'deleteMessage': { - return state - .map((m) => { - if (m.id !== payload.id) return m; - return false; - }) - .filter(Boolean) as ChatMessage[]; - } - - case 'updateMessage': { - return produce(state, (draftState) => { - const { id, key, value } = payload; - const message = draftState.find((m) => m.id === id); - if (!message) return; - - // @ts-ignore - message[key] = value; - message.updateAt = Date.now(); - }); - } - - case 'updateMessageExtra': { - return produce(state, (draftState) => { - const { id, key, value } = payload; - - const message = draftState.find((m) => m.id === id); - if (!message) return; - - if (!message.extra) { - message.extra = { [key]: value } as any; - } else { - message.extra[key] = value; - } - - message.updateAt = Date.now(); - }); - } - - case 'resetMessages': { - return []; - } - - default: { - throw new Error('暂未实现的 type,请检查 reducer'); - } - } -}; diff --git a/src/ProChat/store/selectors/chat.ts b/src/ProChat/store/selectors/chat.ts deleted file mode 100644 index 7b0c67e9..00000000 --- a/src/ProChat/store/selectors/chat.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { ChatMessage } from '@/types/message'; - -import { MetaData } from '@/ProChat/types/meta'; -import { gLocaleObject } from '@/locale'; -import { getSlicedMessagesWithConfig } from '../../utils/message'; -import type { ChatStore } from '../store'; - -// 当前激活的消息列表 -export const currentChats = (s: ChatStore): ChatMessage[] => { - if (Object.keys(s.chatList).length === 0) return []; - - const getMeta = (message: ChatMessage): MetaData => { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { avatar, title, backgroundColor, ...rest } = s.userMeta; - const assistant = s.assistantMeta; - switch (message?.role) { - case 'user': { - return { - avatar, - title, - ...rest, - }; - } - - case 'system': { - return assistant; - } - - case 'assistant': { - return { - avatar: assistant?.avatar, - backgroundColor: assistant?.backgroundColor, - title: assistant?.title, - }; - } - } - - return {}; - }; - - const basic = s.chatList - // 映射头像关系 - .map((m) => { - return { - ...m, - meta: getMeta(m), - }; - }); - - const finalList: ChatMessage[] = []; - - const addItem = (item: ChatMessage) => { - const isExist = finalList.findIndex((i) => item.id === i.id) > -1; - if (!isExist) { - finalList.push(item); - } - }; - - // 基于添加逻辑进行重排序 - for (const item of basic) { - // 先判存在与否,不存在就加入 - addItem(item); - - for (const another of basic) { - if (another.parentId === item.id) { - addItem(another); - } - } - } - - return finalList; -}; - -// 针对新助手添加初始化时的自定义消息 -export const currentChatsWithGuideMessage = (s: ChatStore): ChatMessage[] => { - const data = currentChats(s); - // TODO: need topic inject - - const isBrandNewChat = data.length === 0; - - if (!isBrandNewChat) return data; - - const emptyInboxGuideMessage = { - content: s.helloMessage ?? gLocaleObject(s.locale).defaultHelloMessage, - createAt: Date.now(), - extra: {}, - id: 'default', - meta: s.assistantMeta, - role: 'hello', - updateAt: Date.now(), - } as ChatMessage; - - return [emptyInboxGuideMessage]; -}; - -export const currentChatsWithHistoryConfig = (s: ChatStore): ChatMessage[] => { - const chatList = currentChats(s); - - return getSlicedMessagesWithConfig(chatList, s.config); -}; - -export const chatListMessageString = (s: ChatStore): string => { - const chatList = currentChatsWithHistoryConfig(s); - return chatList.map((m) => m.content).join(''); -}; diff --git a/src/ProChat/store/selectors/index.ts b/src/ProChat/store/selectors/index.ts deleted file mode 100644 index 804017d2..00000000 --- a/src/ProChat/store/selectors/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { - chatListMessageString, - currentChats, - currentChatsWithGuideMessage, - currentChatsWithHistoryConfig, -} from './chat'; - -export const chatSelectors = { - chatListMessageString, - currentChats, - currentChatsWithGuideMessage, - currentChatsWithHistoryConfig, -}; diff --git a/src/ProChat/store/store.ts b/src/ProChat/store/store.ts deleted file mode 100644 index 784252f8..00000000 --- a/src/ProChat/store/store.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { StateCreator } from 'zustand/vanilla'; - -import { MetaData } from '@/ProChat/types/meta'; -import { merge } from 'lodash-es'; -import { optionalDevtools } from 'zustand-utils'; -import { DevtoolsOptions } from 'zustand/middleware'; -import { createWithEqualityFn } from 'zustand/traditional'; -import { ChatListProps } from '../components/ChatList'; -import { ChatAction, chatAction } from './action'; -import { ProChatState, initialState } from './initialState'; - -export interface ChatProps = Record> - extends Partial> { - // init - loading?: boolean; - initialChatsList?: ProChatState['chatList']; - userMeta?: MetaData; - assistantMeta?: MetaData; - /** - * @description 聊天项的渲染函数 - */ - chatItemRenderConfig?: ChatListProps['chatItemRenderConfig']; -} - -// =============== 聚合 createStoreFn ============ // - -export type ChatStore = ChatAction & ProChatState; - -const vanillaStore = - ({ - loading, - initialChatsList, - chatList, - ...props - }: ChatProps): StateCreator => - (...parameters) => { - // initState = innerState + props - - const finalInitChats = chatList ?? initialChatsList; - - const state = merge({}, initialState, { - init: !loading, - chatList: Array.isArray(finalInitChats) - ? finalInitChats - : Object.values(finalInitChats || {}), - ...props, - } as ProChatState); - - return { - ...state, - ...chatAction(...parameters), - }; - }; -// - -// =============== 封装 createStore ============ // - -const PRO_CHAT = 'PRO_CHAT'; - -const isDev = process.env.NODE_ENV === 'development'; - -export const createStore = (props: ChatProps, options: boolean | DevtoolsOptions = false) => { - const devtools = optionalDevtools(options !== false); - - const devtoolOptions = - options === false - ? undefined - : options === true - ? { name: PRO_CHAT + (isDev ? '_DEV' : '') } - : options; - - return createWithEqualityFn()(devtools(vanillaStore(props), devtoolOptions)); -}; diff --git a/src/ProChat/style/global.ts b/src/ProChat/style/global.ts deleted file mode 100644 index d4aeb30c..00000000 --- a/src/ProChat/style/global.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { FullToken, css } from 'antd-style'; - -export default (token: FullToken) => css` - line-height: 1; - text-size-adjust: none; - text-rendering: optimizelegibility; - vertical-align: baseline; - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-overflow-scrolling: touch; - -webkit-tap-highlight-color: transparent; - } - code { - font-family: ${token.fontFamilyCode} !important; - - span { - font-family: ${token.fontFamilyCode} !important; - } - } - - p { - word-wrap: break-word; - } - - ::selection { - color: #000; - background: ${token.blue3}; - - -webkit-text-fill-color: unset !important; - } - - * { - box-sizing: border-box; - vertical-align: baseline; - } - - @media only screen and (min-width: 574px) { - * { - ::-webkit-scrollbar { - cursor: pointer; - width: 4px; - height: 4px; - background-color: transparent; - } - - ::-webkit-scrollbar-thumb { - cursor: pointer; - background-color: transparent; - border-radius: 2px; - transition: background-color 500ms ${token.motionEaseOut}; - - &:hover { - background-color: ${token.colorText}; - } - } - - ::-webkit-scrollbar-corner { - display: none; - width: 0; - height: 0; - } - - &:hover { - ::-webkit-scrollbar-thumb { - background-color: ${token.colorFill}; - } - } - } - } -`; diff --git a/src/ProChat/style/index.ts b/src/ProChat/style/index.ts deleted file mode 100644 index 70d2a3ec..00000000 --- a/src/ProChat/style/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { createStyles } from 'antd-style'; -import global from './global'; - -export const useStyles = createStyles(({ token, prefixCls, cx }) => ({ - container: cx(`${prefixCls}-pro-chat`, global(token)), -})); diff --git a/src/ProChat/types/meta.ts b/src/ProChat/types/meta.ts deleted file mode 100644 index 572694f9..00000000 --- a/src/ProChat/types/meta.ts +++ /dev/null @@ -1,23 +0,0 @@ -export interface MetaData { - /** - * 角色头像 - * @description 可选参数,如果不传则使用默认头像 - */ - avatar?: string; - /** - * 背景色 - * @description 可选参数,如果不传则使用默认背景色 - */ - backgroundColor?: string; - /** - * 名称 - * @description 可选参数,如果不传则使用默认名称 - */ - title?: string; - - /** - * 附加数据 - * @description 可选参数,如果不传则使用默认名称 - */ - [key: string]: any; -} diff --git a/src/ProChat/utils/message.ts b/src/ProChat/utils/message.ts deleted file mode 100644 index ad46ce94..00000000 --- a/src/ProChat/utils/message.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { FUNCTION_MESSAGE_FLAG } from '@/ProChat/const/message'; -import { ModelConfig } from '@/ProChat/types/config'; -import { ChatMessage } from '@/types/message'; - -export const isFunctionMessage = (content: string) => { - return content.startsWith(FUNCTION_MESSAGE_FLAG); -}; - -export const getSlicedMessagesWithConfig = ( - messages: ChatMessage[], - config: ModelConfig, -): ChatMessage[] => { - // 如果没有开启历史消息数限制,或者限制为 0,则直接返回 - if (!config.enableHistoryCount || !config.historyCount) return messages; - - // 如果开启了,则返回尾部的N条消息 - return messages.reverse().slice(0, config.historyCount).reverse(); -}; diff --git a/src/ProChat/utils/storeDebug.ts b/src/ProChat/utils/storeDebug.ts deleted file mode 100644 index 3507d29c..00000000 --- a/src/ProChat/utils/storeDebug.ts +++ /dev/null @@ -1,11 +0,0 @@ -export const setNamespace = (namespace: string) => { - return (type: string, payload?: any) => { - const name = [namespace, type].filter(Boolean).join('/'); - return payload - ? { - payload, - type: name, - } - : name; - }; -}; diff --git a/src/ProChat/utils/uuid.ts b/src/ProChat/utils/uuid.ts deleted file mode 100644 index 8cc31f3c..00000000 --- a/src/ProChat/utils/uuid.ts +++ /dev/null @@ -1,7 +0,0 @@ -// generate('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 16); //=> "4f90d13a42" -import { customAlphabet } from 'nanoid/non-secure'; - -export const nanoid = customAlphabet( - '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', - 8, -); diff --git a/src/components/Avatar/style.ts b/src/components/Avatar/style.ts deleted file mode 100644 index f32919e0..00000000 --- a/src/components/Avatar/style.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { createStyles } from 'antd-style'; -import { readableColor } from 'polished'; - -export const useStyles = createStyles( - ({ css, token, prefixCls }, { background, size }: { background?: string; size: number }) => { - const backgroundColor = background ?? token.colorBgContainer; - const color = readableColor(backgroundColor); - - return { - avatar: css` - cursor: pointer; - - display: flex; - align-items: center; - justify-content: center; - - background: ${backgroundColor}; - border: 1px solid ${background ? 'transparent' : token.colorSplit}; - - > .${prefixCls}-avatar-string { - font-size: ${size * 0.5}px; - font-weight: 700; - line-height: 1 !important; - color: ${color}; - } - - > * { - cursor: pointer; - } - `, - }; - }, -); diff --git a/src/components/ChatItem/components/Actions.tsx b/src/components/ChatItem/components/Actions.tsx deleted file mode 100644 index c65ab433..00000000 --- a/src/components/ChatItem/components/Actions.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { memo } from 'react'; - -import { Flex } from 'antd'; -import { ChatItemProps } from '../type'; - -export interface ActionsProps { - actions: ChatItemProps['actions']; - className?: string; -} - -const Actions = memo(({ actions, className }) => { - return ( - - {actions} - - ); -}); - -export default Actions; diff --git a/src/components/ChatItem/components/Avatar.tsx b/src/components/ChatItem/components/Avatar.tsx deleted file mode 100644 index 2202e9ae..00000000 --- a/src/components/ChatItem/components/Avatar.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { memo } from 'react'; - -import AvatarComponent from '@/components/Avatar'; - -import { Flex } from 'antd'; -import { useStyles } from '../style'; -import type { ChatItemProps } from '../type'; -import Loading from './Loading'; - -export interface AvatarProps { - addon?: ChatItemProps['avatarAddon']; - avatar: ChatItemProps['avatar']; - loading?: ChatItemProps['loading']; - onClick?: ChatItemProps['onAvatarClick']; - placement?: ChatItemProps['placement']; - size?: number; -} - -const Avatar = memo( - ({ loading, avatar = {}, placement, addon, onClick, size = 40 }) => { - const { styles } = useStyles({ avatarSize: size }); - const avatarContent = ( -
- - -
- ); - - if (!addon) return avatarContent; - return ( - - {avatarContent} - {addon} - - ); - }, -); - -export default Avatar; diff --git a/src/components/ChatItem/components/BorderSpacing.tsx b/src/components/ChatItem/components/BorderSpacing.tsx deleted file mode 100644 index 877f61a8..00000000 --- a/src/components/ChatItem/components/BorderSpacing.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { memo } from 'react'; - -export interface BorderSpacingProps { - borderSpacing?: number; -} - -const BorderSpacing = memo(({ borderSpacing }) => { - if (!borderSpacing) return null; - - return
; -}); - -export default BorderSpacing; diff --git a/src/components/ChatItem/components/ErrorContent.tsx b/src/components/ChatItem/components/ErrorContent.tsx deleted file mode 100644 index 394b82b8..00000000 --- a/src/components/ChatItem/components/ErrorContent.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { Alert, Flex } from 'antd'; -import { memo } from 'react'; - -import { useStyles } from '../style'; -import { ChatItemProps } from '../type'; - -export interface ErrorContentProps { - error?: ChatItemProps['error']; - message?: ChatItemProps['errorMessage']; - placement?: ChatItemProps['placement']; -} - -const ErrorContent = memo(({ message, error, placement }) => { - const { styles } = useStyles({ placement }); - - return ( - - - {message} - - ); -}); - -export default ErrorContent; diff --git a/src/components/ChatItem/index.tsx b/src/components/ChatItem/index.tsx index 0e94587d..ae0136c2 100644 --- a/src/components/ChatItem/index.tsx +++ b/src/components/ChatItem/index.tsx @@ -2,20 +2,16 @@ import { useResponsive } from 'antd-style'; import { useContext } from 'react'; import { ConfigProvider, Flex } from 'antd'; -import Avatar from './components/Avatar'; -import BorderSpacing from './components/BorderSpacing'; -import MessageContent from './components/MessageContent'; -import Title from './components/Title'; -import { useStyles } from './style'; +import cx from 'classnames'; +import MessageContent from '../MessageContent'; +import ProChatAvatar from '../ProChatAvatar'; +import Title from '../Title'; import type { ChatItemProps } from './type'; -const MOBILE_AVATAR_SIZE = 32; - -const ChatItem: React.FC = (props) => { +export const ChatItem: React.FC = (props) => { const { onAvatarClick, className, - primary, loading, children, placement = 'left', @@ -25,14 +21,9 @@ const ChatItem: React.FC = (props) => { messageExtra, chatItemRenderConfig, onDoubleClick, - ...restProps } = props; + const { mobile } = useResponsive(); - const { cx, styles } = useStyles({ - placement, - primary, - title: avatar.title, - }); const { getPrefixCls } = useContext(ConfigProvider.ConfigContext); const prefixClass = getPrefixCls('pro-chat'); @@ -41,38 +32,33 @@ const ChatItem: React.FC = (props) => { const itemDom = ( - <Flex align={placement === 'left' ? 'flex-start' : 'flex-end'} - className={cx(styles.messageContent, `${prefixClass}-message-content`)} + className={cx(`${prefixClass}-message-content`)} style={{ flexDirection: placement === 'left' ? 'row' : 'row-reverse', }} @@ -84,18 +70,12 @@ const ChatItem: React.FC<ChatItemProps> = (props) => { onChange={onChange} onDoubleClick={onDoubleClick} placement={placement} - primary={primary} > {children} </MessageContent> </Flex> </Flex> - {mobile && <BorderSpacing borderSpacing={MOBILE_AVATAR_SIZE} />} </Flex> ); return itemDom; }; - -export default ChatItem; - -export type { ChatItemProps } from './type'; diff --git a/src/components/ChatItem/style.ts b/src/components/ChatItem/style.ts deleted file mode 100644 index 6782d42e..00000000 --- a/src/components/ChatItem/style.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { createStyles } from 'antd-style'; - -export const useStyles = createStyles( - ( - { cx, css, token, isDarkMode, responsive }, - { - placement, - type, - title, - primary, - avatarSize, - editing, - }: { - avatarSize?: number; - editing?: boolean; - placement?: 'left' | 'right'; - primary?: boolean; - title?: string; - type?: 'block' | 'pure'; - }, - ) => { - const blockStylish = css` - padding: 8px 12px; - background-color: ${primary - ? isDarkMode - ? token.colorFill - : token.colorBgElevated - : isDarkMode - ? token.colorFillSecondary - : token.colorBgContainer}; - border-radius: ${token.borderRadiusLG}px; - transition: background-color 100ms ${token.motionEaseOut}; - `; - - const pureStylish = css` - padding-top: ${title ? 0 : '6px'}; - `; - - const pureContainerStylish = css` - margin-bottom: -16px; - transition: background-color 100ms ${token.motionEaseOut}; - `; - - const typeStylish = type === 'block' ? blockStylish : pureStylish; - - const editingStylish = - editing && - css` - width: 100%; - `; - - return { - actions: cx( - css` - align-self: ${type === 'block' - ? 'flex-end' - : placement === 'left' - ? 'flex-start' - : 'flex-end'}; - justify-content: ${placement === 'left' ? 'flex-end' : 'flex-start'}; - `, - editing && - css` - pointer-events: none !important; - opacity: 0 !important; - `, - ), - alert: css``, - avatarContainer: css` - position: relative; - flex: none; - width: ${avatarSize}px; - height: ${avatarSize}px; - `, - avatarGroupContainer: css` - width: ${avatarSize}px; - `, - container: cx( - type === 'pure' && pureContainerStylish, - css` - position: relative; - width: 100%; - max-width: 100vw; - padding: 16px; - content-visibility: auto; - contain-intrinsic-size: 100px; - time { - display: inline-block; - white-space: nowrap; - } - - div[role='menubar'] { - display: flex; - } - - time, - div[role='menubar'] { - pointer-events: none; - opacity: 0; - transition: opacity 200ms ${token.motionEaseOut}; - } - - &:hover { - time, - div[role='menubar'] { - pointer-events: unset; - opacity: 1; - } - } - - ${responsive.mobile} { - padding: 4px 16px; - } - `, - ), - editingContainer: cx( - editingStylish, - css` - padding: 8px 12px 12px; - border: 1px solid ${token.colorBorderSecondary}; - - &:active, - &:hover { - border-color: ${token.colorBorder}; - } - `, - type === 'pure' && - css` - background: ${token.colorFillQuaternary}; - border-radius: ${token.borderRadius}px; - `, - ), - editingInput: css` - width: 100%; - `, - loading: css` - position: absolute; - right: ${placement === 'left' ? '-4px' : 'unset'}; - bottom: 0; - left: ${placement === 'right' ? '-4px' : 'unset'}; - - width: 16px; - height: 16px; - - color: ${token.colorBgLayout}; - - background: ${token.colorPrimary}; - border-radius: 50%; - `, - message: cx( - typeStylish, - css` - position: relative; - `, - ), - messageContainer: cx( - editingStylish, - css` - position: relative; - `, - ), - messageContent: cx( - editingStylish, - css` - position: relative; - overflow-x: hidden; - - ${responsive.mobile} { - flex-direction: column !important; - } - `, - ), - messageExtra: css``, - name: css` - position: 'relative'; - top: 'unset'; - right: ${placement === 'right' ? '0' : 'unset'}; - left: ${placement === 'left' ? '0' : 'unset'}; - - margin-bottom: 6px; - - font-size: 12px; - line-height: 1; - color: ${token.colorTextDescription}; - text-align: ${placement === 'left' ? 'left' : 'right'}; - `, - }; - }, -); diff --git a/src/components/ChatItem/type.ts b/src/components/ChatItem/type.ts index a820bde5..62b94871 100644 --- a/src/components/ChatItem/type.ts +++ b/src/components/ChatItem/type.ts @@ -34,10 +34,6 @@ export interface ChatItemProps<T = Record<string, any>> { * @default 'left' */ placement?: 'left' | 'right'; - /** - * @description Whether the chat item is primary - */ - primary?: boolean; /** * @description The timestamp of the chat item */ diff --git a/src/ProChat/components/ChatList/Loading.tsx b/src/components/ChatList/Loading.tsx similarity index 100% rename from src/ProChat/components/ChatList/Loading.tsx rename to src/components/ChatList/Loading.tsx diff --git a/src/components/ChatList/Messages/index.tsx b/src/components/ChatList/Messages/index.tsx new file mode 100644 index 00000000..8f1b44bd --- /dev/null +++ b/src/components/ChatList/Messages/index.tsx @@ -0,0 +1,13 @@ +import { memo } from 'react'; + +import { LOADING_FLAT } from '@/const/message'; +import Markdown from 'react-markdown'; +import BubblesLoading from '../Loading'; + +export const MessageComponent: React.FC<{ + content: string | React.ReactNode; +}> = memo(({ content }) => { + if (content === LOADING_FLAT) return <BubblesLoading />; + if (typeof content !== 'string') return content; + return <Markdown>{content}</Markdown>; +}); diff --git a/src/components/ChatList/SkeletonList.tsx b/src/components/ChatList/SkeletonList.tsx new file mode 100644 index 00000000..5ce9c337 --- /dev/null +++ b/src/components/ChatList/SkeletonList.tsx @@ -0,0 +1,12 @@ +import { Flex, Skeleton } from 'antd'; +import { memo } from 'react'; + +const SkeletonList = memo(() => { + return ( + <Flex gap={24} vertical style={{ marginTop: 24 }}> + <Skeleton active avatar={{ size: 40 }} paragraph={{ width: ['50%', '30%'] }} title={false} /> + <Skeleton active avatar={{ size: 40 }} paragraph={{ width: ['50%', '30%'] }} title={false} /> + </Flex> + ); +}); +export default SkeletonList; diff --git a/src/ProChat/components/ChatList/index.tsx b/src/components/ChatList/index.tsx similarity index 50% rename from src/ProChat/components/ChatList/index.tsx rename to src/components/ChatList/index.tsx index 4662a831..0c0c5494 100644 --- a/src/ProChat/components/ChatList/index.tsx +++ b/src/components/ChatList/index.tsx @@ -6,35 +6,53 @@ import type { ChatMessage } from '@/types'; import { ConfigProvider } from 'antd'; import { cx } from 'antd-style'; -import ChatItem, { ChatListItemProps } from './ChatListItem'; +import { ChatItem } from '../ChatItem'; +import { ChatItemProps } from '../ChatItem/type'; +import { MessageComponent } from './Messages'; export type ChatListProps = { chatList: ChatMessage[]; loadingId?: string; loading: boolean; className?: string; - chatItemRenderConfig: ChatListItemProps['chatItemRenderConfig']; + chatItemRenderConfig: ChatItemProps['chatItemRenderConfig']; style?: React.CSSProperties; }; const ChatList: React.FC<ChatListProps> = (props) => { - const { chatItemRenderConfig, className, loading, loadingId, chatList } = props; + const { chatItemRenderConfig, className, loading, loadingId, chatList, style } = props; const { getPrefixCls } = useContext(ConfigProvider.ConfigContext); const prefixClass = getPrefixCls('pro-chat'); - if (!loading) return <SkeletonList />; + if (loading) + return ( + <div className={cx(`${prefixClass}-list`, className)} {...props}> + <SkeletonList /> + </div> + ); + return ( - <div className={cx(`${prefixClass}-list`, className)} {...props}> + <div className={cx(`${prefixClass}-list`, className)} style={style}> {chatList.map((item) => { return ( <ChatItem - loading={loadingId === item.id} key={item.id} - {...item} + data-id={item.id} + avatar={ + (item as any).meta || { + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg', + title: 'Ant Design', + } + } originData={item} + loading={loadingId === item.id} + placement={item.role === 'user' ? 'right' : 'left'} + time={item.updateAt || item.createAt} chatItemRenderConfig={chatItemRenderConfig} - /> + > + <MessageComponent {...item} /> + </ChatItem> ); })} </div> diff --git a/src/components/CopyButton/index.tsx b/src/components/CopyButton/index.tsx index dfb5b145..a6e48dd9 100644 --- a/src/components/CopyButton/index.tsx +++ b/src/components/CopyButton/index.tsx @@ -16,7 +16,7 @@ export type CopyButtonProps = { content: string; } & TooltipProps; -const CopyButton = memo<CopyButtonProps>( +export const CopyButton = memo<CopyButtonProps>( ({ content, className, placement = 'right', ...props }) => { const { copied, setCopied } = useCopied(); @@ -33,5 +33,3 @@ const CopyButton = memo<CopyButtonProps>( ); }, ); - -export default CopyButton; diff --git a/src/components/Form/components/FormDivider.tsx b/src/components/Form/components/FormDivider.tsx deleted file mode 100644 index 45e9a8dc..00000000 --- a/src/components/Form/components/FormDivider.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { Divider as AntDivider, DividerProps } from 'antd'; -import { memo } from 'react'; - -export type FormDividerProps = DividerProps; -const Divider = memo<FormDividerProps>(({ style, ...props }) => ( - <AntDivider style={{ margin: 0, opacity: 0.5, ...style }} {...props} /> -)); -export default Divider; diff --git a/src/components/Form/components/FormFooter.tsx b/src/components/Form/components/FormFooter.tsx deleted file mode 100644 index 7a247272..00000000 --- a/src/components/Form/components/FormFooter.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { memo } from 'react'; - -import { DivProps } from '@/types'; - -import { useStyles } from './style'; - -export type FormFooterProps = DivProps; - -const FormFooter = memo<FormFooterProps>(({ className, children, ...props }) => { - const { cx, styles } = useStyles(); - return ( - <div className={cx(styles.footer, className)} {...props}> - {children} - </div> - ); -}); - -export default FormFooter; diff --git a/src/components/Form/components/FormGroup.tsx b/src/components/Form/components/FormGroup.tsx deleted file mode 100644 index fd0d9e5d..00000000 --- a/src/components/Form/components/FormGroup.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { Collapse, Flex, type CollapseProps } from 'antd'; -import { useResponsive } from 'antd-style'; -import { type ReactNode } from 'react'; - -import { DownOutlined } from '@ant-design/icons'; -import { useStyles } from './style'; - -export interface FormGroupProps extends CollapseProps { - children: ReactNode; - extra?: ReactNode; - icon?: ReactNode; - title: string; -} - -const FormGroup: React.FC<FormGroupProps> = ({ - className, - icon, - title, - children, - extra, - ...props -}) => { - const { mobile } = useResponsive(); - const { cx, styles } = useStyles(); - - const titleContent = ( - <div className={styles.title}> - {icon} - {title} - </div> - ); - - if (mobile) - return ( - <Flex className={className}> - <Flex className={styles.mobileGroupHeader} vertical justify={'space-between'}> - {titleContent} - {extra} - </Flex> - <div className={styles.mobileGroupBody}>{children}</div> - </Flex> - ); - - return ( - <Collapse - className={cx(styles.group, className)} - defaultActiveKey={[1]} - expandIcon={({ isActive }) => ( - <DownOutlined - className={styles.icon} - style={isActive ? { fontSize: 16 } : { fontSize: 16, rotate: '-90deg' }} - /> - )} - items={[ - { - children, - extra, - key: 1, - label: titleContent, - }, - ]} - key={1} - {...props} - /> - ); -}; - -export default FormGroup; diff --git a/src/components/Form/components/FormItem.tsx b/src/components/Form/components/FormItem.tsx deleted file mode 100644 index b3691e75..00000000 --- a/src/components/Form/components/FormItem.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { FormItemProps as AntdFormItemProps, Form } from 'antd'; -import { memo } from 'react'; - -import FormDivider from './FormDivider'; -import FormTitle, { type FormTitleProps } from './FormTitle'; -import { useStyles } from './style'; - -const { Item } = Form; - -export interface FormItemProps extends AntdFormItemProps { - avatar?: FormTitleProps['avatar']; - desc?: FormTitleProps['desc']; - divider?: boolean; - hidden?: boolean; - minWidth?: string | number; - tag?: FormTitleProps['tag']; -} - -const FormItem = memo<FormItemProps>( - ({ desc, tag, minWidth, avatar, className, label, children, divider, ...props }) => { - const { cx, styles } = useStyles(minWidth); - return ( - <> - {divider && <FormDivider />} - <Item - className={cx(styles.item, !divider && styles.itemNoDivider, className)} - label={<FormTitle avatar={avatar} desc={desc} tag={tag} title={label as any} />} - {...props} - > - {children} - </Item> - </> - ); - }, -); - -export default FormItem; diff --git a/src/components/Form/components/FormTitle.tsx b/src/components/Form/components/FormTitle.tsx deleted file mode 100644 index d71aff28..00000000 --- a/src/components/Form/components/FormTitle.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { ReactNode, memo } from 'react'; - -import { DivProps } from '@/types'; - -import { Flex } from 'antd'; -import { useStyles } from './style'; - -export interface FormTitleProps extends DivProps { - avatar?: ReactNode; - desc?: ReactNode; - tag?: string; - title: string; -} - -const FormTitle = memo<FormTitleProps>(({ className, title, desc, avatar }) => { - const { cx, styles } = useStyles(); - const titleNode = ( - <div className={cx(styles.formTitle, className)}> - <Flex align={'center'} vertical gap={8}> - {title} - </Flex> - {desc && <small>{desc}</small>} - </div> - ); - - if (avatar) { - return ( - <Flex align={`center`} gap={8} vertical> - {avatar} - {titleNode} - </Flex> - ); - } - return titleNode; -}); - -export default FormTitle; diff --git a/src/components/Form/components/style.ts b/src/components/Form/components/style.ts deleted file mode 100644 index c3e2b971..00000000 --- a/src/components/Form/components/style.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { createStyles } from 'antd-style'; -import { isNumber } from 'lodash-es'; - -export const useStyles = createStyles( - ({ css, cx, token, isDarkMode, responsive, prefixCls }, itemMinWidth?: string | number) => ({ - footer: css` - display: flex; - gap: 8px; - justify-content: flex-end; - `, - formTitle: css` - position: relative; - - display: flex; - flex-direction: column; - gap: 6px; - - text-align: left; - - > div { - font-weight: 500; - line-height: 1; - } - - > small { - display: block; - - line-height: 1; - color: ${token.colorTextDescription}; - word-wrap: break-word; - white-space: pre-wrap; - } - - .${prefixCls}-tag { - font-family: ${token.fontFamilyCode}; - } - `, - group: cx( - isDarkMode && - css` - .${prefixCls}-collapse-content { - background: transparent; - } - - .${prefixCls}-collapse-header { - background: ${token.colorFillTertiary}; - } - `, - css` - .${prefixCls}-collapse-header { - align-items: center !important; - border-radius: 0 !important; - } - - .${prefixCls}-collapse-content-box { - padding-top: 0 !important; - padding-bottom: 0 !important; - } - - .${prefixCls}-form-item-label { - display: flex; - flex-direction: column; - justify-content: center; - } - `, - ), - icon: css` - transition: all 100ms ${token.motionEaseOut}; - `, - item: css` - padding: 16px 0; - - .${prefixCls}-row { - justify-content: space-between; - - > div { - flex: unset !important; - flex-grow: unset !important; - } - } - - .${prefixCls}-form-item-required::before { - align-self: flex-start; - } - - ${itemMinWidth && - css` - .${prefixCls}-form-item-control { - width: ${isNumber(itemMinWidth) ? `${itemMinWidth}px` : itemMinWidth}; - } - `} - - ${responsive.mobile} { - padding: 16px 0; - - ${itemMinWidth - ? css` - .${prefixCls}-row { - flex-direction: column; - gap: 4px; - } - - .${prefixCls}-form-item-control { - flex: 1; - width: 100%; - } - ` - : css` - .${prefixCls}-row { - flex-wrap: wrap; - gap: 4px; - } - `} - } - `, - itemNoDivider: css` - &:not(:first-child) { - padding-top: 0; - } - `, - mobileGroupBody: css` - padding: 0 16px; - background: ${token.colorBgContainer}; - `, - mobileGroupHeader: css` - padding: 16px; - background: ${token.colorBgLayout}; - `, - title: css` - display: flex; - gap: 8px; - align-items: center; - - font-size: 16px; - font-weight: 600; - - .anticon { - color: ${token.colorPrimary}; - } - - ${responsive.mobile} { - font-size: 14px; - font-weight: 400; - opacity: 0.5; - } - `, - }), -); diff --git a/src/components/Form/index.tsx b/src/components/Form/index.tsx deleted file mode 100644 index 59dd8f17..00000000 --- a/src/components/Form/index.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { Form as AntForm, FormProps as AntFormProps, type FormInstance } from 'antd'; -import { RefAttributes, forwardRef, type ReactNode } from 'react'; - -import FormFooter from './components/FormFooter'; -import FormGroup, { type FormGroupProps } from './components/FormGroup'; -import FormItem, { type FormItemProps } from './components/FormItem'; -import { useStyles } from './style'; - -export interface ItemGroup { - children: FormItemProps[]; - extra?: FormGroupProps['extra']; - icon?: FormGroupProps['icon']; - title: FormGroupProps['title']; -} - -export interface FormProps extends AntFormProps { - children?: ReactNode; - footer?: ReactNode; - itemMinWidth?: FormItemProps['minWidth']; - items?: ItemGroup[]; -} - -const FormParent = forwardRef<FormInstance, FormProps>( - ({ className, itemMinWidth, footer, form, items, children, ...props }, ref) => { - const { cx, styles } = useStyles(); - return ( - <AntForm - className={cx(styles.form, className)} - colon={false} - form={form} - layout="horizontal" - ref={ref} - {...props} - > - {items?.map((group, groupIndex) => ( - <FormGroup extra={group?.extra} icon={group?.icon} key={groupIndex} title={group.title}> - {group.children - .filter((item) => !item.hidden) - .map((item, itemIndex) => { - return ( - <FormItem - divider={itemIndex !== 0} - key={itemIndex} - minWidth={itemMinWidth} - {...item} - /> - ); - })} - </FormGroup> - ))} - {children} - {footer && <FormFooter>{footer}</FormFooter>} - </AntForm> - ); - }, -); - -export interface IForm { - (props: FormProps & RefAttributes<FormInstance>): ReactNode; - Group: typeof FormGroup; - Item: typeof FormItem; -} - -const Form = FormParent as unknown as IForm; - -Form.Item = FormItem; -Form.Group = FormGroup; - -export default Form; diff --git a/src/components/Form/style.ts b/src/components/Form/style.ts deleted file mode 100644 index 3f1dd0ed..00000000 --- a/src/components/Form/style.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { createStyles } from 'antd-style'; - -export const useStyles = createStyles(({ css, token, prefixCls, responsive }) => ({ - footer: css` - display: flex; - gap: 8px; - justify-content: flex-end; - `, - form: css` - display: flex; - flex-direction: column; - gap: 16px; - - ${responsive.mobile} { - gap: 0; - } - - .${prefixCls}-form-item { - margin: 0 !important; - } - - .${prefixCls}-form-item .${prefixCls}-form-item-label > label { - height: unset; - } - - .${prefixCls}-row { - position: relative; - flex-wrap: nowrap; - } - - .${prefixCls}-form-item-label { - position: relative; - flex: 1; - max-width: 100%; - } - - .${prefixCls}-form-item-control { - position: relative; - flex: 0; - min-width: unset !important; - } - - .${prefixCls}-collapse-item { - overflow: hidden !important; - border-radius: ${token.borderRadius}px !important; - } - `, -})); diff --git a/src/components/Input/index.tsx b/src/components/Input/index.tsx deleted file mode 100644 index e7218e06..00000000 --- a/src/components/Input/index.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { Input as AntInput, type InputProps as AntdInputProps, type InputRef } from 'antd'; -import { TextAreaProps as AntdTextAreaProps, type TextAreaRef } from 'antd/es/input/TextArea'; -import { forwardRef } from 'react'; - -import { useStyles } from './style'; - -export interface InputProps extends AntdInputProps { - /** - * @description Type of the input - * @default 'ghost' - */ - type?: 'ghost' | 'block' | 'pure'; -} - -export const Input = forwardRef<InputRef, InputProps>( - ({ className, type = 'ghost', ...props }, reference) => { - const { styles, cx } = useStyles({ type }); - - return ( - <AntInput - variant={type !== 'pure' ? 'outlined' : 'borderless'} - className={cx(styles.input, className)} - ref={reference} - {...props} - /> - ); - }, -); - -export interface TextAreaProps extends AntdTextAreaProps { - /** - * @description Whether to enable resizing of the textarea - * @default true - */ - resize?: boolean; - /** - * @description Type of the textarea - * @default 'ghost' - */ - type?: 'ghost' | 'block' | 'pure'; -} - -export const TextArea = forwardRef<TextAreaRef, TextAreaProps>( - ({ className, type = 'ghost', resize = true, style, ...props }, reference) => { - const { styles, cx } = useStyles({ type }); - - return ( - <AntInput.TextArea - bordered={type !== 'pure'} - className={cx(styles.textarea, className)} - ref={reference} - style={resize ? style : { resize: 'none', ...style }} - {...props} - /> - ); - }, -); diff --git a/src/components/Input/style.ts b/src/components/Input/style.ts deleted file mode 100644 index 3dde9af0..00000000 --- a/src/components/Input/style.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { createStyles } from 'antd-style'; - -export const useStyles = createStyles( - ({ cx, css, token, prefixCls }, { type }: { type: 'ghost' | 'block' | 'pure' }) => { - const typeStylish = css` - background-color: ${type === 'block' ? token.colorFillTertiary : 'transparent'}; - border: 1px solid ${type === 'block' ? 'transparent' : token.colorBorder}; - transition: - background-color 100ms ${token.motionEaseOut}, - border-color 200ms ${token.motionEaseOut}; - - &:hover { - background-color: ${token.colorFillTertiary}; - } - - &:focus { - border-color: ${token.colorTextQuaternary}; - } - - &.${prefixCls}-input-affix-wrapper-focused { - border-color: ${token.colorTextQuaternary}; - } - `; - - return { - input: cx( - type !== 'pure' && typeStylish, - css` - position: relative; - max-width: 100%; - height: ${type === 'pure' ? 'unset' : '36px'}; - padding: ${type === 'pure' ? '0' : '0 12px'}; - - input { - background: transparent; - } - `, - ), - textarea: cx( - type !== 'pure' && typeStylish, - css` - position: relative; - max-width: 100%; - padding: ${type === 'pure' ? '0' : '8px 12px'}; - border-radius: ${type === 'pure' ? '0' : `${token.borderRadius}px`}; - - textarea { - background: transparent; - } - `, - ), - }; - }, -); diff --git a/src/components/ChatItem/components/Loading.tsx b/src/components/Loading.tsx similarity index 56% rename from src/components/ChatItem/components/Loading.tsx rename to src/components/Loading.tsx index d4399446..40c7e232 100644 --- a/src/components/ChatItem/components/Loading.tsx +++ b/src/components/Loading.tsx @@ -1,20 +1,17 @@ import { LoadingOutlined } from '@ant-design/icons'; import { Flex } from 'antd'; -import { useStyles } from '../style'; -import { ChatItemProps } from '../type'; +import { ChatItemProps } from './ChatItem/type'; export interface LoadingProps { loading?: ChatItemProps['loading']; placement?: ChatItemProps['placement']; } -const Loading: React.FC<LoadingProps> = ({ loading, placement }) => { - const { styles } = useStyles({ placement }); - +const Loading: React.FC<LoadingProps> = ({ loading }) => { if (!loading) return null; return ( - <Flex align={'center'} className={styles.loading} justify={'center'}> + <Flex align={'center'} justify={'center'}> <LoadingOutlined style={{ fontSize: 12, strokeWidth: 3 }} /> </Flex> ); diff --git a/src/components/ChatItem/components/MessageContent.tsx b/src/components/MessageContent.tsx similarity index 56% rename from src/components/ChatItem/components/MessageContent.tsx rename to src/components/MessageContent.tsx index 65026fa5..fd6642d5 100644 --- a/src/components/ChatItem/components/MessageContent.tsx +++ b/src/components/MessageContent.tsx @@ -2,9 +2,9 @@ import { memo, useContext, type ReactNode } from 'react'; import { ConfigProvider, Flex } from 'antd'; -import { MarkdownProps } from '@ant-design/pro-editor'; -import { useStyles } from '../style'; -import { ChatItemProps } from '../type'; +import { getStatusClassNames } from 'antd/es/_util/statusUtils'; +import cx from 'classnames'; +import { ChatItemProps } from './ChatItem/type'; export interface MessageContentProps { children?: ReactNode; @@ -12,26 +12,21 @@ export interface MessageContentProps { onChange?: ChatItemProps['onChange']; onDoubleClick?: ChatItemProps['onDoubleClick']; placement?: ChatItemProps['placement']; - primary?: ChatItemProps['primary']; className?: string; - markdownProps?: MarkdownProps; } const MessageContent = memo<MessageContentProps>( - ({ className, children, placement, messageExtra, primary, onDoubleClick }) => { - const { cx, styles } = useStyles({ placement, primary }); - + ({ className, children, placement, messageExtra, onDoubleClick }) => { const { getPrefixCls } = useContext(ConfigProvider.ConfigContext); const prefixClass = getPrefixCls('pro-chat'); return ( - <Flex - className={cx(styles.message, className, styles.editingContainer)} - onDoubleClick={onDoubleClick} - > + <Flex className={cx(className, getStatusClassNames)} onDoubleClick={onDoubleClick}> {children} {messageExtra ? ( - <div className={`${cx(styles.messageExtra, `${prefixClass}-message-extra`)}`}> + <div + className={`${cx(`${prefixClass}-message-extra ${prefixClass}-message-extra-${placement}`)}`} + > {messageExtra} </div> ) : null} diff --git a/src/ProChat/ProChat.tsx b/src/components/ProChat/ProChat.tsx similarity index 79% rename from src/ProChat/ProChat.tsx rename to src/components/ProChat/ProChat.tsx index cf61974c..46573710 100644 --- a/src/ProChat/ProChat.tsx +++ b/src/components/ProChat/ProChat.tsx @@ -1,20 +1,21 @@ import { CSSProperties, MutableRefObject, ReactNode, useMemo } from 'react'; import RcResizeObserver from 'rc-resize-observer'; -import { useContext, useEffect, useRef, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; -import { AutoCompleteProps, BackTop, BackTopProps, ConfigProvider, Flex, FlexProps } from 'antd'; -import ChatList, { ChatListProps } from './components/ChatList'; -import ChatInputArea, { ChatInputAreaProps } from './components/InputArea'; -import { useStyles } from './style'; +import { AutoCompleteProps, BackTop, BackTopProps, Flex, FlexProps } from 'antd'; +import cx from 'classnames'; +import ChatList, { ChatListProps } from '../ChatList'; +import ChatInputArea, { ChatInputAreaProps } from '../ProChatInputArea'; -import { Locale, gLocaleObject } from '@/locale'; +import { DEFAULT_AVATAR, DEFAULT_USER_AVATAR } from '@/const/meta'; +import { ProChatLocale, gLocaleObject } from '@/locale'; +import { ChatMessage } from '@/types'; import { TextAreaProps } from 'antd/es/input'; -import { ChatMessage } from '.'; -import { DEFAULT_AVATAR, DEFAULT_USER_AVATAR } from './const/meta'; -import { ProChatInstance } from './hooks/useProChat'; -import { ModelConfig } from './types/config'; -import { MetaData } from './types/meta'; +import { useChatList } from '../../hooks/useChatList'; +import { ProChatInstance } from '../../hooks/useProChat'; +import { ModelConfig } from '../../types/config'; +import { MetaData } from '../../types/meta'; export type ChatRequest = ( messages: ChatMessage[], @@ -79,7 +80,7 @@ export interface ProChatState<T extends Record<string, any> = Record<string, any /** * 国际化 */ - locale?: Locale; + locale?: ProChatLocale; /** * 输入框的 props,优先级最高 @@ -138,8 +139,10 @@ export interface ChatProps<T extends Record<string, any> = Record<string, any>> // init loading?: boolean; initialChatsList?: ProChatState<T>['chatList']; - userMeta?: MetaData; - assistantMeta?: MetaData; + meta?: { + userMeta?: MetaData; + assistantMeta?: MetaData; + }; /** * @description 聊天项的渲染函数 */ @@ -199,24 +202,26 @@ export interface ProChatProps<T extends Record<string, any>> extends ChatProps<T * 对话组件的属性接口 */ -export function ProChat<T extends Record<string, any> = Record<string, any>>({ - style, - className, - chatItemRenderConfig, - backToBottomConfig, - inputRender, - inputAreaRender, - chatRef, - chatList, - loading, - sendButtonRender, -}: ProChatProps<T>) { +export function ProChat<T extends Record<string, any> = Record<string, any>>( + props: ProChatProps<T>, +) { + const { + style, + className, + chatItemRenderConfig, + backToBottomConfig, + inputRender, + inputAreaRender, + inputAreaProps, + chatRef, + meta, + sendButtonRender, + placeholder, + } = props; const ref = useRef<HTMLDivElement>(null); const areaHtml = useRef<HTMLDivElement>(null); - const { styles, cx } = useStyles(); const [isRender, setIsRender] = useState(false); const [height, setHeight] = useState('100%' as string | number); - const { getPrefixCls } = useContext(ConfigProvider.ConfigContext); useEffect(() => { // 保证 ref 永远存在 @@ -232,7 +237,13 @@ export function ProChat<T extends Record<string, any> = Record<string, any>>({ } }, []); - const prefixClass = getPrefixCls('pro-chat'); + const { chatList, loading, stopGenerateMessage, clearMessage, sendMessage } = useChatList({ + chatList: props.chatList, + loading: props.loading, + initialChatList: props.initialChatsList, + helloMessage: props.helloMessage, + meta, + }); const backBottomDom = useMemo(() => { if (!isRender) return null; @@ -258,12 +269,13 @@ export function ProChat<T extends Record<string, any> = Record<string, any>>({ }} > <Flex - className={cx(styles.container, className, `${prefixClass}-container`)} + className={cx(className)} style={{ maxHeight: '100vh', height: '100%', ...style, }} + vertical ref={ref} > <ChatList @@ -276,10 +288,15 @@ export function ProChat<T extends Record<string, any> = Record<string, any>>({ /> {backBottomDom} <ChatInputArea + placeholder={placeholder || '请输入消息...'} + onMessageSend={sendMessage} + stopGenerateMessage={stopGenerateMessage} + clearMessage={clearMessage} areaRef={areaHtml} sendButtonRender={sendButtonRender} inputAreaRender={inputAreaRender} inputRender={inputRender} + inputAreaProps={inputAreaProps} /> </Flex> </RcResizeObserver> diff --git a/src/ProChat/demos/actions.tsx b/src/components/ProChat/demos/actions.tsx similarity index 88% rename from src/ProChat/demos/actions.tsx rename to src/components/ProChat/demos/actions.tsx index 2d620328..5b23255c 100644 --- a/src/ProChat/demos/actions.tsx +++ b/src/components/ProChat/demos/actions.tsx @@ -26,11 +26,6 @@ export default () => { ...defaultDoms, ]; }, - flexConfig: { - gap: 24, - direction: 'horizontal', - justify: 'space-between', - }, }} request={async (messages) => { const mockedData: string = `这是一段模拟的流式字符串数据。本次会话传入了${messages.length}条消息`; diff --git a/src/ProChat/demos/bigData.tsx b/src/components/ProChat/demos/bigData.tsx similarity index 100% rename from src/ProChat/demos/bigData.tsx rename to src/components/ProChat/demos/bigData.tsx diff --git a/src/ProChat/demos/control.tsx b/src/components/ProChat/demos/control.tsx similarity index 100% rename from src/ProChat/demos/control.tsx rename to src/components/ProChat/demos/control.tsx diff --git a/src/ProChat/demos/default.tsx b/src/components/ProChat/demos/default.tsx similarity index 100% rename from src/ProChat/demos/default.tsx rename to src/components/ProChat/demos/default.tsx diff --git a/src/ProChat/demos/doc-mode.tsx b/src/components/ProChat/demos/doc-mode.tsx similarity index 100% rename from src/ProChat/demos/doc-mode.tsx rename to src/components/ProChat/demos/doc-mode.tsx diff --git a/src/ProChat/demos/draggable.tsx b/src/components/ProChat/demos/draggable.tsx similarity index 100% rename from src/ProChat/demos/draggable.tsx rename to src/components/ProChat/demos/draggable.tsx diff --git a/src/ProChat/demos/helloMessage.tsx b/src/components/ProChat/demos/helloMessage.tsx similarity index 100% rename from src/ProChat/demos/helloMessage.tsx rename to src/components/ProChat/demos/helloMessage.tsx diff --git a/src/ProChat/demos/initialChats.tsx b/src/components/ProChat/demos/initialChats.tsx similarity index 100% rename from src/ProChat/demos/initialChats.tsx rename to src/components/ProChat/demos/initialChats.tsx diff --git a/src/ProChat/demos/loading.tsx b/src/components/ProChat/demos/loading.tsx similarity index 100% rename from src/ProChat/demos/loading.tsx rename to src/components/ProChat/demos/loading.tsx diff --git a/src/ProChat/demos/meta.tsx b/src/components/ProChat/demos/meta.tsx similarity index 100% rename from src/ProChat/demos/meta.tsx rename to src/components/ProChat/demos/meta.tsx diff --git a/src/ProChat/mocks/basic.ts b/src/components/ProChat/demos/mocks/basic.ts similarity index 100% rename from src/ProChat/mocks/basic.ts rename to src/components/ProChat/demos/mocks/basic.ts diff --git a/src/ProChat/mocks/fullFeature.ts b/src/components/ProChat/demos/mocks/fullFeature.ts similarity index 100% rename from src/ProChat/mocks/fullFeature.ts rename to src/components/ProChat/demos/mocks/fullFeature.ts diff --git a/src/ProChat/mocks/sseResponse.ts b/src/components/ProChat/demos/mocks/sseResponse.ts similarity index 100% rename from src/ProChat/mocks/sseResponse.ts rename to src/components/ProChat/demos/mocks/sseResponse.ts diff --git a/src/ProChat/mocks/streamResponse.ts b/src/components/ProChat/demos/mocks/streamResponse.ts similarity index 100% rename from src/ProChat/mocks/streamResponse.ts rename to src/components/ProChat/demos/mocks/streamResponse.ts diff --git a/src/ProChat/mocks/threebody.ts b/src/components/ProChat/demos/mocks/threebody.ts similarity index 100% rename from src/ProChat/mocks/threebody.ts rename to src/components/ProChat/demos/mocks/threebody.ts diff --git a/src/ProChat/demos/modal.tsx b/src/components/ProChat/demos/modal.tsx similarity index 100% rename from src/ProChat/demos/modal.tsx rename to src/components/ProChat/demos/modal.tsx diff --git a/src/ProChat/demos/no-stream.tsx b/src/components/ProChat/demos/no-stream.tsx similarity index 100% rename from src/ProChat/demos/no-stream.tsx rename to src/components/ProChat/demos/no-stream.tsx diff --git a/src/ProChat/demos/renderInputArea.tsx b/src/components/ProChat/demos/renderInputArea.tsx similarity index 100% rename from src/ProChat/demos/renderInputArea.tsx rename to src/components/ProChat/demos/renderInputArea.tsx diff --git a/src/ProChat/demos/request.tsx b/src/components/ProChat/demos/request.tsx similarity index 100% rename from src/ProChat/demos/request.tsx rename to src/components/ProChat/demos/request.tsx diff --git a/src/ProChat/demos/sse.tsx b/src/components/ProChat/demos/sse.tsx similarity index 100% rename from src/ProChat/demos/sse.tsx rename to src/components/ProChat/demos/sse.tsx diff --git a/src/ProChat/demos/toBottomConfig.tsx b/src/components/ProChat/demos/toBottomConfig.tsx similarity index 100% rename from src/ProChat/demos/toBottomConfig.tsx rename to src/components/ProChat/demos/toBottomConfig.tsx diff --git a/src/ProChat/demos/use-ref.tsx b/src/components/ProChat/demos/use-ref.tsx similarity index 100% rename from src/ProChat/demos/use-ref.tsx rename to src/components/ProChat/demos/use-ref.tsx diff --git a/src/ProChat/index.en-US.md b/src/components/ProChat/index.en-US.md similarity index 59% rename from src/ProChat/index.en-US.md rename to src/components/ProChat/index.en-US.md index ea6a9e05..83405dd7 100644 --- a/src/ProChat/index.en-US.md +++ b/src/components/ProChat/index.en-US.md @@ -12,100 +12,6 @@ By returning a streaming response request, achieve the typewriter output effect <code src="./demos/request.tsx">Streaming requests</code> -<code src="./demos/default.tsx"></code> - -## SSE Data stream processing - -For cases where the backend directly returns Server Side Event data, the frontend needs to encapsulate ` ReadableStream` themselves - -Generally speaking, a third-party solution can be directly adopted, such as parsing Vercel's AI library. For details, please refer to [Document - What is Streaming Output](../guide/sse) - -<code src="./demos/sse.tsx"></code> - -## Big data rendering - -<code src="./demos/bigData.tsx">Stream requests</code> - -## Non streaming mode - -In non streaming mode, all session messages will be returned at once, which is suitable for scenarios with low message volume. If the message volume is large, the user experience may be poor. - -<code src="./demos/no-stream.tsx" description='The message will return after waiting for 5 seconds'>Non streams requests</code> - -## Controlled mode - -Implement controlled chat session messages using `chatList` and `onChatsChange` - -<code src="./demos/control.tsx"></code> - -## Set initial session messages - -Use `initialChatsList` to set the initial session message. - -<code src="./demos/initialChatsList.tsx"></code> - -## Set greeting messages - -Set greeting messages through `helloMessage`. - -<code src="./demos/helloMessage.tsx"></code> - -## Loading - -Use the loading field to control the loading status. Suitable for use when loading data for the first time. - -<code src="./demos/loading.tsx">Set loading to add data acquisition status</code> - -## Document Mode - -OpenAI like document mode, using the `doc` field to control document mode. Suitable for scenarios where documents need to be displayed. - -<code src="./demos/doc-mode.tsx"></code> - -## Specify the avatars and names of both parties in the conversation - -ProChat uses `meta` to represent the avatars, names, and other information of both parties in the conversation. Set the assistant's avatar and name to use `assistantMeta` , and set the user's avatar and name to use `userMeta`. <code src="./demos/meta.tsx"></code> - -## Custom Actions - -<code src="./demos/actions.tsx"></code> - -## Customize the [Back to Bottom] button - -You can customize the [Back to Bottom] button to varying degrees through the backToBottomConfiguration parameter - -<code src="./demos/toBottomConfig.tsx"></code> - -## Custom input area - -Sometimes you may feel that the default input area is not user-friendly enough, or if you have some custom input module requirements, you can use inputAreaRender for custom input. If you do not need an input area, you can pass in `inputAreaRender={()=>null}`。 - -Here is a demonstration case that supports image uploading. Try uploading files and submitting them. - -<code src="./demos/inputAreaRender.tsx"></code> - -## Suspended window usage - -Using the `ProChat` component as a session solution - -<code src="./demos/draggable.tsx"></code> - -## Programming operation control - -### chatRef - -In some simple scenarios, using `chatRef` can obtain `ProChatInstance` to control ProChat behavior at the same level as the component. - -<code src="./demos/use-ref.tsx"></code> - -### useProChat - -For some complex scenarios, `ProChatProvider` and `useProChat` hooks can be used to achieve programmatic message sending, retrieval, deletion, and other behaviors. - -<code src="./demos/use-pro-chat.tsx"></code> - -:::warning - UseProChat hooks must be used in the `ProChatProvider` before they can be used. ::: diff --git a/src/ProChat/index.md b/src/components/ProChat/index.md similarity index 61% rename from src/ProChat/index.md rename to src/components/ProChat/index.md index 4d4ff5f7..524c70c2 100644 --- a/src/ProChat/index.md +++ b/src/components/ProChat/index.md @@ -12,102 +12,6 @@ description: a Chat Solution <code src="./demos/request.tsx"></code> -<code src="./demos/default.tsx"></code> - -## SSE 数据流处理 - -对于后台直接返回 Server Side Event 数据的情况需要前端自己封装 `ReadableStream` - -一般来说直接采用三方方案,例如 Vercel 的 AI 库进行解析即可,详情见 [文档 - 什么是流式输出](../guide/sse) - -<code src="./demos/sse.tsx"></code> - -## 大数据渲染 - -<code src="./demos/bigData.tsx"></code> - -## 非流式模式 - -非流式模式下,会话消息会一次性全部返回,适用于消息量较少的场景。如果消息量较大,可能用户体验较差。 - -<code src="./demos/no-stream.tsx"></code> - -## 受控模式 - -使用 `chatList` 和 `onChatsChange` 实现 chatList 会话消息的受控 - -<code src="./demos/control.tsx"></code> - -## 设定初始会话消息 - -使用 `initialChatsList` 设定初始会话消息。 - -<code src="./demos/initialChatsList.tsx"></code> - -## 设定打招呼消息 - -通过 `helloMessage` 设定打招呼消息。 - -<code src="./demos/helloMessage.tsx"></code> - -## 加载中 - -使用 loading 字段控制加载中状态。适用于第一次加载数据时使用。 - -<code src="./demos/loading.tsx"></code> - -## 文档模式 - -类 OpenAI 的文档模式,使用 `doc` 字段控制文档模式。适用于需要展示文档的场景。 - -<code src="./demos/doc-mode.tsx"></code> - -## 指定会话双方的头像、名称 - -ProChat 使用 `meta` 来表意会话双方的头像、名称等信息。设定助手的头像、名称使用 `assistantMeta`,设定用户的头像、名称使用 `userMeta`。 - -<code src="./demos/meta.tsx"></code> - -## 自定义 Actions - -<code src="./demos/actions.tsx"></code> - -## 自定义「回到底部」按钮 - -你可以通过 backToBottomConfig 参数对「回到底部」按钮进行不同程度的自定义 - -<code src="./demos/toBottomConfig.tsx"></code> - -## 自定义输入区域 - -有些时候会觉得默认的输入区域不够好用,或是你有一些输入模块的自定义需求,可以使用 inputAreaRender 来进行自定义输入,如果不需要输入区域可以传入 `inputAreaRender={()=>null}`。 - -下面是一个支持图片上传的示范案例,试试上传文件并提交看看吧。 - -<code src="./demos/inputAreaRender.tsx"></code> - -## 悬浮窗使用 - -将 `ProChat` 组件作为会话解决方案 - -<code src="./demos/draggable.tsx"></code> - -## 编程式操作控制 - -### chatRef - -在一些简单场景下,使用 `chatRef` 可以获取 `ProChatInstance` ,以在组件同级控制 ProChat 行为。 - -<code src="./demos/use-ref.tsx"></code> - -::: - -:::warning - -所有 `initialChatsList` 等初始化 props 需要从 `ProChat` 移动至 `ProChatProvider` - -::: - ## APIs | 参数 | 说明 | 类型 | 默认值 | diff --git a/src/components/ProChat/index.tsx b/src/components/ProChat/index.tsx new file mode 100644 index 00000000..16bc0687 --- /dev/null +++ b/src/components/ProChat/index.tsx @@ -0,0 +1,2 @@ +export { useProChat, type ProChatInstance } from '../../hooks/useProChat'; +export { ProChat } from './ProChat'; diff --git a/src/components/Avatar/index.tsx b/src/components/ProChatAvatar/index.tsx similarity index 87% rename from src/components/Avatar/index.tsx rename to src/components/ProChatAvatar/index.tsx index a143aae8..2de6f0b3 100644 --- a/src/components/Avatar/index.tsx +++ b/src/components/ProChatAvatar/index.tsx @@ -1,7 +1,7 @@ import { Avatar, type AvatarProps } from 'antd'; import { memo } from 'react'; -import { useStyles } from './style'; +import cx from 'classnames'; export interface ProChatAvatarProps extends AvatarProps { /** @@ -26,6 +26,8 @@ export interface ProChatAvatarProps extends AvatarProps { * @description The title text to display if avatar is not provided */ title?: string; + + loading?: boolean; } /** @@ -46,28 +48,16 @@ export interface ProChatAvatarProps extends AvatarProps { * */ const ProChatAvatar = memo<ProChatAvatarProps>( - ({ - className, - avatar, - title, - size = 40, - shape = 'circle', - background = 'rgba(0,0,0,0)', - onClick, - style, - ...props - }) => { + ({ className, avatar, title, size = 40, shape = 'circle', onClick, style, ...props }) => { const isImage = Boolean( avatar && ['/', 'http', 'data:'].some((index) => avatar.startsWith(index)), ); const isBase64 = Boolean(avatar?.startsWith('data')); - const { styles, cx } = useStyles({ background, size }); - const text = String(isImage ? title : avatar); const avatarProps = { - className: cx(styles.avatar, className), + className: cx(className), shape: shape, size, style: onClick ? style : { cursor: 'default', ...style }, diff --git a/src/components/ProChatInputArea/ActionBar.tsx b/src/components/ProChatInputArea/ActionBar.tsx new file mode 100644 index 00000000..af6c9596 --- /dev/null +++ b/src/components/ProChatInputArea/ActionBar.tsx @@ -0,0 +1,53 @@ +import { ProChatLocale, gLocaleObject } from '@/locale'; +import { DeleteFilled } from '@ant-design/icons'; +import { Flex, Popconfirm } from 'antd'; +import cx from 'classnames'; + +export const ActionBar = ({ + className, + clearMessage, + actionsRender, + locale, + style, +}: { + className?: string; + clearMessage: () => void; + locale: ProChatLocale; + style?: React.CSSProperties; + actionsRender: (defaultDoms: React.ReactNode[]) => React.ReactNode; +}) => { + const defaultDoms = [ + <Popconfirm + title={gLocaleObject(locale).clearModalTitle} + okButtonProps={{ danger: true }} + okText={gLocaleObject(locale).clearDialogue} + key={'clear'} + onConfirm={() => { + clearMessage(); + }} + > + <DeleteFilled + title={gLocaleObject(locale).clearCurrentDialogue} + style={{ + cursor: 'pointer', + }} + /> + </Popconfirm>, + ]; + + return ( + <Flex + align={'center'} + style={{ + flexDirection: 'row-reverse', + ...style, + }} + className={cx(className)} + gap={8} + > + {actionsRender?.(defaultDoms) ?? defaultDoms} + </Flex> + ); +}; + +export default ActionBar; diff --git a/src/components/ProChatInputArea/AutoCompleteTextArea.tsx b/src/components/ProChatInputArea/AutoCompleteTextArea.tsx new file mode 100644 index 00000000..75b977f0 --- /dev/null +++ b/src/components/ProChatInputArea/AutoCompleteTextArea.tsx @@ -0,0 +1,61 @@ +import { Input, MentionProps, Mentions } from 'antd'; +import { TextAreaProps } from 'antd/es/input'; +import { useState } from 'react'; + +type MentionsTextAreaProps = TextAreaProps & { + mentionProps?: MentionProps; + mentionRequest?: (value: string) => Promise<{ value: string; label?: string }[]>; +}; + +export const MentionsTextArea: React.FC<MentionsTextAreaProps> = (props) => { + const { disabled, mentionProps = {}, mentionRequest, ...rest } = props; + + const [options, setOptions] = useState<{ value: string; label: string }[]>([]); + const baseStyle = { + backgroundColor: 'transparent', + flex: 1, + outline: 'none', + boxShadow: 'none', + padding: '0 12px', + margin: 0, + border: 'none', + ...rest.style, + }; + return ( + <> + <Mentions + className={props.className} + options={options} + disabled={disabled} + onSelect={(value) => { + props.onChange?.({ target: { value } } as any); + setOptions([]); + }} + prefix="/" + autoSize + style={baseStyle} + onSearch={async (value) => { + const result = await mentionRequest?.(value); + setOptions((result as any[]) || []); + }} + {...mentionProps} + > + <Input.TextArea + size="large" + rows={3} + {...rest} + style={baseStyle} + disabled={disabled} + className={`${props.className}-textarea`} + onFocus={(e) => { + props.onFocus?.(e); + }} + onPressEnter={(e) => { + if (open && options.length > 0) return; + props.onPressEnter?.(e); + }} + /> + </Mentions> + </> + ); +}; diff --git a/src/ProChat/components/InputArea/StopLoading.tsx b/src/components/ProChatInputArea/StopLoading.tsx similarity index 100% rename from src/ProChat/components/InputArea/StopLoading.tsx rename to src/components/ProChatInputArea/StopLoading.tsx diff --git a/src/ProChat/components/InputArea/index.tsx b/src/components/ProChatInputArea/index.tsx similarity index 69% rename from src/ProChat/components/InputArea/index.tsx rename to src/components/ProChatInputArea/index.tsx index c5800a23..c3cc39a1 100644 --- a/src/ProChat/components/InputArea/index.tsx +++ b/src/components/ProChatInputArea/index.tsx @@ -1,54 +1,13 @@ +import { ProChatLocale } from '@/locale'; import { SendOutlined } from '@ant-design/icons'; -import { Button, ButtonProps, ConfigProvider, Flex } from 'antd'; -import { createStyles, cx } from 'antd-style'; +import { Button, ButtonProps, ConfigProvider, Divider, Flex } from 'antd'; import { TextAreaProps } from 'antd/es/input'; +import cx from 'classnames'; import { ReactNode, useContext, useMemo, useRef, useState } from 'react'; import ActionBar from './ActionBar'; -import { AutoCompleteTextArea } from './AutoCompleteTextArea'; +import { MentionsTextArea } from './AutoCompleteTextArea'; import StopLoadingIcon from './StopLoading'; -const useStyles = createStyles(({ css, responsive, token }) => ({ - container: css` - position: sticky; - z-index: ${token.zIndexPopupBase}; - bottom: 0; - - padding-top: 12px; - padding-bottom: 24px; - - background-image: linear-gradient(to top, ${token.colorBgLayout} 88%, transparent 100%); - - ${responsive.mobile} { - width: 100%; - } - `, - boxShadow: css` - position: relative; - border-radius: 8px; - box-shadow: ${token.boxShadowSecondary}; - `, - input: css` - width: 100%; - border: none; - outline: none; - border-radius: 8px; - `, - btn: css` - position: absolute; - z-index: 10; - right: 8px; - bottom: 6px; - - color: ${token.colorTextTertiary}; - &:hover { - color: ${token.colorTextSecondary}; - } - `, - extra: css` - color: ${token.colorTextTertiary}; - `, -})); - export type ChatInputAreaProps = { areaRef?: React.RefObject<HTMLDivElement>; className?: string; @@ -64,9 +23,15 @@ export type ChatInputAreaProps = { onMessageSend: (message: string) => void | Promise<any>, onClearAllHistory: () => void, ) => ReactNode; - placeholder?: string; loading?: boolean; + inputAreaProps: TextAreaProps; + clearMessage: () => void; + stopGenerateMessage: () => void; + onMessageSend: (message: string) => void | Promise<any>; + actionsRender?: (defaultDoms: React.ReactNode[]) => ReactNode; + actionStyle?: React.CSSProperties; + locale?: ProChatLocale; }; export const ChatInputArea = (props: ChatInputAreaProps) => { @@ -82,23 +47,25 @@ export const ChatInputArea = (props: ChatInputAreaProps) => { inputAreaProps, clearMessage, stopGenerateMessage, - sendMessage, + onMessageSend, + actionStyle, + locale, + actionsRender, } = props || {}; const { getPrefixCls } = useContext(ConfigProvider.ConfigContext); const [message, setMessage] = useState(''); const isChineseInput = useRef(false); - const { styles, theme } = useStyles(); const send = async () => { if (onSend) { const success = await onSend(message); if (success) { - sendMessage(message); + onMessageSend(message); setMessage(''); } } else { - sendMessage(message); + onMessageSend(message); setMessage(''); } }; @@ -120,11 +87,10 @@ export const ChatInputArea = (props: ChatInputAreaProps) => { * @property {function} onCompositionEnd - 输入法结束输入时的回调函数 * @property {function} onPressEnter - 按下回车键时的回调函数 */ - const defaultAutoCompleteTextAreaProps = { placeholder: placeholder, ...inputAreaProps, - className: cx(styles.input, inputAreaProps?.className, `${prefixClass}-component`), + className: cx(inputAreaProps?.className, `${prefixClass}-component`), value: message, onChange: (e) => { setMessage(e.target.value); @@ -144,7 +110,7 @@ export const ChatInputArea = (props: ChatInputAreaProps) => { }, }; - const defaultInput = <AutoCompleteTextArea {...defaultAutoCompleteTextAreaProps} />; + const defaultInput = <MentionsTextArea {...defaultAutoCompleteTextAreaProps} />; /** * 支持下自定义输入框 @@ -153,7 +119,7 @@ export const ChatInputArea = (props: ChatInputAreaProps) => { ? inputRender?.( defaultInput, (message) => { - sendMessage(message); + onMessageSend(message); }, defaultAutoCompleteTextAreaProps, ) @@ -170,20 +136,24 @@ export const ChatInputArea = (props: ChatInputAreaProps) => { const defaultButtonProps = useMemo(() => { return loading ? ({ - type: 'text', - className: styles.btn, onClick: () => stopGenerateMessage(), icon: <StopLoadingIcon />, + style: { + margin: '0 12px', + marginBottom: 8, + }, } as const) : ({ - type: 'text', - className: styles.btn, onClick: () => send(), icon: <SendOutlined />, + style: { + margin: '0 12px', + marginBottom: 8, + }, } as const); }, [loading, message]); - const defaultButtonDom = <Button {...defaultButtonProps} />; + const defaultButtonDom = <Button {...defaultButtonProps}>发送</Button>; const buttonDom = sendButtonRender ? sendButtonRender(defaultButtonDom, defaultButtonProps) @@ -194,25 +164,33 @@ export const ChatInputArea = (props: ChatInputAreaProps) => { theme={{ token: { borderRadius: 4, - colorBgContainer: theme.colorBgElevated, - controlHeightLG: 48, - colorBorder: 'transparent', - colorPrimaryHover: 'transparent', }, }} > - <Flex ref={areaRef} gap={8} className={cx(styles.container, `${prefixClass}`, className)}> - <ActionBar className={`${prefixClass}-action-bar`} /> + <> + <Divider + style={{ + margin: 0, + }} + /> + <ActionBar + clearMessage={clearMessage} + actionsRender={actionsRender} + className={`${prefixClass}-action-bar`} + locale={locale} + style={actionStyle} + /> <Flex - vertical + ref={areaRef} gap={8} - align={'center'} - className={cx(styles.boxShadow, `${prefixClass}-text-container`)} + vertical + align={'right'} + className={cx(`${prefixClass}`, className)} > {inputDom} {buttonDom} </Flex> - </Flex> + </> </ConfigProvider> ); @@ -220,7 +198,7 @@ export const ChatInputArea = (props: ChatInputAreaProps) => { return inputAreaRender( defaultInputArea, (message) => { - sendMessage(message); + onMessageSend(message); }, clearMessage, ); diff --git a/src/components/ChatItem/components/Title.tsx b/src/components/Title.tsx similarity index 66% rename from src/components/ChatItem/components/Title.tsx rename to src/components/Title.tsx index e233dee3..f2f5d7d7 100644 --- a/src/components/ChatItem/components/Title.tsx +++ b/src/components/Title.tsx @@ -1,8 +1,6 @@ -import { memo } from 'react'; - +import { formatTime } from '@/utils/formatTime'; import { Flex } from 'antd'; -import { ChatItemProps } from '../type'; -import { formatTime } from '../utils/formatTime'; +import { ChatItemProps } from './ChatItem/type'; export interface TitleProps { avatar: ChatItemProps['avatar']; @@ -11,7 +9,7 @@ export interface TitleProps { className?: string; } -const Title = memo<TitleProps>(({ className, placement, time, avatar }) => { +const Title: React.FC<TitleProps> = ({ className, placement, time, avatar }) => { return ( <Flex className={className} @@ -20,10 +18,10 @@ const Title = memo<TitleProps>(({ className, placement, time, avatar }) => { }} gap={4} > - {avatar.title} + {avatar?.title} {time && <time>{formatTime(time)}</time>} </Flex> ); -}); +}; export default Title; diff --git a/src/ProChat/const/message.ts b/src/const/message.ts similarity index 100% rename from src/ProChat/const/message.ts rename to src/const/message.ts diff --git a/src/ProChat/const/meta.ts b/src/const/meta.ts similarity index 100% rename from src/ProChat/const/meta.ts rename to src/const/meta.ts diff --git a/src/hooks/useChatList.ts b/src/hooks/useChatList.ts new file mode 100644 index 00000000..48436210 --- /dev/null +++ b/src/hooks/useChatList.ts @@ -0,0 +1,97 @@ +import { useMergedState } from 'rc-util'; +import React, { useEffect } from 'react'; +import { ChatMessage, MetaData } from '..'; +import { useRefFunction } from './useRefFunction'; + +export const useChatList = (props: { + initialChatList: ChatMessage<any>[]; + chatList: ChatMessage<any>[]; + loading: boolean; + helloMessage?: React.ReactNode; + meta: { + userMeta?: MetaData; + assistantMeta?: MetaData; + }; +}) => { + let controller: AbortController | null = null; + const [chatList, setChatList] = useMergedState<ChatMessage<any>[]>( + [ + { + id: crypto.randomUUID(), + content: props.helloMessage, + role: 'bot', + createAt: Date.now(), + updateAt: Date.now(), + meta: props.meta?.assistantMeta, + }, + { + id: crypto.randomUUID(), + content: props.helloMessage, + role: 'user', + createAt: Date.now(), + updateAt: Date.now(), + meta: props.meta?.assistantMeta, + }, + ], + { + value: props.chatList, + defaultValue: props.initialChatList, + }, + ); + + const [loading, setLoading] = useMergedState<boolean>(true, { + value: props.loading, + }); + + const fetchChatList = useRefFunction(async () => { + controller = new AbortController(); + + setLoading(true); + try { + const response = await fetch(`${process.env.REACT_APP_API_URL}/chat`, { + signal: controller.signal, + }); + const data = await response.json(); + setChatList(data); + setLoading(false); + } catch (error) { + console.error(error); + setLoading(false); + } + }); + + const stopGenerateMessage = useRefFunction(() => { + if (controller) { + controller.abort(); + } + }); + + const clearMessage = useRefFunction(() => { + setChatList([]); + }); + + const sendMessage = useRefFunction((message: string) => { + setChatList((prev) => [ + ...prev, + { + id: crypto.randomUUID(), + content: message, + role: 'user', + createAt: Date.now(), + updateAt: Date.now(), + }, + ]); + }); + + useEffect(() => { + fetchChatList(); + }, []); + + return { + chatList, + loading, + stopGenerateMessage, + clearMessage, + sendMessage, + }; +}; diff --git a/src/hooks/useChatListActionsBar.tsx b/src/hooks/useChatListActionsBar.tsx deleted file mode 100644 index 9627dce2..00000000 --- a/src/hooks/useChatListActionsBar.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { Copy, Edit, RotateCw, Trash } from 'lucide-react'; - -import { ActionIconGroupItems } from '@/ActionIconGroup'; - -interface ChatListActionsBar { - copy: ActionIconGroupItems; - del: ActionIconGroupItems; - divider: { type: 'divider' }; - edit: ActionIconGroupItems; - regenerate: ActionIconGroupItems; -} - -export const useChatListActionsBar = (text?: { - copy?: string; - delete?: string; - edit?: string; - regenerate?: string; -}): ChatListActionsBar => { - return { - copy: { - icon: Copy, - key: 'copy', - label: text?.copy || 'Copy', - }, - del: { - icon: Trash, - key: 'del', - label: text?.delete || 'Delete', - }, - divider: { - type: 'divider', - }, - edit: { - icon: Edit, - key: 'edit', - label: text?.edit || 'Edit', - }, - regenerate: { - icon: RotateCw, - key: 'regenerate', - label: text?.regenerate || 'Regenerate', - }, - }; -}; diff --git a/src/ProChat/hooks/useProChat.ts b/src/hooks/useProChat.ts similarity index 60% rename from src/ProChat/hooks/useProChat.ts rename to src/hooks/useProChat.ts index 278275ac..8c1a0947 100644 --- a/src/ProChat/hooks/useProChat.ts +++ b/src/hooks/useProChat.ts @@ -1,19 +1,12 @@ import { ChatMessage } from '@/types'; -import { useMemo } from 'react'; -import { ChatStore, useStoreApi } from '../store'; -import { chatSelectors } from '../store/selectors'; import { useRefFunction } from './useRefFunction'; -export interface ProChatInstance - extends Pick< - ChatStore, - 'resendMessage' | 'stopGenerateMessage' | 'sendMessage' | 'deleteMessage' | 'clearMessage' - > { +export interface ProChatInstance { /** * 获取当前聊天列表对象 * @returns ChatStore['chatList'] */ - getChats: () => ChatStore['chatList']; + getChats: () => ['chatList']; /** * 获取当前聊天消息列表 * @returns ChatMessage[] @@ -46,9 +39,7 @@ export interface ProChatInstance getChatLoadingId: () => string | undefined; } -export const useProChat = () => { - const storeApi = useStoreApi(); - +export const useProChat = (props) => { const { resendMessage, sendMessage, @@ -57,10 +48,10 @@ export const useProChat = () => { clearMessage, dispatchMessage, getChatLoadingId, - } = storeApi.getState(); + } = props; - const getChats = useRefFunction(() => storeApi.getState().chatList); - const getChatMessages = useRefFunction(() => chatSelectors.currentChats(storeApi.getState())); + const getChats = () => ['chatList']; + const getChatMessages = () => []; const setMessageContent = useRefFunction((id: string, content: string) => { dispatchMessage({ type: 'updateMessage', id, key: 'content', value: content }); @@ -72,18 +63,16 @@ export const useProChat = () => { }, ); - return useMemo<ProChatInstance>(() => { - return { - getChats, - getChatMessages, - resendMessage, - sendMessage, - getChatLoadingId, - stopGenerateMessage, - deleteMessage, - clearMessage, - setMessageContent, - setMessageValue, - }; - }, []); + return { + getChats, + getChatMessages, + resendMessage, + sendMessage, + getChatLoadingId, + stopGenerateMessage, + deleteMessage, + clearMessage, + setMessageContent, + setMessageValue, + }; }; diff --git a/src/ProChat/hooks/useRefFunction.ts b/src/hooks/useRefFunction.ts similarity index 100% rename from src/ProChat/hooks/useRefFunction.ts rename to src/hooks/useRefFunction.ts diff --git a/src/index.ts b/src/index.ts index fb2a3278..77e6e96f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,7 @@ -export * from './ProChat'; -export { default as ChatItem, type ChatItemProps } from './components/ChatItem'; -export { default as CopyButton, type CopyButtonProps } from './components/CopyButton'; -export * from './styles'; +export { ChatItem } from './components/ChatItem'; +export { CopyButton, type CopyButtonProps } from './components/CopyButton'; + +export * from './components/ProChat'; export type * from './types'; + +export type { ChatItemProps } from './components/ChatItem/type'; diff --git a/src/locale/index.ts b/src/locale/index.ts index 9a07e45a..bc64e3c2 100644 --- a/src/locale/index.ts +++ b/src/locale/index.ts @@ -1,13 +1,14 @@ import { LocaleProps } from '@/types/locale'; import enUSLocal from './en-US'; import zhCNLocal from './zh-CN'; -export type Locale = 'zh-CN' | 'en-US'; + +export type ProChatLocale = 'zh-CN' | 'en-US'; const locales = { 'en-US': enUSLocal, 'zh-CN': zhCNLocal, }; -export const gLocaleObject = (locale: Locale): LocaleProps => { +export const gLocaleObject = (locale: ProChatLocale): LocaleProps => { return locales[locale as 'zh-CN'] || locales['zh-CN']; }; diff --git a/src/styles/colors.ts b/src/styles/colors.ts deleted file mode 100644 index 897a8a47..00000000 --- a/src/styles/colors.ts +++ /dev/null @@ -1,909 +0,0 @@ -type colorStep = [ - string, - string, - string, - string, - string, - string, - string, - string, - string, - string, - string, - string, - string, -]; -export interface ColorScaleItem { - dark: colorStep; - darkA: colorStep; - light: colorStep; - lightA: colorStep; -} - -export interface ColorScales { - blue: ColorScaleItem; - bnw: ColorScaleItem; - cyan: ColorScaleItem; - geekblue: ColorScaleItem; - gold: ColorScaleItem; - gray: ColorScaleItem; - green: ColorScaleItem; - lime: ColorScaleItem; - magenta: ColorScaleItem; - orange: ColorScaleItem; - purple: ColorScaleItem; - red: ColorScaleItem; - volcano: ColorScaleItem; - yellow: ColorScaleItem; -} - -export const colorScales: ColorScales = { - blue: { - dark: [ - '#000506', - '#002126', - '#00363f', - '#004e59', - '#006675', - '#008093', - '#159ab0', - '#47b3ca', - '#6acde4', - '#8ae8ff', - '#b8f0ff', - '#def7ff', - '#ffffff', - ], - darkA: [ - 'rgba(0, 167, 200, 0.03)', - 'rgba(0, 220, 253, 0.15)', - 'rgba(0, 216, 252, 0.25)', - 'rgba(0, 223, 254, 0.35)', - 'rgba(0, 222, 254, 0.46)', - 'rgba(0, 221, 253, 0.58)', - 'rgba(30, 223, 255, 0.69)', - 'rgba(89, 224, 252, 0.8)', - 'rgba(118, 228, 253, 0.9)', - '#8ae8ff', - '#b8f0ff', - '#def7ff', - '#ffffff', - ], - light: [ - '#ffffff', - '#fbfeff', - '#f4fcff', - '#eafaff', - '#dff7ff', - '#d3f5ff', - '#c4f2ff', - '#b4efff', - '#a1ecff', - '#8ae8ff', - '#159ab0', - '#004e59', - '#000506', - ], - lightA: [ - 'rgba(255, 255, 255, 0.01)', - 'rgba(55, 205, 255, 0.02)', - 'rgba(35, 195, 255, 0.05)', - 'rgba(22, 199, 255, 0.09)', - 'rgba(9, 193, 255, 0.13)', - 'rgba(11, 199, 255, 0.18)', - 'rgba(9, 201, 255, 0.24)', - 'rgba(5, 202, 255, 0.3)', - 'rgba(1, 204, 255, 0.37)', - 'rgba(1, 205, 255, 0.46)', - 'rgba(1, 145, 169, 0.92)', - '#004e59', - '#000506', - ], - }, - bnw: { - dark: [ - '#000000', - '#111111', - '#333333', - '#555555', - '#666666', - '#888888', - '#aaaaaa', - '#cccccc', - '#dddddd', - '#eeeeee', - '#ffffff', - '#ffffff', - '#ffffff', - ], - darkA: [ - 'rgba(255, 255, 255, 0.02)', - 'rgba(255, 255, 255, 0.08)', - 'rgba(255, 255, 255, 0.16)', - 'rgba(255, 255, 255, 0.22)', - 'rgba(255, 255, 255, 0.36)', - 'rgba(255, 255, 255, 0.48)', - 'rgba(255, 255, 255, 0.6)', - 'rgba(255, 255, 255, 0.72)', - 'rgba(255, 255, 255, 0.84)', - 'rgba(255, 255, 255, 0.88)', - 'rgba(255, 255, 255, 0.92)', - 'rgba(255, 255, 255, 0.96)', - 'rgba(255, 255, 255, 0.98)', - ], - light: [ - '#ffffff', - '#f5f5f5', - '#eeeeee', - '#cccccc', - '#aaaaaa', - '#888888', - '#666666', - '#444444', - '#333333', - '#222222', - '#111111', - '#111111', - '#111111', - ], - lightA: [ - 'rgba(0, 0, 0, 0.02)', - 'rgba(0, 0, 0, 0.08)', - 'rgba(0, 0, 0, 0.16)', - 'rgba(0, 0, 0, 0.22)', - 'rgba(0, 0, 0, 0.36)', - 'rgba(0, 0, 0, 0.48)', - 'rgba(0, 0, 0, 0.6)', - 'rgba(0, 0, 0, 0.72)', - 'rgba(0, 0, 0, 0.84)', - 'rgba(0, 0, 0, 0.88)', - 'rgba(0, 0, 0, 0.92)', - 'rgba(0, 0, 0, 0.96)', - 'rgba(0, 0, 0, 0.98)', - ], - }, - cyan: { - dark: [ - '#000503', - '#00221c', - '#003930', - '#005245', - '#006c5b', - '#008772', - '#2fa28a', - '#55bca4', - '#75d7be', - '#95f3d9', - '#bdf7e4', - '#dffcf0', - '#ffffff', - ], - darkA: [ - 'rgba(0, 250, 150, 0.02)', - 'rgba(0, 243, 200, 0.14)', - 'rgba(0, 248, 209, 0.23)', - 'rgba(0, 248, 209, 0.33)', - 'rgba(0, 251, 212, 0.43)', - 'rgba(0, 255, 215, 0.53)', - 'rgba(73, 253, 216, 0.64)', - 'rgba(115, 254, 222, 0.74)', - 'rgba(138, 253, 224, 0.85)', - 'rgba(155, 253, 226, 0.96)', - 'rgba(195, 255, 235, 0.97)', - 'rgba(225, 255, 242, 0.99)', - '#ffffff', - ], - light: [ - '#ffffff', - '#f9fffb', - '#effff8', - '#e3fff4', - '#d8fef0', - '#ccfcec', - '#c0fae8', - '#b3f8e3', - '#a5f6de', - '#95f3d9', - '#2fa28a', - '#005245', - '#000503', - ], - lightA: [ - 'rgba(255, 255, 255, 0.01)', - 'rgba(55, 255, 122, 0.03)', - 'rgba(26, 255, 155, 0.07)', - 'rgba(0, 255, 155, 0.11)', - 'rgba(11, 249, 161, 0.16)', - 'rgba(0, 240, 160, 0.2)', - 'rgba(3, 235, 163, 0.25)', - 'rgba(2, 232, 162, 0.3)', - 'rgba(5, 230, 163, 0.36)', - 'rgba(3, 226, 165, 0.42)', - 'rgba(1, 142, 112, 0.82)', - '#005245', - '#000503', - ], - }, - geekblue: { - dark: [ - '#000216', - '#001343', - '#00225c', - '#003176', - '#00418f', - '#0052a8', - '#0264c1', - '#1877d5', - '#288aea', - '#369eff', - '#88bffb', - '#c5dffd', - '#ffffff', - ], - darkA: [ - 'rgba(0, 22, 244, 0.09)', - 'rgba(0, 70, 248, 0.27)', - 'rgba(0, 92, 249, 0.37)', - 'rgba(0, 104, 251, 0.47)', - 'rgba(0, 116, 255, 0.56)', - 'rgba(0, 124, 255, 0.66)', - 'rgba(3, 132, 254, 0.76)', - 'rgba(29, 142, 254, 0.84)', - 'rgba(43, 150, 254, 0.92)', - '#369eff', - 'rgba(137, 193, 254, 0.99)', - '#c5dffd', - '#ffffff', - ], - light: [ - '#ffffff', - '#f8faff', - '#eaf3ff', - '#daeaff', - '#c7e0ff', - '#b1d5ff', - '#9ac9ff', - '#7fbcff', - '#60aeff', - '#369eff', - '#0264c1', - '#003176', - '#000216', - ], - lightA: [ - 'rgba(255, 255, 255, 0.01)', - 'rgba(22, 88, 255, 0.03)', - 'rgba(22, 122, 255, 0.09)', - 'rgba(8, 115, 255, 0.15)', - 'rgba(0, 114, 255, 0.22)', - 'rgba(3, 120, 255, 0.31)', - 'rgba(3, 120, 255, 0.4)', - 'rgba(4, 124, 255, 0.51)', - 'rgba(3, 126, 255, 0.63)', - 'rgba(1, 132, 255, 0.79)', - '#0264c1', - '#003176', - '#000216', - ], - }, - gold: { - dark: [ - '#070300', - '#271a00', - '#3f2c00', - '#593f00', - '#745400', - '#906a00', - '#ac8100', - '#c99811', - '#e4b12f', - '#ffcb47', - '#ffdd90', - '#ffeecd', - '#ffffff', - ], - darkA: [ - 'rgba(233, 100, 0, 0.03)', - 'rgba(244, 163, 0, 0.16)', - 'rgba(252, 176, 0, 0.25)', - 'rgba(254, 180, 0, 0.35)', - 'rgba(252, 183, 0, 0.46)', - 'rgba(253, 186, 0, 0.57)', - 'rgba(253, 190, 0, 0.68)', - 'rgba(254, 192, 22, 0.79)', - 'rgba(253, 197, 52, 0.9)', - '#ffcb47', - '#ffdd90', - '#ffeecd', - '#ffffff', - ], - light: [ - '#ffffff', - '#fffcff', - '#fff8f2', - '#fff4e2', - '#ffefd0', - '#ffe9bb', - '#ffe3a4', - '#ffdb8b', - '#ffd46d', - '#ffcb47', - '#ac8100', - '#593f00', - '#070300', - ], - lightA: [ - 'rgba(255, 255, 255, 0.01)', - 'rgba(255, 105, 255, 0.02)', - 'rgba(255, 138, 38, 0.06)', - 'rgba(255, 163, 13, 0.12)', - 'rgba(255, 171, 8, 0.19)', - 'rgba(255, 174, 3, 0.27)', - 'rgba(255, 177, 2, 0.36)', - 'rgba(255, 177, 3, 0.46)', - 'rgba(255, 181, 3, 0.58)', - 'rgba(255, 184, 3, 0.73)', - '#ac8100', - '#593f00', - '#070300', - ], - }, - gray: { - dark: [ - '#000000', - '#111111', - '#222222', - '#2d2d2d', - '#333333', - '#444444', - '#555555', - '#666666', - '#6f6f6f', - '#777777', - '#aaaaaa', - '#dddddd', - '#ffffff', - ], - darkA: [ - 'rgba(255, 255, 255, 0.02)', - 'rgba(255, 255, 255, 0.06)', - 'rgba(255, 255, 255, 0.10)', - 'rgba(255, 255, 255, 0.16)', - 'rgba(255, 255, 255, 0.24)', - 'rgba(255, 255, 255, 0.28)', - 'rgba(255, 255, 255, 0.32)', - 'rgba(255, 255, 255, 0.38)', - 'rgba(255, 255, 255, 0.44)', - 'rgba(255, 255, 255, 0.5)', - 'rgba(255, 255, 255, 0.66)', - 'rgba(255, 255, 255, 0.84)', - '#ffffff', - ], - light: [ - '#ffffff', - '#f8f8f8', - '#eeeeee', - '#e3e3e3', - '#dddddd', - '#cccccc', - '#bbbbbb', - '#aaaaaa', - '#999999', - '#888888', - '#666666', - '#333333', - '#080808', - ], - lightA: [ - 'rgba(0, 0, 0, 0.015)', - 'rgba(0, 0, 0, 0.03)', - 'rgba(0, 0, 0, 0.06)', - 'rgba(0, 0, 0, 0.12)', - 'rgba(0, 0, 0, 0.18)', - 'rgba(0, 0, 0, 0.24)', - 'rgba(0, 0, 0, 0.32)', - 'rgba(0, 0, 0, 0.38)', - 'rgba(0, 0, 0, 0.44)', - 'rgba(0, 0, 0, 0.5)', - 'rgba(0, 0, 0, 0.68)', - 'rgba(0, 0, 0, 0.84)', - 'rgba(0, 0, 0, 0.98)', - ], - }, - green: { - dark: [ - '#000503', - '#001d12', - '#002d1d', - '#003f28', - '#005232', - '#00653c', - '#007944', - '#1b8d4d', - '#3ba05a', - '#55b467', - '#96cd92', - '#cde6c3', - '#ffffff', - ], - darkA: [ - 'rgba(0, 250, 150, 0.02)', - 'rgba(0, 242, 150, 0.12)', - 'rgba(0, 250, 161, 0.18)', - 'rgba(0, 252, 160, 0.25)', - 'rgba(0, 248, 152, 0.33)', - 'rgba(0, 252, 150, 0.4)', - 'rgba(0, 252, 142, 0.48)', - 'rgba(48, 252, 137, 0.56)', - 'rgba(94, 254, 143, 0.63)', - 'rgba(120, 254, 145, 0.71)', - 'rgba(185, 253, 180, 0.81)', - 'rgba(225, 253, 214, 0.91)', - '#ffffff', - ], - light: [ - '#ffffff', - '#f4fdeb', - '#e7f8dd', - '#d8f2ce', - '#c7eabd', - '#b4e1ac', - '#a0d79b', - '#89cc8a', - '#71c179', - '#55b467', - '#007944', - '#003f28', - '#000503', - ], - lightA: [ - 'rgba(255, 255, 255, 0.01)', - 'rgba(117, 230, 5, 0.08)', - 'rgba(84, 205, 12, 0.14)', - 'rgba(60, 190, 10, 0.2)', - 'rgba(40, 174, 1, 0.26)', - 'rgba(28, 164, 3, 0.33)', - 'rgba(18, 155, 5, 0.4)', - 'rgba(4, 146, 6, 0.47)', - 'rgba(1, 144, 16, 0.56)', - 'rgba(1, 143, 28, 0.67)', - '#007944', - '#003f28', - '#000503', - ], - }, - lime: { - dark: [ - '#020400', - '#142100', - '#253700', - '#374f00', - '#4b6800', - '#608200', - '#769d00', - '#8fb81b', - '#a9d42f', - '#c4f042', - '#daf685', - '#eefbbe', - '#ffffff', - ], - darkA: [ - 'rgba(100, 200, 0, 0.02)', - 'rgba(154, 254, 0, 0.13)', - 'rgba(168, 250, 0, 0.22)', - 'rgba(177, 255, 0, 0.31)', - 'rgba(183, 254, 0, 0.41)', - 'rgba(188, 255, 0, 0.51)', - 'rgba(190, 253, 0, 0.62)', - 'rgba(196, 252, 37, 0.73)', - 'rgba(204, 255, 57, 0.83)', - 'rgba(209, 255, 70, 0.94)', - 'rgba(225, 254, 137, 0.97)', - 'rgba(240, 254, 192, 0.99)', - '#ffffff', - ], - light: [ - '#ffffff', - '#feffeb', - '#f9ffd8', - '#f2ffc1', - '#ebfdaf', - '#e4fc9b', - '#ddf987', - '#d5f773', - '#cdf35c', - '#c4f042', - '#769d00', - '#374f00', - '#020400', - ], - lightA: [ - 'rgba(255, 255, 255, 0.01)', - 'rgba(242, 255, 5, 0.08)', - 'rgba(218, 255, 11, 0.16)', - 'rgba(203, 255, 7, 0.25)', - 'rgba(193, 249, 5, 0.32)', - 'rgba(187, 247, 5, 0.4)', - 'rgba(183, 242, 0, 0.47)', - 'rgba(179, 240, 0, 0.55)', - 'rgba(177, 236, 0, 0.64)', - 'rgba(175, 235, 0, 0.74)', - '#769d00', - '#374f00', - '#020400', - ], - }, - magenta: { - dark: [ - '#100002', - '#350011', - '#4b001e', - '#63002d', - '#79093f', - '#8e1752', - '#a32466', - '#b8317b', - '#ce3e91', - '#e34ba9', - '#f38bcb', - '#fec5e8', - '#ffffff', - ], - darkA: [ - 'rgba(229, 0, 29, 0.07)', - 'rgba(252, 0, 81, 0.21)', - 'rgba(250, 0, 100, 0.3)', - 'rgba(254, 0, 115, 0.39)', - 'rgba(252, 19, 131, 0.48)', - 'rgba(254, 41, 146, 0.56)', - 'rgba(255, 56, 159, 0.64)', - 'rgba(252, 67, 168, 0.73)', - 'rgba(254, 77, 179, 0.81)', - 'rgba(255, 84, 190, 0.89)', - 'rgba(253, 145, 211, 0.96)', - '#fec5e8', - '#ffffff', - ], - light: [ - '#ffffff', - '#fff7f9', - '#ffeaf4', - '#ffdaee', - '#ffc7e7', - '#ffb2df', - '#ff99d6', - '#f980ca', - '#ef67ba', - '#e34ba9', - '#a32466', - '#63002d', - '#100002', - ], - lightA: [ - 'rgba(255, 255, 255, 0.01)', - 'rgba(255, 55, 105, 0.04)', - 'rgba(255, 22, 133, 0.09)', - 'rgba(255, 8, 142, 0.15)', - 'rgba(255, 0, 146, 0.22)', - 'rgba(255, 7, 152, 0.31)', - 'rgba(255, 0, 153, 0.4)', - 'rgba(243, 1, 149, 0.5)', - 'rgba(228, 2, 140, 0.6)', - 'rgba(216, 1, 134, 0.71)', - 'rgba(148, 0, 77, 0.86)', - '#63002d', - '#100002', - ], - }, - orange: { - dark: [ - '#080300', - '#271400', - '#3d2000', - '#552d00', - '#6f3a00', - '#8a4700', - '#a75400', - '#c66100', - '#e37013', - '#ff802b', - '#ffae87', - '#ffd7c8', - '#ffffff', - ], - darkA: [ - 'rgba(200, 75, 0, 0.04)', - 'rgba(244, 125, 0, 0.16)', - 'rgba(254, 133, 0, 0.24)', - 'rgba(250, 132, 0, 0.34)', - 'rgba(252, 132, 0, 0.44)', - 'rgba(251, 129, 0, 0.55)', - 'rgba(253, 127, 0, 0.66)', - 'rgba(254, 124, 0, 0.78)', - 'rgba(255, 126, 21, 0.89)', - '#ff802b', - '#ffae87', - '#ffd7c8', - '#ffffff', - ], - light: [ - '#ffffff', - '#fff9f8', - '#fff0ec', - '#ffe6dd', - '#ffd9ca', - '#ffcbb5', - '#ffbb9c', - '#ffaa7f', - '#ff975c', - '#ff802b', - '#a75400', - '#552d00', - '#080300', - ], - lightA: [ - 'rgba(255, 255, 255, 0.01)', - 'rgba(255, 55, 22, 0.03)', - 'rgba(255, 67, 17, 0.08)', - 'rgba(255, 76, 12, 0.14)', - 'rgba(255, 74, 3, 0.21)', - 'rgba(255, 76, 0, 0.29)', - 'rgba(255, 81, 1, 0.39)', - 'rgba(255, 88, 4, 0.51)', - 'rgba(255, 93, 0, 0.64)', - 'rgba(255, 102, 0, 0.83)', - '#a75400', - '#552d00', - '#080300', - ], - }, - purple: { - dark: [ - '#0d000b', - '#2e002a', - '#42003e', - '#560053', - '#670e66', - '#781e78', - '#892b8a', - '#9a399e', - '#ab46b2', - '#bd54c6', - '#d590da', - '#edc7ee', - '#ffffff', - ], - darkA: [ - 'rgba(217, 0, 183, 0.06)', - 'rgba(242, 0, 221, 0.19)', - 'rgba(254, 0, 238, 0.26)', - 'rgba(253, 0, 244, 0.34)', - 'rgba(251, 34, 249, 0.41)', - 'rgba(255, 64, 255, 0.47)', - 'rgba(249, 78, 251, 0.55)', - 'rgba(248, 92, 255, 0.62)', - 'rgba(244, 100, 254, 0.7)', - 'rgba(242, 108, 254, 0.78)', - 'rgba(248, 167, 253, 0.86)', - 'rgba(252, 212, 253, 0.94)', - '#ffffff', - ], - light: [ - '#ffffff', - '#fff6fb', - '#ffe7fd', - '#fdd6fe', - '#f6c4f8', - '#eeb1f1', - '#e49ce8', - '#d886de', - '#cb6ed2', - '#bd54c6', - '#892b8a', - '#560053', - '#0d000b', - ], - lightA: [ - 'rgba(255, 255, 255, 0.01)', - 'rgba(255, 30, 155, 0.04)', - 'rgba(255, 15, 235, 0.1)', - 'rgba(243, 14, 249, 0.17)', - 'rgba(218, 9, 226, 0.24)', - 'rgba(200, 3, 210, 0.31)', - 'rgba(186, 1, 196, 0.39)', - 'rgba(174, 3, 186, 0.48)', - 'rgba(164, 1, 176, 0.57)', - 'rgba(156, 0, 170, 0.67)', - 'rgba(113, 0, 114, 0.83)', - '#560053', - '#0d000b', - ], - }, - red: { - dark: [ - '#0f0006', - '#34001d', - '#4b002b', - '#640039', - '#7a0c46', - '#911b53', - '#a72860', - '#bf356e', - '#d7427b', - '#f04f88', - '#ff8eab', - '#ffc9d3', - '#ffffff', - ], - darkA: [ - 'rgba(250, 0, 100, 0.06)', - 'rgba(248, 0, 138, 0.21)', - 'rgba(250, 0, 143, 0.3)', - 'rgba(250, 0, 142, 0.4)', - 'rgba(254, 25, 146, 0.48)', - 'rgba(254, 47, 146, 0.57)', - 'rgba(253, 61, 145, 0.66)', - 'rgba(255, 71, 147, 0.75)', - 'rgba(253, 78, 145, 0.85)', - 'rgba(255, 84, 145, 0.94)', - '#ff8eab', - '#ffc9d3', - '#ffffff', - ], - light: [ - '#ffffff', - '#fff7f7', - '#ffeced', - '#ffdde2', - '#ffccd5', - '#ffb8c7', - '#ffa2b8', - '#ff88a8', - '#fe6998', - '#f04f88', - '#a72860', - '#640039', - '#0f0006', - ], - lightA: [ - 'rgba(255, 255, 255, 0.01)', - 'rgba(255, 55, 55, 0.04)', - 'rgba(255, 17, 30, 0.08)', - 'rgba(255, 12, 48, 0.14)', - 'rgba(255, 0, 45, 0.2)', - 'rgba(255, 1, 55, 0.28)', - 'rgba(255, 4, 63, 0.37)', - 'rgba(255, 2, 70, 0.47)', - 'rgba(253, 1, 80, 0.59)', - 'rgba(233, 0, 83, 0.69)', - 'rgba(151, 2, 68, 0.85)', - '#640039', - '#0f0006', - ], - }, - volcano: { - dark: [ - '#0c0100', - '#2f0a00', - '#451200', - '#5d1900', - '#762000', - '#8e2a07', - '#a53716', - '#bc4424', - '#d45132', - '#ec5e41', - '#ff9480', - '#ffcbc3', - '#ffffff', - ], - darkA: [ - 'rgba(240, 20, 0, 0.05)', - 'rgba(247, 53, 0, 0.19)', - 'rgba(246, 64, 0, 0.28)', - 'rgba(251, 68, 0, 0.37)', - 'rgba(251, 68, 0, 0.47)', - 'rgba(254, 75, 12, 0.56)', - 'rgba(254, 85, 34, 0.65)', - 'rgba(254, 92, 49, 0.74)', - 'rgba(255, 98, 60, 0.83)', - 'rgba(254, 101, 70, 0.93)', - '#ff9480', - '#ffcbc3', - '#ffffff', - ], - light: [ - '#ffffff', - '#fff7f6', - '#ffece9', - '#ffded9', - '#ffcec5', - '#ffbbaf', - '#ffa695', - '#ff8e78', - '#fb745a', - '#ec5e41', - '#a53716', - '#5d1900', - '#0c0100', - ], - lightA: [ - 'rgba(255, 255, 255, 0.01)', - 'rgba(255, 55, 30, 0.04)', - 'rgba(255, 44, 11, 0.09)', - 'rgba(255, 35, 2, 0.15)', - 'rgba(255, 42, 3, 0.23)', - 'rgba(255, 43, 5, 0.32)', - 'rgba(255, 43, 3, 0.42)', - 'rgba(255, 42, 0, 0.53)', - 'rgba(249, 41, 1, 0.65)', - 'rgba(230, 40, 2, 0.75)', - 'rgba(157, 38, 2, 0.92)', - '#5d1900', - '#0c0100', - ], - }, - yellow: { - dark: [ - '#050400', - '#251d00', - '#3e3300', - '#584a00', - '#736300', - '#8e7d00', - '#ab9800', - '#c7b426', - '#e3d142', - '#ffef5c', - '#fff594', - '#fffad3', - '#ffffff', - ], - darkA: [ - 'rgba(250, 200, 0, 0.02)', - 'rgba(247, 193, 0, 0.15)', - 'rgba(248, 204, 0, 0.25)', - 'rgba(251, 211, 0, 0.35)', - 'rgba(250, 215, 0, 0.46)', - 'rgba(254, 223, 0, 0.56)', - 'rgba(255, 227, 0, 0.67)', - 'rgba(255, 231, 49, 0.78)', - 'rgba(255, 235, 74, 0.89)', - '#ffef5c', - '#fff594', - '#fffad3', - '#ffffff', - ], - light: [ - '#ffffff', - '#fffeff', - '#fffcff', - '#fffbf1', - '#fffada', - '#fff9c2', - '#fff7aa', - '#fff592', - '#fff279', - '#ffef5c', - '#ab9800', - '#584a00', - '#050400', - ], - lightA: [ - 'rgba(255, 255, 255, 0.01)', - 'rgba(255, 155, 255, 0.01)', - 'rgba(255, 105, 255, 0.02)', - 'rgba(255, 188, 22, 0.06)', - 'rgba(255, 222, 8, 0.15)', - 'rgba(255, 230, 1, 0.24)', - 'rgba(255, 231, 5, 0.34)', - 'rgba(255, 232, 2, 0.43)', - 'rgba(255, 230, 2, 0.53)', - 'rgba(255, 230, 0, 0.64)', - '#ab9800', - '#584a00', - '#050400', - ], - }, -}; diff --git a/src/styles/index.ts b/src/styles/index.ts deleted file mode 100644 index 63738ce6..00000000 --- a/src/styles/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { colorScales } from './colors'; diff --git a/src/styles/stylish.ts b/src/styles/stylish.ts deleted file mode 100644 index 99ba13e1..00000000 --- a/src/styles/stylish.ts +++ /dev/null @@ -1,238 +0,0 @@ -import { createStylish, keyframes } from 'antd-style'; - -export const useStylish = createStylish(({ css, token, isDarkMode }) => { - const gradient = keyframes` - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } - `; - - const cyanColor = isDarkMode ? token.cyan9A : token.cyan11A; - const cyanBackground = isDarkMode ? token.cyan2A : token.cyan6A; - - return { - blur: css` - backdrop-filter: saturate(180%) blur(10px); - `, - blurStrong: css` - backdrop-filter: blur(36px); - `, - bottomScrollbar: css` - ::-webkit-scrollbar { - width: 0; - height: 4px; - background-color: transparent; - - &-thumb { - background-color: ${token.colorFill}; - border-radius: 4px; - transition: background-color 500ms ${token.motionEaseOut}; - } - - &-corner { - display: none; - width: 0; - height: 0; - } - } - `, - gradientAnimation: css` - background-image: linear-gradient( - -45deg, - ${token.gold}, - ${token.magenta}, - ${token.geekblue}, - ${token.cyan} - ); - background-size: 400% 400%; - border-radius: inherit; - animation: 5s ${gradient} 5s ease infinite; - `, - markdown: css` - color: ${token.colorText}; - - h1, - h2, - h3, - h4, - h5 { - font-weight: 600; - } - - p { - margin-block-start: 0; - margin-block-end: 0; - - font-size: 14px; - line-height: 1.8; - color: ${token.colorText}; - word-break: break-all; - word-wrap: break-word; - - + * { - margin-block-end: 0.5em; - } - } - - > *:last-child { - margin-bottom: 0 !important; - } - - blockquote { - margin: 16px 0; - padding: 0 12px; - - p { - font-style: italic; - color: ${token.colorTextDescription}; - } - } - - p:not(:last-child) { - margin-bottom: 1em; - } - - a { - color: ${token.colorLink}; - - &:hover { - color: ${token.colorLinkHover}; - } - - &:active { - color: ${token.colorLinkActive}; - } - } - - img { - max-width: 100%; - } - - pre, - [data-code-type='highlighter'] { - border: none; - border-radius: ${token.borderRadius}px; - - > code { - padding: 0 !important; - border: none !important; - } - } - - > :not([data-code-type='highlighter']) code { - padding: 2px 6px; - - font-size: ${token.fontSizeSM}px; - color: ${cyanColor}; - - background: ${cyanBackground}; - border: 1px solid ${isDarkMode ? token.cyan1A : token.cyan6A}; - border-radius: ${token.borderRadiusSM}px; - } - - table { - border-spacing: 0; - - width: 100%; - margin-block-start: 1em; - margin-block-end: 1em; - margin-inline-start: 0; - margin-inline-end: 0; - padding: 8px; - - border: 1px solid ${token.colorBorderSecondary}; - border-radius: ${token.borderRadius}px; - - code { - display: inline-flex; - } - } - - th, - td { - padding-block-start: 10px; - padding-block-end: 10px; - padding-inline-start: 16px; - padding-inline-end: 16px; - } - - thead { - tr { - th { - background: ${token.colorFillTertiary}; - - &:first-child { - border-top-left-radius: ${token.borderRadius}px; - border-bottom-left-radius: ${token.borderRadius}px; - } - - &:last-child { - border-top-right-radius: ${token.borderRadius}px; - border-bottom-right-radius: ${token.borderRadius}px; - } - } - } - } - - > ol > li::marker { - color: ${isDarkMode ? token.cyan9A : token.cyan10A} !important; - } - - > ul > li { - line-height: 1.8; - list-style-type: disc; - - &::marker { - color: ${isDarkMode ? token.cyan9A : token.cyan10A} !important; - } - } - - ol, - ul { - > li::marker { - color: ${token.colorTextDescription}; - } - } - - details { - margin-bottom: 1em; - padding: 12px 16px; - - background: ${token.colorFillTertiary}; - border: 1px solid ${token.colorBorderSecondary}; - border-radius: ${token.borderRadiusLG}px; - - transition: all 400ms ${token.motionEaseOut}; - } - - details[open] { - summary { - padding-bottom: 12px; - border-bottom: 1px solid ${token.colorBorder}; - } - } - `, - noScrollbar: css` - ::-webkit-scrollbar { - display: none; - width: 0; - height: 0; - background-color: transparent; - } - `, - resetLinkColor: css` - cursor: pointer; - color: ${token.colorTextSecondary}; - - &:hover { - color: ${token.colorText}; - } - `, - }; -}); diff --git a/src/ProChat/types/chat.ts b/src/types/chat.ts similarity index 100% rename from src/ProChat/types/chat.ts rename to src/types/chat.ts diff --git a/src/ProChat/types/config.ts b/src/types/config.ts similarity index 100% rename from src/ProChat/types/config.ts rename to src/types/config.ts diff --git a/src/types/customStylish.ts b/src/types/customStylish.ts deleted file mode 100644 index d75c0ed8..00000000 --- a/src/types/customStylish.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface LobeCustomStylish { - blur: string; - blurStrong: string; - bottomScrollbar: string; - gradientAnimation: string; - markdown: string; - noScrollbar: string; - resetLinkColor: string; -} diff --git a/src/types/customToken.ts b/src/types/customToken.ts deleted file mode 100644 index 9ae52cf9..00000000 --- a/src/types/customToken.ts +++ /dev/null @@ -1,48 +0,0 @@ -const PresetColors = [ - 'red', - 'volcano', - 'orange', - 'gold', - 'yellow', - 'lime', - 'green', - 'cyan', - 'blue', - 'geekblue', - 'purple', - 'magenta', - 'gray', -] as const; - -export type PresetColorKey = (typeof PresetColors)[number]; - -export type PresetColorType = Record<PresetColorKey, string>; - -type ColorPaletteKeyIndex = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11; - -type ColorTokenKey = - | 'Bg' - | 'BgHover' - | 'Border' - | 'BorderSecondary' - | 'BorderHover' - | 'Hover' - | '' - | 'Active' - | 'TextHover' - | 'Text' - | 'TextActive'; - -export type ColorToken = { - [key in `${keyof PresetColorType}${ColorTokenKey}`]: string; -}; - -export type ColorPalettes = { - [key in `${keyof PresetColorType}${ColorPaletteKeyIndex}`]: string; -}; - -export type ColorPalettesAlpha = { - [key in `${keyof PresetColorType}${ColorPaletteKeyIndex}A`]: string; -}; - -export interface LobeCustomToken extends ColorToken, ColorPalettes, ColorPalettesAlpha {} diff --git a/src/types/index.ts b/src/types/index.ts index 04ac9ea8..999697c0 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,7 +1,5 @@ import { type HTMLAttributes } from 'react'; -export * from './customStylish'; -export * from './customToken'; export * from './llm'; export * from './message'; export * from './meta'; diff --git a/src/types/message.ts b/src/types/message.ts index f9ecd4d8..1748fedd 100644 --- a/src/types/message.ts +++ b/src/types/message.ts @@ -1,5 +1,6 @@ -import { ModelRoleType } from '@/ProChat/types/config'; +import { ModelRoleType } from '@/types/config'; import { ReactNode } from 'react'; +import { MetaData } from './meta'; /** * 聊天消息错误对象 @@ -29,8 +30,8 @@ export interface ChatMessage<T extends Record<string, any> = Record<string, any> id: string; updateAt: number; extra?: T; - messageItemExtraRender?: (props: ChatMessage) => React.ReactNode; + meta?: MetaData; } export interface OpenAIFunctionCall { diff --git a/src/types/meta.ts b/src/types/meta.ts index 3a6b2408..572694f9 100644 --- a/src/types/meta.ts +++ b/src/types/meta.ts @@ -14,11 +14,10 @@ export interface MetaData { * @description 可选参数,如果不传则使用默认名称 */ title?: string; -} -export interface BaseDataModel { - createAt: number; - id: string; - meta: MetaData; - updateAt: number; + /** + * 附加数据 + * @description 可选参数,如果不传则使用默认名称 + */ + [key: string]: any; } diff --git a/src/ProChat/utils/fetch.ts b/src/utils/fetch.ts similarity index 100% rename from src/ProChat/utils/fetch.ts rename to src/utils/fetch.ts diff --git a/src/components/ChatItem/utils/formatTime.ts b/src/utils/formatTime.ts similarity index 100% rename from src/components/ChatItem/utils/formatTime.ts rename to src/utils/formatTime.ts diff --git a/src/ProChat/utils/merge.ts b/src/utils/merge.ts similarity index 100% rename from src/ProChat/utils/merge.ts rename to src/utils/merge.ts