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.
Files changed (128) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +117 -0
  3. package/boilerplate/README.md +18 -0
  4. package/boilerplate/react-base/.env.example +1 -0
  5. package/boilerplate/react-base/README.md +3 -0
  6. package/boilerplate/react-base/components.json +19 -0
  7. package/boilerplate/react-base/eslint.config.js +32 -0
  8. package/boilerplate/react-base/index.html +12 -0
  9. package/boilerplate/react-base/package.json +71 -0
  10. package/boilerplate/react-base/postcss.config.js +6 -0
  11. package/boilerplate/react-base/prettier.config.js +6 -0
  12. package/boilerplate/react-base/src/api/axios.ts +20 -0
  13. package/boilerplate/react-base/src/app/store.ts +13 -0
  14. package/boilerplate/react-base/src/components/data-table.tsx +919 -0
  15. package/boilerplate/react-base/src/components/ui/accordion.tsx +44 -0
  16. package/boilerplate/react-base/src/components/ui/alert-dialog.tsx +105 -0
  17. package/boilerplate/react-base/src/components/ui/alert.tsx +40 -0
  18. package/boilerplate/react-base/src/components/ui/avatar.tsx +30 -0
  19. package/boilerplate/react-base/src/components/ui/badge.tsx +27 -0
  20. package/boilerplate/react-base/src/components/ui/bar-chart.tsx +76 -0
  21. package/boilerplate/react-base/src/components/ui/breadcrumb.tsx +87 -0
  22. package/boilerplate/react-base/src/components/ui/button.tsx +34 -0
  23. package/boilerplate/react-base/src/components/ui/calendar.tsx +63 -0
  24. package/boilerplate/react-base/src/components/ui/card.tsx +36 -0
  25. package/boilerplate/react-base/src/components/ui/chart.tsx +280 -0
  26. package/boilerplate/react-base/src/components/ui/checkbox.tsx +51 -0
  27. package/boilerplate/react-base/src/components/ui/context-menu.tsx +173 -0
  28. package/boilerplate/react-base/src/components/ui/date-picker.tsx +42 -0
  29. package/boilerplate/react-base/src/components/ui/dialog.tsx +87 -0
  30. package/boilerplate/react-base/src/components/ui/drawer.tsx +81 -0
  31. package/boilerplate/react-base/src/components/ui/dropdown-menu.tsx +81 -0
  32. package/boilerplate/react-base/src/components/ui/dropdown-types.ts +28 -0
  33. package/boilerplate/react-base/src/components/ui/field.tsx +194 -0
  34. package/boilerplate/react-base/src/components/ui/hover-card.tsx +26 -0
  35. package/boilerplate/react-base/src/components/ui/input-group.tsx +98 -0
  36. package/boilerplate/react-base/src/components/ui/input-otp.tsx +63 -0
  37. package/boilerplate/react-base/src/components/ui/input.tsx +12 -0
  38. package/boilerplate/react-base/src/components/ui/item.tsx +152 -0
  39. package/boilerplate/react-base/src/components/ui/kbd.tsx +13 -0
  40. package/boilerplate/react-base/src/components/ui/label.tsx +14 -0
  41. package/boilerplate/react-base/src/components/ui/line-chart.tsx +65 -0
  42. package/boilerplate/react-base/src/components/ui/menubar.tsx +217 -0
  43. package/boilerplate/react-base/src/components/ui/multi-select-dropdown.tsx +200 -0
  44. package/boilerplate/react-base/src/components/ui/navigation-menu.tsx +120 -0
  45. package/boilerplate/react-base/src/components/ui/pie-chart.tsx +87 -0
  46. package/boilerplate/react-base/src/components/ui/popover.tsx +29 -0
  47. package/boilerplate/react-base/src/components/ui/progress.tsx +19 -0
  48. package/boilerplate/react-base/src/components/ui/radio-group.tsx +36 -0
  49. package/boilerplate/react-base/src/components/ui/scroll-area.tsx +38 -0
  50. package/boilerplate/react-base/src/components/ui/searchable-dropdown.tsx +118 -0
  51. package/boilerplate/react-base/src/components/ui/select.tsx +140 -0
  52. package/boilerplate/react-base/src/components/ui/separator.tsx +20 -0
  53. package/boilerplate/react-base/src/components/ui/sheet.tsx +70 -0
  54. package/boilerplate/react-base/src/components/ui/sidebar.tsx +470 -0
  55. package/boilerplate/react-base/src/components/ui/skeleton.tsx +11 -0
  56. package/boilerplate/react-base/src/components/ui/slider.tsx +23 -0
  57. package/boilerplate/react-base/src/components/ui/sonner.tsx +21 -0
  58. package/boilerplate/react-base/src/components/ui/sparkline.tsx +38 -0
  59. package/boilerplate/react-base/src/components/ui/spinner.tsx +10 -0
  60. package/boilerplate/react-base/src/components/ui/switch.tsx +16 -0
  61. package/boilerplate/react-base/src/components/ui/table.tsx +80 -0
  62. package/boilerplate/react-base/src/components/ui/tabs.tsx +32 -0
  63. package/boilerplate/react-base/src/components/ui/textarea.tsx +12 -0
  64. package/boilerplate/react-base/src/components/ui/toggle-group.tsx +49 -0
  65. package/boilerplate/react-base/src/components/ui/toggle.tsx +33 -0
  66. package/boilerplate/react-base/src/components/ui/tooltip.tsx +23 -0
  67. package/boilerplate/react-base/src/components/ui/typography.tsx +76 -0
  68. package/boilerplate/react-base/src/config/constants.ts +3 -0
  69. package/boilerplate/react-base/src/config/theme.ts +432 -0
  70. package/boilerplate/react-base/src/config/user.ts +52 -0
  71. package/boilerplate/react-base/src/context/theme-provider.tsx +12 -0
  72. package/boilerplate/react-base/src/features/auth/authSlice.ts +19 -0
  73. package/boilerplate/react-base/src/hooks/index.ts +1 -0
  74. package/boilerplate/react-base/src/hooks/use-mobile.ts +17 -0
  75. package/boilerplate/react-base/src/lib/utils.ts +6 -0
  76. package/boilerplate/react-base/src/routes/index.tsx +7 -0
  77. package/boilerplate/react-base/src/styles/globals.css +15 -0
  78. package/boilerplate/react-base/src/vite-env.d.ts +31 -0
  79. package/boilerplate/react-base/tailwind.config.ts +75 -0
  80. package/boilerplate/react-base/tsconfig.app.json +20 -0
  81. package/boilerplate/react-base/tsconfig.json +7 -0
  82. package/boilerplate/react-base/tsconfig.node.json +16 -0
  83. package/boilerplate/react-base/vite.config.ts +12 -0
  84. package/dist/bin/index.js +8 -0
  85. package/dist/src/cli-args.js +52 -0
  86. package/dist/src/generator.js +85 -0
  87. package/dist/src/installer.js +7 -0
  88. package/dist/src/paths.js +61 -0
  89. package/dist/src/prompts.js +79 -0
  90. package/dist/src/replace-placeholders.js +22 -0
  91. package/dist/src/utils.js +16 -0
  92. package/package.json +63 -0
  93. package/templates/admin-portal/README.md +26 -0
  94. package/templates/admin-portal/src/App.tsx +85 -0
  95. package/templates/admin-portal/src/assets/auth-hero.jpg +0 -0
  96. package/templates/admin-portal/src/assets/brand-logo.png +0 -0
  97. package/templates/admin-portal/src/components/app-breadcrumb.tsx +41 -0
  98. package/templates/admin-portal/src/components/app-header.tsx +20 -0
  99. package/templates/admin-portal/src/components/app-sidebar.tsx +78 -0
  100. package/templates/admin-portal/src/components/auth-layout.tsx +66 -0
  101. package/templates/admin-portal/src/components/dashboard-metric-card.tsx +105 -0
  102. package/templates/admin-portal/src/components/data-table.tsx +919 -0
  103. package/templates/admin-portal/src/components/layout-shell.tsx +23 -0
  104. package/templates/admin-portal/src/components/notifications-sheet.tsx +91 -0
  105. package/templates/admin-portal/src/components/sidebar-nav.tsx +164 -0
  106. package/templates/admin-portal/src/components/user-avatar.tsx +26 -0
  107. package/templates/admin-portal/src/components/user-menu.tsx +163 -0
  108. package/templates/admin-portal/src/config/branding.ts +17 -0
  109. package/templates/admin-portal/src/config/chart-data.ts +44 -0
  110. package/templates/admin-portal/src/config/navigation.ts +42 -0
  111. package/templates/admin-portal/src/context/auth-context.tsx +32 -0
  112. package/templates/admin-portal/src/lib/breadcrumbs.ts +58 -0
  113. package/templates/admin-portal/src/main.tsx +18 -0
  114. package/templates/admin-portal/src/pages/components/demo-columns.tsx +170 -0
  115. package/templates/admin-portal/src/pages/components.tsx +1368 -0
  116. package/templates/admin-portal/src/pages/dashboard.tsx +143 -0
  117. package/templates/admin-portal/src/pages/login.tsx +81 -0
  118. package/templates/admin-portal/src/pages/settings/notifications.tsx +31 -0
  119. package/templates/admin-portal/src/pages/settings/profile.tsx +26 -0
  120. package/templates/admin-portal/src/pages/signup.tsx +81 -0
  121. package/templates/admin-portal/src/pages/users.tsx +12 -0
  122. package/templates/admin-portal/tsconfig.json +10 -0
  123. package/templates/blank/README.md +15 -0
  124. package/templates/blank/src/App.tsx +5 -0
  125. package/templates/blank/src/main.tsx +15 -0
  126. package/templates/blank/src/pages/home.tsx +20 -0
  127. package/templates/blank/tsconfig.json +10 -0
  128. 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,10 @@
1
+ {
2
+ "extends": "../tsconfig.overlay.base.json",
3
+ "compilerOptions": {
4
+ "baseUrl": ".",
5
+ "paths": {
6
+ "@/*": ["./src/*", "../../boilerplate/react-base/src/*"]
7
+ }
8
+ },
9
+ "include": ["src", "../../boilerplate/react-base/src/vite-env.d.ts"]
10
+ }
@@ -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,5 @@
1
+ import { HomePage } from "@/pages/home";
2
+
3
+ export default function App() {
4
+ return <HomePage />;
5
+ }
@@ -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
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../tsconfig.overlay.base.json",
3
+ "compilerOptions": {
4
+ "baseUrl": ".",
5
+ "paths": {
6
+ "@/*": ["./src/*", "../../boilerplate/react-base/src/*"]
7
+ }
8
+ },
9
+ "include": ["src", "../../boilerplate/react-base/src/vite-env.d.ts"]
10
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "../boilerplate/react-base/tsconfig.app.json",
3
+ "compilerOptions": {
4
+ "jsx": "react-jsx",
5
+ "moduleResolution": "bundler"
6
+ }
7
+ }