@shivasankaran18/stackd 1.1.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/.github/workflows/ci.yml +30 -0
- package/LICENSE +21 -0
- package/README.md +115 -0
- package/apps/cli/package.json +32 -0
- package/apps/cli/src/cli.ts +271 -0
- package/apps/cli/src/commands/create.ts +162 -0
- package/apps/cli/src/scripts/Auth/jwt.ts +83 -0
- package/apps/cli/src/scripts/Auth/nextAuth.ts +146 -0
- package/apps/cli/src/scripts/Auth/passport.ts +234 -0
- package/apps/cli/src/scripts/backend/django.ts +30 -0
- package/apps/cli/src/scripts/backend/expressjs.ts +72 -0
- package/apps/cli/src/scripts/backend/expressts.ts +95 -0
- package/apps/cli/src/scripts/frontend/angularjs.ts +0 -0
- package/apps/cli/src/scripts/frontend/angularts.ts +29 -0
- package/apps/cli/src/scripts/frontend/nextjs.ts +72 -0
- package/apps/cli/src/scripts/frontend/reactjs.ts +36 -0
- package/apps/cli/src/scripts/frontend/reactts.ts +34 -0
- package/apps/cli/src/scripts/frontend/vuejs.ts +43 -0
- package/apps/cli/src/scripts/frontend/vuets.ts +53 -0
- package/apps/cli/src/scripts/orms/drizzleSetup.ts +102 -0
- package/apps/cli/src/scripts/orms/mongoSetup.ts +68 -0
- package/apps/cli/src/scripts/orms/prismaSetup.ts +14 -0
- package/apps/cli/src/scripts/ui/shadcn.ts +228 -0
- package/apps/cli/src/scripts/ui/tailwindcss.ts +126 -0
- package/apps/cli/tsconfig.json +111 -0
- package/apps/web/app/api/auth/[...nextauth]/route.ts +7 -0
- package/apps/web/app/api/scaffold/route.ts +274 -0
- package/apps/web/app/favicon.ico +0 -0
- package/apps/web/app/fonts/GeistMonoVF.woff +0 -0
- package/apps/web/app/fonts/GeistVF.woff +0 -0
- package/apps/web/app/globals.css +158 -0
- package/apps/web/app/home/page.tsx +22 -0
- package/apps/web/app/layout.tsx +35 -0
- package/apps/web/app/page.module.css +188 -0
- package/apps/web/app/page.tsx +1 -0
- package/apps/web/app/providers.tsx +9 -0
- package/apps/web/app/scaffold/page.tsx +472 -0
- package/apps/web/components/Sidebar.tsx +108 -0
- package/apps/web/components/theme-provider.tsx +9 -0
- package/apps/web/components/ui/button.tsx +57 -0
- package/apps/web/components/ui/card.tsx +76 -0
- package/apps/web/components/ui/dropdown-menu.tsx +200 -0
- package/apps/web/components/ui/input.tsx +22 -0
- package/apps/web/components/ui/label.tsx +26 -0
- package/apps/web/components/ui/scroll-area.tsx +48 -0
- package/apps/web/components/ui/sonner.tsx +31 -0
- package/apps/web/components/ui/steps.tsx +36 -0
- package/apps/web/components/ui/switch.tsx +29 -0
- package/apps/web/components.json +21 -0
- package/apps/web/eslint.config.js +4 -0
- package/apps/web/lib/auth.ts +35 -0
- package/apps/web/lib/redis.ts +13 -0
- package/apps/web/lib/utils.ts +8 -0
- package/apps/web/next-env.d.ts +5 -0
- package/apps/web/next.config.js +4 -0
- package/apps/web/package.json +52 -0
- package/apps/web/postcss.config.js +6 -0
- package/apps/web/public/file-text.svg +3 -0
- package/apps/web/public/globe.svg +10 -0
- package/apps/web/public/next.svg +1 -0
- package/apps/web/public/turborepo-dark.svg +19 -0
- package/apps/web/public/turborepo-light.svg +19 -0
- package/apps/web/public/vercel.svg +10 -0
- package/apps/web/public/window.svg +3 -0
- package/apps/web/tailwind.config.js +65 -0
- package/apps/web/tsconfig.json +23 -0
- package/apps/web/types/global.d.ts +4 -0
- package/docker-compose.yml +14 -0
- package/package.json +55 -0
- package/packages/eslint-config/README.md +3 -0
- package/packages/eslint-config/base.js +32 -0
- package/packages/eslint-config/next.js +49 -0
- package/packages/eslint-config/package.json +24 -0
- package/packages/eslint-config/react-internal.js +39 -0
- package/packages/scripts/Auth/jwt.ts +83 -0
- package/packages/scripts/Auth/nextAuth.ts +146 -0
- package/packages/scripts/Auth/passport.ts +234 -0
- package/packages/scripts/backend/django.ts +30 -0
- package/packages/scripts/backend/expressjs.ts +72 -0
- package/packages/scripts/backend/expressts.ts +95 -0
- package/packages/scripts/frontend/angularjs.ts +0 -0
- package/packages/scripts/frontend/angularts.ts +29 -0
- package/packages/scripts/frontend/nextjs.ts +72 -0
- package/packages/scripts/frontend/reactjs.ts +36 -0
- package/packages/scripts/frontend/reactts.ts +34 -0
- package/packages/scripts/frontend/vuejs.ts +43 -0
- package/packages/scripts/frontend/vuets.ts +53 -0
- package/packages/scripts/orms/drizzleSetup.ts +102 -0
- package/packages/scripts/orms/mongoSetup.ts +68 -0
- package/packages/scripts/orms/prismaSetup.ts +14 -0
- package/packages/scripts/ui/shadcn.ts +228 -0
- package/packages/scripts/ui/tailwindcss.ts +126 -0
- package/packages/typescript-config/base.json +19 -0
- package/packages/typescript-config/nextjs.json +12 -0
- package/packages/typescript-config/package.json +9 -0
- package/packages/typescript-config/react-library.json +7 -0
- package/packages/ui/eslint.config.mjs +4 -0
- package/packages/ui/package.json +27 -0
- package/packages/ui/src/button.tsx +20 -0
- package/packages/ui/src/card.tsx +27 -0
- package/packages/ui/src/code.tsx +11 -0
- package/packages/ui/tsconfig.json +8 -0
- package/packages/ui/turbo/generators/config.ts +30 -0
- package/packages/ui/turbo/generators/templates/component.hbs +8 -0
- package/stackd.ts +134 -0
- package/start-web.sh +5 -0
- package/tsconfig.json +111 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/turbo.json +21 -0
@@ -0,0 +1,76 @@
|
|
1
|
+
import * as React from "react"
|
2
|
+
|
3
|
+
import { cn } from "@/lib/utils"
|
4
|
+
|
5
|
+
const Card = React.forwardRef<
|
6
|
+
HTMLDivElement,
|
7
|
+
React.HTMLAttributes<HTMLDivElement>
|
8
|
+
>(({ className, ...props }, ref) => (
|
9
|
+
<div
|
10
|
+
ref={ref}
|
11
|
+
className={cn(
|
12
|
+
"rounded-xl border bg-card text-card-foreground shadow",
|
13
|
+
className
|
14
|
+
)}
|
15
|
+
{...props}
|
16
|
+
/>
|
17
|
+
))
|
18
|
+
Card.displayName = "Card"
|
19
|
+
|
20
|
+
const CardHeader = React.forwardRef<
|
21
|
+
HTMLDivElement,
|
22
|
+
React.HTMLAttributes<HTMLDivElement>
|
23
|
+
>(({ className, ...props }, ref) => (
|
24
|
+
<div
|
25
|
+
ref={ref}
|
26
|
+
className={cn("flex flex-col space-y-1.5 p-6", className)}
|
27
|
+
{...props}
|
28
|
+
/>
|
29
|
+
))
|
30
|
+
CardHeader.displayName = "CardHeader"
|
31
|
+
|
32
|
+
const CardTitle = React.forwardRef<
|
33
|
+
HTMLDivElement,
|
34
|
+
React.HTMLAttributes<HTMLDivElement>
|
35
|
+
>(({ className, ...props }, ref) => (
|
36
|
+
<div
|
37
|
+
ref={ref}
|
38
|
+
className={cn("font-semibold leading-none tracking-tight", className)}
|
39
|
+
{...props}
|
40
|
+
/>
|
41
|
+
))
|
42
|
+
CardTitle.displayName = "CardTitle"
|
43
|
+
|
44
|
+
const CardDescription = React.forwardRef<
|
45
|
+
HTMLDivElement,
|
46
|
+
React.HTMLAttributes<HTMLDivElement>
|
47
|
+
>(({ className, ...props }, ref) => (
|
48
|
+
<div
|
49
|
+
ref={ref}
|
50
|
+
className={cn("text-sm text-muted-foreground", className)}
|
51
|
+
{...props}
|
52
|
+
/>
|
53
|
+
))
|
54
|
+
CardDescription.displayName = "CardDescription"
|
55
|
+
|
56
|
+
const CardContent = React.forwardRef<
|
57
|
+
HTMLDivElement,
|
58
|
+
React.HTMLAttributes<HTMLDivElement>
|
59
|
+
>(({ className, ...props }, ref) => (
|
60
|
+
<div ref={ref} className={cn("p-6 pt-0", className)} {...props} />
|
61
|
+
))
|
62
|
+
CardContent.displayName = "CardContent"
|
63
|
+
|
64
|
+
const CardFooter = React.forwardRef<
|
65
|
+
HTMLDivElement,
|
66
|
+
React.HTMLAttributes<HTMLDivElement>
|
67
|
+
>(({ className, ...props }, ref) => (
|
68
|
+
<div
|
69
|
+
ref={ref}
|
70
|
+
className={cn("flex items-center p-6 pt-0", className)}
|
71
|
+
{...props}
|
72
|
+
/>
|
73
|
+
))
|
74
|
+
CardFooter.displayName = "CardFooter"
|
75
|
+
|
76
|
+
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
|
@@ -0,0 +1,200 @@
|
|
1
|
+
"use client"
|
2
|
+
|
3
|
+
import * as React from "react"
|
4
|
+
import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"
|
5
|
+
import { Check, ChevronRight, Circle } from "lucide-react"
|
6
|
+
|
7
|
+
import { cn } from "@/lib/utils"
|
8
|
+
|
9
|
+
const DropdownMenu = DropdownMenuPrimitive.Root
|
10
|
+
|
11
|
+
const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger
|
12
|
+
|
13
|
+
const DropdownMenuGroup = DropdownMenuPrimitive.Group
|
14
|
+
|
15
|
+
const DropdownMenuPortal = DropdownMenuPrimitive.Portal
|
16
|
+
|
17
|
+
const DropdownMenuSub = DropdownMenuPrimitive.Sub
|
18
|
+
|
19
|
+
const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup
|
20
|
+
|
21
|
+
const DropdownMenuSubTrigger = React.forwardRef<
|
22
|
+
React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,
|
23
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {
|
24
|
+
inset?: boolean
|
25
|
+
}
|
26
|
+
>(({ className, inset, children, ...props }, ref) => (
|
27
|
+
<DropdownMenuPrimitive.SubTrigger
|
28
|
+
ref={ref}
|
29
|
+
className={cn(
|
30
|
+
"flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
31
|
+
inset && "pl-8",
|
32
|
+
className
|
33
|
+
)}
|
34
|
+
{...props}
|
35
|
+
>
|
36
|
+
{children}
|
37
|
+
<ChevronRight className="ml-auto" />
|
38
|
+
</DropdownMenuPrimitive.SubTrigger>
|
39
|
+
))
|
40
|
+
DropdownMenuSubTrigger.displayName =
|
41
|
+
DropdownMenuPrimitive.SubTrigger.displayName
|
42
|
+
|
43
|
+
const DropdownMenuSubContent = React.forwardRef<
|
44
|
+
React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,
|
45
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>
|
46
|
+
>(({ className, ...props }, ref) => (
|
47
|
+
<DropdownMenuPrimitive.SubContent
|
48
|
+
ref={ref}
|
49
|
+
className={cn(
|
50
|
+
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
51
|
+
className
|
52
|
+
)}
|
53
|
+
{...props}
|
54
|
+
/>
|
55
|
+
))
|
56
|
+
DropdownMenuSubContent.displayName =
|
57
|
+
DropdownMenuPrimitive.SubContent.displayName
|
58
|
+
|
59
|
+
const DropdownMenuContent = React.forwardRef<
|
60
|
+
React.ElementRef<typeof DropdownMenuPrimitive.Content>,
|
61
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>
|
62
|
+
>(({ className, sideOffset = 4, ...props }, ref) => (
|
63
|
+
<DropdownMenuPrimitive.Portal>
|
64
|
+
<DropdownMenuPrimitive.Content
|
65
|
+
ref={ref}
|
66
|
+
sideOffset={sideOffset}
|
67
|
+
className={cn(
|
68
|
+
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
69
|
+
className
|
70
|
+
)}
|
71
|
+
{...props}
|
72
|
+
/>
|
73
|
+
</DropdownMenuPrimitive.Portal>
|
74
|
+
))
|
75
|
+
DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName
|
76
|
+
|
77
|
+
const DropdownMenuItem = React.forwardRef<
|
78
|
+
React.ElementRef<typeof DropdownMenuPrimitive.Item>,
|
79
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {
|
80
|
+
inset?: boolean
|
81
|
+
}
|
82
|
+
>(({ className, inset, ...props }, ref) => (
|
83
|
+
<DropdownMenuPrimitive.Item
|
84
|
+
ref={ref}
|
85
|
+
className={cn(
|
86
|
+
"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
87
|
+
inset && "pl-8",
|
88
|
+
className
|
89
|
+
)}
|
90
|
+
{...props}
|
91
|
+
/>
|
92
|
+
))
|
93
|
+
DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName
|
94
|
+
|
95
|
+
const DropdownMenuCheckboxItem = React.forwardRef<
|
96
|
+
React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,
|
97
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>
|
98
|
+
>(({ className, children, checked, ...props }, ref) => (
|
99
|
+
<DropdownMenuPrimitive.CheckboxItem
|
100
|
+
ref={ref}
|
101
|
+
className={cn(
|
102
|
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
103
|
+
className
|
104
|
+
)}
|
105
|
+
checked={checked}
|
106
|
+
{...props}
|
107
|
+
>
|
108
|
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
109
|
+
<DropdownMenuPrimitive.ItemIndicator>
|
110
|
+
<Check className="h-4 w-4" />
|
111
|
+
</DropdownMenuPrimitive.ItemIndicator>
|
112
|
+
</span>
|
113
|
+
{children}
|
114
|
+
</DropdownMenuPrimitive.CheckboxItem>
|
115
|
+
))
|
116
|
+
DropdownMenuCheckboxItem.displayName =
|
117
|
+
DropdownMenuPrimitive.CheckboxItem.displayName
|
118
|
+
|
119
|
+
const DropdownMenuRadioItem = React.forwardRef<
|
120
|
+
React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,
|
121
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>
|
122
|
+
>(({ className, children, ...props }, ref) => (
|
123
|
+
<DropdownMenuPrimitive.RadioItem
|
124
|
+
ref={ref}
|
125
|
+
className={cn(
|
126
|
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
127
|
+
className
|
128
|
+
)}
|
129
|
+
{...props}
|
130
|
+
>
|
131
|
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
132
|
+
<DropdownMenuPrimitive.ItemIndicator>
|
133
|
+
<Circle className="h-2 w-2 fill-current" />
|
134
|
+
</DropdownMenuPrimitive.ItemIndicator>
|
135
|
+
</span>
|
136
|
+
{children}
|
137
|
+
</DropdownMenuPrimitive.RadioItem>
|
138
|
+
))
|
139
|
+
DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName
|
140
|
+
|
141
|
+
const DropdownMenuLabel = React.forwardRef<
|
142
|
+
React.ElementRef<typeof DropdownMenuPrimitive.Label>,
|
143
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {
|
144
|
+
inset?: boolean
|
145
|
+
}
|
146
|
+
>(({ className, inset, ...props }, ref) => (
|
147
|
+
<DropdownMenuPrimitive.Label
|
148
|
+
ref={ref}
|
149
|
+
className={cn(
|
150
|
+
"px-2 py-1.5 text-sm font-semibold",
|
151
|
+
inset && "pl-8",
|
152
|
+
className
|
153
|
+
)}
|
154
|
+
{...props}
|
155
|
+
/>
|
156
|
+
))
|
157
|
+
DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName
|
158
|
+
|
159
|
+
const DropdownMenuSeparator = React.forwardRef<
|
160
|
+
React.ElementRef<typeof DropdownMenuPrimitive.Separator>,
|
161
|
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>
|
162
|
+
>(({ className, ...props }, ref) => (
|
163
|
+
<DropdownMenuPrimitive.Separator
|
164
|
+
ref={ref}
|
165
|
+
className={cn("-mx-1 my-1 h-px bg-muted", className)}
|
166
|
+
{...props}
|
167
|
+
/>
|
168
|
+
))
|
169
|
+
DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName
|
170
|
+
|
171
|
+
const DropdownMenuShortcut = ({
|
172
|
+
className,
|
173
|
+
...props
|
174
|
+
}: React.HTMLAttributes<HTMLSpanElement>) => {
|
175
|
+
return (
|
176
|
+
<span
|
177
|
+
className={cn("ml-auto text-xs tracking-widest opacity-60", className)}
|
178
|
+
{...props}
|
179
|
+
/>
|
180
|
+
)
|
181
|
+
}
|
182
|
+
DropdownMenuShortcut.displayName = "DropdownMenuShortcut"
|
183
|
+
|
184
|
+
export {
|
185
|
+
DropdownMenu,
|
186
|
+
DropdownMenuTrigger,
|
187
|
+
DropdownMenuContent,
|
188
|
+
DropdownMenuItem,
|
189
|
+
DropdownMenuCheckboxItem,
|
190
|
+
DropdownMenuRadioItem,
|
191
|
+
DropdownMenuLabel,
|
192
|
+
DropdownMenuSeparator,
|
193
|
+
DropdownMenuShortcut,
|
194
|
+
DropdownMenuGroup,
|
195
|
+
DropdownMenuPortal,
|
196
|
+
DropdownMenuSub,
|
197
|
+
DropdownMenuSubContent,
|
198
|
+
DropdownMenuSubTrigger,
|
199
|
+
DropdownMenuRadioGroup,
|
200
|
+
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import * as React from "react"
|
2
|
+
|
3
|
+
import { cn } from "@/lib/utils"
|
4
|
+
|
5
|
+
const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>(
|
6
|
+
({ className, type, ...props }, ref) => {
|
7
|
+
return (
|
8
|
+
<input
|
9
|
+
type={type}
|
10
|
+
className={cn(
|
11
|
+
"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
|
12
|
+
className
|
13
|
+
)}
|
14
|
+
ref={ref}
|
15
|
+
{...props}
|
16
|
+
/>
|
17
|
+
)
|
18
|
+
}
|
19
|
+
)
|
20
|
+
Input.displayName = "Input"
|
21
|
+
|
22
|
+
export { Input }
|
@@ -0,0 +1,26 @@
|
|
1
|
+
"use client"
|
2
|
+
|
3
|
+
import * as React from "react"
|
4
|
+
import * as LabelPrimitive from "@radix-ui/react-label"
|
5
|
+
import { cva, type VariantProps } from "class-variance-authority"
|
6
|
+
|
7
|
+
import { cn } from "@/lib/utils"
|
8
|
+
|
9
|
+
const labelVariants = cva(
|
10
|
+
"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
11
|
+
)
|
12
|
+
|
13
|
+
const Label = React.forwardRef<
|
14
|
+
React.ElementRef<typeof LabelPrimitive.Root>,
|
15
|
+
React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &
|
16
|
+
VariantProps<typeof labelVariants>
|
17
|
+
>(({ className, ...props }, ref) => (
|
18
|
+
<LabelPrimitive.Root
|
19
|
+
ref={ref}
|
20
|
+
className={cn(labelVariants(), className)}
|
21
|
+
{...props}
|
22
|
+
/>
|
23
|
+
))
|
24
|
+
Label.displayName = LabelPrimitive.Root.displayName
|
25
|
+
|
26
|
+
export { Label }
|
@@ -0,0 +1,48 @@
|
|
1
|
+
"use client"
|
2
|
+
|
3
|
+
import * as React from "react"
|
4
|
+
import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"
|
5
|
+
|
6
|
+
import { cn } from "@/lib/utils"
|
7
|
+
|
8
|
+
const ScrollArea = React.forwardRef<
|
9
|
+
React.ElementRef<typeof ScrollAreaPrimitive.Root>,
|
10
|
+
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>
|
11
|
+
>(({ className, children, ...props }, ref) => (
|
12
|
+
<ScrollAreaPrimitive.Root
|
13
|
+
ref={ref}
|
14
|
+
className={cn("relative overflow-hidden", className)}
|
15
|
+
{...props}
|
16
|
+
>
|
17
|
+
<ScrollAreaPrimitive.Viewport className="h-full w-full rounded-[inherit]">
|
18
|
+
{children}
|
19
|
+
</ScrollAreaPrimitive.Viewport>
|
20
|
+
<ScrollBar />
|
21
|
+
<ScrollAreaPrimitive.Corner />
|
22
|
+
</ScrollAreaPrimitive.Root>
|
23
|
+
))
|
24
|
+
ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName
|
25
|
+
|
26
|
+
const ScrollBar = React.forwardRef<
|
27
|
+
React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,
|
28
|
+
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>
|
29
|
+
>(({ className, orientation = "vertical", ...props }, ref) => (
|
30
|
+
<ScrollAreaPrimitive.ScrollAreaScrollbar
|
31
|
+
ref={ref}
|
32
|
+
orientation={orientation}
|
33
|
+
className={cn(
|
34
|
+
"flex touch-none select-none transition-colors",
|
35
|
+
orientation === "vertical" &&
|
36
|
+
"h-full w-2.5 border-l border-l-transparent p-[1px]",
|
37
|
+
orientation === "horizontal" &&
|
38
|
+
"h-2.5 flex-col border-t border-t-transparent p-[1px]",
|
39
|
+
className
|
40
|
+
)}
|
41
|
+
{...props}
|
42
|
+
>
|
43
|
+
<ScrollAreaPrimitive.ScrollAreaThumb className="relative flex-1 rounded-full bg-border" />
|
44
|
+
</ScrollAreaPrimitive.ScrollAreaScrollbar>
|
45
|
+
))
|
46
|
+
ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName
|
47
|
+
|
48
|
+
export { ScrollArea, ScrollBar }
|
@@ -0,0 +1,31 @@
|
|
1
|
+
"use client"
|
2
|
+
|
3
|
+
import { useTheme } from "next-themes"
|
4
|
+
import { Toaster as Sonner } from "sonner"
|
5
|
+
|
6
|
+
type ToasterProps = React.ComponentProps<typeof Sonner>
|
7
|
+
|
8
|
+
const Toaster = ({ ...props }: ToasterProps) => {
|
9
|
+
const { theme = "system" } = useTheme()
|
10
|
+
|
11
|
+
return (
|
12
|
+
<Sonner
|
13
|
+
theme={theme as ToasterProps["theme"]}
|
14
|
+
className="toaster group"
|
15
|
+
toastOptions={{
|
16
|
+
classNames: {
|
17
|
+
toast:
|
18
|
+
"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
|
19
|
+
description: "group-[.toast]:text-muted-foreground",
|
20
|
+
actionButton:
|
21
|
+
"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
|
22
|
+
cancelButton:
|
23
|
+
"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground",
|
24
|
+
},
|
25
|
+
}}
|
26
|
+
{...props}
|
27
|
+
/>
|
28
|
+
)
|
29
|
+
}
|
30
|
+
|
31
|
+
export { Toaster }
|
@@ -0,0 +1,36 @@
|
|
1
|
+
interface Step {
|
2
|
+
title: string;
|
3
|
+
description: string;
|
4
|
+
icon: React.ReactNode;
|
5
|
+
}
|
6
|
+
|
7
|
+
interface StepsProps {
|
8
|
+
steps: Step[];
|
9
|
+
currentStep: number;
|
10
|
+
onStepClick: (step: number) => void;
|
11
|
+
}
|
12
|
+
|
13
|
+
export function Steps({ steps, currentStep, onStepClick }: StepsProps) {
|
14
|
+
return (
|
15
|
+
<div className="flex justify-between">
|
16
|
+
{steps.map((step, index) => (
|
17
|
+
<div
|
18
|
+
key={step.title}
|
19
|
+
className={`flex flex-col items-center cursor-pointer ${
|
20
|
+
index <= currentStep ? 'text-primary' : 'text-muted-foreground'
|
21
|
+
}`}
|
22
|
+
onClick={() => onStepClick(index)}
|
23
|
+
>
|
24
|
+
<div className={`
|
25
|
+
w-10 h-10 rounded-full border-2 flex items-center justify-center mb-2
|
26
|
+
${index <= currentStep ? 'border-primary' : 'border-muted'}
|
27
|
+
`}>
|
28
|
+
{step.icon}
|
29
|
+
</div>
|
30
|
+
<div className="text-sm font-medium">{step.title}</div>
|
31
|
+
<div className="text-xs text-muted-foreground">{step.description}</div>
|
32
|
+
</div>
|
33
|
+
))}
|
34
|
+
</div>
|
35
|
+
)
|
36
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
"use client"
|
2
|
+
|
3
|
+
import * as React from "react"
|
4
|
+
import * as SwitchPrimitives from "@radix-ui/react-switch"
|
5
|
+
|
6
|
+
import { cn } from "@/lib/utils"
|
7
|
+
|
8
|
+
const Switch = React.forwardRef<
|
9
|
+
React.ElementRef<typeof SwitchPrimitives.Root>,
|
10
|
+
React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>
|
11
|
+
>(({ className, ...props }, ref) => (
|
12
|
+
<SwitchPrimitives.Root
|
13
|
+
className={cn(
|
14
|
+
"peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",
|
15
|
+
className
|
16
|
+
)}
|
17
|
+
{...props}
|
18
|
+
ref={ref}
|
19
|
+
>
|
20
|
+
<SwitchPrimitives.Thumb
|
21
|
+
className={cn(
|
22
|
+
"pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0"
|
23
|
+
)}
|
24
|
+
/>
|
25
|
+
</SwitchPrimitives.Root>
|
26
|
+
))
|
27
|
+
Switch.displayName = SwitchPrimitives.Root.displayName
|
28
|
+
|
29
|
+
export { Switch }
|
@@ -0,0 +1,21 @@
|
|
1
|
+
{
|
2
|
+
"$schema": "https://ui.shadcn.com/schema.json",
|
3
|
+
"style": "new-york",
|
4
|
+
"rsc": true,
|
5
|
+
"tsx": true,
|
6
|
+
"tailwind": {
|
7
|
+
"config": "tailwind.config.js",
|
8
|
+
"css": "app/globals.css",
|
9
|
+
"baseColor": "neutral",
|
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
|
+
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import GitHubProvider from "next-auth/providers/github";
|
2
|
+
export const authOptions = {
|
3
|
+
providers: [
|
4
|
+
GitHubProvider({
|
5
|
+
clientId: process.env.GITHUB_ID || " ",
|
6
|
+
clientSecret: process.env.GITHUB_SECRET || " ",
|
7
|
+
authorization: {
|
8
|
+
params: {
|
9
|
+
scope: "repo read:user read:org workflow",
|
10
|
+
},
|
11
|
+
},
|
12
|
+
}),
|
13
|
+
],
|
14
|
+
callbacks: {
|
15
|
+
async jwt({ token, account }: { token: any, account: any }) {
|
16
|
+
console.log(account)
|
17
|
+
if (account) {
|
18
|
+
token.accessToken = account.access_token;
|
19
|
+
}
|
20
|
+
return token;
|
21
|
+
},
|
22
|
+
async session({ session, token }: { session: any, token: any }) {
|
23
|
+
// console.log(token)
|
24
|
+
session.accessToken = token.accessToken;
|
25
|
+
return session;
|
26
|
+
},
|
27
|
+
async redirect({ baseUrl }: { baseUrl: string }) {
|
28
|
+
return `${baseUrl}/home`;
|
29
|
+
},
|
30
|
+
},
|
31
|
+
|
32
|
+
secret: process.env.NEXTAUTH_SECRET || " ",
|
33
|
+
|
34
|
+
|
35
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { createClient } from 'redis';
|
2
|
+
|
3
|
+
const redis = createClient({
|
4
|
+
url: process.env.REDIS_URL || 'redis://localhost:6379'
|
5
|
+
});
|
6
|
+
|
7
|
+
redis.on('error', (err) => console.error('Redis Client Error', err));
|
8
|
+
|
9
|
+
if (!redis.isOpen) {
|
10
|
+
redis.connect();
|
11
|
+
}
|
12
|
+
|
13
|
+
export default redis;
|
@@ -0,0 +1,52 @@
|
|
1
|
+
{
|
2
|
+
"name": "web",
|
3
|
+
"version": "0.1.0",
|
4
|
+
"type": "module",
|
5
|
+
"private": true,
|
6
|
+
"scripts": {
|
7
|
+
"dev": "next dev --turbopack --port 3000",
|
8
|
+
"build": "next build",
|
9
|
+
"start": "next start",
|
10
|
+
"lint": "next lint --max-warnings 0",
|
11
|
+
"check-types": "tsc --noEmit"
|
12
|
+
},
|
13
|
+
"dependencies": {
|
14
|
+
"@radix-ui/react-dropdown-menu": "^2.1.6",
|
15
|
+
"@radix-ui/react-label": "^2.1.2",
|
16
|
+
"@radix-ui/react-scroll-area": "^1.2.3",
|
17
|
+
"@radix-ui/react-slot": "^1.1.2",
|
18
|
+
"@radix-ui/react-switch": "^1.1.3",
|
19
|
+
"@repo/ui": "*",
|
20
|
+
"axios": "^1.7.9",
|
21
|
+
"class-variance-authority": "^0.7.1",
|
22
|
+
"clsx": "^2.1.1",
|
23
|
+
"d3": "^7.9.0",
|
24
|
+
"date-fns": "^4.1.0",
|
25
|
+
"fs": "^0.0.1-security",
|
26
|
+
"lucide-react": "^0.475.0",
|
27
|
+
"next": "^15.1.6",
|
28
|
+
"next-auth": "^4.24.11",
|
29
|
+
"next-themes": "^0.4.4",
|
30
|
+
"path": "^0.12.7",
|
31
|
+
"prisma": "^6.4.0",
|
32
|
+
"react": "^19.0.0",
|
33
|
+
"react-dom": "^19.0.0",
|
34
|
+
"redis": "^4.7.0",
|
35
|
+
"sonner": "^2.0.1",
|
36
|
+
"tailwind-merge": "^3.0.1",
|
37
|
+
"tailwindcss-animate": "^1.0.7"
|
38
|
+
},
|
39
|
+
"devDependencies": {
|
40
|
+
"@repo/eslint-config": "*",
|
41
|
+
"@repo/typescript-config": "*",
|
42
|
+
"@types/d3": "^7.4.3",
|
43
|
+
"@types/node": "^20.0.0",
|
44
|
+
"@types/react": "19.0.8",
|
45
|
+
"@types/react-dom": "19.0.3",
|
46
|
+
"autoprefixer": "^10.4.20",
|
47
|
+
"eslint": "^9.20.0",
|
48
|
+
"postcss": "^8.5.3",
|
49
|
+
"tailwindcss": "^3.4.17",
|
50
|
+
"typescript": "5.7.3"
|
51
|
+
}
|
52
|
+
}
|
@@ -0,0 +1,3 @@
|
|
1
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
2
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.5 13.5V6.5V5.41421C14.5 5.149 14.3946 4.89464 14.2071 4.70711L9.79289 0.292893C9.60536 0.105357 9.351 0 9.08579 0H8H3H1.5V1.5V13.5C1.5 14.8807 2.61929 16 4 16H12C13.3807 16 14.5 14.8807 14.5 13.5ZM13 13.5V6.5H9.5H8V5V1.5H3V13.5C3 14.0523 3.44772 14.5 4 14.5H12C12.5523 14.5 13 14.0523 13 13.5ZM9.5 5V2.12132L12.3787 5H9.5ZM5.13 5.00062H4.505V6.25062H5.13H6H6.625V5.00062H6H5.13ZM4.505 8H5.13H11H11.625V9.25H11H5.13H4.505V8ZM5.13 11H4.505V12.25H5.13H11H11.625V11H11H5.13Z" fill="#666666"/>
|
3
|
+
</svg>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
2
|
+
<g clip-path="url(#clip0_868_525)">
|
3
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.268 14.0934C11.9051 13.4838 13.2303 12.2333 13.9384 10.6469C13.1192 10.7941 12.2138 10.9111 11.2469 10.9925C11.0336 12.2005 10.695 13.2621 10.268 14.0934ZM8 16C12.4183 16 16 12.4183 16 8C16 3.58172 12.4183 0 8 0C3.58172 0 0 3.58172 0 8C0 12.4183 3.58172 16 8 16ZM8.48347 14.4823C8.32384 14.494 8.16262 14.5 8 14.5C7.83738 14.5 7.67616 14.494 7.51654 14.4823C7.5132 14.4791 7.50984 14.4759 7.50647 14.4726C7.2415 14.2165 6.94578 13.7854 6.67032 13.1558C6.41594 12.5744 6.19979 11.8714 6.04101 11.0778C6.67605 11.1088 7.33104 11.125 8 11.125C8.66896 11.125 9.32395 11.1088 9.95899 11.0778C9.80021 11.8714 9.58406 12.5744 9.32968 13.1558C9.05422 13.7854 8.7585 14.2165 8.49353 14.4726C8.49016 14.4759 8.4868 14.4791 8.48347 14.4823ZM11.4187 9.72246C12.5137 9.62096 13.5116 9.47245 14.3724 9.28806C14.4561 8.87172 14.5 8.44099 14.5 8C14.5 7.55901 14.4561 7.12828 14.3724 6.71194C13.5116 6.52755 12.5137 6.37904 11.4187 6.27753C11.4719 6.83232 11.5 7.40867 11.5 8C11.5 8.59133 11.4719 9.16768 11.4187 9.72246ZM10.1525 6.18401C10.2157 6.75982 10.25 7.36805 10.25 8C10.25 8.63195 10.2157 9.24018 10.1525 9.81598C9.46123 9.85455 8.7409 9.875 8 9.875C7.25909 9.875 6.53877 9.85455 5.84749 9.81598C5.7843 9.24018 5.75 8.63195 5.75 8C5.75 7.36805 5.7843 6.75982 5.84749 6.18401C6.53877 6.14545 7.25909 6.125 8 6.125C8.74091 6.125 9.46123 6.14545 10.1525 6.18401ZM11.2469 5.00748C12.2138 5.08891 13.1191 5.20593 13.9384 5.35306C13.2303 3.7667 11.9051 2.51622 10.268 1.90662C10.695 2.73788 11.0336 3.79953 11.2469 5.00748ZM8.48347 1.51771C8.4868 1.52089 8.49016 1.52411 8.49353 1.52737C8.7585 1.78353 9.05422 2.21456 9.32968 2.84417C9.58406 3.42562 9.80021 4.12856 9.95899 4.92219C9.32395 4.89118 8.66896 4.875 8 4.875C7.33104 4.875 6.67605 4.89118 6.04101 4.92219C6.19978 4.12856 6.41594 3.42562 6.67032 2.84417C6.94578 2.21456 7.2415 1.78353 7.50647 1.52737C7.50984 1.52411 7.51319 1.52089 7.51653 1.51771C7.67615 1.50597 7.83738 1.5 8 1.5C8.16262 1.5 8.32384 1.50597 8.48347 1.51771ZM5.73202 1.90663C4.0949 2.51622 2.76975 3.7667 2.06159 5.35306C2.88085 5.20593 3.78617 5.08891 4.75309 5.00748C4.96639 3.79953 5.30497 2.73788 5.73202 1.90663ZM4.58133 6.27753C3.48633 6.37904 2.48837 6.52755 1.62761 6.71194C1.54392 7.12828 1.5 7.55901 1.5 8C1.5 8.44099 1.54392 8.87172 1.62761 9.28806C2.48837 9.47245 3.48633 9.62096 4.58133 9.72246C4.52807 9.16768 4.5 8.59133 4.5 8C4.5 7.40867 4.52807 6.83232 4.58133 6.27753ZM4.75309 10.9925C3.78617 10.9111 2.88085 10.7941 2.06159 10.6469C2.76975 12.2333 4.0949 13.4838 5.73202 14.0934C5.30497 13.2621 4.96639 12.2005 4.75309 10.9925Z" fill="#666666"/>
|
4
|
+
</g>
|
5
|
+
<defs>
|
6
|
+
<clipPath id="clip0_868_525">
|
7
|
+
<rect width="16" height="16" fill="white"/>
|
8
|
+
</clipPath>
|
9
|
+
</defs>
|
10
|
+
</svg>
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
|