├── website
├── src
│ ├── app
│ │ ├── opengraph-image.alt.txt
│ │ ├── favicon.ico
│ │ ├── opengraph-image.png
│ │ ├── layout.tsx
│ │ ├── globals.css
│ │ └── page.tsx
│ ├── lib
│ │ └── utils.ts
│ └── components
│ │ ├── code-block.tsx
│ │ ├── ui
│ │ └── button.tsx
│ │ └── background-beams-with-collision.tsx
├── README.md
├── public
│ └── images
│ │ └── demo.gif
├── postcss.config.mjs
├── next.config.ts
├── components.json
├── tsconfig.json
└── package.json
├── pnpm-workspace.yaml
├── packages
├── view
│ ├── src
│ │ ├── app
│ │ │ ├── favicon.ico
│ │ │ ├── layout.tsx
│ │ │ ├── page.tsx
│ │ │ └── globals.css
│ │ ├── lib
│ │ │ └── utils.ts
│ │ ├── components
│ │ │ ├── drizzle-studio.tsx
│ │ │ ├── drizzle-visualizer.tsx
│ │ │ ├── theme-mode.tsx
│ │ │ └── ui
│ │ │ │ ├── tabs.tsx
│ │ │ │ ├── button.tsx
│ │ │ │ └── dropdown-menu.tsx
│ │ └── hooks
│ │ │ └── use-config.ts
│ ├── postcss.config.mjs
│ ├── next.config.ts
│ ├── components.json
│ ├── tsconfig.json
│ └── package.json
└── cli
│ ├── index.js
│ ├── main.go
│ ├── go.mod
│ ├── internal
│ ├── console
│ │ ├── banner.go
│ │ └── server_info.go
│ └── server
│ │ ├── extractor.go
│ │ ├── utils.go
│ │ ├── next_server.go
│ │ ├── server.go
│ │ └── static.go
│ ├── package.json
│ ├── go.sum
│ ├── cmd
│ └── root.go
│ └── drizzle-view.js
├── README.md
├── package.json
├── biome.json
├── .gitignore
├── .github
└── workflows
│ └── release.yml
└── pnpm-lock.yaml
/website/src/app/opengraph-image.alt.txt:
--------------------------------------------------------------------------------
1 | Drizzle View
--------------------------------------------------------------------------------
/pnpm-workspace.yaml:
--------------------------------------------------------------------------------
1 | packages:
2 | - "packages/*"
3 | - "website"
4 |
--------------------------------------------------------------------------------
/website/README.md:
--------------------------------------------------------------------------------
1 | # `docs`
2 |
3 | https://drizzle-view.vercel.app
4 |
--------------------------------------------------------------------------------
/website/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bytaesu/drizzle-view/HEAD/website/src/app/favicon.ico
--------------------------------------------------------------------------------
/website/public/images/demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bytaesu/drizzle-view/HEAD/website/public/images/demo.gif
--------------------------------------------------------------------------------
/packages/view/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bytaesu/drizzle-view/HEAD/packages/view/src/app/favicon.ico
--------------------------------------------------------------------------------
/website/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | const config = {
2 | plugins: ["@tailwindcss/postcss"],
3 | };
4 |
5 | export default config;
6 |
--------------------------------------------------------------------------------
/website/src/app/opengraph-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bytaesu/drizzle-view/HEAD/website/src/app/opengraph-image.png
--------------------------------------------------------------------------------
/packages/view/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | const config = {
2 | plugins: ["@tailwindcss/postcss"],
3 | };
4 |
5 | export default config;
6 |
--------------------------------------------------------------------------------
/website/next.config.ts:
--------------------------------------------------------------------------------
1 | import type { NextConfig } from "next";
2 |
3 | const nextConfig: NextConfig = {
4 | /* config options here */
5 | };
6 |
7 | export default nextConfig;
8 |
--------------------------------------------------------------------------------
/website/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { clsx, type ClassValue } from "clsx";
2 | import { twMerge } from "tailwind-merge";
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs));
6 | }
7 |
--------------------------------------------------------------------------------
/packages/view/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { clsx, type ClassValue } from "clsx";
2 | import { twMerge } from "tailwind-merge";
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs));
6 | }
7 |
--------------------------------------------------------------------------------
/packages/view/next.config.ts:
--------------------------------------------------------------------------------
1 | import type { NextConfig } from "next";
2 |
3 | const nextConfig: NextConfig = {
4 | output: "export",
5 | trailingSlash: true,
6 | images: {
7 | unoptimized: true,
8 | },
9 | };
10 |
11 | export default nextConfig;
12 |
--------------------------------------------------------------------------------
/packages/cli/index.js:
--------------------------------------------------------------------------------
1 | const { ensureBinary } = require("./drizzle-view");
2 |
3 | /**
4 | * Drizzle View CLI - Main entry point
5 | */
6 | module.exports = {
7 | /**
8 | * Downloads and ensures the platform-specific Drizzle View binary is available
9 | * @returns {Promise} Path to the binary
10 | */
11 | ensureBinary,
12 | };
13 |
--------------------------------------------------------------------------------
/packages/cli/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "embed"
5 | "fmt"
6 | "os"
7 |
8 | "github.com/bytaesu/drizzle-view/cmd"
9 | )
10 |
11 | //go:embed out/*
12 | var distFS embed.FS
13 |
14 | func main() {
15 | rootCmd := cmd.NewRootCmd(distFS)
16 | if err := rootCmd.Execute(); err != nil {
17 | fmt.Fprintln(os.Stderr, err)
18 | os.Exit(1)
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Drizzle View
4 |
5 | Run Drizzle Studio and Drizzle Visualizer together in one view.
6 |
7 | ### How to Use
8 |
9 | Check it out here: [https://drizzle-view.vercel.app](https://drizzle-view.vercel.app)
10 |
11 | ### License
12 |
13 | MIT
14 |
--------------------------------------------------------------------------------
/packages/cli/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/bytaesu/drizzle-view
2 |
3 | go 1.21
4 |
5 | require (
6 | github.com/fatih/color v1.18.0
7 | github.com/spf13/cobra v1.10.1
8 | )
9 |
10 | require (
11 | github.com/inconshreveable/mousetrap v1.1.0 // indirect
12 | github.com/mattn/go-colorable v0.1.13 // indirect
13 | github.com/mattn/go-isatty v0.0.20 // indirect
14 | github.com/spf13/pflag v1.0.9 // indirect
15 | golang.org/x/sys v0.25.0 // indirect
16 | )
17 |
--------------------------------------------------------------------------------
/packages/cli/internal/console/banner.go:
--------------------------------------------------------------------------------
1 | package console
2 |
3 | import (
4 | "github.com/fatih/color"
5 | )
6 |
7 | // ShowBanner displays the application banner
8 | func ShowBanner() {
9 | green := color.New(color.FgGreen, color.Bold)
10 | banner := `
11 | ┌─────────────────────────────┐
12 | │ │
13 | │ Drizzle View │
14 | │ │
15 | └─────────────────────────────┘
16 | `
17 |
18 | green.Println(banner)
19 | }
20 |
--------------------------------------------------------------------------------
/packages/view/src/components/drizzle-studio.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useConfig } from "@/hooks/use-config";
4 |
5 | const DrizzleStudio = () => {
6 | const { config, loading } = useConfig();
7 |
8 | if (loading) {
9 | return (
10 |
11 |
Loading Studio...
12 |
13 | );
14 | }
15 |
16 | return ;
17 | };
18 |
19 | export default DrizzleStudio;
20 |
--------------------------------------------------------------------------------
/website/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "new-york",
4 | "rsc": true,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "",
8 | "css": "src/app/globals.css",
9 | "baseColor": "neutral",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "iconLibrary": "lucide",
14 | "aliases": {
15 | "components": "@/components",
16 | "utils": "@/lib/utils",
17 | "ui": "@/components/ui",
18 | "lib": "@/lib",
19 | "hooks": "@/hooks"
20 | },
21 | "registries": {}
22 | }
23 |
--------------------------------------------------------------------------------
/packages/view/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "new-york",
4 | "rsc": true,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "",
8 | "css": "src/app/globals.css",
9 | "baseColor": "neutral",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "iconLibrary": "lucide",
14 | "aliases": {
15 | "components": "@/components",
16 | "utils": "@/lib/utils",
17 | "ui": "@/components/ui",
18 | "lib": "@/lib",
19 | "hooks": "@/hooks"
20 | },
21 | "registries": {}
22 | }
23 |
--------------------------------------------------------------------------------
/packages/view/src/components/drizzle-visualizer.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useConfig } from "@/hooks/use-config";
4 |
5 | const DrizzleVisualizer = () => {
6 | const { config, loading } = useConfig();
7 |
8 | if (loading) {
9 | return (
10 |
11 |
Loading Visualizer...
12 |
13 | );
14 | }
15 |
16 | return ;
17 | };
18 |
19 | export default DrizzleVisualizer;
20 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "drizzle-view-workspace",
3 | "version": "0.0.0",
4 | "private": true,
5 | "description": "Drizzle View workspace",
6 | "scripts": {
7 | "dev": "pnpm run dev",
8 | "build": "pnpm run build:view && pnpm run build:cli",
9 | "build:website": "pnpm --filter website build",
10 | "build:view": "pnpm --filter @drizzle-view/view build",
11 | "build:cli": "pnpm --filter drizzle-view build",
12 | "lint": "biome check",
13 | "format": "biome format --write"
14 | },
15 | "devDependencies": {
16 | "@biomejs/biome": "2.2.0"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/packages/cli/internal/console/server_info.go:
--------------------------------------------------------------------------------
1 | package console
2 |
3 | import (
4 | "fmt"
5 |
6 | "github.com/fatih/color"
7 | )
8 |
9 | // ShowServerInfo displays server startup information
10 | func ShowServerInfo(port int, studioUrl, visualizerUrl string) {
11 | green := color.New(color.FgGreen).SprintFunc()
12 | yellow := color.New(color.FgYellow).SprintFunc()
13 |
14 | fmt.Printf("=> Studio: %s\n", yellow(studioUrl))
15 | fmt.Printf("=> Visualizer: %s\n", yellow(visualizerUrl))
16 | fmt.Printf("=> Starting %s on %s\n", green("Drizzle View"), green(fmt.Sprintf("http://localhost:%d", port)))
17 | fmt.Println()
18 | }
19 |
--------------------------------------------------------------------------------
/website/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2017",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "noEmit": true,
9 | "esModuleInterop": true,
10 | "module": "esnext",
11 | "moduleResolution": "bundler",
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "jsx": "preserve",
15 | "incremental": true,
16 | "plugins": [
17 | {
18 | "name": "next"
19 | }
20 | ],
21 | "paths": {
22 | "@/*": ["./src/*"]
23 | }
24 | },
25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
26 | "exclude": ["node_modules"]
27 | }
28 |
--------------------------------------------------------------------------------
/packages/view/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2017",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "noEmit": true,
9 | "esModuleInterop": true,
10 | "module": "esnext",
11 | "moduleResolution": "bundler",
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "jsx": "preserve",
15 | "incremental": true,
16 | "plugins": [
17 | {
18 | "name": "next"
19 | }
20 | ],
21 | "paths": {
22 | "@/*": ["./src/*"]
23 | }
24 | },
25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
26 | "exclude": ["node_modules"]
27 | }
28 |
--------------------------------------------------------------------------------
/biome.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://biomejs.dev/schemas/2.2.0/schema.json",
3 | "vcs": {
4 | "enabled": true,
5 | "clientKind": "git",
6 | "useIgnoreFile": true
7 | },
8 | "files": {
9 | "ignoreUnknown": true,
10 | "includes": ["**", "!node_modules", "!.next", "!dist", "!build"]
11 | },
12 | "formatter": {
13 | "enabled": true,
14 | "indentStyle": "space",
15 | "indentWidth": 2
16 | },
17 | "linter": {
18 | "enabled": true,
19 | "rules": {
20 | "recommended": true,
21 | "suspicious": {
22 | "noUnknownAtRules": "off"
23 | }
24 | },
25 | "domains": {
26 | "next": "recommended",
27 | "react": "recommended"
28 | }
29 | },
30 | "assist": {
31 | "actions": {
32 | "source": {
33 | "organizeImports": "on"
34 | }
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/packages/cli/internal/server/extractor.go:
--------------------------------------------------------------------------------
1 | package server
2 |
3 | import (
4 | "io/fs"
5 | "os"
6 | "path/filepath"
7 | )
8 |
9 | func (s *Server) extractDistFiles() (string, error) {
10 | tempDir, err := os.MkdirTemp("", "drizzle-view-*")
11 | if err != nil {
12 | return "", err
13 | }
14 |
15 | distFiles, err := fs.Sub(s.DistFS, "out")
16 | if err != nil {
17 | return "", err
18 | }
19 |
20 | err = fs.WalkDir(distFiles, ".", func(path string, d fs.DirEntry, err error) error {
21 | if err != nil {
22 | return err
23 | }
24 |
25 | destPath := filepath.Join(tempDir, path)
26 |
27 | if d.IsDir() {
28 | return os.MkdirAll(destPath, 0755)
29 | }
30 |
31 | data, err := fs.ReadFile(distFiles, path)
32 | if err != nil {
33 | return err
34 | }
35 |
36 | return os.WriteFile(destPath, data, 0644)
37 | })
38 |
39 | return tempDir, err
40 | }
41 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | node_modules/
5 | /.pnp
6 | .pnp.*
7 | .yarn/*
8 | !.yarn/patches
9 | !.yarn/plugins
10 | !.yarn/releases
11 | !.yarn/versions
12 |
13 | # testing
14 | /coverage
15 |
16 | # next.js
17 | .next/
18 | out/
19 |
20 | # production
21 | /build
22 | /dist
23 | release/
24 |
25 | # Binaries
26 | bin/
27 | release/
28 | homebrew-releases/
29 |
30 | # misc
31 | .DS_Store
32 | *.pem
33 |
34 | # debug
35 | npm-debug.log*
36 | yarn-debug.log*
37 | yarn-error.log*
38 | .pnpm-debug.log*
39 |
40 | # env files (can opt-in for committing if needed)
41 | .env*
42 |
43 | # vercel
44 | .vercel
45 |
46 | # typescript
47 | *.tsbuildinfo
48 | next-env.d.ts
49 |
50 | # Go files
51 | vendor/
52 |
53 | # IDE files
54 | .vscode/
55 | .idea/
56 | *.swp
57 | *.swo
58 |
59 | # Backup files
60 | __archive__
61 |
--------------------------------------------------------------------------------
/website/src/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import type { Metadata } from "next";
2 | import { Geist, Geist_Mono } from "next/font/google";
3 | import "./globals.css";
4 |
5 | const geistSans = Geist({
6 | variable: "--font-geist-sans",
7 | subsets: ["latin"],
8 | });
9 |
10 | const geistMono = Geist_Mono({
11 | variable: "--font-geist-mono",
12 | subsets: ["latin"],
13 | });
14 |
15 | export const metadata: Metadata = {
16 | title: "Drizzle View",
17 | description: "Run Drizzle Studio and Drizzle Visualizer together in one view",
18 | };
19 |
20 | export default function RootLayout({
21 | children,
22 | }: Readonly<{
23 | children: React.ReactNode;
24 | }>) {
25 | return (
26 |
27 |
30 | {children}
31 |
32 |
33 | );
34 | }
35 |
--------------------------------------------------------------------------------
/packages/cli/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "drizzle-view",
3 | "version": "0.0.4",
4 | "description": "Run Drizzle Studio and Drizzle Visualizer together in one view",
5 | "main": "index.js",
6 | "bin": {
7 | "drizzle-view": "./drizzle-view.js"
8 | },
9 | "scripts": {
10 | "build": "npm run copy:web && npm run build:go",
11 | "build:go": "go build -ldflags='-s -w' -o bin/drizzle-view-$(node -e \"console.log(process.platform)\")-$(node -e \"console.log(process.arch)\") main.go",
12 | "copy:web": "cp -r ../view/out ./"
13 | },
14 | "files": [
15 | "drizzle-view.js",
16 | "index.js"
17 | ],
18 | "keywords": [
19 | "drizzle",
20 | "drizzle-studio",
21 | "drizzle-visualizer",
22 | "database",
23 | "cli"
24 | ],
25 | "author": "bytaesu",
26 | "license": "MIT",
27 | "repository": {
28 | "type": "git",
29 | "url": "https://github.com/bytaesu/drizzle-view.git"
30 | },
31 | "homepage": "https://drizzle-view.vercel.app",
32 | "publishConfig": {
33 | "access": "public"
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/website/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "website",
3 | "version": "0.0.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev --turbopack",
7 | "build": "next build --turbopack",
8 | "start": "next start",
9 | "lint": "biome check",
10 | "format": "biome format --write"
11 | },
12 | "dependencies": {
13 | "@radix-ui/react-slot": "^1.2.3",
14 | "class-variance-authority": "^0.7.1",
15 | "clsx": "^2.1.1",
16 | "framer-motion": "^12.23.12",
17 | "lucide-react": "^0.542.0",
18 | "next": "15.5.2",
19 | "react": "19.1.0",
20 | "react-dom": "19.1.0",
21 | "react-syntax-highlighter": "^15.6.6",
22 | "shiki": "^3.12.2",
23 | "tailwind-merge": "^3.3.1"
24 | },
25 | "devDependencies": {
26 | "@biomejs/biome": "2.2.0",
27 | "@tailwindcss/postcss": "^4",
28 | "@types/node": "^20",
29 | "@types/react": "^19",
30 | "@types/react-dom": "^19",
31 | "@types/react-syntax-highlighter": "^15.5.13",
32 | "tailwindcss": "^4",
33 | "tw-animate-css": "^1.3.8",
34 | "typescript": "^5"
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/packages/view/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@drizzle-view/view",
3 | "version": "0.0.0",
4 | "private": true,
5 | "description": "Drizzle View web interface (development only)",
6 | "scripts": {
7 | "dev": "next dev --turbopack --port 3333",
8 | "build": "next build",
9 | "start": "next start",
10 | "lint": "biome check",
11 | "format": "biome format --write"
12 | },
13 | "dependencies": {
14 | "@radix-ui/react-dropdown-menu": "^2.1.16",
15 | "@radix-ui/react-slot": "^1.2.3",
16 | "@radix-ui/react-tabs": "^1.1.13",
17 | "class-variance-authority": "^0.7.1",
18 | "clsx": "^2.1.1",
19 | "lucide-react": "^0.542.0",
20 | "next": "15.5.2",
21 | "next-themes": "^0.4.6",
22 | "react": "19.1.0",
23 | "react-dom": "19.1.0",
24 | "tailwind-merge": "^3.3.1"
25 | },
26 | "devDependencies": {
27 | "@biomejs/biome": "2.2.0",
28 | "@tailwindcss/postcss": "^4",
29 | "@types/node": "^20",
30 | "@types/react": "^19",
31 | "@types/react-dom": "^19",
32 | "tailwindcss": "^4",
33 | "tw-animate-css": "^1.3.8",
34 | "typescript": "^5"
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/packages/view/src/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import type { Metadata } from "next";
2 | import { Geist, Geist_Mono } from "next/font/google";
3 | import "./globals.css";
4 | import { ThemeModeProvider } from "@/components/theme-mode";
5 |
6 | const geistSans = Geist({
7 | variable: "--font-geist-sans",
8 | subsets: ["latin"],
9 | });
10 |
11 | const geistMono = Geist_Mono({
12 | variable: "--font-geist-mono",
13 | subsets: ["latin"],
14 | });
15 |
16 | export const metadata: Metadata = {
17 | title: "Drizzle View",
18 | description: "Drizzle View",
19 | };
20 |
21 | export default function RootLayout({
22 | children,
23 | }: Readonly<{
24 | children: React.ReactNode;
25 | }>) {
26 | return (
27 |
28 |
29 |
30 |
36 | {children}
37 |
38 |
39 |
40 | );
41 | }
42 |
--------------------------------------------------------------------------------
/packages/view/src/hooks/use-config.ts:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useEffect, useState } from "react";
4 |
5 | interface DrizzleConfig {
6 | studioUrl: string;
7 | visualizerUrl: string;
8 | }
9 |
10 | const defaultConfig: DrizzleConfig = {
11 | studioUrl: "http://local.drizzle.studio",
12 | visualizerUrl: "http://localhost:64738",
13 | };
14 |
15 | export function useConfig() {
16 | const [config, setConfig] = useState(defaultConfig);
17 | const [loading, setLoading] = useState(true);
18 | const [error, setError] = useState(null);
19 |
20 | useEffect(() => {
21 | const fetchConfig = async () => {
22 | try {
23 | const response = await fetch("/api/config");
24 | if (!response.ok) {
25 | throw new Error(`Failed to fetch config: ${response.statusText}`);
26 | }
27 | const data = await response.json();
28 | setConfig(data);
29 | } catch (err) {
30 | console.error("Failed to fetch config, using defaults:", err);
31 | setError(err as Error);
32 | // Keep using default config on error
33 | } finally {
34 | setLoading(false);
35 | }
36 | };
37 |
38 | fetchConfig();
39 | }, []);
40 |
41 | return { config, loading, error };
42 | }
43 |
--------------------------------------------------------------------------------
/packages/cli/internal/server/utils.go:
--------------------------------------------------------------------------------
1 | package server
2 |
3 | import (
4 | "context"
5 | "fmt"
6 | "net/http"
7 | "os/exec"
8 | "runtime"
9 | "time"
10 | )
11 |
12 | const (
13 | MaxHealthCheckAttempts = 30
14 | HealthCheckInterval = 1 * time.Second
15 | ShutdownTimeout = 5 * time.Second
16 | )
17 |
18 | // waitForServer waits for the server to be ready by making health check requests
19 | func (s *Server) waitForServer(ctx context.Context, port int) error {
20 | url := fmt.Sprintf("http://localhost:%d", port)
21 | client := &http.Client{Timeout: HealthCheckInterval}
22 |
23 | for i := 0; i < MaxHealthCheckAttempts; i++ {
24 | select {
25 | case <-ctx.Done():
26 | return ctx.Err()
27 | default:
28 | }
29 |
30 | resp, err := client.Get(url)
31 | if err == nil {
32 | defer resp.Body.Close()
33 | return nil
34 | }
35 |
36 | time.Sleep(HealthCheckInterval)
37 | }
38 |
39 | return fmt.Errorf("server failed to start within %d seconds", MaxHealthCheckAttempts)
40 | }
41 |
42 | func openBrowser(url string) error {
43 | var cmd string
44 | var args []string
45 |
46 | switch runtime.GOOS {
47 | case "windows":
48 | cmd = "cmd"
49 | args = []string{"/c", "start"}
50 | case "darwin":
51 | cmd = "open"
52 | default: // "linux" ... and others
53 | cmd = "xdg-open"
54 | }
55 | args = append(args, url)
56 |
57 | return exec.Command(cmd, args...).Start()
58 | }
59 |
--------------------------------------------------------------------------------
/website/src/components/code-block.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { cn } from "@/lib/utils";
4 | import { useEffect, useState } from "react";
5 | import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
6 | import { atomDark } from "react-syntax-highlighter/dist/cjs/styles/prism";
7 |
8 | export function CodeBlock({
9 | language,
10 | value,
11 | className,
12 | }: {
13 | language: string;
14 | value: string;
15 | className?: string;
16 | }) {
17 | const [mounted, setMounted] = useState(false);
18 |
19 | useEffect(() => {
20 | setMounted(true);
21 | }, []);
22 |
23 | if (!mounted) {
24 | return null;
25 | }
26 |
27 | return (
28 |
31 |
32 | {language}
33 |
34 |
35 |
36 |
53 | {value.trimEnd()}
54 |
55 |
56 |
57 |
58 | );
59 | }
60 |
--------------------------------------------------------------------------------
/packages/cli/internal/server/next_server.go:
--------------------------------------------------------------------------------
1 | package server
2 |
3 | import (
4 | "context"
5 | "fmt"
6 | "os"
7 | "os/exec"
8 | "path/filepath"
9 | )
10 |
11 | func (s *Server) startNextServer(ctx context.Context, distPath string, port int) error {
12 | // Find node/npm
13 | nodeCmd := findNodeCommand()
14 | if nodeCmd == "" {
15 | return fmt.Errorf("node.js not found. Please install Node.js")
16 | }
17 |
18 | // Check if it's a static export or needs `next` server
19 | serverJsPath := filepath.Join(distPath, "server.js")
20 | if _, err := os.Stat(serverJsPath); os.IsNotExist(err) {
21 | // Static export - serve with simple HTTP server
22 | return s.serveStatic(ctx, distPath, port)
23 | }
24 |
25 | // Start `next` server
26 | cmd := exec.CommandContext(ctx, nodeCmd, "server.js")
27 | cmd.Dir = distPath
28 | cmd.Env = append(os.Environ(),
29 | fmt.Sprintf("PORT=%d", port),
30 | fmt.Sprintf("DRIZZLE_STUDIO_URL=%s", os.Getenv("DRIZZLE_STUDIO_URL")),
31 | fmt.Sprintf("DRIZZLE_VISUALIZER_URL=%s", os.Getenv("DRIZZLE_VISUALIZER_URL")),
32 | )
33 |
34 | cmd.Stdout = os.Stdout
35 | cmd.Stderr = os.Stderr
36 |
37 | if err := cmd.Start(); err != nil {
38 | return err
39 | }
40 |
41 | // Health check
42 | if err := s.waitForServer(ctx, port); err != nil {
43 | cmd.Process.Kill()
44 | return err
45 | }
46 |
47 | // Open browser
48 | if err := openBrowser(fmt.Sprintf("http://localhost:%d", port)); err != nil {
49 | fmt.Printf("Warning: Could not open browser: %v\n", err)
50 | }
51 |
52 | return cmd.Wait()
53 | }
54 |
55 | func findNodeCommand() string {
56 | commands := []string{"node", "nodejs"}
57 | for _, cmd := range commands {
58 | if _, err := exec.LookPath(cmd); err == nil {
59 | return cmd
60 | }
61 | }
62 | return ""
63 | }
64 |
--------------------------------------------------------------------------------
/packages/view/src/components/theme-mode.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { ThemeProvider, useTheme } from "next-themes";
4 | import { Check, MoonIcon, SunIcon } from "lucide-react";
5 | import {
6 | DropdownMenu,
7 | DropdownMenuContent,
8 | DropdownMenuItem,
9 | DropdownMenuTrigger,
10 | } from "./ui/dropdown-menu";
11 | import { Button } from "./ui/button";
12 |
13 | function ThemeModeProvider({
14 | children,
15 | ...props
16 | }: React.ComponentProps) {
17 | return {children} ;
18 | }
19 |
20 | function ThemeModeToggle() {
21 | const { theme, setTheme } = useTheme();
22 |
23 | const modes = [
24 | { name: "light", label: "Lignt" },
25 | { name: "dark", label: "Dark" },
26 | { name: "system", label: "System" },
27 | ];
28 |
29 | return (
30 |
31 |
32 |
33 |
34 |
35 | Theme mode
36 |
37 |
38 |
39 | {modes.map((mode) => (
40 | {
43 | setTheme(mode.name);
44 | }}
45 | >
46 | {mode.label}
47 | {theme === mode.name && }
48 |
49 | ))}
50 |
51 |
52 | );
53 | }
54 |
55 | export { ThemeModeProvider, ThemeModeToggle };
56 |
--------------------------------------------------------------------------------
/packages/cli/go.sum:
--------------------------------------------------------------------------------
1 | github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
2 | github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
3 | github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
4 | github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
5 | github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
6 | github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
7 | github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
8 | github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
9 | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
10 | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
11 | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
12 | github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s=
13 | github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0=
14 | github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
15 | github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
16 | golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
17 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
18 | golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
19 | golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
20 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
21 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
22 |
--------------------------------------------------------------------------------
/packages/cli/internal/server/server.go:
--------------------------------------------------------------------------------
1 | package server
2 |
3 | import (
4 | "context"
5 | "embed"
6 | "encoding/json"
7 | "fmt"
8 | "net/http"
9 | "os"
10 | "os/signal"
11 | "syscall"
12 | )
13 |
14 | // Server handles the web server operations
15 | type Server struct {
16 | DistFS embed.FS
17 | tempDir string
18 | }
19 |
20 | // Config represents the configuration returned to the frontend
21 | type Config struct {
22 | StudioURL string `json:"studioUrl"`
23 | VisualizerURL string `json:"visualizerUrl"`
24 | }
25 |
26 | // New creates a new server instance
27 | func New(distFS embed.FS) *Server {
28 | return &Server{
29 | DistFS: distFS,
30 | }
31 | }
32 |
33 | // Start starts the web server
34 | func (s *Server) Start(port int) error {
35 | // Extract embedded files to temp directory
36 | tempDir, err := s.extractDistFiles()
37 | if err != nil {
38 | return fmt.Errorf("failed to extract files: %v", err)
39 | }
40 | s.tempDir = tempDir
41 |
42 | ctx, cancel := context.WithCancel(context.Background())
43 | defer cancel()
44 |
45 | go func() {
46 | sigChan := make(chan os.Signal, 1)
47 | signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
48 | <-sigChan
49 | fmt.Println("\nShutting down server...")
50 | cancel()
51 | s.Cleanup()
52 | }()
53 |
54 | // Start `next` server
55 | return s.startNextServer(ctx, tempDir, port)
56 | }
57 |
58 | // Cleanup cleans up temporary resources
59 | func (s *Server) Cleanup() {
60 | if s.tempDir != "" {
61 | os.RemoveAll(s.tempDir)
62 | s.tempDir = ""
63 | }
64 | }
65 |
66 | // HandleConfig returns the current configuration as JSON
67 | func (s *Server) HandleConfig(w http.ResponseWriter, r *http.Request) {
68 | config := Config{
69 | StudioURL: os.Getenv("DRIZZLE_STUDIO_URL"),
70 | VisualizerURL: os.Getenv("DRIZZLE_VISUALIZER_URL"),
71 | }
72 |
73 | w.Header().Set("Content-Type", "application/json")
74 | w.Header().Set("Access-Control-Allow-Origin", "*")
75 |
76 | if err := json.NewEncoder(w).Encode(config); err != nil {
77 | http.Error(w, "Failed to encode config", http.StatusInternalServerError)
78 | return
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/packages/cli/cmd/root.go:
--------------------------------------------------------------------------------
1 | package cmd
2 |
3 | import (
4 | "embed"
5 | "fmt"
6 | "os"
7 | "strconv"
8 |
9 | "github.com/bytaesu/drizzle-view/internal/console"
10 | "github.com/bytaesu/drizzle-view/internal/server"
11 | "github.com/spf13/cobra"
12 | )
13 |
14 | var (
15 | studioUrl string
16 | visualizerUrl string
17 | port int
18 | )
19 |
20 | // NewRootCmd creates the root command
21 | func NewRootCmd(distFS embed.FS) *cobra.Command {
22 | rootCmd := &cobra.Command{
23 | Use: "drizzle-view",
24 | Short: "Unified interface for Drizzle Studio and Drizzle Visualizer",
25 | Long: `
26 | Drizzle View provides a unified web interface to access both
27 | Drizzle Studio and Drizzle Visualizer in a single application.
28 |
29 | You can customize the URLs for your Drizzle Studio and Visualizer instances,
30 | and specify the port for the web interface.
31 | `,
32 | Example: `
33 | # Start with default settings
34 | drizzle-view
35 |
36 | # Use custom URLs
37 | drizzle-view --studio http://localhost:1234 --visualizer http://localhost:5678
38 |
39 | # Use custom port
40 | drizzle-view --port 7777
41 | `,
42 | Run: func(cmd *cobra.Command, args []string) {
43 | startServer(distFS)
44 | },
45 | }
46 |
47 | rootCmd.Flags().StringVarP(&studioUrl, "studio", "s", "http://local.drizzle.studio", "Drizzle Studio URL")
48 | rootCmd.Flags().StringVarP(&visualizerUrl, "visualizer", "v", "http://localhost:64738", "Drizzle Visualizer URL")
49 | rootCmd.Flags().IntVarP(&port, "port", "p", 3333, "Web interface port")
50 |
51 | return rootCmd
52 | }
53 |
54 | func startServer(distFS embed.FS) {
55 | // Show banner
56 | console.ShowBanner()
57 |
58 | // Set environment variables for Next.js
59 | os.Setenv("DRIZZLE_STUDIO_URL", studioUrl)
60 | os.Setenv("DRIZZLE_VISUALIZER_URL", visualizerUrl)
61 | os.Setenv("PORT", strconv.Itoa(port))
62 |
63 | // Show server info
64 | console.ShowServerInfo(port, studioUrl, visualizerUrl)
65 |
66 | // Start server
67 | srv := server.New(distFS)
68 | if err := srv.Start(port); err != nil {
69 | fmt.Fprintf(os.Stderr, "Failed to start server: %v\n", err)
70 | os.Exit(1)
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/packages/view/src/components/ui/tabs.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import * as React from "react";
4 | import * as TabsPrimitive from "@radix-ui/react-tabs";
5 |
6 | import { cn } from "@/lib/utils";
7 |
8 | function Tabs({
9 | className,
10 | ...props
11 | }: React.ComponentProps) {
12 | return (
13 |
18 | );
19 | }
20 |
21 | function TabsList({
22 | className,
23 | ...props
24 | }: React.ComponentProps) {
25 | return (
26 |
34 | );
35 | }
36 |
37 | function TabsTrigger({
38 | className,
39 | ...props
40 | }: React.ComponentProps) {
41 | return (
42 |
50 | );
51 | }
52 |
53 | function TabsContent({
54 | className,
55 | ...props
56 | }: React.ComponentProps) {
57 | return (
58 |
63 | );
64 | }
65 |
66 | export { Tabs, TabsList, TabsTrigger, TabsContent };
67 |
--------------------------------------------------------------------------------
/website/src/components/ui/button.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { Slot } from "@radix-ui/react-slot";
3 | import { cva, type VariantProps } from "class-variance-authority";
4 |
5 | import { cn } from "@/lib/utils";
6 |
7 | const buttonVariants = cva(
8 | "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
9 | {
10 | variants: {
11 | variant: {
12 | default:
13 | "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
14 | destructive:
15 | "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
16 | outline:
17 | "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
18 | secondary:
19 | "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
20 | ghost:
21 | "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
22 | link: "text-primary underline-offset-4 hover:underline",
23 | },
24 | size: {
25 | default: "h-9 px-4 py-2 has-[>svg]:px-3",
26 | sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
27 | lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
28 | icon: "size-9",
29 | },
30 | },
31 | defaultVariants: {
32 | variant: "default",
33 | size: "default",
34 | },
35 | },
36 | );
37 |
38 | function Button({
39 | className,
40 | variant,
41 | size,
42 | asChild = false,
43 | ...props
44 | }: React.ComponentProps<"button"> &
45 | VariantProps & {
46 | asChild?: boolean;
47 | }) {
48 | const Comp = asChild ? Slot : "button";
49 |
50 | return (
51 |
56 | );
57 | }
58 |
59 | export { Button, buttonVariants };
60 |
--------------------------------------------------------------------------------
/packages/view/src/components/ui/button.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import { Slot } from "@radix-ui/react-slot";
3 | import { cva, type VariantProps } from "class-variance-authority";
4 |
5 | import { cn } from "@/lib/utils";
6 |
7 | const buttonVariants = cva(
8 | "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
9 | {
10 | variants: {
11 | variant: {
12 | default:
13 | "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
14 | destructive:
15 | "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
16 | outline:
17 | "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
18 | secondary:
19 | "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
20 | ghost:
21 | "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
22 | link: "text-primary underline-offset-4 hover:underline",
23 | },
24 | size: {
25 | default: "h-9 px-4 py-2 has-[>svg]:px-3",
26 | sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
27 | lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
28 | icon: "size-9",
29 | },
30 | },
31 | defaultVariants: {
32 | variant: "default",
33 | size: "default",
34 | },
35 | },
36 | );
37 |
38 | function Button({
39 | className,
40 | variant,
41 | size,
42 | asChild = false,
43 | ...props
44 | }: React.ComponentProps<"button"> &
45 | VariantProps & {
46 | asChild?: boolean;
47 | }) {
48 | const Comp = asChild ? Slot : "button";
49 |
50 | return (
51 |
56 | );
57 | }
58 |
59 | export { Button, buttonVariants };
60 |
--------------------------------------------------------------------------------
/packages/view/src/app/page.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import { useEffect, useState } from "react";
4 | import { ThemeModeToggle } from "@/components/theme-mode";
5 | import { useTheme } from "next-themes";
6 | import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
7 | import { Monitor, SquareMousePointer } from "lucide-react";
8 | import DrizzleStudio from "@/components/drizzle-studio";
9 | import DrizzleVisualizer from "@/components/drizzle-visualizer";
10 |
11 | const Page = () => {
12 | const { theme, setTheme } = useTheme();
13 | const [activeTab, setActiveTab] = useState("studio");
14 | const [savedTheme, setSavedTheme] = useState();
15 |
16 | // Force dark theme for visualizer tab,
17 | // restore previous theme when switching back
18 | useEffect(() => {
19 | if (activeTab === "visualizer") {
20 | setSavedTheme(theme);
21 | setTheme("dark");
22 | return;
23 | }
24 |
25 | if (savedTheme && theme !== savedTheme) {
26 | setTheme(savedTheme);
27 | return;
28 | }
29 | }, [activeTab]);
30 |
31 | return (
32 |
33 |
38 |
39 |
40 |
41 |
42 | Studio
43 |
44 |
45 |
46 | Visualizer
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 | {/* Keep both components mounted to prevent reload on tab switch */}
55 |
60 |
61 |
62 |
67 |
68 |
69 |
70 |
71 |
72 | );
73 | };
74 |
75 | export default Page;
76 |
--------------------------------------------------------------------------------
/packages/cli/internal/server/static.go:
--------------------------------------------------------------------------------
1 | package server
2 |
3 | import (
4 | "context"
5 | "fmt"
6 | "net/http"
7 | "os"
8 | "path/filepath"
9 | "strings"
10 | )
11 |
12 | func (s *Server) serveStatic(ctx context.Context, distPath string, port int) error {
13 | mux := http.NewServeMux()
14 |
15 | // Handle API config endpoint
16 | mux.HandleFunc("/api/config", s.HandleConfig)
17 |
18 | // Create a custom handler to inject environment variables
19 | handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
20 | // Handle index.html specially to inject environment variables
21 | if r.URL.Path == "/" || r.URL.Path == "/index.html" {
22 | s.handleIndexHTML(w, r, distPath)
23 | return
24 | }
25 |
26 | // Serve static files normally
27 | fileServer := http.FileServer(http.Dir(distPath))
28 | fileServer.ServeHTTP(w, r)
29 | })
30 |
31 | mux.Handle("/", handler)
32 |
33 | server := &http.Server{
34 | Addr: fmt.Sprintf(":%d", port),
35 | Handler: mux,
36 | }
37 |
38 | errChan := make(chan error, 1)
39 | go func() {
40 | errChan <- server.ListenAndServe()
41 | }()
42 |
43 | if err := s.waitForServer(ctx, port); err != nil {
44 | return err
45 | }
46 |
47 | // Open browser
48 | if err := openBrowser(fmt.Sprintf("http://localhost:%d", port)); err != nil {
49 | fmt.Printf("Warning: Could not open browser: %v\n", err)
50 | }
51 |
52 | select {
53 | case <-ctx.Done():
54 | // Handle shutdown
55 | shutdownCtx, cancel := context.WithTimeout(context.Background(), ShutdownTimeout)
56 | defer cancel()
57 | return server.Shutdown(shutdownCtx)
58 | case err := <-errChan:
59 | if err != nil && err != http.ErrServerClosed {
60 | return err
61 | }
62 | return nil
63 | }
64 | }
65 |
66 | func (s *Server) handleIndexHTML(w http.ResponseWriter, _ *http.Request, distPath string) {
67 | indexPath := filepath.Join(distPath, "index.html")
68 |
69 | data, err := os.ReadFile(indexPath)
70 | if err != nil {
71 | http.Error(w, "Internal Server Error", http.StatusInternalServerError)
72 | return
73 | }
74 |
75 | // Replace default values with provided values
76 | content := string(data)
77 | content = strings.ReplaceAll(content, "process.env.NEXT_PUBLIC_DRIZZLE_STUDIO_URL", fmt.Sprintf(`"%s"`, os.Getenv("DRIZZLE_STUDIO_URL")))
78 | content = strings.ReplaceAll(content, "process.env.NEXT_PUBLIC_DRIZZLE_VISUALIZER_URL", fmt.Sprintf(`"%s"`, os.Getenv("DRIZZLE_VISUALIZER_URL")))
79 |
80 | w.Header().Set("Content-Type", "text/html")
81 | w.Write([]byte(content))
82 | }
83 |
--------------------------------------------------------------------------------
/packages/cli/drizzle-view.js:
--------------------------------------------------------------------------------
1 | const https = require("https");
2 | const fs = require("fs");
3 | const path = require("path");
4 | const { execSync, spawn } = require("child_process");
5 |
6 | const GITHUB_REPO = "bytaesu/drizzle-view";
7 | const VERSION = require("./package.json").version;
8 |
9 | function getPlatformInfo() {
10 | const platform = process.platform;
11 | const arch = process.arch;
12 |
13 | let binaryName = `drizzle-view-${platform}-${arch}`;
14 | if (platform === "win32") {
15 | binaryName += ".exe";
16 | }
17 |
18 | return { platform, arch, binaryName };
19 | }
20 |
21 | function downloadFile(url, destination) {
22 | return new Promise((resolve, reject) => {
23 | const file = fs.createWriteStream(destination);
24 |
25 | https
26 | .get(url, (response) => {
27 | if (response.statusCode === 302 || response.statusCode === 301) {
28 | return downloadFile(response.headers.location, destination)
29 | .then(resolve)
30 | .catch(reject);
31 | }
32 |
33 | if (response.statusCode !== 200) {
34 | reject(
35 | new Error(`HTTP ${response.statusCode}: ${response.statusMessage}`),
36 | );
37 | return;
38 | }
39 |
40 | response.pipe(file);
41 |
42 | file.on("finish", () => {
43 | file.close();
44 | resolve();
45 | });
46 |
47 | file.on("error", (err) => {
48 | fs.unlink(destination, () => {});
49 | reject(err);
50 | });
51 | })
52 | .on("error", (err) => {
53 | reject(err);
54 | });
55 | });
56 | }
57 |
58 | async function ensureBinary() {
59 | const { binaryName } = getPlatformInfo();
60 | const binaryPath = path.join(__dirname, "bin", binaryName);
61 |
62 | // Binary already exists
63 | if (fs.existsSync(binaryPath)) {
64 | return binaryPath;
65 | }
66 |
67 | console.log("=> Setting up Drizzle View...");
68 |
69 | // bin 폴더 생성
70 | const binDir = path.dirname(binaryPath);
71 | if (!fs.existsSync(binDir)) {
72 | fs.mkdirSync(binDir, { recursive: true });
73 | }
74 |
75 | // Try to build locally first (for development)
76 | const mainGoPath = path.join(__dirname, "main.go");
77 | if (fs.existsSync(mainGoPath)) {
78 | try {
79 | console.log("=> Building binary locally...");
80 | const buildCmd = `go build -ldflags='-s -w' -o bin/${binaryName} main.go`;
81 | execSync(buildCmd, {
82 | cwd: __dirname,
83 | stdio: "inherit",
84 | });
85 |
86 | if (process.platform !== "win32") {
87 | fs.chmodSync(binaryPath, 0o755);
88 | }
89 |
90 | console.log(`🟢 Built ${binaryName} locally`);
91 | return binaryPath;
92 | } catch (error) {
93 | console.log("Local build failed, downloading from GitHub releases...");
94 | }
95 | }
96 |
97 | // Download from GitHub releases
98 | const downloadUrl = `https://github.com/${GITHUB_REPO}/releases/download/v${VERSION}/${binaryName}`;
99 |
100 | try {
101 | console.log(`=> Downloading ${binaryName}...`);
102 | await downloadFile(downloadUrl, binaryPath);
103 |
104 | if (process.platform !== "win32") {
105 | fs.chmodSync(binaryPath, 0o755);
106 | }
107 |
108 | console.log(`🟢 Downloaded ${binaryName}`);
109 | return binaryPath;
110 | } catch (error) {
111 | console.error(`Failed to download binary: ${error.message}`);
112 | console.error("Please check your internet connection or try again later");
113 | process.exit(1);
114 | }
115 | }
116 |
117 | async function main() {
118 | try {
119 | const binaryPath = await ensureBinary();
120 |
121 | // Execute the Go binary with all arguments
122 | const child = spawn(binaryPath, process.argv.slice(2), {
123 | stdio: "inherit",
124 | shell: false,
125 | });
126 |
127 | child.on("error", (error) => {
128 | console.error("Failed to start drizzle-view:", error.message);
129 | process.exit(1);
130 | });
131 |
132 | child.on("exit", (code) => {
133 | process.exit(code);
134 | });
135 | } catch (error) {
136 | console.error("Error:", error.message);
137 | process.exit(1);
138 | }
139 | }
140 |
141 | if (require.main === module) {
142 | main();
143 | }
144 |
145 | module.exports = { ensureBinary };
146 |
--------------------------------------------------------------------------------
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | name: Release
2 |
3 | on:
4 | push:
5 | tags:
6 | - "v*"
7 |
8 | permissions:
9 | contents: write
10 |
11 | jobs:
12 | build-and-release:
13 | runs-on: ubuntu-latest
14 | steps:
15 | - uses: actions/checkout@v4
16 |
17 | - name: Setup Node.js
18 | uses: actions/setup-node@v4
19 | with:
20 | node-version: "22"
21 | registry-url: "https://registry.npmjs.org"
22 |
23 | - name: Setup Go
24 | uses: actions/setup-go@v4
25 | with:
26 | go-version: "1.24"
27 |
28 | - name: Setup pnpm
29 | uses: pnpm/action-setup@v2
30 | with:
31 | version: latest
32 | run_install: false
33 |
34 | - name: Install dependencies
35 | run: pnpm install --frozen-lockfile
36 |
37 | - name: Build all packages
38 | run: pnpm run build
39 |
40 | # Build Go binaries for release
41 | - name: Build Go binaries
42 | working-directory: ./packages/cli
43 | run: |
44 | mkdir -p release
45 |
46 | platforms=(
47 | "windows/amd64"
48 | "windows/arm64"
49 | "darwin/amd64"
50 | "darwin/arm64"
51 | "linux/amd64"
52 | "linux/arm64"
53 | )
54 |
55 | for platform in "${platforms[@]}"; do
56 | GOOS="${platform%/*}"
57 | GOARCH="${platform#*/}"
58 |
59 | case $GOOS in
60 | windows) PLATFORM_NAME="win32" ;;
61 | darwin) PLATFORM_NAME="darwin" ;;
62 | linux) PLATFORM_NAME="linux" ;;
63 | *) PLATFORM_NAME=$GOOS ;;
64 | esac
65 |
66 | case $GOARCH in
67 | amd64) ARCH_NAME="x64" ;;
68 | arm64) ARCH_NAME="arm64" ;;
69 | *) ARCH_NAME=$GOARCH ;;
70 | esac
71 |
72 | output_name="drizzle-view-${PLATFORM_NAME}-${ARCH_NAME}"
73 | if [ "$GOOS" = "windows" ]; then
74 | output_name+='.exe'
75 | fi
76 |
77 | echo "Building $output_name..."
78 | env GOOS=$GOOS GOARCH=$GOARCH CGO_ENABLED=0 go build -ldflags='-s -w' -o release/$output_name main.go
79 | done
80 |
81 | # tar.gz archive for Homebrew
82 | - name: Create Homebrew archives
83 | working-directory: ./packages/cli
84 | run: |
85 | mkdir -p homebrew-releases
86 | tar -czf homebrew-releases/drizzle-view-darwin-x64.tar.gz -C release drizzle-view-darwin-x64
87 | tar -czf homebrew-releases/drizzle-view-darwin-arm64.tar.gz -C release drizzle-view-darwin-arm64
88 |
89 | - name: Create GitHub Release
90 | id: create_release
91 | uses: softprops/action-gh-release@v2
92 | with:
93 | tag_name: ${{ github.ref_name }}
94 | name: Release ${{ github.ref_name }}
95 | draft: false
96 | prerelease: false
97 | files: |
98 | packages/cli/release/*
99 | packages/cli/homebrew-releases/*
100 | env:
101 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
102 |
103 | - name: Publish to npm
104 | working-directory: ./packages/cli
105 | run: pnpm publish --access public --no-git-checks
106 | env:
107 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
108 |
109 | # Update Homebrew Formula (x64)
110 | - name: Update Homebrew Formula (x64)
111 | uses: mislav/bump-homebrew-formula-action@v3
112 | with:
113 | formula-name: drizzle-view
114 | homebrew-tap: bytaesu/homebrew-tap-drizzle-view
115 | download-url: "https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/drizzle-view-darwin-x64.tar.gz"
116 | commit-message: |
117 | drizzle-view ${{ github.ref_name }} (x64)
118 |
119 | Updated by GitHub Actions
120 | env:
121 | COMMITTER_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
122 |
123 | # Update Homebrew Formula (ARM64)
124 | - name: Update Homebrew Formula (ARM64)
125 | uses: mislav/bump-homebrew-formula-action@v3
126 | with:
127 | formula-name: drizzle-view
128 | homebrew-tap: bytaesu/homebrew-tap-drizzle-view
129 | download-url: "https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/drizzle-view-darwin-arm64.tar.gz"
130 | commit-message: |
131 | drizzle-view ${{ github.ref_name }} (ARM64)
132 |
133 | Updated by GitHub Actions
134 | env:
135 | COMMITTER_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
136 |
--------------------------------------------------------------------------------
/website/src/app/globals.css:
--------------------------------------------------------------------------------
1 | @import "tailwindcss";
2 | @import "tw-animate-css";
3 |
4 | @custom-variant dark (&:is(.dark *));
5 |
6 | @theme inline {
7 | --color-background: var(--background);
8 | --color-foreground: var(--foreground);
9 | --font-sans: var(--font-geist-sans);
10 | --font-mono: var(--font-geist-mono);
11 | --color-sidebar-ring: var(--sidebar-ring);
12 | --color-sidebar-border: var(--sidebar-border);
13 | --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
14 | --color-sidebar-accent: var(--sidebar-accent);
15 | --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
16 | --color-sidebar-primary: var(--sidebar-primary);
17 | --color-sidebar-foreground: var(--sidebar-foreground);
18 | --color-sidebar: var(--sidebar);
19 | --color-chart-5: var(--chart-5);
20 | --color-chart-4: var(--chart-4);
21 | --color-chart-3: var(--chart-3);
22 | --color-chart-2: var(--chart-2);
23 | --color-chart-1: var(--chart-1);
24 | --color-ring: var(--ring);
25 | --color-input: var(--input);
26 | --color-border: var(--border);
27 | --color-destructive: var(--destructive);
28 | --color-accent-foreground: var(--accent-foreground);
29 | --color-accent: var(--accent);
30 | --color-muted-foreground: var(--muted-foreground);
31 | --color-muted: var(--muted);
32 | --color-secondary-foreground: var(--secondary-foreground);
33 | --color-secondary: var(--secondary);
34 | --color-primary-foreground: var(--primary-foreground);
35 | --color-primary: var(--primary);
36 | --color-popover-foreground: var(--popover-foreground);
37 | --color-popover: var(--popover);
38 | --color-card-foreground: var(--card-foreground);
39 | --color-card: var(--card);
40 | --radius-sm: calc(var(--radius) - 4px);
41 | --radius-md: calc(var(--radius) - 2px);
42 | --radius-lg: var(--radius);
43 | --radius-xl: calc(var(--radius) + 4px);
44 | }
45 |
46 | :root {
47 | --radius: 0.625rem;
48 | --background: oklch(1 0 0);
49 | --foreground: oklch(0.145 0 0);
50 | --card: oklch(1 0 0);
51 | --card-foreground: oklch(0.145 0 0);
52 | --popover: oklch(1 0 0);
53 | --popover-foreground: oklch(0.145 0 0);
54 | --primary: oklch(0.205 0 0);
55 | --primary-foreground: oklch(0.985 0 0);
56 | --secondary: oklch(0.97 0 0);
57 | --secondary-foreground: oklch(0.205 0 0);
58 | --muted: oklch(0.97 0 0);
59 | --muted-foreground: oklch(0.556 0 0);
60 | --accent: oklch(0.97 0 0);
61 | --accent-foreground: oklch(0.205 0 0);
62 | --destructive: oklch(0.577 0.245 27.325);
63 | --border: oklch(0.922 0 0);
64 | --input: oklch(0.922 0 0);
65 | --ring: oklch(0.708 0 0);
66 | --chart-1: oklch(0.646 0.222 41.116);
67 | --chart-2: oklch(0.6 0.118 184.704);
68 | --chart-3: oklch(0.398 0.07 227.392);
69 | --chart-4: oklch(0.828 0.189 84.429);
70 | --chart-5: oklch(0.769 0.188 70.08);
71 | --sidebar: oklch(0.985 0 0);
72 | --sidebar-foreground: oklch(0.145 0 0);
73 | --sidebar-primary: oklch(0.205 0 0);
74 | --sidebar-primary-foreground: oklch(0.985 0 0);
75 | --sidebar-accent: oklch(0.97 0 0);
76 | --sidebar-accent-foreground: oklch(0.205 0 0);
77 | --sidebar-border: oklch(0.922 0 0);
78 | --sidebar-ring: oklch(0.708 0 0);
79 | }
80 |
81 | .dark {
82 | --background: oklch(0.145 0 0);
83 | --foreground: oklch(0.985 0 0);
84 | --card: oklch(0.205 0 0);
85 | --card-foreground: oklch(0.985 0 0);
86 | --popover: oklch(0.205 0 0);
87 | --popover-foreground: oklch(0.985 0 0);
88 | --primary: oklch(0.922 0 0);
89 | --primary-foreground: oklch(0.205 0 0);
90 | --secondary: oklch(0.269 0 0);
91 | --secondary-foreground: oklch(0.985 0 0);
92 | --muted: oklch(0.269 0 0);
93 | --muted-foreground: oklch(0.708 0 0);
94 | --accent: oklch(0.269 0 0);
95 | --accent-foreground: oklch(0.985 0 0);
96 | --destructive: oklch(0.704 0.191 22.216);
97 | --border: oklch(1 0 0 / 10%);
98 | --input: oklch(1 0 0 / 15%);
99 | --ring: oklch(0.556 0 0);
100 | --chart-1: oklch(0.488 0.243 264.376);
101 | --chart-2: oklch(0.696 0.17 162.48);
102 | --chart-3: oklch(0.769 0.188 70.08);
103 | --chart-4: oklch(0.627 0.265 303.9);
104 | --chart-5: oklch(0.645 0.246 16.439);
105 | --sidebar: oklch(0.205 0 0);
106 | --sidebar-foreground: oklch(0.985 0 0);
107 | --sidebar-primary: oklch(0.488 0.243 264.376);
108 | --sidebar-primary-foreground: oklch(0.985 0 0);
109 | --sidebar-accent: oklch(0.269 0 0);
110 | --sidebar-accent-foreground: oklch(0.985 0 0);
111 | --sidebar-border: oklch(1 0 0 / 10%);
112 | --sidebar-ring: oklch(0.556 0 0);
113 | }
114 |
115 | @layer base {
116 | * {
117 | @apply border-border outline-ring/50;
118 | }
119 | body {
120 | @apply bg-background text-foreground;
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/packages/view/src/app/globals.css:
--------------------------------------------------------------------------------
1 | @import "tailwindcss";
2 | @import "tw-animate-css";
3 |
4 | @custom-variant dark (&:is(.dark *));
5 |
6 | @theme inline {
7 | --color-background: var(--background);
8 | --color-foreground: var(--foreground);
9 | --font-sans: var(--font-geist-sans);
10 | --font-mono: var(--font-geist-mono);
11 | --color-sidebar-ring: var(--sidebar-ring);
12 | --color-sidebar-border: var(--sidebar-border);
13 | --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
14 | --color-sidebar-accent: var(--sidebar-accent);
15 | --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
16 | --color-sidebar-primary: var(--sidebar-primary);
17 | --color-sidebar-foreground: var(--sidebar-foreground);
18 | --color-sidebar: var(--sidebar);
19 | --color-chart-5: var(--chart-5);
20 | --color-chart-4: var(--chart-4);
21 | --color-chart-3: var(--chart-3);
22 | --color-chart-2: var(--chart-2);
23 | --color-chart-1: var(--chart-1);
24 | --color-ring: var(--ring);
25 | --color-input: var(--input);
26 | --color-border: var(--border);
27 | --color-destructive: var(--destructive);
28 | --color-accent-foreground: var(--accent-foreground);
29 | --color-accent: var(--accent);
30 | --color-muted-foreground: var(--muted-foreground);
31 | --color-muted: var(--muted);
32 | --color-secondary-foreground: var(--secondary-foreground);
33 | --color-secondary: var(--secondary);
34 | --color-primary-foreground: var(--primary-foreground);
35 | --color-primary: var(--primary);
36 | --color-popover-foreground: var(--popover-foreground);
37 | --color-popover: var(--popover);
38 | --color-card-foreground: var(--card-foreground);
39 | --color-card: var(--card);
40 | --radius-sm: calc(var(--radius) - 4px);
41 | --radius-md: calc(var(--radius) - 2px);
42 | --radius-lg: var(--radius);
43 | --radius-xl: calc(var(--radius) + 4px);
44 | }
45 |
46 | :root {
47 | --radius: 0.625rem;
48 | --background: oklch(1 0 0);
49 | --foreground: oklch(0.145 0 0);
50 | --card: oklch(1 0 0);
51 | --card-foreground: oklch(0.145 0 0);
52 | --popover: oklch(1 0 0);
53 | --popover-foreground: oklch(0.145 0 0);
54 | --primary: oklch(0.205 0 0);
55 | --primary-foreground: oklch(0.985 0 0);
56 | --secondary: oklch(0.97 0 0);
57 | --secondary-foreground: oklch(0.205 0 0);
58 | --muted: oklch(0.97 0 0);
59 | --muted-foreground: oklch(0.556 0 0);
60 | --accent: oklch(0.97 0 0);
61 | --accent-foreground: oklch(0.205 0 0);
62 | --destructive: oklch(0.577 0.245 27.325);
63 | --border: oklch(0.922 0 0);
64 | --input: oklch(0.922 0 0);
65 | --ring: oklch(0.708 0 0);
66 | --chart-1: oklch(0.646 0.222 41.116);
67 | --chart-2: oklch(0.6 0.118 184.704);
68 | --chart-3: oklch(0.398 0.07 227.392);
69 | --chart-4: oklch(0.828 0.189 84.429);
70 | --chart-5: oklch(0.769 0.188 70.08);
71 | --sidebar: oklch(0.985 0 0);
72 | --sidebar-foreground: oklch(0.145 0 0);
73 | --sidebar-primary: oklch(0.205 0 0);
74 | --sidebar-primary-foreground: oklch(0.985 0 0);
75 | --sidebar-accent: oklch(0.97 0 0);
76 | --sidebar-accent-foreground: oklch(0.205 0 0);
77 | --sidebar-border: oklch(0.922 0 0);
78 | --sidebar-ring: oklch(0.708 0 0);
79 | }
80 |
81 | .dark {
82 | --background: oklch(0.145 0 0);
83 | --foreground: oklch(0.985 0 0);
84 | --card: oklch(0.205 0 0);
85 | --card-foreground: oklch(0.985 0 0);
86 | --popover: oklch(0.205 0 0);
87 | --popover-foreground: oklch(0.985 0 0);
88 | --primary: oklch(0.922 0 0);
89 | --primary-foreground: oklch(0.205 0 0);
90 | --secondary: oklch(0.269 0 0);
91 | --secondary-foreground: oklch(0.985 0 0);
92 | --muted: oklch(0.269 0 0);
93 | --muted-foreground: oklch(0.708 0 0);
94 | --accent: oklch(0.269 0 0);
95 | --accent-foreground: oklch(0.985 0 0);
96 | --destructive: oklch(0.704 0.191 22.216);
97 | --border: oklch(1 0 0 / 10%);
98 | --input: oklch(1 0 0 / 15%);
99 | --ring: oklch(0.556 0 0);
100 | --chart-1: oklch(0.488 0.243 264.376);
101 | --chart-2: oklch(0.696 0.17 162.48);
102 | --chart-3: oklch(0.769 0.188 70.08);
103 | --chart-4: oklch(0.627 0.265 303.9);
104 | --chart-5: oklch(0.645 0.246 16.439);
105 | --sidebar: oklch(0.205 0 0);
106 | --sidebar-foreground: oklch(0.985 0 0);
107 | --sidebar-primary: oklch(0.488 0.243 264.376);
108 | --sidebar-primary-foreground: oklch(0.985 0 0);
109 | --sidebar-accent: oklch(0.269 0 0);
110 | --sidebar-accent-foreground: oklch(0.985 0 0);
111 | --sidebar-border: oklch(1 0 0 / 10%);
112 | --sidebar-ring: oklch(0.556 0 0);
113 | }
114 |
115 | @layer base {
116 | * {
117 | @apply border-border outline-ring/50;
118 | }
119 | body {
120 | @apply bg-background text-foreground;
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/website/src/components/background-beams-with-collision.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 | import { cn } from "@/lib/utils";
3 | import { AnimatePresence, motion } from "framer-motion";
4 | import React, { useRef, useState, useEffect } from "react";
5 |
6 | export const BackgroundBeamsWithCollision = ({
7 | children,
8 | className,
9 | }: {
10 | children: React.ReactNode;
11 | className?: string;
12 | }) => {
13 | const containerRef = useRef(null);
14 | const parentRef = useRef(null);
15 |
16 | const beams = [
17 | {
18 | initialX: 10,
19 | translateX: 10,
20 | duration: 7,
21 | repeatDelay: 3,
22 | delay: 2,
23 | },
24 | {
25 | initialX: 600,
26 | translateX: 600,
27 | duration: 3,
28 | repeatDelay: 3,
29 | delay: 4,
30 | },
31 | {
32 | initialX: 100,
33 | translateX: 100,
34 | duration: 7,
35 | repeatDelay: 7,
36 | className: "h-6",
37 | },
38 | {
39 | initialX: 400,
40 | translateX: 400,
41 | duration: 5,
42 | repeatDelay: 14,
43 | delay: 4,
44 | },
45 | {
46 | initialX: 800,
47 | translateX: 800,
48 | duration: 11,
49 | repeatDelay: 2,
50 | className: "h-20",
51 | },
52 | {
53 | initialX: 1000,
54 | translateX: 1000,
55 | duration: 4,
56 | repeatDelay: 2,
57 | className: "h-12",
58 | },
59 | {
60 | initialX: 1200,
61 | translateX: 1200,
62 | duration: 6,
63 | repeatDelay: 4,
64 | delay: 2,
65 | className: "h-6",
66 | },
67 | ];
68 |
69 | return (
70 |
78 | {beams.map((beam) => (
79 |
85 | ))}
86 |
87 | {children}
88 |
96 |
97 | );
98 | };
99 |
100 | const CollisionMechanism = React.forwardRef<
101 | HTMLDivElement,
102 | {
103 | containerRef: React.RefObject;
104 | parentRef: React.RefObject;
105 | beamOptions?: {
106 | initialX?: number;
107 | translateX?: number;
108 | initialY?: number;
109 | translateY?: number;
110 | rotate?: number;
111 | className?: string;
112 | duration?: number;
113 | delay?: number;
114 | repeatDelay?: number;
115 | };
116 | }
117 | >(({ parentRef, containerRef, beamOptions = {} }, ref) => {
118 | const beamRef = useRef(null);
119 | const [collision, setCollision] = useState<{
120 | detected: boolean;
121 | coordinates: { x: number; y: number } | null;
122 | }>({
123 | detected: false,
124 | coordinates: null,
125 | });
126 | const [beamKey, setBeamKey] = useState(0);
127 | const [cycleCollisionDetected, setCycleCollisionDetected] = useState(false);
128 |
129 | useEffect(() => {
130 | const checkCollision = () => {
131 | if (
132 | beamRef.current &&
133 | containerRef.current &&
134 | parentRef.current &&
135 | !cycleCollisionDetected
136 | ) {
137 | const beamRect = beamRef.current.getBoundingClientRect();
138 | const containerRect = containerRef.current.getBoundingClientRect();
139 | const parentRect = parentRef.current.getBoundingClientRect();
140 |
141 | if (beamRect.bottom >= containerRect.top) {
142 | const relativeX =
143 | beamRect.left - parentRect.left + beamRect.width / 2;
144 | const relativeY = beamRect.bottom - parentRect.top;
145 |
146 | setCollision({
147 | detected: true,
148 | coordinates: {
149 | x: relativeX,
150 | y: relativeY,
151 | },
152 | });
153 | setCycleCollisionDetected(true);
154 | }
155 | }
156 | };
157 |
158 | const animationInterval = setInterval(checkCollision, 50);
159 |
160 | return () => clearInterval(animationInterval);
161 | }, [cycleCollisionDetected, containerRef]);
162 |
163 | useEffect(() => {
164 | if (collision.detected && collision.coordinates) {
165 | setTimeout(() => {
166 | setCollision({ detected: false, coordinates: null });
167 | setCycleCollisionDetected(false);
168 | }, 2000);
169 |
170 | setTimeout(() => {
171 | setBeamKey((prevKey) => prevKey + 1);
172 | }, 2000);
173 | }
174 | }, [collision]);
175 |
176 | return (
177 | <>
178 |
207 |
208 | {collision.detected && collision.coordinates && (
209 |
218 | )}
219 |
220 | >
221 | );
222 | });
223 |
224 | CollisionMechanism.displayName = "CollisionMechanism";
225 |
226 | const Explosion = ({ ...props }: React.HTMLProps) => {
227 | const spans = Array.from({ length: 20 }, (_, index) => ({
228 | id: index,
229 | initialX: 0,
230 | initialY: 0,
231 | directionX: Math.floor(Math.random() * 80 - 40),
232 | directionY: Math.floor(Math.random() * -50 - 10),
233 | }));
234 |
235 | return (
236 |
237 |
244 | {spans.map((span) => (
245 |
256 | ))}
257 |
258 | );
259 | };
260 |
--------------------------------------------------------------------------------
/packages/view/src/components/ui/dropdown-menu.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import * as React from "react";
4 | import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
5 | import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react";
6 |
7 | import { cn } from "@/lib/utils";
8 |
9 | function DropdownMenu({
10 | ...props
11 | }: React.ComponentProps) {
12 | return ;
13 | }
14 |
15 | function DropdownMenuPortal({
16 | ...props
17 | }: React.ComponentProps) {
18 | return (
19 |
20 | );
21 | }
22 |
23 | function DropdownMenuTrigger({
24 | ...props
25 | }: React.ComponentProps) {
26 | return (
27 |
31 | );
32 | }
33 |
34 | function DropdownMenuContent({
35 | className,
36 | sideOffset = 4,
37 | ...props
38 | }: React.ComponentProps) {
39 | return (
40 |
41 |
50 |
51 | );
52 | }
53 |
54 | function DropdownMenuGroup({
55 | ...props
56 | }: React.ComponentProps) {
57 | return (
58 |
59 | );
60 | }
61 |
62 | function DropdownMenuItem({
63 | className,
64 | inset,
65 | variant = "default",
66 | ...props
67 | }: React.ComponentProps & {
68 | inset?: boolean;
69 | variant?: "default" | "destructive";
70 | }) {
71 | return (
72 |
82 | );
83 | }
84 |
85 | function DropdownMenuCheckboxItem({
86 | className,
87 | children,
88 | checked,
89 | ...props
90 | }: React.ComponentProps) {
91 | return (
92 |
101 |
102 |
103 |
104 |
105 |
106 | {children}
107 |
108 | );
109 | }
110 |
111 | function DropdownMenuRadioGroup({
112 | ...props
113 | }: React.ComponentProps) {
114 | return (
115 |
119 | );
120 | }
121 |
122 | function DropdownMenuRadioItem({
123 | className,
124 | children,
125 | ...props
126 | }: React.ComponentProps) {
127 | return (
128 |
136 |
137 |
138 |
139 |
140 |
141 | {children}
142 |
143 | );
144 | }
145 |
146 | function DropdownMenuLabel({
147 | className,
148 | inset,
149 | ...props
150 | }: React.ComponentProps & {
151 | inset?: boolean;
152 | }) {
153 | return (
154 |
163 | );
164 | }
165 |
166 | function DropdownMenuSeparator({
167 | className,
168 | ...props
169 | }: React.ComponentProps) {
170 | return (
171 |
176 | );
177 | }
178 |
179 | function DropdownMenuShortcut({
180 | className,
181 | ...props
182 | }: React.ComponentProps<"span">) {
183 | return (
184 |
192 | );
193 | }
194 |
195 | function DropdownMenuSub({
196 | ...props
197 | }: React.ComponentProps) {
198 | return ;
199 | }
200 |
201 | function DropdownMenuSubTrigger({
202 | className,
203 | inset,
204 | children,
205 | ...props
206 | }: React.ComponentProps & {
207 | inset?: boolean;
208 | }) {
209 | return (
210 |
219 | {children}
220 |
221 |
222 | );
223 | }
224 |
225 | function DropdownMenuSubContent({
226 | className,
227 | ...props
228 | }: React.ComponentProps) {
229 | return (
230 |
238 | );
239 | }
240 |
241 | export {
242 | DropdownMenu,
243 | DropdownMenuPortal,
244 | DropdownMenuTrigger,
245 | DropdownMenuContent,
246 | DropdownMenuGroup,
247 | DropdownMenuLabel,
248 | DropdownMenuItem,
249 | DropdownMenuCheckboxItem,
250 | DropdownMenuRadioGroup,
251 | DropdownMenuRadioItem,
252 | DropdownMenuSeparator,
253 | DropdownMenuShortcut,
254 | DropdownMenuSub,
255 | DropdownMenuSubTrigger,
256 | DropdownMenuSubContent,
257 | };
258 |
--------------------------------------------------------------------------------
/website/src/app/page.tsx:
--------------------------------------------------------------------------------
1 | import { BackgroundBeamsWithCollision } from "@/components/background-beams-with-collision";
2 | import { CodeBlock } from "@/components/code-block";
3 | import { Button } from "@/components/ui/button";
4 | import Link from "next/link";
5 |
6 | export default function Home() {
7 | return (
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | );
16 | }
17 |
18 | const Hero = () => {
19 | return (
20 |
21 |
22 | {/* Text */}
23 |
24 |
25 | What is stopping you from trying this?
26 |
27 |
28 | Drizzle View
29 |
30 |
31 | Run{" "}
32 | Drizzle Studio {" "}
33 | and{" "}
34 |
35 | Drizzle Visualizer
36 | {" "}
37 | together in one view
38 |
39 |
40 |
41 | {/* Image */}
42 |
43 |
48 |
49 |
50 |
51 | );
52 | };
53 |
54 | const HowToUse = () => {
55 | const projectSetupCode = `pnpm add -D drizzle-kit concurrently
56 | `;
57 |
58 | const projectScriptCode = `"scripts": {
59 | "db:view": "concurrently \\"pnpm drizzle-kit studio\\" \\"pnpm dlx drizzle-lab visualizer\\" \\"sleep 1 && pnpm dlx drizzle-view\\""
60 | }
61 | `;
62 |
63 | const projectRunCode = `pnpm db:view
64 | `;
65 |
66 | const drizzleViewInstallCode = `# homebrew
67 | brew install bytaesu/homebrew-tap-drizzle-view/drizzle-view
68 |
69 | # npm
70 | npm install -g drizzle-view
71 |
72 | # pnpm
73 | pnpm add -g drizzle-view
74 |
75 | # yarn
76 | yarn global add drizzle-view
77 | `;
78 |
79 | return (
80 |
81 |
82 |
How to use
83 |
84 |
85 |
86 | {/* Project Setup */}
87 |
88 |
89 | Inside a project using drizzle-orm
90 |
91 |
Install packages:
92 |
93 |
94 | Add a script to your package.json:
95 |
96 |
97 |
Run:
98 |
99 |
Enjoy🎉
100 |
101 |
102 | {/* Drizzle View Installation */}
103 |
104 |
Global Installation
105 |
106 | Install{" "}
107 | drizzle-view{" "}
108 | via your preferred package manager:
109 |
110 |
115 |
116 |
117 | {/* Options */}
118 |
119 |
Options
120 |
121 |
122 | --studio <url>: Drizzle Studio URL (default:
123 | http://local.drizzle.studio)
124 |
125 |
126 | --visualizer <url>: Drizzle Visualizer URL (default:
127 | http://localhost:64738)
128 |
129 | --port <port>: Web interface port (default: 3333)
130 | --help: Show help
131 |
132 |
133 |
134 | {/* Limitations */}
135 |
136 |
Limitations
137 |
138 | As all views are embedded in iframes, custom theme is currently
139 | unsupported.
140 |
141 |
142 |
143 | );
144 | };
145 |
146 | const Principle = () => {
147 | return (
148 |
149 |
150 |
Principles
151 |
152 |
153 |
154 | {/* Principle 1 */}
155 |
156 |
157 | 1. Use Official Drizzle Packages
158 |
159 |
160 | I’m just using what Drizzle already provides. Drizzle View is
161 | literally just a viewer
162 |
163 |
164 |
165 | {/* Principle 2 */}
166 |
167 |
168 | 2. Retirement Upon Official Support
169 |
170 |
171 | If Drizzle officially supports this feature, Drizzle View will be
172 | retired. I made this project mainly to{" "}
173 | gently pressure the Drizzle team 😎
174 |
175 |
176 |
177 | {/* Principle 3 */}
178 |
179 |
180 | 3. npm Package Name Ownership
181 |
182 |
183 | I’ll hand over the{" "}
184 |
185 | drizzle-view
186 | {" "}
187 | npm package name immediately if the Drizzle team needs it. I always
188 | prefer officially supported tools
189 |
190 |
191 |
192 |
193 | );
194 | };
195 |
196 | const Pricing = () => {
197 | return (
198 |
199 |
200 |
Pricing
201 |
202 |
203 |
204 |
205 | 100% Free — don’t spend your money on this stuff
206 |
207 | Just follow my X account.
208 |
209 | I’m building cool stuff, and it’d be awesome if more people could check
210 | it out.
211 |
212 |
213 | );
214 | };
215 |
216 | const LinkSection = () => {
217 | return (
218 |
219 |
220 | {/* X Button */}
221 |
222 |
223 |
224 | bytaesu
225 |
226 |
227 |
228 | {/* GitHub Button */}
229 |
234 |
235 |
236 | bytaesu/drizzle-view
237 |
238 |
239 |
240 |
241 | );
242 | };
243 |
244 | const XIcon = () => {
245 | return (
246 |
252 |
256 |
257 | );
258 | };
259 |
260 | const GitHubIcon = () => {
261 | return (
262 |
269 |
270 |
271 | );
272 | };
273 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '9.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | importers:
8 |
9 | .:
10 | devDependencies:
11 | '@biomejs/biome':
12 | specifier: 2.2.0
13 | version: 2.2.0
14 |
15 | packages/cli: {}
16 |
17 | packages/view:
18 | dependencies:
19 | '@radix-ui/react-dropdown-menu':
20 | specifier: ^2.1.16
21 | version: 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
22 | '@radix-ui/react-slot':
23 | specifier: ^1.2.3
24 | version: 1.2.3(@types/react@19.1.12)(react@19.1.0)
25 | '@radix-ui/react-tabs':
26 | specifier: ^1.1.13
27 | version: 1.1.13(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
28 | class-variance-authority:
29 | specifier: ^0.7.1
30 | version: 0.7.1
31 | clsx:
32 | specifier: ^2.1.1
33 | version: 2.1.1
34 | lucide-react:
35 | specifier: ^0.542.0
36 | version: 0.542.0(react@19.1.0)
37 | next:
38 | specifier: 15.5.2
39 | version: 15.5.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
40 | next-themes:
41 | specifier: ^0.4.6
42 | version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
43 | react:
44 | specifier: 19.1.0
45 | version: 19.1.0
46 | react-dom:
47 | specifier: 19.1.0
48 | version: 19.1.0(react@19.1.0)
49 | tailwind-merge:
50 | specifier: ^3.3.1
51 | version: 3.3.1
52 | devDependencies:
53 | '@biomejs/biome':
54 | specifier: 2.2.0
55 | version: 2.2.0
56 | '@tailwindcss/postcss':
57 | specifier: ^4
58 | version: 4.1.13
59 | '@types/node':
60 | specifier: ^20
61 | version: 20.19.13
62 | '@types/react':
63 | specifier: ^19
64 | version: 19.1.12
65 | '@types/react-dom':
66 | specifier: ^19
67 | version: 19.1.9(@types/react@19.1.12)
68 | tailwindcss:
69 | specifier: ^4
70 | version: 4.1.13
71 | tw-animate-css:
72 | specifier: ^1.3.8
73 | version: 1.3.8
74 | typescript:
75 | specifier: ^5
76 | version: 5.9.2
77 |
78 | website:
79 | dependencies:
80 | '@radix-ui/react-slot':
81 | specifier: ^1.2.3
82 | version: 1.2.3(@types/react@19.1.12)(react@19.1.0)
83 | class-variance-authority:
84 | specifier: ^0.7.1
85 | version: 0.7.1
86 | clsx:
87 | specifier: ^2.1.1
88 | version: 2.1.1
89 | framer-motion:
90 | specifier: ^12.23.12
91 | version: 12.23.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
92 | lucide-react:
93 | specifier: ^0.542.0
94 | version: 0.542.0(react@19.1.0)
95 | next:
96 | specifier: 15.5.2
97 | version: 15.5.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
98 | react:
99 | specifier: 19.1.0
100 | version: 19.1.0
101 | react-dom:
102 | specifier: 19.1.0
103 | version: 19.1.0(react@19.1.0)
104 | react-syntax-highlighter:
105 | specifier: ^15.6.6
106 | version: 15.6.6(react@19.1.0)
107 | shiki:
108 | specifier: ^3.12.2
109 | version: 3.12.2
110 | tailwind-merge:
111 | specifier: ^3.3.1
112 | version: 3.3.1
113 | devDependencies:
114 | '@biomejs/biome':
115 | specifier: 2.2.0
116 | version: 2.2.0
117 | '@tailwindcss/postcss':
118 | specifier: ^4
119 | version: 4.1.13
120 | '@types/node':
121 | specifier: ^20
122 | version: 20.19.13
123 | '@types/react':
124 | specifier: ^19
125 | version: 19.1.12
126 | '@types/react-dom':
127 | specifier: ^19
128 | version: 19.1.9(@types/react@19.1.12)
129 | '@types/react-syntax-highlighter':
130 | specifier: ^15.5.13
131 | version: 15.5.13
132 | tailwindcss:
133 | specifier: ^4
134 | version: 4.1.13
135 | tw-animate-css:
136 | specifier: ^1.3.8
137 | version: 1.3.8
138 | typescript:
139 | specifier: ^5
140 | version: 5.9.2
141 |
142 | packages:
143 |
144 | '@alloc/quick-lru@5.2.0':
145 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
146 | engines: {node: '>=10'}
147 |
148 | '@babel/runtime@7.28.4':
149 | resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==}
150 | engines: {node: '>=6.9.0'}
151 |
152 | '@biomejs/biome@2.2.0':
153 | resolution: {integrity: sha512-3On3RSYLsX+n9KnoSgfoYlckYBoU6VRM22cw1gB4Y0OuUVSYd/O/2saOJMrA4HFfA1Ff0eacOvMN1yAAvHtzIw==}
154 | engines: {node: '>=14.21.3'}
155 | hasBin: true
156 |
157 | '@biomejs/cli-darwin-arm64@2.2.0':
158 | resolution: {integrity: sha512-zKbwUUh+9uFmWfS8IFxmVD6XwqFcENjZvEyfOxHs1epjdH3wyyMQG80FGDsmauPwS2r5kXdEM0v/+dTIA9FXAg==}
159 | engines: {node: '>=14.21.3'}
160 | cpu: [arm64]
161 | os: [darwin]
162 |
163 | '@biomejs/cli-darwin-x64@2.2.0':
164 | resolution: {integrity: sha512-+OmT4dsX2eTfhD5crUOPw3RPhaR+SKVspvGVmSdZ9y9O/AgL8pla6T4hOn1q+VAFBHuHhsdxDRJgFCSC7RaMOw==}
165 | engines: {node: '>=14.21.3'}
166 | cpu: [x64]
167 | os: [darwin]
168 |
169 | '@biomejs/cli-linux-arm64-musl@2.2.0':
170 | resolution: {integrity: sha512-egKpOa+4FL9YO+SMUMLUvf543cprjevNc3CAgDNFLcjknuNMcZ0GLJYa3EGTCR2xIkIUJDVneBV3O9OcIlCEZQ==}
171 | engines: {node: '>=14.21.3'}
172 | cpu: [arm64]
173 | os: [linux]
174 |
175 | '@biomejs/cli-linux-arm64@2.2.0':
176 | resolution: {integrity: sha512-6eoRdF2yW5FnW9Lpeivh7Mayhq0KDdaDMYOJnH9aT02KuSIX5V1HmWJCQQPwIQbhDh68Zrcpl8inRlTEan0SXw==}
177 | engines: {node: '>=14.21.3'}
178 | cpu: [arm64]
179 | os: [linux]
180 |
181 | '@biomejs/cli-linux-x64-musl@2.2.0':
182 | resolution: {integrity: sha512-I5J85yWwUWpgJyC1CcytNSGusu2p9HjDnOPAFG4Y515hwRD0jpR9sT9/T1cKHtuCvEQ/sBvx+6zhz9l9wEJGAg==}
183 | engines: {node: '>=14.21.3'}
184 | cpu: [x64]
185 | os: [linux]
186 |
187 | '@biomejs/cli-linux-x64@2.2.0':
188 | resolution: {integrity: sha512-5UmQx/OZAfJfi25zAnAGHUMuOd+LOsliIt119x2soA2gLggQYrVPA+2kMUxR6Mw5M1deUF/AWWP2qpxgH7Nyfw==}
189 | engines: {node: '>=14.21.3'}
190 | cpu: [x64]
191 | os: [linux]
192 |
193 | '@biomejs/cli-win32-arm64@2.2.0':
194 | resolution: {integrity: sha512-n9a1/f2CwIDmNMNkFs+JI0ZjFnMO0jdOyGNtihgUNFnlmd84yIYY2KMTBmMV58ZlVHjgmY5Y6E1hVTnSRieggA==}
195 | engines: {node: '>=14.21.3'}
196 | cpu: [arm64]
197 | os: [win32]
198 |
199 | '@biomejs/cli-win32-x64@2.2.0':
200 | resolution: {integrity: sha512-Nawu5nHjP/zPKTIryh2AavzTc/KEg4um/MxWdXW0A6P/RZOyIpa7+QSjeXwAwX/utJGaCoXRPWtF3m5U/bB3Ww==}
201 | engines: {node: '>=14.21.3'}
202 | cpu: [x64]
203 | os: [win32]
204 |
205 | '@emnapi/runtime@1.5.0':
206 | resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==}
207 |
208 | '@floating-ui/core@1.7.3':
209 | resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==}
210 |
211 | '@floating-ui/dom@1.7.4':
212 | resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==}
213 |
214 | '@floating-ui/react-dom@2.1.6':
215 | resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==}
216 | peerDependencies:
217 | react: '>=16.8.0'
218 | react-dom: '>=16.8.0'
219 |
220 | '@floating-ui/utils@0.2.10':
221 | resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
222 |
223 | '@img/sharp-darwin-arm64@0.34.3':
224 | resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==}
225 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
226 | cpu: [arm64]
227 | os: [darwin]
228 |
229 | '@img/sharp-darwin-x64@0.34.3':
230 | resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==}
231 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
232 | cpu: [x64]
233 | os: [darwin]
234 |
235 | '@img/sharp-libvips-darwin-arm64@1.2.0':
236 | resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==}
237 | cpu: [arm64]
238 | os: [darwin]
239 |
240 | '@img/sharp-libvips-darwin-x64@1.2.0':
241 | resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==}
242 | cpu: [x64]
243 | os: [darwin]
244 |
245 | '@img/sharp-libvips-linux-arm64@1.2.0':
246 | resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==}
247 | cpu: [arm64]
248 | os: [linux]
249 |
250 | '@img/sharp-libvips-linux-arm@1.2.0':
251 | resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==}
252 | cpu: [arm]
253 | os: [linux]
254 |
255 | '@img/sharp-libvips-linux-ppc64@1.2.0':
256 | resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==}
257 | cpu: [ppc64]
258 | os: [linux]
259 |
260 | '@img/sharp-libvips-linux-s390x@1.2.0':
261 | resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==}
262 | cpu: [s390x]
263 | os: [linux]
264 |
265 | '@img/sharp-libvips-linux-x64@1.2.0':
266 | resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==}
267 | cpu: [x64]
268 | os: [linux]
269 |
270 | '@img/sharp-libvips-linuxmusl-arm64@1.2.0':
271 | resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==}
272 | cpu: [arm64]
273 | os: [linux]
274 |
275 | '@img/sharp-libvips-linuxmusl-x64@1.2.0':
276 | resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==}
277 | cpu: [x64]
278 | os: [linux]
279 |
280 | '@img/sharp-linux-arm64@0.34.3':
281 | resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==}
282 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
283 | cpu: [arm64]
284 | os: [linux]
285 |
286 | '@img/sharp-linux-arm@0.34.3':
287 | resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==}
288 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
289 | cpu: [arm]
290 | os: [linux]
291 |
292 | '@img/sharp-linux-ppc64@0.34.3':
293 | resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==}
294 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
295 | cpu: [ppc64]
296 | os: [linux]
297 |
298 | '@img/sharp-linux-s390x@0.34.3':
299 | resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==}
300 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
301 | cpu: [s390x]
302 | os: [linux]
303 |
304 | '@img/sharp-linux-x64@0.34.3':
305 | resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==}
306 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
307 | cpu: [x64]
308 | os: [linux]
309 |
310 | '@img/sharp-linuxmusl-arm64@0.34.3':
311 | resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==}
312 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
313 | cpu: [arm64]
314 | os: [linux]
315 |
316 | '@img/sharp-linuxmusl-x64@0.34.3':
317 | resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==}
318 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
319 | cpu: [x64]
320 | os: [linux]
321 |
322 | '@img/sharp-wasm32@0.34.3':
323 | resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==}
324 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
325 | cpu: [wasm32]
326 |
327 | '@img/sharp-win32-arm64@0.34.3':
328 | resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==}
329 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
330 | cpu: [arm64]
331 | os: [win32]
332 |
333 | '@img/sharp-win32-ia32@0.34.3':
334 | resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==}
335 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
336 | cpu: [ia32]
337 | os: [win32]
338 |
339 | '@img/sharp-win32-x64@0.34.3':
340 | resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==}
341 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
342 | cpu: [x64]
343 | os: [win32]
344 |
345 | '@isaacs/fs-minipass@4.0.1':
346 | resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
347 | engines: {node: '>=18.0.0'}
348 |
349 | '@jridgewell/gen-mapping@0.3.13':
350 | resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
351 |
352 | '@jridgewell/remapping@2.3.5':
353 | resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
354 |
355 | '@jridgewell/resolve-uri@3.1.2':
356 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
357 | engines: {node: '>=6.0.0'}
358 |
359 | '@jridgewell/sourcemap-codec@1.5.5':
360 | resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
361 |
362 | '@jridgewell/trace-mapping@0.3.30':
363 | resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==}
364 |
365 | '@next/env@15.5.2':
366 | resolution: {integrity: sha512-Qe06ew4zt12LeO6N7j8/nULSOe3fMXE4dM6xgpBQNvdzyK1sv5y4oAP3bq4LamrvGCZtmRYnW8URFCeX5nFgGg==}
367 |
368 | '@next/swc-darwin-arm64@15.5.2':
369 | resolution: {integrity: sha512-8bGt577BXGSd4iqFygmzIfTYizHb0LGWqH+qgIF/2EDxS5JsSdERJKA8WgwDyNBZgTIIA4D8qUtoQHmxIIquoQ==}
370 | engines: {node: '>= 10'}
371 | cpu: [arm64]
372 | os: [darwin]
373 |
374 | '@next/swc-darwin-x64@15.5.2':
375 | resolution: {integrity: sha512-2DjnmR6JHK4X+dgTXt5/sOCu/7yPtqpYt8s8hLkHFK3MGkka2snTv3yRMdHvuRtJVkPwCGsvBSwmoQCHatauFQ==}
376 | engines: {node: '>= 10'}
377 | cpu: [x64]
378 | os: [darwin]
379 |
380 | '@next/swc-linux-arm64-gnu@15.5.2':
381 | resolution: {integrity: sha512-3j7SWDBS2Wov/L9q0mFJtEvQ5miIqfO4l7d2m9Mo06ddsgUK8gWfHGgbjdFlCp2Ek7MmMQZSxpGFqcC8zGh2AA==}
382 | engines: {node: '>= 10'}
383 | cpu: [arm64]
384 | os: [linux]
385 |
386 | '@next/swc-linux-arm64-musl@15.5.2':
387 | resolution: {integrity: sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g==}
388 | engines: {node: '>= 10'}
389 | cpu: [arm64]
390 | os: [linux]
391 |
392 | '@next/swc-linux-x64-gnu@15.5.2':
393 | resolution: {integrity: sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q==}
394 | engines: {node: '>= 10'}
395 | cpu: [x64]
396 | os: [linux]
397 |
398 | '@next/swc-linux-x64-musl@15.5.2':
399 | resolution: {integrity: sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g==}
400 | engines: {node: '>= 10'}
401 | cpu: [x64]
402 | os: [linux]
403 |
404 | '@next/swc-win32-arm64-msvc@15.5.2':
405 | resolution: {integrity: sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg==}
406 | engines: {node: '>= 10'}
407 | cpu: [arm64]
408 | os: [win32]
409 |
410 | '@next/swc-win32-x64-msvc@15.5.2':
411 | resolution: {integrity: sha512-W5VvyZHnxG/2ukhZF/9Ikdra5fdNftxI6ybeVKYvBPDtyx7x4jPPSNduUkfH5fo3zG0JQ0bPxgy41af2JX5D4Q==}
412 | engines: {node: '>= 10'}
413 | cpu: [x64]
414 | os: [win32]
415 |
416 | '@radix-ui/primitive@1.1.3':
417 | resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==}
418 |
419 | '@radix-ui/react-arrow@1.1.7':
420 | resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==}
421 | peerDependencies:
422 | '@types/react': '*'
423 | '@types/react-dom': '*'
424 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
425 | react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
426 | peerDependenciesMeta:
427 | '@types/react':
428 | optional: true
429 | '@types/react-dom':
430 | optional: true
431 |
432 | '@radix-ui/react-collection@1.1.7':
433 | resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==}
434 | peerDependencies:
435 | '@types/react': '*'
436 | '@types/react-dom': '*'
437 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
438 | react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
439 | peerDependenciesMeta:
440 | '@types/react':
441 | optional: true
442 | '@types/react-dom':
443 | optional: true
444 |
445 | '@radix-ui/react-compose-refs@1.1.2':
446 | resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==}
447 | peerDependencies:
448 | '@types/react': '*'
449 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
450 | peerDependenciesMeta:
451 | '@types/react':
452 | optional: true
453 |
454 | '@radix-ui/react-context@1.1.2':
455 | resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==}
456 | peerDependencies:
457 | '@types/react': '*'
458 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
459 | peerDependenciesMeta:
460 | '@types/react':
461 | optional: true
462 |
463 | '@radix-ui/react-direction@1.1.1':
464 | resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==}
465 | peerDependencies:
466 | '@types/react': '*'
467 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
468 | peerDependenciesMeta:
469 | '@types/react':
470 | optional: true
471 |
472 | '@radix-ui/react-dismissable-layer@1.1.11':
473 | resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==}
474 | peerDependencies:
475 | '@types/react': '*'
476 | '@types/react-dom': '*'
477 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
478 | react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
479 | peerDependenciesMeta:
480 | '@types/react':
481 | optional: true
482 | '@types/react-dom':
483 | optional: true
484 |
485 | '@radix-ui/react-dropdown-menu@2.1.16':
486 | resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==}
487 | peerDependencies:
488 | '@types/react': '*'
489 | '@types/react-dom': '*'
490 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
491 | react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
492 | peerDependenciesMeta:
493 | '@types/react':
494 | optional: true
495 | '@types/react-dom':
496 | optional: true
497 |
498 | '@radix-ui/react-focus-guards@1.1.3':
499 | resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==}
500 | peerDependencies:
501 | '@types/react': '*'
502 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
503 | peerDependenciesMeta:
504 | '@types/react':
505 | optional: true
506 |
507 | '@radix-ui/react-focus-scope@1.1.7':
508 | resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==}
509 | peerDependencies:
510 | '@types/react': '*'
511 | '@types/react-dom': '*'
512 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
513 | react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
514 | peerDependenciesMeta:
515 | '@types/react':
516 | optional: true
517 | '@types/react-dom':
518 | optional: true
519 |
520 | '@radix-ui/react-id@1.1.1':
521 | resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==}
522 | peerDependencies:
523 | '@types/react': '*'
524 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
525 | peerDependenciesMeta:
526 | '@types/react':
527 | optional: true
528 |
529 | '@radix-ui/react-menu@2.1.16':
530 | resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==}
531 | peerDependencies:
532 | '@types/react': '*'
533 | '@types/react-dom': '*'
534 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
535 | react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
536 | peerDependenciesMeta:
537 | '@types/react':
538 | optional: true
539 | '@types/react-dom':
540 | optional: true
541 |
542 | '@radix-ui/react-popper@1.2.8':
543 | resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==}
544 | peerDependencies:
545 | '@types/react': '*'
546 | '@types/react-dom': '*'
547 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
548 | react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
549 | peerDependenciesMeta:
550 | '@types/react':
551 | optional: true
552 | '@types/react-dom':
553 | optional: true
554 |
555 | '@radix-ui/react-portal@1.1.9':
556 | resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==}
557 | peerDependencies:
558 | '@types/react': '*'
559 | '@types/react-dom': '*'
560 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
561 | react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
562 | peerDependenciesMeta:
563 | '@types/react':
564 | optional: true
565 | '@types/react-dom':
566 | optional: true
567 |
568 | '@radix-ui/react-presence@1.1.5':
569 | resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==}
570 | peerDependencies:
571 | '@types/react': '*'
572 | '@types/react-dom': '*'
573 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
574 | react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
575 | peerDependenciesMeta:
576 | '@types/react':
577 | optional: true
578 | '@types/react-dom':
579 | optional: true
580 |
581 | '@radix-ui/react-primitive@2.1.3':
582 | resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==}
583 | peerDependencies:
584 | '@types/react': '*'
585 | '@types/react-dom': '*'
586 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
587 | react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
588 | peerDependenciesMeta:
589 | '@types/react':
590 | optional: true
591 | '@types/react-dom':
592 | optional: true
593 |
594 | '@radix-ui/react-roving-focus@1.1.11':
595 | resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==}
596 | peerDependencies:
597 | '@types/react': '*'
598 | '@types/react-dom': '*'
599 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
600 | react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
601 | peerDependenciesMeta:
602 | '@types/react':
603 | optional: true
604 | '@types/react-dom':
605 | optional: true
606 |
607 | '@radix-ui/react-slot@1.2.3':
608 | resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==}
609 | peerDependencies:
610 | '@types/react': '*'
611 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
612 | peerDependenciesMeta:
613 | '@types/react':
614 | optional: true
615 |
616 | '@radix-ui/react-tabs@1.1.13':
617 | resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==}
618 | peerDependencies:
619 | '@types/react': '*'
620 | '@types/react-dom': '*'
621 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
622 | react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
623 | peerDependenciesMeta:
624 | '@types/react':
625 | optional: true
626 | '@types/react-dom':
627 | optional: true
628 |
629 | '@radix-ui/react-use-callback-ref@1.1.1':
630 | resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==}
631 | peerDependencies:
632 | '@types/react': '*'
633 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
634 | peerDependenciesMeta:
635 | '@types/react':
636 | optional: true
637 |
638 | '@radix-ui/react-use-controllable-state@1.2.2':
639 | resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==}
640 | peerDependencies:
641 | '@types/react': '*'
642 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
643 | peerDependenciesMeta:
644 | '@types/react':
645 | optional: true
646 |
647 | '@radix-ui/react-use-effect-event@0.0.2':
648 | resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==}
649 | peerDependencies:
650 | '@types/react': '*'
651 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
652 | peerDependenciesMeta:
653 | '@types/react':
654 | optional: true
655 |
656 | '@radix-ui/react-use-escape-keydown@1.1.1':
657 | resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==}
658 | peerDependencies:
659 | '@types/react': '*'
660 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
661 | peerDependenciesMeta:
662 | '@types/react':
663 | optional: true
664 |
665 | '@radix-ui/react-use-layout-effect@1.1.1':
666 | resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==}
667 | peerDependencies:
668 | '@types/react': '*'
669 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
670 | peerDependenciesMeta:
671 | '@types/react':
672 | optional: true
673 |
674 | '@radix-ui/react-use-rect@1.1.1':
675 | resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==}
676 | peerDependencies:
677 | '@types/react': '*'
678 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
679 | peerDependenciesMeta:
680 | '@types/react':
681 | optional: true
682 |
683 | '@radix-ui/react-use-size@1.1.1':
684 | resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==}
685 | peerDependencies:
686 | '@types/react': '*'
687 | react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
688 | peerDependenciesMeta:
689 | '@types/react':
690 | optional: true
691 |
692 | '@radix-ui/rect@1.1.1':
693 | resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==}
694 |
695 | '@shikijs/core@3.12.2':
696 | resolution: {integrity: sha512-L1Safnhra3tX/oJK5kYHaWmLEBJi1irASwewzY3taX5ibyXyMkkSDZlq01qigjryOBwrXSdFgTiZ3ryzSNeu7Q==}
697 |
698 | '@shikijs/engine-javascript@3.12.2':
699 | resolution: {integrity: sha512-Nm3/azSsaVS7hk6EwtHEnTythjQfwvrO5tKqMlaH9TwG1P+PNaR8M0EAKZ+GaH2DFwvcr4iSfTveyxMIvXEHMw==}
700 |
701 | '@shikijs/engine-oniguruma@3.12.2':
702 | resolution: {integrity: sha512-hozwnFHsLvujK4/CPVHNo3Bcg2EsnG8krI/ZQ2FlBlCRpPZW4XAEQmEwqegJsypsTAN9ehu2tEYe30lYKSZW/w==}
703 |
704 | '@shikijs/langs@3.12.2':
705 | resolution: {integrity: sha512-bVx5PfuZHDSHoBal+KzJZGheFuyH4qwwcwG/n+MsWno5cTlKmaNtTsGzJpHYQ8YPbB5BdEdKU1rga5/6JGY8ww==}
706 |
707 | '@shikijs/themes@3.12.2':
708 | resolution: {integrity: sha512-fTR3QAgnwYpfGczpIbzPjlRnxyONJOerguQv1iwpyQZ9QXX4qy/XFQqXlf17XTsorxnHoJGbH/LXBvwtqDsF5A==}
709 |
710 | '@shikijs/types@3.12.2':
711 | resolution: {integrity: sha512-K5UIBzxCyv0YoxN3LMrKB9zuhp1bV+LgewxuVwHdl4Gz5oePoUFrr9EfgJlGlDeXCU1b/yhdnXeuRvAnz8HN8Q==}
712 |
713 | '@shikijs/vscode-textmate@10.0.2':
714 | resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
715 |
716 | '@swc/helpers@0.5.15':
717 | resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
718 |
719 | '@tailwindcss/node@4.1.13':
720 | resolution: {integrity: sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==}
721 |
722 | '@tailwindcss/oxide-android-arm64@4.1.13':
723 | resolution: {integrity: sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==}
724 | engines: {node: '>= 10'}
725 | cpu: [arm64]
726 | os: [android]
727 |
728 | '@tailwindcss/oxide-darwin-arm64@4.1.13':
729 | resolution: {integrity: sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==}
730 | engines: {node: '>= 10'}
731 | cpu: [arm64]
732 | os: [darwin]
733 |
734 | '@tailwindcss/oxide-darwin-x64@4.1.13':
735 | resolution: {integrity: sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==}
736 | engines: {node: '>= 10'}
737 | cpu: [x64]
738 | os: [darwin]
739 |
740 | '@tailwindcss/oxide-freebsd-x64@4.1.13':
741 | resolution: {integrity: sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==}
742 | engines: {node: '>= 10'}
743 | cpu: [x64]
744 | os: [freebsd]
745 |
746 | '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.13':
747 | resolution: {integrity: sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==}
748 | engines: {node: '>= 10'}
749 | cpu: [arm]
750 | os: [linux]
751 |
752 | '@tailwindcss/oxide-linux-arm64-gnu@4.1.13':
753 | resolution: {integrity: sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==}
754 | engines: {node: '>= 10'}
755 | cpu: [arm64]
756 | os: [linux]
757 |
758 | '@tailwindcss/oxide-linux-arm64-musl@4.1.13':
759 | resolution: {integrity: sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==}
760 | engines: {node: '>= 10'}
761 | cpu: [arm64]
762 | os: [linux]
763 |
764 | '@tailwindcss/oxide-linux-x64-gnu@4.1.13':
765 | resolution: {integrity: sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==}
766 | engines: {node: '>= 10'}
767 | cpu: [x64]
768 | os: [linux]
769 |
770 | '@tailwindcss/oxide-linux-x64-musl@4.1.13':
771 | resolution: {integrity: sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==}
772 | engines: {node: '>= 10'}
773 | cpu: [x64]
774 | os: [linux]
775 |
776 | '@tailwindcss/oxide-wasm32-wasi@4.1.13':
777 | resolution: {integrity: sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==}
778 | engines: {node: '>=14.0.0'}
779 | cpu: [wasm32]
780 | bundledDependencies:
781 | - '@napi-rs/wasm-runtime'
782 | - '@emnapi/core'
783 | - '@emnapi/runtime'
784 | - '@tybys/wasm-util'
785 | - '@emnapi/wasi-threads'
786 | - tslib
787 |
788 | '@tailwindcss/oxide-win32-arm64-msvc@4.1.13':
789 | resolution: {integrity: sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==}
790 | engines: {node: '>= 10'}
791 | cpu: [arm64]
792 | os: [win32]
793 |
794 | '@tailwindcss/oxide-win32-x64-msvc@4.1.13':
795 | resolution: {integrity: sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==}
796 | engines: {node: '>= 10'}
797 | cpu: [x64]
798 | os: [win32]
799 |
800 | '@tailwindcss/oxide@4.1.13':
801 | resolution: {integrity: sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==}
802 | engines: {node: '>= 10'}
803 |
804 | '@tailwindcss/postcss@4.1.13':
805 | resolution: {integrity: sha512-HLgx6YSFKJT7rJqh9oJs/TkBFhxuMOfUKSBEPYwV+t78POOBsdQ7crhZLzwcH3T0UyUuOzU/GK5pk5eKr3wCiQ==}
806 |
807 | '@types/hast@2.3.10':
808 | resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==}
809 |
810 | '@types/hast@3.0.4':
811 | resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
812 |
813 | '@types/mdast@4.0.4':
814 | resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
815 |
816 | '@types/node@20.19.13':
817 | resolution: {integrity: sha512-yCAeZl7a0DxgNVteXFHt9+uyFbqXGy/ShC4BlcHkoE0AfGXYv/BUiplV72DjMYXHDBXFjhvr6DD1NiRVfB4j8g==}
818 |
819 | '@types/react-dom@19.1.9':
820 | resolution: {integrity: sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==}
821 | peerDependencies:
822 | '@types/react': ^19.0.0
823 |
824 | '@types/react-syntax-highlighter@15.5.13':
825 | resolution: {integrity: sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==}
826 |
827 | '@types/react@19.1.12':
828 | resolution: {integrity: sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==}
829 |
830 | '@types/unist@2.0.11':
831 | resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
832 |
833 | '@types/unist@3.0.3':
834 | resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
835 |
836 | '@ungap/structured-clone@1.3.0':
837 | resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
838 |
839 | aria-hidden@1.2.6:
840 | resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==}
841 | engines: {node: '>=10'}
842 |
843 | caniuse-lite@1.0.30001741:
844 | resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==}
845 |
846 | ccount@2.0.1:
847 | resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
848 |
849 | character-entities-html4@2.1.0:
850 | resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
851 |
852 | character-entities-legacy@1.1.4:
853 | resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==}
854 |
855 | character-entities-legacy@3.0.0:
856 | resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
857 |
858 | character-entities@1.2.4:
859 | resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==}
860 |
861 | character-reference-invalid@1.1.4:
862 | resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==}
863 |
864 | chownr@3.0.0:
865 | resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
866 | engines: {node: '>=18'}
867 |
868 | class-variance-authority@0.7.1:
869 | resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
870 |
871 | client-only@0.0.1:
872 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
873 |
874 | clsx@2.1.1:
875 | resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
876 | engines: {node: '>=6'}
877 |
878 | color-convert@2.0.1:
879 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
880 | engines: {node: '>=7.0.0'}
881 |
882 | color-name@1.1.4:
883 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
884 |
885 | color-string@1.9.1:
886 | resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
887 |
888 | color@4.2.3:
889 | resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
890 | engines: {node: '>=12.5.0'}
891 |
892 | comma-separated-tokens@1.0.8:
893 | resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==}
894 |
895 | comma-separated-tokens@2.0.3:
896 | resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
897 |
898 | csstype@3.1.3:
899 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
900 |
901 | dequal@2.0.3:
902 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
903 | engines: {node: '>=6'}
904 |
905 | detect-libc@2.0.4:
906 | resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==}
907 | engines: {node: '>=8'}
908 |
909 | detect-node-es@1.1.0:
910 | resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
911 |
912 | devlop@1.1.0:
913 | resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
914 |
915 | enhanced-resolve@5.18.3:
916 | resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==}
917 | engines: {node: '>=10.13.0'}
918 |
919 | fault@1.0.4:
920 | resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==}
921 |
922 | format@0.2.2:
923 | resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==}
924 | engines: {node: '>=0.4.x'}
925 |
926 | framer-motion@12.23.12:
927 | resolution: {integrity: sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg==}
928 | peerDependencies:
929 | '@emotion/is-prop-valid': '*'
930 | react: ^18.0.0 || ^19.0.0
931 | react-dom: ^18.0.0 || ^19.0.0
932 | peerDependenciesMeta:
933 | '@emotion/is-prop-valid':
934 | optional: true
935 | react:
936 | optional: true
937 | react-dom:
938 | optional: true
939 |
940 | get-nonce@1.0.1:
941 | resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
942 | engines: {node: '>=6'}
943 |
944 | graceful-fs@4.2.11:
945 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
946 |
947 | hast-util-parse-selector@2.2.5:
948 | resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==}
949 |
950 | hast-util-to-html@9.0.5:
951 | resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==}
952 |
953 | hast-util-whitespace@3.0.0:
954 | resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
955 |
956 | hastscript@6.0.0:
957 | resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==}
958 |
959 | highlight.js@10.7.3:
960 | resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==}
961 |
962 | highlightjs-vue@1.0.0:
963 | resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==}
964 |
965 | html-void-elements@3.0.0:
966 | resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
967 |
968 | is-alphabetical@1.0.4:
969 | resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==}
970 |
971 | is-alphanumerical@1.0.4:
972 | resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==}
973 |
974 | is-arrayish@0.3.2:
975 | resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
976 |
977 | is-decimal@1.0.4:
978 | resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==}
979 |
980 | is-hexadecimal@1.0.4:
981 | resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==}
982 |
983 | jiti@2.5.1:
984 | resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==}
985 | hasBin: true
986 |
987 | lightningcss-darwin-arm64@1.30.1:
988 | resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==}
989 | engines: {node: '>= 12.0.0'}
990 | cpu: [arm64]
991 | os: [darwin]
992 |
993 | lightningcss-darwin-x64@1.30.1:
994 | resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==}
995 | engines: {node: '>= 12.0.0'}
996 | cpu: [x64]
997 | os: [darwin]
998 |
999 | lightningcss-freebsd-x64@1.30.1:
1000 | resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==}
1001 | engines: {node: '>= 12.0.0'}
1002 | cpu: [x64]
1003 | os: [freebsd]
1004 |
1005 | lightningcss-linux-arm-gnueabihf@1.30.1:
1006 | resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==}
1007 | engines: {node: '>= 12.0.0'}
1008 | cpu: [arm]
1009 | os: [linux]
1010 |
1011 | lightningcss-linux-arm64-gnu@1.30.1:
1012 | resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==}
1013 | engines: {node: '>= 12.0.0'}
1014 | cpu: [arm64]
1015 | os: [linux]
1016 |
1017 | lightningcss-linux-arm64-musl@1.30.1:
1018 | resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==}
1019 | engines: {node: '>= 12.0.0'}
1020 | cpu: [arm64]
1021 | os: [linux]
1022 |
1023 | lightningcss-linux-x64-gnu@1.30.1:
1024 | resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==}
1025 | engines: {node: '>= 12.0.0'}
1026 | cpu: [x64]
1027 | os: [linux]
1028 |
1029 | lightningcss-linux-x64-musl@1.30.1:
1030 | resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==}
1031 | engines: {node: '>= 12.0.0'}
1032 | cpu: [x64]
1033 | os: [linux]
1034 |
1035 | lightningcss-win32-arm64-msvc@1.30.1:
1036 | resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==}
1037 | engines: {node: '>= 12.0.0'}
1038 | cpu: [arm64]
1039 | os: [win32]
1040 |
1041 | lightningcss-win32-x64-msvc@1.30.1:
1042 | resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==}
1043 | engines: {node: '>= 12.0.0'}
1044 | cpu: [x64]
1045 | os: [win32]
1046 |
1047 | lightningcss@1.30.1:
1048 | resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==}
1049 | engines: {node: '>= 12.0.0'}
1050 |
1051 | lowlight@1.20.0:
1052 | resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==}
1053 |
1054 | lucide-react@0.542.0:
1055 | resolution: {integrity: sha512-w3hD8/SQB7+lzU2r4VdFyzzOzKnUjTZIF/MQJGSSvni7Llewni4vuViRppfRAa2guOsY5k4jZyxw/i9DQHv+dw==}
1056 | peerDependencies:
1057 | react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
1058 |
1059 | magic-string@0.30.18:
1060 | resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==}
1061 |
1062 | mdast-util-to-hast@13.2.0:
1063 | resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==}
1064 |
1065 | micromark-util-character@2.1.1:
1066 | resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
1067 |
1068 | micromark-util-encode@2.0.1:
1069 | resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
1070 |
1071 | micromark-util-sanitize-uri@2.0.1:
1072 | resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
1073 |
1074 | micromark-util-symbol@2.0.1:
1075 | resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
1076 |
1077 | micromark-util-types@2.0.2:
1078 | resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
1079 |
1080 | minipass@7.1.2:
1081 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
1082 | engines: {node: '>=16 || 14 >=14.17'}
1083 |
1084 | minizlib@3.0.2:
1085 | resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==}
1086 | engines: {node: '>= 18'}
1087 |
1088 | mkdirp@3.0.1:
1089 | resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==}
1090 | engines: {node: '>=10'}
1091 | hasBin: true
1092 |
1093 | motion-dom@12.23.12:
1094 | resolution: {integrity: sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==}
1095 |
1096 | motion-utils@12.23.6:
1097 | resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==}
1098 |
1099 | nanoid@3.3.11:
1100 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
1101 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
1102 | hasBin: true
1103 |
1104 | next-themes@0.4.6:
1105 | resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==}
1106 | peerDependencies:
1107 | react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
1108 | react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
1109 |
1110 | next@15.5.2:
1111 | resolution: {integrity: sha512-H8Otr7abj1glFhbGnvUt3gz++0AF1+QoCXEBmd/6aKbfdFwrn0LpA836Ed5+00va/7HQSDD+mOoVhn3tNy3e/Q==}
1112 | engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
1113 | hasBin: true
1114 | peerDependencies:
1115 | '@opentelemetry/api': ^1.1.0
1116 | '@playwright/test': ^1.51.1
1117 | babel-plugin-react-compiler: '*'
1118 | react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
1119 | react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
1120 | sass: ^1.3.0
1121 | peerDependenciesMeta:
1122 | '@opentelemetry/api':
1123 | optional: true
1124 | '@playwright/test':
1125 | optional: true
1126 | babel-plugin-react-compiler:
1127 | optional: true
1128 | sass:
1129 | optional: true
1130 |
1131 | oniguruma-parser@0.12.1:
1132 | resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==}
1133 |
1134 | oniguruma-to-es@4.3.3:
1135 | resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==}
1136 |
1137 | parse-entities@2.0.0:
1138 | resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==}
1139 |
1140 | picocolors@1.1.1:
1141 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
1142 |
1143 | postcss@8.4.31:
1144 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
1145 | engines: {node: ^10 || ^12 || >=14}
1146 |
1147 | postcss@8.5.6:
1148 | resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
1149 | engines: {node: ^10 || ^12 || >=14}
1150 |
1151 | prismjs@1.27.0:
1152 | resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==}
1153 | engines: {node: '>=6'}
1154 |
1155 | prismjs@1.30.0:
1156 | resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
1157 | engines: {node: '>=6'}
1158 |
1159 | property-information@5.6.0:
1160 | resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==}
1161 |
1162 | property-information@7.1.0:
1163 | resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
1164 |
1165 | react-dom@19.1.0:
1166 | resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==}
1167 | peerDependencies:
1168 | react: ^19.1.0
1169 |
1170 | react-remove-scroll-bar@2.3.8:
1171 | resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
1172 | engines: {node: '>=10'}
1173 | peerDependencies:
1174 | '@types/react': '*'
1175 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
1176 | peerDependenciesMeta:
1177 | '@types/react':
1178 | optional: true
1179 |
1180 | react-remove-scroll@2.7.1:
1181 | resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==}
1182 | engines: {node: '>=10'}
1183 | peerDependencies:
1184 | '@types/react': '*'
1185 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
1186 | peerDependenciesMeta:
1187 | '@types/react':
1188 | optional: true
1189 |
1190 | react-style-singleton@2.2.3:
1191 | resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
1192 | engines: {node: '>=10'}
1193 | peerDependencies:
1194 | '@types/react': '*'
1195 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
1196 | peerDependenciesMeta:
1197 | '@types/react':
1198 | optional: true
1199 |
1200 | react-syntax-highlighter@15.6.6:
1201 | resolution: {integrity: sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==}
1202 | peerDependencies:
1203 | react: '>= 0.14.0'
1204 |
1205 | react@19.1.0:
1206 | resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==}
1207 | engines: {node: '>=0.10.0'}
1208 |
1209 | refractor@3.6.0:
1210 | resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==}
1211 |
1212 | regex-recursion@6.0.2:
1213 | resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==}
1214 |
1215 | regex-utilities@2.3.0:
1216 | resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==}
1217 |
1218 | regex@6.0.1:
1219 | resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==}
1220 |
1221 | scheduler@0.26.0:
1222 | resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==}
1223 |
1224 | semver@7.7.2:
1225 | resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
1226 | engines: {node: '>=10'}
1227 | hasBin: true
1228 |
1229 | sharp@0.34.3:
1230 | resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==}
1231 | engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
1232 |
1233 | shiki@3.12.2:
1234 | resolution: {integrity: sha512-uIrKI+f9IPz1zDT+GMz+0RjzKJiijVr6WDWm9Pe3NNY6QigKCfifCEv9v9R2mDASKKjzjQ2QpFLcxaR3iHSnMA==}
1235 |
1236 | simple-swizzle@0.2.2:
1237 | resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
1238 |
1239 | source-map-js@1.2.1:
1240 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
1241 | engines: {node: '>=0.10.0'}
1242 |
1243 | space-separated-tokens@1.1.5:
1244 | resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==}
1245 |
1246 | space-separated-tokens@2.0.2:
1247 | resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
1248 |
1249 | stringify-entities@4.0.4:
1250 | resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
1251 |
1252 | styled-jsx@5.1.6:
1253 | resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
1254 | engines: {node: '>= 12.0.0'}
1255 | peerDependencies:
1256 | '@babel/core': '*'
1257 | babel-plugin-macros: '*'
1258 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
1259 | peerDependenciesMeta:
1260 | '@babel/core':
1261 | optional: true
1262 | babel-plugin-macros:
1263 | optional: true
1264 |
1265 | tailwind-merge@3.3.1:
1266 | resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==}
1267 |
1268 | tailwindcss@4.1.13:
1269 | resolution: {integrity: sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==}
1270 |
1271 | tapable@2.2.3:
1272 | resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==}
1273 | engines: {node: '>=6'}
1274 |
1275 | tar@7.4.3:
1276 | resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==}
1277 | engines: {node: '>=18'}
1278 |
1279 | trim-lines@3.0.1:
1280 | resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
1281 |
1282 | tslib@2.8.1:
1283 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
1284 |
1285 | tw-animate-css@1.3.8:
1286 | resolution: {integrity: sha512-Qrk3PZ7l7wUcGYhwZloqfkWCmaXZAoqjkdbIDvzfGshwGtexa/DAs9koXxIkrpEasyevandomzCBAV1Yyop5rw==}
1287 |
1288 | typescript@5.9.2:
1289 | resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==}
1290 | engines: {node: '>=14.17'}
1291 | hasBin: true
1292 |
1293 | undici-types@6.21.0:
1294 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
1295 |
1296 | unist-util-is@6.0.0:
1297 | resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
1298 |
1299 | unist-util-position@5.0.0:
1300 | resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
1301 |
1302 | unist-util-stringify-position@4.0.0:
1303 | resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
1304 |
1305 | unist-util-visit-parents@6.0.1:
1306 | resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==}
1307 |
1308 | unist-util-visit@5.0.0:
1309 | resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
1310 |
1311 | use-callback-ref@1.3.3:
1312 | resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
1313 | engines: {node: '>=10'}
1314 | peerDependencies:
1315 | '@types/react': '*'
1316 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
1317 | peerDependenciesMeta:
1318 | '@types/react':
1319 | optional: true
1320 |
1321 | use-sidecar@1.1.3:
1322 | resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==}
1323 | engines: {node: '>=10'}
1324 | peerDependencies:
1325 | '@types/react': '*'
1326 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
1327 | peerDependenciesMeta:
1328 | '@types/react':
1329 | optional: true
1330 |
1331 | vfile-message@4.0.3:
1332 | resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
1333 |
1334 | vfile@6.0.3:
1335 | resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
1336 |
1337 | xtend@4.0.2:
1338 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
1339 | engines: {node: '>=0.4'}
1340 |
1341 | yallist@5.0.0:
1342 | resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
1343 | engines: {node: '>=18'}
1344 |
1345 | zwitch@2.0.4:
1346 | resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
1347 |
1348 | snapshots:
1349 |
1350 | '@alloc/quick-lru@5.2.0': {}
1351 |
1352 | '@babel/runtime@7.28.4': {}
1353 |
1354 | '@biomejs/biome@2.2.0':
1355 | optionalDependencies:
1356 | '@biomejs/cli-darwin-arm64': 2.2.0
1357 | '@biomejs/cli-darwin-x64': 2.2.0
1358 | '@biomejs/cli-linux-arm64': 2.2.0
1359 | '@biomejs/cli-linux-arm64-musl': 2.2.0
1360 | '@biomejs/cli-linux-x64': 2.2.0
1361 | '@biomejs/cli-linux-x64-musl': 2.2.0
1362 | '@biomejs/cli-win32-arm64': 2.2.0
1363 | '@biomejs/cli-win32-x64': 2.2.0
1364 |
1365 | '@biomejs/cli-darwin-arm64@2.2.0':
1366 | optional: true
1367 |
1368 | '@biomejs/cli-darwin-x64@2.2.0':
1369 | optional: true
1370 |
1371 | '@biomejs/cli-linux-arm64-musl@2.2.0':
1372 | optional: true
1373 |
1374 | '@biomejs/cli-linux-arm64@2.2.0':
1375 | optional: true
1376 |
1377 | '@biomejs/cli-linux-x64-musl@2.2.0':
1378 | optional: true
1379 |
1380 | '@biomejs/cli-linux-x64@2.2.0':
1381 | optional: true
1382 |
1383 | '@biomejs/cli-win32-arm64@2.2.0':
1384 | optional: true
1385 |
1386 | '@biomejs/cli-win32-x64@2.2.0':
1387 | optional: true
1388 |
1389 | '@emnapi/runtime@1.5.0':
1390 | dependencies:
1391 | tslib: 2.8.1
1392 | optional: true
1393 |
1394 | '@floating-ui/core@1.7.3':
1395 | dependencies:
1396 | '@floating-ui/utils': 0.2.10
1397 |
1398 | '@floating-ui/dom@1.7.4':
1399 | dependencies:
1400 | '@floating-ui/core': 1.7.3
1401 | '@floating-ui/utils': 0.2.10
1402 |
1403 | '@floating-ui/react-dom@2.1.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
1404 | dependencies:
1405 | '@floating-ui/dom': 1.7.4
1406 | react: 19.1.0
1407 | react-dom: 19.1.0(react@19.1.0)
1408 |
1409 | '@floating-ui/utils@0.2.10': {}
1410 |
1411 | '@img/sharp-darwin-arm64@0.34.3':
1412 | optionalDependencies:
1413 | '@img/sharp-libvips-darwin-arm64': 1.2.0
1414 | optional: true
1415 |
1416 | '@img/sharp-darwin-x64@0.34.3':
1417 | optionalDependencies:
1418 | '@img/sharp-libvips-darwin-x64': 1.2.0
1419 | optional: true
1420 |
1421 | '@img/sharp-libvips-darwin-arm64@1.2.0':
1422 | optional: true
1423 |
1424 | '@img/sharp-libvips-darwin-x64@1.2.0':
1425 | optional: true
1426 |
1427 | '@img/sharp-libvips-linux-arm64@1.2.0':
1428 | optional: true
1429 |
1430 | '@img/sharp-libvips-linux-arm@1.2.0':
1431 | optional: true
1432 |
1433 | '@img/sharp-libvips-linux-ppc64@1.2.0':
1434 | optional: true
1435 |
1436 | '@img/sharp-libvips-linux-s390x@1.2.0':
1437 | optional: true
1438 |
1439 | '@img/sharp-libvips-linux-x64@1.2.0':
1440 | optional: true
1441 |
1442 | '@img/sharp-libvips-linuxmusl-arm64@1.2.0':
1443 | optional: true
1444 |
1445 | '@img/sharp-libvips-linuxmusl-x64@1.2.0':
1446 | optional: true
1447 |
1448 | '@img/sharp-linux-arm64@0.34.3':
1449 | optionalDependencies:
1450 | '@img/sharp-libvips-linux-arm64': 1.2.0
1451 | optional: true
1452 |
1453 | '@img/sharp-linux-arm@0.34.3':
1454 | optionalDependencies:
1455 | '@img/sharp-libvips-linux-arm': 1.2.0
1456 | optional: true
1457 |
1458 | '@img/sharp-linux-ppc64@0.34.3':
1459 | optionalDependencies:
1460 | '@img/sharp-libvips-linux-ppc64': 1.2.0
1461 | optional: true
1462 |
1463 | '@img/sharp-linux-s390x@0.34.3':
1464 | optionalDependencies:
1465 | '@img/sharp-libvips-linux-s390x': 1.2.0
1466 | optional: true
1467 |
1468 | '@img/sharp-linux-x64@0.34.3':
1469 | optionalDependencies:
1470 | '@img/sharp-libvips-linux-x64': 1.2.0
1471 | optional: true
1472 |
1473 | '@img/sharp-linuxmusl-arm64@0.34.3':
1474 | optionalDependencies:
1475 | '@img/sharp-libvips-linuxmusl-arm64': 1.2.0
1476 | optional: true
1477 |
1478 | '@img/sharp-linuxmusl-x64@0.34.3':
1479 | optionalDependencies:
1480 | '@img/sharp-libvips-linuxmusl-x64': 1.2.0
1481 | optional: true
1482 |
1483 | '@img/sharp-wasm32@0.34.3':
1484 | dependencies:
1485 | '@emnapi/runtime': 1.5.0
1486 | optional: true
1487 |
1488 | '@img/sharp-win32-arm64@0.34.3':
1489 | optional: true
1490 |
1491 | '@img/sharp-win32-ia32@0.34.3':
1492 | optional: true
1493 |
1494 | '@img/sharp-win32-x64@0.34.3':
1495 | optional: true
1496 |
1497 | '@isaacs/fs-minipass@4.0.1':
1498 | dependencies:
1499 | minipass: 7.1.2
1500 |
1501 | '@jridgewell/gen-mapping@0.3.13':
1502 | dependencies:
1503 | '@jridgewell/sourcemap-codec': 1.5.5
1504 | '@jridgewell/trace-mapping': 0.3.30
1505 |
1506 | '@jridgewell/remapping@2.3.5':
1507 | dependencies:
1508 | '@jridgewell/gen-mapping': 0.3.13
1509 | '@jridgewell/trace-mapping': 0.3.30
1510 |
1511 | '@jridgewell/resolve-uri@3.1.2': {}
1512 |
1513 | '@jridgewell/sourcemap-codec@1.5.5': {}
1514 |
1515 | '@jridgewell/trace-mapping@0.3.30':
1516 | dependencies:
1517 | '@jridgewell/resolve-uri': 3.1.2
1518 | '@jridgewell/sourcemap-codec': 1.5.5
1519 |
1520 | '@next/env@15.5.2': {}
1521 |
1522 | '@next/swc-darwin-arm64@15.5.2':
1523 | optional: true
1524 |
1525 | '@next/swc-darwin-x64@15.5.2':
1526 | optional: true
1527 |
1528 | '@next/swc-linux-arm64-gnu@15.5.2':
1529 | optional: true
1530 |
1531 | '@next/swc-linux-arm64-musl@15.5.2':
1532 | optional: true
1533 |
1534 | '@next/swc-linux-x64-gnu@15.5.2':
1535 | optional: true
1536 |
1537 | '@next/swc-linux-x64-musl@15.5.2':
1538 | optional: true
1539 |
1540 | '@next/swc-win32-arm64-msvc@15.5.2':
1541 | optional: true
1542 |
1543 | '@next/swc-win32-x64-msvc@15.5.2':
1544 | optional: true
1545 |
1546 | '@radix-ui/primitive@1.1.3': {}
1547 |
1548 | '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
1549 | dependencies:
1550 | '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1551 | react: 19.1.0
1552 | react-dom: 19.1.0(react@19.1.0)
1553 | optionalDependencies:
1554 | '@types/react': 19.1.12
1555 | '@types/react-dom': 19.1.9(@types/react@19.1.12)
1556 |
1557 | '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
1558 | dependencies:
1559 | '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.0)
1560 | '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.0)
1561 | '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1562 | '@radix-ui/react-slot': 1.2.3(@types/react@19.1.12)(react@19.1.0)
1563 | react: 19.1.0
1564 | react-dom: 19.1.0(react@19.1.0)
1565 | optionalDependencies:
1566 | '@types/react': 19.1.12
1567 | '@types/react-dom': 19.1.9(@types/react@19.1.12)
1568 |
1569 | '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.12)(react@19.1.0)':
1570 | dependencies:
1571 | react: 19.1.0
1572 | optionalDependencies:
1573 | '@types/react': 19.1.12
1574 |
1575 | '@radix-ui/react-context@1.1.2(@types/react@19.1.12)(react@19.1.0)':
1576 | dependencies:
1577 | react: 19.1.0
1578 | optionalDependencies:
1579 | '@types/react': 19.1.12
1580 |
1581 | '@radix-ui/react-direction@1.1.1(@types/react@19.1.12)(react@19.1.0)':
1582 | dependencies:
1583 | react: 19.1.0
1584 | optionalDependencies:
1585 | '@types/react': 19.1.12
1586 |
1587 | '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
1588 | dependencies:
1589 | '@radix-ui/primitive': 1.1.3
1590 | '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.0)
1591 | '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1592 | '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1593 | '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1594 | react: 19.1.0
1595 | react-dom: 19.1.0(react@19.1.0)
1596 | optionalDependencies:
1597 | '@types/react': 19.1.12
1598 | '@types/react-dom': 19.1.9(@types/react@19.1.12)
1599 |
1600 | '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
1601 | dependencies:
1602 | '@radix-ui/primitive': 1.1.3
1603 | '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.0)
1604 | '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.0)
1605 | '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1606 | '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1607 | '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1608 | '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.0)
1609 | react: 19.1.0
1610 | react-dom: 19.1.0(react@19.1.0)
1611 | optionalDependencies:
1612 | '@types/react': 19.1.12
1613 | '@types/react-dom': 19.1.9(@types/react@19.1.12)
1614 |
1615 | '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.12)(react@19.1.0)':
1616 | dependencies:
1617 | react: 19.1.0
1618 | optionalDependencies:
1619 | '@types/react': 19.1.12
1620 |
1621 | '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
1622 | dependencies:
1623 | '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.0)
1624 | '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1625 | '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1626 | react: 19.1.0
1627 | react-dom: 19.1.0(react@19.1.0)
1628 | optionalDependencies:
1629 | '@types/react': 19.1.12
1630 | '@types/react-dom': 19.1.9(@types/react@19.1.12)
1631 |
1632 | '@radix-ui/react-id@1.1.1(@types/react@19.1.12)(react@19.1.0)':
1633 | dependencies:
1634 | '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1635 | react: 19.1.0
1636 | optionalDependencies:
1637 | '@types/react': 19.1.12
1638 |
1639 | '@radix-ui/react-menu@2.1.16(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
1640 | dependencies:
1641 | '@radix-ui/primitive': 1.1.3
1642 | '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1643 | '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.0)
1644 | '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.0)
1645 | '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1646 | '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1647 | '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.12)(react@19.1.0)
1648 | '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1649 | '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1650 | '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1651 | '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1652 | '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1653 | '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1654 | '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1655 | '@radix-ui/react-slot': 1.2.3(@types/react@19.1.12)(react@19.1.0)
1656 | '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1657 | aria-hidden: 1.2.6
1658 | react: 19.1.0
1659 | react-dom: 19.1.0(react@19.1.0)
1660 | react-remove-scroll: 2.7.1(@types/react@19.1.12)(react@19.1.0)
1661 | optionalDependencies:
1662 | '@types/react': 19.1.12
1663 | '@types/react-dom': 19.1.9(@types/react@19.1.12)
1664 |
1665 | '@radix-ui/react-popper@1.2.8(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
1666 | dependencies:
1667 | '@floating-ui/react-dom': 2.1.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1668 | '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1669 | '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.0)
1670 | '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.0)
1671 | '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1672 | '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1673 | '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1674 | '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1675 | '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1676 | '@radix-ui/rect': 1.1.1
1677 | react: 19.1.0
1678 | react-dom: 19.1.0(react@19.1.0)
1679 | optionalDependencies:
1680 | '@types/react': 19.1.12
1681 | '@types/react-dom': 19.1.9(@types/react@19.1.12)
1682 |
1683 | '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
1684 | dependencies:
1685 | '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1686 | '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1687 | react: 19.1.0
1688 | react-dom: 19.1.0(react@19.1.0)
1689 | optionalDependencies:
1690 | '@types/react': 19.1.12
1691 | '@types/react-dom': 19.1.9(@types/react@19.1.12)
1692 |
1693 | '@radix-ui/react-presence@1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
1694 | dependencies:
1695 | '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.0)
1696 | '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1697 | react: 19.1.0
1698 | react-dom: 19.1.0(react@19.1.0)
1699 | optionalDependencies:
1700 | '@types/react': 19.1.12
1701 | '@types/react-dom': 19.1.9(@types/react@19.1.12)
1702 |
1703 | '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
1704 | dependencies:
1705 | '@radix-ui/react-slot': 1.2.3(@types/react@19.1.12)(react@19.1.0)
1706 | react: 19.1.0
1707 | react-dom: 19.1.0(react@19.1.0)
1708 | optionalDependencies:
1709 | '@types/react': 19.1.12
1710 | '@types/react-dom': 19.1.9(@types/react@19.1.12)
1711 |
1712 | '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
1713 | dependencies:
1714 | '@radix-ui/primitive': 1.1.3
1715 | '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1716 | '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.0)
1717 | '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.0)
1718 | '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1719 | '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1720 | '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1721 | '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1722 | '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.0)
1723 | react: 19.1.0
1724 | react-dom: 19.1.0(react@19.1.0)
1725 | optionalDependencies:
1726 | '@types/react': 19.1.12
1727 | '@types/react-dom': 19.1.9(@types/react@19.1.12)
1728 |
1729 | '@radix-ui/react-slot@1.2.3(@types/react@19.1.12)(react@19.1.0)':
1730 | dependencies:
1731 | '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.12)(react@19.1.0)
1732 | react: 19.1.0
1733 | optionalDependencies:
1734 | '@types/react': 19.1.12
1735 |
1736 | '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
1737 | dependencies:
1738 | '@radix-ui/primitive': 1.1.3
1739 | '@radix-ui/react-context': 1.1.2(@types/react@19.1.12)(react@19.1.0)
1740 | '@radix-ui/react-direction': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1741 | '@radix-ui/react-id': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1742 | '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1743 | '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1744 | '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
1745 | '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.12)(react@19.1.0)
1746 | react: 19.1.0
1747 | react-dom: 19.1.0(react@19.1.0)
1748 | optionalDependencies:
1749 | '@types/react': 19.1.12
1750 | '@types/react-dom': 19.1.9(@types/react@19.1.12)
1751 |
1752 | '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.12)(react@19.1.0)':
1753 | dependencies:
1754 | react: 19.1.0
1755 | optionalDependencies:
1756 | '@types/react': 19.1.12
1757 |
1758 | '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.12)(react@19.1.0)':
1759 | dependencies:
1760 | '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.12)(react@19.1.0)
1761 | '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1762 | react: 19.1.0
1763 | optionalDependencies:
1764 | '@types/react': 19.1.12
1765 |
1766 | '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.12)(react@19.1.0)':
1767 | dependencies:
1768 | '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1769 | react: 19.1.0
1770 | optionalDependencies:
1771 | '@types/react': 19.1.12
1772 |
1773 | '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.12)(react@19.1.0)':
1774 | dependencies:
1775 | '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1776 | react: 19.1.0
1777 | optionalDependencies:
1778 | '@types/react': 19.1.12
1779 |
1780 | '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.12)(react@19.1.0)':
1781 | dependencies:
1782 | react: 19.1.0
1783 | optionalDependencies:
1784 | '@types/react': 19.1.12
1785 |
1786 | '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.12)(react@19.1.0)':
1787 | dependencies:
1788 | '@radix-ui/rect': 1.1.1
1789 | react: 19.1.0
1790 | optionalDependencies:
1791 | '@types/react': 19.1.12
1792 |
1793 | '@radix-ui/react-use-size@1.1.1(@types/react@19.1.12)(react@19.1.0)':
1794 | dependencies:
1795 | '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.12)(react@19.1.0)
1796 | react: 19.1.0
1797 | optionalDependencies:
1798 | '@types/react': 19.1.12
1799 |
1800 | '@radix-ui/rect@1.1.1': {}
1801 |
1802 | '@shikijs/core@3.12.2':
1803 | dependencies:
1804 | '@shikijs/types': 3.12.2
1805 | '@shikijs/vscode-textmate': 10.0.2
1806 | '@types/hast': 3.0.4
1807 | hast-util-to-html: 9.0.5
1808 |
1809 | '@shikijs/engine-javascript@3.12.2':
1810 | dependencies:
1811 | '@shikijs/types': 3.12.2
1812 | '@shikijs/vscode-textmate': 10.0.2
1813 | oniguruma-to-es: 4.3.3
1814 |
1815 | '@shikijs/engine-oniguruma@3.12.2':
1816 | dependencies:
1817 | '@shikijs/types': 3.12.2
1818 | '@shikijs/vscode-textmate': 10.0.2
1819 |
1820 | '@shikijs/langs@3.12.2':
1821 | dependencies:
1822 | '@shikijs/types': 3.12.2
1823 |
1824 | '@shikijs/themes@3.12.2':
1825 | dependencies:
1826 | '@shikijs/types': 3.12.2
1827 |
1828 | '@shikijs/types@3.12.2':
1829 | dependencies:
1830 | '@shikijs/vscode-textmate': 10.0.2
1831 | '@types/hast': 3.0.4
1832 |
1833 | '@shikijs/vscode-textmate@10.0.2': {}
1834 |
1835 | '@swc/helpers@0.5.15':
1836 | dependencies:
1837 | tslib: 2.8.1
1838 |
1839 | '@tailwindcss/node@4.1.13':
1840 | dependencies:
1841 | '@jridgewell/remapping': 2.3.5
1842 | enhanced-resolve: 5.18.3
1843 | jiti: 2.5.1
1844 | lightningcss: 1.30.1
1845 | magic-string: 0.30.18
1846 | source-map-js: 1.2.1
1847 | tailwindcss: 4.1.13
1848 |
1849 | '@tailwindcss/oxide-android-arm64@4.1.13':
1850 | optional: true
1851 |
1852 | '@tailwindcss/oxide-darwin-arm64@4.1.13':
1853 | optional: true
1854 |
1855 | '@tailwindcss/oxide-darwin-x64@4.1.13':
1856 | optional: true
1857 |
1858 | '@tailwindcss/oxide-freebsd-x64@4.1.13':
1859 | optional: true
1860 |
1861 | '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.13':
1862 | optional: true
1863 |
1864 | '@tailwindcss/oxide-linux-arm64-gnu@4.1.13':
1865 | optional: true
1866 |
1867 | '@tailwindcss/oxide-linux-arm64-musl@4.1.13':
1868 | optional: true
1869 |
1870 | '@tailwindcss/oxide-linux-x64-gnu@4.1.13':
1871 | optional: true
1872 |
1873 | '@tailwindcss/oxide-linux-x64-musl@4.1.13':
1874 | optional: true
1875 |
1876 | '@tailwindcss/oxide-wasm32-wasi@4.1.13':
1877 | optional: true
1878 |
1879 | '@tailwindcss/oxide-win32-arm64-msvc@4.1.13':
1880 | optional: true
1881 |
1882 | '@tailwindcss/oxide-win32-x64-msvc@4.1.13':
1883 | optional: true
1884 |
1885 | '@tailwindcss/oxide@4.1.13':
1886 | dependencies:
1887 | detect-libc: 2.0.4
1888 | tar: 7.4.3
1889 | optionalDependencies:
1890 | '@tailwindcss/oxide-android-arm64': 4.1.13
1891 | '@tailwindcss/oxide-darwin-arm64': 4.1.13
1892 | '@tailwindcss/oxide-darwin-x64': 4.1.13
1893 | '@tailwindcss/oxide-freebsd-x64': 4.1.13
1894 | '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.13
1895 | '@tailwindcss/oxide-linux-arm64-gnu': 4.1.13
1896 | '@tailwindcss/oxide-linux-arm64-musl': 4.1.13
1897 | '@tailwindcss/oxide-linux-x64-gnu': 4.1.13
1898 | '@tailwindcss/oxide-linux-x64-musl': 4.1.13
1899 | '@tailwindcss/oxide-wasm32-wasi': 4.1.13
1900 | '@tailwindcss/oxide-win32-arm64-msvc': 4.1.13
1901 | '@tailwindcss/oxide-win32-x64-msvc': 4.1.13
1902 |
1903 | '@tailwindcss/postcss@4.1.13':
1904 | dependencies:
1905 | '@alloc/quick-lru': 5.2.0
1906 | '@tailwindcss/node': 4.1.13
1907 | '@tailwindcss/oxide': 4.1.13
1908 | postcss: 8.5.6
1909 | tailwindcss: 4.1.13
1910 |
1911 | '@types/hast@2.3.10':
1912 | dependencies:
1913 | '@types/unist': 2.0.11
1914 |
1915 | '@types/hast@3.0.4':
1916 | dependencies:
1917 | '@types/unist': 3.0.3
1918 |
1919 | '@types/mdast@4.0.4':
1920 | dependencies:
1921 | '@types/unist': 3.0.3
1922 |
1923 | '@types/node@20.19.13':
1924 | dependencies:
1925 | undici-types: 6.21.0
1926 |
1927 | '@types/react-dom@19.1.9(@types/react@19.1.12)':
1928 | dependencies:
1929 | '@types/react': 19.1.12
1930 |
1931 | '@types/react-syntax-highlighter@15.5.13':
1932 | dependencies:
1933 | '@types/react': 19.1.12
1934 |
1935 | '@types/react@19.1.12':
1936 | dependencies:
1937 | csstype: 3.1.3
1938 |
1939 | '@types/unist@2.0.11': {}
1940 |
1941 | '@types/unist@3.0.3': {}
1942 |
1943 | '@ungap/structured-clone@1.3.0': {}
1944 |
1945 | aria-hidden@1.2.6:
1946 | dependencies:
1947 | tslib: 2.8.1
1948 |
1949 | caniuse-lite@1.0.30001741: {}
1950 |
1951 | ccount@2.0.1: {}
1952 |
1953 | character-entities-html4@2.1.0: {}
1954 |
1955 | character-entities-legacy@1.1.4: {}
1956 |
1957 | character-entities-legacy@3.0.0: {}
1958 |
1959 | character-entities@1.2.4: {}
1960 |
1961 | character-reference-invalid@1.1.4: {}
1962 |
1963 | chownr@3.0.0: {}
1964 |
1965 | class-variance-authority@0.7.1:
1966 | dependencies:
1967 | clsx: 2.1.1
1968 |
1969 | client-only@0.0.1: {}
1970 |
1971 | clsx@2.1.1: {}
1972 |
1973 | color-convert@2.0.1:
1974 | dependencies:
1975 | color-name: 1.1.4
1976 | optional: true
1977 |
1978 | color-name@1.1.4:
1979 | optional: true
1980 |
1981 | color-string@1.9.1:
1982 | dependencies:
1983 | color-name: 1.1.4
1984 | simple-swizzle: 0.2.2
1985 | optional: true
1986 |
1987 | color@4.2.3:
1988 | dependencies:
1989 | color-convert: 2.0.1
1990 | color-string: 1.9.1
1991 | optional: true
1992 |
1993 | comma-separated-tokens@1.0.8: {}
1994 |
1995 | comma-separated-tokens@2.0.3: {}
1996 |
1997 | csstype@3.1.3: {}
1998 |
1999 | dequal@2.0.3: {}
2000 |
2001 | detect-libc@2.0.4: {}
2002 |
2003 | detect-node-es@1.1.0: {}
2004 |
2005 | devlop@1.1.0:
2006 | dependencies:
2007 | dequal: 2.0.3
2008 |
2009 | enhanced-resolve@5.18.3:
2010 | dependencies:
2011 | graceful-fs: 4.2.11
2012 | tapable: 2.2.3
2013 |
2014 | fault@1.0.4:
2015 | dependencies:
2016 | format: 0.2.2
2017 |
2018 | format@0.2.2: {}
2019 |
2020 | framer-motion@12.23.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
2021 | dependencies:
2022 | motion-dom: 12.23.12
2023 | motion-utils: 12.23.6
2024 | tslib: 2.8.1
2025 | optionalDependencies:
2026 | react: 19.1.0
2027 | react-dom: 19.1.0(react@19.1.0)
2028 |
2029 | get-nonce@1.0.1: {}
2030 |
2031 | graceful-fs@4.2.11: {}
2032 |
2033 | hast-util-parse-selector@2.2.5: {}
2034 |
2035 | hast-util-to-html@9.0.5:
2036 | dependencies:
2037 | '@types/hast': 3.0.4
2038 | '@types/unist': 3.0.3
2039 | ccount: 2.0.1
2040 | comma-separated-tokens: 2.0.3
2041 | hast-util-whitespace: 3.0.0
2042 | html-void-elements: 3.0.0
2043 | mdast-util-to-hast: 13.2.0
2044 | property-information: 7.1.0
2045 | space-separated-tokens: 2.0.2
2046 | stringify-entities: 4.0.4
2047 | zwitch: 2.0.4
2048 |
2049 | hast-util-whitespace@3.0.0:
2050 | dependencies:
2051 | '@types/hast': 3.0.4
2052 |
2053 | hastscript@6.0.0:
2054 | dependencies:
2055 | '@types/hast': 2.3.10
2056 | comma-separated-tokens: 1.0.8
2057 | hast-util-parse-selector: 2.2.5
2058 | property-information: 5.6.0
2059 | space-separated-tokens: 1.1.5
2060 |
2061 | highlight.js@10.7.3: {}
2062 |
2063 | highlightjs-vue@1.0.0: {}
2064 |
2065 | html-void-elements@3.0.0: {}
2066 |
2067 | is-alphabetical@1.0.4: {}
2068 |
2069 | is-alphanumerical@1.0.4:
2070 | dependencies:
2071 | is-alphabetical: 1.0.4
2072 | is-decimal: 1.0.4
2073 |
2074 | is-arrayish@0.3.2:
2075 | optional: true
2076 |
2077 | is-decimal@1.0.4: {}
2078 |
2079 | is-hexadecimal@1.0.4: {}
2080 |
2081 | jiti@2.5.1: {}
2082 |
2083 | lightningcss-darwin-arm64@1.30.1:
2084 | optional: true
2085 |
2086 | lightningcss-darwin-x64@1.30.1:
2087 | optional: true
2088 |
2089 | lightningcss-freebsd-x64@1.30.1:
2090 | optional: true
2091 |
2092 | lightningcss-linux-arm-gnueabihf@1.30.1:
2093 | optional: true
2094 |
2095 | lightningcss-linux-arm64-gnu@1.30.1:
2096 | optional: true
2097 |
2098 | lightningcss-linux-arm64-musl@1.30.1:
2099 | optional: true
2100 |
2101 | lightningcss-linux-x64-gnu@1.30.1:
2102 | optional: true
2103 |
2104 | lightningcss-linux-x64-musl@1.30.1:
2105 | optional: true
2106 |
2107 | lightningcss-win32-arm64-msvc@1.30.1:
2108 | optional: true
2109 |
2110 | lightningcss-win32-x64-msvc@1.30.1:
2111 | optional: true
2112 |
2113 | lightningcss@1.30.1:
2114 | dependencies:
2115 | detect-libc: 2.0.4
2116 | optionalDependencies:
2117 | lightningcss-darwin-arm64: 1.30.1
2118 | lightningcss-darwin-x64: 1.30.1
2119 | lightningcss-freebsd-x64: 1.30.1
2120 | lightningcss-linux-arm-gnueabihf: 1.30.1
2121 | lightningcss-linux-arm64-gnu: 1.30.1
2122 | lightningcss-linux-arm64-musl: 1.30.1
2123 | lightningcss-linux-x64-gnu: 1.30.1
2124 | lightningcss-linux-x64-musl: 1.30.1
2125 | lightningcss-win32-arm64-msvc: 1.30.1
2126 | lightningcss-win32-x64-msvc: 1.30.1
2127 |
2128 | lowlight@1.20.0:
2129 | dependencies:
2130 | fault: 1.0.4
2131 | highlight.js: 10.7.3
2132 |
2133 | lucide-react@0.542.0(react@19.1.0):
2134 | dependencies:
2135 | react: 19.1.0
2136 |
2137 | magic-string@0.30.18:
2138 | dependencies:
2139 | '@jridgewell/sourcemap-codec': 1.5.5
2140 |
2141 | mdast-util-to-hast@13.2.0:
2142 | dependencies:
2143 | '@types/hast': 3.0.4
2144 | '@types/mdast': 4.0.4
2145 | '@ungap/structured-clone': 1.3.0
2146 | devlop: 1.1.0
2147 | micromark-util-sanitize-uri: 2.0.1
2148 | trim-lines: 3.0.1
2149 | unist-util-position: 5.0.0
2150 | unist-util-visit: 5.0.0
2151 | vfile: 6.0.3
2152 |
2153 | micromark-util-character@2.1.1:
2154 | dependencies:
2155 | micromark-util-symbol: 2.0.1
2156 | micromark-util-types: 2.0.2
2157 |
2158 | micromark-util-encode@2.0.1: {}
2159 |
2160 | micromark-util-sanitize-uri@2.0.1:
2161 | dependencies:
2162 | micromark-util-character: 2.1.1
2163 | micromark-util-encode: 2.0.1
2164 | micromark-util-symbol: 2.0.1
2165 |
2166 | micromark-util-symbol@2.0.1: {}
2167 |
2168 | micromark-util-types@2.0.2: {}
2169 |
2170 | minipass@7.1.2: {}
2171 |
2172 | minizlib@3.0.2:
2173 | dependencies:
2174 | minipass: 7.1.2
2175 |
2176 | mkdirp@3.0.1: {}
2177 |
2178 | motion-dom@12.23.12:
2179 | dependencies:
2180 | motion-utils: 12.23.6
2181 |
2182 | motion-utils@12.23.6: {}
2183 |
2184 | nanoid@3.3.11: {}
2185 |
2186 | next-themes@0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
2187 | dependencies:
2188 | react: 19.1.0
2189 | react-dom: 19.1.0(react@19.1.0)
2190 |
2191 | next@15.5.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
2192 | dependencies:
2193 | '@next/env': 15.5.2
2194 | '@swc/helpers': 0.5.15
2195 | caniuse-lite: 1.0.30001741
2196 | postcss: 8.4.31
2197 | react: 19.1.0
2198 | react-dom: 19.1.0(react@19.1.0)
2199 | styled-jsx: 5.1.6(react@19.1.0)
2200 | optionalDependencies:
2201 | '@next/swc-darwin-arm64': 15.5.2
2202 | '@next/swc-darwin-x64': 15.5.2
2203 | '@next/swc-linux-arm64-gnu': 15.5.2
2204 | '@next/swc-linux-arm64-musl': 15.5.2
2205 | '@next/swc-linux-x64-gnu': 15.5.2
2206 | '@next/swc-linux-x64-musl': 15.5.2
2207 | '@next/swc-win32-arm64-msvc': 15.5.2
2208 | '@next/swc-win32-x64-msvc': 15.5.2
2209 | sharp: 0.34.3
2210 | transitivePeerDependencies:
2211 | - '@babel/core'
2212 | - babel-plugin-macros
2213 |
2214 | oniguruma-parser@0.12.1: {}
2215 |
2216 | oniguruma-to-es@4.3.3:
2217 | dependencies:
2218 | oniguruma-parser: 0.12.1
2219 | regex: 6.0.1
2220 | regex-recursion: 6.0.2
2221 |
2222 | parse-entities@2.0.0:
2223 | dependencies:
2224 | character-entities: 1.2.4
2225 | character-entities-legacy: 1.1.4
2226 | character-reference-invalid: 1.1.4
2227 | is-alphanumerical: 1.0.4
2228 | is-decimal: 1.0.4
2229 | is-hexadecimal: 1.0.4
2230 |
2231 | picocolors@1.1.1: {}
2232 |
2233 | postcss@8.4.31:
2234 | dependencies:
2235 | nanoid: 3.3.11
2236 | picocolors: 1.1.1
2237 | source-map-js: 1.2.1
2238 |
2239 | postcss@8.5.6:
2240 | dependencies:
2241 | nanoid: 3.3.11
2242 | picocolors: 1.1.1
2243 | source-map-js: 1.2.1
2244 |
2245 | prismjs@1.27.0: {}
2246 |
2247 | prismjs@1.30.0: {}
2248 |
2249 | property-information@5.6.0:
2250 | dependencies:
2251 | xtend: 4.0.2
2252 |
2253 | property-information@7.1.0: {}
2254 |
2255 | react-dom@19.1.0(react@19.1.0):
2256 | dependencies:
2257 | react: 19.1.0
2258 | scheduler: 0.26.0
2259 |
2260 | react-remove-scroll-bar@2.3.8(@types/react@19.1.12)(react@19.1.0):
2261 | dependencies:
2262 | react: 19.1.0
2263 | react-style-singleton: 2.2.3(@types/react@19.1.12)(react@19.1.0)
2264 | tslib: 2.8.1
2265 | optionalDependencies:
2266 | '@types/react': 19.1.12
2267 |
2268 | react-remove-scroll@2.7.1(@types/react@19.1.12)(react@19.1.0):
2269 | dependencies:
2270 | react: 19.1.0
2271 | react-remove-scroll-bar: 2.3.8(@types/react@19.1.12)(react@19.1.0)
2272 | react-style-singleton: 2.2.3(@types/react@19.1.12)(react@19.1.0)
2273 | tslib: 2.8.1
2274 | use-callback-ref: 1.3.3(@types/react@19.1.12)(react@19.1.0)
2275 | use-sidecar: 1.1.3(@types/react@19.1.12)(react@19.1.0)
2276 | optionalDependencies:
2277 | '@types/react': 19.1.12
2278 |
2279 | react-style-singleton@2.2.3(@types/react@19.1.12)(react@19.1.0):
2280 | dependencies:
2281 | get-nonce: 1.0.1
2282 | react: 19.1.0
2283 | tslib: 2.8.1
2284 | optionalDependencies:
2285 | '@types/react': 19.1.12
2286 |
2287 | react-syntax-highlighter@15.6.6(react@19.1.0):
2288 | dependencies:
2289 | '@babel/runtime': 7.28.4
2290 | highlight.js: 10.7.3
2291 | highlightjs-vue: 1.0.0
2292 | lowlight: 1.20.0
2293 | prismjs: 1.30.0
2294 | react: 19.1.0
2295 | refractor: 3.6.0
2296 |
2297 | react@19.1.0: {}
2298 |
2299 | refractor@3.6.0:
2300 | dependencies:
2301 | hastscript: 6.0.0
2302 | parse-entities: 2.0.0
2303 | prismjs: 1.27.0
2304 |
2305 | regex-recursion@6.0.2:
2306 | dependencies:
2307 | regex-utilities: 2.3.0
2308 |
2309 | regex-utilities@2.3.0: {}
2310 |
2311 | regex@6.0.1:
2312 | dependencies:
2313 | regex-utilities: 2.3.0
2314 |
2315 | scheduler@0.26.0: {}
2316 |
2317 | semver@7.7.2:
2318 | optional: true
2319 |
2320 | sharp@0.34.3:
2321 | dependencies:
2322 | color: 4.2.3
2323 | detect-libc: 2.0.4
2324 | semver: 7.7.2
2325 | optionalDependencies:
2326 | '@img/sharp-darwin-arm64': 0.34.3
2327 | '@img/sharp-darwin-x64': 0.34.3
2328 | '@img/sharp-libvips-darwin-arm64': 1.2.0
2329 | '@img/sharp-libvips-darwin-x64': 1.2.0
2330 | '@img/sharp-libvips-linux-arm': 1.2.0
2331 | '@img/sharp-libvips-linux-arm64': 1.2.0
2332 | '@img/sharp-libvips-linux-ppc64': 1.2.0
2333 | '@img/sharp-libvips-linux-s390x': 1.2.0
2334 | '@img/sharp-libvips-linux-x64': 1.2.0
2335 | '@img/sharp-libvips-linuxmusl-arm64': 1.2.0
2336 | '@img/sharp-libvips-linuxmusl-x64': 1.2.0
2337 | '@img/sharp-linux-arm': 0.34.3
2338 | '@img/sharp-linux-arm64': 0.34.3
2339 | '@img/sharp-linux-ppc64': 0.34.3
2340 | '@img/sharp-linux-s390x': 0.34.3
2341 | '@img/sharp-linux-x64': 0.34.3
2342 | '@img/sharp-linuxmusl-arm64': 0.34.3
2343 | '@img/sharp-linuxmusl-x64': 0.34.3
2344 | '@img/sharp-wasm32': 0.34.3
2345 | '@img/sharp-win32-arm64': 0.34.3
2346 | '@img/sharp-win32-ia32': 0.34.3
2347 | '@img/sharp-win32-x64': 0.34.3
2348 | optional: true
2349 |
2350 | shiki@3.12.2:
2351 | dependencies:
2352 | '@shikijs/core': 3.12.2
2353 | '@shikijs/engine-javascript': 3.12.2
2354 | '@shikijs/engine-oniguruma': 3.12.2
2355 | '@shikijs/langs': 3.12.2
2356 | '@shikijs/themes': 3.12.2
2357 | '@shikijs/types': 3.12.2
2358 | '@shikijs/vscode-textmate': 10.0.2
2359 | '@types/hast': 3.0.4
2360 |
2361 | simple-swizzle@0.2.2:
2362 | dependencies:
2363 | is-arrayish: 0.3.2
2364 | optional: true
2365 |
2366 | source-map-js@1.2.1: {}
2367 |
2368 | space-separated-tokens@1.1.5: {}
2369 |
2370 | space-separated-tokens@2.0.2: {}
2371 |
2372 | stringify-entities@4.0.4:
2373 | dependencies:
2374 | character-entities-html4: 2.1.0
2375 | character-entities-legacy: 3.0.0
2376 |
2377 | styled-jsx@5.1.6(react@19.1.0):
2378 | dependencies:
2379 | client-only: 0.0.1
2380 | react: 19.1.0
2381 |
2382 | tailwind-merge@3.3.1: {}
2383 |
2384 | tailwindcss@4.1.13: {}
2385 |
2386 | tapable@2.2.3: {}
2387 |
2388 | tar@7.4.3:
2389 | dependencies:
2390 | '@isaacs/fs-minipass': 4.0.1
2391 | chownr: 3.0.0
2392 | minipass: 7.1.2
2393 | minizlib: 3.0.2
2394 | mkdirp: 3.0.1
2395 | yallist: 5.0.0
2396 |
2397 | trim-lines@3.0.1: {}
2398 |
2399 | tslib@2.8.1: {}
2400 |
2401 | tw-animate-css@1.3.8: {}
2402 |
2403 | typescript@5.9.2: {}
2404 |
2405 | undici-types@6.21.0: {}
2406 |
2407 | unist-util-is@6.0.0:
2408 | dependencies:
2409 | '@types/unist': 3.0.3
2410 |
2411 | unist-util-position@5.0.0:
2412 | dependencies:
2413 | '@types/unist': 3.0.3
2414 |
2415 | unist-util-stringify-position@4.0.0:
2416 | dependencies:
2417 | '@types/unist': 3.0.3
2418 |
2419 | unist-util-visit-parents@6.0.1:
2420 | dependencies:
2421 | '@types/unist': 3.0.3
2422 | unist-util-is: 6.0.0
2423 |
2424 | unist-util-visit@5.0.0:
2425 | dependencies:
2426 | '@types/unist': 3.0.3
2427 | unist-util-is: 6.0.0
2428 | unist-util-visit-parents: 6.0.1
2429 |
2430 | use-callback-ref@1.3.3(@types/react@19.1.12)(react@19.1.0):
2431 | dependencies:
2432 | react: 19.1.0
2433 | tslib: 2.8.1
2434 | optionalDependencies:
2435 | '@types/react': 19.1.12
2436 |
2437 | use-sidecar@1.1.3(@types/react@19.1.12)(react@19.1.0):
2438 | dependencies:
2439 | detect-node-es: 1.1.0
2440 | react: 19.1.0
2441 | tslib: 2.8.1
2442 | optionalDependencies:
2443 | '@types/react': 19.1.12
2444 |
2445 | vfile-message@4.0.3:
2446 | dependencies:
2447 | '@types/unist': 3.0.3
2448 | unist-util-stringify-position: 4.0.0
2449 |
2450 | vfile@6.0.3:
2451 | dependencies:
2452 | '@types/unist': 3.0.3
2453 | vfile-message: 4.0.3
2454 |
2455 | xtend@4.0.2: {}
2456 |
2457 | yallist@5.0.0: {}
2458 |
2459 | zwitch@2.0.4: {}
2460 |
--------------------------------------------------------------------------------