diff --git a/.gitmodules b/.gitmodules index 76846be..bfa201c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,4 +3,10 @@ url = git@git.xiongxiao.me:kevisual/kevsiual-query-login.git [submodule "submodules/query-config"] path = submodules/query-config - url = git@git.xiongxiao.me:kevisual/kevsiual-query-config.git \ No newline at end of file + url = git@git.xiongxiao.me:kevisual/kevsiual-query-config.git +[submodule "submodules/wallnote"] + path = submodules/wallnote + url = git@git.xiongxiao.me:tailored/wallnote.git +[submodule "packages/kevisual-official"] + path = packages/kevisual-official + url = git@git.xiongxiao.me:kevisual/official-website.git diff --git a/packages/components/package.json b/packages/components/package.json deleted file mode 100644 index bdf66ed..0000000 --- a/packages/components/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "@kevisual/components", - "version": "0.0.1", - "description": "center components", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "files": [ - "src" - ], - "keywords": [], - "author": "abearxiong ", - "license": "MIT", - "type": "module", - "dependencies": { - "@emotion/react": "^11.14.0", - "@emotion/styled": "^11.14.0", - "@mui/material": "^6.4.7", - "react": "19.0.0", - "react-dom": "19.0.0", - "react-hook-form": "^7.54.2" - }, - "exports": { - ".": "./src/index.tsx", - "./*": "./src/*" - }, - "devDependencies": { - "clsx": "^2.1.1", - "tailwind-merge": "^3.0.2" - } -} \ No newline at end of file diff --git a/packages/components/src/button/index.tsx b/packages/components/src/button/index.tsx deleted file mode 100644 index 1819886..0000000 --- a/packages/components/src/button/index.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import MuiButton, { ButtonProps } from '@mui/material/Button'; - -export const Button = (props: ButtonProps) => { - return ; -}; - -export const IconButton = (props: ButtonProps) => { - const { variant = 'contained', color = 'primary', sx, children, ...rest } = props; - return ( - - {children} - - ); -}; - -export const IconButtonItem = (props: ButtonProps) => { - const { variant = 'contained', size = 'small', color = 'primary', sx, children, ...rest } = props; - return ( - - {/* */} - - {children} - - ); -}; diff --git a/packages/components/src/card/CardBlank.tsx b/packages/components/src/card/CardBlank.tsx deleted file mode 100644 index 40143f9..0000000 --- a/packages/components/src/card/CardBlank.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import clsx from 'clsx'; -import twMerge from 'tailwind-merge'; - -type CardBlankProps = { - number?: number; - className?: string; -}; -export const CardBlank = (props: CardBlankProps) => { - const { number = 4, className } = props; - return ( - <> - {new Array(number).fill(0).map((_, index) => { - return
; - })} - - ); -}; diff --git a/packages/components/src/clsx/index.ts b/packages/components/src/clsx/index.ts deleted file mode 100644 index de32246..0000000 --- a/packages/components/src/clsx/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import clsx, { ClassValue } from 'clsx'; -import { twMerge } from 'tailwind-merge'; - -export const clsxMerge = (...args: ClassValue[]) => { - return twMerge(clsx(...args)); -}; -export { clsx }; diff --git a/packages/components/src/index.tsx b/packages/components/src/index.tsx deleted file mode 100644 index 4989af8..0000000 --- a/packages/components/src/index.tsx +++ /dev/null @@ -1,6 +0,0 @@ -export * from './theme'; - -/** - * 输入组件, 使用theme的defaultProps - */ -export * from './input/TextField'; diff --git a/packages/components/src/input/TextField.tsx b/packages/components/src/input/TextField.tsx deleted file mode 100644 index e2c946e..0000000 --- a/packages/components/src/input/TextField.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { TextField as MuiTextField, TextFieldProps, Tooltip } from '@mui/material'; -import { useTheme } from '../theme'; -import { HelpCircle } from 'lucide-react'; - -export const TextField = (props: TextFieldProps) => { - const theme = useTheme(); - const defaultProps = theme.components?.MuiTextField?.defaultProps; - return ; -}; - -export const TextFieldLabel = ({ children, tips, label }: { children?: React.ReactNode; tips?: string; label?: any }) => { - return ( -
- {label} - {children} - {tips && ( - - - - )} -
- ); -}; diff --git a/packages/components/src/input/index.tsx b/packages/components/src/input/index.tsx deleted file mode 100644 index 2d1fc81..0000000 --- a/packages/components/src/input/index.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { FormControlLabel, TextField } from '@mui/material'; -import { useForm, Controller } from 'react-hook-form'; -export const InputControl = ({ name, value, onChange }: { name: string; value: string; onChange?: (value: string) => void }) => { - return ( - onChange?.(e.target.value)} - sx={{ - width: '100%', - marginBottom: '16px', - }} - /> - ); -}; -type FormProps = { - onSubmit?: (data: any) => void; - children?: React.ReactNode; -}; -export const FormDemo = (props: FormProps) => { - const { control, handleSubmit } = useForm(); - const { onSubmit = () => {}, children } = props; - - return ( -
- ( - {error?.message}} - /> - )} - /> - - ); -}; diff --git a/packages/components/src/modal/Confirm.tsx b/packages/components/src/modal/Confirm.tsx deleted file mode 100644 index 92728ba..0000000 --- a/packages/components/src/modal/Confirm.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import { Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, Button } from '@mui/material'; -import { useRef, useState } from 'react'; -import type { ModalFuncProps } from 'antd'; -export const Confirm = ({ - open, - onClose, - title, - content, - onConfirm, - okText = '确认', - cancelText = '取消', -}: { - open: boolean; - onClose: () => void; - title: string; - content: string; - onConfirm?: () => void; - okText?: string; - cancelText?: string; -}) => { - return ( - - - {title} - - - {content} - - - - - - - ); -}; - -type Fn = () => void; -export const useModal = () => { - const [open, setOpen] = useState(false); - const [title, setTitle] = useState(''); - const [content, setContent] = useState(''); - const fns = useRef<{ - onConfirm: Fn; - onCancel: Fn; - okText: string; - cancelText: string; - }>({ - onConfirm: () => {}, - onCancel: () => {}, - okText: '确认', - cancelText: '取消', - }); - const modal = { - confirm: (props: ModalFuncProps) => { - setOpen(true); - setTitle(props.title as string); - setContent(props.content as string); - fns.current.onConfirm = async () => { - const isClose = await props.onOk?.(); - if (!isClose) { - setOpen(false); - } - }; - fns.current.onCancel = async () => { - await props.onCancel?.(); - setOpen(false); - }; - fns.current.okText = props.okText as string; - fns.current.cancelText = props.cancelText as string; - }, - cancel: () => { - setOpen(false); - fns.current.onCancel(); - }, - }; - const contextHolder = ( - { - setOpen(false); - fns.current.onCancel(); - }} - title={title} - content={content} - onConfirm={fns.current.onConfirm} - /> - ); - return [modal, contextHolder] as [typeof modal, React.ReactNode]; -}; diff --git a/packages/components/src/select/TagsInput.tsx b/packages/components/src/select/TagsInput.tsx deleted file mode 100644 index 3151116..0000000 --- a/packages/components/src/select/TagsInput.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { Fragment, useEffect, useState } from 'react'; -import Autocomplete from '@mui/material/Autocomplete'; -import { TextField, Chip } from '@mui/material'; - -type TagsInputProps = { - value: string[]; - onChange: (value: string[]) => void; - placeholder?: string; - label?: any; - showLabel?: boolean; -}; -export const TagsInput = ({ value, onChange, placeholder = '', label = '', showLabel = false }: TagsInputProps) => { - const [tags, setTags] = useState(value); - useEffect(() => { - setTags(value); - }, [value]); - const randomid = () => { - return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); - }; - return ( - { - // setTags(newValue as string[]); - onChange(newValue as string[]); - }} - sx={{ - width: '100%', - }} - renderTags={(value: string[], getTagProps) => { - const id = randomid(); - const com = value.map((option: string, index: number) => ( - - )); - return {com}; - }} - renderInput={(params) => } - /> - ); -}; diff --git a/packages/components/src/select/index.tsx b/packages/components/src/select/index.tsx deleted file mode 100644 index cd73fe6..0000000 --- a/packages/components/src/select/index.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { MenuItem, Select as MuiSelect, SelectProps as MuiSelectProps } from '@mui/material'; -import React from 'react'; - -type SelectProps = { - options?: { label: string; value: string }[]; -} & MuiSelectProps; - -export const Select = React.forwardRef((props: SelectProps, ref) => { - const { options, ...rest } = props; - console.log(props, 'props'); - return ( - - {options?.map((option) => ( - - {option.label} - - ))} - - ); -}); diff --git a/packages/components/src/theme/index.tsx b/packages/components/src/theme/index.tsx deleted file mode 100644 index bea6af9..0000000 --- a/packages/components/src/theme/index.tsx +++ /dev/null @@ -1,226 +0,0 @@ -import { createTheme, Shadows, ThemeOptions } from '@mui/material/styles'; -import { useTheme as useMuiTheme, Theme } from '@mui/material/styles'; -import { amber, red } from '@mui/material/colors'; -import { ThemeProvider } from '@mui/material/styles'; -const generateShadows = (color: string): Shadows => { - return [ - 'none', - `0px 2px 1px -1px ${color}`, - `0px 1px 1px 0px ${color}`, - `0px 1px 3px 0px ${color}`, - `0px 2px 4px -1px ${color}`, - - `0px 3px 5px -1px ${color}`, - `0px 3px 5px -1px ${color}`, - `0px 4px 5px -2px ${color}`, - `0px 5px 5px -3px ${color}`, - `0px 5px 6px -3px ${color}`, - - `0px 6px 6px -3px ${color}`, - `0px 6px 7px -4px ${color}`, - `0px 7px 8px -4px ${color}`, - `0px 7px 8px -4px ${color}`, - `0px 8px 9px -5px ${color}`, - - `0px 8px 9px -5px ${color}`, - `0px 9px 10px -5px ${color}`, - `0px 9px 11px -6px ${color}`, - `0px 10px 12px -6px ${color}`, - `0px 10px 13px -6px ${color}`, - - `0px 11px 13px -7px ${color}`, - `0px 11px 14px -7px ${color}`, - `0px 12px 15px -7px ${color}`, - `0px 12px 16px -8px ${color}`, - `0px 13px 17px -8px ${color}`, - ]; -}; -const primaryMain = amber[300]; // #ffc107 -const secondaryMain = amber[500]; // #ffa000 -export const themeOptions: ThemeOptions = { - // @ts-ignore - // cssVariables: true, - palette: { - primary: { - main: primaryMain, // amber[300] - }, - secondary: { - main: secondaryMain, // amber[500] - }, - divider: amber[200], - common: { - white: secondaryMain, - }, - text: { - primary: amber[600], - secondary: amber[600], - }, - background: { - default: '#ffffff', // 设置默认背景颜色 - // paper: '#f5f5f5', // 设置纸张背景颜色 - }, - error: { - main: red[500], // 设置错误颜色 "#f44336" - }, - }, - shadows: generateShadows('rgba(255, 193, 7, 0.2)'), - typography: { - // fontFamily: 'Roboto, sans-serif', - }, - components: { - MuiButtonBase: { - defaultProps: { - disableRipple: true, - }, - styleOverrides: { - root: { - '&:hover': { - backgroundColor: amber[100], - }, - '&.MuiButton-contained': { - color: '#ffffff', - ':hover': { - color: secondaryMain, - }, - }, - }, - }, - }, - MuiButtonGroup: { - styleOverrides: { - root: { - '& .MuiButton-root': { - borderColor: amber[600], - }, - }, - }, - }, - MuiTextField: { - defaultProps: { - fullWidth: true, - size: 'small', - slotProps: { - inputLabel: { - shrink: true, - }, - }, - }, - styleOverrides: { - root: { - '& .MuiOutlinedInput-root': { - '& fieldset': { - borderColor: amber[300], - }, - '&:hover fieldset': { - borderColor: amber[500], - }, - '& .MuiInputBase-input': { - color: amber[600], - }, - }, - '& .MuiInputLabel-root': { - color: amber[600], - }, - }, - }, - }, - MuiAutocomplete: { - defaultProps: { - size: 'small', - }, - }, - MuiSelect: { - styleOverrides: { - root: { - '& .MuiOutlinedInput-notchedOutline': { - borderColor: amber[300], - }, - '&:hover .MuiOutlinedInput-notchedOutline': { - borderColor: amber[500], - }, - '&.Mui-focused .MuiOutlinedInput-notchedOutline': { - borderColor: amber[500], - }, - '& .MuiSelect-icon': { - color: amber[500], // Set arrow icon color to primary - }, - }, - }, - }, - MuiCard: { - styleOverrides: { - root: { - // border: `1px solid ${amber[300]}`, - }, - }, - }, - MuiIconButton: { - styleOverrides: { - root: { - color: '#ffffff', // Set default font color to white - }, - }, - }, - MuiFormControlLabel: { - defaultProps: { - labelPlacement: 'top', - }, - styleOverrides: { - root: { - color: amber[600], - alignItems: 'flex-start', - '& .MuiFormControlLabel-label': { - textAlign: 'left', - width: '100%', - }, - '& .MuiFormControlLabel-root': { - width: '100%', - }, - '& .MuiInputBase-root': { - width: '100%', - }, - }, - }, - }, - MuiMenuItem: { - styleOverrides: { - root: { - '&.Mui-selected': { - backgroundColor: amber[500], - color: '#ffffff', - '&:hover': { - backgroundColor: amber[600], - color: '#ffffff', - }, - }, - }, - }, - }, - }, -}; - -/** - * https://bareynol.github.io/mui-theme-creator/ - */ -export const theme = createTheme(themeOptions); - -/** - * - * @returns - */ -export const useTheme = () => { - return useMuiTheme(); -}; - -/** - * 自定义主题设置。 - * @param param0 - * @returns - */ -export const CustomThemeProvider = ({ children, themeOptions: customThemeOptions }: { children: React.ReactNode; themeOptions?: ThemeOptions }) => { - const theme = createTheme(customThemeOptions || themeOptions); - return {children}; -}; - -// TODO: think -export const getComponentProps = () => {}; diff --git a/packages/components/src/theme/wind-theme.css b/packages/components/src/theme/wind-theme.css deleted file mode 100644 index 859b3d1..0000000 --- a/packages/components/src/theme/wind-theme.css +++ /dev/null @@ -1,76 +0,0 @@ -@import 'tailwindcss'; - -@theme { - --color-primary: #ffc107; - --color-secondary: #ffa000; - --color-success: #28a745; - --color-scrollbar-thumb: #999999; - --color-scrollbar-track: rgba(0, 0, 0, 0.1); - --color-scrollbar-thumb-hover: #666666; - --scrollbar-color: #ffc107; /* 滚动条颜色 */ -} - -html, -body { - width: 100%; - height: 100%; - font-size: 16px; - font-family: 'Montserrat', sans-serif; -} -/* font-family */ -@utility font-family-mon { - font-family: 'Montserrat', sans-serif; -} -@utility font-family-rob { - font-family: 'Roboto', sans-serif; -} -@utility font-family-int { - font-family: 'Inter', sans-serif; -} -@utility font-family-orb { - font-family: 'Orbitron', sans-serif; -} -@utility font-family-din { - font-family: 'DIN', sans-serif; -} - -@utility flex-row-center { - @apply flex flex-row items-center justify-center; -} -@utility flex-col-center { - @apply flex flex-col items-center justify-center; -} - -@utility scrollbar { - overflow: auto; - /* 整个滚动条 */ - &::-webkit-scrollbar { - width: 3px; - height: 3px; - } - &::-webkit-scrollbar-track { - background-color: var(--color-scrollbar-track); - } - /* 滚动条有滑块的轨道部分 */ - &::-webkit-scrollbar-track-piece { - background-color: transparent; - border-radius: 1px; - } - - /* 滚动条滑块(竖向:vertical 横向:horizontal) */ - &::-webkit-scrollbar-thumb { - cursor: pointer; - background-color: var(--color-scrollbar-thumb); - border-radius: 5px; - } - - /* 滚动条滑块hover */ - &::-webkit-scrollbar-thumb:hover { - background-color: var(--color-scrollbar-thumb-hover); - } - - /* 同时有垂直和水平滚动条时交汇的部分 */ - &::-webkit-scrollbar-corner { - display: block; /* 修复交汇时出现的白块 */ - } -} diff --git a/packages/components/tsconfig.json b/packages/components/tsconfig.json deleted file mode 100644 index c63af6e..0000000 --- a/packages/components/tsconfig.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "compilerOptions": { - "jsx": "react-jsx", - "target": "ES2020", - "useDefineForClassFields": true, - "lib": [ - "ES2020", - "DOM", - "DOM.Iterable" - ], - "module": "ESNext", - "skipLibCheck": true, - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "isolatedModules": true, - "moduleDetection": "force", - "noEmit": true, - "baseUrl": "./", - "typeRoots": [ - "node_modules/@types", - "node_modules/@kevisual/types", - ], - "paths": { - "@kevisual/components/*": [ - "src/*" - ] - }, - /* Linting */ - "strict": true, - "noImplicitAny": false, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noFallthroughCasesInSwitch": true - }, - "include": [ - "src", - "typings.d.ts", - ] -} \ No newline at end of file diff --git a/packages/kevisual-official b/packages/kevisual-official new file mode 160000 index 0000000..313cba3 --- /dev/null +++ b/packages/kevisual-official @@ -0,0 +1 @@ +Subproject commit 313cba38de5c9cea0d5defd42a1a602cd2ecc0d9 diff --git a/packages/resources/src/index.ts b/packages/resources/src/index.ts index 1198a49..c2310a6 100644 --- a/packages/resources/src/index.ts +++ b/packages/resources/src/index.ts @@ -2,4 +2,6 @@ export { KeyParse, keysTips } from './pages/file/modules/key-parse'; export { PermissionManager } from './pages/file/modules/PermissionManager.tsx'; export { PermissionModal, usePermissionModal } from './pages/file/modules/PermissionModal.tsx'; export { iText } from './i-text/index.ts'; -export * from './pages/upload/app'; + +export { uploadFiles, uploadFileChunked, getDirectoryAndName, toFile, createDirectory } from './pages/upload/app'; +export { DialogDirectory, DialogDeleteDirectory } from './pages/upload/DialogDirectory'; diff --git a/packages/resources/src/pages/file/index.tsx b/packages/resources/src/pages/file/index.tsx index d82e64e..c31121e 100644 --- a/packages/resources/src/pages/file/index.tsx +++ b/packages/resources/src/pages/file/index.tsx @@ -1,34 +1,39 @@ -import { useEffect, useMemo } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import { useResourceStore } from '../store/resource'; -import { Box, Button, Typography, ButtonGroup } from '@mui/material'; -import { FileText, Table, Grid } from 'lucide-react'; +import { Box, Button, Typography, ButtonGroup, Tooltip } from '@mui/material'; +import { FileText, Table, Grid, Trash, Upload, FolderPlus, RefreshCw } from 'lucide-react'; import { FileTable } from './list/FileTable'; import { FileCard } from './list/FileCard'; import { PrefixRedirect } from './modules/PrefixRedirect'; import { UploadButton } from '../upload'; import { FileDrawer } from './draw/FileDrawer'; import { useResourceFileStore } from '../store/resource-file'; -import { IconButtonItem } from '@kevisual/components/button/index.tsx'; +import { IconButtonItem, IconButton } from '@kevisual/components/button/index.tsx'; +import { useTranslation } from 'react-i18next'; +import { DialogDeleteDirectory, DialogDirectory } from '../upload/DialogDirectory'; export const FileApp = () => { - const { getList, prefix, setListType, listType } = useResourceStore(); + const { getList, prefix, setListType, listType, onOpenPrefix } = useResourceStore(); const { getStatFile, prefix: statPrefix, openDrawer } = useResourceFileStore(); useEffect(() => { getList(); }, []); - const directory = useMemo(() => { - const _prefix = prefix.split('/'); - let dir = _prefix.slice(2).join('/'); - if (dir.endsWith('/')) { - dir = dir.slice(0, -1); - } - return dir; - }, [prefix]); + useEffect(() => { if (statPrefix && openDrawer) { getStatFile(); } }, [statPrefix, openDrawer]); - const handleUpload = (res: any) => { + + const paths = ['root', ...prefix.split('/').filter((item) => item)]; + const [_mockUsername, appKey, version, ...directory] = paths; + const directoryPath = directory.join('/'); + const [dialogDeleteDirectory, setDialogDeleteDirectory] = useState(false); + const [dialogDirectory, setDialogDirectory] = useState(false); + const { t } = useTranslation(); + const onDirectoryClick = (prefix: string) => { + onOpenPrefix(prefix); + }; + const onUloadFinish = (res: any) => { getList(); }; return ( @@ -55,7 +60,75 @@ export const FileApp = () => { - + + { + onDirectoryClick(prefix); + }}> + + + + {true && ( + <> + + setDialogDirectory(true)}> + + + + setDialogDirectory(false)} + onSuccess={(newPrefix) => { + const currentPath = [appKey, version, newPrefix].filter(Boolean).join('/'); + onDirectoryClick(currentPath + '/'); + setDialogDirectory(false); + }} + prefix={directoryPath} + opts={{ + appKey, + version, + }} + /> + + )} + {true && ( + <> + + + } directory={directoryPath} onUpload={onUloadFinish} /> + + + + + + + + + )} + {directoryPath !== '' && ( + <> + + { + setDialogDeleteDirectory(true); + }}> + + + + setDialogDeleteDirectory(false)} + onSuccess={(prefix) => { + const newPrefix = prefix.split('/').slice(0, -1).join('/'); + setDialogDeleteDirectory(false); + onDirectoryClick(newPrefix + '/'); + }} + prefix={appKey + '/' + version + '/' + directoryPath} + /> + + )} + + + + ); +}; + +type DialogDeleteDirectoryProps = { + open: boolean; + onClose: () => void; + onSuccess: (directory: string) => void; + prefix?: string; +}; +export const DialogDeleteDirectory = (props: DialogDeleteDirectoryProps) => { + const { open, onClose, onSuccess, prefix } = props; + const { t } = useTranslation(); + const { deleteDirectory } = useResourceFileStore(); + const onClick = async () => { + if (!prefix) { + toast.error(t('directory_name_required')); + return; + } + await deleteDirectory(prefix!, { + onSuccess: () => { + if (onSuccess) { + onSuccess(prefix!); + } else { + onClose(); + } + }, + }); + }; + return ( + + {t('delete_directory')} + +
确认删除目录: {`${prefix}/`}
+
+ + + + +
+ ); +}; diff --git a/packages/resources/src/pages/upload/app.ts b/packages/resources/src/pages/upload/app.ts index 1906e23..0c8a09f 100644 --- a/packages/resources/src/pages/upload/app.ts +++ b/packages/resources/src/pages/upload/app.ts @@ -3,3 +3,5 @@ export * from './tools/to-file'; export * from './utils/upload'; export * from './utils/upload-chunk'; + +export * from './utils/create-directory'; \ No newline at end of file diff --git a/packages/resources/src/pages/upload/index.tsx b/packages/resources/src/pages/upload/index.tsx index a704c10..502bf81 100644 --- a/packages/resources/src/pages/upload/index.tsx +++ b/packages/resources/src/pages/upload/index.tsx @@ -4,7 +4,7 @@ import { uploadFiles } from './utils/upload'; import { FileText, CloudUpload as UploadIcon } from 'lucide-react'; import { uploadFileChunked } from './utils/upload-chunk'; import { filterFiles } from './utils/filter-files'; - +import { IconButton } from '@kevisual/components/button/index.tsx'; type UploadButtonProps = { /** * 前缀 @@ -77,18 +77,7 @@ export const UploadButton = (props: UploadButtonProps) => { if (onlyIcon) { return uploadCom; } - return ( - - - - ); + return {uploadCom}; }; export const Upload = ({ uploadDirectory = false }: { uploadDirectory?: boolean }) => { const onDrop = async (acceptedFiles) => { diff --git a/packages/resources/src/pages/upload/tools/to-file.ts b/packages/resources/src/pages/upload/tools/to-file.ts index 8d09352..1072e24 100644 --- a/packages/resources/src/pages/upload/tools/to-file.ts +++ b/packages/resources/src/pages/upload/tools/to-file.ts @@ -32,6 +32,11 @@ const getFileType = (extension: string) => { const checkIsBase64 = (content: string) => { return content.startsWith('data:'); }; +/** + * 获取文件的目录和文件名 + * @param filename 文件名 + * @returns 目录和文件名 + */ export const getDirectoryAndName = (filename: string) => { if (!filename) { return null; @@ -87,3 +92,14 @@ export const toFile = (content: string, filename: string) => { return new File([blob], filename, { type }); } }; + +/** + * 把字符串转为文本文件 + * @param content 字符串 + * @param filename 文件名 + * @returns 文件流 + */ +export const toTextFile = (content: string = 'keep directory exist', filename: string = 'keep.txt') => { + const file = toFile(content, filename); + return file; +}; diff --git a/packages/resources/src/pages/upload/utils/create-directory.ts b/packages/resources/src/pages/upload/utils/create-directory.ts new file mode 100644 index 0000000..488e5f1 --- /dev/null +++ b/packages/resources/src/pages/upload/utils/create-directory.ts @@ -0,0 +1,50 @@ +import { toTextFile } from '../app'; +import { ConvertOpts, uploadFileChunked } from './upload-chunk'; +/** + * 对创建的directory的路径进行解析, + * 如果是 nameA/nameB/nameC 则创建 nameA/nameB/nameC + * + * 不能以.开头,不能以.结尾,不能以/开头,不能以/结尾。 + * @param directory + * @param opts + * @returns + */ +export const createDirectory = async (directory: string = '', opts?: ConvertOpts) => { + const directoryPath = directory || opts?.directory; + const error = '目录名不能以.开头,不能以.结尾,不能以/开头,不能以/结尾,不能包含//'; + const errorMsg = () => { + return { + code: 400, + message: error, + success: false, + }; + }; + if (directoryPath) { + if (directoryPath.startsWith('.')) { + return errorMsg(); + } + if (directoryPath.endsWith('.')) { + return errorMsg(); + } + if (directoryPath.startsWith('/')) { + return errorMsg(); + } + if (directoryPath.endsWith('/')) { + return errorMsg(); + } + if (directoryPath.includes('//')) { + return errorMsg(); + } + } + const res = await uploadFileChunked(toTextFile('keep directory exist', 'keep.txt'), { + directory, + ...opts, + }); + return res as { + code: number; + message?: string; + success?: boolean; + data?: any; + [key: string]: any; + }; +}; diff --git a/packages/resources/src/pages/upload/utils/upload-chunk.ts b/packages/resources/src/pages/upload/utils/upload-chunk.ts index 21deb8c..0c0c757 100644 --- a/packages/resources/src/pages/upload/utils/upload-chunk.ts +++ b/packages/resources/src/pages/upload/utils/upload-chunk.ts @@ -4,7 +4,7 @@ import { toast } from 'react-toastify'; import { nanoid } from 'nanoid'; import { toastLogin } from '@kevisual/resources/pages/message/ToastLogin'; -type ConvertOpts = { +export type ConvertOpts = { appKey?: string; version?: string; username?: string; diff --git a/packages/resources/src/pages/upload/utils/upload.ts b/packages/resources/src/pages/upload/utils/upload.ts index 463b579..8d15188 100644 --- a/packages/resources/src/pages/upload/utils/upload.ts +++ b/packages/resources/src/pages/upload/utils/upload.ts @@ -11,6 +11,19 @@ type ConvertOpts = { }; export const uploadFiles = async (files: File[], opts: ConvertOpts) => { const { directory, appKey, version, username } = opts; + const length = files.length; + const maxSize = 10 * 1024 * 1024; // 10MB + const totalSize = files.reduce((acc, file) => acc + file.size, 0); + if (totalSize > maxSize) { + toast.error('有文件大小不能超过10MB'); + return; + } + const maxCount = 10; + if (length > maxCount) { + toast.error(`最多只能上传${maxCount}个文件`); + return; + } + toast.info(`上传中,共${length}个文件`); return new Promise((resolve, reject) => { const formData = new FormData(); const webkitRelativePath = files[0]?.webkitRelativePath; @@ -43,10 +56,7 @@ export const uploadFiles = async (files: File[], opts: ConvertOpts) => { return; } const taskId = nanoid(); - // 49.232.155.236:11015 - // const eventSource = new EventSource('https://kevisual.silkyai.cn/api/s1/events?taskId=' + taskId); const eventSource = new EventSource('/api/s1/events?taskId=' + taskId); - // const eventSource = new EventSource('http://49.232.155.236:11015/api/s1/events?taskId=' + taskId); const load = toast.loading('上传中...'); NProgress.start(); eventSource.onopen = async function (event) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4845875..8a17bc9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -272,7 +272,7 @@ importers: version: 4.23.10(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.36.4) '@vitejs/plugin-basic-ssl': specifier: ^2.0.0 - version: 2.0.0(vite@6.2.2(@types/node@22.13.11)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1)) + version: 2.0.0(vite@6.2.3(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1)) codemirror: specifier: ^6.0.1 version: 6.0.1 @@ -360,6 +360,8 @@ importers: specifier: ^3.0.2 version: 3.0.2 + packages/kevisual-official: {} + packages/resources: dependencies: '@emotion/react': @@ -388,7 +390,7 @@ importers: version: 0.2.3 '@vitejs/plugin-basic-ssl': specifier: ^2.0.0 - version: 2.0.0(vite@6.2.2(@types/node@22.13.11)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1)) + version: 2.0.0(vite@6.2.3(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1)) dayjs: specifier: ^1.11.13 version: 1.11.13 @@ -471,6 +473,208 @@ importers: specifier: ^8.4.0 version: 8.4.0(jiti@2.4.2)(postcss@8.5.3)(typescript@5.8.2)(yaml@2.5.1) + submodules/wallnote: + dependencies: + '@ant-design/icons': + specifier: ^6.0.0 + version: 6.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@emotion/react': + specifier: ^11.14.0 + version: 11.14.0(@types/react@19.0.12)(react@19.0.0) + '@emotion/styled': + specifier: ^11.14.0 + version: 11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0) + '@kevisual/cache': + specifier: ^0.0.1 + version: 0.0.1(rollup@4.36.0)(tslib@2.8.1)(typescript@5.8.2) + '@kevisual/query': + specifier: 0.0.15 + version: 0.0.15(ws@8.18.1) + '@kevisual/router': + specifier: 0.0.9 + version: 0.0.9 + '@kevisual/system-lib': + specifier: 0.0.21 + version: 0.0.21 + '@kevisual/system-ui': + specifier: ^0.0.3 + version: 0.0.3 + '@mui/material': + specifier: ^6.4.8 + version: 6.4.8(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.0.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react@19.0.0))(@types/react@19.0.12)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@tiptap/core': + specifier: ^2.11.5 + version: 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/extension-code-block-lowlight': + specifier: ^2.11.5 + version: 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/extension-code-block@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(highlight.js@11.11.1)(lowlight@3.3.0) + '@tiptap/extension-document': + specifier: ^2.11.5 + version: 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-highlight': + specifier: ^2.11.5 + version: 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-paragraph': + specifier: ^2.11.5 + version: 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-placeholder': + specifier: ^2.11.5 + version: 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-text': + specifier: ^2.11.5 + version: 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-typography': + specifier: ^2.11.5 + version: 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/pm': + specifier: ^2.11.5 + version: 2.11.5 + '@tiptap/starter-kit': + specifier: ^2.11.5 + version: 2.11.5 + '@tiptap/suggestion': + specifier: ^2.11.5 + version: 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@types/lodash-es': + specifier: ^4.17.12 + version: 4.17.12 + '@types/turndown': + specifier: ^5.0.5 + version: 5.0.5 + '@xyflow/react': + specifier: ^12.4.4 + version: 12.4.4(@types/react@19.0.12)(immer@10.1.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + clsx: + specifier: ^2.1.1 + version: 2.1.1 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + eventemitter3: + specifier: ^5.0.1 + version: 5.0.1 + github-markdown-css: + specifier: ^5.8.1 + version: 5.8.1 + highlight.js: + specifier: ^11.11.1 + version: 11.11.1 + idb: + specifier: ^8.0.2 + version: 8.0.2 + idb-keyval: + specifier: ^6.2.1 + version: 6.2.1 + immer: + specifier: ^10.1.1 + version: 10.1.1 + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + lowlight: + specifier: ^3.3.0 + version: 3.3.0 + lucide-react: + specifier: ^0.484.0 + version: 0.484.0(react@19.0.0) + marked: + specifier: ^15.0.7 + version: 15.0.7 + nanoid: + specifier: ^5.1.5 + version: 5.1.5 + react: + specifier: ^19.0.0 + version: 19.0.0 + react-dom: + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) + react-draggable: + specifier: ^4.4.6 + version: 4.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-resizable: + specifier: ^3.0.5 + version: 3.0.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-resizable-panels: + specifier: ^2.1.7 + version: 2.1.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-router: + specifier: ^7.4.0 + version: 7.4.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-router-dom: + specifier: ^7.4.0 + version: 7.4.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-toastify: + specifier: ^11.0.5 + version: 11.0.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + tiptap-markdown: + specifier: ^0.8.10 + version: 0.8.10(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + turndown: + specifier: ^7.2.0 + version: 7.2.0 + zustand: + specifier: ^5.0.3 + version: 5.0.3(@types/react@19.0.12)(immer@10.1.1)(react@19.0.0)(use-sync-external-store@1.4.0(react@19.0.0)) + devDependencies: + '@eslint/js': + specifier: ^9.23.0 + version: 9.23.0 + '@kevisual/types': + specifier: ^0.0.6 + version: 0.0.6 + '@tailwindcss/vite': + specifier: ^4.0.16 + version: 4.0.16(vite@6.2.3(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1)) + '@types/node': + specifier: ^22.13.13 + version: 22.13.13 + '@types/react': + specifier: ^19.0.12 + version: 19.0.12 + '@types/react-dom': + specifier: ^19.0.4 + version: 19.0.4(@types/react@19.0.12) + '@types/react-resizable': + specifier: ^3.0.8 + version: 3.0.8 + '@vitejs/plugin-basic-ssl': + specifier: ^2.0.0 + version: 2.0.0(vite@6.2.3(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1)) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.3.4(vite@6.2.3(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1)) + eslint: + specifier: ^9.23.0 + version: 9.23.0(jiti@2.4.2) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@9.23.0(jiti@2.4.2)) + eslint-plugin-react-refresh: + specifier: ^0.4.19 + version: 0.4.19(eslint@9.23.0(jiti@2.4.2)) + globals: + specifier: ^16.0.0 + version: 16.0.0 + tailwind-merge: + specifier: ^3.0.2 + version: 3.0.2 + tailwindcss: + specifier: ^4.0.16 + version: 4.0.16 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@4.0.16) + typescript: + specifier: ^5.8.2 + version: 5.8.2 + typescript-eslint: + specifier: ^8.28.0 + version: 8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2) + vite: + specifier: ^6.2.3 + version: 6.2.3(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1) + packages: '@ampproject/remapping@2.3.0': @@ -996,6 +1200,12 @@ packages: '@kevisual/store@0.0.2': resolution: {integrity: sha512-+PPqm0zn2hNHj6Udvvm2LquCFpwj5c/yX1tR2ZmpntgtamRUXfxA6fdbu7gQZ8AS8ZkLNlPqeVw3VOWTQOaC6g==} + '@kevisual/system-lib@0.0.21': + resolution: {integrity: sha512-smJ/UeimBS1AxCJEhYAu1cixzNjXS7w64m/4XCrfqJRtgNKX2uB412bfeQAslr9wBq7gvlx3b6Wt9M5kFXQrWA==} + + '@kevisual/system-ui@0.0.3': + resolution: {integrity: sha512-zRtUnL6wNe6R1W7X6eirDADZWeTmxZCNpLwxCLu30yeNuIhpFJdxHyOg0nX9aOZn6F0Kb6lB3Li2fZpKwdpk0w==} + '@kevisual/types@0.0.6': resolution: {integrity: sha512-7yxe1QmuC5g7lI/1Hm+zXly8if0z+ZqGM1SVOVv2VNRwRAVYBJDc365zWCCfRwE+5YaB2daWTe5zBOU4EkltkQ==} @@ -1029,6 +1239,9 @@ packages: '@marijn/find-cluster-break@1.0.2': resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + '@mixmark-io/domino@2.2.0': + resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} + '@monaco-editor/loader@1.5.0': resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==} @@ -1279,6 +1492,9 @@ packages: react: '>=18.0.0' react-dom: '>=18.0.0' + '@remirror/core-constants@3.0.0': + resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + '@rollup/plugin-commonjs@28.0.3': resolution: {integrity: sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==} engines: {node: '>=16.0.0 || 14 >= 14.17'} @@ -1429,81 +1645,301 @@ packages: '@tailwindcss/node@4.0.15': resolution: {integrity: sha512-IODaJjNmiasfZX3IoS+4Em3iu0fD2HS0/tgrnkYfW4hyUor01Smnr5eY3jc4rRgaTDrJlDmBTHbFO0ETTDaxWA==} + '@tailwindcss/node@4.0.16': + resolution: {integrity: sha512-T6IK79hoCFScxD5tRxWMtwqwSs4sT81Vw+YbzL7RZD0/Ndm4y5kboV7LdQ97YGH6udoOZyVT/uEfrnU2L5Nkog==} + '@tailwindcss/oxide-android-arm64@4.0.15': resolution: {integrity: sha512-EBuyfSKkom7N+CB3A+7c0m4+qzKuiN0WCvzPvj5ZoRu4NlQadg/mthc1tl5k9b5ffRGsbDvP4k21azU4VwVk3Q==} engines: {node: '>= 10'} cpu: [arm64] os: [android] + '@tailwindcss/oxide-android-arm64@4.0.16': + resolution: {integrity: sha512-mieEZrNLHatpQu6ad0pWBnL8ObUE9ZSe4eoX6GKTqsKv98AxNw5lUa5nJM0FgD8rYJeZ2dPtHNN/YM2xY9R+9g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + '@tailwindcss/oxide-darwin-arm64@4.0.15': resolution: {integrity: sha512-ObVAnEpLepMhV9VoO0JSit66jiN5C4YCqW3TflsE9boo2Z7FIjV80RFbgeL2opBhtxbaNEDa6D0/hq/EP03kgQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] + '@tailwindcss/oxide-darwin-arm64@4.0.16': + resolution: {integrity: sha512-pfilSvgrX5UDdjh09gGVMhAPfZVucm4AnwFBkwBe6WFl7gzMAZ92/35GC0yMDeS+W+RNSXclXJz+HamF1iS/aA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@tailwindcss/oxide-darwin-x64@4.0.15': resolution: {integrity: sha512-IElwoFhUinOr9MyKmGTPNi1Rwdh68JReFgYWibPWTGuevkHkLWKEflZc2jtI5lWZ5U9JjUnUfnY43I4fEXrc4g==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@tailwindcss/oxide-darwin-x64@4.0.16': + resolution: {integrity: sha512-Z3lJY3yUjlHbzgXwWH9Y6IGeSGXfwjbXuvTPolyJUGMZl2ZaHdQMPOZ8dMll1knSLjctOif+QijMab0+GSXYLQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@tailwindcss/oxide-freebsd-x64@4.0.15': resolution: {integrity: sha512-6BLLqyx7SIYRBOnTZ8wgfXANLJV5TQd3PevRJZp0vn42eO58A2LykRKdvL1qyPfdpmEVtF+uVOEZ4QTMqDRAWA==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] + '@tailwindcss/oxide-freebsd-x64@4.0.16': + resolution: {integrity: sha512-dv2U8Yc7vKIDyiJkUouhjsl+dTfRImNyZRCTFsHvvrhJvenYZBRtE/wDSYlZHR0lWKhIocxk1ScAkAcMR3F3QQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.15': resolution: {integrity: sha512-Zy63EVqO9241Pfg6G0IlRIWyY5vNcWrL5dd2WAKVJZRQVeolXEf1KfjkyeAAlErDj72cnyXObEZjMoPEKHpdNw==} engines: {node: '>= 10'} cpu: [arm] os: [linux] + '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.16': + resolution: {integrity: sha512-XBRXyUUyjMg5UMiyuQxJqWSs27w0V49g1iPuhrFakmu1/idDSly59XYteRrI2onoS9AzmMwfyzdiQSJXM89+PQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + '@tailwindcss/oxide-linux-arm64-gnu@4.0.15': resolution: {integrity: sha512-2NemGQeaTbtIp1Z2wyerbVEJZTkAWhMDOhhR5z/zJ75yMNf8yLnE+sAlyf6yGDNr+1RqvWrRhhCFt7i0CIxe4Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@tailwindcss/oxide-linux-arm64-gnu@4.0.16': + resolution: {integrity: sha512-+bL1zkU8MDzv389OqyI0SJbrG9kGsdxf+k2ZAILlw1TPWg5oeMkwoqgaQRqGwpOHz0pycT94qIgWVNJavAz+Iw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@tailwindcss/oxide-linux-arm64-musl@4.0.15': resolution: {integrity: sha512-342GVnhH/6PkVgKtEzvNVuQ4D+Q7B7qplvuH20Cfz9qEtydG6IQczTZ5IT4JPlh931MG1NUCVxg+CIorr1WJyw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@tailwindcss/oxide-linux-arm64-musl@4.0.16': + resolution: {integrity: sha512-Uqfnyx9oFxoX+/iy9pIDTADHLLNwuZNB8QSp+BwKAhtHjBTTYmDAdxKy3u8lJZve1aOd+S145eWpn3tT08cm4w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@tailwindcss/oxide-linux-x64-gnu@4.0.15': resolution: {integrity: sha512-g76GxlKH124RuGqacCEFc2nbzRl7bBrlC8qDQMiUABkiifDRHOIUjgKbLNG4RuR9hQAD/MKsqZ7A8L08zsoBrw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@tailwindcss/oxide-linux-x64-gnu@4.0.16': + resolution: {integrity: sha512-v0Hx0KD94F6FG0IW3AJyCzQepSv/47xhShCgiWJ2TNVu406VtREkGpJtxS0Gu1ecSXhgn/36LToU5kivAuQiPg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@tailwindcss/oxide-linux-x64-musl@4.0.15': resolution: {integrity: sha512-Gg/Y1XrKEvKpq6WeNt2h8rMIKOBj/W3mNa5NMvkQgMC7iO0+UNLrYmt6zgZufht66HozNpn+tJMbbkZ5a3LczA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@tailwindcss/oxide-linux-x64-musl@4.0.16': + resolution: {integrity: sha512-CjV6hhQAVNYw6W2EXp1ZVL81CTSBEh6nTmS5EZq5rdEhqOx8G8YQtFKjcCJiojsS+vMXt9r87gGoORJcHOA0lg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@tailwindcss/oxide-win32-arm64-msvc@4.0.15': resolution: {integrity: sha512-7QtSSJwYZ7ZK1phVgcNZpuf7c7gaCj8Wb0xjliligT5qCGCp79OV2n3SJummVZdw4fbTNKUOYMO7m1GinppZyA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@tailwindcss/oxide-win32-arm64-msvc@4.0.16': + resolution: {integrity: sha512-Pj9eaAtXYH7NrvVx8Jx0U/sEaNpcIbb8d+2WnC8a+xL0LfIXWsu4AyeRUeTeb8Ty4fTGhKSJTohdXj1iSdN9WQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@tailwindcss/oxide-win32-x64-msvc@4.0.15': resolution: {integrity: sha512-JQ5H+5MLhOjpgNp6KomouE0ZuKmk3hO5h7/ClMNAQ8gZI2zkli3IH8ZqLbd2DVfXDbdxN2xvooIEeIlkIoSCqw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] + '@tailwindcss/oxide-win32-x64-msvc@4.0.16': + resolution: {integrity: sha512-M35hoFrhJe+1QdSiZpn85y8K7tfEVw6lswv3TjIfJ44JiPjPzZ4URg+rsTjTq0kue6NjNCbbY99AsRSSpJZxOw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@tailwindcss/oxide@4.0.15': resolution: {integrity: sha512-e0uHrKfPu7JJGMfjwVNyt5M0u+OP8kUmhACwIRlM+JNBuReDVQ63yAD1NWe5DwJtdaHjugNBil76j+ks3zlk6g==} engines: {node: '>= 10'} + '@tailwindcss/oxide@4.0.16': + resolution: {integrity: sha512-n++F8Rzvo/e+FYxikZgKW4sCRXneSstLhTI91Ay9toeRcE/+WO33SQWzGtgmjWJcTupXZreskJ8FCr9b+kdXew==} + engines: {node: '>= 10'} + '@tailwindcss/vite@4.0.15': resolution: {integrity: sha512-JRexava80NijI8cTcLXNM3nQL5A0ptTHI8oJLLe8z1MpNB6p5J4WCdJJP8RoyHu8/eB1JzEdbpH86eGfbuaezQ==} peerDependencies: vite: ^5.2.0 || ^6 + '@tailwindcss/vite@4.0.16': + resolution: {integrity: sha512-6mZVWhAyjVNMMRw0Pvv2RZfTttjsAClU8HouLNZbeLbX0yURMa0UYEY/qS4dB1tZlRpiDBnCLsGsWbxEyIjW6A==} + peerDependencies: + vite: ^5.2.0 || ^6 + + '@tiptap/core@2.11.5': + resolution: {integrity: sha512-jb0KTdUJaJY53JaN7ooY3XAxHQNoMYti/H6ANo707PsLXVeEqJ9o8+eBup1JU5CuwzrgnDc2dECt2WIGX9f8Jw==} + peerDependencies: + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-blockquote@2.11.5': + resolution: {integrity: sha512-MZfcRIzKRD8/J1hkt/eYv49060GTL6qGR3NY/oTDuw2wYzbQXXLEbjk8hxAtjwNn7G+pWQv3L+PKFzZDxibLuA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-bold@2.11.5': + resolution: {integrity: sha512-OAq03MHEbl7MtYCUzGuwb0VpOPnM0k5ekMbEaRILFU5ZC7cEAQ36XmPIw1dQayrcuE8GZL35BKub2qtRxyC9iA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-bullet-list@2.11.5': + resolution: {integrity: sha512-VXwHlX6A/T6FAspnyjbKDO0TQ+oetXuat6RY1/JxbXphH42nLuBaGWJ6pgy6xMl6XY8/9oPkTNrfJw/8/eeRwA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-code-block-lowlight@2.11.5': + resolution: {integrity: sha512-EIE+mAGsp8C69dI0Yyg+VH1x36rgyPJc93SfA7h4xFF6Oth18z4YhJtiLaZcwCMyOOVs2efApZ0R3/Fnz2VlqA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/extension-code-block': ^2.7.0 + '@tiptap/pm': ^2.7.0 + highlight.js: ^11 + lowlight: ^2 || ^3 + + '@tiptap/extension-code-block@2.11.5': + resolution: {integrity: sha512-ksxMMvqLDlC+ftcQLynqZMdlJT1iHYZorXsXw/n+wuRd7YElkRkd6YWUX/Pq/njFY6lDjKiqFLEXBJB8nrzzBA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-code@2.11.5': + resolution: {integrity: sha512-xOvHevNIQIcCCVn9tpvXa1wBp0wHN/2umbAZGTVzS+AQtM7BTo0tz8IyzwxkcZJaImONcUVYLOLzt2AgW1LltA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-document@2.11.5': + resolution: {integrity: sha512-7I4BRTpIux2a0O2qS3BDmyZ5LGp3pszKbix32CmeVh7lN9dV7W5reDqtJJ9FCZEEF+pZ6e1/DQA362dflwZw2g==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-dropcursor@2.11.5': + resolution: {integrity: sha512-uIN7L3FU0904ec7FFFbndO7RQE/yiON4VzAMhNn587LFMyWO8US139HXIL4O8dpZeYwYL3d1FnDTflZl6CwLlg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-gapcursor@2.11.5': + resolution: {integrity: sha512-kcWa+Xq9cb6lBdiICvLReuDtz/rLjFKHWpW3jTTF3FiP3wx4H8Rs6bzVtty7uOVTfwupxZRiKICAMEU6iT0xrQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-hard-break@2.11.5': + resolution: {integrity: sha512-q9doeN+Yg9F5QNTG8pZGYfNye3tmntOwch683v0CCVCI4ldKaLZ0jG3NbBTq+mosHYdgOH2rNbIORlRRsQ+iYQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-heading@2.11.5': + resolution: {integrity: sha512-x/MV53psJ9baRcZ4k4WjnCUBMt8zCX7mPlKVT+9C/o+DEs/j/qxPLs95nHeQv70chZpSwCQCt93xMmuF0kPoAg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-highlight@2.11.5': + resolution: {integrity: sha512-VBZfT869L9CiTLF8qr+3FBUtJcmlyUTECORNo0ceEiNDg4H6V9uNPwaROMXrWiQCc+DYVCOkx541QrXwNMzxlg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-history@2.11.5': + resolution: {integrity: sha512-b+wOS33Dz1azw6F1i9LFTEIJ/gUui0Jwz5ZvmVDpL2ZHBhq1Ui0/spTT+tuZOXq7Y/uCbKL8Liu4WoedIvhboQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-horizontal-rule@2.11.5': + resolution: {integrity: sha512-3up2r1Du8/5/4ZYzTC0DjTwhgPI3dn8jhOCLu73m5F3OGvK/9whcXoeWoX103hYMnGDxBlfOje71yQuN35FL4A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-italic@2.11.5': + resolution: {integrity: sha512-9VGfb2/LfPhQ6TjzDwuYLRvw0A6VGbaIp3F+5Mql8XVdTBHb2+rhELbyhNGiGVR78CaB/EiKb6dO9xu/tBWSYA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-list-item@2.11.5': + resolution: {integrity: sha512-Mp5RD/pbkfW1vdc6xMVxXYcta73FOwLmblQlFNn/l/E5/X1DUSA4iGhgDDH4EWO3swbs03x2f7Zka/Xoj3+WLg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-ordered-list@2.11.5': + resolution: {integrity: sha512-Cu8KwruBNWAaEfshRQR0yOSaUKAeEwxW7UgbvF9cN/zZuKgK5uZosPCPTehIFCcRe+TBpRtZQh+06f/gNYpYYg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-paragraph@2.11.5': + resolution: {integrity: sha512-YFBWeg7xu/sBnsDIF/+nh9Arf7R0h07VZMd0id5Ydd2Qe3c1uIZwXxeINVtH0SZozuPIQFAT8ICe9M0RxmE+TA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-placeholder@2.11.5': + resolution: {integrity: sha512-Pr+0Ju/l2ZvXMd9VQxtaoSZbs0BBp1jbBDqwms88ctpyvQFRfLSfSkqudQcSHyw2ROOz2E31p/7I7fpI8Y0CLA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-strike@2.11.5': + resolution: {integrity: sha512-PVfUiCqrjvsLpbIoVlegSY8RlkR64F1Rr2RYmiybQfGbg+AkSZXDeO0eIrc03//4gua7D9DfIozHmAKv1KN3ow==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text-style@2.11.5': + resolution: {integrity: sha512-YUmYl0gILSd/u/ZkOmNxjNXVw+mu8fpC2f8G4I4tLODm0zCx09j9DDEJXSrM5XX72nxJQqtSQsCpNKnL0hfeEQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text@2.11.5': + resolution: {integrity: sha512-Gq1WwyhFpCbEDrLPIHt5A8aLSlf8bfz4jm417c8F/JyU0J5dtYdmx0RAxjnLw1i7ZHE7LRyqqAoS0sl7JHDNSQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-typography@2.11.5': + resolution: {integrity: sha512-K+mwkyyH3bhnw8f6dKt0AIIh7ipPPVTY5XiWxm1ZMnS6p7TkXeqSJRU6mT1a47YLX4IGBEMlTQdvDVvJ1hwTjA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/pm@2.11.5': + resolution: {integrity: sha512-z9JFtqc5ZOsdQLd9vRnXfTCQ8v5ADAfRt9Nm7SqP6FUHII8E1hs38ACzf5xursmth/VonJYb5+73Pqxk1hGIPw==} + + '@tiptap/starter-kit@2.11.5': + resolution: {integrity: sha512-SLI7Aj2ruU1t//6Mk8f+fqW+18uTqpdfLUJYgwu0CkqBckrkRZYZh6GVLk/02k3H2ki7QkFxiFbZrdbZdng0JA==} + + '@tiptap/suggestion@2.11.5': + resolution: {integrity: sha512-uafwGgB5YuKX/xLRjnt2H5eA21I8HcNXpdbH4Du2gg3KM71RpUbkyjaV7KEMA/5qwCEo+sddlpuErj4wBycZ5Q==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1519,6 +1955,24 @@ packages: '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -1534,15 +1988,33 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/linkify-it@3.0.5': + resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + '@types/lodash-es@4.17.12': resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} '@types/lodash@4.17.16': resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} + '@types/markdown-it@13.0.9': + resolution: {integrity: sha512-1XPwR0+MgXLWfTn9gCsZ55AHOKW1WN+P9vr0PaQh5aerR9LLQXUbjfEAFhjmEmyoYFWAyuN2Mqkn40MZ4ukjBw==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdurl@1.0.5': + resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/node-fetch@2.6.12': resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} @@ -1555,6 +2027,9 @@ packages: '@types/node@22.13.11': resolution: {integrity: sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g==} + '@types/node@22.13.13': + resolution: {integrity: sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==} + '@types/nprogress@0.2.3': resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} @@ -1578,6 +2053,9 @@ packages: peerDependencies: '@types/react': ^19.0.0 + '@types/react-resizable@3.0.8': + resolution: {integrity: sha512-Pcvt2eGA7KNXldt1hkhVhAgZ8hK41m0mp89mFgQi7LAAEZiaLgm4fHJ5zbJZ/4m2LVaAyYrrRRv1LHDcrGQanA==} + '@types/react-transition-group@4.4.12': resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} peerDependencies: @@ -1589,6 +2067,9 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/turndown@5.0.5': + resolution: {integrity: sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w==} + '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -1603,6 +2084,14 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/eslint-plugin@8.28.0': + resolution: {integrity: sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/parser@8.27.0': resolution: {integrity: sha512-XGwIabPallYipmcOk45DpsBSgLC64A0yvdAkrwEzwZ2viqGqRUJ8eEYoPz0CWnutgAFbNMPdsGGvzjSmcWVlEA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1610,10 +2099,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/parser@8.28.0': + resolution: {integrity: sha512-LPcw1yHD3ToaDEoljFEfQ9j2xShY367h7FZ1sq5NJT9I3yj4LHer1Xd1yRSOdYy9BpsrxU7R+eoDokChYM53lQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/scope-manager@8.27.0': resolution: {integrity: sha512-8oI9GwPMQmBryaaxG1tOZdxXVeMDte6NyJA4i7/TWa4fBwgnAXYlIQP+uYOeqAaLJ2JRxlG9CAyL+C+YE9Xknw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.28.0': + resolution: {integrity: sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@8.27.0': resolution: {integrity: sha512-wVArTVcz1oJOIEJxui/nRhV0TXzD/zMSOYi/ggCfNq78EIszddXcJb7r4RCp/oBrjt8n9A0BSxRMKxHftpDxDA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1621,16 +2121,33 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/type-utils@8.28.0': + resolution: {integrity: sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/types@8.27.0': resolution: {integrity: sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.28.0': + resolution: {integrity: sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.27.0': resolution: {integrity: sha512-BnKq8cqPVoMw71O38a1tEb6iebEgGA80icSxW7g+kndx0o6ot6696HjG7NdgfuAVmVEtwXUr3L8R9ZuVjoQL6A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/typescript-estree@8.28.0': + resolution: {integrity: sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/utils@8.27.0': resolution: {integrity: sha512-njkodcwH1yvmo31YWgRHNb/x1Xhhq4/m81PhtvmRngD8iHPehxffz1SNCO+kwaePhATC+kOa/ggmvPoPza5i0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1638,10 +2155,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/utils@8.28.0': + resolution: {integrity: sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/visitor-keys@8.27.0': resolution: {integrity: sha512-WsXQwMkILJvffP6z4U3FYJPlbf/j07HIxmDjZpbNvBJkMfvwXj5ACRkkHwBDvLBbDbtX5TdU64/rcvKJ/vuInQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.28.0': + resolution: {integrity: sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@uiw/codemirror-theme-duotone@4.23.10': resolution: {integrity: sha512-h2lIubEMNBZNEvYVMjt08QUt0DhFKXIl44hTU+a60AoL+YLlDJw26KlNbUvHxyqTDZwaX2TZKR5APF14lU+sYA==} @@ -1680,6 +2208,15 @@ packages: '@xterm/xterm@5.5.0': resolution: {integrity: sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==} + '@xyflow/react@12.4.4': + resolution: {integrity: sha512-9RZ9dgKZNJOlbrXXST5HPb5TcXPOIDGondjwcjDro44OQRPl1E0ZRPTeWPGaQtVjbg4WpR4BUYwOeshNI2TuVg==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + + '@xyflow/system@0.0.52': + resolution: {integrity: sha512-pJBMaoh/GEebIABWEIxAai0yf57dm+kH7J/Br+LnLFPuJL87Fhcmm4KFWd/bCUy/kCWUg+2/yFAGY0AUHRPOnQ==} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -1819,12 +2356,19 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + classcat@5.0.5: + resolution: {integrity: sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==} + classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -1904,6 +2448,44 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} @@ -2192,6 +2774,10 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + github-markdown-css@5.8.1: + resolution: {integrity: sha512-8G+PFvqigBQSWLQjyzgpa2ThD9bo7+kDsriUIidGcRhXgmcaAWUIpCZf8DavJgc+xifjbCG+GvMyWr0XMXmc7g==} + engines: {node: '>=10'} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2299,6 +2885,9 @@ packages: idb-keyval@6.2.1: resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + idb@8.0.2: + resolution: {integrity: sha512-CX70rYhx7GDDQzwwQMDwF6kDRQi5vVs6khHUumDrMecBylKkwvZ8HWvKV08AGb7VbpoGCWUQ4aHzNDgoUiOIUg==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2314,6 +2903,9 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -2483,6 +3075,9 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2508,6 +3103,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lowlight@3.3.0: + resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -2524,9 +3122,21 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + lucide-react@0.484.0: + resolution: {integrity: sha512-oZy8coK9kZzvqhSgfbGkPtTgyjpBvs3ukLgDPv14dSOZtBtboryWF5o8i3qen7QbGg7JhiJBz5mK1p8YoMZTLQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + markdown-it-task-lists@2.1.1: + resolution: {integrity: sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + marked-highlight@2.2.1: resolution: {integrity: sha512-SiCIeEiQbs9TxGwle9/OwbOejHCZsohQRaNTY2u8euEXYt2rYUFoiImUirThU3Gd/o6Q1gHGtH9qloHlbJpNIA==} peerDependencies: @@ -2544,6 +3154,9 @@ packages: mdast-util-to-hast@13.2.0: resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -2660,6 +3273,9 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -2802,6 +3418,68 @@ packages: property-information@7.0.0: resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + prosemirror-changeset@2.2.1: + resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} + + prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + + prosemirror-commands@1.7.0: + resolution: {integrity: sha512-6toodS4R/Aah5pdsrIwnTYPEjW70SlO5a66oo5Kk+CIrgJz3ukOoS+FYDGqvQlAX5PxoGWDX1oD++tn5X3pyRA==} + + prosemirror-dropcursor@1.8.1: + resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==} + + prosemirror-gapcursor@1.3.2: + resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} + + prosemirror-history@1.4.1: + resolution: {integrity: sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==} + + prosemirror-inputrules@1.5.0: + resolution: {integrity: sha512-K0xJRCmt+uSw7xesnHmcn72yBGTbY45vm8gXI4LZXbx2Z0jwh5aF9xrGQgrVPu0WbyFVFF3E/o9VhJYz6SQWnA==} + + prosemirror-keymap@1.2.2: + resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} + + prosemirror-markdown@1.13.2: + resolution: {integrity: sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==} + + prosemirror-menu@1.2.4: + resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==} + + prosemirror-model@1.25.0: + resolution: {integrity: sha512-/8XUmxWf0pkj2BmtqZHYJipTBMHIdVjuvFzMvEoxrtyGNmfvdhBiRwYt/eFwy2wA9DtBW3RLqvZnjurEkHaFCw==} + + prosemirror-schema-basic@1.2.4: + resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} + + prosemirror-schema-list@1.5.1: + resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} + + prosemirror-state@1.4.3: + resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} + + prosemirror-tables@1.6.4: + resolution: {integrity: sha512-TkDY3Gw52gRFRfRn2f4wJv5WOgAOXLJA2CQJYIJ5+kdFbfj3acR4JUW6LX2e1hiEBiUwvEhzH5a3cZ5YSztpIA==} + + prosemirror-trailing-node@3.0.0: + resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} + peerDependencies: + prosemirror-model: ^1.22.1 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.33.8 + + prosemirror-transform@1.10.3: + resolution: {integrity: sha512-Nhh/+1kZGRINbEHmVu39oynhcap4hWTs/BlU7NnxWj3+l0qi8I1mu67v6mMdEe/ltD8hHvU4FV6PHiCw2VSpMw==} + + prosemirror-view@1.38.1: + resolution: {integrity: sha512-4FH/uM1A4PNyrxXbD+RAbAsf0d/mM0D/wAKSVVWK7o0A9Q/oOXJBrw786mBf2Vnrs/Edly6dH6Z2gsb7zWwaUw==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3056,6 +3734,12 @@ packages: peerDependencies: react: ^19.0.0 + react-draggable@4.4.6: + resolution: {integrity: sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + react-dropzone@14.3.8: resolution: {integrity: sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug==} engines: {node: '>= 10.13'} @@ -3100,6 +3784,11 @@ packages: react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-resizable@3.0.5: + resolution: {integrity: sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w==} + peerDependencies: + react: '>= 16.3' + react-router-dom@7.4.0: resolution: {integrity: sha512-VlksBPf3n2bijPvnA7nkTsXxMAKOj+bWp4R9c3i+bnwlSOFAGOkJkKhzy/OsRkWaBMICqcAl1JDzh9ZSOze9CA==} engines: {node: '>=20.0.0'} @@ -3197,6 +3886,9 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3311,6 +4003,9 @@ packages: style-mod@4.1.2: resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} + style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} @@ -3344,6 +4039,9 @@ packages: tailwindcss@4.0.15: resolution: {integrity: sha512-6ZMg+hHdMJpjpeCCFasX7K+U615U9D+7k5/cDK/iRwl6GptF24+I/AbKgOnXhVKePzrEyIXutLv36n4cRsq3Sg==} + tailwindcss@4.0.16: + resolution: {integrity: sha512-i/SbG7ThTIcLshcFJL+je7hCv9dPis4Xl4XNeel6iZNX42pp/BZ+la+SbZIPoYE+PN8zhKbnHblpQ/lhOWwIeQ==} + tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -3371,6 +4069,11 @@ packages: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} + tiptap-markdown@0.8.10: + resolution: {integrity: sha512-iDVkR2BjAqkTDtFX0h94yVvE2AihCXlF0Q7RIXSJPRSR5I0PA1TMuAg6FHFpmqTn4tPxJ0by0CK7PUMlnFLGEQ==} + peerDependencies: + '@tiptap/core': ^2.0.3 + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3462,6 +4165,9 @@ packages: resolution: {integrity: sha512-N9FDOVaY3yz0YCOhYIgOGYad7+m2ptvinXygw27WPLQvcZDl3+0Sa77KGVlLSiuPDChOUEnTKE9VJwLSi9BPGQ==} hasBin: true + turndown@7.2.0: + resolution: {integrity: sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -3473,6 +4179,13 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + typescript-eslint@8.28.0: + resolution: {integrity: sha512-jfZtxJoHm59bvoCMYCe2BM0/baMswRhMmYhy+w6VfcyHrjxZ0OJe0tGasydCpIpA+A/WIJhTyZfb3EtwNC/kHQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + typescript-paths@1.5.1: resolution: {integrity: sha512-lYErSLCON2MSplVV5V/LBgD4UNjMgY3guATdFCZY2q1Nr6OZEu4q6zX/rYMsG1TaWqqQSszg6C9EU7AGWMDrIw==} peerDependencies: @@ -3483,6 +4196,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -3578,6 +4294,46 @@ packages: yaml: optional: true + vite@6.2.3: + resolution: {integrity: sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + void-elements@3.1.0: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} @@ -4374,6 +5130,14 @@ snapshots: - rollup - utf-8-validate + '@kevisual/system-lib@0.0.21': {} + + '@kevisual/system-ui@0.0.3': + dependencies: + dayjs: 1.11.13 + lodash-es: 4.17.21 + style-to-object: 1.0.8 + '@kevisual/types@0.0.6': {} '@lezer/common@1.2.3': {} @@ -4423,6 +5187,8 @@ snapshots: '@marijn/find-cluster-break@1.0.2': {} + '@mixmark-io/domino@2.2.0': {} + '@monaco-editor/loader@1.5.0': dependencies: state-local: 1.0.7 @@ -4680,6 +5446,8 @@ snapshots: react-dom: 19.0.0(react@19.0.0) react-is: 18.3.1 + '@remirror/core-constants@3.0.0': {} + '@rollup/plugin-commonjs@28.0.3(rollup@4.36.0)': dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.36.0) @@ -4792,39 +5560,78 @@ snapshots: jiti: 2.4.2 tailwindcss: 4.0.15 + '@tailwindcss/node@4.0.16': + dependencies: + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + tailwindcss: 4.0.16 + '@tailwindcss/oxide-android-arm64@4.0.15': optional: true + '@tailwindcss/oxide-android-arm64@4.0.16': + optional: true + '@tailwindcss/oxide-darwin-arm64@4.0.15': optional: true + '@tailwindcss/oxide-darwin-arm64@4.0.16': + optional: true + '@tailwindcss/oxide-darwin-x64@4.0.15': optional: true + '@tailwindcss/oxide-darwin-x64@4.0.16': + optional: true + '@tailwindcss/oxide-freebsd-x64@4.0.15': optional: true + '@tailwindcss/oxide-freebsd-x64@4.0.16': + optional: true + '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.15': optional: true + '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.16': + optional: true + '@tailwindcss/oxide-linux-arm64-gnu@4.0.15': optional: true + '@tailwindcss/oxide-linux-arm64-gnu@4.0.16': + optional: true + '@tailwindcss/oxide-linux-arm64-musl@4.0.15': optional: true + '@tailwindcss/oxide-linux-arm64-musl@4.0.16': + optional: true + '@tailwindcss/oxide-linux-x64-gnu@4.0.15': optional: true + '@tailwindcss/oxide-linux-x64-gnu@4.0.16': + optional: true + '@tailwindcss/oxide-linux-x64-musl@4.0.15': optional: true + '@tailwindcss/oxide-linux-x64-musl@4.0.16': + optional: true + '@tailwindcss/oxide-win32-arm64-msvc@4.0.15': optional: true + '@tailwindcss/oxide-win32-arm64-msvc@4.0.16': + optional: true + '@tailwindcss/oxide-win32-x64-msvc@4.0.15': optional: true + '@tailwindcss/oxide-win32-x64-msvc@4.0.16': + optional: true + '@tailwindcss/oxide@4.0.15': optionalDependencies: '@tailwindcss/oxide-android-arm64': 4.0.15 @@ -4839,6 +5646,20 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.0.15 '@tailwindcss/oxide-win32-x64-msvc': 4.0.15 + '@tailwindcss/oxide@4.0.16': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.0.16 + '@tailwindcss/oxide-darwin-arm64': 4.0.16 + '@tailwindcss/oxide-darwin-x64': 4.0.16 + '@tailwindcss/oxide-freebsd-x64': 4.0.16 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.16 + '@tailwindcss/oxide-linux-arm64-gnu': 4.0.16 + '@tailwindcss/oxide-linux-arm64-musl': 4.0.16 + '@tailwindcss/oxide-linux-x64-gnu': 4.0.16 + '@tailwindcss/oxide-linux-x64-musl': 4.0.16 + '@tailwindcss/oxide-win32-arm64-msvc': 4.0.16 + '@tailwindcss/oxide-win32-x64-msvc': 4.0.16 + '@tailwindcss/vite@4.0.15(vite@6.2.2(@types/node@22.13.11)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1))': dependencies: '@tailwindcss/node': 4.0.15 @@ -4847,6 +5668,170 @@ snapshots: tailwindcss: 4.0.15 vite: 6.2.2(@types/node@22.13.11)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1) + '@tailwindcss/vite@4.0.16(vite@6.2.3(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1))': + dependencies: + '@tailwindcss/node': 4.0.16 + '@tailwindcss/oxide': 4.0.16 + lightningcss: 1.29.2 + tailwindcss: 4.0.16 + vite: 6.2.3(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1) + + '@tiptap/core@2.11.5(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-blockquote@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-bold@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-bullet-list@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-code-block-lowlight@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/extension-code-block@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(highlight.js@11.11.1)(lowlight@3.3.0)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/extension-code-block': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + highlight.js: 11.11.1 + lowlight: 3.3.0 + + '@tiptap/extension-code-block@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-code@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-document@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-dropcursor@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-gapcursor@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-hard-break@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-heading@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-highlight@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-history@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-horizontal-rule@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-italic@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-list-item@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-ordered-list@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-paragraph@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-placeholder@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + + '@tiptap/extension-strike@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-text-style@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-text@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/extension-typography@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + + '@tiptap/pm@2.11.5': + dependencies: + prosemirror-changeset: 2.2.1 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.7.0 + prosemirror-dropcursor: 1.8.1 + prosemirror-gapcursor: 1.3.2 + prosemirror-history: 1.4.1 + prosemirror-inputrules: 1.5.0 + prosemirror-keymap: 1.2.2 + prosemirror-markdown: 1.13.2 + prosemirror-menu: 1.2.4 + prosemirror-model: 1.25.0 + prosemirror-schema-basic: 1.2.4 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.3 + prosemirror-tables: 1.6.4 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1) + prosemirror-transform: 1.10.3 + prosemirror-view: 1.38.1 + + '@tiptap/starter-kit@2.11.5': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/extension-blockquote': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-bold': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-bullet-list': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-code': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-code-block': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-document': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-dropcursor': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-gapcursor': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-hard-break': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-heading': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-history': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-horizontal-rule': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) + '@tiptap/extension-italic': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-list-item': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-ordered-list': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-paragraph': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-strike': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-text': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/extension-text-style': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)) + '@tiptap/pm': 2.11.5 + + '@tiptap/suggestion@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)': + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@tiptap/pm': 2.11.5 + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.26.10 @@ -4870,6 +5855,27 @@ snapshots: '@types/cookie@0.6.0': {} + '@types/d3-color@3.1.3': {} + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-selection@3.0.11': {} + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + '@types/estree@1.0.6': {} '@types/hast@2.3.10': @@ -4884,24 +5890,42 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/linkify-it@3.0.5': {} + + '@types/linkify-it@5.0.0': {} + '@types/lodash-es@4.17.12': dependencies: '@types/lodash': 4.17.16 '@types/lodash@4.17.16': {} + '@types/markdown-it@13.0.9': + dependencies: + '@types/linkify-it': 3.0.5 + '@types/mdurl': 1.0.5 + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 + '@types/mdurl@1.0.5': {} + + '@types/mdurl@2.0.0': {} + '@types/node-fetch@2.6.12': dependencies: - '@types/node': 22.13.11 + '@types/node': 22.13.13 form-data: 4.0.2 '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.13.11 + '@types/node': 22.13.13 '@types/node@18.19.81': dependencies: @@ -4911,6 +5935,10 @@ snapshots: dependencies: undici-types: 6.20.0 + '@types/node@22.13.13': + dependencies: + undici-types: 6.20.0 + '@types/nprogress@0.2.3': {} '@types/parse-json@4.0.2': {} @@ -4929,6 +5957,10 @@ snapshots: dependencies: '@types/react': 19.0.12 + '@types/react-resizable@3.0.8': + dependencies: + '@types/react': 19.0.12 + '@types/react-transition-group@4.4.12(@types/react@19.0.12)': dependencies: '@types/react': 19.0.12 @@ -4939,6 +5971,8 @@ snapshots: '@types/resolve@1.20.2': {} + '@types/turndown@5.0.5': {} + '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} @@ -4960,6 +5994,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/scope-manager': 8.28.0 + '@typescript-eslint/type-utils': 8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/utils': 8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.28.0 + eslint: 9.23.0(jiti@2.4.2) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@8.27.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)': dependencies: '@typescript-eslint/scope-manager': 8.27.0 @@ -4972,11 +6023,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.28.0 + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.28.0 + debug: 4.4.0 + eslint: 9.23.0(jiti@2.4.2) + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.27.0': dependencies: '@typescript-eslint/types': 8.27.0 '@typescript-eslint/visitor-keys': 8.27.0 + '@typescript-eslint/scope-manager@8.28.0': + dependencies: + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/visitor-keys': 8.28.0 + '@typescript-eslint/type-utils@8.27.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)': dependencies: '@typescript-eslint/typescript-estree': 8.27.0(typescript@5.8.2) @@ -4988,8 +6056,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)': + dependencies: + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2) + '@typescript-eslint/utils': 8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2) + debug: 4.4.0 + eslint: 9.23.0(jiti@2.4.2) + ts-api-utils: 2.1.0(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@8.27.0': {} + '@typescript-eslint/types@8.28.0': {} + '@typescript-eslint/typescript-estree@8.27.0(typescript@5.8.2)': dependencies: '@typescript-eslint/types': 8.27.0 @@ -5004,6 +6085,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.28.0(typescript@5.8.2)': + dependencies: + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/visitor-keys': 8.28.0 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.1.0(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.27.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)': dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0(jiti@2.4.2)) @@ -5015,11 +6110,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2)': + dependencies: + '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.28.0 + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.2) + eslint: 9.23.0(jiti@2.4.2) + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.27.0': dependencies: '@typescript-eslint/types': 8.27.0 eslint-visitor-keys: 4.2.0 + '@typescript-eslint/visitor-keys@8.28.0': + dependencies: + '@typescript-eslint/types': 8.28.0 + eslint-visitor-keys: 4.2.0 + '@uiw/codemirror-theme-duotone@4.23.10(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.36.4)': dependencies: '@uiw/codemirror-themes': 4.23.10(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.36.4) @@ -5056,6 +6167,10 @@ snapshots: dependencies: vite: 6.2.2(@types/node@22.13.11)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1) + '@vitejs/plugin-basic-ssl@2.0.0(vite@6.2.3(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1))': + dependencies: + vite: 6.2.3(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1) + '@vitejs/plugin-react@4.3.4(vite@6.2.2(@types/node@22.13.11)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1))': dependencies: '@babel/core': 7.26.10 @@ -5067,8 +6182,40 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitejs/plugin-react@4.3.4(vite@6.2.3(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1))': + dependencies: + '@babel/core': 7.26.10 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 6.2.3(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1) + transitivePeerDependencies: + - supports-color + '@xterm/xterm@5.5.0': {} + '@xyflow/react@12.4.4(@types/react@19.0.12)(immer@10.1.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@xyflow/system': 0.0.52 + classcat: 5.0.5 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + zustand: 4.5.6(@types/react@19.0.12)(immer@10.1.1)(react@19.0.0) + transitivePeerDependencies: + - '@types/react' + - immer + + '@xyflow/system@0.0.52': + dependencies: + '@types/d3-drag': 3.0.7 + '@types/d3-selection': 3.0.11 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + d3-drag: 3.0.0 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -5245,6 +6392,8 @@ snapshots: dependencies: readdirp: 4.1.2 + classcat@5.0.5: {} + classnames@2.5.1: {} cliui@6.0.0: @@ -5253,6 +6402,8 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 + clsx@1.2.1: {} + clsx@2.1.1: {} codemirror@6.0.1: @@ -5329,6 +6480,42 @@ snapshots: csstype@3.1.3: {} + d3-color@3.1.0: {} + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-ease@3.0.1: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-selection@3.0.0: {} + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + 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 + + d3-zoom@3.0.0: + 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) + date-fns@4.1.0: {} dayjs@1.11.13: {} @@ -5642,6 +6829,8 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + github-markdown-css@5.8.1: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -5779,6 +6968,8 @@ snapshots: idb-keyval@6.2.1: {} + idb@8.0.2: {} + ignore@5.3.2: {} immer@10.1.1: {} @@ -5790,6 +6981,8 @@ snapshots: imurmurhash@0.1.4: {} + inline-style-parser@0.2.4: {} + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -5917,6 +7110,10 @@ snapshots: lines-and-columns@1.2.4: {} + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + load-tsconfig@0.2.5: {} locate-path@5.0.0: @@ -5937,6 +7134,12 @@ snapshots: dependencies: js-tokens: 4.0.0 + lowlight@3.3.0: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + highlight.js: 11.11.1 + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -5951,10 +7154,25 @@ snapshots: dependencies: react: 19.0.0 + lucide-react@0.484.0(react@19.0.0): + dependencies: + react: 19.0.0 + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + markdown-it-task-lists@2.1.1: {} + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + marked-highlight@2.2.1(marked@15.0.7): dependencies: marked: 15.0.7 @@ -5975,6 +7193,8 @@ snapshots: unist-util-visit: 5.0.0 vfile: 6.0.3 + mdurl@2.0.0: {} + merge2@1.4.1: {} micromark-util-character@2.1.1: @@ -6072,6 +7292,8 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + orderedmap@2.1.1: {} + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -6187,6 +7409,111 @@ snapshots: property-information@7.0.0: {} + prosemirror-changeset@2.2.1: + dependencies: + prosemirror-transform: 1.10.3 + + prosemirror-collab@1.3.1: + dependencies: + prosemirror-state: 1.4.3 + + prosemirror-commands@1.7.0: + dependencies: + prosemirror-model: 1.25.0 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.3 + + prosemirror-dropcursor@1.8.1: + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.3 + prosemirror-view: 1.38.1 + + prosemirror-gapcursor@1.3.2: + dependencies: + prosemirror-keymap: 1.2.2 + prosemirror-model: 1.25.0 + prosemirror-state: 1.4.3 + prosemirror-view: 1.38.1 + + prosemirror-history@1.4.1: + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.3 + prosemirror-view: 1.38.1 + rope-sequence: 1.3.4 + + prosemirror-inputrules@1.5.0: + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.3 + + prosemirror-keymap@1.2.2: + dependencies: + prosemirror-state: 1.4.3 + w3c-keyname: 2.2.8 + + prosemirror-markdown@1.13.2: + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + prosemirror-model: 1.25.0 + + prosemirror-menu@1.2.4: + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.7.0 + prosemirror-history: 1.4.1 + prosemirror-state: 1.4.3 + + prosemirror-model@1.25.0: + dependencies: + orderedmap: 2.1.1 + + prosemirror-schema-basic@1.2.4: + dependencies: + prosemirror-model: 1.25.0 + + prosemirror-schema-list@1.5.1: + dependencies: + prosemirror-model: 1.25.0 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.3 + + prosemirror-state@1.4.3: + dependencies: + prosemirror-model: 1.25.0 + prosemirror-transform: 1.10.3 + prosemirror-view: 1.38.1 + + prosemirror-tables@1.6.4: + dependencies: + prosemirror-keymap: 1.2.2 + prosemirror-model: 1.25.0 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.3 + prosemirror-view: 1.38.1 + + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.0)(prosemirror-state@1.4.3)(prosemirror-view@1.38.1): + dependencies: + '@remirror/core-constants': 3.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.25.0 + prosemirror-state: 1.4.3 + prosemirror-view: 1.38.1 + + prosemirror-transform@1.10.3: + dependencies: + prosemirror-model: 1.25.0 + + prosemirror-view@1.38.1: + dependencies: + prosemirror-model: 1.25.0 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.3 + + punycode.js@2.3.1: {} + punycode@2.3.1: {} qrcode@1.5.4: @@ -6534,6 +7861,13 @@ snapshots: react: 19.0.0 scheduler: 0.25.0 + react-draggable@4.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + clsx: 1.2.1 + prop-types: 15.8.1 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + react-dropzone@14.3.8(react@19.0.0): dependencies: attr-accept: 2.2.5 @@ -6567,6 +7901,14 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) + react-resizable@3.0.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + prop-types: 15.8.1 + react: 19.0.0 + react-draggable: 4.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + transitivePeerDependencies: + - react-dom + react-router-dom@7.4.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 @@ -6694,6 +8036,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.36.0 fsevents: 2.3.3 + rope-sequence@1.3.4: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -6805,6 +8149,10 @@ snapshots: style-mod@4.1.2: {} + style-to-object@1.0.8: + dependencies: + inline-style-parser: 0.2.4 + stylis@4.2.0: {} stylis@4.3.6: {} @@ -6833,8 +8181,14 @@ snapshots: dependencies: tailwindcss: 4.0.15 + tailwindcss-animate@1.0.7(tailwindcss@4.0.16): + dependencies: + tailwindcss: 4.0.16 + tailwindcss@4.0.15: {} + tailwindcss@4.0.16: {} + tapable@2.2.1: {} terser@5.39.0: @@ -6861,6 +8215,14 @@ snapshots: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 + tiptap-markdown@0.8.10(@tiptap/core@2.11.5(@tiptap/pm@2.11.5)): + dependencies: + '@tiptap/core': 2.11.5(@tiptap/pm@2.11.5) + '@types/markdown-it': 13.0.9 + markdown-it: 14.1.0 + markdown-it-task-lists: 2.1.1 + prosemirror-markdown: 1.13.2 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -6943,6 +8305,10 @@ snapshots: turbo-windows-64: 2.4.4 turbo-windows-arm64: 2.4.4 + turndown@7.2.0: + dependencies: + '@mixmark-io/domino': 2.2.0 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -6957,12 +8323,24 @@ snapshots: transitivePeerDependencies: - supports-color + typescript-eslint@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2): + dependencies: + '@typescript-eslint/eslint-plugin': 8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/parser': 8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/utils': 8.28.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.8.2) + eslint: 9.23.0(jiti@2.4.2) + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + typescript-paths@1.5.1(typescript@5.8.2): dependencies: typescript: 5.8.2 typescript@5.8.2: {} + uc.micro@2.1.0: {} + undici-types@5.26.5: {} undici-types@6.20.0: {} @@ -7055,6 +8433,19 @@ snapshots: terser: 5.39.0 yaml: 2.5.1 + vite@6.2.3(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.5.1): + dependencies: + esbuild: 0.25.1 + postcss: 8.5.3 + rollup: 4.36.0 + optionalDependencies: + '@types/node': 22.13.13 + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.29.2 + terser: 5.39.0 + yaml: 2.5.1 + void-elements@3.1.0: {} w3c-keyname@2.2.8: {} diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 55c0e5f..97b570e 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -79,5 +79,10 @@ "Workspace Config Tips": "Set the default workspace, when there is no specific space to open, the default workspace will be opened. The collection information module, the position of the added resource, will be placed here by default. For example, the WeChat public account's essay.", "Add Config Tips": "Add configuration, when the key exists, the data update of the key will be queried first, if the key does not exist, the new configuration will be added.", "VIP Config": "VIP Config", - "VIP Config Tips": "VIP Config, only the admin can configure." + "VIP Config Tips": "VIP Config, only the admin can configure.", + "directory_name_required": "Directory name is required", + "delete_directory": "Delete Directory", + "delete_directory_success": "Delete directory success", + "create_directory": "Create Directory", + "create_directory_success": "Create directory success" } \ No newline at end of file diff --git a/public/locales/zh/translation.json b/public/locales/zh/translation.json index aa9d7f6..b0c1a65 100644 --- a/public/locales/zh/translation.json +++ b/public/locales/zh/translation.json @@ -79,5 +79,10 @@ "Workspace Config Tips": "设置默认的工作空间,当没有打开具体的空间的时候,默认打开的工作空间。收集信息的模块,添加的资源的位置,默认放到这里。比如,微信公众号的随笔。", "Add Config Tips": "添加配置,当key存在的时候,会优先查询key数据的更新,如果key不存在,则新增配置。", "VIP Config": "VIP配置", - "VIP Config Tips": "VIP配置,只有管理员才能配置。" + "VIP Config Tips": "VIP配置,只有管理员才能配置。", + "directory_name_required": "目录名称是必须的", + "delete_directory": "删除目录", + "delete_directory_success": "删除目录成功", + "create_directory": "创建目录", + "create_directory_success": "创建目录成功" } \ No newline at end of file diff --git a/src/modules/layout/LayoutUser.tsx b/src/modules/layout/LayoutUser.tsx index 3ff6384..8158c0b 100644 --- a/src/modules/layout/LayoutUser.tsx +++ b/src/modules/layout/LayoutUser.tsx @@ -31,28 +31,6 @@ export const LayoutUser = () => { }, []); const navigate = useNewNavigate(); const { t } = useTranslation(); - const meun = [ - { - title: t('Your profile'), - icon: , - link: '/user/profile', - }, - { - title: t('Your orgs'), - icon: , - link: '/org/edit/list', - }, - { - title: t('Site Map'), - icon: , - link: '/map', - }, - { - title: t('Domain'), - icon: , - link: '/domain/edit/list', - }, - ]; const items = useMemo(() => { const orgs = store.me?.orgs || []; return orgs.map((item) => { @@ -63,7 +41,43 @@ export const LayoutUser = () => { }; }); }, [store.me]); - + const menu = useMemo(() => { + const orgs = store.me?.orgs || []; + const hasOrg = orgs.length > 0; + const items = [ + { + title: t('Your profile'), + icon: , + link: '/user/profile', + }, + { + title: t('Your orgs'), + icon: , + link: '/org/edit/list', + isOrg: true, + }, + { + title: t('Site Map'), + icon: , + link: '/map', + }, + { + title: t('Domain'), + icon: , + link: '/domain/edit/list', + isAdmin: true, + }, + ]; + return items.filter((item) => { + if (item.isOrg) { + return hasOrg; + } + if (item.isAdmin) { + return isAdmin; + } + return true; + }); + }, [store.me]); const [anchorEl, setAnchorEl] = React.useState(null); const handleClick = (event: React.MouseEvent) => { @@ -101,7 +115,7 @@ export const LayoutUser = () => {
- {meun.map((item, index) => { + {menu.map((item, index) => { return (
{
} /> - } - /> + /> */} } /> { + + { + message.info('联系管理员'); + }}> + + +
@@ -307,9 +318,9 @@ export const List = () => { {item.id}
- {item.domain && ( + {item?.data?.domain && (
- {t('app.domain')}: {item.domain} + {t('app.domain')}: {item?.data?.domain}
)}
diff --git a/src/pages/file/edit/List.tsx b/src/pages/file/edit/List.tsx index f639466..3031862 100644 --- a/src/pages/file/edit/List.tsx +++ b/src/pages/file/edit/List.tsx @@ -12,9 +12,10 @@ import UploadOutlined from '@ant-design/icons/lib/icons/UploadOutlined'; import { Tooltip } from '@mui/material'; import { useResourceFileStore } from '@kevisual/resources/pages/store/resource-file.ts'; import { FileDrawerApp } from '@kevisual/resources/pages/file/draw/FileDrawer.tsx'; -import { RefreshCw, Upload } from 'lucide-react'; +import { Delete, FolderPlus, RefreshCw, Trash, Upload } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { UploadButton } from '@kevisual/resources/pages/upload/index.tsx'; +import { DialogDirectory, DialogDeleteDirectory } from '@kevisual/resources/pages/upload/DialogDirectory.tsx'; export const CardPath = ({ children }: any) => { const userAppStore = useFileStore( useShallow((state) => { @@ -26,6 +27,8 @@ export const CardPath = ({ children }: any) => { }; }), ); + const [dialogDirectory, setDialogDirectory] = useState(false); + const [dialogDeleteDirectory, setDialogDeleteDirectory] = useState(false); const paths = ['root', ...userAppStore.path.split('/').filter((item) => item)]; const onDirectoryClick = (prefix: string) => { if (prefix === 'root') { @@ -38,13 +41,14 @@ export const CardPath = ({ children }: any) => { }; const { t } = useTranslation(); - const [usrname, appKey, version] = paths; + const [_username, appKey, version, ...directory] = paths; const onUloadFinish = (res: any) => { console.log(res); userAppStore.getList(); }; + const directoryPath = directory.join('/'); return ( -
+
@@ -78,25 +82,81 @@ export const CardPath = ({ children }: any) => { + {version && ( + <> + + setDialogDirectory(true)}> + + + + setDialogDirectory(false)} + onSuccess={(newPrefix) => { + const currentPath = appKey + '/' + version + '/' + newPrefix; + onDirectoryClick(currentPath); + setDialogDirectory(false); + }} + prefix={directoryPath} + opts={{ + appKey, + version, + }} + /> + + )} {version && ( <> - } appKey={appKey} version={version} username={usrname} onUpload={onUloadFinish} /> + } + directory={directoryPath} + appKey={appKey} + version={version} + onUpload={onUloadFinish} + /> - + )} + {version && directoryPath && ( + <> + + { + setDialogDeleteDirectory(true); + }}> + + + + setDialogDeleteDirectory(false)} + onSuccess={(prefix) => { + const newPrefix = prefix.split('/').slice(0, -1).join('/'); + setDialogDeleteDirectory(false); + onDirectoryClick(newPrefix); + }} + prefix={appKey + '/' + version + '/' + directoryPath} + /> + + )}
-
{children}
+
+ {children} +
); }; diff --git a/submodules/query-login b/submodules/query-login index e0bf83f..05f0373 160000 --- a/submodules/query-login +++ b/submodules/query-login @@ -1 +1 @@ -Subproject commit e0bf83f06293c3bea51f62558ffdf1eb07192249 +Subproject commit 05f037383436cd0e30a6a12e7a4e08bf5b884ea8 diff --git a/submodules/query-mark b/submodules/query-mark new file mode 160000 index 0000000..a617a68 --- /dev/null +++ b/submodules/query-mark @@ -0,0 +1 @@ +Subproject commit a617a68e2f436b996b255af61cd212d191482d7e diff --git a/submodules/wallnote b/submodules/wallnote new file mode 160000 index 0000000..4d0e945 --- /dev/null +++ b/submodules/wallnote @@ -0,0 +1 @@ +Subproject commit 4d0e945a92eea77784dd4fdf790fc2471e20b8c7 diff --git a/vite.config.ts b/vite.config.ts index a0822f4..092b342 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,22 +3,8 @@ import react from '@vitejs/plugin-react'; import path from 'path'; import tailwindcss from '@tailwindcss/vite'; import basicSsl from '@vitejs/plugin-basic-ssl'; - const isDev = process.env.NODE_ENV === 'development'; -const unamiPlugin = { - name: 'html-transform', - transformIndexHtml(html: string) { - return html.replace( - '', - ``, - ); - }, -}; const plugins: any[] = [basicSsl()]; -if (!isDev) { - plugins.push(unamiPlugin); -} - plugins.push(tailwindcss()); const devBackend = 'https://kevisual.silkyai.cn'; // const meBackend = 'https://kevisual.xiongxiao.me';