create-app-ui 1.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/LICENSE +21 -0
- package/README.md +117 -0
- package/boilerplate/README.md +18 -0
- package/boilerplate/react-base/.env.example +1 -0
- package/boilerplate/react-base/README.md +3 -0
- package/boilerplate/react-base/components.json +19 -0
- package/boilerplate/react-base/eslint.config.js +32 -0
- package/boilerplate/react-base/index.html +12 -0
- package/boilerplate/react-base/package.json +71 -0
- package/boilerplate/react-base/postcss.config.js +6 -0
- package/boilerplate/react-base/prettier.config.js +6 -0
- package/boilerplate/react-base/src/api/axios.ts +20 -0
- package/boilerplate/react-base/src/app/store.ts +13 -0
- package/boilerplate/react-base/src/components/data-table.tsx +919 -0
- package/boilerplate/react-base/src/components/ui/accordion.tsx +44 -0
- package/boilerplate/react-base/src/components/ui/alert-dialog.tsx +105 -0
- package/boilerplate/react-base/src/components/ui/alert.tsx +40 -0
- package/boilerplate/react-base/src/components/ui/avatar.tsx +30 -0
- package/boilerplate/react-base/src/components/ui/badge.tsx +27 -0
- package/boilerplate/react-base/src/components/ui/bar-chart.tsx +76 -0
- package/boilerplate/react-base/src/components/ui/breadcrumb.tsx +87 -0
- package/boilerplate/react-base/src/components/ui/button.tsx +34 -0
- package/boilerplate/react-base/src/components/ui/calendar.tsx +63 -0
- package/boilerplate/react-base/src/components/ui/card.tsx +36 -0
- package/boilerplate/react-base/src/components/ui/chart.tsx +280 -0
- package/boilerplate/react-base/src/components/ui/checkbox.tsx +51 -0
- package/boilerplate/react-base/src/components/ui/context-menu.tsx +173 -0
- package/boilerplate/react-base/src/components/ui/date-picker.tsx +42 -0
- package/boilerplate/react-base/src/components/ui/dialog.tsx +87 -0
- package/boilerplate/react-base/src/components/ui/drawer.tsx +81 -0
- package/boilerplate/react-base/src/components/ui/dropdown-menu.tsx +81 -0
- package/boilerplate/react-base/src/components/ui/dropdown-types.ts +28 -0
- package/boilerplate/react-base/src/components/ui/field.tsx +194 -0
- package/boilerplate/react-base/src/components/ui/hover-card.tsx +26 -0
- package/boilerplate/react-base/src/components/ui/input-group.tsx +98 -0
- package/boilerplate/react-base/src/components/ui/input-otp.tsx +63 -0
- package/boilerplate/react-base/src/components/ui/input.tsx +12 -0
- package/boilerplate/react-base/src/components/ui/item.tsx +152 -0
- package/boilerplate/react-base/src/components/ui/kbd.tsx +13 -0
- package/boilerplate/react-base/src/components/ui/label.tsx +14 -0
- package/boilerplate/react-base/src/components/ui/line-chart.tsx +65 -0
- package/boilerplate/react-base/src/components/ui/menubar.tsx +217 -0
- package/boilerplate/react-base/src/components/ui/multi-select-dropdown.tsx +200 -0
- package/boilerplate/react-base/src/components/ui/navigation-menu.tsx +120 -0
- package/boilerplate/react-base/src/components/ui/pie-chart.tsx +87 -0
- package/boilerplate/react-base/src/components/ui/popover.tsx +29 -0
- package/boilerplate/react-base/src/components/ui/progress.tsx +19 -0
- package/boilerplate/react-base/src/components/ui/radio-group.tsx +36 -0
- package/boilerplate/react-base/src/components/ui/scroll-area.tsx +38 -0
- package/boilerplate/react-base/src/components/ui/searchable-dropdown.tsx +118 -0
- package/boilerplate/react-base/src/components/ui/select.tsx +140 -0
- package/boilerplate/react-base/src/components/ui/separator.tsx +20 -0
- package/boilerplate/react-base/src/components/ui/sheet.tsx +70 -0
- package/boilerplate/react-base/src/components/ui/sidebar.tsx +470 -0
- package/boilerplate/react-base/src/components/ui/skeleton.tsx +11 -0
- package/boilerplate/react-base/src/components/ui/slider.tsx +23 -0
- package/boilerplate/react-base/src/components/ui/sonner.tsx +21 -0
- package/boilerplate/react-base/src/components/ui/sparkline.tsx +38 -0
- package/boilerplate/react-base/src/components/ui/spinner.tsx +10 -0
- package/boilerplate/react-base/src/components/ui/switch.tsx +16 -0
- package/boilerplate/react-base/src/components/ui/table.tsx +80 -0
- package/boilerplate/react-base/src/components/ui/tabs.tsx +32 -0
- package/boilerplate/react-base/src/components/ui/textarea.tsx +12 -0
- package/boilerplate/react-base/src/components/ui/toggle-group.tsx +49 -0
- package/boilerplate/react-base/src/components/ui/toggle.tsx +33 -0
- package/boilerplate/react-base/src/components/ui/tooltip.tsx +23 -0
- package/boilerplate/react-base/src/components/ui/typography.tsx +76 -0
- package/boilerplate/react-base/src/config/constants.ts +3 -0
- package/boilerplate/react-base/src/config/theme.ts +432 -0
- package/boilerplate/react-base/src/config/user.ts +52 -0
- package/boilerplate/react-base/src/context/theme-provider.tsx +12 -0
- package/boilerplate/react-base/src/features/auth/authSlice.ts +19 -0
- package/boilerplate/react-base/src/hooks/index.ts +1 -0
- package/boilerplate/react-base/src/hooks/use-mobile.ts +17 -0
- package/boilerplate/react-base/src/lib/utils.ts +6 -0
- package/boilerplate/react-base/src/routes/index.tsx +7 -0
- package/boilerplate/react-base/src/styles/globals.css +15 -0
- package/boilerplate/react-base/src/vite-env.d.ts +31 -0
- package/boilerplate/react-base/tailwind.config.ts +75 -0
- package/boilerplate/react-base/tsconfig.app.json +20 -0
- package/boilerplate/react-base/tsconfig.json +7 -0
- package/boilerplate/react-base/tsconfig.node.json +16 -0
- package/boilerplate/react-base/vite.config.ts +12 -0
- package/dist/bin/index.js +8 -0
- package/dist/src/cli-args.js +52 -0
- package/dist/src/generator.js +85 -0
- package/dist/src/installer.js +7 -0
- package/dist/src/paths.js +61 -0
- package/dist/src/prompts.js +79 -0
- package/dist/src/replace-placeholders.js +22 -0
- package/dist/src/utils.js +16 -0
- package/package.json +63 -0
- package/templates/admin-portal/README.md +26 -0
- package/templates/admin-portal/src/App.tsx +85 -0
- package/templates/admin-portal/src/assets/auth-hero.jpg +0 -0
- package/templates/admin-portal/src/assets/brand-logo.png +0 -0
- package/templates/admin-portal/src/components/app-breadcrumb.tsx +41 -0
- package/templates/admin-portal/src/components/app-header.tsx +20 -0
- package/templates/admin-portal/src/components/app-sidebar.tsx +78 -0
- package/templates/admin-portal/src/components/auth-layout.tsx +66 -0
- package/templates/admin-portal/src/components/dashboard-metric-card.tsx +105 -0
- package/templates/admin-portal/src/components/data-table.tsx +919 -0
- package/templates/admin-portal/src/components/layout-shell.tsx +23 -0
- package/templates/admin-portal/src/components/notifications-sheet.tsx +91 -0
- package/templates/admin-portal/src/components/sidebar-nav.tsx +164 -0
- package/templates/admin-portal/src/components/user-avatar.tsx +26 -0
- package/templates/admin-portal/src/components/user-menu.tsx +163 -0
- package/templates/admin-portal/src/config/branding.ts +17 -0
- package/templates/admin-portal/src/config/chart-data.ts +44 -0
- package/templates/admin-portal/src/config/navigation.ts +42 -0
- package/templates/admin-portal/src/context/auth-context.tsx +32 -0
- package/templates/admin-portal/src/lib/breadcrumbs.ts +58 -0
- package/templates/admin-portal/src/main.tsx +18 -0
- package/templates/admin-portal/src/pages/components/demo-columns.tsx +170 -0
- package/templates/admin-portal/src/pages/components.tsx +1368 -0
- package/templates/admin-portal/src/pages/dashboard.tsx +143 -0
- package/templates/admin-portal/src/pages/login.tsx +81 -0
- package/templates/admin-portal/src/pages/settings/notifications.tsx +31 -0
- package/templates/admin-portal/src/pages/settings/profile.tsx +26 -0
- package/templates/admin-portal/src/pages/signup.tsx +81 -0
- package/templates/admin-portal/src/pages/users.tsx +12 -0
- package/templates/admin-portal/tsconfig.json +10 -0
- package/templates/blank/README.md +15 -0
- package/templates/blank/src/App.tsx +5 -0
- package/templates/blank/src/main.tsx +15 -0
- package/templates/blank/src/pages/home.tsx +20 -0
- package/templates/blank/tsconfig.json +10 -0
- package/templates/tsconfig.overlay.base.json +7 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { DashboardMetricCard, dashboardMetrics } from "@/components/dashboard-metric-card";
|
|
2
|
+
import { BarChart } from "@/components/ui/bar-chart";
|
|
3
|
+
import { Badge } from "@/components/ui/badge";
|
|
4
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
|
|
5
|
+
import { LineChart } from "@/components/ui/line-chart";
|
|
6
|
+
import { PieChart } from "@/components/ui/pie-chart";
|
|
7
|
+
import {
|
|
8
|
+
deviceUsageData,
|
|
9
|
+
monthlyRevenueData,
|
|
10
|
+
trafficSourceData,
|
|
11
|
+
userRoleDistribution,
|
|
12
|
+
weeklyActiveUsersData,
|
|
13
|
+
} from "@/config/chart-data";
|
|
14
|
+
import {
|
|
15
|
+
activeUsersChartConfig,
|
|
16
|
+
deviceChartConfig,
|
|
17
|
+
revenueChartConfig,
|
|
18
|
+
roleChartConfig,
|
|
19
|
+
trafficChartConfig,
|
|
20
|
+
} from "@/config/theme";
|
|
21
|
+
|
|
22
|
+
export function DashboardPage() {
|
|
23
|
+
return (
|
|
24
|
+
<div className="space-y-6">
|
|
25
|
+
<div>
|
|
26
|
+
<h1 className="text-2xl font-semibold">Dashboard</h1>
|
|
27
|
+
<p className="text-sm text-muted-foreground">High-level platform performance snapshot.</p>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div className="grid gap-4 md:grid-cols-3">
|
|
31
|
+
{dashboardMetrics.map((metric) => (
|
|
32
|
+
<DashboardMetricCard key={metric.label} metric={metric} />
|
|
33
|
+
))}
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<div className="grid gap-4 lg:grid-cols-2">
|
|
37
|
+
<Card>
|
|
38
|
+
<CardHeader>
|
|
39
|
+
<CardTitle>Monthly revenue</CardTitle>
|
|
40
|
+
<CardDescription>Revenue and new user signups by month</CardDescription>
|
|
41
|
+
</CardHeader>
|
|
42
|
+
<CardContent>
|
|
43
|
+
<BarChart
|
|
44
|
+
data={monthlyRevenueData}
|
|
45
|
+
config={revenueChartConfig}
|
|
46
|
+
dataKeys={["revenue", "users"]}
|
|
47
|
+
categoryKey="month"
|
|
48
|
+
/>
|
|
49
|
+
</CardContent>
|
|
50
|
+
</Card>
|
|
51
|
+
|
|
52
|
+
<Card>
|
|
53
|
+
<CardHeader>
|
|
54
|
+
<CardTitle>Active users</CardTitle>
|
|
55
|
+
<CardDescription>Weekly active users over the last 8 weeks</CardDescription>
|
|
56
|
+
</CardHeader>
|
|
57
|
+
<CardContent>
|
|
58
|
+
<LineChart
|
|
59
|
+
data={weeklyActiveUsersData}
|
|
60
|
+
config={activeUsersChartConfig}
|
|
61
|
+
dataKeys={["users"]}
|
|
62
|
+
categoryKey="week"
|
|
63
|
+
/>
|
|
64
|
+
</CardContent>
|
|
65
|
+
</Card>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
<div className="grid gap-4 lg:grid-cols-3">
|
|
69
|
+
<Card className="lg:col-span-2">
|
|
70
|
+
<CardHeader>
|
|
71
|
+
<CardTitle>Traffic sources</CardTitle>
|
|
72
|
+
<CardDescription>Visitor count by acquisition channel</CardDescription>
|
|
73
|
+
</CardHeader>
|
|
74
|
+
<CardContent>
|
|
75
|
+
<BarChart
|
|
76
|
+
data={trafficSourceData}
|
|
77
|
+
config={trafficChartConfig}
|
|
78
|
+
dataKeys={["visitors"]}
|
|
79
|
+
categoryKey="source"
|
|
80
|
+
layout="vertical"
|
|
81
|
+
/>
|
|
82
|
+
</CardContent>
|
|
83
|
+
</Card>
|
|
84
|
+
|
|
85
|
+
<Card>
|
|
86
|
+
<CardHeader>
|
|
87
|
+
<CardTitle>User roles</CardTitle>
|
|
88
|
+
<CardDescription>Distribution by role</CardDescription>
|
|
89
|
+
</CardHeader>
|
|
90
|
+
<CardContent className="flex justify-center">
|
|
91
|
+
<PieChart
|
|
92
|
+
data={userRoleDistribution}
|
|
93
|
+
config={roleChartConfig}
|
|
94
|
+
dataKey="count"
|
|
95
|
+
nameKey="role"
|
|
96
|
+
innerRadius={60}
|
|
97
|
+
showCenterLabel
|
|
98
|
+
centerLabel="Users"
|
|
99
|
+
/>
|
|
100
|
+
</CardContent>
|
|
101
|
+
</Card>
|
|
102
|
+
</div>
|
|
103
|
+
|
|
104
|
+
<div className="grid gap-4 lg:grid-cols-2">
|
|
105
|
+
<Card>
|
|
106
|
+
<CardHeader>
|
|
107
|
+
<CardTitle>Device usage</CardTitle>
|
|
108
|
+
<CardDescription>Share of sessions by device type</CardDescription>
|
|
109
|
+
</CardHeader>
|
|
110
|
+
<CardContent className="flex justify-center">
|
|
111
|
+
<PieChart
|
|
112
|
+
data={deviceUsageData}
|
|
113
|
+
config={deviceChartConfig}
|
|
114
|
+
dataKey="value"
|
|
115
|
+
nameKey="device"
|
|
116
|
+
/>
|
|
117
|
+
</CardContent>
|
|
118
|
+
</Card>
|
|
119
|
+
|
|
120
|
+
<Card>
|
|
121
|
+
<CardHeader>
|
|
122
|
+
<CardTitle>Recent activity</CardTitle>
|
|
123
|
+
<CardDescription>Latest platform events</CardDescription>
|
|
124
|
+
</CardHeader>
|
|
125
|
+
<CardContent className="space-y-3">
|
|
126
|
+
<div className="flex items-center justify-between">
|
|
127
|
+
<span>User account created</span>
|
|
128
|
+
<Badge variant="secondary">2m ago</Badge>
|
|
129
|
+
</div>
|
|
130
|
+
<div className="flex items-center justify-between">
|
|
131
|
+
<span>Role updated</span>
|
|
132
|
+
<Badge variant="secondary">11m ago</Badge>
|
|
133
|
+
</div>
|
|
134
|
+
<div className="flex items-center justify-between">
|
|
135
|
+
<span>Settings changed</span>
|
|
136
|
+
<Badge variant="secondary">1h ago</Badge>
|
|
137
|
+
</div>
|
|
138
|
+
</CardContent>
|
|
139
|
+
</Card>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
);
|
|
143
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { FormEvent, useState } from "react";
|
|
2
|
+
import { Navigate } from "react-router-dom";
|
|
3
|
+
import { AuthLayout } from "@/components/auth-layout";
|
|
4
|
+
import { BRANDING } from "@/config/branding";
|
|
5
|
+
import { THEME } from "@/config/theme";
|
|
6
|
+
import { cn } from "@/lib/utils";
|
|
7
|
+
import { Button } from "@/components/ui/button";
|
|
8
|
+
import { Input } from "@/components/ui/input";
|
|
9
|
+
import { Label } from "@/components/ui/label";
|
|
10
|
+
|
|
11
|
+
type LoginPageProps = {
|
|
12
|
+
isAuthenticated: boolean;
|
|
13
|
+
onLogin: () => void;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export function LoginPage({ isAuthenticated, onLogin }: LoginPageProps) {
|
|
17
|
+
const [email, setEmail] = useState("admin@company.com");
|
|
18
|
+
const [password, setPassword] = useState("admin123");
|
|
19
|
+
const [error, setError] = useState("");
|
|
20
|
+
|
|
21
|
+
if (isAuthenticated) {
|
|
22
|
+
return <Navigate to="/components" replace />;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const handleSubmit = (event: FormEvent) => {
|
|
26
|
+
event.preventDefault();
|
|
27
|
+
|
|
28
|
+
if (email === "admin@company.com" && password === "admin123") {
|
|
29
|
+
onLogin();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
setError("Invalid credentials. Use admin@company.com / admin123");
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
return (
|
|
37
|
+
<AuthLayout
|
|
38
|
+
alternateCta="Sign up"
|
|
39
|
+
alternateHref="/signup"
|
|
40
|
+
alternateLabel="Don't have an account?"
|
|
41
|
+
subtitle={BRANDING.auth.loginSubtitle}
|
|
42
|
+
title={BRANDING.auth.loginTitle}
|
|
43
|
+
>
|
|
44
|
+
<div className="space-y-4">
|
|
45
|
+
<Button className="w-full" type="button" variant="outline">
|
|
46
|
+
<span className="mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full border text-xs">
|
|
47
|
+
G
|
|
48
|
+
</span>
|
|
49
|
+
{BRANDING.auth.continueWithGoogleLabel}
|
|
50
|
+
</Button>
|
|
51
|
+
|
|
52
|
+
<div className="text-center text-sm text-muted-foreground">or Sign in with Email</div>
|
|
53
|
+
|
|
54
|
+
<form className="space-y-4" onSubmit={handleSubmit}>
|
|
55
|
+
<div className="space-y-2">
|
|
56
|
+
<Label htmlFor="email">Email</Label>
|
|
57
|
+
<Input
|
|
58
|
+
id="email"
|
|
59
|
+
type="email"
|
|
60
|
+
value={email}
|
|
61
|
+
onChange={(event) => setEmail(event.target.value)}
|
|
62
|
+
/>
|
|
63
|
+
</div>
|
|
64
|
+
<div className="space-y-2">
|
|
65
|
+
<Label htmlFor="password">Password</Label>
|
|
66
|
+
<Input
|
|
67
|
+
id="password"
|
|
68
|
+
type="password"
|
|
69
|
+
value={password}
|
|
70
|
+
onChange={(event) => setPassword(event.target.value)}
|
|
71
|
+
/>
|
|
72
|
+
</div>
|
|
73
|
+
{error ? <p className={cn("text-sm", THEME.classes.destructiveText)}>{error}</p> : null}
|
|
74
|
+
<Button className={THEME.classes.authSubmit} type="submit" variant="brand">
|
|
75
|
+
Login Now
|
|
76
|
+
</Button>
|
|
77
|
+
</form>
|
|
78
|
+
</div>
|
|
79
|
+
</AuthLayout>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Button } from "@/components/ui/button";
|
|
2
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
|
|
3
|
+
import { Label } from "@/components/ui/label";
|
|
4
|
+
|
|
5
|
+
export function SettingsNotificationsPage() {
|
|
6
|
+
return (
|
|
7
|
+
<Card className="max-w-xl">
|
|
8
|
+
<CardHeader>
|
|
9
|
+
<CardTitle>Notifications</CardTitle>
|
|
10
|
+
<CardDescription>Choose how you want to be notified.</CardDescription>
|
|
11
|
+
</CardHeader>
|
|
12
|
+
<CardContent className="space-y-4">
|
|
13
|
+
<label className="flex items-center justify-between gap-4 rounded-md border p-3">
|
|
14
|
+
<div>
|
|
15
|
+
<Label>Email alerts</Label>
|
|
16
|
+
<p className="text-sm text-muted-foreground">Receive summaries and critical updates.</p>
|
|
17
|
+
</div>
|
|
18
|
+
<input type="checkbox" defaultChecked className="h-4 w-4" />
|
|
19
|
+
</label>
|
|
20
|
+
<label className="flex items-center justify-between gap-4 rounded-md border p-3">
|
|
21
|
+
<div>
|
|
22
|
+
<Label>Push notifications</Label>
|
|
23
|
+
<p className="text-sm text-muted-foreground">Instant alerts for user activity.</p>
|
|
24
|
+
</div>
|
|
25
|
+
<input type="checkbox" className="h-4 w-4" />
|
|
26
|
+
</label>
|
|
27
|
+
<Button>Save preferences</Button>
|
|
28
|
+
</CardContent>
|
|
29
|
+
</Card>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Button } from "@/components/ui/button";
|
|
2
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
|
|
3
|
+
import { Input } from "@/components/ui/input";
|
|
4
|
+
import { Label } from "@/components/ui/label";
|
|
5
|
+
|
|
6
|
+
export function SettingsProfilePage() {
|
|
7
|
+
return (
|
|
8
|
+
<Card className="max-w-xl">
|
|
9
|
+
<CardHeader>
|
|
10
|
+
<CardTitle>Profile</CardTitle>
|
|
11
|
+
<CardDescription>Update your personal account details.</CardDescription>
|
|
12
|
+
</CardHeader>
|
|
13
|
+
<CardContent className="space-y-4">
|
|
14
|
+
<div className="space-y-2">
|
|
15
|
+
<Label htmlFor="full-name">Full name</Label>
|
|
16
|
+
<Input id="full-name" placeholder="Jane Admin" />
|
|
17
|
+
</div>
|
|
18
|
+
<div className="space-y-2">
|
|
19
|
+
<Label htmlFor="email">Email</Label>
|
|
20
|
+
<Input id="email" type="email" placeholder="admin@company.com" />
|
|
21
|
+
</div>
|
|
22
|
+
<Button>Save profile</Button>
|
|
23
|
+
</CardContent>
|
|
24
|
+
</Card>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { FormEvent, useState } from "react";
|
|
2
|
+
import { Navigate } from "react-router-dom";
|
|
3
|
+
import { AuthLayout } from "@/components/auth-layout";
|
|
4
|
+
import { BRANDING } from "@/config/branding";
|
|
5
|
+
import { THEME } from "@/config/theme";
|
|
6
|
+
import { Button } from "@/components/ui/button";
|
|
7
|
+
import { Input } from "@/components/ui/input";
|
|
8
|
+
import { Label } from "@/components/ui/label";
|
|
9
|
+
|
|
10
|
+
type SignupPageProps = {
|
|
11
|
+
isAuthenticated: boolean;
|
|
12
|
+
onSignup: () => void;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export function SignupPage({ isAuthenticated, onSignup }: SignupPageProps) {
|
|
16
|
+
const [storeName, setStoreName] = useState("Rindu Store");
|
|
17
|
+
const [email, setEmail] = useState("rindustore@gmail.com");
|
|
18
|
+
const [password, setPassword] = useState("admin123");
|
|
19
|
+
|
|
20
|
+
if (isAuthenticated) {
|
|
21
|
+
return <Navigate to="/components" replace />;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const handleSubmit = (event: FormEvent) => {
|
|
25
|
+
event.preventDefault();
|
|
26
|
+
onSignup();
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<AuthLayout
|
|
31
|
+
alternateCta="Login"
|
|
32
|
+
alternateHref="/login"
|
|
33
|
+
alternateLabel="Already have an account?"
|
|
34
|
+
subtitle={BRANDING.auth.signupSubtitle}
|
|
35
|
+
title={BRANDING.auth.signupTitle}
|
|
36
|
+
>
|
|
37
|
+
<div className="space-y-4">
|
|
38
|
+
<Button className="w-full" type="button" variant="outline">
|
|
39
|
+
<span className="mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full border text-xs">
|
|
40
|
+
G
|
|
41
|
+
</span>
|
|
42
|
+
{BRANDING.auth.continueWithGoogleLabel}
|
|
43
|
+
</Button>
|
|
44
|
+
|
|
45
|
+
<div className="text-center text-sm text-muted-foreground">or Sign up with Email</div>
|
|
46
|
+
|
|
47
|
+
<form className="space-y-4" onSubmit={handleSubmit}>
|
|
48
|
+
<div className="space-y-2">
|
|
49
|
+
<Label htmlFor="store-name">Name Store</Label>
|
|
50
|
+
<Input
|
|
51
|
+
id="store-name"
|
|
52
|
+
value={storeName}
|
|
53
|
+
onChange={(event) => setStoreName(event.target.value)}
|
|
54
|
+
/>
|
|
55
|
+
</div>
|
|
56
|
+
<div className="space-y-2">
|
|
57
|
+
<Label htmlFor="email">Email</Label>
|
|
58
|
+
<Input
|
|
59
|
+
id="email"
|
|
60
|
+
type="email"
|
|
61
|
+
value={email}
|
|
62
|
+
onChange={(event) => setEmail(event.target.value)}
|
|
63
|
+
/>
|
|
64
|
+
</div>
|
|
65
|
+
<div className="space-y-2">
|
|
66
|
+
<Label htmlFor="password">Password</Label>
|
|
67
|
+
<Input
|
|
68
|
+
id="password"
|
|
69
|
+
type="password"
|
|
70
|
+
value={password}
|
|
71
|
+
onChange={(event) => setPassword(event.target.value)}
|
|
72
|
+
/>
|
|
73
|
+
</div>
|
|
74
|
+
<Button className={THEME.classes.authSubmit} type="submit" variant="brand">
|
|
75
|
+
Register Now
|
|
76
|
+
</Button>
|
|
77
|
+
</form>
|
|
78
|
+
</div>
|
|
79
|
+
</AuthLayout>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
|
2
|
+
|
|
3
|
+
export function UsersPage() {
|
|
4
|
+
return (
|
|
5
|
+
<Card>
|
|
6
|
+
<CardHeader><CardTitle>Users</CardTitle></CardHeader>
|
|
7
|
+
<CardContent>
|
|
8
|
+
<p className="text-sm text-muted-foreground">User management mockup table can be expanded from here.</p>
|
|
9
|
+
</CardContent>
|
|
10
|
+
</Card>
|
|
11
|
+
);
|
|
12
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# blank template (overlay)
|
|
2
|
+
|
|
3
|
+
Applied **on top of** `boilerplate/react-base` for a minimal starter.
|
|
4
|
+
|
|
5
|
+
## Adds
|
|
6
|
+
|
|
7
|
+
- `src/App.tsx` — single home page
|
|
8
|
+
- `src/main.tsx` — entry with tooltip provider
|
|
9
|
+
- `src/pages/home.tsx`
|
|
10
|
+
|
|
11
|
+
All UI components and theme still come from the shared boilerplate.
|
|
12
|
+
|
|
13
|
+
## IDE (TypeScript)
|
|
14
|
+
|
|
15
|
+
From `ui-platform`, run `npm install` once (installs the boilerplate workspace so React types resolve). `tsconfig.json` here is IDE-only and is not copied by the CLI.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import ReactDOM from "react-dom/client";
|
|
3
|
+
import App from "./App";
|
|
4
|
+
import { Toaster } from "@/components/ui/sonner";
|
|
5
|
+
import { TooltipProvider } from "@/components/ui/tooltip";
|
|
6
|
+
import "./styles/globals.css";
|
|
7
|
+
|
|
8
|
+
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
|
|
9
|
+
<React.StrictMode>
|
|
10
|
+
<TooltipProvider delayDuration={200}>
|
|
11
|
+
<App />
|
|
12
|
+
<Toaster richColors closeButton position="top-right" />
|
|
13
|
+
</TooltipProvider>
|
|
14
|
+
</React.StrictMode>,
|
|
15
|
+
);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { APP_TITLE, COMPANY_NAME } from "@/config/constants";
|
|
2
|
+
import { Button } from "@/components/ui/button";
|
|
3
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
|
|
4
|
+
|
|
5
|
+
export function HomePage() {
|
|
6
|
+
return (
|
|
7
|
+
<main className="flex min-h-screen items-center justify-center bg-slate-50 p-6">
|
|
8
|
+
<Card className="w-full max-w-xl">
|
|
9
|
+
<CardHeader>
|
|
10
|
+
<CardTitle>{APP_TITLE}</CardTitle>
|
|
11
|
+
<CardDescription>Minimal Vite + React + TypeScript + Tailwind + shadcn/ui starter.</CardDescription>
|
|
12
|
+
</CardHeader>
|
|
13
|
+
<CardContent className="space-y-4">
|
|
14
|
+
<p className="text-sm text-muted-foreground">Built for {COMPANY_NAME}.</p>
|
|
15
|
+
<Button>Get Started</Button>
|
|
16
|
+
</CardContent>
|
|
17
|
+
</Card>
|
|
18
|
+
</main>
|
|
19
|
+
);
|
|
20
|
+
}
|