Compare commits
	
		
			7 Commits
		
	
	
		
			fbf4f5f98f
			...
			v0.0.1-sna
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 82e10b72c7 | ||
|   | 1219deea89 | ||
|   | b5b9d94119 | ||
|   | d5959ca3c3 | ||
| 185ce1fac1 | |||
|   | c11bb6d637 | ||
| a1e2239458 | 
							
								
								
									
										62
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| # 依赖 | ||||
| node_modules | ||||
| npm-debug.log* | ||||
| yarn-debug.log* | ||||
| yarn-error.log* | ||||
| pnpm-debug.log* | ||||
|  | ||||
| # 构建产物 | ||||
| dist | ||||
| dist-ssr | ||||
| *.local | ||||
|  | ||||
| # 编辑器 | ||||
| .vscode | ||||
| .idea | ||||
| *.swp | ||||
| *.swo | ||||
| *~ | ||||
|  | ||||
| # 操作系统 | ||||
| .DS_Store | ||||
| Thumbs.db | ||||
|  | ||||
| # Git | ||||
| .git | ||||
| .gitignore | ||||
| .gitattributes | ||||
|  | ||||
| # CI/CD | ||||
| .gitea | ||||
| .github | ||||
| .gitlab-ci.yml | ||||
|  | ||||
| # Docker | ||||
| Dockerfile | ||||
| .dockerignore | ||||
| docker-compose.yaml | ||||
| docker-compose.*.yaml | ||||
| compose*yaml | ||||
|  | ||||
| # 测试 | ||||
| coverage | ||||
| .nyc_output | ||||
|  | ||||
| # 环境变量 | ||||
| .env | ||||
| .env.local | ||||
| .env.*.local | ||||
|  | ||||
| # 日志 | ||||
| logs | ||||
| *.log | ||||
|  | ||||
| # 临时文件 | ||||
| tmp | ||||
| temp | ||||
|  | ||||
| # 文档 | ||||
| README.md | ||||
| LICENSE | ||||
| *.md | ||||
|  | ||||
							
								
								
									
										48
									
								
								.gitea/workflows/build.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								.gitea/workflows/build.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| name: Build and Push Docker Image | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     tags: | ||||
|       - 'v*' | ||||
|  | ||||
| jobs: | ||||
|   build: | ||||
|     runs-on: ubuntu-latest | ||||
|      | ||||
|     steps: | ||||
|       - name: 检出代码 | ||||
|         uses: actions/checkout@v4 | ||||
|          | ||||
|       - name: 设置 Docker Buildx | ||||
|         uses: docker/setup-buildx-action@v3 | ||||
|          | ||||
|       - name: 登录到 Gitea Container Registry | ||||
|         uses: docker/login-action@v3 | ||||
|         with: | ||||
|           registry: ${{ secrets.REGISTRY_ENDPOINT }} | ||||
|           username: ${{ secrets.REGISTRY_USERNAME }} | ||||
|           password: ${{ secrets.REGISTRY_PASSWORD }} | ||||
|        | ||||
|       - name: 提取 Docker 元数据 | ||||
|         id: meta | ||||
|         uses: docker/metadata-action@v5 | ||||
|         with: | ||||
|           images: | | ||||
|             ${{ secrets.REGISTRY_ENDPOINT }}/${{ github.repository_owner }}/litek | ||||
|           tags: | | ||||
|             type=semver,pattern={{version}} | ||||
|             type=semver,pattern={{major}}.{{minor}} | ||||
|             type=semver,pattern={{major}} | ||||
|             type=raw,value=latest,enable=${{ !contains(github.ref, 'snapshot') && !contains(github.ref, 'alpha') && !contains(github.ref, 'beta') }} | ||||
|        | ||||
|       - name: 构建并推送 Docker 镜像 | ||||
|         uses: docker/build-push-action@v5 | ||||
|         with: | ||||
|           context: . | ||||
|           push: true | ||||
|           tags: ${{ steps.meta.outputs.tags }} | ||||
|           labels: ${{ steps.meta.outputs.labels }} | ||||
|           cache-from: type=local,src=/cache | ||||
|           cache-to: type=local,dest=/cache,mode=max | ||||
|           platforms: linux/amd64,linux/arm64 | ||||
|  | ||||
							
								
								
									
										36
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| # 第一阶段: 构建应用 | ||||
| FROM node:22-alpine AS builder | ||||
|  | ||||
| # 安装 pnpm | ||||
| RUN corepack enable && corepack prepare pnpm@latest --activate | ||||
|  | ||||
| # 设置工作目录 | ||||
| WORKDIR /app | ||||
|  | ||||
| # 复制依赖配置文件 | ||||
| COPY package.json pnpm-lock.yaml ./ | ||||
|  | ||||
| # 安装依赖 | ||||
| RUN pnpm install --frozen-lockfile | ||||
|  | ||||
| # 复制源代码 | ||||
| COPY . . | ||||
|  | ||||
| # 构建应用 | ||||
| RUN pnpm build | ||||
|  | ||||
| # 第二阶段: 运行应用 | ||||
| FROM nginx:alpine | ||||
|  | ||||
| # 复制自定义 nginx 配置 | ||||
| COPY nginx.conf /etc/nginx/nginx.conf | ||||
|  | ||||
| # 从构建阶段复制构建产物 | ||||
| COPY --from=builder /app/dist /usr/share/nginx/html | ||||
|  | ||||
| # 暴露端口 | ||||
| EXPOSE 80 | ||||
|  | ||||
| # 启动 nginx | ||||
| CMD ["nginx", "-g", "daemon off;"] | ||||
|  | ||||
							
								
								
									
										22
									
								
								components.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								components.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| { | ||||
|   "$schema": "https://ui.shadcn.com/schema.json", | ||||
|   "style": "new-york", | ||||
|   "rsc": false, | ||||
|   "tsx": true, | ||||
|   "tailwind": { | ||||
|     "config": "", | ||||
|     "css": "src/index.css", | ||||
|     "baseColor": "gray", | ||||
|     "cssVariables": true, | ||||
|     "prefix": "" | ||||
|   }, | ||||
|   "iconLibrary": "lucide", | ||||
|   "aliases": { | ||||
|     "components": "@/components", | ||||
|     "utils": "@/lib/utils", | ||||
|     "ui": "@/components/ui", | ||||
|     "lib": "@/lib", | ||||
|     "hooks": "@/hooks" | ||||
|   }, | ||||
|   "registries": {} | ||||
| } | ||||
							
								
								
									
										73
									
								
								nginx.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								nginx.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| user nginx; | ||||
| worker_processes auto; | ||||
| error_log /var/log/nginx/error.log warn; | ||||
| pid /var/run/nginx.pid; | ||||
|  | ||||
| events { | ||||
|     worker_connections 1024; | ||||
| } | ||||
|  | ||||
| http { | ||||
|     include /etc/nginx/mime.types; | ||||
|     default_type application/octet-stream; | ||||
|  | ||||
|     log_format main '$remote_addr - $remote_user [$time_local] "$request" ' | ||||
|                     '$status $body_bytes_sent "$http_referer" ' | ||||
|                     '"$http_user_agent" "$http_x_forwarded_for"'; | ||||
|  | ||||
|     access_log /var/log/nginx/access.log main; | ||||
|  | ||||
|     sendfile on; | ||||
|     tcp_nopush on; | ||||
|     tcp_nodelay on; | ||||
|     keepalive_timeout 65; | ||||
|     types_hash_max_size 2048; | ||||
|  | ||||
|     # Gzip 压缩配置 | ||||
|     gzip on; | ||||
|     gzip_vary on; | ||||
|     gzip_proxied any; | ||||
|     gzip_comp_level 6; | ||||
|     gzip_types text/plain text/css text/xml text/javascript  | ||||
|                application/json application/javascript application/xml+rss  | ||||
|                application/rss+xml font/truetype font/opentype  | ||||
|                application/vnd.ms-fontobject image/svg+xml; | ||||
|  | ||||
|     server { | ||||
|         listen 80; | ||||
|         server_name localhost; | ||||
|         root /usr/share/nginx/html; | ||||
|         index index.html; | ||||
|  | ||||
|         # 安全头 | ||||
|         add_header X-Frame-Options "SAMEORIGIN" always; | ||||
|         add_header X-Content-Type-Options "nosniff" always; | ||||
|         add_header X-XSS-Protection "1; mode=block" always; | ||||
|  | ||||
|         # 静态资源缓存 | ||||
|         location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { | ||||
|             expires 1y; | ||||
|             add_header Cache-Control "public, immutable"; | ||||
|         } | ||||
|  | ||||
|         # SPA 路由支持 - 所有请求都返回 index.html | ||||
|         location / { | ||||
|             try_files $uri $uri/ /index.html; | ||||
|         } | ||||
|  | ||||
|         # 健康检查端点 | ||||
|         location /health { | ||||
|             access_log off; | ||||
|             return 200 "healthy\n"; | ||||
|             add_header Content-Type text/plain; | ||||
|         } | ||||
|  | ||||
|         # 错误页面 | ||||
|         error_page 404 /index.html; | ||||
|         error_page 500 502 503 504 /50x.html; | ||||
|         location = /50x.html { | ||||
|             root /usr/share/nginx/html; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										10
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								package.json
									
									
									
									
									
								
							| @@ -10,8 +10,15 @@ | ||||
|     "preview": "vite preview" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@radix-ui/react-slot": "^1.2.3", | ||||
|     "@tailwindcss/vite": "^4.1.16", | ||||
|     "class-variance-authority": "^0.7.1", | ||||
|     "clsx": "^2.1.1", | ||||
|     "lucide-react": "^0.548.0", | ||||
|     "react": "^19.1.1", | ||||
|     "react-dom": "^19.1.1" | ||||
|     "react-dom": "^19.1.1", | ||||
|     "tailwind-merge": "^3.3.1", | ||||
|     "tailwindcss": "^4.1.16" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@eslint/js": "^9.36.0", | ||||
| @@ -23,6 +30,7 @@ | ||||
|     "eslint-plugin-react-hooks": "^5.2.0", | ||||
|     "eslint-plugin-react-refresh": "^0.4.22", | ||||
|     "globals": "^16.4.0", | ||||
|     "tw-animate-css": "^1.4.0", | ||||
|     "typescript": "~5.9.3", | ||||
|     "typescript-eslint": "^8.45.0", | ||||
|     "vite": "npm:rolldown-vite@7.1.14" | ||||
|   | ||||
							
								
								
									
										356
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										356
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							| @@ -11,12 +11,33 @@ importers: | ||||
|  | ||||
|   .: | ||||
|     dependencies: | ||||
|       '@radix-ui/react-slot': | ||||
|         specifier: ^1.2.3 | ||||
|         version: 1.2.3(@types/react@19.2.2)(react@19.2.0) | ||||
|       '@tailwindcss/vite': | ||||
|         specifier: ^4.1.16 | ||||
|         version: 4.1.16(rolldown-vite@7.1.14(@types/node@24.9.1)(jiti@2.6.1)) | ||||
|       class-variance-authority: | ||||
|         specifier: ^0.7.1 | ||||
|         version: 0.7.1 | ||||
|       clsx: | ||||
|         specifier: ^2.1.1 | ||||
|         version: 2.1.1 | ||||
|       lucide-react: | ||||
|         specifier: ^0.548.0 | ||||
|         version: 0.548.0(react@19.2.0) | ||||
|       react: | ||||
|         specifier: ^19.1.1 | ||||
|         version: 19.2.0 | ||||
|       react-dom: | ||||
|         specifier: ^19.1.1 | ||||
|         version: 19.2.0(react@19.2.0) | ||||
|       tailwind-merge: | ||||
|         specifier: ^3.3.1 | ||||
|         version: 3.3.1 | ||||
|       tailwindcss: | ||||
|         specifier: ^4.1.16 | ||||
|         version: 4.1.16 | ||||
|     devDependencies: | ||||
|       '@eslint/js': | ||||
|         specifier: ^9.36.0 | ||||
| @@ -32,28 +53,31 @@ importers: | ||||
|         version: 19.2.2(@types/react@19.2.2) | ||||
|       '@vitejs/plugin-react': | ||||
|         specifier: ^5.1.0 | ||||
|         version: 5.1.0(rolldown-vite@7.1.14(@types/node@24.9.1)) | ||||
|         version: 5.1.0(rolldown-vite@7.1.14(@types/node@24.9.1)(jiti@2.6.1)) | ||||
|       eslint: | ||||
|         specifier: ^9.36.0 | ||||
|         version: 9.38.0 | ||||
|         version: 9.38.0(jiti@2.6.1) | ||||
|       eslint-plugin-react-hooks: | ||||
|         specifier: ^5.2.0 | ||||
|         version: 5.2.0(eslint@9.38.0) | ||||
|         version: 5.2.0(eslint@9.38.0(jiti@2.6.1)) | ||||
|       eslint-plugin-react-refresh: | ||||
|         specifier: ^0.4.22 | ||||
|         version: 0.4.24(eslint@9.38.0) | ||||
|         version: 0.4.24(eslint@9.38.0(jiti@2.6.1)) | ||||
|       globals: | ||||
|         specifier: ^16.4.0 | ||||
|         version: 16.4.0 | ||||
|       tw-animate-css: | ||||
|         specifier: ^1.4.0 | ||||
|         version: 1.4.0 | ||||
|       typescript: | ||||
|         specifier: ~5.9.3 | ||||
|         version: 5.9.3 | ||||
|       typescript-eslint: | ||||
|         specifier: ^8.45.0 | ||||
|         version: 8.46.2(eslint@9.38.0)(typescript@5.9.3) | ||||
|         version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) | ||||
|       vite: | ||||
|         specifier: npm:rolldown-vite@7.1.14 | ||||
|         version: rolldown-vite@7.1.14(@types/node@24.9.1) | ||||
|         version: rolldown-vite@7.1.14(@types/node@24.9.1)(jiti@2.6.1) | ||||
|  | ||||
| packages: | ||||
|  | ||||
| @@ -241,6 +265,24 @@ packages: | ||||
|   '@oxc-project/types@0.93.0': | ||||
|     resolution: {integrity: sha512-yNtwmWZIBtJsMr5TEfoZFDxIWV6OdScOpza/f5YxbqUMJk+j6QX3Cf3jgZShGEFYWQJ5j9mJ6jM0tZHu2J9Yrg==} | ||||
|  | ||||
|   '@radix-ui/react-compose-refs@1.1.2': | ||||
|     resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} | ||||
|     peerDependencies: | ||||
|       '@types/react': '*' | ||||
|       react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
|  | ||||
|   '@radix-ui/react-slot@1.2.3': | ||||
|     resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} | ||||
|     peerDependencies: | ||||
|       '@types/react': '*' | ||||
|       react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc | ||||
|     peerDependenciesMeta: | ||||
|       '@types/react': | ||||
|         optional: true | ||||
|  | ||||
|   '@rolldown/binding-android-arm64@1.0.0-beta.41': | ||||
|     resolution: {integrity: sha512-Edflndd9lU7JVhVIvJlZhdCj5DkhYDJPIRn4Dx0RUdfc8asP9xHOI5gMd8MesDDx+BJpdIT/uAmVTearteU/mQ==} | ||||
|     engines: {node: ^20.19.0 || >=22.12.0} | ||||
| @@ -330,6 +372,96 @@ packages: | ||||
|   '@rolldown/pluginutils@1.0.0-beta.43': | ||||
|     resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==} | ||||
|  | ||||
|   '@tailwindcss/node@4.1.16': | ||||
|     resolution: {integrity: sha512-BX5iaSsloNuvKNHRN3k2RcCuTEgASTo77mofW0vmeHkfrDWaoFAFvNHpEgtu0eqyypcyiBkDWzSMxJhp3AUVcw==} | ||||
|  | ||||
|   '@tailwindcss/oxide-android-arm64@4.1.16': | ||||
|     resolution: {integrity: sha512-8+ctzkjHgwDJ5caq9IqRSgsP70xhdhJvm+oueS/yhD5ixLhqTw9fSL1OurzMUhBwE5zK26FXLCz2f/RtkISqHA==} | ||||
|     engines: {node: '>= 10'} | ||||
|     cpu: [arm64] | ||||
|     os: [android] | ||||
|  | ||||
|   '@tailwindcss/oxide-darwin-arm64@4.1.16': | ||||
|     resolution: {integrity: sha512-C3oZy5042v2FOALBZtY0JTDnGNdS6w7DxL/odvSny17ORUnaRKhyTse8xYi3yKGyfnTUOdavRCdmc8QqJYwFKA==} | ||||
|     engines: {node: '>= 10'} | ||||
|     cpu: [arm64] | ||||
|     os: [darwin] | ||||
|  | ||||
|   '@tailwindcss/oxide-darwin-x64@4.1.16': | ||||
|     resolution: {integrity: sha512-vjrl/1Ub9+JwU6BP0emgipGjowzYZMjbWCDqwA2Z4vCa+HBSpP4v6U2ddejcHsolsYxwL5r4bPNoamlV0xDdLg==} | ||||
|     engines: {node: '>= 10'} | ||||
|     cpu: [x64] | ||||
|     os: [darwin] | ||||
|  | ||||
|   '@tailwindcss/oxide-freebsd-x64@4.1.16': | ||||
|     resolution: {integrity: sha512-TSMpPYpQLm+aR1wW5rKuUuEruc/oOX3C7H0BTnPDn7W/eMw8W+MRMpiypKMkXZfwH8wqPIRKppuZoedTtNj2tg==} | ||||
|     engines: {node: '>= 10'} | ||||
|     cpu: [x64] | ||||
|     os: [freebsd] | ||||
|  | ||||
|   '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.16': | ||||
|     resolution: {integrity: sha512-p0GGfRg/w0sdsFKBjMYvvKIiKy/LNWLWgV/plR4lUgrsxFAoQBFrXkZ4C0w8IOXfslB9vHK/JGASWD2IefIpvw==} | ||||
|     engines: {node: '>= 10'} | ||||
|     cpu: [arm] | ||||
|     os: [linux] | ||||
|  | ||||
|   '@tailwindcss/oxide-linux-arm64-gnu@4.1.16': | ||||
|     resolution: {integrity: sha512-DoixyMmTNO19rwRPdqviTrG1rYzpxgyYJl8RgQvdAQUzxC1ToLRqtNJpU/ATURSKgIg6uerPw2feW0aS8SNr/w==} | ||||
|     engines: {node: '>= 10'} | ||||
|     cpu: [arm64] | ||||
|     os: [linux] | ||||
|  | ||||
|   '@tailwindcss/oxide-linux-arm64-musl@4.1.16': | ||||
|     resolution: {integrity: sha512-H81UXMa9hJhWhaAUca6bU2wm5RRFpuHImrwXBUvPbYb+3jo32I9VIwpOX6hms0fPmA6f2pGVlybO6qU8pF4fzQ==} | ||||
|     engines: {node: '>= 10'} | ||||
|     cpu: [arm64] | ||||
|     os: [linux] | ||||
|  | ||||
|   '@tailwindcss/oxide-linux-x64-gnu@4.1.16': | ||||
|     resolution: {integrity: sha512-ZGHQxDtFC2/ruo7t99Qo2TTIvOERULPl5l0K1g0oK6b5PGqjYMga+FcY1wIUnrUxY56h28FxybtDEla+ICOyew==} | ||||
|     engines: {node: '>= 10'} | ||||
|     cpu: [x64] | ||||
|     os: [linux] | ||||
|  | ||||
|   '@tailwindcss/oxide-linux-x64-musl@4.1.16': | ||||
|     resolution: {integrity: sha512-Oi1tAaa0rcKf1Og9MzKeINZzMLPbhxvm7rno5/zuP1WYmpiG0bEHq4AcRUiG2165/WUzvxkW4XDYCscZWbTLZw==} | ||||
|     engines: {node: '>= 10'} | ||||
|     cpu: [x64] | ||||
|     os: [linux] | ||||
|  | ||||
|   '@tailwindcss/oxide-wasm32-wasi@4.1.16': | ||||
|     resolution: {integrity: sha512-B01u/b8LteGRwucIBmCQ07FVXLzImWESAIMcUU6nvFt/tYsQ6IHz8DmZ5KtvmwxD+iTYBtM1xwoGXswnlu9v0Q==} | ||||
|     engines: {node: '>=14.0.0'} | ||||
|     cpu: [wasm32] | ||||
|     bundledDependencies: | ||||
|       - '@napi-rs/wasm-runtime' | ||||
|       - '@emnapi/core' | ||||
|       - '@emnapi/runtime' | ||||
|       - '@tybys/wasm-util' | ||||
|       - '@emnapi/wasi-threads' | ||||
|       - tslib | ||||
|  | ||||
|   '@tailwindcss/oxide-win32-arm64-msvc@4.1.16': | ||||
|     resolution: {integrity: sha512-zX+Q8sSkGj6HKRTMJXuPvOcP8XfYON24zJBRPlszcH1Np7xuHXhWn8qfFjIujVzvH3BHU+16jBXwgpl20i+v9A==} | ||||
|     engines: {node: '>= 10'} | ||||
|     cpu: [arm64] | ||||
|     os: [win32] | ||||
|  | ||||
|   '@tailwindcss/oxide-win32-x64-msvc@4.1.16': | ||||
|     resolution: {integrity: sha512-m5dDFJUEejbFqP+UXVstd4W/wnxA4F61q8SoL+mqTypId2T2ZpuxosNSgowiCnLp2+Z+rivdU0AqpfgiD7yCBg==} | ||||
|     engines: {node: '>= 10'} | ||||
|     cpu: [x64] | ||||
|     os: [win32] | ||||
|  | ||||
|   '@tailwindcss/oxide@4.1.16': | ||||
|     resolution: {integrity: sha512-2OSv52FRuhdlgyOQqgtQHuCgXnS8nFSYRp2tJ+4WZXKgTxqPy7SMSls8c3mPT5pkZ17SBToGM5LHEJBO7miEdg==} | ||||
|     engines: {node: '>= 10'} | ||||
|  | ||||
|   '@tailwindcss/vite@4.1.16': | ||||
|     resolution: {integrity: sha512-bbguNBcDxsRmi9nnlWJxhfDWamY3lmcyACHcdO1crxfzuLpOhHLLtEIN/nCbbAtj5rchUgQD17QVAKi1f7IsKg==} | ||||
|     peerDependencies: | ||||
|       vite: ^5.2.0 || ^6 || ^7 | ||||
|  | ||||
|   '@tybys/wasm-util@0.10.1': | ||||
|     resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} | ||||
|  | ||||
| @@ -484,6 +616,13 @@ packages: | ||||
|     resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} | ||||
|     engines: {node: '>=10'} | ||||
|  | ||||
|   class-variance-authority@0.7.1: | ||||
|     resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} | ||||
|  | ||||
|   clsx@2.1.1: | ||||
|     resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} | ||||
|     engines: {node: '>=6'} | ||||
|  | ||||
|   color-convert@2.0.1: | ||||
|     resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} | ||||
|     engines: {node: '>=7.0.0'} | ||||
| @@ -523,6 +662,10 @@ packages: | ||||
|   electron-to-chromium@1.5.240: | ||||
|     resolution: {integrity: sha512-OBwbZjWgrCOH+g6uJsA2/7Twpas2OlepS9uvByJjR2datRDuKGYeD+nP8lBBks2qnB7bGJNHDUx7c/YLaT3QMQ==} | ||||
|  | ||||
|   enhanced-resolve@5.18.3: | ||||
|     resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} | ||||
|     engines: {node: '>=10.13.0'} | ||||
|  | ||||
|   escalade@3.2.0: | ||||
|     resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} | ||||
|     engines: {node: '>=6'} | ||||
| @@ -653,6 +796,9 @@ packages: | ||||
|     resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} | ||||
|     engines: {node: '>=18'} | ||||
|  | ||||
|   graceful-fs@4.2.11: | ||||
|     resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} | ||||
|  | ||||
|   graphemer@1.4.0: | ||||
|     resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} | ||||
|  | ||||
| @@ -691,6 +837,10 @@ packages: | ||||
|   isexe@2.0.0: | ||||
|     resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} | ||||
|  | ||||
|   jiti@2.6.1: | ||||
|     resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} | ||||
|     hasBin: true | ||||
|  | ||||
|   js-tokens@4.0.0: | ||||
|     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} | ||||
|  | ||||
| @@ -804,6 +954,14 @@ packages: | ||||
|   lru-cache@5.1.1: | ||||
|     resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} | ||||
|  | ||||
|   lucide-react@0.548.0: | ||||
|     resolution: {integrity: sha512-63b16z63jM9yc1MwxajHeuu0FRZFsDtljtDjYm26Kd86UQ5HQzu9ksEtoUUw4RBuewodw/tGFmvipePvRsKeDA==} | ||||
|     peerDependencies: | ||||
|       react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 | ||||
|  | ||||
|   magic-string@0.30.21: | ||||
|     resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} | ||||
|  | ||||
|   merge2@1.4.1: | ||||
|     resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} | ||||
|     engines: {node: '>= 8'} | ||||
| @@ -984,6 +1142,16 @@ packages: | ||||
|     resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} | ||||
|     engines: {node: '>=8'} | ||||
|  | ||||
|   tailwind-merge@3.3.1: | ||||
|     resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} | ||||
|  | ||||
|   tailwindcss@4.1.16: | ||||
|     resolution: {integrity: sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==} | ||||
|  | ||||
|   tapable@2.3.0: | ||||
|     resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} | ||||
|     engines: {node: '>=6'} | ||||
|  | ||||
|   tinyglobby@0.2.15: | ||||
|     resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} | ||||
|     engines: {node: '>=12.0.0'} | ||||
| @@ -1001,6 +1169,9 @@ packages: | ||||
|   tslib@2.8.1: | ||||
|     resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} | ||||
|  | ||||
|   tw-animate-css@1.4.0: | ||||
|     resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} | ||||
|  | ||||
|   type-check@0.4.0: | ||||
|     resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} | ||||
|     engines: {node: '>= 0.8.0'} | ||||
| @@ -1175,9 +1346,9 @@ snapshots: | ||||
|       tslib: 2.8.1 | ||||
|     optional: true | ||||
|  | ||||
|   '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0)': | ||||
|   '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0(jiti@2.6.1))': | ||||
|     dependencies: | ||||
|       eslint: 9.38.0 | ||||
|       eslint: 9.38.0(jiti@2.6.1) | ||||
|       eslint-visitor-keys: 3.4.3 | ||||
|  | ||||
|   '@eslint-community/regexpp@4.12.2': {} | ||||
| @@ -1274,6 +1445,19 @@ snapshots: | ||||
|  | ||||
|   '@oxc-project/types@0.93.0': {} | ||||
|  | ||||
|   '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.2)(react@19.2.0)': | ||||
|     dependencies: | ||||
|       react: 19.2.0 | ||||
|     optionalDependencies: | ||||
|       '@types/react': 19.2.2 | ||||
|  | ||||
|   '@radix-ui/react-slot@1.2.3(@types/react@19.2.2)(react@19.2.0)': | ||||
|     dependencies: | ||||
|       '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) | ||||
|       react: 19.2.0 | ||||
|     optionalDependencies: | ||||
|       '@types/react': 19.2.2 | ||||
|  | ||||
|   '@rolldown/binding-android-arm64@1.0.0-beta.41': | ||||
|     optional: true | ||||
|  | ||||
| @@ -1322,6 +1506,74 @@ snapshots: | ||||
|  | ||||
|   '@rolldown/pluginutils@1.0.0-beta.43': {} | ||||
|  | ||||
|   '@tailwindcss/node@4.1.16': | ||||
|     dependencies: | ||||
|       '@jridgewell/remapping': 2.3.5 | ||||
|       enhanced-resolve: 5.18.3 | ||||
|       jiti: 2.6.1 | ||||
|       lightningcss: 1.30.2 | ||||
|       magic-string: 0.30.21 | ||||
|       source-map-js: 1.2.1 | ||||
|       tailwindcss: 4.1.16 | ||||
|  | ||||
|   '@tailwindcss/oxide-android-arm64@4.1.16': | ||||
|     optional: true | ||||
|  | ||||
|   '@tailwindcss/oxide-darwin-arm64@4.1.16': | ||||
|     optional: true | ||||
|  | ||||
|   '@tailwindcss/oxide-darwin-x64@4.1.16': | ||||
|     optional: true | ||||
|  | ||||
|   '@tailwindcss/oxide-freebsd-x64@4.1.16': | ||||
|     optional: true | ||||
|  | ||||
|   '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.16': | ||||
|     optional: true | ||||
|  | ||||
|   '@tailwindcss/oxide-linux-arm64-gnu@4.1.16': | ||||
|     optional: true | ||||
|  | ||||
|   '@tailwindcss/oxide-linux-arm64-musl@4.1.16': | ||||
|     optional: true | ||||
|  | ||||
|   '@tailwindcss/oxide-linux-x64-gnu@4.1.16': | ||||
|     optional: true | ||||
|  | ||||
|   '@tailwindcss/oxide-linux-x64-musl@4.1.16': | ||||
|     optional: true | ||||
|  | ||||
|   '@tailwindcss/oxide-wasm32-wasi@4.1.16': | ||||
|     optional: true | ||||
|  | ||||
|   '@tailwindcss/oxide-win32-arm64-msvc@4.1.16': | ||||
|     optional: true | ||||
|  | ||||
|   '@tailwindcss/oxide-win32-x64-msvc@4.1.16': | ||||
|     optional: true | ||||
|  | ||||
|   '@tailwindcss/oxide@4.1.16': | ||||
|     optionalDependencies: | ||||
|       '@tailwindcss/oxide-android-arm64': 4.1.16 | ||||
|       '@tailwindcss/oxide-darwin-arm64': 4.1.16 | ||||
|       '@tailwindcss/oxide-darwin-x64': 4.1.16 | ||||
|       '@tailwindcss/oxide-freebsd-x64': 4.1.16 | ||||
|       '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.16 | ||||
|       '@tailwindcss/oxide-linux-arm64-gnu': 4.1.16 | ||||
|       '@tailwindcss/oxide-linux-arm64-musl': 4.1.16 | ||||
|       '@tailwindcss/oxide-linux-x64-gnu': 4.1.16 | ||||
|       '@tailwindcss/oxide-linux-x64-musl': 4.1.16 | ||||
|       '@tailwindcss/oxide-wasm32-wasi': 4.1.16 | ||||
|       '@tailwindcss/oxide-win32-arm64-msvc': 4.1.16 | ||||
|       '@tailwindcss/oxide-win32-x64-msvc': 4.1.16 | ||||
|  | ||||
|   '@tailwindcss/vite@4.1.16(rolldown-vite@7.1.14(@types/node@24.9.1)(jiti@2.6.1))': | ||||
|     dependencies: | ||||
|       '@tailwindcss/node': 4.1.16 | ||||
|       '@tailwindcss/oxide': 4.1.16 | ||||
|       tailwindcss: 4.1.16 | ||||
|       vite: rolldown-vite@7.1.14(@types/node@24.9.1)(jiti@2.6.1) | ||||
|  | ||||
|   '@tybys/wasm-util@0.10.1': | ||||
|     dependencies: | ||||
|       tslib: 2.8.1 | ||||
| @@ -1364,15 +1616,15 @@ snapshots: | ||||
|     dependencies: | ||||
|       csstype: 3.1.3 | ||||
|  | ||||
|   '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3)': | ||||
|   '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': | ||||
|     dependencies: | ||||
|       '@eslint-community/regexpp': 4.12.2 | ||||
|       '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) | ||||
|       '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) | ||||
|       '@typescript-eslint/scope-manager': 8.46.2 | ||||
|       '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) | ||||
|       '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) | ||||
|       '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) | ||||
|       '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) | ||||
|       '@typescript-eslint/visitor-keys': 8.46.2 | ||||
|       eslint: 9.38.0 | ||||
|       eslint: 9.38.0(jiti@2.6.1) | ||||
|       graphemer: 1.4.0 | ||||
|       ignore: 7.0.5 | ||||
|       natural-compare: 1.4.0 | ||||
| @@ -1381,14 +1633,14 @@ snapshots: | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|  | ||||
|   '@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3)': | ||||
|   '@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': | ||||
|     dependencies: | ||||
|       '@typescript-eslint/scope-manager': 8.46.2 | ||||
|       '@typescript-eslint/types': 8.46.2 | ||||
|       '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) | ||||
|       '@typescript-eslint/visitor-keys': 8.46.2 | ||||
|       debug: 4.4.3 | ||||
|       eslint: 9.38.0 | ||||
|       eslint: 9.38.0(jiti@2.6.1) | ||||
|       typescript: 5.9.3 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
| @@ -1411,13 +1663,13 @@ snapshots: | ||||
|     dependencies: | ||||
|       typescript: 5.9.3 | ||||
|  | ||||
|   '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0)(typescript@5.9.3)': | ||||
|   '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': | ||||
|     dependencies: | ||||
|       '@typescript-eslint/types': 8.46.2 | ||||
|       '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) | ||||
|       '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) | ||||
|       '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) | ||||
|       debug: 4.4.3 | ||||
|       eslint: 9.38.0 | ||||
|       eslint: 9.38.0(jiti@2.6.1) | ||||
|       ts-api-utils: 2.1.0(typescript@5.9.3) | ||||
|       typescript: 5.9.3 | ||||
|     transitivePeerDependencies: | ||||
| @@ -1441,13 +1693,13 @@ snapshots: | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|  | ||||
|   '@typescript-eslint/utils@8.46.2(eslint@9.38.0)(typescript@5.9.3)': | ||||
|   '@typescript-eslint/utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': | ||||
|     dependencies: | ||||
|       '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) | ||||
|       '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) | ||||
|       '@typescript-eslint/scope-manager': 8.46.2 | ||||
|       '@typescript-eslint/types': 8.46.2 | ||||
|       '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) | ||||
|       eslint: 9.38.0 | ||||
|       eslint: 9.38.0(jiti@2.6.1) | ||||
|       typescript: 5.9.3 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
| @@ -1457,7 +1709,7 @@ snapshots: | ||||
|       '@typescript-eslint/types': 8.46.2 | ||||
|       eslint-visitor-keys: 4.2.1 | ||||
|  | ||||
|   '@vitejs/plugin-react@5.1.0(rolldown-vite@7.1.14(@types/node@24.9.1))': | ||||
|   '@vitejs/plugin-react@5.1.0(rolldown-vite@7.1.14(@types/node@24.9.1)(jiti@2.6.1))': | ||||
|     dependencies: | ||||
|       '@babel/core': 7.28.5 | ||||
|       '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) | ||||
| @@ -1465,7 +1717,7 @@ snapshots: | ||||
|       '@rolldown/pluginutils': 1.0.0-beta.43 | ||||
|       '@types/babel__core': 7.20.5 | ||||
|       react-refresh: 0.18.0 | ||||
|       vite: rolldown-vite@7.1.14(@types/node@24.9.1) | ||||
|       vite: rolldown-vite@7.1.14(@types/node@24.9.1)(jiti@2.6.1) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|  | ||||
| @@ -1524,6 +1776,12 @@ snapshots: | ||||
|       ansi-styles: 4.3.0 | ||||
|       supports-color: 7.2.0 | ||||
|  | ||||
|   class-variance-authority@0.7.1: | ||||
|     dependencies: | ||||
|       clsx: 2.1.1 | ||||
|  | ||||
|   clsx@2.1.1: {} | ||||
|  | ||||
|   color-convert@2.0.1: | ||||
|     dependencies: | ||||
|       color-name: 1.1.4 | ||||
| @@ -1552,17 +1810,22 @@ snapshots: | ||||
|  | ||||
|   electron-to-chromium@1.5.240: {} | ||||
|  | ||||
|   enhanced-resolve@5.18.3: | ||||
|     dependencies: | ||||
|       graceful-fs: 4.2.11 | ||||
|       tapable: 2.3.0 | ||||
|  | ||||
|   escalade@3.2.0: {} | ||||
|  | ||||
|   escape-string-regexp@4.0.0: {} | ||||
|  | ||||
|   eslint-plugin-react-hooks@5.2.0(eslint@9.38.0): | ||||
|   eslint-plugin-react-hooks@5.2.0(eslint@9.38.0(jiti@2.6.1)): | ||||
|     dependencies: | ||||
|       eslint: 9.38.0 | ||||
|       eslint: 9.38.0(jiti@2.6.1) | ||||
|  | ||||
|   eslint-plugin-react-refresh@0.4.24(eslint@9.38.0): | ||||
|   eslint-plugin-react-refresh@0.4.24(eslint@9.38.0(jiti@2.6.1)): | ||||
|     dependencies: | ||||
|       eslint: 9.38.0 | ||||
|       eslint: 9.38.0(jiti@2.6.1) | ||||
|  | ||||
|   eslint-scope@8.4.0: | ||||
|     dependencies: | ||||
| @@ -1573,9 +1836,9 @@ snapshots: | ||||
|  | ||||
|   eslint-visitor-keys@4.2.1: {} | ||||
|  | ||||
|   eslint@9.38.0: | ||||
|   eslint@9.38.0(jiti@2.6.1): | ||||
|     dependencies: | ||||
|       '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0) | ||||
|       '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) | ||||
|       '@eslint-community/regexpp': 4.12.2 | ||||
|       '@eslint/config-array': 0.21.1 | ||||
|       '@eslint/config-helpers': 0.4.1 | ||||
| @@ -1609,6 +1872,8 @@ snapshots: | ||||
|       minimatch: 3.1.2 | ||||
|       natural-compare: 1.4.0 | ||||
|       optionator: 0.9.4 | ||||
|     optionalDependencies: | ||||
|       jiti: 2.6.1 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|  | ||||
| @@ -1689,6 +1954,8 @@ snapshots: | ||||
|  | ||||
|   globals@16.4.0: {} | ||||
|  | ||||
|   graceful-fs@4.2.11: {} | ||||
|  | ||||
|   graphemer@1.4.0: {} | ||||
|  | ||||
|   has-flag@4.0.0: {} | ||||
| @@ -1714,6 +1981,8 @@ snapshots: | ||||
|  | ||||
|   isexe@2.0.0: {} | ||||
|  | ||||
|   jiti@2.6.1: {} | ||||
|  | ||||
|   js-tokens@4.0.0: {} | ||||
|  | ||||
|   js-yaml@4.1.0: | ||||
| @@ -1798,6 +2067,14 @@ snapshots: | ||||
|     dependencies: | ||||
|       yallist: 3.1.1 | ||||
|  | ||||
|   lucide-react@0.548.0(react@19.2.0): | ||||
|     dependencies: | ||||
|       react: 19.2.0 | ||||
|  | ||||
|   magic-string@0.30.21: | ||||
|     dependencies: | ||||
|       '@jridgewell/sourcemap-codec': 1.5.5 | ||||
|  | ||||
|   merge2@1.4.1: {} | ||||
|  | ||||
|   micromatch@4.0.8: | ||||
| @@ -1877,7 +2154,7 @@ snapshots: | ||||
|  | ||||
|   reusify@1.1.0: {} | ||||
|  | ||||
|   rolldown-vite@7.1.14(@types/node@24.9.1): | ||||
|   rolldown-vite@7.1.14(@types/node@24.9.1)(jiti@2.6.1): | ||||
|     dependencies: | ||||
|       '@oxc-project/runtime': 0.92.0 | ||||
|       fdir: 6.5.0(picomatch@4.0.3) | ||||
| @@ -1889,6 +2166,7 @@ snapshots: | ||||
|     optionalDependencies: | ||||
|       '@types/node': 24.9.1 | ||||
|       fsevents: 2.3.3 | ||||
|       jiti: 2.6.1 | ||||
|  | ||||
|   rolldown@1.0.0-beta.41: | ||||
|     dependencies: | ||||
| @@ -1935,6 +2213,12 @@ snapshots: | ||||
|     dependencies: | ||||
|       has-flag: 4.0.0 | ||||
|  | ||||
|   tailwind-merge@3.3.1: {} | ||||
|  | ||||
|   tailwindcss@4.1.16: {} | ||||
|  | ||||
|   tapable@2.3.0: {} | ||||
|  | ||||
|   tinyglobby@0.2.15: | ||||
|     dependencies: | ||||
|       fdir: 6.5.0(picomatch@4.0.3) | ||||
| @@ -1951,17 +2235,19 @@ snapshots: | ||||
|   tslib@2.8.1: | ||||
|     optional: true | ||||
|  | ||||
|   tw-animate-css@1.4.0: {} | ||||
|  | ||||
|   type-check@0.4.0: | ||||
|     dependencies: | ||||
|       prelude-ls: 1.2.1 | ||||
|  | ||||
|   typescript-eslint@8.46.2(eslint@9.38.0)(typescript@5.9.3): | ||||
|   typescript-eslint@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3): | ||||
|     dependencies: | ||||
|       '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3) | ||||
|       '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3) | ||||
|       '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) | ||||
|       '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) | ||||
|       '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) | ||||
|       '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3) | ||||
|       eslint: 9.38.0 | ||||
|       '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) | ||||
|       eslint: 9.38.0(jiti@2.6.1) | ||||
|       typescript: 5.9.3 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|   | ||||
							
								
								
									
										60
									
								
								src/components/ui/button.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/components/ui/button.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| import * as React from "react" | ||||
| import { Slot } from "@radix-ui/react-slot" | ||||
| import { cva, type VariantProps } from "class-variance-authority" | ||||
|  | ||||
| import { cn } from "@/lib/utils" | ||||
|  | ||||
| const buttonVariants = cva( | ||||
|   "inline-flex items-center justify-center 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", | ||||
|   { | ||||
|     variants: { | ||||
|       variant: { | ||||
|         default: "bg-primary text-primary-foreground hover:bg-primary/90", | ||||
|         destructive: | ||||
|           "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", | ||||
|         outline: | ||||
|           "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", | ||||
|         secondary: | ||||
|           "bg-secondary text-secondary-foreground hover:bg-secondary/80", | ||||
|         ghost: | ||||
|           "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", | ||||
|         link: "text-primary underline-offset-4 hover:underline", | ||||
|       }, | ||||
|       size: { | ||||
|         default: "h-9 px-4 py-2 has-[>svg]:px-3", | ||||
|         sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", | ||||
|         lg: "h-10 rounded-md px-6 has-[>svg]:px-4", | ||||
|         icon: "size-9", | ||||
|         "icon-sm": "size-8", | ||||
|         "icon-lg": "size-10", | ||||
|       }, | ||||
|     }, | ||||
|     defaultVariants: { | ||||
|       variant: "default", | ||||
|       size: "default", | ||||
|     }, | ||||
|   } | ||||
| ) | ||||
|  | ||||
| function Button({ | ||||
|   className, | ||||
|   variant, | ||||
|   size, | ||||
|   asChild = false, | ||||
|   ...props | ||||
| }: React.ComponentProps<"button"> & | ||||
|   VariantProps<typeof buttonVariants> & { | ||||
|     asChild?: boolean | ||||
|   }) { | ||||
|   const Comp = asChild ? Slot : "button" | ||||
|  | ||||
|   return ( | ||||
|     <Comp | ||||
|       data-slot="button" | ||||
|       className={cn(buttonVariants({ variant, size, className }))} | ||||
|       {...props} | ||||
|     /> | ||||
|   ) | ||||
| } | ||||
|  | ||||
| export { Button, buttonVariants } | ||||
							
								
								
									
										120
									
								
								src/index.css
									
									
									
									
									
								
							
							
						
						
									
										120
									
								
								src/index.css
									
									
									
									
									
								
							| @@ -0,0 +1,120 @@ | ||||
| @import "tailwindcss"; | ||||
| @import "tw-animate-css"; | ||||
|  | ||||
| @custom-variant dark (&:is(.dark *)); | ||||
|  | ||||
| @theme inline { | ||||
|   --radius-sm: calc(var(--radius) - 4px); | ||||
|   --radius-md: calc(var(--radius) - 2px); | ||||
|   --radius-lg: var(--radius); | ||||
|   --radius-xl: calc(var(--radius) + 4px); | ||||
|   --color-background: var(--background); | ||||
|   --color-foreground: var(--foreground); | ||||
|   --color-card: var(--card); | ||||
|   --color-card-foreground: var(--card-foreground); | ||||
|   --color-popover: var(--popover); | ||||
|   --color-popover-foreground: var(--popover-foreground); | ||||
|   --color-primary: var(--primary); | ||||
|   --color-primary-foreground: var(--primary-foreground); | ||||
|   --color-secondary: var(--secondary); | ||||
|   --color-secondary-foreground: var(--secondary-foreground); | ||||
|   --color-muted: var(--muted); | ||||
|   --color-muted-foreground: var(--muted-foreground); | ||||
|   --color-accent: var(--accent); | ||||
|   --color-accent-foreground: var(--accent-foreground); | ||||
|   --color-destructive: var(--destructive); | ||||
|   --color-border: var(--border); | ||||
|   --color-input: var(--input); | ||||
|   --color-ring: var(--ring); | ||||
|   --color-chart-1: var(--chart-1); | ||||
|   --color-chart-2: var(--chart-2); | ||||
|   --color-chart-3: var(--chart-3); | ||||
|   --color-chart-4: var(--chart-4); | ||||
|   --color-chart-5: var(--chart-5); | ||||
|   --color-sidebar: var(--sidebar); | ||||
|   --color-sidebar-foreground: var(--sidebar-foreground); | ||||
|   --color-sidebar-primary: var(--sidebar-primary); | ||||
|   --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); | ||||
|   --color-sidebar-accent: var(--sidebar-accent); | ||||
|   --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); | ||||
|   --color-sidebar-border: var(--sidebar-border); | ||||
|   --color-sidebar-ring: var(--sidebar-ring); | ||||
| } | ||||
|  | ||||
| :root { | ||||
|   --radius: 0.625rem; | ||||
|   --background: oklch(1 0 0); | ||||
|   --foreground: oklch(0.13 0.028 261.692); | ||||
|   --card: oklch(1 0 0); | ||||
|   --card-foreground: oklch(0.13 0.028 261.692); | ||||
|   --popover: oklch(1 0 0); | ||||
|   --popover-foreground: oklch(0.13 0.028 261.692); | ||||
|   --primary: oklch(0.21 0.034 264.665); | ||||
|   --primary-foreground: oklch(0.985 0.002 247.839); | ||||
|   --secondary: oklch(0.967 0.003 264.542); | ||||
|   --secondary-foreground: oklch(0.21 0.034 264.665); | ||||
|   --muted: oklch(0.967 0.003 264.542); | ||||
|   --muted-foreground: oklch(0.551 0.027 264.364); | ||||
|   --accent: oklch(0.967 0.003 264.542); | ||||
|   --accent-foreground: oklch(0.21 0.034 264.665); | ||||
|   --destructive: oklch(0.577 0.245 27.325); | ||||
|   --border: oklch(0.928 0.006 264.531); | ||||
|   --input: oklch(0.928 0.006 264.531); | ||||
|   --ring: oklch(0.707 0.022 261.325); | ||||
|   --chart-1: oklch(0.646 0.222 41.116); | ||||
|   --chart-2: oklch(0.6 0.118 184.704); | ||||
|   --chart-3: oklch(0.398 0.07 227.392); | ||||
|   --chart-4: oklch(0.828 0.189 84.429); | ||||
|   --chart-5: oklch(0.769 0.188 70.08); | ||||
|   --sidebar: oklch(0.985 0.002 247.839); | ||||
|   --sidebar-foreground: oklch(0.13 0.028 261.692); | ||||
|   --sidebar-primary: oklch(0.21 0.034 264.665); | ||||
|   --sidebar-primary-foreground: oklch(0.985 0.002 247.839); | ||||
|   --sidebar-accent: oklch(0.967 0.003 264.542); | ||||
|   --sidebar-accent-foreground: oklch(0.21 0.034 264.665); | ||||
|   --sidebar-border: oklch(0.928 0.006 264.531); | ||||
|   --sidebar-ring: oklch(0.707 0.022 261.325); | ||||
| } | ||||
|  | ||||
| .dark { | ||||
|   --background: oklch(0.13 0.028 261.692); | ||||
|   --foreground: oklch(0.985 0.002 247.839); | ||||
|   --card: oklch(0.21 0.034 264.665); | ||||
|   --card-foreground: oklch(0.985 0.002 247.839); | ||||
|   --popover: oklch(0.21 0.034 264.665); | ||||
|   --popover-foreground: oklch(0.985 0.002 247.839); | ||||
|   --primary: oklch(0.928 0.006 264.531); | ||||
|   --primary-foreground: oklch(0.21 0.034 264.665); | ||||
|   --secondary: oklch(0.278 0.033 256.848); | ||||
|   --secondary-foreground: oklch(0.985 0.002 247.839); | ||||
|   --muted: oklch(0.278 0.033 256.848); | ||||
|   --muted-foreground: oklch(0.707 0.022 261.325); | ||||
|   --accent: oklch(0.278 0.033 256.848); | ||||
|   --accent-foreground: oklch(0.985 0.002 247.839); | ||||
|   --destructive: oklch(0.704 0.191 22.216); | ||||
|   --border: oklch(1 0 0 / 10%); | ||||
|   --input: oklch(1 0 0 / 15%); | ||||
|   --ring: oklch(0.551 0.027 264.364); | ||||
|   --chart-1: oklch(0.488 0.243 264.376); | ||||
|   --chart-2: oklch(0.696 0.17 162.48); | ||||
|   --chart-3: oklch(0.769 0.188 70.08); | ||||
|   --chart-4: oklch(0.627 0.265 303.9); | ||||
|   --chart-5: oklch(0.645 0.246 16.439); | ||||
|   --sidebar: oklch(0.21 0.034 264.665); | ||||
|   --sidebar-foreground: oklch(0.985 0.002 247.839); | ||||
|   --sidebar-primary: oklch(0.488 0.243 264.376); | ||||
|   --sidebar-primary-foreground: oklch(0.985 0.002 247.839); | ||||
|   --sidebar-accent: oklch(0.278 0.033 256.848); | ||||
|   --sidebar-accent-foreground: oklch(0.985 0.002 247.839); | ||||
|   --sidebar-border: oklch(1 0 0 / 10%); | ||||
|   --sidebar-ring: oklch(0.551 0.027 264.364); | ||||
| } | ||||
|  | ||||
| @layer base { | ||||
|   * { | ||||
|     @apply border-border outline-ring/50; | ||||
|   } | ||||
|   body { | ||||
|     @apply bg-background text-foreground; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										6
									
								
								src/lib/utils.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/lib/utils.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| import { clsx, type ClassValue } from "clsx" | ||||
| import { twMerge } from "tailwind-merge" | ||||
|  | ||||
| export function cn(...inputs: ClassValue[]) { | ||||
|   return twMerge(clsx(inputs)) | ||||
| } | ||||
| @@ -4,6 +4,6 @@ import './index.css' | ||||
|  | ||||
| createRoot(document.getElementById('root')!).render( | ||||
|   <StrictMode> | ||||
|     <div /> | ||||
|   </StrictMode>, | ||||
|     {null} | ||||
|   </StrictMode> | ||||
| ) | ||||
|   | ||||
| @@ -22,7 +22,15 @@ | ||||
|     "noUnusedParameters": true, | ||||
|     "erasableSyntaxOnly": true, | ||||
|     "noFallthroughCasesInSwitch": true, | ||||
|     "noUncheckedSideEffectImports": true | ||||
|     "noUncheckedSideEffectImports": true, | ||||
|  | ||||
|     /* Paths */ | ||||
|     "baseUrl": ".", | ||||
|     "paths": { | ||||
|       "@/*": [ | ||||
|         "./src/*" | ||||
|       ] | ||||
|     } | ||||
|   }, | ||||
|   "include": ["src"] | ||||
| } | ||||
|   | ||||
| @@ -3,5 +3,11 @@ | ||||
|   "references": [ | ||||
|     { "path": "./tsconfig.app.json" }, | ||||
|     { "path": "./tsconfig.node.json" } | ||||
|   ] | ||||
|   ], | ||||
|   "compilerOptions": { | ||||
|     "baseUrl": ".", | ||||
|     "paths": { | ||||
|       "@/*": ["./src/*"] | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,7 +1,14 @@ | ||||
| import path from "path" | ||||
| import { defineConfig } from 'vite' | ||||
| import react from '@vitejs/plugin-react' | ||||
| import tailwindcss from "@tailwindcss/vite" | ||||
|  | ||||
| // https://vite.dev/config/ | ||||
| export default defineConfig({ | ||||
|   plugins: [react()], | ||||
|   plugins: [react(), tailwindcss()], | ||||
|   resolve: { | ||||
|     alias: { | ||||
|       "@": path.resolve(__dirname, "./src"), | ||||
|     }, | ||||
|   }, | ||||
| }) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user