Spaces:
Configuration error
Configuration error
Add React build step for alphamate AI OS
Browse files- .claude/settings.json +22 -0
- .gitattributes +1 -0
- .gitignore +2 -23
- README.md +489 -2
- backend-lib/zo-api.ts +84 -0
- bun.lock +662 -0
- bunfig.toml +6 -0
- components.json +22 -0
- index.html +1 -2
- index.tsx +1 -0
- package.json +52 -33
- public/favicon.svg +8 -0
- public/images/pegasus.png +3 -0
- server.ts +132 -0
- src/App.tsx +15 -0
- src/components/theme-provider.tsx +73 -0
- src/components/ui/badge.tsx +46 -0
- src/components/ui/button.tsx +60 -0
- src/components/ui/card.tsx +92 -0
- src/hooks/use-mobile.ts +21 -0
- src/lib/utils.ts +6 -0
- src/main.tsx +12 -0
- src/pages/alphamate.tsx +223 -0
- src/pages/marketing-demo.tsx +283 -0
- src/styles.css +131 -0
- tsconfig.json +30 -0
- vite.config.ts +22 -0
- zosite.json +15 -0
.claude/settings.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"defaultMode": "bypassPermissions",
|
| 3 |
+
"apiKeyHelper": "echo $ZO_CLIENT_IDENTITY_TOKEN",
|
| 4 |
+
"permissions": {
|
| 5 |
+
"allow": [
|
| 6 |
+
"Bash(rm:*)",
|
| 7 |
+
"Bash(mkdir:*)",
|
| 8 |
+
"Bash(mv:*)",
|
| 9 |
+
"Bash(bun:*)",
|
| 10 |
+
"Bash(git:*)",
|
| 11 |
+
"Bash(chmod:*)",
|
| 12 |
+
"Bash(grep:*)",
|
| 13 |
+
"Bash(ls:*)",
|
| 14 |
+
"Bash(find:*)",
|
| 15 |
+
"Bash(curl:*)",
|
| 16 |
+
"Edit",
|
| 17 |
+
"Write",
|
| 18 |
+
"MultiEdit"
|
| 19 |
+
]
|
| 20 |
+
},
|
| 21 |
+
"model": "claude-sonnet-4-5-20250929"
|
| 22 |
+
}
|
.gitattributes
CHANGED
|
@@ -34,3 +34,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
images/pegasus.png filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
images/pegasus.png filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
public/images/pegasus.png filter=lfs diff=lfs merge=lfs -text
|
.gitignore
CHANGED
|
@@ -1,23 +1,2 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
# dependencies
|
| 4 |
-
/node_modules
|
| 5 |
-
/.pnp
|
| 6 |
-
.pnp.js
|
| 7 |
-
|
| 8 |
-
# testing
|
| 9 |
-
/coverage
|
| 10 |
-
|
| 11 |
-
# production
|
| 12 |
-
/build
|
| 13 |
-
|
| 14 |
-
# misc
|
| 15 |
-
.DS_Store
|
| 16 |
-
.env.local
|
| 17 |
-
.env.development.local
|
| 18 |
-
.env.test.local
|
| 19 |
-
.env.production.local
|
| 20 |
-
|
| 21 |
-
npm-debug.log*
|
| 22 |
-
yarn-debug.log*
|
| 23 |
-
yarn-error.log*
|
|
|
|
| 1 |
+
node_modules/
|
| 2 |
+
dist/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
README.md
CHANGED
|
@@ -5,8 +5,495 @@ colorFrom: indigo
|
|
| 5 |
colorTo: gray
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
| 11 |
|
| 12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
colorTo: gray
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
+
app_build_command: bun run build
|
| 9 |
+
app_file: dist/index.html
|
| 10 |
---
|
| 11 |
|
| 12 |
+
This file provides guidance when working with code in this repository. The README.md should ALWAYS serve as an accurate, comprehensive piece of documentation for this project. It should describe the broader goals and purpose of this repository along with the technical implementation details. If any aspect of the project changes, the README.md should be updated to reflect that.
|
| 13 |
|
| 14 |
+
# Project Notes
|
| 15 |
+
|
| 16 |
+
<!-- Documentation for this specific project goes here. This will include both an articulation of what this project aims to accomplish as well as technical details about how it works. This means explaining the purpose of the project as a whole along with an overview of the design choices. -->
|
| 17 |
+
|
| 18 |
+
---
|
| 19 |
+
|
| 20 |
+
# Documentation
|
| 21 |
+
|
| 22 |
+
This is a **Zo Site** - a web application running on a user's Zo computer that combines:
|
| 23 |
+
- **Backend**: Bun + Hono server with API routes
|
| 24 |
+
- **Frontend**: React + Vite with client-side routing, shadcn/ui components, and Tailwind CSS 4
|
| 25 |
+
- **Single Process**: Vite runs in middleware mode (no separate dev server)
|
| 26 |
+
|
| 27 |
+
## Architecture
|
| 28 |
+
|
| 29 |
+
### File Structure
|
| 30 |
+
|
| 31 |
+
```
|
| 32 |
+
.
|
| 33 |
+
├── server.ts # Main server (Hono + Vite middleware)
|
| 34 |
+
├── index.html # HTML entry point for React
|
| 35 |
+
├── vite.config.ts # Vite configuration
|
| 36 |
+
├── package.json # Dependencies and scripts
|
| 37 |
+
├── zosite.json # Zo deployment config (ports, env vars)
|
| 38 |
+
├── public/ # Static assets (images, fonts, favicon)
|
| 39 |
+
│ ├── favicon.svg # Site favicon (replace with your own)
|
| 40 |
+
│ └── images/
|
| 41 |
+
│ └── pegasus.png # Example image (loaded via <img src="/images/pegasus.png">)
|
| 42 |
+
├── backend-lib/
|
| 43 |
+
│ └── zo-api.ts # Helper for calling Zo API
|
| 44 |
+
└── src/
|
| 45 |
+
├── main.tsx # React entry point
|
| 46 |
+
├── App.tsx # Router setup
|
| 47 |
+
├── styles.css # Global styles
|
| 48 |
+
└── pages/ # Page components
|
| 49 |
+
```
|
| 50 |
+
|
| 51 |
+
### Development vs Production
|
| 52 |
+
|
| 53 |
+
**Development Mode** (`bun run dev`):
|
| 54 |
+
- Single Bun process running `server.ts`
|
| 55 |
+
- Vite in middleware mode transforms files on-the-fly
|
| 56 |
+
- API routes: `/api/*` handled by Hono
|
| 57 |
+
- React app: served via Vite transforms (HMR disabled, use `bun --hot` for server restart)
|
| 58 |
+
- Client-side routing: any non-API, non-file route falls back to `index.html`
|
| 59 |
+
- **Environment**: Site runs at an internal authenticated URL accessible only to you (private site on your Zo computer)
|
| 60 |
+
|
| 61 |
+
**Production Mode** (`bun run prod`):
|
| 62 |
+
- Builds React app to `dist/` using Vite
|
| 63 |
+
- Bun serves static files from `dist/` via `hono/bun` serveStatic
|
| 64 |
+
- API routes still handled by Hono
|
| 65 |
+
- SPA fallback: all non-API routes serve `dist/index.html`
|
| 66 |
+
- **Environment**: Site is published and accessible to anyone on the internet at a public URL
|
| 67 |
+
|
| 68 |
+
NEVER use the scripts `bun run dev` or `bun run prod`. The Zo system handles running the site in the correct mode based on context. All process management of the server is handled by Zo. Never restart or stop the server manually.
|
| 69 |
+
|
| 70 |
+
## Viewing, Verification, and Debugging (agent-browser)
|
| 71 |
+
|
| 72 |
+
The `agent-browser` CLI tool lets you preview, navigate, and debug the site running at `http://localhost:$PORT` (PORT is set by Zo). Use it to verify UI changes, debug routing, or capture screenshots.
|
| 73 |
+
|
| 74 |
+
Core workflow:
|
| 75 |
+
1. Navigate to the site:
|
| 76 |
+
```bash
|
| 77 |
+
agent-browser open http://localhost:$PORT
|
| 78 |
+
```
|
| 79 |
+
2. Snapshot the page to get interactive element refs:
|
| 80 |
+
```bash
|
| 81 |
+
agent-browser snapshot -i
|
| 82 |
+
```
|
| 83 |
+
3. Interact with elements:
|
| 84 |
+
```bash
|
| 85 |
+
agent-browser click @e1
|
| 86 |
+
agent-browser fill @e2 "text"
|
| 87 |
+
agent-browser hover @e3
|
| 88 |
+
agent-browser get text @e1
|
| 89 |
+
```
|
| 90 |
+
4. Re-snapshot after page changes to get updated refs.
|
| 91 |
+
|
| 92 |
+
Taking screenshots:
|
| 93 |
+
```bash
|
| 94 |
+
agent-browser screenshot
|
| 95 |
+
agent-browser screenshot --full-page
|
| 96 |
+
agent-browser screenshot --filename debug.png
|
| 97 |
+
```
|
| 98 |
+
|
| 99 |
+
For the full list of commands and options, run:
|
| 100 |
+
```bash
|
| 101 |
+
agent-browser --help
|
| 102 |
+
```
|
| 103 |
+
|
| 104 |
+
Note: Do not tell the user to visit localhost; they already have access via the Zo preview iframe.
|
| 105 |
+
|
| 106 |
+
## Key Technologies
|
| 107 |
+
|
| 108 |
+
### ⚠️ IMPORTANT: This is BUN + HONO (NOT Node.js + Express)
|
| 109 |
+
|
| 110 |
+
This application uses:
|
| 111 |
+
- **Bun** as the runtime (NOT Node.js)
|
| 112 |
+
- **Hono** as the web framework (NOT Express)
|
| 113 |
+
|
| 114 |
+
Do not use Express patterns. Use Hono equivalents. For file system operations, see the section below.
|
| 115 |
+
|
| 116 |
+
### Bun Runtime
|
| 117 |
+
- JavaScript runtime (NOT Node.js or Deno)
|
| 118 |
+
- Use `bun add <package>` to install dependencies
|
| 119 |
+
- Built-in TypeScript support
|
| 120 |
+
- Built-in SQLite via `import { Database } from "bun:sqlite"`
|
| 121 |
+
- Process spawning: `Bun.spawn()` for running commands
|
| 122 |
+
|
| 123 |
+
### File System Operations
|
| 124 |
+
|
| 125 |
+
Bun has native APIs for file I/O but uses Node.js APIs for directory operations. Use the correct API for each operation:
|
| 126 |
+
|
| 127 |
+
| Operation | API | Example |
|
| 128 |
+
|-----------|-----|---------|
|
| 129 |
+
| Read file | `Bun.file()` | `await Bun.file("data.json").text()` |
|
| 130 |
+
| Write file | `Bun.write()` | `await Bun.write("out.txt", content)` |
|
| 131 |
+
| File exists | `Bun.file().exists()` | `await Bun.file("x.txt").exists()` |
|
| 132 |
+
| Read directory | `node:fs/promises` | `await readdir("./posts")` |
|
| 133 |
+
| Create directory | `node:fs/promises` | `await mkdir("dir", { recursive: true })` |
|
| 134 |
+
| Glob files | `Bun Glob` | `new Glob("**/*.md").scan(".")` |
|
| 135 |
+
|
| 136 |
+
**⚠️ Common Mistakes to Avoid:**
|
| 137 |
+
|
| 138 |
+
```ts
|
| 139 |
+
// ❌ WRONG - These do NOT exist:
|
| 140 |
+
Bun.readdir() // No such API
|
| 141 |
+
Bun.readdirSync() // No such API
|
| 142 |
+
Bun.mkdir() // No such API
|
| 143 |
+
fs.readFileSync() // Works but slower than Bun.file()
|
| 144 |
+
|
| 145 |
+
// ✅ CORRECT patterns:
|
| 146 |
+
import { readdir, mkdir } from "node:fs/promises";
|
| 147 |
+
|
| 148 |
+
// Reading a file
|
| 149 |
+
const content = await Bun.file("config.json").json();
|
| 150 |
+
|
| 151 |
+
// Writing a file
|
| 152 |
+
await Bun.write("output.txt", "Hello");
|
| 153 |
+
|
| 154 |
+
// Listing directory contents
|
| 155 |
+
const files = await readdir("./posts");
|
| 156 |
+
|
| 157 |
+
// Creating a directory
|
| 158 |
+
await mkdir("./uploads", { recursive: true });
|
| 159 |
+
|
| 160 |
+
// Finding files by pattern
|
| 161 |
+
import { Glob } from "bun";
|
| 162 |
+
const glob = new Glob("**/*.md");
|
| 163 |
+
for await (const file of glob.scan("./posts")) {
|
| 164 |
+
console.log(file);
|
| 165 |
+
}
|
| 166 |
+
```
|
| 167 |
+
|
| 168 |
+
### Hono Framework
|
| 169 |
+
- Lightweight web framework designed for Bun
|
| 170 |
+
- Documentation: https://honojs.dev/llms-small.txt
|
| 171 |
+
- Import from `hono` for core, `hono/bun` for Bun-specific features like `serveStatic`
|
| 172 |
+
|
| 173 |
+
**Serving Static Files (Bun-specific):**
|
| 174 |
+
|
| 175 |
+
```ts
|
| 176 |
+
import { serveStatic } from 'hono/bun'
|
| 177 |
+
|
| 178 |
+
app.use('/static/*', serveStatic({ root: './' }))
|
| 179 |
+
app.use('/favicon.ico', serveStatic({ path: './favicon.ico' }))
|
| 180 |
+
app.get('*', serveStatic({ path: './static/fallback.txt' }))
|
| 181 |
+
|
| 182 |
+
// You can reach outside the project root to files in the user's workspace
|
| 183 |
+
app.get('/workspace-file', serveStatic({ path: '../some/dir/file.txt' }))
|
| 184 |
+
app.get('/absolute-file', serveStatic({ path: '/home/user/file.txt' }))
|
| 185 |
+
|
| 186 |
+
// Custom MIME types
|
| 187 |
+
app.get('/media/*', serveStatic({
|
| 188 |
+
mimes: {
|
| 189 |
+
m3u8: 'application/vnd.apple.mpegurl',
|
| 190 |
+
ts: 'video/mp2t',
|
| 191 |
+
},
|
| 192 |
+
}))
|
| 193 |
+
```
|
| 194 |
+
|
| 195 |
+
**Hono Routing:**
|
| 196 |
+
|
| 197 |
+
```ts
|
| 198 |
+
// REST API endpoints
|
| 199 |
+
app.get('/', (c) => c.json({ items: [] }))
|
| 200 |
+
app.post('/', (c) => c.json({ created: true }, 201))
|
| 201 |
+
app.get('/:id', (c) => c.json({ id: c.req.param('id') }))
|
| 202 |
+
|
| 203 |
+
// Middleware
|
| 204 |
+
import { basicAuth } from 'hono/basic-auth'
|
| 205 |
+
app.use('/admin/*', basicAuth({ username: 'admin', password: 'secret' }))
|
| 206 |
+
|
| 207 |
+
// Multiple middlewares are processed in order
|
| 208 |
+
app.use(logger())
|
| 209 |
+
app.use('/posts/*', cors())
|
| 210 |
+
app.post('/posts/*', basicAuth())
|
| 211 |
+
```
|
| 212 |
+
|
| 213 |
+
### React + Vite
|
| 214 |
+
- React for UI components
|
| 215 |
+
- Vite handles bundling and transforms
|
| 216 |
+
- Dependencies installed via `bun add` (NOT CDN imports) - all packages bundled by Vite
|
| 217 |
+
- React Router for client-side routing
|
| 218 |
+
- **Styling**: Tailwind CSS 4 configured with `@tailwindcss/vite` plugin
|
| 219 |
+
- **UI Components**: shadcn/ui already set up and configured - components can be added via `bunx shadcn@latest add <component-name>`
|
| 220 |
+
- **Icons**: Lucide React icons included and ready to use
|
| 221 |
+
|
| 222 |
+
## Common Tasks
|
| 223 |
+
|
| 224 |
+
### Adding API Routes
|
| 225 |
+
|
| 226 |
+
Add routes in `server.ts` before the Vite middleware:
|
| 227 |
+
|
| 228 |
+
```ts
|
| 229 |
+
app.get("/api/example", async (c) => {
|
| 230 |
+
return c.json({ data: "example" });
|
| 231 |
+
});
|
| 232 |
+
```
|
| 233 |
+
|
| 234 |
+
### Adding React Components
|
| 235 |
+
|
| 236 |
+
Create components in `src/`:
|
| 237 |
+
|
| 238 |
+
```tsx
|
| 239 |
+
// src/components/MyComponent.tsx
|
| 240 |
+
import React from "react";
|
| 241 |
+
|
| 242 |
+
export default function MyComponent() {
|
| 243 |
+
return <div>Hello</div>;
|
| 244 |
+
}
|
| 245 |
+
```
|
| 246 |
+
|
| 247 |
+
Add routes in `src/App.tsx`:
|
| 248 |
+
|
| 249 |
+
```tsx
|
| 250 |
+
import MyPage from "./pages/MyPage";
|
| 251 |
+
|
| 252 |
+
<Routes>
|
| 253 |
+
<Route path="/my-page" element={<MyPage />} />
|
| 254 |
+
</Routes>
|
| 255 |
+
```
|
| 256 |
+
|
| 257 |
+
### Calling Zo API from Backend
|
| 258 |
+
|
| 259 |
+
Use the helper in `backend-lib/zo-api.ts`:
|
| 260 |
+
|
| 261 |
+
```ts
|
| 262 |
+
import { callZo } from "./backend-lib/zo-api";
|
| 263 |
+
|
| 264 |
+
app.post("/api/ask-zo", async (c) => {
|
| 265 |
+
const { question } = await c.req.json();
|
| 266 |
+
|
| 267 |
+
const result = await callZo(question, {
|
| 268 |
+
outputFormat: {
|
| 269 |
+
type: "object",
|
| 270 |
+
properties: { answer: { type: "string" } },
|
| 271 |
+
required: ["answer"]
|
| 272 |
+
}
|
| 273 |
+
});
|
| 274 |
+
|
| 275 |
+
return c.json(result);
|
| 276 |
+
});
|
| 277 |
+
```
|
| 278 |
+
|
| 279 |
+
### Static Assets
|
| 280 |
+
|
| 281 |
+
There are two ways to include static assets like images, fonts, or JSON data:
|
| 282 |
+
|
| 283 |
+
#### Option 1: The `public/` Folder (Recommended for Most Cases)
|
| 284 |
+
|
| 285 |
+
Place files in the `public/` directory. They're served at the root URL path and work identically in dev and production.
|
| 286 |
+
|
| 287 |
+
```
|
| 288 |
+
public/
|
| 289 |
+
├── favicon.svg
|
| 290 |
+
├── images/
|
| 291 |
+
│ ├── logo.png
|
| 292 |
+
│ └── hero.jpg
|
| 293 |
+
├── fonts/
|
| 294 |
+
│ └── custom.woff2
|
| 295 |
+
└── og-image.jpg
|
| 296 |
+
```
|
| 297 |
+
|
| 298 |
+
Reference them with absolute paths:
|
| 299 |
+
|
| 300 |
+
```tsx
|
| 301 |
+
<img src="/images/logo.png" alt="Logo" />
|
| 302 |
+
<link rel="icon" href="/favicon.svg" />
|
| 303 |
+
```
|
| 304 |
+
|
| 305 |
+
In production, Vite copies the `public/` folder contents to `dist/` automatically.
|
| 306 |
+
|
| 307 |
+
**Use `public/` for**: favicons, Open Graph images, downloadable files, fonts, any asset that needs a stable/predictable URL.
|
| 308 |
+
|
| 309 |
+
#### Option 2: Import in Components (Bundled Assets)
|
| 310 |
+
|
| 311 |
+
Import assets directly in your React components. Vite handles bundling, optimization, and cache-busting via content hashes.
|
| 312 |
+
|
| 313 |
+
```tsx
|
| 314 |
+
// Images
|
| 315 |
+
import heroImage from '@/assets/hero.png';
|
| 316 |
+
|
| 317 |
+
function Hero() {
|
| 318 |
+
return <img src={heroImage} alt="Hero" />;
|
| 319 |
+
}
|
| 320 |
+
|
| 321 |
+
// JSON data
|
| 322 |
+
import config from '@/data/config.json';
|
| 323 |
+
|
| 324 |
+
function Settings() {
|
| 325 |
+
return <div>App version: {config.version}</div>;
|
| 326 |
+
}
|
| 327 |
+
|
| 328 |
+
// SVG as component (with ?react suffix)
|
| 329 |
+
import Logo from '@/assets/logo.svg?react';
|
| 330 |
+
|
| 331 |
+
function Header() {
|
| 332 |
+
return <Logo className="h-8 w-8" />;
|
| 333 |
+
}
|
| 334 |
+
```
|
| 335 |
+
|
| 336 |
+
Place imported assets in `src/assets/` or alongside components:
|
| 337 |
+
|
| 338 |
+
```
|
| 339 |
+
src/
|
| 340 |
+
├── assets/
|
| 341 |
+
│ ├── hero.png
|
| 342 |
+
│ └── logo.svg
|
| 343 |
+
├── data/
|
| 344 |
+
│ └── config.json
|
| 345 |
+
└── components/
|
| 346 |
+
└── Header.tsx
|
| 347 |
+
```
|
| 348 |
+
|
| 349 |
+
**Use imports for**: component-specific images, icons used in JSX, JSON configuration, any asset that benefits from bundling/tree-shaking.
|
| 350 |
+
|
| 351 |
+
#### Serving Files from the Workspace
|
| 352 |
+
|
| 353 |
+
For files outside the project (e.g., user's workspace files), create an API route:
|
| 354 |
+
|
| 355 |
+
```ts
|
| 356 |
+
app.get("/myfile", async (c) => {
|
| 357 |
+
const file = Bun.file("/path/to/file");
|
| 358 |
+
return new Response(file);
|
| 359 |
+
});
|
| 360 |
+
```
|
| 361 |
+
|
| 362 |
+
### Database
|
| 363 |
+
|
| 364 |
+
This application is database-agnostic and doesn't include a database by default. For most use cases, SQLite is recommended.
|
| 365 |
+
|
| 366 |
+
**Using Bun's Built-in SQLite:**
|
| 367 |
+
|
| 368 |
+
```ts
|
| 369 |
+
import { Database } from "bun:sqlite";
|
| 370 |
+
|
| 371 |
+
// Create/open database
|
| 372 |
+
const db = new Database("mydb.sqlite");
|
| 373 |
+
|
| 374 |
+
// Create table
|
| 375 |
+
db.run(`
|
| 376 |
+
CREATE TABLE IF NOT EXISTS users (
|
| 377 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 378 |
+
name TEXT NOT NULL,
|
| 379 |
+
email TEXT UNIQUE
|
| 380 |
+
)
|
| 381 |
+
`);
|
| 382 |
+
|
| 383 |
+
// Insert data
|
| 384 |
+
const insert = db.prepare("INSERT INTO users (name, email) VALUES (?, ?)");
|
| 385 |
+
insert.run("John Doe", "john@example.com");
|
| 386 |
+
|
| 387 |
+
// Query data
|
| 388 |
+
const query = db.query("SELECT * FROM users WHERE name = ?");
|
| 389 |
+
const users = query.all("John Doe");
|
| 390 |
+
|
| 391 |
+
// Close when done
|
| 392 |
+
db.close();
|
| 393 |
+
```
|
| 394 |
+
|
| 395 |
+
**In a Hono route:**
|
| 396 |
+
|
| 397 |
+
```ts
|
| 398 |
+
app.get("/api/users", (c) => {
|
| 399 |
+
const db = new Database("mydb.sqlite");
|
| 400 |
+
const users = db.query("SELECT * FROM users").all();
|
| 401 |
+
db.close();
|
| 402 |
+
return c.json({ users });
|
| 403 |
+
});
|
| 404 |
+
|
| 405 |
+
app.post("/api/users", async (c) => {
|
| 406 |
+
const { name, email } = await c.req.json();
|
| 407 |
+
const db = new Database("mydb.sqlite");
|
| 408 |
+
|
| 409 |
+
try {
|
| 410 |
+
const insert = db.prepare("INSERT INTO users (name, email) VALUES (?, ?)");
|
| 411 |
+
insert.run(name, email);
|
| 412 |
+
db.close();
|
| 413 |
+
return c.json({ success: true }, 201);
|
| 414 |
+
} catch (error) {
|
| 415 |
+
db.close();
|
| 416 |
+
return c.json({ error: "Failed to create user" }, 400);
|
| 417 |
+
}
|
| 418 |
+
});
|
| 419 |
+
```
|
| 420 |
+
|
| 421 |
+
## Scripts
|
| 422 |
+
|
| 423 |
+
- `bunx tsc --noEmit` - Type check
|
| 424 |
+
|
| 425 |
+
## Important Notes
|
| 426 |
+
|
| 427 |
+
### Server-Side vs Client-Side
|
| 428 |
+
|
| 429 |
+
- **Server code**: `server.ts`, `backend-lib/` - runs on Bun
|
| 430 |
+
- **Client code**: `src/` - runs in browser, bundled by Vite
|
| 431 |
+
- Install ALL dependencies via `bun add` (React, etc.) - Vite bundles them
|
| 432 |
+
|
| 433 |
+
### Environment Variables
|
| 434 |
+
|
| 435 |
+
- `NODE_ENV=production` switches to production mode
|
| 436 |
+
- `ZO_CLIENT_IDENTITY_TOKEN` required for calling Zo API
|
| 437 |
+
- Access server vars via `process.env.VAR_NAME` in server code
|
| 438 |
+
- Access client vars prefixed with `VITE_` via `import.meta.env.VITE_VAR_NAME` in React code
|
| 439 |
+
|
| 440 |
+
### File System Access
|
| 441 |
+
|
| 442 |
+
The server runs on the user's Zo computer and can:
|
| 443 |
+
- Read/write any file on the system
|
| 444 |
+
- Execute commands via `Bun.spawn()`
|
| 445 |
+
- Access local databases
|
| 446 |
+
|
| 447 |
+
### Configuration
|
| 448 |
+
|
| 449 |
+
`zosite.json` defines:
|
| 450 |
+
```json
|
| 451 |
+
{
|
| 452 |
+
"name": "My Site",
|
| 453 |
+
"local_port": 12345,
|
| 454 |
+
"entrypoint": "bun run dev",
|
| 455 |
+
"publish": {
|
| 456 |
+
"label": "My Site",
|
| 457 |
+
"type": "http",
|
| 458 |
+
"entrypoint": "bun run prod",
|
| 459 |
+
"published_port": 12346,
|
| 460 |
+
"env": {
|
| 461 |
+
"NODE_ENV": "production",
|
| 462 |
+
"ZO_CLIENT_IDENTITY_TOKEN": "none"
|
| 463 |
+
}
|
| 464 |
+
}
|
| 465 |
+
}
|
| 466 |
+
```
|
| 467 |
+
|
| 468 |
+
- Top-level `env`: Environment variables for **development mode**
|
| 469 |
+
- `publish.env`: Environment variables for **production mode**
|
| 470 |
+
- Variables prefixed with `VITE_` are exposed to client-side code via Vite
|
| 471 |
+
- `PORT` environment variable is automatically set to match `local_port` (or `published_port` in production)
|
| 472 |
+
|
| 473 |
+
### ⚠️ IMPORTANT: Do Not Edit `zosite.json` System Fields
|
| 474 |
+
|
| 475 |
+
**The `zosite.json` file is auto-generated by Zo. Most fields should not be manually edited.**
|
| 476 |
+
|
| 477 |
+
- `local_port` and `published_port` are assigned by the system when the site is created
|
| 478 |
+
- Ports are chosen using a hash-based algorithm to avoid conflicts
|
| 479 |
+
- The Zo system manages process lifecycle, tunneling, and URL routing based on these ports
|
| 480 |
+
- Editing ports or entrypoints will break the site's preview URL and publish functionality
|
| 481 |
+
|
| 482 |
+
**Safe to edit:**
|
| 483 |
+
- `name` - The display name for the site
|
| 484 |
+
- `env` and `publish.env` - Add or modify environment variables as needed
|
| 485 |
+
|
| 486 |
+
**Never edit:**
|
| 487 |
+
- `local_port`, `published_port` - System-assigned ports
|
| 488 |
+
- `entrypoint`, `publish.entrypoint` - Managed startup commands
|
| 489 |
+
- `label`, `type` - Service configuration
|
| 490 |
+
|
| 491 |
+
**Private vs Public Access:**
|
| 492 |
+
- **Private (default)**: Sites run in dev mode behind authentication. Only you can access them via the preview iframe in Zo. This is the normal development experience.
|
| 493 |
+
- **Public (published)**: Publishing creates a shareable URL that anyone on the internet can access without authentication.
|
| 494 |
+
|
| 495 |
+
To publish your site publicly, use the **Publish button** in the Zo UI or explicitly ask Zo to publish it (e.g., "publish this site", "make it public").
|
| 496 |
+
|
| 497 |
+
## Deployment
|
| 498 |
+
|
| 499 |
+
The site exports `{ fetch, port }` from `server.ts` for Zo's deployment system. The same code runs in both dev and production - mode is controlled by `NODE_ENV`.
|
backend-lib/zo-api.ts
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const API_URL = "https://api.zo.computer/zo/ask";
|
| 2 |
+
const REQUEST_TIMEOUT = 60000;
|
| 3 |
+
const MAX_RETRIES = 3;
|
| 4 |
+
const RETRY_DELAY = 2000;
|
| 5 |
+
|
| 6 |
+
interface ZoRequestData {
|
| 7 |
+
input: string;
|
| 8 |
+
output_format?: Record<string, unknown>;
|
| 9 |
+
conversation_id?: string;
|
| 10 |
+
}
|
| 11 |
+
|
| 12 |
+
interface ZoResponse {
|
| 13 |
+
output: unknown;
|
| 14 |
+
conversation_id?: string;
|
| 15 |
+
[key: string]: unknown;
|
| 16 |
+
}
|
| 17 |
+
|
| 18 |
+
export async function callZo(
|
| 19 |
+
input: string,
|
| 20 |
+
options?: {
|
| 21 |
+
outputFormat?: Record<string, unknown>;
|
| 22 |
+
conversationId?: string;
|
| 23 |
+
token?: string;
|
| 24 |
+
},
|
| 25 |
+
): Promise<ZoResponse> {
|
| 26 |
+
const token = options?.token ?? process.env.ZO_CLIENT_IDENTITY_TOKEN;
|
| 27 |
+
|
| 28 |
+
if (!token) {
|
| 29 |
+
throw new Error("ZO_CLIENT_IDENTITY_TOKEN is required");
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
const data: ZoRequestData = { input };
|
| 33 |
+
if (options?.outputFormat) {
|
| 34 |
+
data.output_format = options.outputFormat;
|
| 35 |
+
}
|
| 36 |
+
if (options?.conversationId) {
|
| 37 |
+
data.conversation_id = options.conversationId;
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
let lastError: Error | null = null;
|
| 41 |
+
|
| 42 |
+
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
| 43 |
+
try {
|
| 44 |
+
const controller = new AbortController();
|
| 45 |
+
const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);
|
| 46 |
+
|
| 47 |
+
const response = await fetch(API_URL, {
|
| 48 |
+
method: "POST",
|
| 49 |
+
headers: {
|
| 50 |
+
authorization: token,
|
| 51 |
+
"content-type": "application/json",
|
| 52 |
+
},
|
| 53 |
+
body: JSON.stringify(data),
|
| 54 |
+
signal: controller.signal,
|
| 55 |
+
});
|
| 56 |
+
|
| 57 |
+
clearTimeout(timeoutId);
|
| 58 |
+
|
| 59 |
+
if (response.ok) {
|
| 60 |
+
return (await response.json()) as ZoResponse;
|
| 61 |
+
}
|
| 62 |
+
|
| 63 |
+
const errorText = await response.text();
|
| 64 |
+
lastError = new Error(`HTTP ${response.status}: ${errorText}`);
|
| 65 |
+
console.error(
|
| 66 |
+
`Warning: Status ${response.status} on attempt ${attempt + 1}/${MAX_RETRIES}`,
|
| 67 |
+
);
|
| 68 |
+
} catch (error) {
|
| 69 |
+
lastError = error instanceof Error ? error : new Error(String(error));
|
| 70 |
+
console.error(
|
| 71 |
+
`Warning: Request failed on attempt ${attempt + 1}/${MAX_RETRIES}:`,
|
| 72 |
+
error,
|
| 73 |
+
);
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
if (attempt < MAX_RETRIES - 1) {
|
| 77 |
+
await new Promise((resolve) => setTimeout(resolve, RETRY_DELAY));
|
| 78 |
+
}
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
+
throw new Error(
|
| 82 |
+
`All ${MAX_RETRIES} retry attempts failed. Last error: ${lastError?.message}`,
|
| 83 |
+
);
|
| 84 |
+
}
|
bun.lock
ADDED
|
@@ -0,0 +1,662 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"lockfileVersion": 1,
|
| 3 |
+
"workspaces": {
|
| 4 |
+
"": {
|
| 5 |
+
"name": "zo-site",
|
| 6 |
+
"dependencies": {
|
| 7 |
+
"@dnd-kit/core": "^6.3.1",
|
| 8 |
+
"@dnd-kit/modifiers": "^9.0.0",
|
| 9 |
+
"@dnd-kit/sortable": "^10.0.0",
|
| 10 |
+
"@dnd-kit/utilities": "^3.2.2",
|
| 11 |
+
"@radix-ui/react-avatar": "^1.1.11",
|
| 12 |
+
"@radix-ui/react-checkbox": "^1.3.3",
|
| 13 |
+
"@radix-ui/react-dialog": "^1.1.15",
|
| 14 |
+
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
| 15 |
+
"@radix-ui/react-label": "^2.1.8",
|
| 16 |
+
"@radix-ui/react-select": "^2.2.6",
|
| 17 |
+
"@radix-ui/react-separator": "^1.1.8",
|
| 18 |
+
"@radix-ui/react-slot": "^1.2.4",
|
| 19 |
+
"@radix-ui/react-tabs": "^1.1.13",
|
| 20 |
+
"@radix-ui/react-toggle": "^1.1.10",
|
| 21 |
+
"@radix-ui/react-toggle-group": "^1.1.11",
|
| 22 |
+
"@radix-ui/react-tooltip": "^1.2.8",
|
| 23 |
+
"@tabler/icons-react": "^3.35.0",
|
| 24 |
+
"@tailwindcss/typography": "^0.5.19",
|
| 25 |
+
"@tailwindcss/vite": "^4.1.17",
|
| 26 |
+
"@tanstack/react-table": "^8.21.3",
|
| 27 |
+
"@vitejs/plugin-react-swc": "^4.2.2",
|
| 28 |
+
"class-variance-authority": "^0.7.1",
|
| 29 |
+
"clsx": "^2.1.1",
|
| 30 |
+
"hono": "^4.10.6",
|
| 31 |
+
"lucide-react": "^0.562.0",
|
| 32 |
+
"marked": "^17.0.1",
|
| 33 |
+
"next-themes": "^0.4.6",
|
| 34 |
+
"react": "^19.2.0",
|
| 35 |
+
"react-dom": "^19.2.0",
|
| 36 |
+
"react-router-dom": "^7.9.6",
|
| 37 |
+
"recharts": "^3.6.0",
|
| 38 |
+
"reveal.js": "^5.2.1",
|
| 39 |
+
"sonner": "^2.0.7",
|
| 40 |
+
"tailwind-merge": "^3.4.0",
|
| 41 |
+
"tailwindcss": "^4.1.17",
|
| 42 |
+
"tw-animate-css": "^1.4.0",
|
| 43 |
+
"vaul": "^1.1.2",
|
| 44 |
+
"vite": "^7.2.4",
|
| 45 |
+
"zod": "^4.1.13",
|
| 46 |
+
},
|
| 47 |
+
"devDependencies": {
|
| 48 |
+
"@types/bun": "1.2.21",
|
| 49 |
+
"@types/react": "^19.2.7",
|
| 50 |
+
"@types/react-dom": "^19.2.3",
|
| 51 |
+
"typescript": "^5.9.3",
|
| 52 |
+
},
|
| 53 |
+
},
|
| 54 |
+
},
|
| 55 |
+
"packages": {
|
| 56 |
+
"@dnd-kit/accessibility": ["@dnd-kit/accessibility@3.1.1", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw=="],
|
| 57 |
+
|
| 58 |
+
"@dnd-kit/core": ["@dnd-kit/core@6.3.1", "", { "dependencies": { "@dnd-kit/accessibility": "^3.1.1", "@dnd-kit/utilities": "^3.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ=="],
|
| 59 |
+
|
| 60 |
+
"@dnd-kit/modifiers": ["@dnd-kit/modifiers@9.0.0", "", { "dependencies": { "@dnd-kit/utilities": "^3.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@dnd-kit/core": "^6.3.0", "react": ">=16.8.0" } }, "sha512-ybiLc66qRGuZoC20wdSSG6pDXFikui/dCNGthxv4Ndy8ylErY0N3KVxY2bgo7AWwIbxDmXDg3ylAFmnrjcbVvw=="],
|
| 61 |
+
|
| 62 |
+
"@dnd-kit/sortable": ["@dnd-kit/sortable@10.0.0", "", { "dependencies": { "@dnd-kit/utilities": "^3.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@dnd-kit/core": "^6.3.0", "react": ">=16.8.0" } }, "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg=="],
|
| 63 |
+
|
| 64 |
+
"@dnd-kit/utilities": ["@dnd-kit/utilities@3.2.2", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg=="],
|
| 65 |
+
|
| 66 |
+
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-nGsF/4C7uzUj+Nj/4J+Zt0bYQ6bz33Phz8Lb2N80Mti1HjGclTJdXZ+9APC4kLvONbjxN1zfvYNd8FEcbBK/MQ=="],
|
| 67 |
+
|
| 68 |
+
"@esbuild/android-arm": ["@esbuild/android-arm@0.27.5", "", { "os": "android", "cpu": "arm" }, "sha512-Cv781jd0Rfj/paoNrul1/r4G0HLvuFKYh7C9uHZ2Pl8YXstzvCyyeWENTFR9qFnRzNMCjXmsulZuvosDg10Mog=="],
|
| 69 |
+
|
| 70 |
+
"@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.5", "", { "os": "android", "cpu": "arm64" }, "sha512-Oeghq+XFgh1pUGd1YKs4DDoxzxkoUkvko+T/IVKwlghKLvvjbGFB3ek8VEDBmNvqhwuL0CQS3cExdzpmUyIrgA=="],
|
| 71 |
+
|
| 72 |
+
"@esbuild/android-x64": ["@esbuild/android-x64@0.27.5", "", { "os": "android", "cpu": "x64" }, "sha512-nQD7lspbzerlmtNOxYMFAGmhxgzn8Z7m9jgFkh6kpkjsAhZee1w8tJW3ZlW+N9iRePz0oPUDrYrXidCPSImD0Q=="],
|
| 73 |
+
|
| 74 |
+
"@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-I+Ya/MgC6rr8oRWGRDF3BXDfP8K1BVUggHqN6VI2lUZLdDi1IM1v2cy0e3lCPbP+pVcK3Tv8cgUhHse1kaNZZw=="],
|
| 75 |
+
|
| 76 |
+
"@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-MCjQUtC8wWJn/pIPM7vQaO69BFgwPD1jriEdqwTCKzWjGgkMbcg+M5HzrOhPhuYe1AJjXlHmD142KQf+jnYj8A=="],
|
| 77 |
+
|
| 78 |
+
"@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-X6xVS+goSH0UelYXnuf4GHLwpOdc8rgK/zai+dKzBMnncw7BTQIwquOodE7EKvY2UVUetSqyAfyZC1D+oqLQtg=="],
|
| 79 |
+
|
| 80 |
+
"@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-233X1FGo3a8x1ekLB6XT69LfZ83vqz+9z3TSEQCTYfMNY880A97nr81KbPcAMl9rmOFp11wO0dP+eB18KU/Ucg=="],
|
| 81 |
+
|
| 82 |
+
"@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.5", "", { "os": "linux", "cpu": "arm" }, "sha512-0wkVrYHG4sdCCN/bcwQ7yYMXACkaHc3UFeaEOwSVW6e5RycMageYAFv+JS2bKLwHyeKVUvtoVH+5/RHq0fgeFw=="],
|
| 83 |
+
|
| 84 |
+
"@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-euKkilsNOv7x/M1NKsx5znyprbpsRFIzTV6lWziqJch7yWYayfLtZzDxDTl+LSQDJYAjd9TVb/Kt5UKIrj2e4A=="],
|
| 85 |
+
|
| 86 |
+
"@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-hVRQX4+P3MS36NxOy24v/Cdsimy/5HYePw+tmPqnNN1fxV0bPrFWR6TMqwXPwoTM2VzbkA+4lbHWUKDd5ZDA/w=="],
|
| 87 |
+
|
| 88 |
+
"@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.5", "", { "os": "linux", "cpu": "none" }, "sha512-mKqqRuOPALI8nDzhOBmIS0INvZOOFGGg5n1osGIXAx8oersceEbKd4t1ACNTHM3sJBXGFAlEgqM+svzjPot+ZQ=="],
|
| 89 |
+
|
| 90 |
+
"@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.5", "", { "os": "linux", "cpu": "none" }, "sha512-EE/QXH9IyaAj1qeuIV5+/GZkBTipgGO782Ff7Um3vPS9cvLhJJeATy4Ggxikz2inZ46KByamMn6GqtqyVjhenA=="],
|
| 91 |
+
|
| 92 |
+
"@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-0V2iF1RGxBf1b7/BjurA5jfkl7PtySjom1r6xOK2q9KWw/XCpAdtB6KNMO+9xx69yYfSCRR9FE0TyKfHA2eQMw=="],
|
| 93 |
+
|
| 94 |
+
"@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.5", "", { "os": "linux", "cpu": "none" }, "sha512-rYxThBx6G9HN6tFNuvB/vykeLi4VDsm5hE5pVwzqbAjZEARQrWu3noZSfbEnPZ/CRXP3271GyFk/49up2W190g=="],
|
| 95 |
+
|
| 96 |
+
"@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-uEP2q/4qgd8goEUc4QIdU/1P2NmEtZ/zX5u3OpLlCGhJIuBIv0s0wr7TB2nBrd3/A5XIdEkkS5ZLF0ULuvaaYQ=="],
|
| 97 |
+
|
| 98 |
+
"@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.5", "", { "os": "linux", "cpu": "x64" }, "sha512-+Gq47Wqq6PLOOZuBzVSII2//9yyHNKZLuwfzCemqexqOQCSz0zy0O26kIzyp9EMNMK+nZ0tFHBZrCeVUuMs/ew=="],
|
| 99 |
+
|
| 100 |
+
"@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.5", "", { "os": "none", "cpu": "arm64" }, "sha512-3F/5EG8VHfN/I+W5cO1/SV2H9Q/5r7vcHabMnBqhHK2lTWOh3F8vixNzo8lqxrlmBtZVFpW8pmITHnq54+Tq4g=="],
|
| 101 |
+
|
| 102 |
+
"@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.5", "", { "os": "none", "cpu": "x64" }, "sha512-28t+Sj3CPN8vkMOlZotOmDgilQwVvxWZl7b8rxpn73Tt/gCnvrHxQUMng4uu3itdFvrtba/1nHejvxqz8xgEMA=="],
|
| 103 |
+
|
| 104 |
+
"@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.5", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Doz/hKtiuVAi9hMsBMpwBANhIZc8l238U2Onko3t2xUp8xtM0ZKdDYHMnm/qPFVthY8KtxkXaocwmMh6VolzMA=="],
|
| 105 |
+
|
| 106 |
+
"@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-WfGVaa1oz5A7+ZFPkERIbIhKT4olvGl1tyzTRaB5yoZRLqC0KwaO95FeZtOdQj/oKkjW57KcVF944m62/0GYtA=="],
|
| 107 |
+
|
| 108 |
+
"@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.5", "", { "os": "none", "cpu": "arm64" }, "sha512-Xh+VRuh6OMh3uJ0JkCjI57l+DVe7VRGBYymen8rFPnTVgATBwA6nmToxM2OwTlSvrnWpPKkrQUj93+K9huYC6A=="],
|
| 109 |
+
|
| 110 |
+
"@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-aC1gpJkkaUADHuAdQfuVTnqVUTLqqUNhAvEwHwVWcnVVZvNlDPGA0UveZsfXJJ9T6k9Po4eHi3c02gbdwO3g6w=="],
|
| 111 |
+
|
| 112 |
+
"@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-0UNx2aavV0fk6UpZcwXFLztA2r/k9jTUa7OW7SAea1VYUhkug99MW1uZeXEnPn5+cHOd0n8myQay6TlFnBR07w=="],
|
| 113 |
+
|
| 114 |
+
"@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-5nlJ3AeJWCTSzR7AEqVjT/faWyqKU86kCi1lLmxVqmNR+j4HrYdns+eTGjS/vmrzCIe8inGQckUadvS0+JkKdQ=="],
|
| 115 |
+
|
| 116 |
+
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.5", "", { "os": "win32", "cpu": "x64" }, "sha512-PWypQR+d4FLfkhBIV+/kHsUELAnMpx1bRvvsn3p+/sAERbnCzFrtDRG2Xw5n+2zPxBK2+iaP+vetsRl4Ti7WgA=="],
|
| 117 |
+
|
| 118 |
+
"@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="],
|
| 119 |
+
|
| 120 |
+
"@floating-ui/dom": ["@floating-ui/dom@1.7.6", "", { "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" } }, "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ=="],
|
| 121 |
+
|
| 122 |
+
"@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.8", "", { "dependencies": { "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A=="],
|
| 123 |
+
|
| 124 |
+
"@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="],
|
| 125 |
+
|
| 126 |
+
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
|
| 127 |
+
|
| 128 |
+
"@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
|
| 129 |
+
|
| 130 |
+
"@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
|
| 131 |
+
|
| 132 |
+
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
|
| 133 |
+
|
| 134 |
+
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
|
| 135 |
+
|
| 136 |
+
"@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="],
|
| 137 |
+
|
| 138 |
+
"@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="],
|
| 139 |
+
|
| 140 |
+
"@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w=="],
|
| 141 |
+
|
| 142 |
+
"@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.11", "", { "dependencies": { "@radix-ui/react-context": "1.1.3", "@radix-ui/react-primitive": "2.1.4", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q=="],
|
| 143 |
+
|
| 144 |
+
"@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.3.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw=="],
|
| 145 |
+
|
| 146 |
+
"@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="],
|
| 147 |
+
|
| 148 |
+
"@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="],
|
| 149 |
+
|
| 150 |
+
"@radix-ui/react-context": ["@radix-ui/react-context@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw=="],
|
| 151 |
+
|
| 152 |
+
"@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw=="],
|
| 153 |
+
|
| 154 |
+
"@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="],
|
| 155 |
+
|
| 156 |
+
"@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg=="],
|
| 157 |
+
|
| 158 |
+
"@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw=="],
|
| 159 |
+
|
| 160 |
+
"@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw=="],
|
| 161 |
+
|
| 162 |
+
"@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="],
|
| 163 |
+
|
| 164 |
+
"@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="],
|
| 165 |
+
|
| 166 |
+
"@radix-ui/react-label": ["@radix-ui/react-label@2.1.8", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A=="],
|
| 167 |
+
|
| 168 |
+
"@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg=="],
|
| 169 |
+
|
| 170 |
+
"@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.8", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw=="],
|
| 171 |
+
|
| 172 |
+
"@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="],
|
| 173 |
+
|
| 174 |
+
"@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.5", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ=="],
|
| 175 |
+
|
| 176 |
+
"@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.4", "", { "dependencies": { "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg=="],
|
| 177 |
+
|
| 178 |
+
"@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA=="],
|
| 179 |
+
|
| 180 |
+
"@radix-ui/react-select": ["@radix-ui/react-select@2.2.6", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ=="],
|
| 181 |
+
|
| 182 |
+
"@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.8", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.4" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g=="],
|
| 183 |
+
|
| 184 |
+
"@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA=="],
|
| 185 |
+
|
| 186 |
+
"@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A=="],
|
| 187 |
+
|
| 188 |
+
"@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.1.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ=="],
|
| 189 |
+
|
| 190 |
+
"@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-toggle": "1.1.10", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q=="],
|
| 191 |
+
|
| 192 |
+
"@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg=="],
|
| 193 |
+
|
| 194 |
+
"@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="],
|
| 195 |
+
|
| 196 |
+
"@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="],
|
| 197 |
+
|
| 198 |
+
"@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="],
|
| 199 |
+
|
| 200 |
+
"@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="],
|
| 201 |
+
|
| 202 |
+
"@radix-ui/react-use-is-hydrated": ["@radix-ui/react-use-is-hydrated@0.1.0", "", { "dependencies": { "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA=="],
|
| 203 |
+
|
| 204 |
+
"@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="],
|
| 205 |
+
|
| 206 |
+
"@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ=="],
|
| 207 |
+
|
| 208 |
+
"@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.1", "", { "dependencies": { "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w=="],
|
| 209 |
+
|
| 210 |
+
"@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="],
|
| 211 |
+
|
| 212 |
+
"@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug=="],
|
| 213 |
+
|
| 214 |
+
"@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="],
|
| 215 |
+
|
| 216 |
+
"@reduxjs/toolkit": ["@reduxjs/toolkit@2.11.2", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@standard-schema/utils": "^0.3.0", "immer": "^11.0.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "reselect": "^5.1.0" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" }, "optionalPeers": ["react", "react-redux"] }, "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ=="],
|
| 217 |
+
|
| 218 |
+
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.7", "", {}, "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA=="],
|
| 219 |
+
|
| 220 |
+
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.60.1", "", { "os": "android", "cpu": "arm" }, "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA=="],
|
| 221 |
+
|
| 222 |
+
"@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.60.1", "", { "os": "android", "cpu": "arm64" }, "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA=="],
|
| 223 |
+
|
| 224 |
+
"@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.60.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw=="],
|
| 225 |
+
|
| 226 |
+
"@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.60.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew=="],
|
| 227 |
+
|
| 228 |
+
"@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.60.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w=="],
|
| 229 |
+
|
| 230 |
+
"@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.60.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g=="],
|
| 231 |
+
|
| 232 |
+
"@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.60.1", "", { "os": "linux", "cpu": "arm" }, "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g=="],
|
| 233 |
+
|
| 234 |
+
"@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.60.1", "", { "os": "linux", "cpu": "arm" }, "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg=="],
|
| 235 |
+
|
| 236 |
+
"@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.60.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ=="],
|
| 237 |
+
|
| 238 |
+
"@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.60.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA=="],
|
| 239 |
+
|
| 240 |
+
"@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ=="],
|
| 241 |
+
|
| 242 |
+
"@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw=="],
|
| 243 |
+
|
| 244 |
+
"@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.60.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw=="],
|
| 245 |
+
|
| 246 |
+
"@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.60.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg=="],
|
| 247 |
+
|
| 248 |
+
"@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg=="],
|
| 249 |
+
|
| 250 |
+
"@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg=="],
|
| 251 |
+
|
| 252 |
+
"@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.60.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ=="],
|
| 253 |
+
|
| 254 |
+
"@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.60.1", "", { "os": "linux", "cpu": "x64" }, "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg=="],
|
| 255 |
+
|
| 256 |
+
"@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.60.1", "", { "os": "linux", "cpu": "x64" }, "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w=="],
|
| 257 |
+
|
| 258 |
+
"@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.60.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw=="],
|
| 259 |
+
|
| 260 |
+
"@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.60.1", "", { "os": "none", "cpu": "arm64" }, "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA=="],
|
| 261 |
+
|
| 262 |
+
"@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.60.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g=="],
|
| 263 |
+
|
| 264 |
+
"@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.60.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg=="],
|
| 265 |
+
|
| 266 |
+
"@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.60.1", "", { "os": "win32", "cpu": "x64" }, "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg=="],
|
| 267 |
+
|
| 268 |
+
"@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.60.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ=="],
|
| 269 |
+
|
| 270 |
+
"@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
|
| 271 |
+
|
| 272 |
+
"@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="],
|
| 273 |
+
|
| 274 |
+
"@swc/core": ["@swc/core@1.15.21", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.25" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.15.21", "@swc/core-darwin-x64": "1.15.21", "@swc/core-linux-arm-gnueabihf": "1.15.21", "@swc/core-linux-arm64-gnu": "1.15.21", "@swc/core-linux-arm64-musl": "1.15.21", "@swc/core-linux-ppc64-gnu": "1.15.21", "@swc/core-linux-s390x-gnu": "1.15.21", "@swc/core-linux-x64-gnu": "1.15.21", "@swc/core-linux-x64-musl": "1.15.21", "@swc/core-win32-arm64-msvc": "1.15.21", "@swc/core-win32-ia32-msvc": "1.15.21", "@swc/core-win32-x64-msvc": "1.15.21" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-fkk7NJcBscrR3/F8jiqlMptRHP650NxqDnspBMrRe5d8xOoCy9MLL5kOBLFXjFLfMo3KQQHhk+/jUULOMlR1uQ=="],
|
| 275 |
+
|
| 276 |
+
"@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.15.21", "", { "os": "darwin", "cpu": "arm64" }, "sha512-SA8SFg9dp0qKRH8goWsax6bptFE2EdmPf2YRAQW9WoHGf3XKM1bX0nd5UdwxmC5hXsBUZAYf7xSciCler6/oyA=="],
|
| 277 |
+
|
| 278 |
+
"@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.15.21", "", { "os": "darwin", "cpu": "x64" }, "sha512-//fOVntgowz9+V90lVsNCtyyrtbHp3jWH6Rch7MXHXbcvbLmbCTmssl5DeedUWLLGiAAW1wksBdqdGYOTjaNLw=="],
|
| 279 |
+
|
| 280 |
+
"@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.15.21", "", { "os": "linux", "cpu": "arm" }, "sha512-meNI4Sh6h9h8DvIfEc0l5URabYMSuNvyisLmG6vnoYAS43s8ON3NJR8sDHvdP7NJTrLe0q/x2XCn6yL/BeHcZg=="],
|
| 281 |
+
|
| 282 |
+
"@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.15.21", "", { "os": "linux", "cpu": "arm64" }, "sha512-QrXlNQnHeXqU2EzLlnsPoWEh8/GtNJLvfMiPsDhk+ht6Xv8+vhvZ5YZ/BokNWSIZiWPKLAqR0M7T92YF5tmD3g=="],
|
| 283 |
+
|
| 284 |
+
"@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.15.21", "", { "os": "linux", "cpu": "arm64" }, "sha512-8/yGCMO333ultDaMQivE5CjO6oXDPeeg1IV4sphojPkb0Pv0i6zvcRIkgp60xDB+UxLr6VgHgt+BBgqS959E9g=="],
|
| 285 |
+
|
| 286 |
+
"@swc/core-linux-ppc64-gnu": ["@swc/core-linux-ppc64-gnu@1.15.21", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ucW0HzPx0s1dgRvcvuLSPSA/2Kk/VYTv9st8qe1Kc22Gu0Q0rH9+6TcBTmMuNIp0Xs4BPr1uBttmbO1wEGI49Q=="],
|
| 287 |
+
|
| 288 |
+
"@swc/core-linux-s390x-gnu": ["@swc/core-linux-s390x-gnu@1.15.21", "", { "os": "linux", "cpu": "s390x" }, "sha512-ulTnOGc5I7YRObE/9NreAhQg94QkiR5qNhhcUZ1iFAYjzg/JGAi1ch+s/Ixe61pMIr8bfVrF0NOaB0f8wjaAfA=="],
|
| 289 |
+
|
| 290 |
+
"@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.15.21", "", { "os": "linux", "cpu": "x64" }, "sha512-D0RokxtM+cPvSqJIKR6uja4hbD+scI9ezo95mBhfSyLUs9wnPPl26sLp1ZPR/EXRdYm3F3S6RUtVi+8QXhT24Q=="],
|
| 291 |
+
|
| 292 |
+
"@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.15.21", "", { "os": "linux", "cpu": "x64" }, "sha512-nER8u7VeRfmU6fMDzl1NQAbbB/G7O2avmvCOwIul1uGkZ2/acbPH+DCL9h5+0yd/coNcxMBTL6NGepIew+7C2w=="],
|
| 293 |
+
|
| 294 |
+
"@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.15.21", "", { "os": "win32", "cpu": "arm64" }, "sha512-+/AgNBnjYugUA8C0Do4YzymgvnGbztv7j8HKSQLvR/DQgZPoXQ2B3PqB2mTtGh/X5DhlJWiqnunN35JUgWcAeQ=="],
|
| 295 |
+
|
| 296 |
+
"@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.15.21", "", { "os": "win32", "cpu": "ia32" }, "sha512-IkSZj8PX/N4HcaFhMQtzmkV8YSnuNoJ0E6OvMwFiOfejPhiKXvl7CdDsn1f4/emYEIDO3fpgZW9DTaCRMDxaDA=="],
|
| 297 |
+
|
| 298 |
+
"@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.15.21", "", { "os": "win32", "cpu": "x64" }, "sha512-zUyWso7OOENB6e1N1hNuNn8vbvLsTdKQ5WKLgt/JcBNfJhKy/6jmBmqI3GXk/MyvQKd5SLvP7A0F36p7TeDqvw=="],
|
| 299 |
+
|
| 300 |
+
"@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="],
|
| 301 |
+
|
| 302 |
+
"@swc/types": ["@swc/types@0.1.26", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw=="],
|
| 303 |
+
|
| 304 |
+
"@tabler/icons": ["@tabler/icons@3.41.1", "", {}, "sha512-OaRnVbRmH2nHtFeg+RmMJ/7m2oBIF9XCJAUD5gQnMrpK9f05ydj8MZrAf3NZQqOXyxGN1UBL0D5IKLLEUfr74Q=="],
|
| 305 |
+
|
| 306 |
+
"@tabler/icons-react": ["@tabler/icons-react@3.41.1", "", { "dependencies": { "@tabler/icons": "3.41.1" }, "peerDependencies": { "react": ">= 16" } }, "sha512-kUgweE+DJtAlMZVIns1FTDdcbpRVnkK7ZpUOXmoxy3JAF0rSHj0TcP4VHF14+gMJGnF+psH2Zt26BLT6owetBA=="],
|
| 307 |
+
|
| 308 |
+
"@tailwindcss/node": ["@tailwindcss/node@4.2.2", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.2" } }, "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA=="],
|
| 309 |
+
|
| 310 |
+
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.2.2", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.2.2", "@tailwindcss/oxide-darwin-arm64": "4.2.2", "@tailwindcss/oxide-darwin-x64": "4.2.2", "@tailwindcss/oxide-freebsd-x64": "4.2.2", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", "@tailwindcss/oxide-linux-x64-musl": "4.2.2", "@tailwindcss/oxide-wasm32-wasi": "4.2.2", "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" } }, "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg=="],
|
| 311 |
+
|
| 312 |
+
"@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.2.2", "", { "os": "android", "cpu": "arm64" }, "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg=="],
|
| 313 |
+
|
| 314 |
+
"@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg=="],
|
| 315 |
+
|
| 316 |
+
"@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.2.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw=="],
|
| 317 |
+
|
| 318 |
+
"@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.2.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ=="],
|
| 319 |
+
|
| 320 |
+
"@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2", "", { "os": "linux", "cpu": "arm" }, "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ=="],
|
| 321 |
+
|
| 322 |
+
"@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw=="],
|
| 323 |
+
|
| 324 |
+
"@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag=="],
|
| 325 |
+
|
| 326 |
+
"@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg=="],
|
| 327 |
+
|
| 328 |
+
"@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ=="],
|
| 329 |
+
|
| 330 |
+
"@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.2.2", "", { "dependencies": { "@emnapi/core": "^1.8.1", "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q=="],
|
| 331 |
+
|
| 332 |
+
"@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.2.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ=="],
|
| 333 |
+
|
| 334 |
+
"@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.2", "", { "os": "win32", "cpu": "x64" }, "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA=="],
|
| 335 |
+
|
| 336 |
+
"@tailwindcss/typography": ["@tailwindcss/typography@0.5.19", "", { "dependencies": { "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg=="],
|
| 337 |
+
|
| 338 |
+
"@tailwindcss/vite": ["@tailwindcss/vite@4.2.2", "", { "dependencies": { "@tailwindcss/node": "4.2.2", "@tailwindcss/oxide": "4.2.2", "tailwindcss": "4.2.2" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w=="],
|
| 339 |
+
|
| 340 |
+
"@tanstack/react-table": ["@tanstack/react-table@8.21.3", "", { "dependencies": { "@tanstack/table-core": "8.21.3" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww=="],
|
| 341 |
+
|
| 342 |
+
"@tanstack/table-core": ["@tanstack/table-core@8.21.3", "", {}, "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg=="],
|
| 343 |
+
|
| 344 |
+
"@types/bun": ["@types/bun@1.2.21", "", { "dependencies": { "bun-types": "1.2.21" } }, "sha512-NiDnvEqmbfQ6dmZ3EeUO577s4P5bf4HCTXtI6trMc6f6RzirY5IrF3aIookuSpyslFzrnvv2lmEWv5HyC1X79A=="],
|
| 345 |
+
|
| 346 |
+
"@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="],
|
| 347 |
+
|
| 348 |
+
"@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="],
|
| 349 |
+
|
| 350 |
+
"@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="],
|
| 351 |
+
|
| 352 |
+
"@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="],
|
| 353 |
+
|
| 354 |
+
"@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="],
|
| 355 |
+
|
| 356 |
+
"@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="],
|
| 357 |
+
|
| 358 |
+
"@types/d3-shape": ["@types/d3-shape@3.1.8", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w=="],
|
| 359 |
+
|
| 360 |
+
"@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="],
|
| 361 |
+
|
| 362 |
+
"@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="],
|
| 363 |
+
|
| 364 |
+
"@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
|
| 365 |
+
|
| 366 |
+
"@types/node": ["@types/node@25.5.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="],
|
| 367 |
+
|
| 368 |
+
"@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="],
|
| 369 |
+
|
| 370 |
+
"@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="],
|
| 371 |
+
|
| 372 |
+
"@types/use-sync-external-store": ["@types/use-sync-external-store@0.0.6", "", {}, "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg=="],
|
| 373 |
+
|
| 374 |
+
"@vitejs/plugin-react-swc": ["@vitejs/plugin-react-swc@4.3.0", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.7", "@swc/core": "^1.15.11" }, "peerDependencies": { "vite": "^4 || ^5 || ^6 || ^7 || ^8" } }, "sha512-mOkXCII839dHyAt/gpoSlm28JIVDwhZ6tnG6wJxUy2bmOx7UaPjvOyIDf3SFv5s7Eo7HVaq6kRcu6YMEzt5Z7w=="],
|
| 375 |
+
|
| 376 |
+
"aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="],
|
| 377 |
+
|
| 378 |
+
"bun-types": ["bun-types@1.2.21", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-sa2Tj77Ijc/NTLS0/Odjq/qngmEPZfbfnOERi0KRUYhT9R8M4VBioWVmMWE5GrYbKMc+5lVybXygLdibHaqVqw=="],
|
| 379 |
+
|
| 380 |
+
"class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="],
|
| 381 |
+
|
| 382 |
+
"clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
|
| 383 |
+
|
| 384 |
+
"cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
|
| 385 |
+
|
| 386 |
+
"cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
|
| 387 |
+
|
| 388 |
+
"csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
|
| 389 |
+
|
| 390 |
+
"d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="],
|
| 391 |
+
|
| 392 |
+
"d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="],
|
| 393 |
+
|
| 394 |
+
"d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="],
|
| 395 |
+
|
| 396 |
+
"d3-format": ["d3-format@3.1.2", "", {}, "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg=="],
|
| 397 |
+
|
| 398 |
+
"d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="],
|
| 399 |
+
|
| 400 |
+
"d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="],
|
| 401 |
+
|
| 402 |
+
"d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="],
|
| 403 |
+
|
| 404 |
+
"d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="],
|
| 405 |
+
|
| 406 |
+
"d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="],
|
| 407 |
+
|
| 408 |
+
"d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="],
|
| 409 |
+
|
| 410 |
+
"d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="],
|
| 411 |
+
|
| 412 |
+
"decimal.js-light": ["decimal.js-light@2.5.1", "", {}, "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="],
|
| 413 |
+
|
| 414 |
+
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
|
| 415 |
+
|
| 416 |
+
"detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="],
|
| 417 |
+
|
| 418 |
+
"enhanced-resolve": ["enhanced-resolve@5.20.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA=="],
|
| 419 |
+
|
| 420 |
+
"es-toolkit": ["es-toolkit@1.45.1", "", {}, "sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw=="],
|
| 421 |
+
|
| 422 |
+
"esbuild": ["esbuild@0.27.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.5", "@esbuild/android-arm": "0.27.5", "@esbuild/android-arm64": "0.27.5", "@esbuild/android-x64": "0.27.5", "@esbuild/darwin-arm64": "0.27.5", "@esbuild/darwin-x64": "0.27.5", "@esbuild/freebsd-arm64": "0.27.5", "@esbuild/freebsd-x64": "0.27.5", "@esbuild/linux-arm": "0.27.5", "@esbuild/linux-arm64": "0.27.5", "@esbuild/linux-ia32": "0.27.5", "@esbuild/linux-loong64": "0.27.5", "@esbuild/linux-mips64el": "0.27.5", "@esbuild/linux-ppc64": "0.27.5", "@esbuild/linux-riscv64": "0.27.5", "@esbuild/linux-s390x": "0.27.5", "@esbuild/linux-x64": "0.27.5", "@esbuild/netbsd-arm64": "0.27.5", "@esbuild/netbsd-x64": "0.27.5", "@esbuild/openbsd-arm64": "0.27.5", "@esbuild/openbsd-x64": "0.27.5", "@esbuild/openharmony-arm64": "0.27.5", "@esbuild/sunos-x64": "0.27.5", "@esbuild/win32-arm64": "0.27.5", "@esbuild/win32-ia32": "0.27.5", "@esbuild/win32-x64": "0.27.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-zdQoHBjuDqKsvV5OPaWansOwfSQ0Js+Uj9J85TBvj3bFW1JjWTSULMRwdQAc8qMeIScbClxeMK0jlrtB9linhA=="],
|
| 423 |
+
|
| 424 |
+
"eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="],
|
| 425 |
+
|
| 426 |
+
"fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
|
| 427 |
+
|
| 428 |
+
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
|
| 429 |
+
|
| 430 |
+
"get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="],
|
| 431 |
+
|
| 432 |
+
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
|
| 433 |
+
|
| 434 |
+
"hono": ["hono@4.12.9", "", {}, "sha512-wy3T8Zm2bsEvxKZM5w21VdHDDcwVS1yUFFY6i8UobSsKfFceT7TOwhbhfKsDyx7tYQlmRM5FLpIuYvNFyjctiA=="],
|
| 435 |
+
|
| 436 |
+
"immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="],
|
| 437 |
+
|
| 438 |
+
"internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="],
|
| 439 |
+
|
| 440 |
+
"jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
|
| 441 |
+
|
| 442 |
+
"lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
|
| 443 |
+
|
| 444 |
+
"lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="],
|
| 445 |
+
|
| 446 |
+
"lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="],
|
| 447 |
+
|
| 448 |
+
"lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="],
|
| 449 |
+
|
| 450 |
+
"lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="],
|
| 451 |
+
|
| 452 |
+
"lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="],
|
| 453 |
+
|
| 454 |
+
"lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="],
|
| 455 |
+
|
| 456 |
+
"lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="],
|
| 457 |
+
|
| 458 |
+
"lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="],
|
| 459 |
+
|
| 460 |
+
"lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="],
|
| 461 |
+
|
| 462 |
+
"lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="],
|
| 463 |
+
|
| 464 |
+
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
|
| 465 |
+
|
| 466 |
+
"lucide-react": ["lucide-react@0.562.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw=="],
|
| 467 |
+
|
| 468 |
+
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
|
| 469 |
+
|
| 470 |
+
"marked": ["marked@17.0.5", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-6hLvc0/JEbRjRgzI6wnT2P1XuM1/RrrDEX0kPt0N7jGm1133g6X7DlxFasUIx+72aKAr904GTxhSLDrd5DIlZg=="],
|
| 471 |
+
|
| 472 |
+
"nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
|
| 473 |
+
|
| 474 |
+
"next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="],
|
| 475 |
+
|
| 476 |
+
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
| 477 |
+
|
| 478 |
+
"picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
|
| 479 |
+
|
| 480 |
+
"postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="],
|
| 481 |
+
|
| 482 |
+
"postcss-selector-parser": ["postcss-selector-parser@6.0.10", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="],
|
| 483 |
+
|
| 484 |
+
"react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="],
|
| 485 |
+
|
| 486 |
+
"react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="],
|
| 487 |
+
|
| 488 |
+
"react-is": ["react-is@19.2.4", "", {}, "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA=="],
|
| 489 |
+
|
| 490 |
+
"react-redux": ["react-redux@9.2.0", "", { "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "@types/react": "^18.2.25 || ^19", "react": "^18.0 || ^19", "redux": "^5.0.0" }, "optionalPeers": ["@types/react", "redux"] }, "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g=="],
|
| 491 |
+
|
| 492 |
+
"react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="],
|
| 493 |
+
|
| 494 |
+
"react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="],
|
| 495 |
+
|
| 496 |
+
"react-router": ["react-router@7.13.2", "", { "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalPeers": ["react-dom"] }, "sha512-tX1Aee+ArlKQP+NIUd7SE6Li+CiGKwQtbS+FfRxPX6Pe4vHOo6nr9d++u5cwg+Z8K/x8tP+7qLmujDtfrAoUJA=="],
|
| 497 |
+
|
| 498 |
+
"react-router-dom": ["react-router-dom@7.13.2", "", { "dependencies": { "react-router": "7.13.2" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-aR7SUORwTqAW0JDeiWF07e9SBE9qGpByR9I8kJT5h/FrBKxPMS6TiC7rmVO+gC0q52Bx7JnjWe8Z1sR9faN4YA=="],
|
| 499 |
+
|
| 500 |
+
"react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="],
|
| 501 |
+
|
| 502 |
+
"recharts": ["recharts@3.8.1", "", { "dependencies": { "@reduxjs/toolkit": "^1.9.0 || 2.x.x", "clsx": "^2.1.1", "decimal.js-light": "^2.5.1", "es-toolkit": "^1.39.3", "eventemitter3": "^5.0.1", "immer": "^10.1.1", "react-redux": "8.x.x || 9.x.x", "reselect": "5.1.1", "tiny-invariant": "^1.3.3", "use-sync-external-store": "^1.2.2", "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg=="],
|
| 503 |
+
|
| 504 |
+
"redux": ["redux@5.0.1", "", {}, "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="],
|
| 505 |
+
|
| 506 |
+
"redux-thunk": ["redux-thunk@3.1.0", "", { "peerDependencies": { "redux": "^5.0.0" } }, "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw=="],
|
| 507 |
+
|
| 508 |
+
"reselect": ["reselect@5.1.1", "", {}, "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w=="],
|
| 509 |
+
|
| 510 |
+
"reveal.js": ["reveal.js@5.2.1", "", {}, "sha512-r7//6mIM5p34hFiDMvYfXgyjXqGRta+/psd9YtytsgRlrpRzFv4RbH76TXd2qD+7ZPZEbpBDhdRhJaFgfQ7zNQ=="],
|
| 511 |
+
|
| 512 |
+
"rollup": ["rollup@4.60.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.60.1", "@rollup/rollup-android-arm64": "4.60.1", "@rollup/rollup-darwin-arm64": "4.60.1", "@rollup/rollup-darwin-x64": "4.60.1", "@rollup/rollup-freebsd-arm64": "4.60.1", "@rollup/rollup-freebsd-x64": "4.60.1", "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", "@rollup/rollup-linux-arm-musleabihf": "4.60.1", "@rollup/rollup-linux-arm64-gnu": "4.60.1", "@rollup/rollup-linux-arm64-musl": "4.60.1", "@rollup/rollup-linux-loong64-gnu": "4.60.1", "@rollup/rollup-linux-loong64-musl": "4.60.1", "@rollup/rollup-linux-ppc64-gnu": "4.60.1", "@rollup/rollup-linux-ppc64-musl": "4.60.1", "@rollup/rollup-linux-riscv64-gnu": "4.60.1", "@rollup/rollup-linux-riscv64-musl": "4.60.1", "@rollup/rollup-linux-s390x-gnu": "4.60.1", "@rollup/rollup-linux-x64-gnu": "4.60.1", "@rollup/rollup-linux-x64-musl": "4.60.1", "@rollup/rollup-openbsd-x64": "4.60.1", "@rollup/rollup-openharmony-arm64": "4.60.1", "@rollup/rollup-win32-arm64-msvc": "4.60.1", "@rollup/rollup-win32-ia32-msvc": "4.60.1", "@rollup/rollup-win32-x64-gnu": "4.60.1", "@rollup/rollup-win32-x64-msvc": "4.60.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w=="],
|
| 513 |
+
|
| 514 |
+
"scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
|
| 515 |
+
|
| 516 |
+
"set-cookie-parser": ["set-cookie-parser@2.7.2", "", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="],
|
| 517 |
+
|
| 518 |
+
"sonner": ["sonner@2.0.7", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w=="],
|
| 519 |
+
|
| 520 |
+
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
|
| 521 |
+
|
| 522 |
+
"tailwind-merge": ["tailwind-merge@3.5.0", "", {}, "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A=="],
|
| 523 |
+
|
| 524 |
+
"tailwindcss": ["tailwindcss@4.2.2", "", {}, "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q=="],
|
| 525 |
+
|
| 526 |
+
"tapable": ["tapable@2.3.2", "", {}, "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA=="],
|
| 527 |
+
|
| 528 |
+
"tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="],
|
| 529 |
+
|
| 530 |
+
"tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
|
| 531 |
+
|
| 532 |
+
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
| 533 |
+
|
| 534 |
+
"tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="],
|
| 535 |
+
|
| 536 |
+
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
| 537 |
+
|
| 538 |
+
"undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
|
| 539 |
+
|
| 540 |
+
"use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="],
|
| 541 |
+
|
| 542 |
+
"use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="],
|
| 543 |
+
|
| 544 |
+
"use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="],
|
| 545 |
+
|
| 546 |
+
"util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
|
| 547 |
+
|
| 548 |
+
"vaul": ["vaul@1.1.2", "", { "dependencies": { "@radix-ui/react-dialog": "^1.1.1" }, "peerDependencies": { "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA=="],
|
| 549 |
+
|
| 550 |
+
"victory-vendor": ["victory-vendor@37.3.6", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ=="],
|
| 551 |
+
|
| 552 |
+
"vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="],
|
| 553 |
+
|
| 554 |
+
"zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
|
| 555 |
+
|
| 556 |
+
"@radix-ui/react-arrow/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 557 |
+
|
| 558 |
+
"@radix-ui/react-checkbox/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
|
| 559 |
+
|
| 560 |
+
"@radix-ui/react-checkbox/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 561 |
+
|
| 562 |
+
"@radix-ui/react-collection/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
|
| 563 |
+
|
| 564 |
+
"@radix-ui/react-collection/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 565 |
+
|
| 566 |
+
"@radix-ui/react-collection/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 567 |
+
|
| 568 |
+
"@radix-ui/react-dialog/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
|
| 569 |
+
|
| 570 |
+
"@radix-ui/react-dialog/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 571 |
+
|
| 572 |
+
"@radix-ui/react-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 573 |
+
|
| 574 |
+
"@radix-ui/react-dismissable-layer/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 575 |
+
|
| 576 |
+
"@radix-ui/react-dropdown-menu/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
|
| 577 |
+
|
| 578 |
+
"@radix-ui/react-dropdown-menu/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 579 |
+
|
| 580 |
+
"@radix-ui/react-focus-scope/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 581 |
+
|
| 582 |
+
"@radix-ui/react-menu/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
|
| 583 |
+
|
| 584 |
+
"@radix-ui/react-menu/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 585 |
+
|
| 586 |
+
"@radix-ui/react-menu/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 587 |
+
|
| 588 |
+
"@radix-ui/react-popper/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
|
| 589 |
+
|
| 590 |
+
"@radix-ui/react-popper/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 591 |
+
|
| 592 |
+
"@radix-ui/react-portal/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 593 |
+
|
| 594 |
+
"@radix-ui/react-roving-focus/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
|
| 595 |
+
|
| 596 |
+
"@radix-ui/react-roving-focus/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 597 |
+
|
| 598 |
+
"@radix-ui/react-select/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
|
| 599 |
+
|
| 600 |
+
"@radix-ui/react-select/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 601 |
+
|
| 602 |
+
"@radix-ui/react-select/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 603 |
+
|
| 604 |
+
"@radix-ui/react-tabs/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
|
| 605 |
+
|
| 606 |
+
"@radix-ui/react-tabs/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 607 |
+
|
| 608 |
+
"@radix-ui/react-toggle/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 609 |
+
|
| 610 |
+
"@radix-ui/react-toggle-group/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
|
| 611 |
+
|
| 612 |
+
"@radix-ui/react-toggle-group/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 613 |
+
|
| 614 |
+
"@radix-ui/react-tooltip/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
|
| 615 |
+
|
| 616 |
+
"@radix-ui/react-tooltip/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 617 |
+
|
| 618 |
+
"@radix-ui/react-tooltip/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 619 |
+
|
| 620 |
+
"@radix-ui/react-visually-hidden/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
|
| 621 |
+
|
| 622 |
+
"@reduxjs/toolkit/immer": ["immer@11.1.4", "", {}, "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw=="],
|
| 623 |
+
|
| 624 |
+
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.9.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA=="],
|
| 625 |
+
|
| 626 |
+
"@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.9.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA=="],
|
| 627 |
+
|
| 628 |
+
"@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="],
|
| 629 |
+
|
| 630 |
+
"@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.2", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw=="],
|
| 631 |
+
|
| 632 |
+
"@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
|
| 633 |
+
|
| 634 |
+
"@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
| 635 |
+
|
| 636 |
+
"@radix-ui/react-arrow/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 637 |
+
|
| 638 |
+
"@radix-ui/react-checkbox/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 639 |
+
|
| 640 |
+
"@radix-ui/react-dismissable-layer/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 641 |
+
|
| 642 |
+
"@radix-ui/react-dropdown-menu/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 643 |
+
|
| 644 |
+
"@radix-ui/react-focus-scope/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 645 |
+
|
| 646 |
+
"@radix-ui/react-popper/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 647 |
+
|
| 648 |
+
"@radix-ui/react-portal/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 649 |
+
|
| 650 |
+
"@radix-ui/react-roving-focus/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 651 |
+
|
| 652 |
+
"@radix-ui/react-tabs/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 653 |
+
|
| 654 |
+
"@radix-ui/react-toggle-group/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 655 |
+
|
| 656 |
+
"@radix-ui/react-toggle/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 657 |
+
|
| 658 |
+
"@radix-ui/react-visually-hidden/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
|
| 659 |
+
|
| 660 |
+
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg=="],
|
| 661 |
+
}
|
| 662 |
+
}
|
bunfig.toml
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[install]
|
| 2 |
+
# Only install package versions published at least 3 days ago
|
| 3 |
+
minimumReleaseAge = 259200 # seconds
|
| 4 |
+
|
| 5 |
+
# These packages will bypass the 3-day minimum age requirement
|
| 6 |
+
minimumReleaseAgeExcludes = ["@types/bun", "typescript"]
|
components.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://ui.shadcn.com/schema.json",
|
| 3 |
+
"style": "new-york",
|
| 4 |
+
"rsc": false,
|
| 5 |
+
"tsx": true,
|
| 6 |
+
"tailwind": {
|
| 7 |
+
"config": "",
|
| 8 |
+
"css": "src/styles.css",
|
| 9 |
+
"baseColor": "stone",
|
| 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 |
+
}
|
index.html
CHANGED
|
@@ -5,11 +5,10 @@
|
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
| 7 |
<title>Zo Site</title>
|
| 8 |
-
<script type="module" crossorigin src="/assets/index-BkJYCBAV.js"></script>
|
| 9 |
-
<link rel="stylesheet" crossorigin href="/assets/index-BXSLl1pv.css">
|
| 10 |
</head>
|
| 11 |
<body>
|
| 12 |
<div id="root"></div>
|
|
|
|
| 13 |
</body>
|
| 14 |
</html>
|
| 15 |
|
|
|
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
| 7 |
<title>Zo Site</title>
|
|
|
|
|
|
|
| 8 |
</head>
|
| 9 |
<body>
|
| 10 |
<div id="root"></div>
|
| 11 |
+
<script type="module" src="/src/main.tsx"></script>
|
| 12 |
</body>
|
| 13 |
</html>
|
| 14 |
|
index.tsx
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
export { default } from "./server";
|
package.json
CHANGED
|
@@ -1,39 +1,58 @@
|
|
| 1 |
{
|
| 2 |
-
"name": "
|
| 3 |
-
"
|
| 4 |
-
"private": true,
|
| 5 |
-
"dependencies": {
|
| 6 |
-
"@testing-library/dom": "^10.4.0",
|
| 7 |
-
"@testing-library/jest-dom": "^6.6.3",
|
| 8 |
-
"@testing-library/react": "^16.3.0",
|
| 9 |
-
"@testing-library/user-event": "^13.5.0",
|
| 10 |
-
"react": "^19.1.0",
|
| 11 |
-
"react-dom": "^19.1.0",
|
| 12 |
-
"react-scripts": "5.0.1",
|
| 13 |
-
"web-vitals": "^2.1.4"
|
| 14 |
-
},
|
| 15 |
"scripts": {
|
| 16 |
-
"
|
| 17 |
-
"
|
| 18 |
-
"
|
| 19 |
-
"
|
|
|
|
| 20 |
},
|
| 21 |
-
"
|
| 22 |
-
"
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
},
|
| 27 |
-
"
|
| 28 |
-
"
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
],
|
| 33 |
-
"development": [
|
| 34 |
-
"last 1 chrome version",
|
| 35 |
-
"last 1 firefox version",
|
| 36 |
-
"last 1 safari version"
|
| 37 |
-
]
|
| 38 |
}
|
| 39 |
}
|
|
|
|
| 1 |
{
|
| 2 |
+
"name": "zo-site",
|
| 3 |
+
"type": "module",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
"scripts": {
|
| 5 |
+
"clear-cache": "rm -rf node_modules/.vite",
|
| 6 |
+
"dev": "bun run clear-cache && NODE_ENV=development bun run --hot server.ts",
|
| 7 |
+
"build": "bun run clear-cache && vite build",
|
| 8 |
+
"prod": "bun run build && NODE_ENV=production bun run server.ts",
|
| 9 |
+
"preview": "bun run vite preview"
|
| 10 |
},
|
| 11 |
+
"dependencies": {
|
| 12 |
+
"@dnd-kit/core": "^6.3.1",
|
| 13 |
+
"@dnd-kit/modifiers": "^9.0.0",
|
| 14 |
+
"@dnd-kit/sortable": "^10.0.0",
|
| 15 |
+
"@dnd-kit/utilities": "^3.2.2",
|
| 16 |
+
"@radix-ui/react-avatar": "^1.1.11",
|
| 17 |
+
"@radix-ui/react-checkbox": "^1.3.3",
|
| 18 |
+
"@radix-ui/react-dialog": "^1.1.15",
|
| 19 |
+
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
| 20 |
+
"@radix-ui/react-label": "^2.1.8",
|
| 21 |
+
"@radix-ui/react-select": "^2.2.6",
|
| 22 |
+
"@radix-ui/react-separator": "^1.1.8",
|
| 23 |
+
"@radix-ui/react-slot": "^1.2.4",
|
| 24 |
+
"@radix-ui/react-tabs": "^1.1.13",
|
| 25 |
+
"@radix-ui/react-toggle": "^1.1.10",
|
| 26 |
+
"@radix-ui/react-toggle-group": "^1.1.11",
|
| 27 |
+
"@radix-ui/react-tooltip": "^1.2.8",
|
| 28 |
+
"@tabler/icons-react": "^3.35.0",
|
| 29 |
+
"@tailwindcss/typography": "^0.5.19",
|
| 30 |
+
"@tailwindcss/vite": "^4.1.17",
|
| 31 |
+
"@vitejs/plugin-react-swc": "^4.2.2",
|
| 32 |
+
"@tanstack/react-table": "^8.21.3",
|
| 33 |
+
"class-variance-authority": "^0.7.1",
|
| 34 |
+
"clsx": "^2.1.1",
|
| 35 |
+
"hono": "^4.10.6",
|
| 36 |
+
"lucide-react": "^0.562.0",
|
| 37 |
+
"marked": "^17.0.1",
|
| 38 |
+
"next-themes": "^0.4.6",
|
| 39 |
+
"react": "^19.2.0",
|
| 40 |
+
"react-dom": "^19.2.0",
|
| 41 |
+
"react-router-dom": "^7.9.6",
|
| 42 |
+
"recharts": "^3.6.0",
|
| 43 |
+
"reveal.js": "^5.2.1",
|
| 44 |
+
"sonner": "^2.0.7",
|
| 45 |
+
"tailwind-merge": "^3.4.0",
|
| 46 |
+
"tailwindcss": "^4.1.17",
|
| 47 |
+
"tw-animate-css": "^1.4.0",
|
| 48 |
+
"vaul": "^1.1.2",
|
| 49 |
+
"vite": "^7.2.4",
|
| 50 |
+
"zod": "^4.1.13"
|
| 51 |
},
|
| 52 |
+
"devDependencies": {
|
| 53 |
+
"@types/bun": "1.2.21",
|
| 54 |
+
"@types/react": "^19.2.7",
|
| 55 |
+
"@types/react-dom": "^19.2.3",
|
| 56 |
+
"typescript": "^5.9.3"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 57 |
}
|
| 58 |
}
|
public/favicon.svg
ADDED
|
|
public/images/pegasus.png
ADDED
|
Git LFS Details
|
server.ts
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { serveStatic } from "hono/bun";
|
| 2 |
+
import type { ViteDevServer } from "vite";
|
| 3 |
+
import { createServer as createViteServer } from "vite";
|
| 4 |
+
import config from "./zosite.json";
|
| 5 |
+
import { Hono } from "hono";
|
| 6 |
+
|
| 7 |
+
// AI agents: read README.md for navigation and contribution guidance.
|
| 8 |
+
type Mode = "development" | "production";
|
| 9 |
+
const app = new Hono();
|
| 10 |
+
|
| 11 |
+
const mode: Mode =
|
| 12 |
+
process.env.NODE_ENV === "production" ? "production" : "development";
|
| 13 |
+
|
| 14 |
+
/**
|
| 15 |
+
* Add any API routes here.
|
| 16 |
+
*/
|
| 17 |
+
app.get("/api/hello-zo", (c) => c.json({ msg: "Hello from Zo" }));
|
| 18 |
+
|
| 19 |
+
if (mode === "production") {
|
| 20 |
+
configureProduction(app);
|
| 21 |
+
} else {
|
| 22 |
+
await configureDevelopment(app);
|
| 23 |
+
}
|
| 24 |
+
|
| 25 |
+
/**
|
| 26 |
+
* Determine port based on mode. In production, use the published_port if available.
|
| 27 |
+
* In development, always use the local_port.
|
| 28 |
+
* Ports are managed by the system and injected via the PORT environment variable.
|
| 29 |
+
*/
|
| 30 |
+
const port = process.env.PORT
|
| 31 |
+
? parseInt(process.env.PORT, 10)
|
| 32 |
+
: mode === "production"
|
| 33 |
+
? (config.publish?.published_port ?? config.local_port)
|
| 34 |
+
: config.local_port;
|
| 35 |
+
|
| 36 |
+
export default { fetch: app.fetch, port, idleTimeout: 255 };
|
| 37 |
+
|
| 38 |
+
/**
|
| 39 |
+
* Configure routing for production builds.
|
| 40 |
+
*
|
| 41 |
+
* - Streams prebuilt assets from `dist`.
|
| 42 |
+
* - Static files from `public/` are copied to `dist/` by Vite and served at root paths.
|
| 43 |
+
* - Falls back to `index.html` for any other GET so the SPA router can resolve the request.
|
| 44 |
+
*/
|
| 45 |
+
function configureProduction(app: Hono) {
|
| 46 |
+
app.use("/assets/*", serveStatic({ root: "./dist" }));
|
| 47 |
+
app.get("/favicon.ico", (c) => c.redirect("/favicon.svg", 302));
|
| 48 |
+
app.use(async (c, next) => {
|
| 49 |
+
if (c.req.method !== "GET") return next();
|
| 50 |
+
|
| 51 |
+
const path = c.req.path;
|
| 52 |
+
if (path.startsWith("/api/") || path.startsWith("/assets/")) return next();
|
| 53 |
+
|
| 54 |
+
const file = Bun.file(`./dist${path}`);
|
| 55 |
+
if (await file.exists()) {
|
| 56 |
+
const stat = await file.stat();
|
| 57 |
+
if (stat && !stat.isDirectory()) {
|
| 58 |
+
return new Response(file);
|
| 59 |
+
}
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
return serveStatic({ path: "./dist/index.html" })(c, next);
|
| 63 |
+
});
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
/**
|
| 67 |
+
* Configure routing for development builds.
|
| 68 |
+
*
|
| 69 |
+
* - Boots Vite in middleware mode for transforms.
|
| 70 |
+
* - Static files from `public/` are served at root paths (matching Vite convention).
|
| 71 |
+
* - Mirrors production routing semantics so SPA routes behave consistently.
|
| 72 |
+
*/
|
| 73 |
+
async function configureDevelopment(app: Hono): Promise<ViteDevServer> {
|
| 74 |
+
const vite = await createViteServer({
|
| 75 |
+
server: { middlewareMode: true, hmr: false, ws: false },
|
| 76 |
+
appType: "custom",
|
| 77 |
+
});
|
| 78 |
+
|
| 79 |
+
app.use("*", async (c, next) => {
|
| 80 |
+
if (c.req.path.startsWith("/api/")) return next();
|
| 81 |
+
if (c.req.path === "/favicon.ico") return c.redirect("/favicon.svg", 302);
|
| 82 |
+
|
| 83 |
+
const url = c.req.path;
|
| 84 |
+
try {
|
| 85 |
+
if (url === "/" || url === "/index.html") {
|
| 86 |
+
let template = await Bun.file("./index.html").text();
|
| 87 |
+
template = await vite.transformIndexHtml(url, template);
|
| 88 |
+
return c.html(template, {
|
| 89 |
+
headers: { "Cache-Control": "no-store, must-revalidate" },
|
| 90 |
+
});
|
| 91 |
+
}
|
| 92 |
+
|
| 93 |
+
const publicFile = Bun.file(`./public${url}`);
|
| 94 |
+
if (await publicFile.exists()) {
|
| 95 |
+
const stat = await publicFile.stat();
|
| 96 |
+
if (stat && !stat.isDirectory()) {
|
| 97 |
+
return new Response(publicFile, {
|
| 98 |
+
headers: { "Cache-Control": "no-store, must-revalidate" },
|
| 99 |
+
});
|
| 100 |
+
}
|
| 101 |
+
}
|
| 102 |
+
|
| 103 |
+
let result;
|
| 104 |
+
try {
|
| 105 |
+
result = await vite.transformRequest(url);
|
| 106 |
+
} catch {
|
| 107 |
+
result = null;
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
if (result) {
|
| 111 |
+
return new Response(result.code, {
|
| 112 |
+
headers: {
|
| 113 |
+
"Content-Type": "application/javascript",
|
| 114 |
+
"Cache-Control": "no-store, must-revalidate",
|
| 115 |
+
},
|
| 116 |
+
});
|
| 117 |
+
}
|
| 118 |
+
|
| 119 |
+
let template = await Bun.file("./index.html").text();
|
| 120 |
+
template = await vite.transformIndexHtml("/", template);
|
| 121 |
+
return c.html(template, {
|
| 122 |
+
headers: { "Cache-Control": "no-store, must-revalidate" },
|
| 123 |
+
});
|
| 124 |
+
} catch (error) {
|
| 125 |
+
vite.ssrFixStacktrace(error as Error);
|
| 126 |
+
console.error(error);
|
| 127 |
+
return c.text("Internal Server Error", 500);
|
| 128 |
+
}
|
| 129 |
+
});
|
| 130 |
+
|
| 131 |
+
return vite;
|
| 132 |
+
}
|
src/App.tsx
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { BrowserRouter, Route, Routes } from "react-router-dom";
|
| 2 |
+
import Alphamate from "./pages/alphamate";
|
| 3 |
+
import { ThemeProvider } from "@/components/theme-provider";
|
| 4 |
+
|
| 5 |
+
export default function App() {
|
| 6 |
+
return (
|
| 7 |
+
<ThemeProvider>
|
| 8 |
+
<BrowserRouter>
|
| 9 |
+
<Routes>
|
| 10 |
+
<Route path="/" element={<Alphamate />} />
|
| 11 |
+
</Routes>
|
| 12 |
+
</BrowserRouter>
|
| 13 |
+
</ThemeProvider>
|
| 14 |
+
);
|
| 15 |
+
}
|
src/components/theme-provider.tsx
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { createContext, useContext, useEffect, useState } from "react";
|
| 2 |
+
|
| 3 |
+
type Theme = "dark" | "light" | "system";
|
| 4 |
+
|
| 5 |
+
type ThemeProviderProps = {
|
| 6 |
+
children: React.ReactNode;
|
| 7 |
+
defaultTheme?: Theme;
|
| 8 |
+
storageKey?: string;
|
| 9 |
+
};
|
| 10 |
+
|
| 11 |
+
type ThemeProviderState = {
|
| 12 |
+
theme: Theme;
|
| 13 |
+
setTheme: (theme: Theme) => void;
|
| 14 |
+
};
|
| 15 |
+
|
| 16 |
+
const initialState: ThemeProviderState = {
|
| 17 |
+
theme: "system",
|
| 18 |
+
setTheme: () => null,
|
| 19 |
+
};
|
| 20 |
+
|
| 21 |
+
const ThemeProviderContext = createContext<ThemeProviderState>(initialState);
|
| 22 |
+
|
| 23 |
+
export function ThemeProvider({
|
| 24 |
+
children,
|
| 25 |
+
defaultTheme = "system",
|
| 26 |
+
storageKey = "vite-ui-theme",
|
| 27 |
+
...props
|
| 28 |
+
}: ThemeProviderProps) {
|
| 29 |
+
const [theme, setTheme] = useState<Theme>(
|
| 30 |
+
() => (localStorage.getItem(storageKey) as Theme) || defaultTheme,
|
| 31 |
+
);
|
| 32 |
+
|
| 33 |
+
useEffect(() => {
|
| 34 |
+
const root = window.document.documentElement;
|
| 35 |
+
|
| 36 |
+
root.classList.remove("light", "dark");
|
| 37 |
+
|
| 38 |
+
if (theme === "system") {
|
| 39 |
+
const systemTheme = window.matchMedia("(prefers-color-scheme: dark)")
|
| 40 |
+
.matches
|
| 41 |
+
? "dark"
|
| 42 |
+
: "light";
|
| 43 |
+
|
| 44 |
+
root.classList.add(systemTheme);
|
| 45 |
+
return;
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
root.classList.add(theme);
|
| 49 |
+
}, [theme]);
|
| 50 |
+
|
| 51 |
+
const value = {
|
| 52 |
+
theme,
|
| 53 |
+
setTheme: (theme: Theme) => {
|
| 54 |
+
localStorage.setItem(storageKey, theme);
|
| 55 |
+
setTheme(theme);
|
| 56 |
+
},
|
| 57 |
+
};
|
| 58 |
+
|
| 59 |
+
return (
|
| 60 |
+
<ThemeProviderContext.Provider {...props} value={value}>
|
| 61 |
+
{children}
|
| 62 |
+
</ThemeProviderContext.Provider>
|
| 63 |
+
);
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
export const useTheme = () => {
|
| 67 |
+
const context = useContext(ThemeProviderContext);
|
| 68 |
+
|
| 69 |
+
if (context === undefined)
|
| 70 |
+
throw new Error("useTheme must be used within a ThemeProvider");
|
| 71 |
+
|
| 72 |
+
return context;
|
| 73 |
+
};
|
src/components/ui/badge.tsx
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 badgeVariants = cva(
|
| 8 |
+
"inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-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 transition-[color,box-shadow] overflow-hidden",
|
| 9 |
+
{
|
| 10 |
+
variants: {
|
| 11 |
+
variant: {
|
| 12 |
+
default:
|
| 13 |
+
"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
|
| 14 |
+
secondary:
|
| 15 |
+
"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
|
| 16 |
+
destructive:
|
| 17 |
+
"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
|
| 18 |
+
outline:
|
| 19 |
+
"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
|
| 20 |
+
},
|
| 21 |
+
},
|
| 22 |
+
defaultVariants: {
|
| 23 |
+
variant: "default",
|
| 24 |
+
},
|
| 25 |
+
},
|
| 26 |
+
);
|
| 27 |
+
|
| 28 |
+
function Badge({
|
| 29 |
+
className,
|
| 30 |
+
variant,
|
| 31 |
+
asChild = false,
|
| 32 |
+
...props
|
| 33 |
+
}: React.ComponentProps<"span"> &
|
| 34 |
+
VariantProps<typeof badgeVariants> & { asChild?: boolean }) {
|
| 35 |
+
const Comp = asChild ? Slot : "span";
|
| 36 |
+
|
| 37 |
+
return (
|
| 38 |
+
<Comp
|
| 39 |
+
data-slot="badge"
|
| 40 |
+
className={cn(badgeVariants({ variant }), className)}
|
| 41 |
+
{...props}
|
| 42 |
+
/>
|
| 43 |
+
);
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
export { Badge, badgeVariants };
|
src/components/ui/button.tsx
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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: "bg-primary text-primary-foreground hover:bg-primary/90",
|
| 13 |
+
destructive:
|
| 14 |
+
"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
|
| 15 |
+
outline:
|
| 16 |
+
"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
|
| 17 |
+
secondary:
|
| 18 |
+
"bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
| 19 |
+
ghost:
|
| 20 |
+
"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
|
| 21 |
+
link: "text-primary underline-offset-4 hover:underline",
|
| 22 |
+
},
|
| 23 |
+
size: {
|
| 24 |
+
default: "h-9 px-4 py-2 has-[>svg]:px-3",
|
| 25 |
+
sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
|
| 26 |
+
lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
|
| 27 |
+
icon: "size-9",
|
| 28 |
+
"icon-sm": "size-8",
|
| 29 |
+
"icon-lg": "size-10",
|
| 30 |
+
},
|
| 31 |
+
},
|
| 32 |
+
defaultVariants: {
|
| 33 |
+
variant: "default",
|
| 34 |
+
size: "default",
|
| 35 |
+
},
|
| 36 |
+
},
|
| 37 |
+
);
|
| 38 |
+
|
| 39 |
+
function Button({
|
| 40 |
+
className,
|
| 41 |
+
variant,
|
| 42 |
+
size,
|
| 43 |
+
asChild = false,
|
| 44 |
+
...props
|
| 45 |
+
}: React.ComponentProps<"button"> &
|
| 46 |
+
VariantProps<typeof buttonVariants> & {
|
| 47 |
+
asChild?: boolean;
|
| 48 |
+
}) {
|
| 49 |
+
const Comp = asChild ? Slot : "button";
|
| 50 |
+
|
| 51 |
+
return (
|
| 52 |
+
<Comp
|
| 53 |
+
data-slot="button"
|
| 54 |
+
className={cn(buttonVariants({ variant, size, className }))}
|
| 55 |
+
{...props}
|
| 56 |
+
/>
|
| 57 |
+
);
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
export { Button, buttonVariants };
|
src/components/ui/card.tsx
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import * as React from "react";
|
| 2 |
+
|
| 3 |
+
import { cn } from "@/lib/utils";
|
| 4 |
+
|
| 5 |
+
function Card({ className, ...props }: React.ComponentProps<"div">) {
|
| 6 |
+
return (
|
| 7 |
+
<div
|
| 8 |
+
data-slot="card"
|
| 9 |
+
className={cn(
|
| 10 |
+
"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",
|
| 11 |
+
className,
|
| 12 |
+
)}
|
| 13 |
+
{...props}
|
| 14 |
+
/>
|
| 15 |
+
);
|
| 16 |
+
}
|
| 17 |
+
|
| 18 |
+
function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
|
| 19 |
+
return (
|
| 20 |
+
<div
|
| 21 |
+
data-slot="card-header"
|
| 22 |
+
className={cn(
|
| 23 |
+
"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
|
| 24 |
+
className,
|
| 25 |
+
)}
|
| 26 |
+
{...props}
|
| 27 |
+
/>
|
| 28 |
+
);
|
| 29 |
+
}
|
| 30 |
+
|
| 31 |
+
function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
|
| 32 |
+
return (
|
| 33 |
+
<div
|
| 34 |
+
data-slot="card-title"
|
| 35 |
+
className={cn("leading-none font-semibold", className)}
|
| 36 |
+
{...props}
|
| 37 |
+
/>
|
| 38 |
+
);
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
|
| 42 |
+
return (
|
| 43 |
+
<div
|
| 44 |
+
data-slot="card-description"
|
| 45 |
+
className={cn("text-muted-foreground text-sm", className)}
|
| 46 |
+
{...props}
|
| 47 |
+
/>
|
| 48 |
+
);
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
function CardAction({ className, ...props }: React.ComponentProps<"div">) {
|
| 52 |
+
return (
|
| 53 |
+
<div
|
| 54 |
+
data-slot="card-action"
|
| 55 |
+
className={cn(
|
| 56 |
+
"col-start-2 row-span-2 row-start-1 self-start justify-self-end",
|
| 57 |
+
className,
|
| 58 |
+
)}
|
| 59 |
+
{...props}
|
| 60 |
+
/>
|
| 61 |
+
);
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
function CardContent({ className, ...props }: React.ComponentProps<"div">) {
|
| 65 |
+
return (
|
| 66 |
+
<div
|
| 67 |
+
data-slot="card-content"
|
| 68 |
+
className={cn("px-6", className)}
|
| 69 |
+
{...props}
|
| 70 |
+
/>
|
| 71 |
+
);
|
| 72 |
+
}
|
| 73 |
+
|
| 74 |
+
function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
|
| 75 |
+
return (
|
| 76 |
+
<div
|
| 77 |
+
data-slot="card-footer"
|
| 78 |
+
className={cn("flex items-center px-6 [.border-t]:pt-6", className)}
|
| 79 |
+
{...props}
|
| 80 |
+
/>
|
| 81 |
+
);
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
export {
|
| 85 |
+
Card,
|
| 86 |
+
CardHeader,
|
| 87 |
+
CardFooter,
|
| 88 |
+
CardTitle,
|
| 89 |
+
CardAction,
|
| 90 |
+
CardDescription,
|
| 91 |
+
CardContent,
|
| 92 |
+
};
|
src/hooks/use-mobile.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import * as React from "react";
|
| 2 |
+
|
| 3 |
+
const MOBILE_BREAKPOINT = 768;
|
| 4 |
+
|
| 5 |
+
export function useIsMobile() {
|
| 6 |
+
const [isMobile, setIsMobile] = React.useState<boolean | undefined>(
|
| 7 |
+
undefined,
|
| 8 |
+
);
|
| 9 |
+
|
| 10 |
+
React.useEffect(() => {
|
| 11 |
+
const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
|
| 12 |
+
const onChange = () => {
|
| 13 |
+
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
|
| 14 |
+
};
|
| 15 |
+
mql.addEventListener("change", onChange);
|
| 16 |
+
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
|
| 17 |
+
return () => mql.removeEventListener("change", onChange);
|
| 18 |
+
}, []);
|
| 19 |
+
|
| 20 |
+
return !!isMobile;
|
| 21 |
+
}
|
src/lib/utils.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
+
}
|
src/main.tsx
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import React from "react";
|
| 2 |
+
import { createRoot } from "react-dom/client";
|
| 3 |
+
import App from "./App";
|
| 4 |
+
import "./styles.css";
|
| 5 |
+
|
| 6 |
+
const container = document.getElementById("root");
|
| 7 |
+
|
| 8 |
+
if (!container) {
|
| 9 |
+
throw new Error("Root element not found");
|
| 10 |
+
}
|
| 11 |
+
|
| 12 |
+
createRoot(container).render(<App />);
|
src/pages/alphamate.tsx
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { useState, useEffect } from "react";
|
| 2 |
+
|
| 3 |
+
export default function Alphamate() {
|
| 4 |
+
const [scrollY, setScrollY] = useState(0);
|
| 5 |
+
|
| 6 |
+
useEffect(() => {
|
| 7 |
+
const handleScroll = () => setScrollY(window.scrollY);
|
| 8 |
+
window.addEventListener("scroll", handleScroll);
|
| 9 |
+
return () => window.removeEventListener("scroll", handleScroll);
|
| 10 |
+
}, []);
|
| 11 |
+
|
| 12 |
+
const stats = [
|
| 13 |
+
{ value: "47", label: "KiwiSDR Receivers", sub: "Global Network" },
|
| 14 |
+
{ value: "24/7", label: "Live Monitoring", sub: "Ionospheric Scanning" },
|
| 15 |
+
{ value: "∞", label: "Signal Archive", sub: "HF Spectrum Data" },
|
| 16 |
+
];
|
| 17 |
+
|
| 18 |
+
const features = [
|
| 19 |
+
{
|
| 20 |
+
title: "AI.OS Kernel",
|
| 21 |
+
desc: "Neural inference engine optimized for real-time signal processing and ionospheric analysis.",
|
| 22 |
+
tag: "CORE",
|
| 23 |
+
},
|
| 24 |
+
{
|
| 25 |
+
title: "KiwiSDR Network",
|
| 26 |
+
desc: "Distributed receiver network capturing HF spectrum across 6 continents.",
|
| 27 |
+
tag: "NETWORK",
|
| 28 |
+
},
|
| 29 |
+
{
|
| 30 |
+
title: "Signal Database",
|
| 31 |
+
desc: "Petabyte-scale archive of ionospheric reflections, meteors, and atmospheric events.",
|
| 32 |
+
tag: "DATA",
|
| 33 |
+
},
|
| 34 |
+
{
|
| 35 |
+
title: "Spectrum Visualizer",
|
| 36 |
+
desc: "Real-time waterfall plots and frequency analysis with ML-enhanced detection.",
|
| 37 |
+
tag: "VIZ",
|
| 38 |
+
},
|
| 39 |
+
{
|
| 40 |
+
title: "Space Weather",
|
| 41 |
+
desc: "Solar flare detection, geomagnetic storm tracking, and propagation forecasts.",
|
| 42 |
+
tag: "SPACE",
|
| 43 |
+
},
|
| 44 |
+
{
|
| 45 |
+
title: "Open API",
|
| 46 |
+
desc: "REST & WebSocket access to live feeds, archived data, and ML inference endpoints.",
|
| 47 |
+
tag: "API",
|
| 48 |
+
},
|
| 49 |
+
];
|
| 50 |
+
|
| 51 |
+
const spectrum = Array.from({ length: 64 }, (_, i) => {
|
| 52 |
+
const freq = 0.1 + (30 - 0.1) * (i / 63);
|
| 53 |
+
const amp = Math.sin(i * 0.3 + scrollY * 0.005) * 0.5 + 0.5;
|
| 54 |
+
const intensity = amp * 100;
|
| 55 |
+
const r = Math.round(30 + amp * 40);
|
| 56 |
+
const g = Math.round(40 + amp * 20);
|
| 57 |
+
const b = Math.round(255);
|
| 58 |
+
return { freq, intensity, color: `rgb(${r},${g},${b})` };
|
| 59 |
+
});
|
| 60 |
+
|
| 61 |
+
return (
|
| 62 |
+
<div className="min-h-screen bg-black text-zinc-100 overflow-x-hidden">
|
| 63 |
+
{/* Grid background */}
|
| 64 |
+
<div
|
| 65 |
+
className="fixed inset-0 opacity-[0.03] pointer-events-none"
|
| 66 |
+
style={{
|
| 67 |
+
backgroundImage:
|
| 68 |
+
"linear-gradient(#fff 1px, transparent 1px), linear-gradient(90deg, #fff 1px, transparent 1px)",
|
| 69 |
+
backgroundSize: "40px 40px",
|
| 70 |
+
}}
|
| 71 |
+
/>
|
| 72 |
+
{/* Gradient glow */}
|
| 73 |
+
<div className="fixed inset-0 bg-radial-at-t from-indigo-950/20 via-transparent to-transparent pointer-events-none" />
|
| 74 |
+
|
| 75 |
+
{/* NAV */}
|
| 76 |
+
<nav className="fixed top-0 w-full z-50 border-b border-white/5 bg-black/40 backdrop-blur-xl">
|
| 77 |
+
<div className="max-w-6xl mx-auto px-6 py-4 flex items-center justify-between">
|
| 78 |
+
<div className="flex items-center gap-2">
|
| 79 |
+
<div className="w-8 h-8 bg-gradient-to-br from-indigo-600 to-indigo-950 rounded-lg flex items-center justify-center text-white font-bold text-sm">
|
| 80 |
+
α
|
| 81 |
+
</div>
|
| 82 |
+
<span className="font-bold tracking-tight">alphamate</span>
|
| 83 |
+
</div>
|
| 84 |
+
<div className="hidden md:flex items-center gap-8 text-sm text-zinc-400">
|
| 85 |
+
<a href="#" className="hover:text-indigo-400 transition-colors">Network</a>
|
| 86 |
+
<a href="#" className="hover:text-indigo-400 transition-colors">Data</a>
|
| 87 |
+
<a href="#" className="hover:text-indigo-400 transition-colors">Models</a>
|
| 88 |
+
<a href="#" className="hover:text-indigo-400 transition-colors">Papers</a>
|
| 89 |
+
</div>
|
| 90 |
+
<button className="px-4 py-2 bg-indigo-600 hover:bg-indigo-500 rounded-lg text-sm font-medium transition-colors">
|
| 91 |
+
Launch App
|
| 92 |
+
</button>
|
| 93 |
+
</div>
|
| 94 |
+
</nav>
|
| 95 |
+
|
| 96 |
+
{/* HERO */}
|
| 97 |
+
<section className="relative pt-40 pb-32 px-6">
|
| 98 |
+
<div className="max-w-4xl mx-auto text-center">
|
| 99 |
+
<div className="inline-flex items-center gap-2 px-3 py-1 bg-indigo-950/50 border border-indigo-800/30 rounded-full text-xs font-mono text-indigo-300 mb-8">
|
| 100 |
+
<span className="w-1.5 h-1.5 bg-indigo-400 rounded-full animate-pulse" />
|
| 101 |
+
KiwiSDR Network Online — 47 receivers active
|
| 102 |
+
</div>
|
| 103 |
+
|
| 104 |
+
<h1 className="text-6xl md:text-8xl font-black tracking-tight mb-6">
|
| 105 |
+
<span className="bg-gradient-to-b from-white to-zinc-500 bg-clip-text text-transparent">
|
| 106 |
+
αlphamate
|
| 107 |
+
</span>
|
| 108 |
+
</h1>
|
| 109 |
+
<p className="text-xl md:text-2xl text-zinc-400 font-light max-w-2xl mx-auto mb-12">
|
| 110 |
+
Fanmade AI.OS for the KiwiSDR Network.<br />
|
| 111 |
+
Real-time ionospheric HF spectrum intelligence.
|
| 112 |
+
</p>
|
| 113 |
+
|
| 114 |
+
{/* SPECTRUM VISUALIZER */}
|
| 115 |
+
<div className="relative w-full rounded-3xl border border-white/10 bg-white/[0.02] p-6 mb-12 overflow-hidden">
|
| 116 |
+
<div className="flex items-end justify-between h-32 gap-[2px]">
|
| 117 |
+
{spectrum.map((bar, i) => (
|
| 118 |
+
<div
|
| 119 |
+
key={i}
|
| 120 |
+
className="flex-1 rounded-sm transition-all duration-75"
|
| 121 |
+
style={{
|
| 122 |
+
height: `${bar.intensity}%`,
|
| 123 |
+
backgroundColor: bar.color,
|
| 124 |
+
minWidth: "2px",
|
| 125 |
+
}}
|
| 126 |
+
/>
|
| 127 |
+
))}
|
| 128 |
+
</div>
|
| 129 |
+
<div className="flex justify-between mt-2 text-[10px] font-mono text-zinc-600">
|
| 130 |
+
<span>0.1 MHz</span>
|
| 131 |
+
<span className="text-indigo-400">▼ LIVE SPECTRUM</span>
|
| 132 |
+
<span>30.0 MHz</span>
|
| 133 |
+
</div>
|
| 134 |
+
</div>
|
| 135 |
+
|
| 136 |
+
<div className="flex flex-col sm:flex-row items-center justify-center gap-4">
|
| 137 |
+
<button className="px-8 py-3 bg-indigo-600 hover:bg-indigo-500 rounded-xl font-semibold transition-colors">
|
| 138 |
+
Access Network
|
| 139 |
+
</button>
|
| 140 |
+
<button className="px-8 py-3 border border-white/20 hover:border-white/40 rounded-xl font-medium transition-colors">
|
| 141 |
+
Read Documentation
|
| 142 |
+
</button>
|
| 143 |
+
</div>
|
| 144 |
+
</div>
|
| 145 |
+
</section>
|
| 146 |
+
|
| 147 |
+
{/* STATS */}
|
| 148 |
+
<section className="px-6 py-20 border-t border-white/5">
|
| 149 |
+
<div className="max-w-4xl mx-auto grid grid-cols-1 md:grid-cols-3 gap-8">
|
| 150 |
+
{stats.map((stat) => (
|
| 151 |
+
<div key={stat.label} className="text-center p-8 rounded-2xl bg-white/[0.02] border border-white/5">
|
| 152 |
+
<div className="text-5xl font-black text-indigo-400 mb-2">{stat.value}</div>
|
| 153 |
+
<div className="font-semibold mb-1">{stat.label}</div>
|
| 154 |
+
<div className="text-sm text-zinc-500">{stat.sub}</div>
|
| 155 |
+
</div>
|
| 156 |
+
))}
|
| 157 |
+
</div>
|
| 158 |
+
</section>
|
| 159 |
+
|
| 160 |
+
{/* FEATURES */}
|
| 161 |
+
<section className="px-6 py-20 border-t border-white/5">
|
| 162 |
+
<div className="max-w-5xl mx-auto">
|
| 163 |
+
<div className="text-center mb-16">
|
| 164 |
+
<p className="text-xs font-mono font-bold uppercase tracking-[0.3em] text-indigo-400 mb-4">
|
| 165 |
+
Infrastructure
|
| 166 |
+
</p>
|
| 167 |
+
<h2 className="text-4xl font-black">Built on Open Radio</h2>
|
| 168 |
+
</div>
|
| 169 |
+
|
| 170 |
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
| 171 |
+
{features.map((f) => (
|
| 172 |
+
<div
|
| 173 |
+
key={f.title}
|
| 174 |
+
className="group p-6 rounded-2xl bg-white/[0.02] border border-white/5 hover:border-indigo-500/30 transition-all"
|
| 175 |
+
>
|
| 176 |
+
<div className="flex items-center justify-between mb-4">
|
| 177 |
+
<span className="text-[10px] font-mono font-bold uppercase tracking-widest text-indigo-400">
|
| 178 |
+
{f.tag}
|
| 179 |
+
</span>
|
| 180 |
+
<div className="w-1.5 h-1.5 rounded-full bg-indigo-500/50 group-hover:bg-indigo-400 transition-colors" />
|
| 181 |
+
</div>
|
| 182 |
+
<h3 className="font-bold text-lg mb-2">{f.title}</h3>
|
| 183 |
+
<p className="text-sm text-zinc-400 leading-relaxed">{f.desc}</p>
|
| 184 |
+
</div>
|
| 185 |
+
))}
|
| 186 |
+
</div>
|
| 187 |
+
</div>
|
| 188 |
+
</section>
|
| 189 |
+
|
| 190 |
+
{/* CTA */}
|
| 191 |
+
<section className="px-6 py-32 border-t border-white/5">
|
| 192 |
+
<div className="max-w-2xl mx-auto text-center">
|
| 193 |
+
<h2 className="text-4xl font-black mb-4">Ready to explore?</h2>
|
| 194 |
+
<p className="text-zinc-400 mb-8">
|
| 195 |
+
Join the network. Access live feeds, download datasets, and build on the AlphaMate infrastructure.
|
| 196 |
+
</p>
|
| 197 |
+
<div className="flex flex-col sm:flex-row gap-4 justify-center">
|
| 198 |
+
<button className="px-8 py-3 bg-white text-black font-semibold rounded-xl hover:bg-zinc-200 transition-colors">
|
| 199 |
+
Get Started
|
| 200 |
+
</button>
|
| 201 |
+
<button className="px-8 py-3 border border-white/20 rounded-xl hover:border-white/40 transition-colors">
|
| 202 |
+
View on GitHub
|
| 203 |
+
</button>
|
| 204 |
+
</div>
|
| 205 |
+
</div>
|
| 206 |
+
</section>
|
| 207 |
+
|
| 208 |
+
{/* FOOTER */}
|
| 209 |
+
<footer className="px-6 py-8 border-t border-white/5">
|
| 210 |
+
<div className="max-w-5xl mx-auto flex flex-col md:flex-row items-center justify-between gap-4">
|
| 211 |
+
<p className="text-xs font-bold text-zinc-500 uppercase tracking-widest">
|
| 212 |
+
© 2026 Alphamate AI Labs
|
| 213 |
+
</p>
|
| 214 |
+
<div className="flex gap-6 text-xs text-zinc-500">
|
| 215 |
+
<a href="#" className="hover:text-zinc-300 transition-colors">Privacy</a>
|
| 216 |
+
<a href="#" className="hover:text-zinc-300 transition-colors">Terms</a>
|
| 217 |
+
<a href="#" className="hover:text-zinc-300 transition-colors">Contact</a>
|
| 218 |
+
</div>
|
| 219 |
+
</div>
|
| 220 |
+
</footer>
|
| 221 |
+
</div>
|
| 222 |
+
);
|
| 223 |
+
}
|
src/pages/marketing-demo.tsx
ADDED
|
@@ -0,0 +1,283 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import {
|
| 2 |
+
IconRocket,
|
| 3 |
+
IconCode,
|
| 4 |
+
IconDatabase,
|
| 5 |
+
IconCloud,
|
| 6 |
+
IconCheck,
|
| 7 |
+
IconBrandGithub,
|
| 8 |
+
} from "@tabler/icons-react";
|
| 9 |
+
import { Button } from "@/components/ui/button";
|
| 10 |
+
import {
|
| 11 |
+
Card,
|
| 12 |
+
CardContent,
|
| 13 |
+
CardDescription,
|
| 14 |
+
CardHeader,
|
| 15 |
+
CardTitle,
|
| 16 |
+
} from "@/components/ui/card";
|
| 17 |
+
import { Badge } from "@/components/ui/badge";
|
| 18 |
+
|
| 19 |
+
/**
|
| 20 |
+
* Marketing/Landing page demo - professional landing page template.
|
| 21 |
+
*
|
| 22 |
+
* This demo shows how to build a polished marketing site with:
|
| 23 |
+
* - Hero section with CTA
|
| 24 |
+
* - Features grid
|
| 25 |
+
* - Pricing/plans section
|
| 26 |
+
* - Testimonials
|
| 27 |
+
* - Footer with links
|
| 28 |
+
*
|
| 29 |
+
* Fully responsive and theme-aware. Customize colors, copy, and layout
|
| 30 |
+
* to match your product or service.
|
| 31 |
+
*/
|
| 32 |
+
|
| 33 |
+
const features = [
|
| 34 |
+
{
|
| 35 |
+
icon: IconCode,
|
| 36 |
+
title: "Developer-Friendly",
|
| 37 |
+
description:
|
| 38 |
+
"Built with modern web technologies. Full TypeScript support and hot reload.",
|
| 39 |
+
},
|
| 40 |
+
{
|
| 41 |
+
icon: IconDatabase,
|
| 42 |
+
title: "Data Persistence",
|
| 43 |
+
description:
|
| 44 |
+
"SQLite databases included. Store and query data without external services.",
|
| 45 |
+
},
|
| 46 |
+
{
|
| 47 |
+
icon: IconCloud,
|
| 48 |
+
title: "Self-Hosted",
|
| 49 |
+
description:
|
| 50 |
+
"Run on your own infrastructure. Full control over your data and deployment.",
|
| 51 |
+
},
|
| 52 |
+
{
|
| 53 |
+
icon: IconRocket,
|
| 54 |
+
title: "Fast Deployment",
|
| 55 |
+
description:
|
| 56 |
+
"Go from idea to production in minutes. No complex setup or configuration.",
|
| 57 |
+
},
|
| 58 |
+
];
|
| 59 |
+
|
| 60 |
+
const plans = [
|
| 61 |
+
{
|
| 62 |
+
name: "Starter",
|
| 63 |
+
price: "$0",
|
| 64 |
+
period: "forever",
|
| 65 |
+
features: [
|
| 66 |
+
"Up to 3 sites",
|
| 67 |
+
"1GB storage",
|
| 68 |
+
"Community support",
|
| 69 |
+
"Basic templates",
|
| 70 |
+
],
|
| 71 |
+
},
|
| 72 |
+
{
|
| 73 |
+
name: "Pro",
|
| 74 |
+
price: "$19",
|
| 75 |
+
period: "per month",
|
| 76 |
+
features: [
|
| 77 |
+
"Unlimited sites",
|
| 78 |
+
"50GB storage",
|
| 79 |
+
"Priority support",
|
| 80 |
+
"Advanced templates",
|
| 81 |
+
"Custom domains",
|
| 82 |
+
"SSL certificates",
|
| 83 |
+
],
|
| 84 |
+
popular: true,
|
| 85 |
+
},
|
| 86 |
+
{
|
| 87 |
+
name: "Enterprise",
|
| 88 |
+
price: "Custom",
|
| 89 |
+
period: "contact us",
|
| 90 |
+
features: [
|
| 91 |
+
"Everything in Pro",
|
| 92 |
+
"Dedicated support",
|
| 93 |
+
"SLA guarantees",
|
| 94 |
+
"Team collaboration",
|
| 95 |
+
"Advanced security",
|
| 96 |
+
],
|
| 97 |
+
},
|
| 98 |
+
];
|
| 99 |
+
|
| 100 |
+
export default function MarketingDemo() {
|
| 101 |
+
return (
|
| 102 |
+
<div className="min-h-screen bg-background">
|
| 103 |
+
{/* Hero Section */}
|
| 104 |
+
<section className="relative overflow-hidden">
|
| 105 |
+
<div className="absolute inset-0 bg-gradient-to-b from-primary/5 via-background to-background" />
|
| 106 |
+
<div className="relative mx-auto max-w-7xl px-6 py-24 md:py-32">
|
| 107 |
+
<div className="mx-auto max-w-3xl text-center">
|
| 108 |
+
<Badge variant="outline" className="mb-6">
|
| 109 |
+
<IconRocket className="mr-1 size-3" />
|
| 110 |
+
Now in Beta
|
| 111 |
+
</Badge>
|
| 112 |
+
<h1 className="mb-6 text-5xl font-bold tracking-tight md:text-6xl lg:text-7xl">
|
| 113 |
+
Build web apps on{" "}
|
| 114 |
+
<span className="bg-gradient-to-r from-primary to-primary/60 bg-clip-text text-transparent">
|
| 115 |
+
your computer
|
| 116 |
+
</span>
|
| 117 |
+
</h1>
|
| 118 |
+
<p className="mb-8 text-xl text-muted-foreground md:text-2xl">
|
| 119 |
+
Create, host, and publish websites and services without managing
|
| 120 |
+
servers. Everything runs on your Zo Computer.
|
| 121 |
+
</p>
|
| 122 |
+
<div className="flex flex-col items-center justify-center gap-4 sm:flex-row">
|
| 123 |
+
<Button size="lg" className="w-full sm:w-auto">
|
| 124 |
+
Get Started Free
|
| 125 |
+
</Button>
|
| 126 |
+
<Button size="lg" variant="outline" className="w-full sm:w-auto">
|
| 127 |
+
<IconBrandGithub className="mr-2 size-5" />
|
| 128 |
+
View on GitHub
|
| 129 |
+
</Button>
|
| 130 |
+
</div>
|
| 131 |
+
</div>
|
| 132 |
+
</div>
|
| 133 |
+
</section>
|
| 134 |
+
|
| 135 |
+
{/* Features Section */}
|
| 136 |
+
<section className="mx-auto max-w-7xl px-6 py-24">
|
| 137 |
+
<div className="mb-16 text-center">
|
| 138 |
+
<h2 className="mb-4 text-3xl font-bold tracking-tight md:text-4xl">
|
| 139 |
+
Everything you need to build
|
| 140 |
+
</h2>
|
| 141 |
+
<p className="text-lg text-muted-foreground">
|
| 142 |
+
Powerful features that make development simple and fast
|
| 143 |
+
</p>
|
| 144 |
+
</div>
|
| 145 |
+
<div className="grid gap-8 md:grid-cols-2 lg:grid-cols-4">
|
| 146 |
+
{features.map((feature) => (
|
| 147 |
+
<Card key={feature.title} className="border-muted">
|
| 148 |
+
<CardHeader>
|
| 149 |
+
<div className="mb-2 flex h-12 w-12 items-center justify-center rounded-lg bg-primary/10">
|
| 150 |
+
<feature.icon className="h-6 w-6 text-primary" />
|
| 151 |
+
</div>
|
| 152 |
+
<CardTitle className="text-xl">{feature.title}</CardTitle>
|
| 153 |
+
</CardHeader>
|
| 154 |
+
<CardContent>
|
| 155 |
+
<p className="text-muted-foreground">{feature.description}</p>
|
| 156 |
+
</CardContent>
|
| 157 |
+
</Card>
|
| 158 |
+
))}
|
| 159 |
+
</div>
|
| 160 |
+
</section>
|
| 161 |
+
|
| 162 |
+
{/* Pricing Section */}
|
| 163 |
+
<section className="bg-muted/50 py-24">
|
| 164 |
+
<div className="mx-auto max-w-7xl px-6">
|
| 165 |
+
<div className="mb-16 text-center">
|
| 166 |
+
<h2 className="mb-4 text-3xl font-bold tracking-tight md:text-4xl">
|
| 167 |
+
Simple, transparent pricing
|
| 168 |
+
</h2>
|
| 169 |
+
<p className="text-lg text-muted-foreground">
|
| 170 |
+
Choose the plan that's right for you
|
| 171 |
+
</p>
|
| 172 |
+
</div>
|
| 173 |
+
<div className="grid gap-8 md:grid-cols-3">
|
| 174 |
+
{plans.map((plan) => (
|
| 175 |
+
<Card
|
| 176 |
+
key={plan.name}
|
| 177 |
+
className={
|
| 178 |
+
plan.popular ? "border-primary shadow-lg" : "border-muted"
|
| 179 |
+
}
|
| 180 |
+
>
|
| 181 |
+
{plan.popular && (
|
| 182 |
+
<div className="bg-primary px-4 py-2 text-center text-sm font-medium text-primary-foreground">
|
| 183 |
+
Most Popular
|
| 184 |
+
</div>
|
| 185 |
+
)}
|
| 186 |
+
<CardHeader className="text-center">
|
| 187 |
+
<CardTitle className="text-2xl">{plan.name}</CardTitle>
|
| 188 |
+
<div className="mt-4">
|
| 189 |
+
<span className="text-4xl font-bold">{plan.price}</span>
|
| 190 |
+
<span className="text-muted-foreground">
|
| 191 |
+
{" "}
|
| 192 |
+
/ {plan.period}
|
| 193 |
+
</span>
|
| 194 |
+
</div>
|
| 195 |
+
</CardHeader>
|
| 196 |
+
<CardContent>
|
| 197 |
+
<ul className="space-y-3">
|
| 198 |
+
{plan.features.map((feature) => (
|
| 199 |
+
<li key={feature} className="flex items-start gap-2">
|
| 200 |
+
<IconCheck className="mt-0.5 h-5 w-5 shrink-0 text-primary" />
|
| 201 |
+
<span className="text-sm">{feature}</span>
|
| 202 |
+
</li>
|
| 203 |
+
))}
|
| 204 |
+
</ul>
|
| 205 |
+
<Button
|
| 206 |
+
className="mt-6 w-full"
|
| 207 |
+
variant={plan.popular ? "default" : "outline"}
|
| 208 |
+
>
|
| 209 |
+
{plan.name === "Enterprise"
|
| 210 |
+
? "Contact Sales"
|
| 211 |
+
: "Get Started"}
|
| 212 |
+
</Button>
|
| 213 |
+
</CardContent>
|
| 214 |
+
</Card>
|
| 215 |
+
))}
|
| 216 |
+
</div>
|
| 217 |
+
</div>
|
| 218 |
+
</section>
|
| 219 |
+
|
| 220 |
+
{/* CTA Section */}
|
| 221 |
+
<section className="mx-auto max-w-7xl px-6 py-24">
|
| 222 |
+
<Card className="border-primary/20 bg-gradient-to-br from-primary/10 via-primary/5 to-background">
|
| 223 |
+
<CardContent className="p-12 text-center">
|
| 224 |
+
<h2 className="mb-4 text-3xl font-bold tracking-tight md:text-4xl">
|
| 225 |
+
Ready to get started?
|
| 226 |
+
</h2>
|
| 227 |
+
<p className="mb-8 text-lg text-muted-foreground">
|
| 228 |
+
Join thousands of developers building on Zo Computer
|
| 229 |
+
</p>
|
| 230 |
+
<Button size="lg">Create Your First Site</Button>
|
| 231 |
+
</CardContent>
|
| 232 |
+
</Card>
|
| 233 |
+
</section>
|
| 234 |
+
|
| 235 |
+
{/* Footer */}
|
| 236 |
+
<footer className="border-t bg-muted/30">
|
| 237 |
+
<div className="mx-auto max-w-7xl px-6 py-12">
|
| 238 |
+
<div className="grid gap-8 md:grid-cols-4">
|
| 239 |
+
<div>
|
| 240 |
+
<h3 className="mb-4 font-semibold">Product</h3>
|
| 241 |
+
<ul className="space-y-2 text-sm text-muted-foreground">
|
| 242 |
+
<li>Features</li>
|
| 243 |
+
<li>Pricing</li>
|
| 244 |
+
<li>Documentation</li>
|
| 245 |
+
<li>Changelog</li>
|
| 246 |
+
</ul>
|
| 247 |
+
</div>
|
| 248 |
+
<div>
|
| 249 |
+
<h3 className="mb-4 font-semibold">Company</h3>
|
| 250 |
+
<ul className="space-y-2 text-sm text-muted-foreground">
|
| 251 |
+
<li>About</li>
|
| 252 |
+
<li>Blog</li>
|
| 253 |
+
<li>Careers</li>
|
| 254 |
+
<li>Contact</li>
|
| 255 |
+
</ul>
|
| 256 |
+
</div>
|
| 257 |
+
<div>
|
| 258 |
+
<h3 className="mb-4 font-semibold">Resources</h3>
|
| 259 |
+
<ul className="space-y-2 text-sm text-muted-foreground">
|
| 260 |
+
<li>Community</li>
|
| 261 |
+
<li>Help Center</li>
|
| 262 |
+
<li>Status</li>
|
| 263 |
+
<li>API Reference</li>
|
| 264 |
+
</ul>
|
| 265 |
+
</div>
|
| 266 |
+
<div>
|
| 267 |
+
<h3 className="mb-4 font-semibold">Legal</h3>
|
| 268 |
+
<ul className="space-y-2 text-sm text-muted-foreground">
|
| 269 |
+
<li>Privacy</li>
|
| 270 |
+
<li>Terms</li>
|
| 271 |
+
<li>Security</li>
|
| 272 |
+
<li>Compliance</li>
|
| 273 |
+
</ul>
|
| 274 |
+
</div>
|
| 275 |
+
</div>
|
| 276 |
+
<div className="mt-12 border-t pt-8 text-center text-sm text-muted-foreground">
|
| 277 |
+
<p>© 2025 Zo Computer. This is a demo marketing page template.</p>
|
| 278 |
+
</div>
|
| 279 |
+
</div>
|
| 280 |
+
</footer>
|
| 281 |
+
</div>
|
| 282 |
+
);
|
| 283 |
+
}
|
src/styles.css
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@import "tailwindcss";
|
| 2 |
+
@import "tw-animate-css";
|
| 3 |
+
@plugin "@tailwindcss/typography";
|
| 4 |
+
|
| 5 |
+
@custom-variant dark (&:is(.dark *));
|
| 6 |
+
|
| 7 |
+
:root {
|
| 8 |
+
color-scheme: light dark;
|
| 9 |
+
font-synthesis: none;
|
| 10 |
+
text-rendering: optimizeLegibility;
|
| 11 |
+
-webkit-font-smoothing: antialiased;
|
| 12 |
+
-moz-osx-font-smoothing: grayscale;
|
| 13 |
+
|
| 14 |
+
--radius: 0.625rem;
|
| 15 |
+
--background: oklch(1 0 0);
|
| 16 |
+
--foreground: oklch(0.147 0.004 49.25);
|
| 17 |
+
--card: oklch(1 0 0);
|
| 18 |
+
--card-foreground: oklch(0.147 0.004 49.25);
|
| 19 |
+
--popover: oklch(1 0 0);
|
| 20 |
+
--popover-foreground: oklch(0.147 0.004 49.25);
|
| 21 |
+
--primary: oklch(0.216 0.006 56.043);
|
| 22 |
+
--primary-foreground: oklch(0.985 0.001 106.423);
|
| 23 |
+
--secondary: oklch(0.97 0.001 106.424);
|
| 24 |
+
--secondary-foreground: oklch(0.216 0.006 56.043);
|
| 25 |
+
--muted: oklch(0.97 0.001 106.424);
|
| 26 |
+
--muted-foreground: oklch(0.553 0.013 58.071);
|
| 27 |
+
--accent: oklch(0.97 0.001 106.424);
|
| 28 |
+
--accent-foreground: oklch(0.216 0.006 56.043);
|
| 29 |
+
--destructive: oklch(0.577 0.245 27.325);
|
| 30 |
+
--border: oklch(0.923 0.003 48.717);
|
| 31 |
+
--input: oklch(0.923 0.003 48.717);
|
| 32 |
+
--ring: oklch(0.709 0.01 56.259);
|
| 33 |
+
--chart-1: oklch(0.646 0.222 41.116);
|
| 34 |
+
--chart-2: oklch(0.6 0.118 184.704);
|
| 35 |
+
--chart-3: oklch(0.398 0.07 227.392);
|
| 36 |
+
--chart-4: oklch(0.828 0.189 84.429);
|
| 37 |
+
--chart-5: oklch(0.769 0.188 70.08);
|
| 38 |
+
--sidebar: oklch(0.985 0.001 106.423);
|
| 39 |
+
--sidebar-foreground: oklch(0.147 0.004 49.25);
|
| 40 |
+
--sidebar-primary: oklch(0.216 0.006 56.043);
|
| 41 |
+
--sidebar-primary-foreground: oklch(0.985 0.001 106.423);
|
| 42 |
+
--sidebar-accent: oklch(0.97 0.001 106.424);
|
| 43 |
+
--sidebar-accent-foreground: oklch(0.216 0.006 56.043);
|
| 44 |
+
--sidebar-border: oklch(0.923 0.003 48.717);
|
| 45 |
+
--sidebar-ring: oklch(0.709 0.01 56.259);
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
.dark {
|
| 49 |
+
--background: oklch(0.147 0.004 49.25);
|
| 50 |
+
--foreground: oklch(0.985 0.001 106.423);
|
| 51 |
+
--card: oklch(0.216 0.006 56.043);
|
| 52 |
+
--card-foreground: oklch(0.985 0.001 106.423);
|
| 53 |
+
--popover: oklch(0.216 0.006 56.043);
|
| 54 |
+
--popover-foreground: oklch(0.985 0.001 106.423);
|
| 55 |
+
--primary: oklch(0.923 0.003 48.717);
|
| 56 |
+
--primary-foreground: oklch(0.216 0.006 56.043);
|
| 57 |
+
--secondary: oklch(0.268 0.007 34.298);
|
| 58 |
+
--secondary-foreground: oklch(0.985 0.001 106.423);
|
| 59 |
+
--muted: oklch(0.268 0.007 34.298);
|
| 60 |
+
--muted-foreground: oklch(0.709 0.01 56.259);
|
| 61 |
+
--accent: oklch(0.268 0.007 34.298);
|
| 62 |
+
--accent-foreground: oklch(0.985 0.001 106.423);
|
| 63 |
+
--destructive: oklch(0.704 0.191 22.216);
|
| 64 |
+
--border: oklch(1 0 0 / 10%);
|
| 65 |
+
--input: oklch(1 0 0 / 15%);
|
| 66 |
+
--ring: oklch(0.553 0.013 58.071);
|
| 67 |
+
--chart-1: oklch(0.488 0.243 264.376);
|
| 68 |
+
--chart-2: oklch(0.696 0.17 162.48);
|
| 69 |
+
--chart-3: oklch(0.769 0.188 70.08);
|
| 70 |
+
--chart-4: oklch(0.627 0.265 303.9);
|
| 71 |
+
--chart-5: oklch(0.645 0.246 16.439);
|
| 72 |
+
--sidebar: oklch(0.216 0.006 56.043);
|
| 73 |
+
--sidebar-foreground: oklch(0.985 0.001 106.423);
|
| 74 |
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
| 75 |
+
--sidebar-primary-foreground: oklch(0.985 0.001 106.423);
|
| 76 |
+
--sidebar-accent: oklch(0.268 0.007 34.298);
|
| 77 |
+
--sidebar-accent-foreground: oklch(0.985 0.001 106.423);
|
| 78 |
+
--sidebar-border: oklch(1 0 0 / 10%);
|
| 79 |
+
--sidebar-ring: oklch(0.553 0.013 58.071);
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
body {
|
| 83 |
+
margin: 0;
|
| 84 |
+
}
|
| 85 |
+
|
| 86 |
+
@theme inline {
|
| 87 |
+
--radius-sm: calc(var(--radius) - 4px);
|
| 88 |
+
--radius-md: calc(var(--radius) - 2px);
|
| 89 |
+
--radius-lg: var(--radius);
|
| 90 |
+
--radius-xl: calc(var(--radius) + 4px);
|
| 91 |
+
--color-background: var(--background);
|
| 92 |
+
--color-foreground: var(--foreground);
|
| 93 |
+
--color-card: var(--card);
|
| 94 |
+
--color-card-foreground: var(--card-foreground);
|
| 95 |
+
--color-popover: var(--popover);
|
| 96 |
+
--color-popover-foreground: var(--popover-foreground);
|
| 97 |
+
--color-primary: var(--primary);
|
| 98 |
+
--color-primary-foreground: var(--primary-foreground);
|
| 99 |
+
--color-secondary: var(--secondary);
|
| 100 |
+
--color-secondary-foreground: var(--secondary-foreground);
|
| 101 |
+
--color-muted: var(--muted);
|
| 102 |
+
--color-muted-foreground: var(--muted-foreground);
|
| 103 |
+
--color-accent: var(--accent);
|
| 104 |
+
--color-accent-foreground: var(--accent-foreground);
|
| 105 |
+
--color-destructive: var(--destructive);
|
| 106 |
+
--color-border: var(--border);
|
| 107 |
+
--color-input: var(--input);
|
| 108 |
+
--color-ring: var(--ring);
|
| 109 |
+
--color-chart-1: var(--chart-1);
|
| 110 |
+
--color-chart-2: var(--chart-2);
|
| 111 |
+
--color-chart-3: var(--chart-3);
|
| 112 |
+
--color-chart-4: var(--chart-4);
|
| 113 |
+
--color-chart-5: var(--chart-5);
|
| 114 |
+
--color-sidebar: var(--sidebar);
|
| 115 |
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
| 116 |
+
--color-sidebar-primary: var(--sidebar-primary);
|
| 117 |
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
| 118 |
+
--color-sidebar-accent: var(--sidebar-accent);
|
| 119 |
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
| 120 |
+
--color-sidebar-border: var(--sidebar-border);
|
| 121 |
+
--color-sidebar-ring: var(--sidebar-ring);
|
| 122 |
+
}
|
| 123 |
+
|
| 124 |
+
@layer base {
|
| 125 |
+
* {
|
| 126 |
+
@apply border-border outline-ring/50;
|
| 127 |
+
}
|
| 128 |
+
body {
|
| 129 |
+
@apply bg-background text-foreground;
|
| 130 |
+
}
|
| 131 |
+
}
|
tsconfig.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"compilerOptions": {
|
| 3 |
+
"strict": true,
|
| 4 |
+
"jsx": "react-jsx",
|
| 5 |
+
"resolveJsonModule": true,
|
| 6 |
+
"esModuleInterop": true,
|
| 7 |
+
"moduleResolution": "bundler",
|
| 8 |
+
"module": "esnext",
|
| 9 |
+
"target": "esnext",
|
| 10 |
+
"lib": ["ESNext", "DOM"],
|
| 11 |
+
"types": ["bun-types", "vite/client"],
|
| 12 |
+
"skipLibCheck": true,
|
| 13 |
+
"baseUrl": ".",
|
| 14 |
+
"paths": {
|
| 15 |
+
"@/*": ["./src/*"]
|
| 16 |
+
}
|
| 17 |
+
},
|
| 18 |
+
"include": [
|
| 19 |
+
"**/*.ts",
|
| 20 |
+
"**/*.tsx",
|
| 21 |
+
"**/*.js",
|
| 22 |
+
"**/*.jsx",
|
| 23 |
+
"src",
|
| 24 |
+
"zosite.json",
|
| 25 |
+
"vite.config.ts",
|
| 26 |
+
"types",
|
| 27 |
+
"**/*.d.ts"
|
| 28 |
+
],
|
| 29 |
+
"exclude": ["dist", "node_modules"]
|
| 30 |
+
}
|
vite.config.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import path from "path";
|
| 2 |
+
import tailwindcss from "@tailwindcss/vite";
|
| 3 |
+
import react from "@vitejs/plugin-react-swc";
|
| 4 |
+
import { defineConfig } from "vite";
|
| 5 |
+
|
| 6 |
+
export default defineConfig({
|
| 7 |
+
plugins: [react(), tailwindcss()],
|
| 8 |
+
resolve: {
|
| 9 |
+
alias: {
|
| 10 |
+
"@": path.resolve(__dirname, "./src"),
|
| 11 |
+
},
|
| 12 |
+
},
|
| 13 |
+
server: {
|
| 14 |
+
port: process.env.PORT ? parseInt(process.env.PORT, 10) : 5173,
|
| 15 |
+
strictPort: true,
|
| 16 |
+
hmr: false,
|
| 17 |
+
},
|
| 18 |
+
build: {
|
| 19 |
+
outDir: "dist",
|
| 20 |
+
emptyOutDir: true,
|
| 21 |
+
},
|
| 22 |
+
});
|
zosite.json
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"name": "alphamate",
|
| 3 |
+
"local_port": 50019,
|
| 4 |
+
"entrypoint": "bun run dev",
|
| 5 |
+
"publish": {
|
| 6 |
+
"label": "alphamate",
|
| 7 |
+
"type": "http",
|
| 8 |
+
"entrypoint": "bun run prod",
|
| 9 |
+
"published_port": 54160,
|
| 10 |
+
"env": {
|
| 11 |
+
"NODE_ENV": "production",
|
| 12 |
+
"ZO_CLIENT_IDENTITY_TOKEN": "none"
|
| 13 |
+
}
|
| 14 |
+
}
|
| 15 |
+
}
|