@totaland/create-starter-kit 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -18
- package/bin/index.js +109 -21
- package/package.json +2 -2
- package/templates/frontend/.env.example +7 -0
- package/templates/frontend/README.md +132 -0
- package/templates/frontend/RECOMMENDED_LIBRARIES.md +226 -0
- package/templates/frontend/SETUP_SUMMARY.md +162 -0
- package/templates/frontend/biome.json +47 -0
- package/templates/frontend/components.json +22 -0
- package/templates/frontend/index.html +13 -0
- package/templates/frontend/package.json +44 -0
- package/templates/frontend/postcss.config.js +6 -0
- package/templates/frontend/public/vite.svg +1 -0
- package/templates/frontend/src/App.css +42 -0
- package/templates/frontend/src/App.tsx +17 -0
- package/templates/frontend/src/assets/react.svg +1 -0
- package/templates/frontend/src/components/layout/Layout.tsx +31 -0
- package/templates/frontend/src/components/menu-toggle-icon.tsx +53 -0
- package/templates/frontend/src/components/ui/button.tsx +57 -0
- package/templates/frontend/src/hooks/use-scroll.ts +21 -0
- package/templates/frontend/src/index.css +121 -0
- package/templates/frontend/src/lib/api-client.ts +46 -0
- package/templates/frontend/src/lib/utils.ts +6 -0
- package/templates/frontend/src/main.tsx +30 -0
- package/templates/frontend/src/pages/about/AboutPage.tsx +50 -0
- package/templates/frontend/src/pages/home/HomePage.tsx +43 -0
- package/templates/frontend/tailwind.config.js +59 -0
- package/templates/frontend/tsconfig.app.json +41 -0
- package/templates/frontend/tsconfig.json +13 -0
- package/templates/frontend/tsconfig.node.json +26 -0
- package/templates/frontend/vite.config.ts +14 -0
- package/template/.env.example +0 -8
- /package/{template → templates/backend}/AGENTS.md +0 -0
- /package/{template → templates/backend}/ARCHITECTURE.md +0 -0
- /package/{template → templates/backend}/ORDER_SYSTEM.md +0 -0
- /package/{template → templates/backend}/biome.json +0 -0
- /package/{template → templates/backend}/drizzle.config.ts +0 -0
- /package/{template → templates/backend}/knip.json +0 -0
- /package/{template → templates/backend}/package.json +0 -0
- /package/{template → templates/backend}/playwright.config.ts +0 -0
- /package/{template → templates/backend}/pnpm-workspace.yaml +0 -0
- /package/{template → templates/backend}/src/features/health/controller.ts +0 -0
- /package/{template → templates/backend}/src/features/health/index.ts +0 -0
- /package/{template → templates/backend}/src/features/orders/controller.ts +0 -0
- /package/{template → templates/backend}/src/features/orders/index.ts +0 -0
- /package/{template → templates/backend}/src/index.ts +0 -0
- /package/{template → templates/backend}/tsconfig.build.json +0 -0
- /package/{template → templates/backend}/tsconfig.json +0 -0
- /package/{template → templates/backend}/vitest.config.ts +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
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-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
|
9
|
+
{
|
|
10
|
+
variants: {
|
|
11
|
+
variant: {
|
|
12
|
+
default:
|
|
13
|
+
"bg-primary text-primary-foreground shadow hover:bg-primary/90",
|
|
14
|
+
destructive:
|
|
15
|
+
"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
|
|
16
|
+
outline:
|
|
17
|
+
"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
|
|
18
|
+
secondary:
|
|
19
|
+
"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
|
|
20
|
+
ghost: "hover:bg-accent hover:text-accent-foreground",
|
|
21
|
+
link: "text-primary underline-offset-4 hover:underline",
|
|
22
|
+
},
|
|
23
|
+
size: {
|
|
24
|
+
default: "h-9 px-4 py-2",
|
|
25
|
+
sm: "h-8 rounded-md px-3 text-xs",
|
|
26
|
+
lg: "h-10 rounded-md px-8",
|
|
27
|
+
icon: "h-9 w-9",
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
defaultVariants: {
|
|
31
|
+
variant: "default",
|
|
32
|
+
size: "default",
|
|
33
|
+
},
|
|
34
|
+
}
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
export interface ButtonProps
|
|
38
|
+
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
|
|
39
|
+
VariantProps<typeof buttonVariants> {
|
|
40
|
+
asChild?: boolean
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
|
|
44
|
+
({ className, variant, size, asChild = false, ...props }, ref) => {
|
|
45
|
+
const Comp = asChild ? Slot : "button"
|
|
46
|
+
return (
|
|
47
|
+
<Comp
|
|
48
|
+
className={cn(buttonVariants({ variant, size, className }))}
|
|
49
|
+
ref={ref}
|
|
50
|
+
{...props}
|
|
51
|
+
/>
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
)
|
|
55
|
+
Button.displayName = "Button"
|
|
56
|
+
|
|
57
|
+
export { Button, buttonVariants }
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState } from "react";
|
|
2
|
+
|
|
3
|
+
export function useScroll(threshold: number) {
|
|
4
|
+
const [scrolled, setScrolled] = useState(false);
|
|
5
|
+
|
|
6
|
+
const onScroll = useCallback(() => {
|
|
7
|
+
setScrolled(window.scrollY > threshold);
|
|
8
|
+
}, [threshold]);
|
|
9
|
+
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
window.addEventListener("scroll", onScroll);
|
|
12
|
+
return () => window.removeEventListener("scroll", onScroll);
|
|
13
|
+
}, [onScroll]);
|
|
14
|
+
|
|
15
|
+
// also check on first load
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
onScroll();
|
|
18
|
+
}, [onScroll]);
|
|
19
|
+
|
|
20
|
+
return scrolled;
|
|
21
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
|
|
3
|
+
@plugin "tailwindcss-animate";
|
|
4
|
+
|
|
5
|
+
@custom-variant dark (&:is(.dark *));
|
|
6
|
+
|
|
7
|
+
@theme inline {
|
|
8
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
9
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
10
|
+
--radius-lg: var(--radius);
|
|
11
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
12
|
+
--color-background: var(--background);
|
|
13
|
+
--color-foreground: var(--foreground);
|
|
14
|
+
--color-card: var(--card);
|
|
15
|
+
--color-card-foreground: var(--card-foreground);
|
|
16
|
+
--color-popover: var(--popover);
|
|
17
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
18
|
+
--color-primary: var(--primary);
|
|
19
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
20
|
+
--color-secondary: var(--secondary);
|
|
21
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
22
|
+
--color-muted: var(--muted);
|
|
23
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
24
|
+
--color-accent: var(--accent);
|
|
25
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
26
|
+
--color-destructive: var(--destructive);
|
|
27
|
+
--color-border: var(--border);
|
|
28
|
+
--color-input: var(--input);
|
|
29
|
+
--color-ring: var(--ring);
|
|
30
|
+
--color-chart-1: var(--chart-1);
|
|
31
|
+
--color-chart-2: var(--chart-2);
|
|
32
|
+
--color-chart-3: var(--chart-3);
|
|
33
|
+
--color-chart-4: var(--chart-4);
|
|
34
|
+
--color-chart-5: var(--chart-5);
|
|
35
|
+
--color-sidebar: var(--sidebar);
|
|
36
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
37
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
38
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
39
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
40
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
41
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
42
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
:root {
|
|
46
|
+
--radius: 0.625rem;
|
|
47
|
+
--background: oklch(1 0 0);
|
|
48
|
+
--foreground: oklch(0.145 0 0);
|
|
49
|
+
--card: oklch(1 0 0);
|
|
50
|
+
--card-foreground: oklch(0.145 0 0);
|
|
51
|
+
--popover: oklch(1 0 0);
|
|
52
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
53
|
+
--primary: oklch(0.205 0 0);
|
|
54
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
55
|
+
--secondary: oklch(0.97 0 0);
|
|
56
|
+
--secondary-foreground: oklch(0.205 0 0);
|
|
57
|
+
--muted: oklch(0.97 0 0);
|
|
58
|
+
--muted-foreground: oklch(0.556 0 0);
|
|
59
|
+
--accent: oklch(0.97 0 0);
|
|
60
|
+
--accent-foreground: oklch(0.205 0 0);
|
|
61
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
62
|
+
--border: oklch(0.922 0 0);
|
|
63
|
+
--input: oklch(0.922 0 0);
|
|
64
|
+
--ring: oklch(0.708 0 0);
|
|
65
|
+
--chart-1: oklch(0.646 0.222 41.116);
|
|
66
|
+
--chart-2: oklch(0.6 0.118 184.704);
|
|
67
|
+
--chart-3: oklch(0.398 0.07 227.392);
|
|
68
|
+
--chart-4: oklch(0.828 0.189 84.429);
|
|
69
|
+
--chart-5: oklch(0.769 0.188 70.08);
|
|
70
|
+
--sidebar: oklch(0.985 0 0);
|
|
71
|
+
--sidebar-foreground: oklch(0.145 0 0);
|
|
72
|
+
--sidebar-primary: oklch(0.205 0 0);
|
|
73
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
74
|
+
--sidebar-accent: oklch(0.97 0 0);
|
|
75
|
+
--sidebar-accent-foreground: oklch(0.205 0 0);
|
|
76
|
+
--sidebar-border: oklch(0.922 0 0);
|
|
77
|
+
--sidebar-ring: oklch(0.708 0 0);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.dark {
|
|
81
|
+
--background: oklch(0.145 0 0);
|
|
82
|
+
--foreground: oklch(0.985 0 0);
|
|
83
|
+
--card: oklch(0.205 0 0);
|
|
84
|
+
--card-foreground: oklch(0.985 0 0);
|
|
85
|
+
--popover: oklch(0.205 0 0);
|
|
86
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
87
|
+
--primary: oklch(0.922 0 0);
|
|
88
|
+
--primary-foreground: oklch(0.205 0 0);
|
|
89
|
+
--secondary: oklch(0.269 0 0);
|
|
90
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
91
|
+
--muted: oklch(0.269 0 0);
|
|
92
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
93
|
+
--accent: oklch(0.269 0 0);
|
|
94
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
95
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
96
|
+
--border: oklch(1 0 0 / 10%);
|
|
97
|
+
--input: oklch(1 0 0 / 15%);
|
|
98
|
+
--ring: oklch(0.556 0 0);
|
|
99
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
|
100
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
|
101
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
|
102
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
|
103
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
|
104
|
+
--sidebar: oklch(0.205 0 0);
|
|
105
|
+
--sidebar-foreground: oklch(0.985 0 0);
|
|
106
|
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
107
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
108
|
+
--sidebar-accent: oklch(0.269 0 0);
|
|
109
|
+
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
110
|
+
--sidebar-border: oklch(1 0 0 / 10%);
|
|
111
|
+
--sidebar-ring: oklch(0.556 0 0);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
@layer base {
|
|
115
|
+
* {
|
|
116
|
+
@apply border-border outline-ring/50;
|
|
117
|
+
}
|
|
118
|
+
body {
|
|
119
|
+
@apply bg-background text-foreground;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Example API client configuration
|
|
2
|
+
const API_BASE_URL = import.meta.env.VITE_API_URL || 'http://localhost:3000/api';
|
|
3
|
+
|
|
4
|
+
export const apiClient = {
|
|
5
|
+
baseUrl: API_BASE_URL,
|
|
6
|
+
|
|
7
|
+
async request<T>(endpoint: string, options?: RequestInit): Promise<T> {
|
|
8
|
+
const response = await fetch(`${this.baseUrl}${endpoint}`, {
|
|
9
|
+
headers: {
|
|
10
|
+
'Content-Type': 'application/json',
|
|
11
|
+
...options?.headers,
|
|
12
|
+
},
|
|
13
|
+
...options,
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
throw new Error(`API Error: ${response.statusText}`);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return response.json();
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
get<T>(endpoint: string): Promise<T> {
|
|
24
|
+
return this.request<T>(endpoint);
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
post<T>(endpoint: string, data: unknown): Promise<T> {
|
|
28
|
+
return this.request<T>(endpoint, {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
body: JSON.stringify(data),
|
|
31
|
+
});
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
put<T>(endpoint: string, data: unknown): Promise<T> {
|
|
35
|
+
return this.request<T>(endpoint, {
|
|
36
|
+
method: 'PUT',
|
|
37
|
+
body: JSON.stringify(data),
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
delete<T>(endpoint: string): Promise<T> {
|
|
42
|
+
return this.request<T>(endpoint, {
|
|
43
|
+
method: 'DELETE',
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
2
|
+
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
|
|
3
|
+
import { StrictMode } from 'react';
|
|
4
|
+
import { createRoot } from 'react-dom/client';
|
|
5
|
+
import { BrowserRouter } from 'react-router-dom';
|
|
6
|
+
import App from './App';
|
|
7
|
+
import './index.css';
|
|
8
|
+
|
|
9
|
+
// Create a client
|
|
10
|
+
const queryClient = new QueryClient({
|
|
11
|
+
defaultOptions: {
|
|
12
|
+
queries: {
|
|
13
|
+
staleTime: 1000 * 60 * 5, // 5 minutes
|
|
14
|
+
gcTime: 1000 * 60 * 10, // 10 minutes (formerly cacheTime)
|
|
15
|
+
refetchOnWindowFocus: false,
|
|
16
|
+
retry: 1,
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
createRoot(document.getElementById('root')!).render(
|
|
22
|
+
<StrictMode>
|
|
23
|
+
<QueryClientProvider client={queryClient}>
|
|
24
|
+
<BrowserRouter>
|
|
25
|
+
<App />
|
|
26
|
+
</BrowserRouter>
|
|
27
|
+
<ReactQueryDevtools initialIsOpen={false} />
|
|
28
|
+
</QueryClientProvider>
|
|
29
|
+
</StrictMode>,
|
|
30
|
+
);
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export function AboutPage() {
|
|
2
|
+
return (
|
|
3
|
+
<div className="space-y-6">
|
|
4
|
+
<h1 className="text-4xl font-bold">About</h1>
|
|
5
|
+
<div className="prose dark:prose-invert max-w-none">
|
|
6
|
+
<p>
|
|
7
|
+
This is a modern React starter kit with a carefully selected stack of tools and
|
|
8
|
+
libraries.
|
|
9
|
+
</p>
|
|
10
|
+
<h2 className="text-2xl font-semibold mt-6 mb-3">Tech Stack</h2>
|
|
11
|
+
<ul className="space-y-2">
|
|
12
|
+
<li>
|
|
13
|
+
<strong>React 19</strong> - Latest React with improved performance
|
|
14
|
+
</li>
|
|
15
|
+
<li>
|
|
16
|
+
<strong>TypeScript</strong> - Type-safe development
|
|
17
|
+
</li>
|
|
18
|
+
<li>
|
|
19
|
+
<strong>Vite</strong> - Fast build tool and dev server
|
|
20
|
+
</li>
|
|
21
|
+
<li>
|
|
22
|
+
<strong>Tailwind CSS</strong> - Utility-first CSS framework
|
|
23
|
+
</li>
|
|
24
|
+
<li>
|
|
25
|
+
<strong>shadcn/ui</strong> - Beautiful, accessible components
|
|
26
|
+
</li>
|
|
27
|
+
<li>
|
|
28
|
+
<strong>TanStack Query</strong> - Powerful data fetching and caching
|
|
29
|
+
</li>
|
|
30
|
+
<li>
|
|
31
|
+
<strong>React Router</strong> - Client-side routing
|
|
32
|
+
</li>
|
|
33
|
+
<li>
|
|
34
|
+
<strong>Drizzle ORM</strong> - Type-safe database access
|
|
35
|
+
</li>
|
|
36
|
+
<li>
|
|
37
|
+
<strong>Biome</strong> - Fast linter and formatter
|
|
38
|
+
</li>
|
|
39
|
+
</ul>
|
|
40
|
+
<h2 className="text-2xl font-semibold mt-6 mb-3">Adding shadcn/ui Components</h2>
|
|
41
|
+
<p>
|
|
42
|
+
To add shadcn/ui components, use the CLI. For example, to add a button component:
|
|
43
|
+
</p>
|
|
44
|
+
<pre className="bg-muted p-4 rounded-lg overflow-x-auto">
|
|
45
|
+
<code>pnpm dlx shadcn@latest add button</code>
|
|
46
|
+
</pre>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { useQuery } from '@tanstack/react-query';
|
|
2
|
+
|
|
3
|
+
// Example query function
|
|
4
|
+
async function fetchWelcomeMessage() {
|
|
5
|
+
// Replace with actual API call
|
|
6
|
+
return new Promise<string>((resolve) => {
|
|
7
|
+
setTimeout(() => resolve('Welcome to the Starter Kit!'), 500);
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function HomePage() {
|
|
12
|
+
const { data, isLoading } = useQuery({
|
|
13
|
+
queryKey: ['welcome'],
|
|
14
|
+
queryFn: fetchWelcomeMessage,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<div className="space-y-6">
|
|
19
|
+
<h1 className="text-4xl font-bold">Home Page</h1>
|
|
20
|
+
{isLoading ? (
|
|
21
|
+
<p className="text-muted-foreground">Loading...</p>
|
|
22
|
+
) : (
|
|
23
|
+
<p className="text-lg">{data}</p>
|
|
24
|
+
)}
|
|
25
|
+
<div className="space-y-4">
|
|
26
|
+
<p className="text-muted-foreground">
|
|
27
|
+
This is an example home page with TanStack Query integration.
|
|
28
|
+
</p>
|
|
29
|
+
<div className="rounded-lg border p-4">
|
|
30
|
+
<h2 className="text-xl font-semibold mb-2">Features included:</h2>
|
|
31
|
+
<ul className="list-disc list-inside space-y-1 text-sm">
|
|
32
|
+
<li>React Router for navigation</li>
|
|
33
|
+
<li>TanStack Query for data fetching</li>
|
|
34
|
+
<li>Tailwind CSS for styling</li>
|
|
35
|
+
<li>shadcn/ui ready (use CLI to add components)</li>
|
|
36
|
+
<li>Drizzle ORM integration</li>
|
|
37
|
+
<li>Biome for linting and formatting</li>
|
|
38
|
+
</ul>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
);
|
|
43
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import tailwindcssAnimate from 'tailwindcss-animate';
|
|
2
|
+
|
|
3
|
+
/** @type {import('tailwindcss').Config} */
|
|
4
|
+
export default {
|
|
5
|
+
darkMode: ['class'],
|
|
6
|
+
content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
|
|
7
|
+
theme: {
|
|
8
|
+
extend: {
|
|
9
|
+
borderRadius: {
|
|
10
|
+
lg: 'var(--radius)',
|
|
11
|
+
md: 'calc(var(--radius) - 2px)',
|
|
12
|
+
sm: 'calc(var(--radius) - 4px)',
|
|
13
|
+
},
|
|
14
|
+
colors: {
|
|
15
|
+
background: 'hsl(var(--background))',
|
|
16
|
+
foreground: 'hsl(var(--foreground))',
|
|
17
|
+
card: {
|
|
18
|
+
DEFAULT: 'hsl(var(--card))',
|
|
19
|
+
foreground: 'hsl(var(--card-foreground))',
|
|
20
|
+
},
|
|
21
|
+
popover: {
|
|
22
|
+
DEFAULT: 'hsl(var(--popover))',
|
|
23
|
+
foreground: 'hsl(var(--popover-foreground))',
|
|
24
|
+
},
|
|
25
|
+
primary: {
|
|
26
|
+
DEFAULT: 'hsl(var(--primary))',
|
|
27
|
+
foreground: 'hsl(var(--primary-foreground))',
|
|
28
|
+
},
|
|
29
|
+
secondary: {
|
|
30
|
+
DEFAULT: 'hsl(var(--secondary))',
|
|
31
|
+
foreground: 'hsl(var(--secondary-foreground))',
|
|
32
|
+
},
|
|
33
|
+
muted: {
|
|
34
|
+
DEFAULT: 'hsl(var(--muted))',
|
|
35
|
+
foreground: 'hsl(var(--muted-foreground))',
|
|
36
|
+
},
|
|
37
|
+
accent: {
|
|
38
|
+
DEFAULT: 'hsl(var(--accent))',
|
|
39
|
+
foreground: 'hsl(var(--accent-foreground))',
|
|
40
|
+
},
|
|
41
|
+
destructive: {
|
|
42
|
+
DEFAULT: 'hsl(var(--destructive))',
|
|
43
|
+
foreground: 'hsl(var(--destructive-foreground))',
|
|
44
|
+
},
|
|
45
|
+
border: 'hsl(var(--border))',
|
|
46
|
+
input: 'hsl(var(--input))',
|
|
47
|
+
ring: 'hsl(var(--ring))',
|
|
48
|
+
chart: {
|
|
49
|
+
1: 'hsl(var(--chart-1))',
|
|
50
|
+
2: 'hsl(var(--chart-2))',
|
|
51
|
+
3: 'hsl(var(--chart-3))',
|
|
52
|
+
4: 'hsl(var(--chart-4))',
|
|
53
|
+
5: 'hsl(var(--chart-5))',
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
plugins: [tailwindcssAnimate],
|
|
59
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
|
4
|
+
"target": "ES2022",
|
|
5
|
+
"useDefineForClassFields": true,
|
|
6
|
+
"lib": [
|
|
7
|
+
"ES2022",
|
|
8
|
+
"DOM",
|
|
9
|
+
"DOM.Iterable"
|
|
10
|
+
],
|
|
11
|
+
"module": "ESNext",
|
|
12
|
+
"types": [
|
|
13
|
+
"vite/client"
|
|
14
|
+
],
|
|
15
|
+
"skipLibCheck": true,
|
|
16
|
+
/* Bundler mode */
|
|
17
|
+
"moduleResolution": "bundler",
|
|
18
|
+
"allowImportingTsExtensions": true,
|
|
19
|
+
"verbatimModuleSyntax": true,
|
|
20
|
+
"moduleDetection": "force",
|
|
21
|
+
"noEmit": true,
|
|
22
|
+
"jsx": "react-jsx",
|
|
23
|
+
/* Linting */
|
|
24
|
+
"strict": true,
|
|
25
|
+
"noUnusedLocals": true,
|
|
26
|
+
"noUnusedParameters": true,
|
|
27
|
+
"erasableSyntaxOnly": true,
|
|
28
|
+
"noFallthroughCasesInSwitch": true,
|
|
29
|
+
"noUncheckedSideEffectImports": true,
|
|
30
|
+
/* Path Aliases */
|
|
31
|
+
"baseUrl": ".",
|
|
32
|
+
"paths": {
|
|
33
|
+
"@/*": [
|
|
34
|
+
"./src/*"
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"include": [
|
|
39
|
+
"src"
|
|
40
|
+
]
|
|
41
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
|
4
|
+
"target": "ES2023",
|
|
5
|
+
"lib": ["ES2023"],
|
|
6
|
+
"module": "ESNext",
|
|
7
|
+
"types": ["node"],
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
|
|
10
|
+
/* Bundler mode */
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"allowImportingTsExtensions": true,
|
|
13
|
+
"verbatimModuleSyntax": true,
|
|
14
|
+
"moduleDetection": "force",
|
|
15
|
+
"noEmit": true,
|
|
16
|
+
|
|
17
|
+
/* Linting */
|
|
18
|
+
"strict": true,
|
|
19
|
+
"noUnusedLocals": true,
|
|
20
|
+
"noUnusedParameters": true,
|
|
21
|
+
"erasableSyntaxOnly": true,
|
|
22
|
+
"noFallthroughCasesInSwitch": true,
|
|
23
|
+
"noUncheckedSideEffectImports": true
|
|
24
|
+
},
|
|
25
|
+
"include": ["vite.config.ts"]
|
|
26
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import tailwindcss from "@tailwindcss/vite"
|
|
3
|
+
import react from '@vitejs/plugin-react-swc';
|
|
4
|
+
import { defineConfig } from 'vite';
|
|
5
|
+
|
|
6
|
+
// https://vite.dev/config/
|
|
7
|
+
export default defineConfig({
|
|
8
|
+
plugins: [react(), tailwindcss()],
|
|
9
|
+
resolve: {
|
|
10
|
+
alias: {
|
|
11
|
+
'@': path.resolve(__dirname, './src'),
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
});
|
package/template/.env.example
DELETED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|