diff --git a/.gitignore b/.gitignore
index 2ccbe46..3d2bc62 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
+/dist/
/node_modules/
diff --git a/client/.gitignore b/client/.gitignore
deleted file mode 100644
index 3d2bc62..0000000
--- a/client/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/dist/
-/node_modules/
diff --git a/client/index.html b/client/index.html
deleted file mode 100644
index 79f5410..0000000
--- a/client/index.html
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/package.json b/client/package.json
deleted file mode 100644
index 4c67546..0000000
--- a/client/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "name": "mdgraph-client",
- "private": true,
- "version": "0.0.0",
- "type": "module",
- "scripts": {
- "dev": "vite",
- "build": "tsc -b && vite build",
- "lint": "eslint .",
- "preview": "vite preview"
- },
- "dependencies": {
- "@radix-ui/react-dialog": "^1.1.15",
- "@radix-ui/react-dropdown-menu": "^2.1.16",
- "@radix-ui/react-separator": "^1.1.8",
- "@radix-ui/react-slot": "^1.2.4",
- "@radix-ui/react-tooltip": "^1.2.8",
- "class-variance-authority": "^0.7.1",
- "clsx": "^2.1.1",
- "lucide-react": "^0.561.0",
- "react": "^19.2.3",
- "react-dom": "^19.2.3",
- "tailwind-merge": "^3.4.0"
- },
- "devDependencies": {
- "@eslint/js": "^9.39.1",
- "@tailwindcss/typography": "^0.5.19",
- "@tailwindcss/vite": "^4.1.18",
- "@types/dom-chromium-ai": "^0.0.11",
- "@types/node": "^25.0.1",
- "@types/react": "^19.2.7",
- "@types/react-dom": "^19.2.3",
- "@vitejs/plugin-react": "^5.1.2",
- "babel-plugin-react-compiler": "^1.0.0",
- "eslint": "^9.39.1",
- "eslint-plugin-react-hooks": "^7.0.1",
- "eslint-plugin-react-refresh": "^0.4.24",
- "globals": "^16.5.0",
- "tailwindcss": "^4.1.18",
- "tw-animate-css": "^1.4.0",
- "typescript": "~5.9.3",
- "typescript-eslint": "^8.49.0",
- "vite": "8.0.0-beta.4",
- "vite-tsconfig-paths": "^5.1.4"
- }
-}
diff --git a/client/src/main.tsx b/client/src/main.tsx
deleted file mode 100644
index 2dbfcc7..0000000
--- a/client/src/main.tsx
+++ /dev/null
@@ -1,174 +0,0 @@
-import { StrictMode, useState } from "react"
-import { createRoot } from "react-dom/client"
-import "./index.css"
-import { LanguagesIcon, FileDownIcon, PictureInPictureIcon, ChevronDownIcon } from "lucide-react"
-import { Button } from "@/components/ui/button"
-import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"
-import { ThemeProvider } from "./components/theme-provider"
-import { ModeToggle } from "./components/mode-toggle"
-import { Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarProvider, SidebarRail, SidebarTrigger } from "@/components/ui/sidebar"
-
-const rootElement = document.getElementById("root")!
-const headerElement = document.getElementById("header")!
-const mainElement = document.getElementById("main")!
-const tocElement = mainElement.removeChild(mainElement.firstElementChild!)!
-
-const base = rootElement.dataset.base!
-function processLanguage(id: string): { id: string, displayName: string, pathname: string } {
- return {
- id,
- displayName: new Intl.DisplayNames(id, { type: "language" }).of(id)!,
- pathname: `${base}${id}${location.pathname.substring(location.pathname.indexOf("/", base.length))}`,
- }
-}
-
-const currentLanguage = processLanguage(document.documentElement.lang)
-const availableLanguages = rootElement.dataset.languages!.split(" ").map(processLanguage)
-
-const markdownPathname = `${location.pathname}${location.pathname.endsWith("/") ? "index" : ""}.md`
-
-type TocItem = {
- href: string,
- heading: string,
- children: TocItem[],
-}
-
-function toTocItem(element: HTMLLIElement): TocItem {
- const anchorElement = element.querySelector("a")!
- const children: TocItem[] = []
- for (const chid of element.querySelector("ol")?.children ?? []) {
- children.push(toTocItem(chid as HTMLLIElement))
- }
- return {
- href: anchorElement.href,
- heading: anchorElement.textContent,
- children,
- }
-}
-const tocTreeItem = toTocItem(tocElement.firstElementChild!.firstElementChild as HTMLLIElement)!
-
-function Toc({ item }: { item: TocItem }) {
- if (item.children.length > 0) {
- return (
-
-
-
- {item.heading}
-
-
-
- {item.children.map((subItem, index) => (
-
- ))}
-
-
- )
- } else {
- return (
-
-
- {item.heading}
-
-
- )
- }
-}
-
-function Document() {
- const [defaultOpen] = useState(() => {
- const sidebarState = localStorage.getItem("sidebar-state")
- switch (sidebarState) {
- case "expanded": return true
- case "collapsed": return false
- default: return true
- }
- })
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
-
-createRoot(rootElement).render(
-
-
-
-
-
-)
diff --git a/client/components.json b/components.json
similarity index 100%
rename from client/components.json
rename to components.json
diff --git a/client/eslint.config.js b/eslint.config.js
similarity index 100%
rename from client/eslint.config.js
rename to eslint.config.js
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..b196775
--- /dev/null
+++ b/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..2dc71e3
--- /dev/null
+++ b/package.json
@@ -0,0 +1,75 @@
+{
+ "name": "mdgraph",
+ "version": "0.0.0",
+ "type": "module",
+ "bin": {
+ "mdgraph": "dist/server/entry-server.js"
+ },
+ "scripts": {
+ "dev": "vite",
+ "build": "pnpm run \"/^build:.*/\"",
+ "build:client": "vite build --outDir dist/client",
+ "build:server": "vite build --ssr src/entry-server.tsx --outDir dist/server",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@commander-js/extra-typings": "^14.0.0",
+ "@radix-ui/react-dialog": "^1.1.15",
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
+ "@radix-ui/react-separator": "^1.1.8",
+ "@radix-ui/react-slot": "^1.2.4",
+ "@radix-ui/react-tooltip": "^1.2.8",
+ "@shikijs/rehype": "^3.20.0",
+ "@tailwindcss/typography": "^0.5.19",
+ "@tailwindcss/vite": "^4.1.18",
+ "chokidar": "^5.0.0",
+ "class-variance-authority": "^0.7.1",
+ "clsx": "^2.1.1",
+ "hast-util-from-html-isomorphic": "^2.0.0",
+ "hastscript": "^9.0.1",
+ "lucide-react": "^0.562.0",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
+ "rehype-autolink-headings": "^7.1.0",
+ "rehype-document": "^7.0.3",
+ "rehype-infer-title-meta": "^2.0.0",
+ "rehype-mathjax": "^7.1.0",
+ "rehype-meta": "^4.0.1",
+ "rehype-parse": "^9.0.1",
+ "rehype-preset-minify": "^7.0.1",
+ "rehype-react": "^8.0.0",
+ "rehype-slug": "^6.0.0",
+ "rehype-stringify": "^10.0.1",
+ "remark-gfm": "^4.0.1",
+ "remark-math": "^6.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.1.2",
+ "sirv": "^3.0.2",
+ "string-width": "^8.1.0",
+ "tailwind-merge": "^3.4.0",
+ "tailwindcss": "^4.1.18",
+ "unified": "^11.0.5",
+ "unist-util-find": "^3.0.0",
+ "unist-util-visit-parents": "^6.0.2",
+ "zod": "^4.2.1"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.39.2",
+ "@shikijs/types": "^3.20.0",
+ "@types/hast": "^3.0.4",
+ "@types/node": "^25.0.3",
+ "@types/react": "^19.2.7",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^5.1.2",
+ "babel-plugin-react-compiler": "^1.0.0",
+ "eslint": "^9.39.2",
+ "eslint-plugin-react-hooks": "^7.0.1",
+ "eslint-plugin-react-refresh": "^0.4.26",
+ "globals": "^16.5.0",
+ "tw-animate-css": "^1.4.0",
+ "typescript": "~5.9.3",
+ "typescript-eslint": "^8.50.1",
+ "vite": "8.0.0-beta.4"
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 7d13a33..0097bc8 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -9,8 +9,11 @@ overrides:
importers:
- client:
+ .:
dependencies:
+ '@commander-js/extra-typings':
+ specifier: ^14.0.0
+ version: 14.0.0(commander@13.1.0)
'@radix-ui/react-dialog':
specifier: ^1.1.15
version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@@ -26,103 +29,39 @@ importers:
'@radix-ui/react-tooltip':
specifier: ^1.2.8
version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- class-variance-authority:
- specifier: ^0.7.1
- version: 0.7.1
- clsx:
- specifier: ^2.1.1
- version: 2.1.1
- lucide-react:
- specifier: ^0.561.0
- version: 0.561.0(react@19.2.3)
- react:
- specifier: ^19.2.3
- version: 19.2.3
- react-dom:
- specifier: ^19.2.3
- version: 19.2.3(react@19.2.3)
- tailwind-merge:
- specifier: ^3.4.0
- version: 3.4.0
- devDependencies:
- '@eslint/js':
- specifier: ^9.39.1
- version: 9.39.1
+ '@shikijs/rehype':
+ specifier: ^3.20.0
+ version: 3.20.0
'@tailwindcss/typography':
specifier: ^0.5.19
version: 0.5.19(tailwindcss@4.1.18)
'@tailwindcss/vite':
specifier: ^4.1.18
- version: 4.1.18(vite@8.0.0-beta.4(@types/node@25.0.1)(jiti@2.6.1))
- '@types/dom-chromium-ai':
- specifier: ^0.0.11
- version: 0.0.11
- '@types/node':
- specifier: ^25.0.1
- version: 25.0.1
- '@types/react':
- specifier: ^19.2.7
- version: 19.2.7
- '@types/react-dom':
- specifier: ^19.2.3
- version: 19.2.3(@types/react@19.2.7)
- '@vitejs/plugin-react':
- specifier: ^5.1.2
- version: 5.1.2(vite@8.0.0-beta.4(@types/node@25.0.1)(jiti@2.6.1))
- babel-plugin-react-compiler:
- specifier: ^1.0.0
- version: 1.0.0
- eslint:
- specifier: ^9.39.1
- version: 9.39.1(jiti@2.6.1)
- eslint-plugin-react-hooks:
- specifier: ^7.0.1
- version: 7.0.1(eslint@9.39.1(jiti@2.6.1))
- eslint-plugin-react-refresh:
- specifier: ^0.4.24
- version: 0.4.24(eslint@9.39.1(jiti@2.6.1))
- globals:
- specifier: ^16.5.0
- version: 16.5.0
- tailwindcss:
- specifier: ^4.1.18
- version: 4.1.18
- tw-animate-css:
- specifier: ^1.4.0
- version: 1.4.0
- typescript:
- specifier: ~5.9.3
- version: 5.9.3
- typescript-eslint:
- specifier: ^8.49.0
- version: 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
- vite:
- specifier: 8.0.0-beta.4
- version: 8.0.0-beta.4(@types/node@25.0.1)(jiti@2.6.1)
- vite-tsconfig-paths:
- specifier: ^5.1.4
- version: 5.1.4(typescript@5.9.3)(vite@8.0.0-beta.4(@types/node@25.0.1)(jiti@2.6.1))
-
- server:
- dependencies:
- '@commander-js/extra-typings':
- specifier: ^14.0.0
- version: 14.0.0(commander@14.0.2)
- '@jsdevtools/rehype-toc':
- specifier: ^3.0.2
- version: 3.0.2
- '@shikijs/rehype':
- specifier: ^3.20.0
- version: 3.20.0
+ version: 4.1.18(vite@8.0.0-beta.4(@types/node@25.0.3)(jiti@2.6.1))
chokidar:
specifier: ^5.0.0
version: 5.0.0
+ class-variance-authority:
+ specifier: ^0.7.1
+ version: 0.7.1
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
hast-util-from-html-isomorphic:
specifier: ^2.0.0
version: 2.0.0
hastscript:
specifier: ^9.0.1
version: 9.0.1
+ lucide-react:
+ specifier: ^0.562.0
+ version: 0.562.0(react@19.2.3)
+ react:
+ specifier: ^19.2.3
+ version: 19.2.3
+ react-dom:
+ specifier: ^19.2.3
+ version: 19.2.3(react@19.2.3)
rehype-autolink-headings:
specifier: ^7.1.0
version: 7.1.0
@@ -138,9 +77,15 @@ importers:
rehype-meta:
specifier: ^4.0.1
version: 4.0.1
+ rehype-parse:
+ specifier: ^9.0.1
+ version: 9.0.1
rehype-preset-minify:
specifier: ^7.0.1
version: 7.0.1
+ rehype-react:
+ specifier: ^8.0.0
+ version: 8.0.0
rehype-slug:
specifier: ^6.0.0
version: 6.0.0
@@ -165,6 +110,12 @@ importers:
string-width:
specifier: ^8.1.0
version: 8.1.0
+ tailwind-merge:
+ specifier: ^3.4.0
+ version: 3.4.0
+ tailwindcss:
+ specifier: ^4.1.18
+ version: 4.1.18
unified:
specifier: ^11.0.5
version: 11.0.5
@@ -175,9 +126,12 @@ importers:
specifier: ^6.0.2
version: 6.0.2
zod:
- specifier: ^4.1.13
- version: 4.1.13
+ specifier: ^4.2.1
+ version: 4.2.1
devDependencies:
+ '@eslint/js':
+ specifier: ^9.39.2
+ version: 9.39.2
'@shikijs/types':
specifier: ^3.20.0
version: 3.20.0
@@ -185,11 +139,44 @@ importers:
specifier: ^3.0.4
version: 3.0.4
'@types/node':
- specifier: ^25.0.1
- version: 25.0.1
+ specifier: ^25.0.3
+ version: 25.0.3
+ '@types/react':
+ specifier: ^19.2.7
+ version: 19.2.7
+ '@types/react-dom':
+ specifier: ^19.2.3
+ version: 19.2.3(@types/react@19.2.7)
+ '@vitejs/plugin-react':
+ specifier: ^5.1.2
+ version: 5.1.2(vite@8.0.0-beta.4(@types/node@25.0.3)(jiti@2.6.1))
+ babel-plugin-react-compiler:
+ specifier: ^1.0.0
+ version: 1.0.0
+ eslint:
+ specifier: ^9.39.2
+ version: 9.39.2(jiti@2.6.1)
+ eslint-plugin-react-hooks:
+ specifier: ^7.0.1
+ version: 7.0.1(eslint@9.39.2(jiti@2.6.1))
+ eslint-plugin-react-refresh:
+ specifier: ^0.4.26
+ version: 0.4.26(eslint@9.39.2(jiti@2.6.1))
+ globals:
+ specifier: ^16.5.0
+ version: 16.5.0
+ tw-animate-css:
+ specifier: ^1.4.0
+ version: 1.4.0
typescript:
- specifier: ^5.9.3
+ specifier: ~5.9.3
version: 5.9.3
+ typescript-eslint:
+ specifier: ^8.50.1
+ version: 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ vite:
+ specifier: 8.0.0-beta.4
+ version: 8.0.0-beta.4(@types/node@25.0.3)(jiti@2.6.1)
packages:
@@ -316,8 +303,8 @@ packages:
resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/js@9.39.1':
- resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==}
+ '@eslint/js@9.39.2':
+ resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.7':
@@ -375,10 +362,6 @@ packages:
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
- '@jsdevtools/rehype-toc@3.0.2':
- resolution: {integrity: sha512-n5JEf16Wr4mdkRMZ8wMP/wN9/sHmTjRPbouXjJH371mZ2LEGDl72t8tEsMRNFerQN/QJtivOxqK1frdGa4QK5Q==}
- engines: {node: '>=10'}
-
'@napi-rs/wasm-runtime@1.1.0':
resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==}
@@ -952,8 +935,8 @@ packages:
'@types/debug@4.1.12':
resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
- '@types/dom-chromium-ai@0.0.11':
- resolution: {integrity: sha512-Li04Mac9ic1vbX/te9re8v1010fh5YB/30dMcJLpIuIyDoT7xE/dIdg9r9UrFZLs5Ztmonb3nP7+LhPpFuHBGw==}
+ '@types/estree-jsx@1.0.5':
+ resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
@@ -976,8 +959,8 @@ packages:
'@types/ms@2.1.0':
resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
- '@types/node@25.0.1':
- resolution: {integrity: sha512-czWPzKIAXucn9PtsttxmumiQ9N0ok9FrBwgRWrwmVLlp86BrMExzvXRLFYRJ+Ex3g6yqj+KuaxfX1JTgV2lpfg==}
+ '@types/node@25.0.3':
+ resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==}
'@types/react-dom@19.2.3':
resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
@@ -987,66 +970,69 @@ packages:
'@types/react@19.2.7':
resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==}
+ '@types/unist@2.0.11':
+ resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
+
'@types/unist@3.0.3':
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
- '@typescript-eslint/eslint-plugin@8.49.0':
- resolution: {integrity: sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A==}
+ '@typescript-eslint/eslint-plugin@8.50.1':
+ resolution: {integrity: sha512-PKhLGDq3JAg0Jk/aK890knnqduuI/Qj+udH7wCf0217IGi4gt+acgCyPVe79qoT+qKUvHMDQkwJeKW9fwl8Cyw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@typescript-eslint/parser': ^8.49.0
+ '@typescript-eslint/parser': ^8.50.1
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/parser@8.49.0':
- resolution: {integrity: sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==}
+ '@typescript-eslint/parser@8.50.1':
+ resolution: {integrity: sha512-hM5faZwg7aVNa819m/5r7D0h0c9yC4DUlWAOvHAtISdFTc8xB86VmX5Xqabrama3wIPJ/q9RbGS1worb6JfnMg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/project-service@8.49.0':
- resolution: {integrity: sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==}
+ '@typescript-eslint/project-service@8.50.1':
+ resolution: {integrity: sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/scope-manager@8.49.0':
- resolution: {integrity: sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==}
+ '@typescript-eslint/scope-manager@8.50.1':
+ resolution: {integrity: sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/tsconfig-utils@8.49.0':
- resolution: {integrity: sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==}
+ '@typescript-eslint/tsconfig-utils@8.50.1':
+ resolution: {integrity: sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/type-utils@8.49.0':
- resolution: {integrity: sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg==}
+ '@typescript-eslint/type-utils@8.50.1':
+ resolution: {integrity: sha512-7J3bf022QZE42tYMO6SL+6lTPKFk/WphhRPe9Tw/el+cEwzLz1Jjz2PX3GtGQVxooLDKeMVmMt7fWpYRdG5Etg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/types@8.49.0':
- resolution: {integrity: sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==}
+ '@typescript-eslint/types@8.50.1':
+ resolution: {integrity: sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@8.49.0':
- resolution: {integrity: sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==}
+ '@typescript-eslint/typescript-estree@8.50.1':
+ resolution: {integrity: sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/utils@8.49.0':
- resolution: {integrity: sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==}
+ '@typescript-eslint/utils@8.50.1':
+ resolution: {integrity: sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/visitor-keys@8.49.0':
- resolution: {integrity: sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==}
+ '@typescript-eslint/visitor-keys@8.50.1':
+ resolution: {integrity: sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@ungap/structured-clone@1.3.0':
@@ -1149,6 +1135,9 @@ packages:
character-entities@2.0.2:
resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+ character-reference-invalid@2.0.1:
+ resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
+
chokidar@5.0.0:
resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
engines: {node: '>= 20.19.0'}
@@ -1181,10 +1170,6 @@ packages:
resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==}
engines: {node: '>=18'}
- commander@14.0.2:
- resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==}
- engines: {node: '>=20'}
-
commander@8.3.0:
resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
engines: {node: '>= 12'}
@@ -1199,8 +1184,8 @@ packages:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
- css-selector-parser@3.2.0:
- resolution: {integrity: sha512-L1bdkNKUP5WYxiW5dW6vA2hd3sL8BdRNLy2FCX0rLVise4eNw9nBdeBuJHxlELieSE2H1f6bYQFfwVUwWCV9rQ==}
+ css-selector-parser@3.3.0:
+ resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==}
cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
@@ -1272,8 +1257,8 @@ packages:
peerDependencies:
eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
- eslint-plugin-react-refresh@0.4.24:
- resolution: {integrity: sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==}
+ eslint-plugin-react-refresh@0.4.26:
+ resolution: {integrity: sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==}
peerDependencies:
eslint: '>=8.40'
@@ -1289,8 +1274,8 @@ packages:
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- eslint@9.39.1:
- resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==}
+ eslint@9.39.2:
+ resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true
peerDependencies:
@@ -1319,6 +1304,9 @@ packages:
resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
engines: {node: '>=4.0'}
+ estree-util-is-identifier-name@3.0.0:
+ resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
+
esutils@2.0.3:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
@@ -1391,9 +1379,6 @@ packages:
resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==}
engines: {node: '>=18'}
- globrex@0.1.2:
- resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
-
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
@@ -1458,6 +1443,9 @@ packages:
hast-util-to-html@9.0.5:
resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==}
+ hast-util-to-jsx-runtime@2.3.6:
+ resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==}
+
hast-util-to-string@3.0.1:
resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==}
@@ -1504,6 +1492,9 @@ packages:
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
engines: {node: '>=0.8.19'}
+ inline-style-parser@0.2.7:
+ resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==}
+
is-alphabetical@2.0.1:
resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
@@ -1521,6 +1512,9 @@ packages:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
+ is-hexadecimal@2.0.1:
+ resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
+
is-plain-obj@4.1.0:
resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
engines: {node: '>=12'}
@@ -1655,8 +1649,8 @@ packages:
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
- lucide-react@0.561.0:
- resolution: {integrity: sha512-Y59gMY38tl4/i0qewcqohPdEbieBy7SovpBL9IFebhc2mDd8x4PZSOsiFRkpPcOq6bj1r/mjH/Rk73gSlIJP2A==}
+ lucide-react@0.562.0:
+ resolution: {integrity: sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw==}
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -1697,6 +1691,15 @@ packages:
mdast-util-math@3.0.0:
resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==}
+ mdast-util-mdx-expression@2.0.1:
+ resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
+
+ mdast-util-mdx-jsx@3.2.0:
+ resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==}
+
+ mdast-util-mdxjs-esm@2.0.1:
+ resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
+
mdast-util-phrasing@4.1.0:
resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
@@ -1852,6 +1855,9 @@ packages:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
+ parse-entities@4.0.2:
+ resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==}
+
parse5@7.3.0:
resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
@@ -2005,9 +2011,15 @@ packages:
rehype-normalize-attribute-value-case@4.0.1:
resolution: {integrity: sha512-sdsfY4DgVWO3K9lJHdIQHg+ErgSGxpFJX0lIOo0tpChQ+iaJHMITHWCGofLor1NjcxLZeeMTfJ5Aif85kLhL3g==}
+ rehype-parse@9.0.1:
+ resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==}
+
rehype-preset-minify@7.0.1:
resolution: {integrity: sha512-yI5Jdfkg8cVar+d5GgqL3HdM1uFOSvnjIOuoJz2U5ZDOSTMrxPrFlh1egNzYNdddwVXakUz9ivKeCuZbATsFDQ==}
+ rehype-react@8.0.0:
+ resolution: {integrity: sha512-vzo0YxYbB2HE+36+9HWXVdxNoNDubx63r5LBzpxBGVWM8s9mdnMdbmuJBAX6TTyuGdZjZix6qU3GcSuKCIWivw==}
+
rehype-remove-comments@6.1.1:
resolution: {integrity: sha512-O3OAvqpV8IUJf6+Q4s5nqaKQqrgeXdU/+0fjUHMO0KAB4SwkMdN34NJQC9hexwvjYE00tX/xB8GvnVJI8Cdf6g==}
@@ -2122,6 +2134,12 @@ packages:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
+ style-to-js@1.1.21:
+ resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==}
+
+ style-to-object@1.0.14:
+ resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==}
+
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -2156,16 +2174,6 @@ packages:
peerDependencies:
typescript: '>=4.8.4'
- tsconfck@3.1.6:
- resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==}
- engines: {node: ^18 || >=20}
- hasBin: true
- peerDependencies:
- typescript: ^5.0.0
- peerDependenciesMeta:
- typescript:
- optional: true
-
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
@@ -2176,8 +2184,8 @@ packages:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
- typescript-eslint@8.49.0:
- resolution: {integrity: sha512-zRSVH1WXD0uXczCXw+nsdjGPUdx4dfrs5VQoHnUWmv1U3oNlAKv4FUNdLDhVUg+gYn+a5hUESqch//Rv5wVhrg==}
+ typescript-eslint@8.50.1:
+ resolution: {integrity: sha512-ytTHO+SoYSbhAH9CrYnMhiLx8To6PSSvqnvXyPUgPETCvB6eBKmTI9w6XMPS3HsBRGkwTVBX+urA8dYQx6bHfQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@@ -2264,14 +2272,6 @@ packages:
vfile@6.0.3:
resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
- vite-tsconfig-paths@5.1.4:
- resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==}
- peerDependencies:
- vite: 8.0.0-beta.4
- peerDependenciesMeta:
- vite:
- optional: true
-
vite@8.0.0-beta.4:
resolution: {integrity: sha512-fTUZD8GE4HLfiq4JnQoHYPQozsVzD6AfMhqnzG0+whHaM2HVSuS8rPlFdptONr4YDfnsbPigEiyDQ6ngmCtOYQ==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -2340,8 +2340,8 @@ packages:
peerDependencies:
zod: ^3.25.0 || ^4.0.0
- zod@4.1.13:
- resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==}
+ zod@4.2.1:
+ resolution: {integrity: sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==}
zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
@@ -2460,9 +2460,9 @@ snapshots:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.28.5
- '@commander-js/extra-typings@14.0.0(commander@14.0.2)':
+ '@commander-js/extra-typings@14.0.0(commander@13.1.0)':
dependencies:
- commander: 14.0.2
+ commander: 13.1.0
'@emnapi/core@1.7.1':
dependencies:
@@ -2480,9 +2480,9 @@ snapshots:
tslib: 2.8.1
optional: true
- '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))':
+ '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@2.6.1))':
dependencies:
- eslint: 9.39.1(jiti@2.6.1)
+ eslint: 9.39.2(jiti@2.6.1)
eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.2': {}
@@ -2517,7 +2517,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@eslint/js@9.39.1': {}
+ '@eslint/js@9.39.2': {}
'@eslint/object-schema@2.1.7': {}
@@ -2573,8 +2573,6 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
- '@jsdevtools/rehype-toc@3.0.2': {}
-
'@napi-rs/wasm-runtime@1.1.0':
dependencies:
'@emnapi/core': 1.7.1
@@ -3057,12 +3055,12 @@ snapshots:
postcss-selector-parser: 6.0.10
tailwindcss: 4.1.18
- '@tailwindcss/vite@4.1.18(vite@8.0.0-beta.4(@types/node@25.0.1)(jiti@2.6.1))':
+ '@tailwindcss/vite@4.1.18(vite@8.0.0-beta.4(@types/node@25.0.3)(jiti@2.6.1))':
dependencies:
'@tailwindcss/node': 4.1.18
'@tailwindcss/oxide': 4.1.18
tailwindcss: 4.1.18
- vite: 8.0.0-beta.4(@types/node@25.0.1)(jiti@2.6.1)
+ vite: 8.0.0-beta.4(@types/node@25.0.3)(jiti@2.6.1)
'@tybys/wasm-util@0.10.1':
dependencies:
@@ -3094,7 +3092,9 @@ snapshots:
dependencies:
'@types/ms': 2.1.0
- '@types/dom-chromium-ai@0.0.11': {}
+ '@types/estree-jsx@1.0.5':
+ dependencies:
+ '@types/estree': 1.0.8
'@types/estree@1.0.8': {}
@@ -3114,7 +3114,7 @@ snapshots:
'@types/ms@2.1.0': {}
- '@types/node@25.0.1':
+ '@types/node@25.0.3':
dependencies:
undici-types: 7.16.0
@@ -3126,17 +3126,19 @@ snapshots:
dependencies:
csstype: 3.2.3
+ '@types/unist@2.0.11': {}
+
'@types/unist@3.0.3': {}
- '@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)':
+ '@typescript-eslint/eslint-plugin@8.50.1(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
'@eslint-community/regexpp': 4.12.2
- '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
- '@typescript-eslint/scope-manager': 8.49.0
- '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
- '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
- '@typescript-eslint/visitor-keys': 8.49.0
- eslint: 9.39.1(jiti@2.6.1)
+ '@typescript-eslint/parser': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.50.1
+ '@typescript-eslint/type-utils': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.50.1
+ eslint: 9.39.2(jiti@2.6.1)
ignore: 7.0.5
natural-compare: 1.4.0
ts-api-utils: 2.1.0(typescript@5.9.3)
@@ -3144,56 +3146,56 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)':
+ '@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/scope-manager': 8.49.0
- '@typescript-eslint/types': 8.49.0
- '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3)
- '@typescript-eslint/visitor-keys': 8.49.0
+ '@typescript-eslint/scope-manager': 8.50.1
+ '@typescript-eslint/types': 8.50.1
+ '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.50.1
debug: 4.4.3
- eslint: 9.39.1(jiti@2.6.1)
+ eslint: 9.39.2(jiti@2.6.1)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/project-service@8.49.0(typescript@5.9.3)':
+ '@typescript-eslint/project-service@8.50.1(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3)
- '@typescript-eslint/types': 8.49.0
+ '@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3)
+ '@typescript-eslint/types': 8.50.1
debug: 4.4.3
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@8.49.0':
+ '@typescript-eslint/scope-manager@8.50.1':
dependencies:
- '@typescript-eslint/types': 8.49.0
- '@typescript-eslint/visitor-keys': 8.49.0
+ '@typescript-eslint/types': 8.50.1
+ '@typescript-eslint/visitor-keys': 8.50.1
- '@typescript-eslint/tsconfig-utils@8.49.0(typescript@5.9.3)':
+ '@typescript-eslint/tsconfig-utils@8.50.1(typescript@5.9.3)':
dependencies:
typescript: 5.9.3
- '@typescript-eslint/type-utils@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)':
+ '@typescript-eslint/type-utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/types': 8.49.0
- '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3)
- '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/types': 8.50.1
+ '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
debug: 4.4.3
- eslint: 9.39.1(jiti@2.6.1)
+ eslint: 9.39.2(jiti@2.6.1)
ts-api-utils: 2.1.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/types@8.49.0': {}
+ '@typescript-eslint/types@8.50.1': {}
- '@typescript-eslint/typescript-estree@8.49.0(typescript@5.9.3)':
+ '@typescript-eslint/typescript-estree@8.50.1(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/project-service': 8.49.0(typescript@5.9.3)
- '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3)
- '@typescript-eslint/types': 8.49.0
- '@typescript-eslint/visitor-keys': 8.49.0
+ '@typescript-eslint/project-service': 8.50.1(typescript@5.9.3)
+ '@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3)
+ '@typescript-eslint/types': 8.50.1
+ '@typescript-eslint/visitor-keys': 8.50.1
debug: 4.4.3
minimatch: 9.0.5
semver: 7.7.3
@@ -3203,25 +3205,25 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)':
+ '@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
- '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1))
- '@typescript-eslint/scope-manager': 8.49.0
- '@typescript-eslint/types': 8.49.0
- '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3)
- eslint: 9.39.1(jiti@2.6.1)
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1))
+ '@typescript-eslint/scope-manager': 8.50.1
+ '@typescript-eslint/types': 8.50.1
+ '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3)
+ eslint: 9.39.2(jiti@2.6.1)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/visitor-keys@8.49.0':
+ '@typescript-eslint/visitor-keys@8.50.1':
dependencies:
- '@typescript-eslint/types': 8.49.0
+ '@typescript-eslint/types': 8.50.1
eslint-visitor-keys: 4.2.1
'@ungap/structured-clone@1.3.0': {}
- '@vitejs/plugin-react@5.1.2(vite@8.0.0-beta.4(@types/node@25.0.1)(jiti@2.6.1))':
+ '@vitejs/plugin-react@5.1.2(vite@8.0.0-beta.4(@types/node@25.0.3)(jiti@2.6.1))':
dependencies:
'@babel/core': 7.28.5
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5)
@@ -3229,7 +3231,7 @@ snapshots:
'@rolldown/pluginutils': 1.0.0-beta.53
'@types/babel__core': 7.20.5
react-refresh: 0.18.0
- vite: 8.0.0-beta.4(@types/node@25.0.1)(jiti@2.6.1)
+ vite: 8.0.0-beta.4(@types/node@25.0.3)(jiti@2.6.1)
transitivePeerDependencies:
- supports-color
@@ -3319,6 +3321,8 @@ snapshots:
character-entities@2.0.2: {}
+ character-reference-invalid@2.0.1: {}
+
chokidar@5.0.0:
dependencies:
readdirp: 5.0.0
@@ -3345,8 +3349,6 @@ snapshots:
commander@13.1.0: {}
- commander@14.0.2: {}
-
commander@8.3.0: {}
concat-map@0.0.1: {}
@@ -3359,7 +3361,7 @@ snapshots:
shebang-command: 2.0.0
which: 2.0.2
- css-selector-parser@3.2.0: {}
+ css-selector-parser@3.3.0: {}
cssesc@3.0.0: {}
@@ -3402,20 +3404,20 @@ snapshots:
escape-string-regexp@5.0.0: {}
- eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.1)):
+ eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.6.1)):
dependencies:
'@babel/core': 7.28.5
'@babel/parser': 7.28.5
- eslint: 9.39.1(jiti@2.6.1)
+ eslint: 9.39.2(jiti@2.6.1)
hermes-parser: 0.25.1
- zod: 4.1.13
- zod-validation-error: 4.0.2(zod@4.1.13)
+ zod: 4.2.1
+ zod-validation-error: 4.0.2(zod@4.2.1)
transitivePeerDependencies:
- supports-color
- eslint-plugin-react-refresh@0.4.24(eslint@9.39.1(jiti@2.6.1)):
+ eslint-plugin-react-refresh@0.4.26(eslint@9.39.2(jiti@2.6.1)):
dependencies:
- eslint: 9.39.1(jiti@2.6.1)
+ eslint: 9.39.2(jiti@2.6.1)
eslint-scope@8.4.0:
dependencies:
@@ -3426,15 +3428,15 @@ snapshots:
eslint-visitor-keys@4.2.1: {}
- eslint@9.39.1(jiti@2.6.1):
+ eslint@9.39.2(jiti@2.6.1):
dependencies:
- '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1))
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1))
'@eslint-community/regexpp': 4.12.2
'@eslint/config-array': 0.21.1
'@eslint/config-helpers': 0.4.2
'@eslint/core': 0.17.0
'@eslint/eslintrc': 3.3.3
- '@eslint/js': 9.39.1
+ '@eslint/js': 9.39.2
'@eslint/plugin-kit': 0.4.1
'@humanfs/node': 0.16.7
'@humanwhocodes/module-importer': 1.0.1
@@ -3485,6 +3487,8 @@ snapshots:
estraverse@5.3.0: {}
+ estree-util-is-identifier-name@3.0.0: {}
+
esutils@2.0.3: {}
extend@3.0.2: {}
@@ -3534,8 +3538,6 @@ snapshots:
globals@16.5.0: {}
- globrex@0.1.2: {}
-
graceful-fs@4.2.11: {}
has-flag@4.0.0: {}
@@ -3581,7 +3583,7 @@ snapshots:
hast-util-from-selector@3.0.1:
dependencies:
'@types/hast': 3.0.4
- css-selector-parser: 3.2.0
+ css-selector-parser: 3.3.0
devlop: 1.1.0
hastscript: 9.0.1
@@ -3640,7 +3642,7 @@ snapshots:
'@types/unist': 3.0.3
bcp-47-match: 2.0.3
comma-separated-tokens: 2.0.3
- css-selector-parser: 3.2.0
+ css-selector-parser: 3.3.0
devlop: 1.1.0
direction: 2.0.1
hast-util-has-property: 3.0.0
@@ -3666,6 +3668,26 @@ snapshots:
stringify-entities: 4.0.4
zwitch: 2.0.4
+ hast-util-to-jsx-runtime@2.3.6:
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ style-to-js: 1.1.21
+ unist-util-position: 5.0.0
+ vfile-message: 4.0.3
+ transitivePeerDependencies:
+ - supports-color
+
hast-util-to-string@3.0.1:
dependencies:
'@types/hast': 3.0.4
@@ -3720,6 +3742,8 @@ snapshots:
imurmurhash@0.1.4: {}
+ inline-style-parser@0.2.7: {}
+
is-alphabetical@2.0.1: {}
is-alphanumerical@2.0.1:
@@ -3735,6 +3759,8 @@ snapshots:
dependencies:
is-extglob: 2.1.1
+ is-hexadecimal@2.0.1: {}
+
is-plain-obj@4.1.0: {}
isexe@2.0.0: {}
@@ -3833,7 +3859,7 @@ snapshots:
dependencies:
yallist: 3.1.1
- lucide-react@0.561.0(react@19.2.3):
+ lucide-react@0.562.0(react@19.2.3):
dependencies:
react: 19.2.3
@@ -3943,6 +3969,45 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ mdast-util-mdx-expression@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx-jsx@3.2.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ parse-entities: 4.0.2
+ stringify-entities: 4.0.4
+ unist-util-stringify-position: 4.0.0
+ vfile-message: 4.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdxjs-esm@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
mdast-util-phrasing@4.1.0:
dependencies:
'@types/mdast': 4.0.4
@@ -4232,6 +4297,16 @@ snapshots:
dependencies:
callsites: 3.1.0
+ parse-entities@4.0.2:
+ dependencies:
+ '@types/unist': 2.0.11
+ character-entities-legacy: 3.0.0
+ character-reference-invalid: 2.0.1
+ decode-named-character-reference: 1.2.0
+ is-alphanumerical: 2.0.1
+ is-decimal: 2.0.1
+ is-hexadecimal: 2.0.1
+
parse5@7.3.0:
dependencies:
entities: 6.0.1
@@ -4451,6 +4526,12 @@ snapshots:
hast-util-is-element: 3.0.0
unist-util-visit: 5.0.0
+ rehype-parse@9.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-from-html: 2.0.3
+ unified: 11.0.5
+
rehype-preset-minify@7.0.1:
dependencies:
rehype-minify-attribute-whitespace: 4.0.1
@@ -4478,6 +4559,14 @@ snapshots:
rehype-sort-attributes: 5.0.1
unified: 11.0.5
+ rehype-react@8.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-to-jsx-runtime: 2.3.6
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
rehype-remove-comments@6.1.1:
dependencies:
'@types/hast': 3.0.4
@@ -4668,6 +4757,14 @@ snapshots:
strip-json-comments@3.1.1: {}
+ style-to-js@1.1.21:
+ dependencies:
+ style-to-object: 1.0.14
+
+ style-to-object@1.0.14:
+ dependencies:
+ inline-style-parser: 0.2.7
+
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
@@ -4693,10 +4790,6 @@ snapshots:
dependencies:
typescript: 5.9.3
- tsconfck@3.1.6(typescript@5.9.3):
- optionalDependencies:
- typescript: 5.9.3
-
tslib@2.8.1: {}
tw-animate-css@1.4.0: {}
@@ -4705,13 +4798,13 @@ snapshots:
dependencies:
prelude-ls: 1.2.1
- typescript-eslint@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3):
+ typescript-eslint@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3):
dependencies:
- '@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
- '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
- '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3)
- '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
- eslint: 9.39.1(jiti@2.6.1)
+ '@typescript-eslint/eslint-plugin': 8.50.1(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ eslint: 9.39.2(jiti@2.6.1)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
@@ -4813,18 +4906,7 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.3
- vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@8.0.0-beta.4(@types/node@25.0.1)(jiti@2.6.1)):
- dependencies:
- debug: 4.4.3
- globrex: 0.1.2
- tsconfck: 3.1.6(typescript@5.9.3)
- optionalDependencies:
- vite: 8.0.0-beta.4(@types/node@25.0.1)(jiti@2.6.1)
- transitivePeerDependencies:
- - supports-color
- - typescript
-
- vite@8.0.0-beta.4(@types/node@25.0.1)(jiti@2.6.1):
+ vite@8.0.0-beta.4(@types/node@25.0.3)(jiti@2.6.1):
dependencies:
'@oxc-project/runtime': 0.103.0
fdir: 6.5.0(picomatch@4.0.3)
@@ -4834,7 +4916,7 @@ snapshots:
rolldown: 1.0.0-beta.56
tinyglobby: 0.2.15
optionalDependencies:
- '@types/node': 25.0.1
+ '@types/node': 25.0.3
fsevents: 2.3.3
jiti: 2.6.1
@@ -4852,10 +4934,10 @@ snapshots:
yocto-queue@0.1.0: {}
- zod-validation-error@4.0.2(zod@4.1.13):
+ zod-validation-error@4.0.2(zod@4.2.1):
dependencies:
- zod: 4.1.13
+ zod: 4.2.1
- zod@4.1.13: {}
+ zod@4.2.1: {}
zwitch@2.0.4: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 273625d..a105a2a 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,6 +1,2 @@
-packages:
- - "client"
- - "server"
-
overrides:
- "vite": "8.0.0-beta.4"
+ vite: "8.0.0-beta.4"
diff --git a/server/.gitignore b/server/.gitignore
deleted file mode 100644
index 3d2bc62..0000000
--- a/server/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/dist/
-/node_modules/
diff --git a/server/package.json b/server/package.json
deleted file mode 100644
index 092b4db..0000000
--- a/server/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "name": "mdgraph-server",
- "version": "0.0.0",
- "description": "",
- "main": "main.ts",
- "type": "module",
- "bin": {
- "mdgraph": "main.ts"
- },
- "scripts": {
- "build": "cd ../client && pnpm build"
- },
- "packageManager": "pnpm@10.25.0",
- "dependencies": {
- "@commander-js/extra-typings": "^14.0.0",
- "@jsdevtools/rehype-toc": "^3.0.2",
- "@shikijs/rehype": "^3.20.0",
- "chokidar": "^5.0.0",
- "hast-util-from-html-isomorphic": "^2.0.0",
- "hastscript": "^9.0.1",
- "rehype-autolink-headings": "^7.1.0",
- "rehype-document": "^7.0.3",
- "rehype-infer-title-meta": "^2.0.0",
- "rehype-mathjax": "^7.1.0",
- "rehype-meta": "^4.0.1",
- "rehype-preset-minify": "^7.0.1",
- "rehype-slug": "^6.0.0",
- "rehype-stringify": "^10.0.1",
- "remark-gfm": "^4.0.1",
- "remark-math": "^6.0.0",
- "remark-parse": "^11.0.0",
- "remark-rehype": "^11.1.2",
- "sirv": "^3.0.2",
- "string-width": "^8.1.0",
- "unified": "^11.0.5",
- "unist-util-find": "^3.0.0",
- "unist-util-visit-parents": "^6.0.2",
- "zod": "^4.1.13"
- },
- "devDependencies": {
- "@shikijs/types": "^3.20.0",
- "@types/hast": "^3.0.4",
- "@types/node": "^25.0.1",
- "typescript": "^5.9.3"
- }
-}
diff --git a/server/tsconfig.json b/server/tsconfig.json
deleted file mode 100644
index b2efb6a..0000000
--- a/server/tsconfig.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "compilerOptions": {
- "moduleResolution": "nodenext",
- "module": "nodenext",
- "target": "esnext",
- "erasableSyntaxOnly": true,
- "skipLibCheck": true,
- "strict": true,
- "noFallthroughCasesInSwitch": true,
- "noUncheckedIndexedAccess": true
- }
-}
diff --git a/src/Document.tsx b/src/Document.tsx
new file mode 100644
index 0000000..86411a7
--- /dev/null
+++ b/src/Document.tsx
@@ -0,0 +1,123 @@
+import { useState, type ReactNode } from "react"
+import "./index.css"
+import { ChevronDownIcon, FileDownIcon, LanguagesIcon, PictureInPictureIcon } from "lucide-react"
+import { Button } from "@/components/ui/button"
+import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"
+import { ThemeProvider } from "./components/theme-provider"
+import { ModeToggle } from "./components/mode-toggle"
+import { Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarInset, SidebarMenu, SidebarProvider, SidebarRail, SidebarTrigger } from "@/components/ui/sidebar"
+
+export default function Document({
+ lang,
+ css,
+ bootstrapScriptContent,
+ bootstrapModule,
+ languages,
+ pathname = location.pathname,
+ children,
+}: {
+ lang?: string,
+ css?: string,
+ bootstrapScriptContent?: string,
+ bootstrapModule?: string,
+ languages?: string[],
+ pathname?: string,
+ children?: ReactNode,
+}) {
+ const markdownPathname = `${pathname}${pathname.endsWith("/") ? "index" : ""}.md`
+
+ const [defaultOpen] = useState(() => {
+ const sidebarState = localStorage.getItem("sidebar-state")
+ switch (sidebarState) {
+ case "expanded": return true
+ case "collapsed": return false
+ default: return true
+ }
+ })
+
+ return (
+
+
+
+
+
+ {bootstrapScriptContent ? : null}
+ {css ? : null}
+ {bootstrapModule ? : null}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* availableLanguages.map(({ id, displayName, pathname }) => (
+
+
+ {displayName}
+
+
+ )) */}
+
+
+
+
+
+
+
+
+ {children}
+
+
+
+
+
+ )
+}
diff --git a/client/src/components/mode-toggle.tsx b/src/components/mode-toggle.tsx
similarity index 100%
rename from client/src/components/mode-toggle.tsx
rename to src/components/mode-toggle.tsx
diff --git a/client/src/components/theme-provider.tsx b/src/components/theme-provider.tsx
similarity index 100%
rename from client/src/components/theme-provider.tsx
rename to src/components/theme-provider.tsx
diff --git a/client/src/components/ui/button-group.tsx b/src/components/ui/button-group.tsx
similarity index 100%
rename from client/src/components/ui/button-group.tsx
rename to src/components/ui/button-group.tsx
diff --git a/client/src/components/ui/button.tsx b/src/components/ui/button.tsx
similarity index 100%
rename from client/src/components/ui/button.tsx
rename to src/components/ui/button.tsx
diff --git a/client/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx
similarity index 100%
rename from client/src/components/ui/dropdown-menu.tsx
rename to src/components/ui/dropdown-menu.tsx
diff --git a/client/src/components/ui/input.tsx b/src/components/ui/input.tsx
similarity index 100%
rename from client/src/components/ui/input.tsx
rename to src/components/ui/input.tsx
diff --git a/client/src/components/ui/separator.tsx b/src/components/ui/separator.tsx
similarity index 100%
rename from client/src/components/ui/separator.tsx
rename to src/components/ui/separator.tsx
diff --git a/client/src/components/ui/sheet.tsx b/src/components/ui/sheet.tsx
similarity index 100%
rename from client/src/components/ui/sheet.tsx
rename to src/components/ui/sheet.tsx
diff --git a/client/src/components/ui/sidebar.tsx b/src/components/ui/sidebar.tsx
similarity index 99%
rename from client/src/components/ui/sidebar.tsx
rename to src/components/ui/sidebar.tsx
index 1585ead..7422d69 100644
--- a/client/src/components/ui/sidebar.tsx
+++ b/src/components/ui/sidebar.tsx
@@ -288,7 +288,7 @@ function SidebarRail({ className, ...props }: React.ComponentProps<"button">) {
onClick={toggleSidebar}
title="Toggle Sidebar"
className={cn(
- "hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex",
+ "hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-0.5 sm:flex",
"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize",
"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
"hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full",
diff --git a/client/src/components/ui/skeleton.tsx b/src/components/ui/skeleton.tsx
similarity index 100%
rename from client/src/components/ui/skeleton.tsx
rename to src/components/ui/skeleton.tsx
diff --git a/client/src/components/ui/tooltip.tsx b/src/components/ui/tooltip.tsx
similarity index 95%
rename from client/src/components/ui/tooltip.tsx
rename to src/components/ui/tooltip.tsx
index 715bf76..c1bbaf4 100644
--- a/client/src/components/ui/tooltip.tsx
+++ b/src/components/ui/tooltip.tsx
@@ -50,7 +50,7 @@ function TooltipContent({
{...props}
>
{children}
-
+
)
diff --git a/src/entry-client.tsx b/src/entry-client.tsx
new file mode 100644
index 0000000..9c30492
--- /dev/null
+++ b/src/entry-client.tsx
@@ -0,0 +1,18 @@
+///
+
+import { hydrateRoot } from "react-dom/client"
+import "./index.css"
+import Document from "./Document.tsx"
+
+const contentElement = document.getElementById("main")!
+
+hydrateRoot(
+ document,
+
+
+ ,
+)
diff --git a/server/main.ts b/src/entry-server.tsx
old mode 100755
new mode 100644
similarity index 66%
rename from server/main.ts
rename to src/entry-server.tsx
index 739ef74..a2e412d
--- a/server/main.ts
+++ b/src/entry-server.tsx
@@ -1,12 +1,12 @@
-#!/usr/bin/env node
-
import { Command } from "@commander-js/extra-typings"
import { find } from "unist-util-find"
+import { Fragment, jsx, jsxs } from "react/jsx-runtime"
import { h } from "hastscript"
-import { toc as rehypeToc } from "@jsdevtools/rehype-toc"
+import { prerenderToNodeStream } from "react-dom/static"
import { unified, type Plugin } from "unified"
import chokidar from "chokidar"
import crypto from "node:crypto"
+import Document from "./Document"
import fs from "node:fs/promises"
import http from "node:http"
import path from "node:path"
@@ -15,7 +15,9 @@ import rehypeDocument from "rehype-document"
import rehypeInferTitleMeta from "rehype-infer-title-meta"
import rehypeMathjax from "rehype-mathjax"
import rehypeMeta from "rehype-meta"
+import rehypeParse from "rehype-parse"
import rehypePresetMinify from "rehype-preset-minify"
+import rehypeReact from "rehype-react"
import rehypeShiki from "@shikijs/rehype"
import rehypeSlug from "rehype-slug"
import rehypeStringify from "rehype-stringify"
@@ -25,11 +27,15 @@ import remarkParse from "remark-parse"
import remarkRehype from "remark-rehype"
import sirv from "sirv"
import stringWidth from "string-width"
-import type { Element } from "hast"
import type { LanguageInput } from "@shikijs/types"
+import type { ReactNode } from "react"
+import type hast from "hast"
import url from "node:url"
import z from "zod"
+// @ts-expect-error
+globalThis.localStorage = { getItem: (_key: string): string | null => null }
+
const configSchema = z.object({
$schema: z.string().default("./.mdgraph/schema.json"),
src: z.string().default("src"),
@@ -66,81 +72,43 @@ const htmlProcessor = unified()
.use(rehypeStringify)
async function generateAssets({ out }: Config): Promise {
- const assetsUrl = import.meta.resolve("./dist/assets/")
- const assetsPath = url.fileURLToPath(assetsUrl)
+ const clientUrl = new URL("../client", import.meta.url)
+ const clientPath = url.fileURLToPath(clientUrl)
+
+ const manifest = JSON.parse(await fs.readFile(path.join(clientPath, ".vite", "manifest.json"), "utf8"))
+ const js = (manifest["index.html"].file as string).slice("assets/".length)
+ const css = (manifest["index.html"].css[0] as string).slice("assets/".length)
+
await fs.mkdir(out, { recursive: true })
- const files = await fs.readdir(assetsPath)
- for (const file of files) {
- const srcPath = path.join(assetsPath, file)
- const outPath = path.join(out, file)
- await fs.copyFile(srcPath, outPath)
- }
+ await fs.copyFile(path.join(clientPath, "assets", js), path.join(out, js))
+ await fs.copyFile(path.join(clientPath, "assets", css), path.join(out, css))
await fs.writeFile(path.join(out, "404.html"), String(htmlProcessor.stringify({
type: "root",
children: [{ type: "text", value: "404" }],
})))
- return {
- js: files.find((file) => file.endsWith(".js"))!,
- css: files.find((file) => file.endsWith(".css"))!,
- }
+ return { js, css }
}
-const wrapWithRoot: Plugin<[mode: "development" | "production", Config]> = (mode, { base, languages }: Config) => {
- base = mode === "production" ? base : "/"
- return (tree) => {
- return h("div#root", { "data-base": base, "data-languages": languages }, [
- h("div", { class: "flex w-full" }, [
- h("div", { class: "w-(--sidebar-width) h-screen bg-sidebar" }),
- h("main", { class: "flex-1" }, [
- h("div", { class: "p-2 h-13 sticky top-0 flex gap-2 justify-end bg-background" }),
- h("div#main", { class: "mx-auto px-4 py-8 prose prose-zinc dark:prose-invert" }, [tree as Element]),
- ]),
- ]),
- ])
+const wrapWithDiv: Plugin = () => {
+ return (tree: hast.Root) => {
+ return h("div#main", { class: "mx-auto px-4 py-8 prose prose-zinc dark:prose-invert" }, [tree])
}
}
const eventSourceEndpoint = "/event"
-const injectAssets: Plugin<[mode: "development" | "production", base: string, assets: Assets]> = (mode, base, assets) => {
- base = mode === "production" ? base : "/"
- return (tree) => {
- const headNode = find(tree, { tagName: "head" })!
- headNode.children.push(
- h("script", { type: "module" }, `
-try{
- document.documentElement.classList.add(localStorage.getItem("ui-theme") ?? "light")
- document.getElementById("root").style.setProperty(
- "--sidebar-width",
- window.innerWidth < 768 || localStorage.getItem("sidebar-state") === "collapsed" ? "0" : "16rem",
- )
-} catch (e) {
-}
-`),
- h("link", { rel: "stylesheet", href: `${base}${assets.css}` }),
- h("script", { type: "module", src: `${base}${assets.js}` }),
- )
-
- if (mode === "development") {
- headNode.children.push(
- h("script", { type: "module" }, `
-(() => {
- new EventSource("${eventSourceEndpoint}").onmessage = (e) => {
- if (e.data === location.pathname) {
- location.reload()
- }
- }
-})()
-`),
- )
- }
- }
-}
+const postProcessor = unified()
+ .use(rehypeParse)
+ .use(rehypeMeta, {
+ og: true,
+ type: "article",
+ })
+ .use(rehypePresetMinify)
+ .use(rehypeStringify)
-function createProcessor(mode: "development" | "production", assets: Assets, language: string, langs: LanguageInput[], config: Config) {
- const base = mode === "production" ? config.base : "/"
+function createProcessor(langs: LanguageInput[], { themes }: Config) {
return unified()
.use(remarkParse)
.use(remarkMath)
@@ -151,31 +119,20 @@ function createProcessor(mode: "development" | "production", assets: Assets, lan
.use(rehypeMathjax)
.use(rehypeShiki, {
inline: "tailing-curly-colon",
- themes: config.themes,
+ themes,
langs,
})
.use(rehypeSlug)
- .use(rehypeToc, {
- headings: ["h1", "h2", "h3"],
- cssClasses: { toc: "hidden" },
- })
.use(rehypeInferTitleMeta)
.use(rehypeAutolinkHeadings, {
behavior: "prepend",
content: [h("span", { style: "margin-right: 0.25em;" }, "#")],
})
- .use(wrapWithRoot, mode, config)
- .use(rehypeDocument, { language })
- .use(rehypeMeta, {
- og: true,
- type: "article",
- })
- .use(injectAssets, mode, base, assets)
- .use(rehypePresetMinify)
- .use(rehypeStringify)
+ .use(wrapWithDiv)
+ .use(rehypeReact, { Fragment, jsx, jsxs })
}
-async function createProcessors(mode: "development" | "production", assets: Assets, config: Config): Promise>> {
+async function createProcessors(config: Config): Promise>> {
const files = await fs.readdir(config.syntaxes)
const langs: LanguageInput[] = await Promise.all(files.map(async (file) => {
// TODO: validate
@@ -184,25 +141,82 @@ async function createProcessors(mode: "development" | "production", assets: Asse
const processors: Record> = {}
for (const language of config.languages) {
- processors[language] = createProcessor(mode, assets, language, langs, config)
+ processors[language] = createProcessor(langs, config)
}
return processors
}
-async function generate({ src, out, defaultLanguage }: Config, processors: Awaited>, input: string, onGenerate?: (pathname: string) => void) {
+async function renderToString(
+ mode: "development" | "production",
+ assets: Assets,
+ language: string,
+ languages: string[],
+ pathname: string,
+ reactNode: ReactNode,
+): Promise {
+ const bootstrapScriptContent = `
+try {
+ document.documentElement.classList.add(localStorage.getItem("ui-theme") ?? "light")
+ document.body.style.setProperty(
+ "--sidebar-width",
+ window.innerWidth < 768 || localStorage.getItem("sidebar-state") === "collapsed" ? "0" : "16rem",
+ )
+} catch (e) {
+ console.error(e)
+}
+${mode === "development" ? `
+new EventSource("${eventSourceEndpoint}").onmessage = (e) => {
+ if (e.data === location.pathname) {
+ location.reload()
+ }
+}
+` : ""}
+`
+ const { prelude } = await prerenderToNodeStream(
+
+ {reactNode}
+
+ )
+
+ return new Promise((resolve, reject) => {
+ let data = ""
+ prelude.on("data", chunk => { data += chunk })
+ prelude.on("end", () => resolve(data))
+ prelude.on("error", reject)
+ })
+}
+
+async function generate(
+ mode: "development" | "production",
+ assets: Assets,
+ { src, out, languages, defaultLanguage }: Config,
+ processors: Awaited>,
+ input: string,
+ onGenerate?: (pathname: string) => void,
+) {
const document = await fs.readFile(input, "utf8")
const parts = path.relative(src, input).split(path.sep)
const language = parts[0]!
- const file = await processors[language]!.process(document)
+ const preprocessedFile = await processors[language]!.process(document)
const outPathWithoutExt = input.replace(src, out).replace(/\.md$/, "")
+ const pathname = path.relative(out, outPathWithoutExt).replace(/\\/g, "/").replace(/index$/, "")
+ const rendered = await renderToString(mode, assets, language, languages, `/${pathname}`, preprocessedFile.result)
+ const postprocessedFile = await postProcessor.process(rendered)
+ const string = String(postprocessedFile)
+
const outPath = `${outPathWithoutExt}.html`
await fs.mkdir(path.dirname(outPath), { recursive: true })
await fs.copyFile(input, input.replace(src, out))
- await fs.writeFile(outPath, String(file), "utf8")
-
- const pathname = path.relative(out, outPathWithoutExt).replace(/\\/g, "/").replace(/index$/, "")
+ await fs.writeFile(outPath, string, "utf8")
if (language === defaultLanguage) {
const string = htmlProcessor.stringify({
@@ -242,10 +256,10 @@ async function clean(config: Config) {
async function build(config: Config) {
const assets = await generateAssets(config)
- const processors = await createProcessors("production", assets, config)
+ const processors = await createProcessors(config)
for await (const input of fs.glob(path.join(config.src, "**/*.md"))) {
- await generate(config, processors, input)
+ await generate("production", assets, config, processors, input)
}
console.log("Build completed")
@@ -254,7 +268,7 @@ async function build(config: Config) {
async function serve(config: Config) {
const assets = await generateAssets(config)
- const processors = await createProcessors("development", assets, config)
+ const processors = await createProcessors(config)
const clients: Record = {}
function sendEventToAll(pathname: string) {
@@ -301,8 +315,8 @@ async function serve(config: Config) {
})
chokidar.watch(config.src)
- .on("add", (path) => void generate(config, processors, path, sendEventToAll))
- .on("change", (path) => void generate(config, processors, path, sendEventToAll))
+ .on("add", (path) => void generate("development", assets, config, processors, path, sendEventToAll))
+ .on("change", (path) => void generate("development", assets, config, processors, path, sendEventToAll))
}
const program = new Command()
diff --git a/client/src/hooks/use-mobile.ts b/src/hooks/use-mobile.ts
similarity index 100%
rename from client/src/hooks/use-mobile.ts
rename to src/hooks/use-mobile.ts
diff --git a/client/src/index.css b/src/index.css
similarity index 97%
rename from client/src/index.css
rename to src/index.css
index 9ea4021..06a3f92 100644
--- a/client/src/index.css
+++ b/src/index.css
@@ -1,14 +1,17 @@
@import "tailwindcss";
@import "tw-animate-css";
+@plugin "@tailwindcss/typography";
@custom-variant dark (&:is(.dark *));
-@plugin "@tailwindcss/typography";
@theme inline {
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
+ --radius-2xl: calc(var(--radius) + 8px);
+ --radius-3xl: calc(var(--radius) + 12px);
+ --radius-4xl: calc(var(--radius) + 16px);
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
diff --git a/client/src/lib/utils.ts b/src/lib/utils.ts
similarity index 100%
rename from client/src/lib/utils.ts
rename to src/lib/utils.ts
diff --git a/client/tsconfig.json b/tsconfig.json
similarity index 91%
rename from client/tsconfig.json
rename to tsconfig.json
index c36a19a..8d064df 100644
--- a/client/tsconfig.json
+++ b/tsconfig.json
@@ -9,10 +9,6 @@
"DOM.Iterable"
],
"module": "esnext",
- "types": [
- "vite/client",
- "@types/dom-chromium-ai"
- ],
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
diff --git a/client/vite.config.ts b/vite.config.ts
similarity index 70%
rename from client/vite.config.ts
rename to vite.config.ts
index fa8b440..0746db4 100644
--- a/client/vite.config.ts
+++ b/vite.config.ts
@@ -1,11 +1,10 @@
+import path from "path"
import { defineConfig } from "vite"
-import tsConfigPaths from "vite-tsconfig-paths"
import react from "@vitejs/plugin-react"
import tailwindcss from "@tailwindcss/vite"
export default defineConfig({
plugins: [
- tsConfigPaths(),
react({
babel: {
plugins: [["babel-plugin-react-compiler"]],
@@ -13,8 +12,12 @@ export default defineConfig({
}),
tailwindcss(),
],
+ resolve: {
+ alias: {
+ "@": path.resolve(__dirname, "./src"),
+ },
+ },
build: {
- emptyOutDir: true,
- outDir: "../server/dist",
+ manifest: true,
},
})