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,170 @@
1
+ import { type ColumnDef } from "@tanstack/react-table";
2
+ import { Pencil, Trash2 } from "lucide-react";
3
+ import { useCallback, useState } from "react";
4
+ import { toast } from "sonner";
5
+ import { Badge } from "@/components/ui/badge";
6
+ import { Button } from "@/components/ui/button";
7
+ import {
8
+ DataTable,
9
+ DataTableColumnHeader,
10
+ dataTableActionsColumn,
11
+ type DataTableFilterableColumn,
12
+ } from "@/components/data-table";
13
+
14
+ export type DemoUser = {
15
+ id: string;
16
+ name: string;
17
+ email: string;
18
+ role: string;
19
+ status: "active" | "invited" | "disabled";
20
+ };
21
+
22
+ const initialDemoUsers: DemoUser[] = [
23
+ { id: "1", name: "Ava Johnson", email: "ava@company.com", role: "Admin", status: "active" },
24
+ { id: "2", name: "Noah Patel", email: "noah@company.com", role: "Editor", status: "active" },
25
+ { id: "3", name: "Mia Chen", email: "mia@company.com", role: "Viewer", status: "invited" },
26
+ { id: "4", name: "Liam Brooks", email: "liam@company.com", role: "Editor", status: "disabled" },
27
+ { id: "5", name: "Sofia Rossi", email: "sofia@company.com", role: "Admin", status: "active" },
28
+ { id: "6", name: "Ethan Wright", email: "ethan@company.com", role: "Viewer", status: "invited" },
29
+ { id: "7", name: "Isla Martin", email: "isla@company.com", role: "Editor", status: "active" },
30
+ { id: "8", name: "James Lee", email: "james@company.com", role: "Viewer", status: "disabled" },
31
+ { id: "9", name: "Olivia Brown", email: "olivia@company.com", role: "Admin", status: "active" },
32
+ { id: "10", name: "Lucas Kim", email: "lucas@company.com", role: "Editor", status: "invited" },
33
+ { id: "11", name: "Emma Davis", email: "emma@company.com", role: "Viewer", status: "active" },
34
+ { id: "12", name: "Henry Wilson", email: "henry@company.com", role: "Editor", status: "disabled" },
35
+ ];
36
+
37
+ export const demoUsers = initialDemoUsers;
38
+
39
+ const statusVariant: Record<DemoUser["status"], "default" | "secondary" | "outline"> = {
40
+ active: "default",
41
+ invited: "secondary",
42
+ disabled: "outline",
43
+ };
44
+
45
+ const multiSelectFilter = (row: { getValue: (id: string) => unknown }, id: string, value: unknown) => {
46
+ const filters = value as string[] | undefined;
47
+ if (!filters?.length) {
48
+ return true;
49
+ }
50
+ return filters.includes(String(row.getValue(id)));
51
+ };
52
+
53
+ export const demoUserColumns: ColumnDef<DemoUser>[] = [
54
+ {
55
+ accessorKey: "name",
56
+ meta: { title: "Name" },
57
+ enableHiding: true,
58
+ header: ({ column }) => <DataTableColumnHeader column={column} title="Name" />,
59
+ cell: ({ row }) => <span className="font-medium">{row.getValue("name")}</span>,
60
+ },
61
+ {
62
+ accessorKey: "email",
63
+ meta: { title: "Email" },
64
+ enableHiding: true,
65
+ header: ({ column }) => <DataTableColumnHeader column={column} title="Email" />,
66
+ },
67
+ {
68
+ accessorKey: "role",
69
+ meta: { title: "Role" },
70
+ enableHiding: true,
71
+ header: ({ column }) => <DataTableColumnHeader column={column} title="Role" />,
72
+ filterFn: multiSelectFilter,
73
+ },
74
+ {
75
+ accessorKey: "status",
76
+ meta: { title: "Status" },
77
+ enableHiding: true,
78
+ header: ({ column }) => <DataTableColumnHeader column={column} title="Status" />,
79
+ filterFn: multiSelectFilter,
80
+ cell: ({ row }) => {
81
+ const status = row.getValue("status") as DemoUser["status"];
82
+ return <Badge variant={statusVariant[status]}>{status}</Badge>;
83
+ },
84
+ },
85
+ dataTableActionsColumn<DemoUser>({
86
+ getActions: (user) => [
87
+ {
88
+ tooltip: "Update",
89
+ icon: <Pencil className="h-4 w-4" />,
90
+ onClick: () => toast.message(`Editing ${user.name}`),
91
+ },
92
+ {
93
+ tooltip: "Delete",
94
+ icon: <Trash2 className="h-4 w-4" />,
95
+ variant: "destructive",
96
+ onClick: () => toast.message(`Removed ${user.name}`),
97
+ },
98
+ ],
99
+ }),
100
+ ];
101
+
102
+ export const demoUserFilterableColumns: DataTableFilterableColumn[] = [
103
+ {
104
+ id: "status",
105
+ title: "Status",
106
+ options: [
107
+ { label: "Active", value: "active" },
108
+ { label: "Invited", value: "invited" },
109
+ { label: "Disabled", value: "disabled" },
110
+ ],
111
+ },
112
+ {
113
+ id: "role",
114
+ title: "Role",
115
+ options: [
116
+ { label: "Admin", value: "Admin" },
117
+ { label: "Editor", value: "Editor" },
118
+ { label: "Viewer", value: "Viewer" },
119
+ ],
120
+ },
121
+ ];
122
+
123
+ export function DemoUsersDataTable() {
124
+ const [users, setUsers] = useState<DemoUser[]>(initialDemoUsers);
125
+ const [selectedUsers, setSelectedUsers] = useState<DemoUser[]>([]);
126
+ const [isRefreshing, setIsRefreshing] = useState(false);
127
+
128
+ const handleRefresh = useCallback(async () => {
129
+ setIsRefreshing(true);
130
+ await new Promise((resolve) => setTimeout(resolve, 700));
131
+ setUsers([...initialDemoUsers]);
132
+ setIsRefreshing(false);
133
+ toast.success("User list refreshed");
134
+ }, []);
135
+
136
+ const handleExport = useCallback(() => {
137
+ toast.success(`Exported ${users.length} user(s)`);
138
+ }, [users.length]);
139
+
140
+ return (
141
+ <DataTable
142
+ columns={demoUserColumns}
143
+ data={users}
144
+ pageSize={10}
145
+ pageSizeOptions={[5, 10, 20, 30]}
146
+ searchPlaceholder="Search name, email, or role..."
147
+ filterableColumns={demoUserFilterableColumns}
148
+ enableRowSelection
149
+ onSelectionChange={setSelectedUsers}
150
+ onRefresh={handleRefresh}
151
+ isRefreshing={isRefreshing}
152
+ onExport={handleExport}
153
+ searchAction={{
154
+ label: "Add user",
155
+ onClick: () => toast.message("Add user"),
156
+ }}
157
+ bulkActions={
158
+ <Button
159
+ variant="outline"
160
+ size="sm"
161
+ className="h-8"
162
+ onClick={() => toast.message(`Deleted ${selectedUsers.length} user(s)`)}
163
+ >
164
+ <Trash2 className="mr-2 h-4 w-4" />
165
+ Delete
166
+ </Button>
167
+ }
168
+ />
169
+ );
170
+ }