From 78f237e6601ccc7f3e62e4c21a53f68888c30240 Mon Sep 17 00:00:00 2001 From: rxliuli Date: Thu, 8 Aug 2024 04:45:09 +0800 Subject: [PATCH] =?UTF-8?q?feat(joplin-batch):=20=E5=AE=9E=E7=8E=B0=20repl?= =?UTF-8?q?ace=20all?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/joplin-batch/components.json | 17 + packages/joplin-batch/jpl.config.ts | 10 +- packages/joplin-batch/package.json | 31 +- packages/joplin-batch/postcss.config.js | 6 + packages/joplin-batch/src/index.ts | 64 +- packages/joplin-batch/src/message.ts | 2 + packages/joplin-batch/src/webview/App.tsx | 126 +- .../src/webview/assets/favicon.svg | 120 ++ .../webview/components/3rd/ZoomableImage.tsx | 27 + .../src/webview/components/ui/alert.tsx | 43 + .../src/webview/components/ui/button.tsx | 47 + .../src/webview/components/ui/card.tsx | 43 + .../src/webview/components/ui/dialog.tsx | 95 + .../src/webview/components/ui/drawer.tsx | 87 + .../src/webview/components/ui/input.tsx | 22 + .../src/webview/components/ui/label.tsx | 17 + .../src/webview/components/ui/scroll-area.tsx | 38 + .../src/webview/components/ui/separator.tsx | 20 + .../src/webview/components/ui/sheet.tsx | 107 ++ packages/joplin-batch/src/webview/index.html | 3 +- packages/joplin-batch/src/webview/index.tsx | 18 +- .../joplin-batch/src/webview/lib/dataApi.ts | 32 + .../joplin-batch/src/webview/lib/pageUtil.ts | 25 + .../joplin-batch/src/webview/lib/utils.ts | 6 + .../src/webview/lib/webviewDataApi.ts | 30 + packages/joplin-batch/src/webview/styles.css | 72 +- .../src/webview/views/DemoView.tsx | 33 + .../src/webview/views/ReplaceAllView.tsx | 175 ++ .../src/webview/views/SettingsView.tsx | 86 + .../src/webview/views/UnusedResourceView.tsx | 117 ++ packages/joplin-batch/tailwind.config.js | 72 + packages/joplin-batch/tsconfig.json | 7 +- packages/jpl-vite/package.json | 2 + packages/jpl-vite/src/__tests__/index.test.ts | 6 +- packages/jpl-vite/src/bin.ts | 22 +- packages/jpl-vite/src/build.ts | 73 +- packages/jpl-vite/src/dev.ts | 18 - packages/jpl-vite/src/index.ts | 11 + packages/jpl-vite/src/messaging.ts | 10 +- packages/jpl-vite/src/server.ts | 40 + pnpm-lock.yaml | 1635 ++++++++++++----- 41 files changed, 2837 insertions(+), 578 deletions(-) create mode 100644 packages/joplin-batch/components.json create mode 100644 packages/joplin-batch/postcss.config.js create mode 100644 packages/joplin-batch/src/webview/assets/favicon.svg create mode 100644 packages/joplin-batch/src/webview/components/3rd/ZoomableImage.tsx create mode 100644 packages/joplin-batch/src/webview/components/ui/alert.tsx create mode 100644 packages/joplin-batch/src/webview/components/ui/button.tsx create mode 100644 packages/joplin-batch/src/webview/components/ui/card.tsx create mode 100644 packages/joplin-batch/src/webview/components/ui/dialog.tsx create mode 100644 packages/joplin-batch/src/webview/components/ui/drawer.tsx create mode 100644 packages/joplin-batch/src/webview/components/ui/input.tsx create mode 100644 packages/joplin-batch/src/webview/components/ui/label.tsx create mode 100644 packages/joplin-batch/src/webview/components/ui/scroll-area.tsx create mode 100644 packages/joplin-batch/src/webview/components/ui/separator.tsx create mode 100644 packages/joplin-batch/src/webview/components/ui/sheet.tsx create mode 100644 packages/joplin-batch/src/webview/lib/dataApi.ts create mode 100644 packages/joplin-batch/src/webview/lib/pageUtil.ts create mode 100644 packages/joplin-batch/src/webview/lib/utils.ts create mode 100644 packages/joplin-batch/src/webview/lib/webviewDataApi.ts create mode 100644 packages/joplin-batch/src/webview/views/DemoView.tsx create mode 100644 packages/joplin-batch/src/webview/views/ReplaceAllView.tsx create mode 100644 packages/joplin-batch/src/webview/views/SettingsView.tsx create mode 100644 packages/joplin-batch/src/webview/views/UnusedResourceView.tsx create mode 100644 packages/joplin-batch/tailwind.config.js delete mode 100644 packages/jpl-vite/src/dev.ts create mode 100644 packages/jpl-vite/src/server.ts diff --git a/packages/joplin-batch/components.json b/packages/joplin-batch/components.json new file mode 100644 index 00000000..ae39ca2d --- /dev/null +++ b/packages/joplin-batch/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/webview/styles.css", + "baseColor": "slate", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} diff --git a/packages/joplin-batch/jpl.config.ts b/packages/joplin-batch/jpl.config.ts index 71a45cff..dc6f9717 100644 --- a/packages/joplin-batch/jpl.config.ts +++ b/packages/joplin-batch/jpl.config.ts @@ -1,5 +1,6 @@ +import path from 'path' import { defineConfig } from '../jpl-vite/dist' -import { preact } from '@preact/preset-vite' +import react from '@vitejs/plugin-react' export default defineConfig({ id: 'rxliuli.joplin-batch', @@ -15,6 +16,11 @@ export default defineConfig({ categories: ['productivity'], icons: {}, vite: { - plugins: [preact() as any], + plugins: [react() as any], + resolve: { + alias: { + '@': path.resolve(__dirname, './src/webview'), + }, + }, }, }) diff --git a/packages/joplin-batch/package.json b/packages/joplin-batch/package.json index 418e67f3..3976caa5 100644 --- a/packages/joplin-batch/package.json +++ b/packages/joplin-batch/package.json @@ -17,18 +17,41 @@ "plugin.config.json" ], "devDependencies": { - "@preact/preset-vite": "^2.8.1", - "@preact/signals": "^1.2.2", "@types/lodash-es": "^4.17.12", "@types/node": "^18.7.13", + "@types/react": "^18.3.3", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.17", "joplin-api": "workspace:^", "joplin-plugin-api": "workspace:^", "jpl-vite": "workspace:^", "lodash-es": "^4.17.21", + "postcss": "^8.4.35", + "react": "^18.3.1", "react-use": "^17.5.1", + "tailwindcss": "^3.4.1", "typescript": "^5.4.5", "vite": "^5.1.3", - "vite-node": "^1.6.0", - "preact": "^10.19.5" + "vite-node": "^1.6.0" + }, + "dependencies": { + "@liuli-util/react-router": "^0.9.4", + "@preact/signals-react": "^2.1.0", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-scroll-area": "^1.1.0", + "@radix-ui/react-separator": "^1.1.0", + "@radix-ui/react-slot": "^1.1.0", + "@types/react-dom": "^18.0.6", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "deepsignal": "^1.5.0", + "lucide-react": "^0.424.0", + "react-dom": "^18.2.0", + "react-string-replace": "^1.1.1", + "react-zoom-pan-pinch": "^3.6.1", + "tailwind-merge": "^2.4.0", + "tailwindcss-animate": "^1.0.7", + "vaul": "^0.9.1" } } diff --git a/packages/joplin-batch/postcss.config.js b/packages/joplin-batch/postcss.config.js new file mode 100644 index 00000000..2e7af2b7 --- /dev/null +++ b/packages/joplin-batch/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/packages/joplin-batch/src/index.ts b/packages/joplin-batch/src/index.ts index 00f87316..0e8f7273 100644 --- a/packages/joplin-batch/src/index.ts +++ b/packages/joplin-batch/src/index.ts @@ -1,10 +1,11 @@ -import joplin from 'joplin-plugin-api' -import { IProtocol, onMessage } from './message' +import joplin, { MenuItemLocation, ViewHandle } from 'joplin-plugin-api' +import { IProtocol } from './message' import { defineExtensionMessaging } from 'jpl-vite/messaging' +import { joplinDataApi } from 'joplin-api' +import { get } from 'lodash-es' joplin.plugins.register({ onStart: async function () { - await registerSettings() // 实现这个命令的功能,生成 markdown 文件并使用 git 推送到远端仓库 await registerCommands() await registerMenus() @@ -12,32 +13,57 @@ joplin.plugins.register({ }) async function registerCommands() { + const dataApi = joplinDataApi({ type: 'plugin' }) + + let handler: ViewHandle await joplin.commands.register({ - name: 'webviewTest', - label: 'Webview Test', + name: 'joplin-batch.visible', + label: 'Joplin Batch', async execute() { - const dialogs = joplin.views.dialogs - const handler = await dialogs.create(new Date().toISOString()) - await dialogs.addScript(handler, '/webview/index.js') - await dialogs.addScript(handler, '/webview/index.css') - await dialogs.setButtons(handler, [ - { - id: 'close', - title: 'Close', - }, - ]) - const { onMessage, sendMessage } = defineExtensionMessaging(handler) + const panels = joplin.views.panels + if (handler) { + const isVisible = await panels.visible(handler) + await panels.show(handler, !isVisible) + return + } + handler = await panels.create('Batch Utils') + await panels.addScript(handler, '/webview/index.js') + await panels.addScript(handler, '/webview/style.css') + const { onMessage } = defineExtensionMessaging(handler) let last = 0 onMessage('add', (a, b) => { last = a + b return last }) onMessage('value', () => last) - await dialogs.open(handler) + onMessage('invokeDataApi', (method, ...args) => { + const f = deepGet(dataApi, method) + if (!f) { + throw new Error(`Method ${method} not found`) + } + return f(...args) + }) + await panels.visible(handler) }, }) } -async function registerMenus() {} +async function registerMenus() { + await joplin.views.menuItems.create('joplin-batch.visible', 'joplin-batch.visible', MenuItemLocation.Tools) +} + +function deepGet(obj: any, path: string): Function | undefined { + let result = get(obj, path) -async function registerSettings() {} + // 如果结果是一个函数,我们需要绑定 this + if (typeof result === 'function') { + // 获取父对象 + const parentPath = path.split('.').slice(0, -1).join('.') + const parent = parentPath ? get(obj, parentPath) : obj + + // 绑定函数到父对象 + result = result.bind(parent) + } + + return result +} diff --git a/packages/joplin-batch/src/message.ts b/packages/joplin-batch/src/message.ts index 15b4bf9e..45fd68c5 100644 --- a/packages/joplin-batch/src/message.ts +++ b/packages/joplin-batch/src/message.ts @@ -8,6 +8,8 @@ export interface StorageValues { export interface IProtocol { add(a: number, b: number): number value(): number + + invokeDataApi(method: string, ...args: any[]): any } export const { sendMessage, onMessage } = defineExtensionMessaging('joplin-batch') diff --git a/packages/joplin-batch/src/webview/App.tsx b/packages/joplin-batch/src/webview/App.tsx index bd6daac0..9bd7233b 100644 --- a/packages/joplin-batch/src/webview/App.tsx +++ b/packages/joplin-batch/src/webview/App.tsx @@ -1,23 +1,119 @@ -import { useSignal } from '@preact/signals' -import { useInterval } from 'react-use' -import { sendMessage } from '../message' +import { Button } from './components/ui/button' +import { Link, RouteConfig, RouterView, useLocation, useMatch } from '@liuli-util/react-router' +import { DemoView } from './views/DemoView' +import { CheckUnusedResourceView } from './views/UnusedResourceView' +import { SettingsView } from './views/SettingsView' +import { Menu } from 'lucide-react' +import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, SheetTrigger } from './components/ui/sheet' +import { useDeepSignal } from 'deepsignal/react' +import { useEffect } from 'react' +import { ReplaceAllView } from './views/ReplaceAllView' +import { Separator } from './components/ui/separator' -export default function App() { - const count = useSignal(new Date()) - - useInterval(() => { - count.value = new Date() - }, 100) +function HomeView() { + return
home
+} - async function onPostMessage() { - console.log(await sendMessage('add', 1, 2)) +type MenuConfig = RouteConfig & { + meta?: { + title: string } +} +export const routeList: MenuConfig[] = [ + { + path: '/', + component: CheckUnusedResourceView, + meta: { + title: 'Unused Resources', + }, + }, + { + path: '/replace-all', + component: ReplaceAllView, + meta: { + title: 'Replace All', + }, + }, + { + path: '/settings', + component: SettingsView, + meta: { + title: 'Settings', + }, + }, + // { + // path: '/demo', + // component: DemoView, + // meta: { + // title: 'Demo', + // }, + // }, +] +function MenuItem(route: Pick) { + const loc = useLocation() + return ( + + + + ) +} + +function Sidebar() { + const loc = useLocation() + return ( + + ) +} + +export default function App() { + const isOpen = useDeepSignal({ + value: false, + }) + useEffect(() => { + isOpen.value = false + }, [useLocation()]) return ( -
-

Joplin Batch

-
{count.value.toJSON()}
- +
+
+
+ (isOpen.value = value)}> + + + + + + + + Joplin Batch + + + + + + + +
+
+
+
+ +
+
) } diff --git a/packages/joplin-batch/src/webview/assets/favicon.svg b/packages/joplin-batch/src/webview/assets/favicon.svg new file mode 100644 index 00000000..12c19946 --- /dev/null +++ b/packages/joplin-batch/src/webview/assets/favicon.svg @@ -0,0 +1,120 @@ + +Joplin Iconimage/svg+xmlJoplin IconLaurent Cozic + + + + + + + + + + + + + + + + + diff --git a/packages/joplin-batch/src/webview/components/3rd/ZoomableImage.tsx b/packages/joplin-batch/src/webview/components/3rd/ZoomableImage.tsx new file mode 100644 index 00000000..17d798b9 --- /dev/null +++ b/packages/joplin-batch/src/webview/components/3rd/ZoomableImage.tsx @@ -0,0 +1,27 @@ +import { DetailedHTMLProps, ImgHTMLAttributes } from 'react' +import { Dialog, DialogContent, DialogTitle, DialogTrigger } from '../ui/dialog' +import { TransformWrapper, TransformComponent } from 'react-zoom-pan-pinch' + +export default function ZoomableImage({ + src, + alt, + className, +}: DetailedHTMLProps, HTMLImageElement>) { + if (!src) return null + return ( + + + + {alt + + + + + + {alt + + + + + ) +} diff --git a/packages/joplin-batch/src/webview/components/ui/alert.tsx b/packages/joplin-batch/src/webview/components/ui/alert.tsx new file mode 100644 index 00000000..78519dc5 --- /dev/null +++ b/packages/joplin-batch/src/webview/components/ui/alert.tsx @@ -0,0 +1,43 @@ +import * as React from 'react' +import { cva, type VariantProps } from 'class-variance-authority' + +import { cn } from '@/lib/utils' + +const alertVariants = cva( + 'relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground', + { + variants: { + variant: { + default: 'bg-background text-foreground', + destructive: 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +) + +const Alert = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes & VariantProps +>(({ className, variant, ...props }, ref) => ( +
+)) +Alert.displayName = 'Alert' + +const AlertTitle = React.forwardRef>( + ({ className, ...props }, ref) => ( +
+ ), +) +AlertTitle.displayName = 'AlertTitle' + +const AlertDescription = React.forwardRef>( + ({ className, ...props }, ref) => ( +
+ ), +) +AlertDescription.displayName = 'AlertDescription' + +export { Alert, AlertTitle, AlertDescription } diff --git a/packages/joplin-batch/src/webview/components/ui/button.tsx b/packages/joplin-batch/src/webview/components/ui/button.tsx new file mode 100644 index 00000000..71e6b6fa --- /dev/null +++ b/packages/joplin-batch/src/webview/components/ui/button.tsx @@ -0,0 +1,47 @@ +import * as React from 'react' +import { Slot } from '@radix-ui/react-slot' +import { cva, type VariantProps } from 'class-variance-authority' + +import { cn } from '@/lib/utils' + +const buttonVariants = cva( + 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50', + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground hover:bg-primary/90', + destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90', + outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground', + secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80', + ghost: 'hover:bg-accent hover:text-accent-foreground', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-10 px-4 py-2', + sm: 'h-9 rounded-md px-3', + lg: 'h-11 rounded-md px-8', + icon: 'h-10 w-10', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : 'button' + return + }, +) +Button.displayName = 'Button' + +export { Button, buttonVariants } diff --git a/packages/joplin-batch/src/webview/components/ui/card.tsx b/packages/joplin-batch/src/webview/components/ui/card.tsx new file mode 100644 index 00000000..7cd2a7ef --- /dev/null +++ b/packages/joplin-batch/src/webview/components/ui/card.tsx @@ -0,0 +1,43 @@ +import * as React from 'react' + +import { cn } from '@/lib/utils' + +const Card = React.forwardRef>(({ className, ...props }, ref) => ( +
+)) +Card.displayName = 'Card' + +const CardHeader = React.forwardRef>( + ({ className, ...props }, ref) => ( +
+ ), +) +CardHeader.displayName = 'CardHeader' + +const CardTitle = React.forwardRef>( + ({ className, ...props }, ref) => ( +

+ ), +) +CardTitle.displayName = 'CardTitle' + +const CardDescription = React.forwardRef>( + ({ className, ...props }, ref) => ( +

+ ), +) +CardDescription.displayName = 'CardDescription' + +const CardContent = React.forwardRef>( + ({ className, ...props }, ref) =>

, +) +CardContent.displayName = 'CardContent' + +const CardFooter = React.forwardRef>( + ({ className, ...props }, ref) => ( +
+ ), +) +CardFooter.displayName = 'CardFooter' + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/packages/joplin-batch/src/webview/components/ui/dialog.tsx b/packages/joplin-batch/src/webview/components/ui/dialog.tsx new file mode 100644 index 00000000..0ae7b2da --- /dev/null +++ b/packages/joplin-batch/src/webview/components/ui/dialog.tsx @@ -0,0 +1,95 @@ +import * as React from 'react' +import * as DialogPrimitive from '@radix-ui/react-dialog' +import { X } from 'lucide-react' + +import { cn } from '@/lib/utils' + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ className, ...props }: React.HTMLAttributes) => ( +
+) +DialogHeader.displayName = 'DialogHeader' + +const DialogFooter = ({ className, ...props }: React.HTMLAttributes) => ( +
+) +DialogFooter.displayName = 'DialogFooter' + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} diff --git a/packages/joplin-batch/src/webview/components/ui/drawer.tsx b/packages/joplin-batch/src/webview/components/ui/drawer.tsx new file mode 100644 index 00000000..97f8472e --- /dev/null +++ b/packages/joplin-batch/src/webview/components/ui/drawer.tsx @@ -0,0 +1,87 @@ +import * as React from 'react' +import { Drawer as DrawerPrimitive } from 'vaul' + +import { cn } from '@/lib/utils' + +const Drawer = ({ shouldScaleBackground = true, ...props }: React.ComponentProps) => ( + +) +Drawer.displayName = 'Drawer' + +const DrawerTrigger = DrawerPrimitive.Trigger + +const DrawerPortal = DrawerPrimitive.Portal + +const DrawerClose = DrawerPrimitive.Close + +const DrawerOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName + +const DrawerContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + +
+ {children} + + +)) +DrawerContent.displayName = 'DrawerContent' + +const DrawerHeader = ({ className, ...props }: React.HTMLAttributes) => ( +
+) +DrawerHeader.displayName = 'DrawerHeader' + +const DrawerFooter = ({ className, ...props }: React.HTMLAttributes) => ( +
+) +DrawerFooter.displayName = 'DrawerFooter' + +const DrawerTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DrawerTitle.displayName = DrawerPrimitive.Title.displayName + +const DrawerDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DrawerDescription.displayName = DrawerPrimitive.Description.displayName + +export { + Drawer, + DrawerPortal, + DrawerOverlay, + DrawerTrigger, + DrawerClose, + DrawerContent, + DrawerHeader, + DrawerFooter, + DrawerTitle, + DrawerDescription, +} diff --git a/packages/joplin-batch/src/webview/components/ui/input.tsx b/packages/joplin-batch/src/webview/components/ui/input.tsx new file mode 100644 index 00000000..deb6d0c4 --- /dev/null +++ b/packages/joplin-batch/src/webview/components/ui/input.tsx @@ -0,0 +1,22 @@ +import * as React from 'react' + +import { cn } from '@/lib/utils' + +export interface InputProps extends React.InputHTMLAttributes {} + +const Input = React.forwardRef(({ className, type, ...props }, ref) => { + return ( + + ) +}) +Input.displayName = 'Input' + +export { Input } diff --git a/packages/joplin-batch/src/webview/components/ui/label.tsx b/packages/joplin-batch/src/webview/components/ui/label.tsx new file mode 100644 index 00000000..f5d00905 --- /dev/null +++ b/packages/joplin-batch/src/webview/components/ui/label.tsx @@ -0,0 +1,17 @@ +import * as React from 'react' +import * as LabelPrimitive from '@radix-ui/react-label' +import { cva, type VariantProps } from 'class-variance-authority' + +import { cn } from '@/lib/utils' + +const labelVariants = cva('text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70') + +const Label = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & VariantProps +>(({ className, ...props }, ref) => ( + +)) +Label.displayName = LabelPrimitive.Root.displayName + +export { Label } diff --git a/packages/joplin-batch/src/webview/components/ui/scroll-area.tsx b/packages/joplin-batch/src/webview/components/ui/scroll-area.tsx new file mode 100644 index 00000000..d77f4243 --- /dev/null +++ b/packages/joplin-batch/src/webview/components/ui/scroll-area.tsx @@ -0,0 +1,38 @@ +import * as React from 'react' +import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area' + +import { cn } from '@/lib/utils' + +const ScrollArea = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + {children} + + + +)) +ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName + +const ScrollBar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, orientation = 'vertical', ...props }, ref) => ( + + + +)) +ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName + +export { ScrollArea, ScrollBar } diff --git a/packages/joplin-batch/src/webview/components/ui/separator.tsx b/packages/joplin-batch/src/webview/components/ui/separator.tsx new file mode 100644 index 00000000..043c4ffb --- /dev/null +++ b/packages/joplin-batch/src/webview/components/ui/separator.tsx @@ -0,0 +1,20 @@ +import * as React from 'react' +import * as SeparatorPrimitive from '@radix-ui/react-separator' + +import { cn } from '@/lib/utils' + +const Separator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => ( + +)) +Separator.displayName = SeparatorPrimitive.Root.displayName + +export { Separator } diff --git a/packages/joplin-batch/src/webview/components/ui/sheet.tsx b/packages/joplin-batch/src/webview/components/ui/sheet.tsx new file mode 100644 index 00000000..2b287170 --- /dev/null +++ b/packages/joplin-batch/src/webview/components/ui/sheet.tsx @@ -0,0 +1,107 @@ +import * as React from 'react' +import * as SheetPrimitive from '@radix-ui/react-dialog' +import { cva, type VariantProps } from 'class-variance-authority' +import { X } from 'lucide-react' + +import { cn } from '@/lib/utils' + +const Sheet = SheetPrimitive.Root + +const SheetTrigger = SheetPrimitive.Trigger + +const SheetClose = SheetPrimitive.Close + +const SheetPortal = SheetPrimitive.Portal + +const SheetOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SheetOverlay.displayName = SheetPrimitive.Overlay.displayName + +const sheetVariants = cva( + 'fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500', + { + variants: { + side: { + top: 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top', + bottom: + 'inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom', + left: 'inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm', + right: + 'inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm', + }, + }, + defaultVariants: { + side: 'right', + }, + }, +) + +interface SheetContentProps + extends React.ComponentPropsWithoutRef, + VariantProps {} + +const SheetContent = React.forwardRef, SheetContentProps>( + ({ side = 'right', className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + + ), +) +SheetContent.displayName = SheetPrimitive.Content.displayName + +const SheetHeader = ({ className, ...props }: React.HTMLAttributes) => ( +
+) +SheetHeader.displayName = 'SheetHeader' + +const SheetFooter = ({ className, ...props }: React.HTMLAttributes) => ( +
+) +SheetFooter.displayName = 'SheetFooter' + +const SheetTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SheetTitle.displayName = SheetPrimitive.Title.displayName + +const SheetDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SheetDescription.displayName = SheetPrimitive.Description.displayName + +export { + Sheet, + SheetPortal, + SheetOverlay, + SheetTrigger, + SheetClose, + SheetContent, + SheetHeader, + SheetFooter, + SheetTitle, + SheetDescription, +} diff --git a/packages/joplin-batch/src/webview/index.html b/packages/joplin-batch/src/webview/index.html index 0b718c16..9f10e9dc 100644 --- a/packages/joplin-batch/src/webview/index.html +++ b/packages/joplin-batch/src/webview/index.html @@ -2,8 +2,9 @@ + - Document + Joplin Batch
diff --git a/packages/joplin-batch/src/webview/index.tsx b/packages/joplin-batch/src/webview/index.tsx index e211d2c3..b7b1b90c 100644 --- a/packages/joplin-batch/src/webview/index.tsx +++ b/packages/joplin-batch/src/webview/index.tsx @@ -1,5 +1,17 @@ -import { render } from 'preact' -import App from './App' +import { createRoot } from 'react-dom/client' +import App, { routeList } from './App' import './styles.css' +import { createHashHistory, ReactRouter } from '@liuli-util/react-router' -render(, document.getElementById('joplin-plugin-content')!) +createRoot(document.getElementById('joplin-plugin-content')!).render( + , +) diff --git a/packages/joplin-batch/src/webview/lib/dataApi.ts b/packages/joplin-batch/src/webview/lib/dataApi.ts new file mode 100644 index 00000000..704a4df1 --- /dev/null +++ b/packages/joplin-batch/src/webview/lib/dataApi.ts @@ -0,0 +1,32 @@ +import { getEnv } from 'jpl-vite' +import { webviewJoplinDataApi } from './webviewDataApi' +import { joplinDataApi } from 'joplin-api' + +export function getSettings(): { baseUrl?: string; token?: string } { + const s = localStorage.getItem('joplin-batch-settings') + if (!s) { + return { + baseUrl: 'http://localhost:41184', + } + } + try { + return JSON.parse(s) + } catch { + return { + baseUrl: 'http://localhost:41184', + } + } +} + +export function setSettings(settings: { baseUrl?: string; token?: string }) { + localStorage.setItem('joplin-batch-settings', JSON.stringify(settings)) +} + +export const dataApi = + getEnv() === 'webview' + ? webviewJoplinDataApi() + : joplinDataApi({ + type: 'rest', + baseUrl: import.meta.env.VITE_JOPLIN_BASE_URL, + token: import.meta.env.VITE_JOPLIN_BASE_TOKEN, + }) diff --git a/packages/joplin-batch/src/webview/lib/pageUtil.ts b/packages/joplin-batch/src/webview/lib/pageUtil.ts new file mode 100644 index 00000000..5b053816 --- /dev/null +++ b/packages/joplin-batch/src/webview/lib/pageUtil.ts @@ -0,0 +1,25 @@ +import { PageParam, PageRes } from 'joplin-api' + +/** + * 最大分页数量 + * @private + */ +const MaxLimit = 100 + +type PageResValueType>> = T extends Promise> ? U : never + +export function asGenerator>(f: (param: P) => Promise>) { + return async function* (pageParam?: Omit): AsyncGenerator { + for (let i = 1, hasMore = true; hasMore; i++) { + const res = await f({ + ...pageParam, + page: i, + limit: MaxLimit, + } as P) + for (const it of res.items) { + yield it + } + hasMore = res.has_more + } + } +} diff --git a/packages/joplin-batch/src/webview/lib/utils.ts b/packages/joplin-batch/src/webview/lib/utils.ts new file mode 100644 index 00000000..d32b0fe6 --- /dev/null +++ b/packages/joplin-batch/src/webview/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/packages/joplin-batch/src/webview/lib/webviewDataApi.ts b/packages/joplin-batch/src/webview/lib/webviewDataApi.ts new file mode 100644 index 00000000..39a79ddb --- /dev/null +++ b/packages/joplin-batch/src/webview/lib/webviewDataApi.ts @@ -0,0 +1,30 @@ +import { Api } from 'joplin-api' +import { sendMessage } from '../../message' + +export function webviewJoplinDataApi(): Api { + function createProxy(path: string[]) { + const handler = { + get(_target: any, prop: string | symbol) { + if (prop === 'bind') { + // 返回一个假的 bind 函数,它只是返回代理本身 + return () => createProxy(path) + } + if (prop === 'then') { + // 处理 Promise 链式调用 + return undefined + } + return createProxy([...path, prop.toString()]) + }, + apply(_target: any, _thisArg: any, args: any[]) { + return sendMessage('invokeDataApi', path.join('.'), ...args) + }, + } + + const proxy = new Proxy(function () { + throw new Error('Cannot invoke a proxy') + }, handler) + return proxy + } + + return createProxy([]) as unknown as Api +} diff --git a/packages/joplin-batch/src/webview/styles.css b/packages/joplin-batch/src/webview/styles.css index 4dc4eebc..d924e243 100644 --- a/packages/joplin-batch/src/webview/styles.css +++ b/packages/joplin-batch/src/webview/styles.css @@ -1,5 +1,69 @@ -html, -body { - margin: 0; - padding: 0; +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + --radius: 0.5rem; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } } diff --git a/packages/joplin-batch/src/webview/views/DemoView.tsx b/packages/joplin-batch/src/webview/views/DemoView.tsx new file mode 100644 index 00000000..99e0b3c2 --- /dev/null +++ b/packages/joplin-batch/src/webview/views/DemoView.tsx @@ -0,0 +1,33 @@ +import { useInterval } from 'react-use' +import { sendMessage } from '../../message' +import { Button } from '../components/ui/button' +import { useDeepSignal } from 'deepsignal/react' +import { webviewJoplinDataApi } from '@/lib/webviewDataApi' + +export function DemoView() { + const count = useDeepSignal({ + value: new Date(), + }) + + useInterval(() => { + count.value = new Date() + }, 100) + + async function onPostMessage() { + console.log(await sendMessage('add', 1, 2)) + } + + async function onInvokeDataApi() { + const list = webviewJoplinDataApi().note.list + console.log(await list({ limit: 1 })) + } + + return ( +
+

Joplin Batch

+
{count.value.toJSON()}
+ + +
+ ) +} diff --git a/packages/joplin-batch/src/webview/views/ReplaceAllView.tsx b/packages/joplin-batch/src/webview/views/ReplaceAllView.tsx new file mode 100644 index 00000000..71781275 --- /dev/null +++ b/packages/joplin-batch/src/webview/views/ReplaceAllView.tsx @@ -0,0 +1,175 @@ +import React from 'react' +import { asGenerator } from '../lib/pageUtil' +import { Button } from '@/components/ui/button' +import { Loader2, ReplaceAllIcon, ReplaceIcon } from 'lucide-react' +import { useAsyncFn, useMount, useMedia } from 'react-use' +import { useDeepSignal } from 'deepsignal/react' +import { NoteProperties } from 'joplin-api' +import { dataApi } from '../lib/dataApi' +import { Input } from '@/components/ui/input' +import { ScrollArea } from '@/components/ui/scroll-area' +import { cn } from '@/lib/utils' +import { + Drawer, + DrawerClose, + DrawerContent, + DrawerDescription, + DrawerFooter, + DrawerHeader, + DrawerTitle, +} from '@/components/ui/drawer' +import reactStringReplace from 'react-string-replace' + +type SearchNote = Pick + +export function ReplaceAllView() { + const list = useDeepSignal({ + value: [] as SearchNote[], + }) + const form = useDeepSignal({ + search: 'joplin', + replace: 'vscode', + }) + const [state, onSearch] = useAsyncFn(async () => { + list.value = [] + const stream = asGenerator(dataApi.search.search.bind(dataApi.search))({ + query: form.search, + fields: ['id', 'title', 'body', 'user_updated_time'], + order_by: 'user_updated_time', + order_dir: 'DESC', + }) + for await (const it of stream) { + list.value.push(it) + } + }) + useMount(onSearch) + + const [replaceAllState, onReplaceAll] = useAsyncFn(async () => { + if (!form.replace || !form.replace) { + return + } + for (const it of list.value) { + await replaceById(it) + } + }) + + const boxState = useDeepSignal({ isOpen: false, activeIndex: 0 }) + const isDesktop = useMedia('(min-width: 768px)') + + async function replaceById(note: SearchNote) { + const replace = (s: string) => s.replaceAll(new RegExp(form.search, 'gi'), form.replace) + await dataApi.note.update({ ...note, title: replace(note.title), body: replace(note.body) }) + list.value = list.value.filter((it) => it.id !== note.id) + } + + const [replaceSingleState, onReplaceSingle] = useAsyncFn(async () => { + if (!form.replace || !form.replace) { + return + } + if (!boxState.isOpen) { + return + } + const it = list.value[boxState.activeIndex] + await replaceById(it) + boxState.isOpen = false + }) + + return ( +
+
+
+
+ (form.search = ev.target.value)} /> +
+
+ (form.replace = ev.target.value)} /> +
+
+ + +
+
+
+ +
    + {list.value.map((it, i) => ( +
  • { + boxState.isOpen = true + boxState.activeIndex = i + }} + > + {it.title} + +
  • + ))} +
+
+ (boxState.isOpen = value)}> + +
+ + Replace + {list.value[boxState.activeIndex]?.title} + +
+ +
+ + + + + + +
+
+
+
+ ) +} + +function DiffView(props: { search: string; replace: string; text?: string; onReplace: () => void }) { + return ( +
+      {reactStringReplace(props.text, props.search, (match, i) => {
+        return [
+          
+            {match}
+          ,
+          
+            {props.replace}
+          ,
+        ]
+      })}
+    
+ ) +} diff --git a/packages/joplin-batch/src/webview/views/SettingsView.tsx b/packages/joplin-batch/src/webview/views/SettingsView.tsx new file mode 100644 index 00000000..37f56e11 --- /dev/null +++ b/packages/joplin-batch/src/webview/views/SettingsView.tsx @@ -0,0 +1,86 @@ +import { Card, CardContent, CardHeader, CardTitle } from '../components/ui/card' +import { useDeepSignal } from 'deepsignal/react' +import { joplinDataApi } from 'joplin-api' +import { Input } from '@/components/ui/input' +import { Label } from '@/components/ui/label' +import { Button } from '@/components/ui/button' +import { useAsyncFn } from 'react-use' +import { Loader2 } from 'lucide-react' +import { useSignalEffect } from '@preact/signals-react' +import { getSettings, setSettings } from '@/lib/dataApi' + +export function SettingsView() { + const settings = useDeepSignal<{ + baseUrl?: string + token?: string + }>(getSettings()) + + useSignalEffect(() => { + setSettings(settings) + }) + + const [state, onCheck] = useAsyncFn(async () => { + if (!settings.baseUrl) { + throw new Error('Base URL is required') + } + if (!settings.token) { + throw new Error('Token is required') + } + const api = joplinDataApi({ + type: 'rest', + baseUrl: settings.baseUrl, + token: settings.token, + }) + try { + if (!(await api.joplin.ping())) { + throw new Error('Web Clipper Service is not running') + } + } catch { + throw new Error('Web Clipper Service is not running') + } + try { + await api.note.list({ limit: 1 }) + } catch { + throw new Error('Token is invalid') + } + return true + }) + return ( +
+
+
+ + (settings.baseUrl = ev.target.value)} + type={'url'} + /> +
+
+ + (settings.token = ev.target.value)} + type={'password'} + /> +
+
+ +
+ {state.error && {state.error.message}} + {state.value && Success} +
+
+
+
+ ) +} diff --git a/packages/joplin-batch/src/webview/views/UnusedResourceView.tsx b/packages/joplin-batch/src/webview/views/UnusedResourceView.tsx new file mode 100644 index 00000000..306fd632 --- /dev/null +++ b/packages/joplin-batch/src/webview/views/UnusedResourceView.tsx @@ -0,0 +1,117 @@ +import { Button } from '@/components/ui/button' +import { ScrollArea } from '@/components/ui/scroll-area' +import { AlertCircle, Loader2, Trash2 } from 'lucide-react' +import { useAsyncFn, useLocalStorage, useMedia, useMount } from 'react-use' +import { ResourceProperties } from 'joplin-api' +import { useDeepSignal } from 'deepsignal/react' +import { asGenerator } from '../lib/pageUtil' +import { dataApi, getSettings } from '../lib/dataApi' +import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' +import { Link } from '@liuli-util/react-router' +import ZoomableImage from '@/components/3rd/ZoomableImage' + +async function isUse(id: string): Promise { + const res = await dataApi.search.search({ + query: `"](:/${id})"`, + }) + return res.items.length > 0 +} + +function buildResourceUrl(id: string): string { + const settings = getSettings() + return `${settings?.baseUrl}/resources/${id}/file?token=${settings?.token}` +} + +export function CheckUnusedResourceView() { + const list = useDeepSignal({ + value: [] as Pick[], + }) + const [state, doFetch] = useAsyncFn(async () => { + list.value = [] + const stream = asGenerator(dataApi.resource.list.bind(dataApi.resource))({ + fields: ['id', 'title', 'mime'], + order_by: 'user_updated_time', + order_dir: 'DESC', + }) + for await (const it of stream) { + if (!(await isUse(it.id))) { + list.value.push(it as Pick) + } + } + }, []) + + async function onDelete(id: string) { + await dataApi.resource.remove(id) + list.value = list.value.filter((it) => it.id !== id) + } + + const [deleteState, onDeleteAll] = useAsyncFn(async () => { + for (const it of list.value) { + await onDelete(it.id) + } + }) + + useMount(doFetch) + + const [settings] = useLocalStorage<{ + baseUrl?: string + token?: string + }>('joplin-batch-settings') + return ( +
+
+ + +
+
+ {!(settings?.baseUrl && settings.token) && ( + svg]:text-yellow-600'}> + + Warn + +
Please set the Joplin server address and token in the settings to view the image.
+ + Go to Settings + +
+
+ )} + {state.error &&
Error: {state.error.message}
} + {list.value.length > 0 && ( + +
    + {list.value.map((it) => ( +
  • +
    + + {it.title} + +
    + +
    +
    + {it.mime.startsWith('image/') && settings?.baseUrl && settings.token && ( + + )} +
  • + ))} +
+
+ )} +
+
+ ) +} diff --git a/packages/joplin-batch/tailwind.config.js b/packages/joplin-batch/tailwind.config.js new file mode 100644 index 00000000..547a494c --- /dev/null +++ b/packages/joplin-batch/tailwind.config.js @@ -0,0 +1,72 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: ['class'], + content: ['./pages/**/*.{ts,tsx}', './components/**/*.{ts,tsx}', './app/**/*.{ts,tsx}', './src/**/*.{ts,tsx}'], + prefix: '', + theme: { + container: { + center: true, + padding: '2rem', + screens: { + '2xl': '1400px', + }, + }, + extend: { + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + keyframes: { + 'accordion-down': { + from: { height: '0' }, + to: { height: 'var(--radix-accordion-content-height)' }, + }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: '0' }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + }, + }, + }, + plugins: [require('tailwindcss-animate')], +} diff --git a/packages/joplin-batch/tsconfig.json b/packages/joplin-batch/tsconfig.json index 4eacea6b..f9b18850 100644 --- a/packages/joplin-batch/tsconfig.json +++ b/packages/joplin-batch/tsconfig.json @@ -1,5 +1,9 @@ { "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["./src/webview/*"] + }, "target": "ESNext", "lib": ["ESNext", "DOM"], "outDir": "./dist", @@ -11,8 +15,7 @@ "sourceMap": true, "declaration": true, "declarationMap": true, - "jsx": "react-jsx", - "jsxImportSource": "preact" + "jsx": "react-jsx" }, "include": ["src"] } diff --git a/packages/jpl-vite/package.json b/packages/jpl-vite/package.json index 0a21defa..c425ccc3 100644 --- a/packages/jpl-vite/package.json +++ b/packages/jpl-vite/package.json @@ -45,6 +45,8 @@ }, "dependencies": { "bundle-require": "^5.0.0", + "chalk": "^5.3.0", + "chokidar": "^3.5.3", "commander": "^12.1.0", "fs-extra": "^11.2.0", "globby": "^14.0.1", diff --git a/packages/jpl-vite/src/__tests__/index.test.ts b/packages/jpl-vite/src/__tests__/index.test.ts index f061ad97..30269d3f 100644 --- a/packages/jpl-vite/src/__tests__/index.test.ts +++ b/packages/jpl-vite/src/__tests__/index.test.ts @@ -1,5 +1,7 @@ +import { loadEnv } from 'vite' import { it, expect } from 'vitest' -it('test', () => { - expect(1).toBe(1) +it('test', async () => { + const r = await loadEnv('development', '/Users/rxliuli/code/web/joplin-utils/packages/joplin-batch') + console.log(r) }) diff --git a/packages/jpl-vite/src/bin.ts b/packages/jpl-vite/src/bin.ts index 773118e4..fee7c606 100644 --- a/packages/jpl-vite/src/bin.ts +++ b/packages/jpl-vite/src/bin.ts @@ -1,23 +1,9 @@ import { Command } from 'commander' import { version } from '../package.json' -import { build } from './build' -import { bundleRequire } from 'bundle-require' -import { ResolvedPluginConfig } from '.' +import { build, parseConfig } from './build' import path from 'path' import { bundle } from './bundle' -import { dev } from './dev' - -async function parseConfig(): Promise { - const { mod } = await bundleRequire({ - filepath: 'jpl.config.ts', - }) - if (typeof mod.default !== 'object') { - throw new Error('The configuration file must export a function or an array.') - } - const config = mod.default as ResolvedPluginConfig - config.root = path.resolve() - return config as ResolvedPluginConfig -} +import { startDevServer } from './server' new Command() .action(async () => { @@ -26,11 +12,13 @@ new Command() }) .addCommand( new Command('dev').action(async () => { - await dev(await parseConfig()) + process.env.NODE_ENV = 'development' + await startDevServer(path.resolve()) }), ) .addCommand( new Command('build').action(async () => { + process.env.NODE_ENV = 'production' const config = await parseConfig() await build(config) await bundle(config) diff --git a/packages/jpl-vite/src/build.ts b/packages/jpl-vite/src/build.ts index f898e934..8d915f21 100644 --- a/packages/jpl-vite/src/build.ts +++ b/packages/jpl-vite/src/build.ts @@ -1,12 +1,34 @@ import path from 'path' -import { build as viteBuild, UserConfig, mergeConfig } from 'vite' +import { build as viteBuild, UserConfig, mergeConfig, loadEnv } from 'vite' import { ResolvedPluginConfig } from '.' import { omit } from 'lodash-es' import { readFile, writeFile } from 'fs/promises' import { pathExists } from 'fs-extra' +import { bundleRequire } from 'bundle-require' + +function devMode(config: UserConfig) { + if (process.env.NODE_ENV !== 'development') { + return config + } + return mergeConfig(config, { + build: { + sourcemap: 'inline', + minify: false, + watch: {}, + }, + }) +} + +export function defineEnv(config: ResolvedPluginConfig) { + const env = loadEnv(process.env.NODE_ENV ?? 'development', config.root) + return Object.entries(env).reduce((acc, [key, value]) => { + acc[`import.meta.env.${key}`] = JSON.stringify(value) + return acc + }, {} as Record) +} export function webview(config: ResolvedPluginConfig): UserConfig { - const r: UserConfig = { + return devMode({ root: path.resolve(config.root, 'src/webview/'), build: { outDir: path.resolve(config.root, 'dist/webview/'), @@ -15,20 +37,18 @@ export function webview(config: ResolvedPluginConfig): UserConfig { entryFileNames: '[name].js', assetFileNames: '[name].[ext]', manualChunks: undefined, + format: 'iife', }, }, emptyOutDir: true, + cssCodeSplit: false, }, - } - if (process.env.NODE_ENV === 'development') { - r.build!.sourcemap = 'inline' - r.build!.minify = false - } - return r + define: defineEnv(config), + }) } function main(config: ResolvedPluginConfig): UserConfig { - const r: UserConfig = { + return devMode({ build: { lib: { entry: path.resolve(config.root, 'src/index.ts'), @@ -41,12 +61,22 @@ function main(config: ResolvedPluginConfig): UserConfig { }, emptyOutDir: true, }, - } - if (process.env.NODE_ENV === 'development') { - r.build!.sourcemap = 'inline' - r.build!.minify = false - } - return r + define: defineEnv(config), + plugins: [ + { + name: 'emitManifest', + async buildEnd(error) { + if (error) { + return + } + await emitManifest(config) + }, + async closeBundle() { + await emitManifest(config) + }, + }, + ], + }) } async function emitManifest(config: ResolvedPluginConfig) { @@ -61,7 +91,6 @@ export async function build(config: ResolvedPluginConfig) { root: config.root, } await viteBuild(mergeConfig(main(config), defaultConfig)) - await emitManifest(config) if (await pathExists(path.resolve(config.root, 'src/webview/index.html'))) { let c = webview(config) if (config.vite) { @@ -70,3 +99,15 @@ export async function build(config: ResolvedPluginConfig) { await viteBuild(c) } } + +export async function parseConfig(): Promise { + const { mod } = await bundleRequire({ + filepath: 'jpl.config.ts', + }) + if (typeof mod.default !== 'object') { + throw new Error('The configuration file must export a function or an array.') + } + const config = mod.default as ResolvedPluginConfig + config.root = path.resolve() + return config as ResolvedPluginConfig +} diff --git a/packages/jpl-vite/src/dev.ts b/packages/jpl-vite/src/dev.ts deleted file mode 100644 index 7ee1187a..00000000 --- a/packages/jpl-vite/src/dev.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { createServer, mergeConfig, build as viteBuild } from 'vite' -import { ResolvedPluginConfig } from '.' -import { webview } from './build' -import path from 'path' -import { pathExists } from 'fs-extra' - -export async function dev(config: ResolvedPluginConfig) { - if (!(await pathExists(path.resolve(config.root, 'src/webview/index.html')))) { - return - } - let c = webview(config) - if (config.vite) { - c = mergeConfig(c, config.vite) - } - const server = await createServer(c) - await server.listen() - server.printUrls() -} diff --git a/packages/jpl-vite/src/index.ts b/packages/jpl-vite/src/index.ts index 534caec1..296c310d 100644 --- a/packages/jpl-vite/src/index.ts +++ b/packages/jpl-vite/src/index.ts @@ -57,3 +57,14 @@ export interface ResolvedPluginConfig extends PluginConfig { export function defineConfig(config: PluginConfig) { return config } + +export function getEnv(): 'main' | 'webview' | undefined { + // @ts-expect-error + if (typeof joplin !== 'undefined') { + return 'main' + } + // @ts-expect-error + if (typeof webviewApi !== 'undefined') { + return 'webview' + } +} diff --git a/packages/jpl-vite/src/messaging.ts b/packages/jpl-vite/src/messaging.ts index 9e1fbfdf..eb1be6da 100644 --- a/packages/jpl-vite/src/messaging.ts +++ b/packages/jpl-vite/src/messaging.ts @@ -2,6 +2,7 @@ import joplin, { ViewHandle } from 'joplin-plugin-api' import { webviewApi } from './webview' import { serializeError, deserializeError } from 'serialize-error' import { once } from 'lodash-es' +import { getEnv } from '.' type ProtocolWithReturn = T extends (...args: infer Args) => any ? ReturnType : [T] type GetDataType = T extends (...args: infer Args) => any ? Parameters : [T] @@ -19,15 +20,6 @@ interface ExtensionMessenger { ): () => void } -function getEnv(): 'main' | 'webview' | undefined { - if (typeof joplin !== 'undefined') { - return 'main' - } - if (typeof webviewApi !== 'undefined') { - return 'webview' - } -} - function getIpc(viewHandle: ViewHandle) { const env = getEnv() if (!env) { diff --git a/packages/jpl-vite/src/server.ts b/packages/jpl-vite/src/server.ts new file mode 100644 index 00000000..86cbf221 --- /dev/null +++ b/packages/jpl-vite/src/server.ts @@ -0,0 +1,40 @@ +import { createServer, mergeConfig, ViteDevServer } from 'vite' +import { parseConfig, webview } from './build' +import path from 'path' +import { pathExists } from 'fs-extra' +import chokidar from 'chokidar' +import chalk from 'chalk' + +export async function startDevServer(root: string) { + if (!(await pathExists(path.resolve(root, 'src/webview/index.html')))) { + return + } + + let server: ViteDevServer | null = null + + async function startServer() { + const config = await parseConfig() + if (server) { + await server.close() + } + + let c = webview(config) + if (config.vite) { + c = mergeConfig(c, config.vite) + } + server = await createServer(c) + await server.listen() + server.printUrls() + } + + // 启动服务器 + await startServer() + + // 监听 jpl.config.ts 文件变化 + const configPath = path.resolve(root, 'jpl.config.ts') + chokidar.watch(configPath).on('change', async () => { + console.log(chalk.green('Configuration file changed. Restarting server...')) + // 重启服务器 + await startServer() + }) +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7254d68a..375168cd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -98,19 +98,77 @@ importers: version: 1.6.0(@types/node@20.14.14)(jsdom@24.1.1)(less@4.2.0)(terser@5.31.3) packages/joplin-batch: + dependencies: + '@liuli-util/react-router': + specifier: ^0.9.4 + version: 0.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@preact/signals-react': + specifier: ^2.1.0 + version: 2.1.0(react@18.3.1) + '@radix-ui/react-dialog': + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-label': + specifier: ^2.1.0 + version: 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-scroll-area': + specifier: ^1.1.0 + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-separator': + specifier: ^1.1.0 + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.1.0 + version: 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@types/react-dom': + specifier: ^18.0.6 + version: 18.3.0 + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.0 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + deepsignal: + specifier: ^1.5.0 + version: 1.5.0(@preact/signals-core@1.8.0)(@preact/signals-react@2.1.0(react@18.3.1))(@preact/signals@1.3.0(preact@10.23.1))(preact@10.23.1) + lucide-react: + specifier: ^0.424.0 + version: 0.424.0(react@18.3.1) + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + react-string-replace: + specifier: ^1.1.1 + version: 1.1.1 + react-zoom-pan-pinch: + specifier: ^3.6.1 + version: 3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tailwind-merge: + specifier: ^2.4.0 + version: 2.4.0 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4))) + vaul: + specifier: ^0.9.1 + version: 0.9.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: - '@preact/preset-vite': - specifier: ^2.8.1 - version: 2.9.0(@babel/core@7.24.6)(preact@10.23.1)(vite@5.3.5(@types/node@18.19.43)(less@4.2.0)(terser@5.31.3)) - '@preact/signals': - specifier: ^1.2.2 - version: 1.3.0(preact@10.23.1) '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 '@types/node': specifier: ^18.7.13 version: 18.19.43 + '@types/react': + specifier: ^18.3.3 + version: 18.3.3 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.3.1(vite@5.3.5(@types/node@18.19.43)(less@4.2.0)(terser@5.31.3)) + autoprefixer: + specifier: ^10.4.17 + version: 10.4.20(postcss@8.4.41) joplin-api: specifier: workspace:^ version: link:../joplin-api @@ -123,12 +181,18 @@ importers: lodash-es: specifier: ^4.17.21 version: 4.17.21 - preact: - specifier: ^10.19.5 - version: 10.23.1 + postcss: + specifier: ^8.4.35 + version: 8.4.41 + react: + specifier: ^18.3.1 + version: 18.3.1 react-use: specifier: ^17.5.1 version: 17.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tailwindcss: + specifier: ^3.4.1 + version: 3.4.7(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)) typescript: specifier: ^5.4.5 version: 5.5.4 @@ -234,7 +298,7 @@ importers: devDependencies: '@babel/preset-env': specifier: ^7.19.3 - version: 7.25.3(@babel/core@7.22.5) + version: 7.25.3(@babel/core@7.19.3) '@liuli-util/eslint-config-react-ts': specifier: ^0.2.1 version: 0.2.1(typescript@4.8.4) @@ -282,7 +346,7 @@ importers: version: 1.3.6 babel-jest: specifier: ^29.1.2 - version: 29.7.0(@babel/core@7.22.5) + version: 29.7.0(@babel/core@7.19.3) envfile: specifier: ^6.18.0 version: 6.22.0 @@ -592,6 +656,12 @@ importers: bundle-require: specifier: ^5.0.0 version: 5.0.0(esbuild@0.23.0) + chalk: + specifier: ^5.3.0 + version: 5.3.0 + chokidar: + specifier: ^3.5.3 + version: 3.6.0 commander: specifier: ^12.1.0 version: 12.1.0 @@ -952,10 +1022,6 @@ packages: resolution: {integrity: sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.22.5': - resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==} - engines: {node: '>=6.9.0'} - '@babel/core@7.24.6': resolution: {integrity: sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==} engines: {node: '>=6.9.0'} @@ -968,10 +1034,6 @@ packages: resolution: {integrity: sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.22.5': - resolution: {integrity: sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.22.9': resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} engines: {node: '>=6.9.0'} @@ -1179,10 +1241,6 @@ packages: resolution: {integrity: sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.22.5': - resolution: {integrity: sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.6': resolution: {integrity: sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==} engines: {node: '>=6.9.0'} @@ -1609,12 +1667,24 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.24.7': + resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-source@7.18.6': resolution: {integrity: sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-source@7.24.7': + resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.24.6': resolution: {integrity: sha512-pCtPHhpRZHfwdA5G1Gpk5mIzMA99hv0R8S/Ket50Rw+S+8hkt3wBWqdqHaPw0CuUYxdshUgsPiLQ5fAs4ASMhw==} engines: {node: '>=6.9.0'} @@ -3102,6 +3172,11 @@ packages: peerDependencies: react: ^17.0.2 + '@liuli-util/react-router@0.9.4': + resolution: {integrity: sha512-wyoFBfDQTJ2xHkb/ZF4bSWB5DH2/HAJiWlHfKHYbCUz1kbF/z9pQPmxW5XLzYs16+gsR/TTcMR2ZLQ2T7LtRNw==} + peerDependencies: + react: ^17.0.2 + '@liuli-util/rollup-plugin-i18next-dts-gen@0.4.4': resolution: {integrity: sha512-jxCp1cAjiup9M7Oxa/e78G8ee2CnDvwrSe0JDpAUFVC83nhFr8MxJ5nk+fJ1Vv/yiu62/diIcLn73HA0SqA7gA==} @@ -3244,6 +3319,11 @@ packages: '@preact/signals-core@1.8.0': resolution: {integrity: sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==} + '@preact/signals-react@2.1.0': + resolution: {integrity: sha512-jWq2ldDWXdbKpg+aMGuOZfj9tS5JkVlGJ5hGNzNe1Zfe7RLFfvldBEfNe6ZT7KZddecAxKhyoxSsEypgbfx/Gw==} + peerDependencies: + react: ^16.14.0 || 17.x || 18.x + '@preact/signals@1.3.0': resolution: {integrity: sha512-EOMeg42SlLS72dhoq6Vjq08havnLseWmPQ8A0YsgIAqMgWgx7V1a39+Pxo6i7SY5NwJtH4849JogFq3M67AzWg==} peerDependencies: @@ -3280,6 +3360,219 @@ packages: '@primer/view-components@0.27.0': resolution: {integrity: sha512-pNEnD6B6rDJ+uTEZyfSkiqV4MVkL0HQI8DJb+OaAvJP9x0HjUtKh0WHxTCsvlC6pCbDOeanph2JichE5XqWKRw==} + '@radix-ui/number@1.1.0': + resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} + + '@radix-ui/primitive@1.1.0': + resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} + + '@radix-ui/react-compose-refs@1.1.0': + resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.0': + resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.1': + resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.0': + resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.0': + resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.0': + resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.0': + resolution: {integrity: sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.1': + resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.0': + resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.0.0': + resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-scroll-area@1.1.0': + resolution: {integrity: sha512-9ArIZ9HWhsrfqS765h+GZuLoxaRHD/j0ZWOWilsCvYTpYJp8XwCqNG7Dt9Nu/TItKOdgLGkOPCodQvDc+UMwYg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.0': + resolution: {integrity: sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.1.0': + resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@rc-component/portal@1.1.2': resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} engines: {node: '>=8.x'} @@ -3496,20 +3789,20 @@ packages: '@smithy/eventstream-codec@3.1.2': resolution: {integrity: sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw==} - '@smithy/eventstream-serde-browser@3.0.5': - resolution: {integrity: sha512-dEyiUYL/ekDfk+2Ra4GxV+xNnFoCmk1nuIXg+fMChFTrM2uI/1r9AdiTYzPqgb72yIv/NtAj6C3dG//1wwgakQ==} + '@smithy/eventstream-serde-browser@3.0.6': + resolution: {integrity: sha512-2hM54UWQUOrki4BtsUI1WzmD13/SeaqT/AB3EUJKbcver/WgKNaiJ5y5F5XXuVe6UekffVzuUDrBZVAA3AWRpQ==} engines: {node: '>=16.0.0'} '@smithy/eventstream-serde-config-resolver@3.0.3': resolution: {integrity: sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ==} engines: {node: '>=16.0.0'} - '@smithy/eventstream-serde-node@3.0.4': - resolution: {integrity: sha512-mjlG0OzGAYuUpdUpflfb9zyLrBGgmQmrobNT8b42ZTsGv/J03+t24uhhtVEKG/b2jFtPIHF74Bq+VUtbzEKOKg==} + '@smithy/eventstream-serde-node@3.0.5': + resolution: {integrity: sha512-+upXvnHNyZP095s11jF5dhGw/Ihzqwl5G+/KtMnoQOpdfC3B5HYCcDVG9EmgkhJMXJlM64PyN5gjJl0uXFQehQ==} engines: {node: '>=16.0.0'} - '@smithy/eventstream-serde-universal@3.0.4': - resolution: {integrity: sha512-Od9dv8zh3PgOD7Vj4T3HSuox16n0VG8jJIM2gvKASL6aCtcS8CfHZDWe1Ik3ZXW6xBouU+45Q5wgoliWDZiJ0A==} + '@smithy/eventstream-serde-universal@3.0.5': + resolution: {integrity: sha512-5u/nXbyoh1s4QxrvNre9V6vfyoLWuiVvvd5TlZjGThIikc3G+uNiG9uOTCWweSRjv1asdDIWK7nOmN7le4RYHQ==} engines: {node: '>=16.0.0'} '@smithy/fetch-http-handler@3.2.4': @@ -3775,6 +4068,9 @@ packages: '@types/babel__core@7.1.19': resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@types/babel__generator@7.6.4': resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} @@ -4067,6 +4363,12 @@ packages: engines: {node: '>=12.0.0'} deprecated: This package has been deprecated in favor of @vitejs/plugin-react + '@vitejs/plugin-react@4.3.1': + resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + '@vitejs/plugin-vue@5.1.2': resolution: {integrity: sha512-nY9IwH12qeiJqumTCLJLE7IiNx7HZ39cbHaysEUd+Myvbz9KAqd2yq+U01Kab1R/H1BmiyM2ShTYlNH32Fzo3A==} engines: {node: ^18.0.0 || >=20.0.0} @@ -4396,10 +4698,6 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.2: - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} - engines: {node: '>= 8'} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -4416,6 +4714,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + array-differ@4.0.0: resolution: {integrity: sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4567,10 +4869,6 @@ packages: bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -4606,10 +4904,6 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -4773,6 +5067,9 @@ packages: resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} engines: {node: '>=8'} + class-variance-authority@0.7.0: + resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} + classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} @@ -4807,6 +5104,14 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + code-block-writer@12.0.0: resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} @@ -5192,6 +5497,23 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + deepsignal@1.5.0: + resolution: {integrity: sha512-bFywDpBUUWMs576H2dgLFLLFuQ/UWXbzHfKD98MZTfGsl7+twIzvz4ihCNrRrZ/Emz3kqJaNIAp5eBWUEWhnAw==} + peerDependencies: + '@preact/signals': ^1.1.4 + '@preact/signals-core': ^1.5.1 + '@preact/signals-react': ^1.3.8 || ^2.0.0 + preact: ^10.16.0 + peerDependenciesMeta: + '@preact/signals': + optional: true + '@preact/signals-core': + optional: true + '@preact/signals-react': + optional: true + preact: + optional: true + defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -5211,6 +5533,9 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -5715,10 +6040,6 @@ packages: resolution: {integrity: sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==} engines: {node: '>=12.20'} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -5859,6 +6180,10 @@ packages: get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} @@ -6221,6 +6546,9 @@ packages: inline-style-prefixer@7.0.1: resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==} + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + invert-kv@3.0.1: resolution: {integrity: sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==} engines: {node: '>=8'} @@ -6942,6 +7270,11 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + lucide-react@0.424.0: + resolution: {integrity: sha512-x2Nj2aytk1iOyHqt4hKenfVlySq0rYxNeEf8hE0o+Yh0iE36Rqz0rkngVdv2uQtjZ70LAE73eeplhhptYt9x4Q==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc + lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} @@ -8320,6 +8653,30 @@ packages: resolution: {integrity: sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==} engines: {node: '>=0.10.0'} + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.6: + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.5.7: + resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + react-router-dom@6.26.0: resolution: {integrity: sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ==} engines: {node: '>=14.0.0'} @@ -8333,6 +8690,20 @@ packages: peerDependencies: react: '>=16.8' + react-string-replace@1.1.1: + resolution: {integrity: sha512-26TUbLzLfHQ5jO5N7y3Mx88eeKo0Ml0UjCQuX4BMfOd/JX+enQqlKpL1CZnmjeBRvQE8TR+ds9j1rqx9CxhKHQ==} + engines: {node: '>=0.12.0'} + + react-style-singleton@2.2.1: + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + react-universal-interface@0.6.2: resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} peerDependencies: @@ -8345,6 +8716,13 @@ packages: react: '*' react-dom: '*' + react-zoom-pan-pinch@3.6.1: + resolution: {integrity: sha512-SdPqdk7QDSV7u/WulkFOi+cnza8rEZ0XX4ZpeH7vx3UZEg7DoyuAy3MCmm+BWv/idPQL2Oe73VoC0EhfCN+sZQ==} + engines: {node: '>=8', npm: '>=5'} + peerDependencies: + react: '*' + react-dom: '*' + react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -8993,6 +9371,14 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tailwind-merge@2.4.0: + resolution: {integrity: sha512-49AwoOQNKdqKPd9CViyH5wJoSKsCDjUlzL8DxuGp3P1FsGY36NJDAa18jLZcaHAUUuTj+JB8IAo8zWgBNvBF7A==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + tailwindcss@3.4.7: resolution: {integrity: sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==} engines: {node: '>=14.0.0'} @@ -9422,6 +9808,26 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + use-callback-ref@1.3.2: + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.2: + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + use-sync-external-store@1.2.0: resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: @@ -9465,6 +9871,12 @@ packages: resolution: {integrity: sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==} engines: {node: '>= 0.10'} + vaul@0.9.1: + resolution: {integrity: sha512-fAhd7i4RNMinx+WEm6pF3nOl78DFkAazcN04ElLPFF9BMCNGbY/kou8UMhIcicm0rJCNePJP0Yyza60gGOD0Jw==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + verror@1.10.0: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} @@ -10264,9 +10676,9 @@ snapshots: '@aws-sdk/xml-builder': 3.609.0 '@smithy/config-resolver': 3.0.5 '@smithy/core': 2.3.2 - '@smithy/eventstream-serde-browser': 3.0.5 + '@smithy/eventstream-serde-browser': 3.0.6 '@smithy/eventstream-serde-config-resolver': 3.0.3 - '@smithy/eventstream-serde-node': 3.0.4 + '@smithy/eventstream-serde-node': 3.0.5 '@smithy/fetch-http-handler': 3.2.4 '@smithy/hash-blob-browser': 3.1.2 '@smithy/hash-node': 3.0.3 @@ -10739,27 +11151,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/core@7.22.5': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.22.5 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.22.5) - '@babel/helpers': 7.22.5 - '@babel/parser': 7.25.3 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 - convert-source-map: 1.9.0 - debug: 4.3.6 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/core@7.24.6': + '@babel/core@7.24.6': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 @@ -10805,16 +11197,9 @@ snapshots: '@jridgewell/gen-mapping': 0.3.3 jsesc: 2.5.2 - '@babel/generator@7.22.5': - dependencies: - '@babel/types': 7.25.2 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - '@babel/generator@7.22.9': dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.25.2 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 @@ -10864,29 +11249,29 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.22.5)': + '@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-member-expression-to-functions': 7.24.8 '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.22.5) + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.19.3) '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 '@babel/traverse': 7.25.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.22.5)': + '@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-annotate-as-pure': 7.24.7 regexpu-core: 5.3.2 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.22.5)': + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 debug: 4.3.6 @@ -10903,30 +11288,30 @@ snapshots: '@babel/helper-function-name@7.19.0': dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.22.5 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 '@babel/helper-function-name@7.22.5': dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 '@babel/helper-function-name@7.24.6': dependencies: - '@babel/template': 7.24.6 - '@babel/types': 7.24.6 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 '@babel/helper-hoist-variables@7.18.6': dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.25.2 '@babel/helper-hoist-variables@7.22.5': dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.25.2 '@babel/helper-hoist-variables@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.2 '@babel/helper-member-expression-to-functions@7.24.8': dependencies: @@ -10937,7 +11322,7 @@ snapshots: '@babel/helper-module-imports@7.22.5': dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.25.2 '@babel/helper-module-imports@7.24.6': dependencies: @@ -10974,9 +11359,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.25.2(@babel/core@7.22.5)': + '@babel/helper-module-transforms@7.25.2(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-module-imports': 7.24.7 '@babel/helper-simple-access': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 @@ -11004,18 +11389,18 @@ snapshots: '@babel/helper-plugin-utils@7.24.8': {} - '@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.22.5)': + '@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-wrap-function': 7.25.0 '@babel/traverse': 7.25.3 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.25.0(@babel/core@7.22.5)': + '@babel/helper-replace-supers@7.25.0(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-member-expression-to-functions': 7.24.8 '@babel/helper-optimise-call-expression': 7.24.7 '@babel/traverse': 7.25.3 @@ -11024,7 +11409,7 @@ snapshots: '@babel/helper-simple-access@7.18.6': dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.25.2 '@babel/helper-simple-access@7.24.7': dependencies: @@ -11042,15 +11427,15 @@ snapshots: '@babel/helper-split-export-declaration@7.18.6': dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.25.2 '@babel/helper-split-export-declaration@7.22.6': dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.25.2 '@babel/helper-split-export-declaration@7.24.6': dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.25.2 '@babel/helper-string-parser@7.22.5': {} @@ -11082,14 +11467,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helpers@7.22.5': - dependencies: - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 - transitivePeerDependencies: - - supports-color - '@babel/helpers@7.24.6': dependencies: '@babel/template': 7.24.6 @@ -11117,7 +11494,7 @@ snapshots: '@babel/parser@7.22.7': dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.25.2 '@babel/parser@7.24.6': dependencies: @@ -11127,93 +11504,93 @@ snapshots: dependencies: '@babel/types': 7.25.2 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.22.5)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 '@babel/traverse': 7.25.3 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.22.5)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.22.5)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.22.5) + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.19.3) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.22.5)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 '@babel/traverse': 7.25.3 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.5)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.5)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.5)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.5)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.5)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.5)': + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.5)': + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.5)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.5)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-syntax-jsx@7.24.6(@babel/core@7.24.6)': @@ -11226,317 +11603,317 @@ snapshots: '@babel/core': 7.24.6 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.5)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.5)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.5)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.5)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.5)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.5)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.5)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.5)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.5)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.19.3) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-async-generator-functions@7.25.0(@babel/core@7.22.5)': + '@babel/plugin-transform-async-generator-functions@7.25.0(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.22.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.5) + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.19.3) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.19.3) '@babel/traverse': 7.25.3 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-module-imports': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.22.5) + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.19.3) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.22.5)': + '@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.19.3) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.19.3) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.5) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.19.3) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.25.0(@babel/core@7.22.5)': + '@babel/plugin-transform-classes@7.25.0(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.22.5) + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.19.3) '@babel/traverse': 7.25.3 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 '@babel/template': 7.25.0 - '@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.22.5)': + '@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.19.3) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.22.5)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.19.3) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.19.3) - '@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.19.3) - '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.25.1(@babel/core@7.22.5)': + '@babel/plugin-transform-function-name@7.25.1(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/traverse': 7.25.3 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.19.3) - '@babel/plugin-transform-literals@7.25.2(@babel/core@7.22.5)': + '@babel/plugin-transform-literals@7.25.2(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.19.3) - '@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.19.3) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.22.5)': + '@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.19.3) '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-simple-access': 7.24.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.22.5)': + '@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.19.3) '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 '@babel/traverse': 7.25.3 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.19.3) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.19.3) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-new-target@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-new-target@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.19.3) - '@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.19.3) - '@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.22.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.19.3) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.19.3) - '@babel/plugin-transform-object-super@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-object-super@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.22.5) + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.19.3) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.19.3) - '@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.22.5)': + '@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.19.3) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-parameters@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.19.3) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.22.5) + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.19.3) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.5) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.19.3) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 '@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.24.6)': @@ -11551,11 +11928,21 @@ snapshots: '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-transform-react-jsx-source@7.18.6(@babel/core@7.19.3)': dependencies: '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-transform-react-jsx@7.24.6(@babel/core@7.24.6)': dependencies: '@babel/core': 7.24.6 @@ -11576,160 +11963,160 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 regenerator-transform: 0.15.2 - '@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-spread@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-spread@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.22.5)': + '@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.19.3) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.19.3) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.22.5)': + '@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.19.3) '@babel/helper-plugin-utils': 7.24.8 - '@babel/preset-env@7.25.3(@babel/core@7.22.5)': + '@babel/preset-env@7.25.3(@babel/core@7.19.3)': dependencies: '@babel/compat-data': 7.25.2 - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.3(@babel/core@7.22.5) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.22.5) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.22.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.22.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.5) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.5) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.5) - '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-async-generator-functions': 7.25.0(@babel/core@7.22.5) - '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.22.5) - '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-classes': 7.25.0(@babel/core@7.22.5) - '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.22.5) - '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.22.5) - '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.22.5) - '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.22.5) - '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.22.5) - '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.22.5) - '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.22.5) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.22.5) - '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.22.5) - '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.22.5) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.22.5) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.22.5) - babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.22.5) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.22.5) + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.3(@babel/core@7.19.3) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.19.3) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.19.3) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.19.3) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.19.3) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.19.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.19.3) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.19.3) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.19.3) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.19.3) + '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.19.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.19.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.19.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.19.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.19.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.19.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.19.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.19.3) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.19.3) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.19.3) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.19.3) + '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-async-generator-functions': 7.25.0(@babel/core@7.19.3) + '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.19.3) + '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-classes': 7.25.0(@babel/core@7.19.3) + '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.19.3) + '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.19.3) + '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.19.3) + '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.19.3) + '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.19.3) + '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.19.3) + '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.19.3) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.19.3) + '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.19.3) + '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.19.3) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.19.3) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.19.3) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.19.3) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.19.3) core-js-compat: 3.38.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.22.5)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.19.3)': dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@babel/helper-plugin-utils': 7.24.8 '@babel/types': 7.25.2 esutils: 2.0.3 @@ -11758,7 +12145,7 @@ snapshots: dependencies: '@babel/code-frame': 7.24.7 '@babel/parser': 7.25.3 - '@babel/types': 7.22.5 + '@babel/types': 7.25.2 '@babel/template@7.24.6': dependencies: @@ -11790,13 +12177,13 @@ snapshots: '@babel/traverse@7.22.8': dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.22.9 + '@babel/generator': 7.25.0 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-function-name': 7.22.5 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.25.3 - '@babel/types': 7.22.5 + '@babel/types': 7.25.2 debug: 4.3.6 globals: 11.12.0 transitivePeerDependencies: @@ -12936,6 +13323,15 @@ snapshots: transitivePeerDependencies: - react-dom + '@liuli-util/react-router@0.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@liuli-util/tree': 3.9.0 + history: 5.3.0 + react: 18.3.1 + react-router-dom: 6.26.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react-dom + '@liuli-util/rollup-plugin-i18next-dts-gen@0.4.4(typescript@4.8.4)': dependencies: '@liuli-util/i18next-dts-gen': 0.6.4(typescript@4.8.4) @@ -13516,27 +13912,6 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@preact/preset-vite@2.9.0(@babel/core@7.24.6)(preact@10.23.1)(vite@5.3.5(@types/node@18.19.43)(less@4.2.0)(terser@5.31.3))': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/core': 7.24.6 - '@babel/plugin-transform-react-jsx': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.24.6) - '@prefresh/vite': 2.4.5(preact@10.23.1)(vite@5.3.5(@types/node@18.19.43)(less@4.2.0)(terser@5.31.3)) - '@rollup/pluginutils': 4.2.1 - babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.24.6) - debug: 4.3.5 - kolorist: 1.8.0 - magic-string: 0.30.5 - node-html-parser: 6.1.13 - resolve: 1.22.8 - source-map: 0.7.4 - stack-trace: 1.0.0-pre2 - vite: 5.3.5(@types/node@18.19.43)(less@4.2.0)(terser@5.31.3) - transitivePeerDependencies: - - preact - - supports-color - '@preact/preset-vite@2.9.0(@babel/core@7.24.6)(preact@10.23.1)(vite@5.3.5(@types/node@22.1.0)(less@4.2.0)(terser@5.31.3))': dependencies: '@babel/code-frame': 7.24.7 @@ -13560,6 +13935,12 @@ snapshots: '@preact/signals-core@1.8.0': {} + '@preact/signals-react@2.1.0(react@18.3.1)': + dependencies: + '@preact/signals-core': 1.8.0 + react: 18.3.1 + use-sync-external-store: 1.2.0(react@18.3.1) + '@preact/signals@1.3.0(preact@10.23.1)': dependencies: '@preact/signals-core': 1.8.0 @@ -13573,18 +13954,6 @@ snapshots: '@prefresh/utils@1.2.0': {} - '@prefresh/vite@2.4.5(preact@10.23.1)(vite@5.3.5(@types/node@18.19.43)(less@4.2.0)(terser@5.31.3))': - dependencies: - '@babel/core': 7.24.6 - '@prefresh/babel-plugin': 0.5.1 - '@prefresh/core': 1.5.2(preact@10.23.1) - '@prefresh/utils': 1.2.0 - '@rollup/pluginutils': 4.2.1 - preact: 10.23.1 - vite: 5.3.5(@types/node@18.19.43)(less@4.2.0)(terser@5.31.3) - transitivePeerDependencies: - - supports-color - '@prefresh/vite@2.4.5(preact@10.23.1)(vite@5.3.5(@types/node@22.1.0)(less@4.2.0)(terser@5.31.3))': dependencies: '@babel/core': 7.24.6 @@ -13620,6 +13989,184 @@ snapshots: '@oddbird/popover-polyfill': 0.4.4 '@primer/behaviors': 1.7.1 + '@radix-ui/number@1.1.0': {} + + '@radix-ui/primitive@1.1.0': {} + + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-context@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-direction@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-id@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-scroll-area@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-separator@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-slot@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@rc-component/portal@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 @@ -13979,9 +14526,9 @@ snapshots: tslib: 2.6.3 optional: true - '@smithy/eventstream-serde-browser@3.0.5': + '@smithy/eventstream-serde-browser@3.0.6': dependencies: - '@smithy/eventstream-serde-universal': 3.0.4 + '@smithy/eventstream-serde-universal': 3.0.5 '@smithy/types': 3.3.0 tslib: 2.6.3 optional: true @@ -13992,14 +14539,14 @@ snapshots: tslib: 2.6.3 optional: true - '@smithy/eventstream-serde-node@3.0.4': + '@smithy/eventstream-serde-node@3.0.5': dependencies: - '@smithy/eventstream-serde-universal': 3.0.4 + '@smithy/eventstream-serde-universal': 3.0.5 '@smithy/types': 3.3.0 tslib: 2.6.3 optional: true - '@smithy/eventstream-serde-universal@3.0.4': + '@smithy/eventstream-serde-universal@3.0.5': dependencies: '@smithy/eventstream-codec': 3.1.2 '@smithy/types': 3.3.0 @@ -14415,6 +14962,14 @@ snapshots: '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.2 + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.20.6 + '@types/babel__generator@7.6.4': dependencies: '@babel/types': 7.22.5 @@ -14835,6 +15390,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitejs/plugin-react@4.3.1(vite@5.3.5(@types/node@18.19.43)(less@4.2.0)(terser@5.31.3))': + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 5.3.5(@types/node@18.19.43)(less@4.2.0)(terser@5.31.3) + transitivePeerDependencies: + - supports-color + '@vitejs/plugin-vue@5.1.2(vite@5.3.5(@types/node@22.1.0)(less@4.2.0)(terser@5.31.3))(vue@3.4.36(typescript@5.5.4))': dependencies: vite: 5.3.5(@types/node@22.1.0)(less@4.2.0)(terser@5.31.3) @@ -15320,11 +15886,6 @@ snapshots: any-promise@1.3.0: {} - anymatch@3.1.2: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -15340,6 +15901,10 @@ snapshots: argparse@2.0.1: {} + aria-hidden@1.2.4: + dependencies: + tslib: 2.6.3 + array-differ@4.0.0: {} array-ify@1.0.0: {} @@ -15408,13 +15973,13 @@ snapshots: aws4@1.13.1: {} - babel-jest@29.7.0(@babel/core@7.22.5): + babel-jest@29.7.0(@babel/core@7.19.3): dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.19.3 '@jest/transform': 29.7.0 '@types/babel__core': 7.1.19 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.22.5) + babel-preset-jest: 29.6.3(@babel/core@7.19.3) chalk: 4.1.2 graceful-fs: 4.2.10 slash: 3.0.0 @@ -15438,27 +16003,27 @@ snapshots: '@types/babel__core': 7.1.19 '@types/babel__traverse': 7.20.6 - babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.22.5): + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.19.3): dependencies: '@babel/compat-data': 7.25.2 - '@babel/core': 7.22.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.19.3) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.22.5): + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.19.3): dependencies: - '@babel/core': 7.22.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.19.3) core-js-compat: 3.38.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.22.5): + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.19.3): dependencies: - '@babel/core': 7.22.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.22.5) + '@babel/core': 7.19.3 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.19.3) transitivePeerDependencies: - supports-color @@ -15466,27 +16031,27 @@ snapshots: dependencies: '@babel/core': 7.24.6 - babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.5): - dependencies: - '@babel/core': 7.22.5 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.5) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.5) - - babel-preset-jest@29.6.3(@babel/core@7.22.5): - dependencies: - '@babel/core': 7.22.5 + babel-preset-current-node-syntax@1.0.1(@babel/core@7.19.3): + dependencies: + '@babel/core': 7.19.3 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.19.3) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.19.3) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.19.3) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.19.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.19.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.19.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.19.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.19.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.19.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.19.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.19.3) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.19.3) + + babel-preset-jest@29.6.3(@babel/core@7.19.3): + dependencies: + '@babel/core': 7.19.3 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.5) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.19.3) bail@2.0.2: {} @@ -15500,8 +16065,6 @@ snapshots: dependencies: tweetnacl: 0.14.5 - binary-extensions@2.2.0: {} - binary-extensions@2.3.0: {} binary-search@1.3.6: {} @@ -15543,10 +16106,6 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -15709,8 +16268,8 @@ snapshots: chokidar@3.6.0: dependencies: - anymatch: 3.1.2 - braces: 3.0.2 + anymatch: 3.1.3 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -15734,6 +16293,10 @@ snapshots: ci-info@4.0.0: {} + class-variance-authority@0.7.0: + dependencies: + clsx: 2.0.0 + classnames@2.5.1: {} clean-css@5.3.1: @@ -15763,6 +16326,10 @@ snapshots: clone@1.0.4: {} + clsx@2.0.0: {} + + clsx@2.1.1: {} + code-block-writer@12.0.0: {} color-convert@1.9.3: @@ -16097,6 +16664,13 @@ snapshots: deepmerge@4.3.1: {} + deepsignal@1.5.0(@preact/signals-core@1.8.0)(@preact/signals-react@2.1.0(react@18.3.1))(@preact/signals@1.3.0(preact@10.23.1))(preact@10.23.1): + optionalDependencies: + '@preact/signals': 1.3.0(preact@10.23.1) + '@preact/signals-core': 1.8.0 + '@preact/signals-react': 2.1.0(react@18.3.1) + preact: 10.23.1 + defaults@1.0.4: dependencies: clone: 1.0.4 @@ -16109,6 +16683,8 @@ snapshots: dequal@2.0.3: {} + detect-node-es@1.1.0: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -16764,10 +17340,6 @@ snapshots: strip-outer: 2.0.0 trim-repeated: 2.0.0 - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -16921,6 +17493,8 @@ snapshots: get-func-name@2.0.2: {} + get-nonce@1.0.1: {} + get-package-type@0.1.0: {} get-stream@5.2.0: @@ -17403,6 +17977,10 @@ snapshots: dependencies: css-in-js-utils: 3.1.0 + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + invert-kv@3.0.1: {} is-absolute@0.1.7: @@ -17417,7 +17995,7 @@ snapshots: is-binary-path@2.1.0: dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 is-buffer@1.1.6: {} @@ -17532,7 +18110,7 @@ snapshots: istanbul-lib-instrument@5.2.0: dependencies: - '@babel/core': 7.22.5 + '@babel/core': 7.25.2 '@babel/parser': 7.25.3 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 @@ -18092,6 +18670,10 @@ snapshots: dependencies: yallist: 4.0.0 + lucide-react@0.424.0(react@18.3.1): + dependencies: + react: 18.3.1 + lunr@2.3.9: {} magic-string@0.26.7: @@ -19461,6 +20043,14 @@ snapshots: postcss: 8.4.41 ts-node: 10.9.2(@types/node@18.19.43)(typescript@4.8.4) + postcss-load-config@4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)): + dependencies: + lilconfig: 3.1.2 + yaml: 2.5.0 + optionalDependencies: + postcss: 8.4.41 + ts-node: 10.9.2(@types/node@18.19.43)(typescript@5.5.4) + postcss-load-config@4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)): dependencies: lilconfig: 3.1.2 @@ -19959,6 +20549,27 @@ snapshots: react-refresh@0.13.0: {} + react-refresh@0.14.2: {} + + react-remove-scroll-bar@2.3.6(@types/react@18.3.3)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) + tslib: 2.6.3 + optionalDependencies: + '@types/react': 18.3.3 + + react-remove-scroll@2.5.7(@types/react@18.3.3)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.3)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) + tslib: 2.6.3 + use-callback-ref: 1.3.2(@types/react@18.3.3)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + react-router-dom@6.26.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.19.0 @@ -19971,6 +20582,17 @@ snapshots: '@remix-run/router': 1.19.0 react: 18.3.1 + react-string-replace@1.1.1: {} + + react-style-singleton@2.2.1(@types/react@18.3.3)(react@18.3.1): + dependencies: + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.3.1 + tslib: 2.6.3 + optionalDependencies: + '@types/react': 18.3.3 + react-universal-interface@0.6.2(react@18.3.1)(tslib@2.6.3): dependencies: react: 18.3.1 @@ -19995,6 +20617,11 @@ snapshots: ts-easing: 0.2.0 tslib: 2.6.3 + react-zoom-pan-pinch@3.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -20687,6 +21314,39 @@ snapshots: tabbable@6.2.0: {} + tailwind-merge@2.4.0: {} + + tailwindcss-animate@1.0.7(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4))): + dependencies: + tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)) + + tailwindcss@3.4.7(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.7 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.1 + postcss: 8.4.41 + postcss-import: 15.1.0(postcss@8.4.41) + postcss-js: 4.0.1(postcss@8.4.41) + postcss-load-config: 4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4)) + postcss-nested: 6.0.1(postcss@8.4.41) + postcss-selector-parser: 6.1.0 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + tailwindcss@3.4.7(ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4)): dependencies: '@alloc/quick-lru': 5.2.0 @@ -20881,6 +21541,25 @@ snapshots: yn: 3.1.1 optional: true + ts-node@10.9.2(@types/node@18.19.43)(typescript@5.5.4): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 18.19.43 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -21203,6 +21882,21 @@ snapshots: requires-port: 1.0.0 optional: true + use-callback-ref@1.3.2(@types/react@18.3.3)(react@18.3.1): + dependencies: + react: 18.3.1 + tslib: 2.6.3 + optionalDependencies: + '@types/react': 18.3.3 + + use-sidecar@1.1.2(@types/react@18.3.3)(react@18.3.1): + dependencies: + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.6.3 + optionalDependencies: + '@types/react': 18.3.3 + use-sync-external-store@1.2.0(react@18.3.1): dependencies: react: 18.3.1 @@ -21237,6 +21931,15 @@ snapshots: validator@13.9.0: {} + vaul@0.9.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + verror@1.10.0: dependencies: assert-plus: 1.0.0