Spaces:
Runtime error
Runtime error
Upload folder using huggingface_hub
Browse files- .dockerignore +8 -0
- .gitignore +24 -0
- Dockerfile +13 -0
- README.md +50 -10
- biome.json +54 -0
- bun.lock +0 -0
- components.json +21 -0
- index.html +14 -0
- netlify.toml +11 -0
- nginx.conf +10 -0
- package.json +88 -0
- postcss.config.js +6 -0
- public/_redirects +1 -0
- src/App.tsx +5 -0
- src/index.css +73 -0
- src/lib/utils.ts +6 -0
- src/main.tsx +10 -0
- src/vite-env.d.ts +1 -0
- tailwind.config.js +106 -0
- tsconfig.json +26 -0
- vite.config.ts +13 -0
.dockerignore
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
node_modules
|
2 |
+
*.log
|
3 |
+
dist
|
4 |
+
.git
|
5 |
+
.gitignore
|
6 |
+
Dockerfile
|
7 |
+
.dockerignore
|
8 |
+
.env
|
.gitignore
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Logs
|
2 |
+
logs
|
3 |
+
*.log
|
4 |
+
npm-debug.log*
|
5 |
+
yarn-debug.log*
|
6 |
+
yarn-error.log*
|
7 |
+
pnpm-debug.log*
|
8 |
+
lerna-debug.log*
|
9 |
+
|
10 |
+
node_modules
|
11 |
+
dist
|
12 |
+
dist-ssr
|
13 |
+
*.local
|
14 |
+
|
15 |
+
# Editor directories and files
|
16 |
+
.vscode/*
|
17 |
+
!.vscode/extensions.json
|
18 |
+
.idea
|
19 |
+
.DS_Store
|
20 |
+
*.suo
|
21 |
+
*.ntvs*
|
22 |
+
*.njsproj
|
23 |
+
*.sln
|
24 |
+
*.sw?
|
Dockerfile
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Use the official Bun image for building
|
2 |
+
FROM oven/bun:1.2 as builder
|
3 |
+
WORKDIR /app
|
4 |
+
COPY . .
|
5 |
+
RUN bun install --frozen-lockfile && bun run build
|
6 |
+
|
7 |
+
# Use Nginx to serve the build output statically
|
8 |
+
FROM nginx:alpine as production
|
9 |
+
COPY --from=builder /app/dist /usr/share/nginx/html
|
10 |
+
# Custom nginx config to support client-side routing
|
11 |
+
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
|
12 |
+
EXPOSE 80
|
13 |
+
CMD ["nginx", "-g", "daemon off;"]
|
README.md
CHANGED
@@ -1,10 +1,50 @@
|
|
1 |
-
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# React + TypeScript + Vite
|
2 |
+
|
3 |
+
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
4 |
+
|
5 |
+
Currently, two official plugins are available:
|
6 |
+
|
7 |
+
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
|
8 |
+
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
|
9 |
+
|
10 |
+
## Expanding the ESLint configuration
|
11 |
+
|
12 |
+
If you are developing a production application, we recommend updating the configuration to enable type aware lint rules:
|
13 |
+
|
14 |
+
- Configure the top-level `parserOptions` property like this:
|
15 |
+
|
16 |
+
```js
|
17 |
+
export default tseslint.config({
|
18 |
+
languageOptions: {
|
19 |
+
// other options...
|
20 |
+
parserOptions: {
|
21 |
+
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
22 |
+
tsconfigRootDir: import.meta.dirname,
|
23 |
+
},
|
24 |
+
},
|
25 |
+
})
|
26 |
+
```
|
27 |
+
|
28 |
+
- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked`
|
29 |
+
- Optionally add `...tseslint.configs.stylisticTypeChecked`
|
30 |
+
- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config:
|
31 |
+
|
32 |
+
```js
|
33 |
+
// eslint.config.js
|
34 |
+
import react from 'eslint-plugin-react'
|
35 |
+
|
36 |
+
export default tseslint.config({
|
37 |
+
// Set the react version
|
38 |
+
settings: { react: { version: '18.3' } },
|
39 |
+
plugins: {
|
40 |
+
// Add the react plugin
|
41 |
+
react,
|
42 |
+
},
|
43 |
+
rules: {
|
44 |
+
// other rules...
|
45 |
+
// Enable its recommended rules
|
46 |
+
...react.configs.recommended.rules,
|
47 |
+
...react.configs['jsx-runtime'].rules,
|
48 |
+
},
|
49 |
+
})
|
50 |
+
```
|
biome.json
ADDED
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
|
3 |
+
"vcs": {
|
4 |
+
"enabled": false,
|
5 |
+
"clientKind": "git",
|
6 |
+
"useIgnoreFile": false
|
7 |
+
},
|
8 |
+
"files": {
|
9 |
+
"ignoreUnknown": false,
|
10 |
+
"ignore": ["dist", ".next", "node_modules", "build", "src/generated/**"],
|
11 |
+
"include": ["src/**/*.ts", "src/**/*.tsx"]
|
12 |
+
},
|
13 |
+
"formatter": {
|
14 |
+
"enabled": true,
|
15 |
+
"indentStyle": "space"
|
16 |
+
},
|
17 |
+
"organizeImports": {
|
18 |
+
"enabled": true
|
19 |
+
},
|
20 |
+
"linter": {
|
21 |
+
"enabled": true,
|
22 |
+
"rules": {
|
23 |
+
"recommended": true,
|
24 |
+
"correctness": {
|
25 |
+
"noUnusedVariables": "off"
|
26 |
+
},
|
27 |
+
"nursery": {
|
28 |
+
"noImgElement": "off"
|
29 |
+
},
|
30 |
+
"a11y": {
|
31 |
+
"noAutofocus": "off",
|
32 |
+
"noDistractingElements": "off",
|
33 |
+
"noHeaderScope": "off",
|
34 |
+
"noInteractiveElementToNoninteractiveRole": "off",
|
35 |
+
"noLabelWithoutControl": "off",
|
36 |
+
"noNoninteractiveElementToInteractiveRole": "off",
|
37 |
+
"noNoninteractiveTabindex": "off",
|
38 |
+
"noPositiveTabindex": "off",
|
39 |
+
"noRedundantAlt": "off",
|
40 |
+
"noRedundantRoles": "off",
|
41 |
+
"noSvgWithoutTitle": "off",
|
42 |
+
"useAltText": "off",
|
43 |
+
"useKeyWithClickEvents": "off",
|
44 |
+
"useKeyWithMouseEvents": "off",
|
45 |
+
"useButtonType": "off"
|
46 |
+
}
|
47 |
+
}
|
48 |
+
},
|
49 |
+
"javascript": {
|
50 |
+
"formatter": {
|
51 |
+
"quoteStyle": "double"
|
52 |
+
}
|
53 |
+
}
|
54 |
+
}
|
bun.lock
ADDED
The diff for this file is too large to render.
See raw diff
|
|
components.json
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"$schema": "https://ui.shadcn.com/schema.json",
|
3 |
+
"style": "new-york",
|
4 |
+
"rsc": false,
|
5 |
+
"tsx": true,
|
6 |
+
"tailwind": {
|
7 |
+
"config": "tailwind.config.js",
|
8 |
+
"css": "src/index.css",
|
9 |
+
"baseColor": "zinc",
|
10 |
+
"cssVariables": true,
|
11 |
+
"prefix": ""
|
12 |
+
},
|
13 |
+
"aliases": {
|
14 |
+
"components": "@/components",
|
15 |
+
"utils": "@/lib/utils",
|
16 |
+
"ui": "@/components/ui",
|
17 |
+
"lib": "@/lib",
|
18 |
+
"hooks": "@/hooks"
|
19 |
+
},
|
20 |
+
"iconLibrary": "lucide"
|
21 |
+
}
|
index.html
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html lang="en">
|
3 |
+
|
4 |
+
<head>
|
5 |
+
<meta charset="UTF-8" />
|
6 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
7 |
+
</head>
|
8 |
+
|
9 |
+
<body>
|
10 |
+
<div id="root"></div>
|
11 |
+
<script type="module" src="/src/main.tsx"></script>
|
12 |
+
</body>
|
13 |
+
|
14 |
+
</html>
|
netlify.toml
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[images]
|
2 |
+
remote_images = ["https://source.unsplash.com/.*", "https://images.unsplash.com/.*", "https://ext.same-assets.com/.*", "https://ugc.same-assets.com/.*"]
|
3 |
+
|
4 |
+
[build]
|
5 |
+
command = "bun run build"
|
6 |
+
publish = "dist"
|
7 |
+
|
8 |
+
[[redirects]]
|
9 |
+
from = "/*"
|
10 |
+
to = "/index.html"
|
11 |
+
status = 200
|
nginx.conf
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
server {
|
2 |
+
listen 80;
|
3 |
+
server_name localhost;
|
4 |
+
root /usr/share/nginx/html;
|
5 |
+
index index.html;
|
6 |
+
|
7 |
+
location / {
|
8 |
+
try_files $uri $uri/ /index.html;
|
9 |
+
}
|
10 |
+
}
|
package.json
ADDED
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "react-vite-tailwind",
|
3 |
+
"private": true,
|
4 |
+
"version": "0.0.0",
|
5 |
+
"type": "module",
|
6 |
+
"scripts": {
|
7 |
+
"dev": "vite --host 0.0.0.0",
|
8 |
+
"build": "tsc -b && vite build --outDir dist",
|
9 |
+
"lint": "bunx biome lint --write && bunx tsc --noEmit",
|
10 |
+
"format": "bunx biome format --write",
|
11 |
+
"preview": "vite preview"
|
12 |
+
},
|
13 |
+
"dependencies": {
|
14 |
+
"@hookform/resolvers": "^3.10.0",
|
15 |
+
"@radix-ui/react-accordion": "^1.2.2",
|
16 |
+
"@radix-ui/react-alert-dialog": "^1.1.4",
|
17 |
+
"@radix-ui/react-aspect-ratio": "^1.1.1",
|
18 |
+
"@radix-ui/react-avatar": "^1.1.2",
|
19 |
+
"@radix-ui/react-checkbox": "^1.1.3",
|
20 |
+
"@radix-ui/react-collapsible": "^1.1.2",
|
21 |
+
"@radix-ui/react-context-menu": "^2.2.4",
|
22 |
+
"@radix-ui/react-dialog": "^1.1.4",
|
23 |
+
"@radix-ui/react-dropdown-menu": "^2.1.4",
|
24 |
+
"@radix-ui/react-hover-card": "^1.1.4",
|
25 |
+
"@radix-ui/react-label": "^2.1.1",
|
26 |
+
"@radix-ui/react-menubar": "^1.1.4",
|
27 |
+
"@radix-ui/react-navigation-menu": "^1.2.3",
|
28 |
+
"@radix-ui/react-popover": "^1.1.4",
|
29 |
+
"@radix-ui/react-progress": "^1.1.1",
|
30 |
+
"@radix-ui/react-radio-group": "^1.2.2",
|
31 |
+
"@radix-ui/react-scroll-area": "^1.2.2",
|
32 |
+
"@radix-ui/react-select": "^2.1.4",
|
33 |
+
"@radix-ui/react-separator": "^1.1.1",
|
34 |
+
"@radix-ui/react-slider": "^1.2.2",
|
35 |
+
"@radix-ui/react-slot": "^1.1.1",
|
36 |
+
"@radix-ui/react-switch": "^1.1.2",
|
37 |
+
"@radix-ui/react-tabs": "^1.1.2",
|
38 |
+
"@radix-ui/react-toast": "^1.2.4",
|
39 |
+
"@radix-ui/react-toggle": "^1.1.1",
|
40 |
+
"@radix-ui/react-toggle-group": "^1.1.1",
|
41 |
+
"@radix-ui/react-tooltip": "^1.1.6",
|
42 |
+
"cmdk": "^1.0.0",
|
43 |
+
"date-fns": "^3.6.0",
|
44 |
+
"embla-carousel-react": "^8.5.2",
|
45 |
+
"input-otp": "^1.4.2",
|
46 |
+
"next-themes": "^0.4.4",
|
47 |
+
"react": "^18.3.1",
|
48 |
+
"react-day-picker": "^8.10.1",
|
49 |
+
"react-dom": "^18.3.1",
|
50 |
+
"react-hook-form": "^7.54.2",
|
51 |
+
"react-resizable-panels": "^2.1.7",
|
52 |
+
"recharts": "^2.15.0",
|
53 |
+
"sonner": "^1.7.2",
|
54 |
+
"vaul": "^1.1.2",
|
55 |
+
"zod": "^3.24.2"
|
56 |
+
},
|
57 |
+
"devDependencies": {
|
58 |
+
"@eslint/js": "^9.18.0",
|
59 |
+
"@biomejs/biome": "1.9.4",
|
60 |
+
"@types/node": "^22.10.7",
|
61 |
+
"@types/react": "^18.3.18",
|
62 |
+
"@types/react-dom": "^18.3.5",
|
63 |
+
"@typescript-eslint/eslint-plugin": "^8.20.0",
|
64 |
+
"@typescript-eslint/parser": "^8.20.0",
|
65 |
+
"@vitejs/plugin-react": "^4.3.4",
|
66 |
+
"autoprefixer": "^10.4.20",
|
67 |
+
"class-variance-authority": "^0.7.1",
|
68 |
+
"clsx": "^2.1.1",
|
69 |
+
"eslint": "^9.18.0",
|
70 |
+
"eslint-config-prettier": "^10.0.1",
|
71 |
+
"eslint-import-resolver-typescript": "^3.7.0",
|
72 |
+
"eslint-plugin-import": "^2.31.0",
|
73 |
+
"eslint-plugin-react": "^7.37.4",
|
74 |
+
"eslint-plugin-react-hooks": "^5.1.0",
|
75 |
+
"eslint-plugin-react-refresh": "^0.4.18",
|
76 |
+
"globals": "^15.14.0",
|
77 |
+
"lucide-react": "^0.471.2",
|
78 |
+
"postcss": "^8.5.1",
|
79 |
+
"prettier": "^3.4.2",
|
80 |
+
"prettier-plugin-tailwindcss": "^0.6.10",
|
81 |
+
"tailwind-merge": "^2.6.0",
|
82 |
+
"tailwindcss": "^3.4.17",
|
83 |
+
"tailwindcss-animate": "^1.0.7",
|
84 |
+
"typescript": "~5.6.2",
|
85 |
+
"typescript-eslint": "^8.20.0",
|
86 |
+
"vite": "^6.0.5"
|
87 |
+
}
|
88 |
+
}
|
postcss.config.js
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export default {
|
2 |
+
plugins: {
|
3 |
+
tailwindcss: {},
|
4 |
+
autoprefixer: {},
|
5 |
+
},
|
6 |
+
}
|
public/_redirects
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
/* /index.html 200
|
src/App.tsx
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
function App() {
|
2 |
+
return <></>;
|
3 |
+
}
|
4 |
+
|
5 |
+
export default App;
|
src/index.css
ADDED
@@ -0,0 +1,73 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
@tailwind base;
|
2 |
+
@tailwind components;
|
3 |
+
@tailwind utilities;
|
4 |
+
|
5 |
+
body {
|
6 |
+
font-family: Arial, Helvetica, sans-serif;
|
7 |
+
}
|
8 |
+
|
9 |
+
@layer base {
|
10 |
+
:root {
|
11 |
+
--background: 0 0% 100%;
|
12 |
+
--foreground: 240 10% 3.9%;
|
13 |
+
--card: 0 0% 100%;
|
14 |
+
--card-foreground: 240 10% 3.9%;
|
15 |
+
--popover: 0 0% 100%;
|
16 |
+
--popover-foreground: 240 10% 3.9%;
|
17 |
+
--primary: 240 5.9% 10%;
|
18 |
+
--primary-foreground: 0 0% 98%;
|
19 |
+
--secondary: 240 4.8% 95.9%;
|
20 |
+
--secondary-foreground: 240 5.9% 10%;
|
21 |
+
--muted: 240 4.8% 95.9%;
|
22 |
+
--muted-foreground: 240 3.8% 46.1%;
|
23 |
+
--accent: 240 4.8% 95.9%;
|
24 |
+
--accent-foreground: 240 5.9% 10%;
|
25 |
+
--destructive: 0 84.2% 60.2%;
|
26 |
+
--destructive-foreground: 0 0% 98%;
|
27 |
+
--border: 240 5.9% 90%;
|
28 |
+
--input: 240 5.9% 90%;
|
29 |
+
--ring: 240 5.9% 10%;
|
30 |
+
--radius: 0.5rem;
|
31 |
+
--chart-1: 12 76% 61%;
|
32 |
+
--chart-2: 173 58% 39%;
|
33 |
+
--chart-3: 197 37% 24%;
|
34 |
+
--chart-4: 43 74% 66%;
|
35 |
+
--chart-5: 27 87% 67%;
|
36 |
+
}
|
37 |
+
|
38 |
+
.dark {
|
39 |
+
--background: 240 10% 3.9%;
|
40 |
+
--foreground: 0 0% 98%;
|
41 |
+
--card: 240 10% 3.9%;
|
42 |
+
--card-foreground: 0 0% 98%;
|
43 |
+
--popover: 240 10% 3.9%;
|
44 |
+
--popover-foreground: 0 0% 98%;
|
45 |
+
--primary: 0 0% 98%;
|
46 |
+
--primary-foreground: 240 5.9% 10%;
|
47 |
+
--secondary: 240 3.7% 15.9%;
|
48 |
+
--secondary-foreground: 0 0% 98%;
|
49 |
+
--muted: 240 3.7% 15.9%;
|
50 |
+
--muted-foreground: 240 5% 64.9%;
|
51 |
+
--accent: 240 3.7% 15.9%;
|
52 |
+
--accent-foreground: 0 0% 98%;
|
53 |
+
--destructive: 0 62.8% 30.6%;
|
54 |
+
--destructive-foreground: 0 0% 98%;
|
55 |
+
--border: 240 3.7% 15.9%;
|
56 |
+
--input: 240 3.7% 15.9%;
|
57 |
+
--ring: 240 4.9% 83.9%;
|
58 |
+
--chart-1: 220 70% 50%;
|
59 |
+
--chart-2: 160 60% 45%;
|
60 |
+
--chart-3: 30 80% 55%;
|
61 |
+
--chart-4: 280 65% 60%;
|
62 |
+
--chart-5: 340 75% 55%;
|
63 |
+
}
|
64 |
+
}
|
65 |
+
|
66 |
+
@layer base {
|
67 |
+
* {
|
68 |
+
@apply border-border;
|
69 |
+
}
|
70 |
+
body {
|
71 |
+
@apply bg-background text-foreground;
|
72 |
+
}
|
73 |
+
}
|
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,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { createRoot } from "react-dom/client";
|
2 |
+
import "./index.css";
|
3 |
+
import App from "./App.tsx";
|
4 |
+
|
5 |
+
const rootElement = document.getElementById("root");
|
6 |
+
if (!rootElement) {
|
7 |
+
throw new Error("Failed to find root element");
|
8 |
+
}
|
9 |
+
|
10 |
+
createRoot(rootElement).render(<App />);
|
src/vite-env.d.ts
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
/// <reference types="vite/client" />
|
tailwind.config.js
ADDED
@@ -0,0 +1,106 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/** @type {import('tailwindcss').Config} */
|
2 |
+
module.exports = {
|
3 |
+
darkMode: ["class"],
|
4 |
+
content: ["./index.html", "./src/**/*.{ts,tsx,js,jsx}"],
|
5 |
+
theme: {
|
6 |
+
extend: {
|
7 |
+
borderRadius: {
|
8 |
+
lg: 'var(--radius)',
|
9 |
+
md: 'calc(var(--radius) - 2px)',
|
10 |
+
sm: 'calc(var(--radius) - 4px)'
|
11 |
+
},
|
12 |
+
colors: {
|
13 |
+
background: 'hsl(var(--background))',
|
14 |
+
foreground: 'hsl(var(--foreground))',
|
15 |
+
card: {
|
16 |
+
DEFAULT: 'hsl(var(--card))',
|
17 |
+
foreground: 'hsl(var(--card-foreground))'
|
18 |
+
},
|
19 |
+
popover: {
|
20 |
+
DEFAULT: 'hsl(var(--popover))',
|
21 |
+
foreground: 'hsl(var(--popover-foreground))'
|
22 |
+
},
|
23 |
+
primary: {
|
24 |
+
DEFAULT: 'hsl(var(--primary))',
|
25 |
+
foreground: 'hsl(var(--primary-foreground))'
|
26 |
+
},
|
27 |
+
secondary: {
|
28 |
+
DEFAULT: 'hsl(var(--secondary))',
|
29 |
+
foreground: 'hsl(var(--secondary-foreground))'
|
30 |
+
},
|
31 |
+
muted: {
|
32 |
+
DEFAULT: 'hsl(var(--muted))',
|
33 |
+
foreground: 'hsl(var(--muted-foreground))'
|
34 |
+
},
|
35 |
+
accent: {
|
36 |
+
DEFAULT: 'hsl(var(--accent))',
|
37 |
+
foreground: 'hsl(var(--accent-foreground))'
|
38 |
+
},
|
39 |
+
destructive: {
|
40 |
+
DEFAULT: 'hsl(var(--destructive))',
|
41 |
+
foreground: 'hsl(var(--destructive-foreground))'
|
42 |
+
},
|
43 |
+
border: 'hsl(var(--border))',
|
44 |
+
input: 'hsl(var(--input))',
|
45 |
+
ring: 'hsl(var(--ring))',
|
46 |
+
chart: {
|
47 |
+
'1': 'hsl(var(--chart-1))',
|
48 |
+
'2': 'hsl(var(--chart-2))',
|
49 |
+
'3': 'hsl(var(--chart-3))',
|
50 |
+
'4': 'hsl(var(--chart-4))',
|
51 |
+
'5': 'hsl(var(--chart-5))'
|
52 |
+
},
|
53 |
+
sidebar: {
|
54 |
+
DEFAULT: 'hsl(var(--sidebar-background))',
|
55 |
+
foreground: 'hsl(var(--sidebar-foreground))',
|
56 |
+
primary: 'hsl(var(--sidebar-primary))',
|
57 |
+
'primary-foreground': 'hsl(var(--sidebar-primary-foreground))',
|
58 |
+
accent: 'hsl(var(--sidebar-accent))',
|
59 |
+
'accent-foreground': 'hsl(var(--sidebar-accent-foreground))',
|
60 |
+
border: 'hsl(var(--sidebar-border))',
|
61 |
+
ring: 'hsl(var(--sidebar-ring))'
|
62 |
+
}
|
63 |
+
},
|
64 |
+
keyframes: {
|
65 |
+
'accordion-down': {
|
66 |
+
from: {
|
67 |
+
height: '0'
|
68 |
+
},
|
69 |
+
to: {
|
70 |
+
height: 'var(--radix-accordion-content-height)'
|
71 |
+
}
|
72 |
+
},
|
73 |
+
'accordion-up': {
|
74 |
+
from: {
|
75 |
+
height: 'var(--radix-accordion-content-height)'
|
76 |
+
},
|
77 |
+
to: {
|
78 |
+
height: '0'
|
79 |
+
}
|
80 |
+
}
|
81 |
+
},
|
82 |
+
animation: {
|
83 |
+
'accordion-down': 'accordion-down 0.2s ease-out',
|
84 |
+
'accordion-up': 'accordion-up 0.2s ease-out'
|
85 |
+
},
|
86 |
+
container: {
|
87 |
+
center: true,
|
88 |
+
padding: {
|
89 |
+
DEFAULT: '1rem',
|
90 |
+
sm: '2rem',
|
91 |
+
lg: '4rem',
|
92 |
+
xl: '5rem',
|
93 |
+
'2xl': '6rem',
|
94 |
+
},
|
95 |
+
screens: {
|
96 |
+
sm: '640px',
|
97 |
+
md: '768px',
|
98 |
+
lg: '1024px',
|
99 |
+
xl: '1280px',
|
100 |
+
'2xl': '1536px',
|
101 |
+
},
|
102 |
+
},
|
103 |
+
}
|
104 |
+
},
|
105 |
+
plugins: [require("tailwindcss-animate")],
|
106 |
+
};
|
tsconfig.json
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"compilerOptions": {
|
3 |
+
"target": "ES2020",
|
4 |
+
"useDefineForClassFields": true,
|
5 |
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
6 |
+
"module": "ESNext",
|
7 |
+
"skipLibCheck": true,
|
8 |
+
"baseUrl": ".",
|
9 |
+
"paths": {
|
10 |
+
"@/*": ["./src/*"]
|
11 |
+
},
|
12 |
+
|
13 |
+
/* Bundler mode */
|
14 |
+
"moduleResolution": "bundler",
|
15 |
+
"allowImportingTsExtensions": true,
|
16 |
+
"resolveJsonModule": true,
|
17 |
+
"isolatedModules": true,
|
18 |
+
"noEmit": true,
|
19 |
+
"jsx": "react-jsx",
|
20 |
+
|
21 |
+
/* Linting */
|
22 |
+
"strict": true,
|
23 |
+
"noFallthroughCasesInSwitch": true
|
24 |
+
},
|
25 |
+
"include": ["src", "vite.config.ts"]
|
26 |
+
}
|
vite.config.ts
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import path from "path";
|
2 |
+
import react from "@vitejs/plugin-react";
|
3 |
+
import { defineConfig } from "vite";
|
4 |
+
|
5 |
+
// https://vitejs.dev/config/
|
6 |
+
export default defineConfig({
|
7 |
+
plugins: [react()],
|
8 |
+
resolve: {
|
9 |
+
alias: {
|
10 |
+
"@": path.resolve(__dirname, "./src"),
|
11 |
+
},
|
12 |
+
},
|
13 |
+
});
|