@digilogiclabs/create-saas-app 1.1.0 → 1.1.1
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/CHANGELOG.md +1 -1
- package/bin/index.js +36 -3
- package/dist/.tsbuildinfo +1 -0
- package/dist/index.js +390 -20094
- package/dist/index.js.map +1 -1
- package/dist/mobile/base/template/.env.example +15 -0
- package/dist/templates/mobile/base/template/.env.example +15 -0
- package/dist/templates/mobile/base/template/App.tsx +88 -0
- package/dist/templates/mobile/base/template/app/(auth)/login.tsx +44 -0
- package/dist/templates/mobile/base/template/app/(auth)/signup.tsx +43 -0
- package/dist/templates/mobile/base/template/app/checkout.tsx +20 -0
- package/dist/templates/mobile/base/template/package.json +38 -0
- package/dist/templates/shared/auth/firebase/web/config.ts +23 -0
- package/dist/templates/shared/auth/supabase/web/config.ts +8 -0
- package/dist/templates/web/base/template/.env.example +15 -0
- package/dist/templates/web/base/template/.eslintrc.js +8 -0
- package/dist/templates/web/base/template/README.md +68 -0
- package/dist/templates/web/base/template/next.config.js +15 -0
- package/dist/templates/web/base/template/package.json +48 -0
- package/dist/templates/web/base/template/postcss.config.js +7 -0
- package/dist/templates/web/base/template/src/app/auth/callback/route.ts +18 -0
- package/dist/templates/web/base/template/src/app/checkout/page.tsx +28 -0
- package/dist/templates/web/base/template/src/app/globals.css +60 -0
- package/dist/templates/web/base/template/src/app/layout.tsx +29 -0
- package/dist/templates/web/base/template/src/app/login/page.tsx +39 -0
- package/dist/templates/web/base/template/src/app/page.tsx +132 -0
- package/dist/templates/web/base/template/src/app/signup/page.tsx +39 -0
- package/dist/templates/web/base/template/src/components/providers/app-providers.tsx +29 -0
- package/dist/templates/web/base/template/src/components/shared/header.tsx +42 -0
- package/dist/templates/web/base/template/src/components/ui/badge.tsx +36 -0
- package/dist/templates/web/base/template/src/components/ui/button.tsx +56 -0
- package/dist/templates/web/base/template/src/components/ui/card.tsx +71 -0
- package/dist/templates/web/base/template/src/lib/utils.ts +7 -0
- package/dist/templates/web/base/template/tailwind.config.js +77 -0
- package/dist/templates/web/base/template/tsconfig.json +33 -0
- package/dist/templates/web/base/template.backup/.env.example +15 -0
- package/dist/templates/web/base/template.backup.20250817/.env.example +15 -0
- package/dist/templates/web/ui-package-test/template/package.json +42 -0
- package/dist/templates/web/ui-package-test/template/src/app/page.tsx +106 -0
- package/dist/templates/web/ui-package-test/template/tsconfig.json +41 -0
- package/dist/templates/web/web-ui-package/template/.env.example +15 -0
- package/dist/templates/web/web-ui-package/template/.eslintrc.js +8 -0
- package/dist/templates/web/web-ui-package/template/README.md +68 -0
- package/dist/templates/web/web-ui-package/template/next.config.js +15 -0
- package/dist/templates/web/web-ui-package/template/package.json +39 -0
- package/dist/templates/web/web-ui-package/template/postcss.config.js +7 -0
- package/dist/templates/web/web-ui-package/template/src/app/auth/callback/route.ts +18 -0
- package/dist/templates/web/web-ui-package/template/src/app/checkout/page.tsx +28 -0
- package/dist/templates/web/web-ui-package/template/src/app/globals.css +42 -0
- package/dist/templates/web/web-ui-package/template/src/app/layout.tsx +29 -0
- package/dist/templates/web/web-ui-package/template/src/app/login/page.tsx +39 -0
- package/dist/templates/web/web-ui-package/template/src/app/page.tsx +91 -0
- package/dist/templates/web/web-ui-package/template/src/app/signup/page.tsx +39 -0
- package/dist/templates/web/web-ui-package/template/src/components/providers/app-providers.tsx +29 -0
- package/dist/templates/web/web-ui-package/template/src/components/shared/header.tsx +42 -0
- package/dist/templates/web/web-ui-package/template/src/components/ui/badge.tsx +36 -0
- package/dist/templates/web/web-ui-package/template/src/lib/utils.ts +7 -0
- package/dist/templates/web/web-ui-package/template/tailwind.config.js +77 -0
- package/dist/templates/web/web-ui-package/template/tsconfig.json +33 -0
- package/dist/templates/web/web-ui-package/template.backup/.env.example +15 -0
- package/dist/templates/web/web-ui-package/template.backup.20250817/.env.example +15 -0
- package/dist/web/base/template/.env.example +15 -0
- package/dist/web/base/template/.eslintrc.js +8 -0
- package/dist/web/base/template.backup/.env.example +15 -0
- package/dist/web/base/template.backup.20250817/.env.example +15 -0
- package/dist/web/ui-package-test/template/.env.example +15 -0
- package/dist/web/ui-package-test/template/.eslintrc.js +8 -0
- package/dist/web/ui-package-test/template.backup/.env.example +15 -0
- package/dist/web/ui-package-test/template.backup.20250817/.env.example +15 -0
- package/dist/web/web-ui-package/template/.env.example +15 -0
- package/dist/web/web-ui-package/template/.eslintrc.js +8 -0
- package/dist/web/web-ui-package/template.backup/.env.example +15 -0
- package/dist/web/web-ui-package/template.backup.20250817/.env.example +15 -0
- package/package.json +105 -105
- package/src/templates/mobile/base/template/.env.example +15 -0
- package/src/templates/mobile/base/template/App.tsx +51 -10
- package/src/templates/mobile/base/template/app/(auth)/login.tsx +44 -0
- package/src/templates/mobile/base/template/app/(auth)/signup.tsx +43 -0
- package/src/templates/mobile/base/template/app/checkout.tsx +20 -0
- package/src/templates/mobile/base/template/package.json +6 -6
- package/src/templates/shared/auth/firebase/web/config.ts +23 -24
- package/src/templates/shared/auth/supabase/web/config.ts +8 -9
- package/src/templates/web/base/template/.env.example +12 -31
- package/src/templates/web/base/template/package.json +6 -6
- package/src/templates/web/base/template/src/app/auth/callback/route.ts +18 -0
- package/src/templates/web/base/template/src/app/checkout/page.tsx +28 -0
- package/src/templates/web/base/template/src/app/layout.tsx +2 -1
- package/src/templates/web/base/template/src/app/login/page.tsx +39 -0
- package/src/templates/web/base/template/src/app/page.tsx +33 -9
- package/src/templates/web/base/template/src/app/signup/page.tsx +39 -0
- package/src/templates/web/base/template/src/components/providers/app-providers.tsx +17 -9
- package/src/templates/web/base/template/src/components/shared/header.tsx +42 -0
- package/src/templates/web/base/template/tailwind.config.js +1 -1
- package/src/templates/web/base/template.backup/.env.example +15 -0
- package/src/templates/web/base/template.backup.20250817/.env.example +15 -0
- package/src/templates/web/ui-package-test/template/next-env.d.ts +5 -0
- package/src/templates/web/ui-package-test/template/package.json +42 -0
- package/src/templates/web/ui-package-test/template/src/app/page.tsx +106 -0
- package/src/templates/web/ui-package-test/template/tsconfig.json +41 -0
- package/src/templates/web/web-ui-package/template/.env.example +15 -0
- package/src/templates/web/web-ui-package/template/.eslintrc.js +8 -0
- package/src/templates/web/web-ui-package/template/README.md +68 -0
- package/src/templates/web/web-ui-package/template/next.config.js +15 -0
- package/src/templates/web/web-ui-package/template/package.json +39 -0
- package/src/templates/web/web-ui-package/template/postcss.config.js +7 -0
- package/src/templates/web/web-ui-package/template/src/app/auth/callback/route.ts +18 -0
- package/src/templates/web/web-ui-package/template/src/app/checkout/page.tsx +28 -0
- package/src/templates/web/web-ui-package/template/src/app/globals.css +42 -0
- package/src/templates/web/web-ui-package/template/src/app/layout.tsx +29 -0
- package/src/templates/web/web-ui-package/template/src/app/login/page.tsx +39 -0
- package/src/templates/web/web-ui-package/template/src/app/page.tsx +91 -0
- package/src/templates/web/web-ui-package/template/src/app/signup/page.tsx +39 -0
- package/src/templates/web/web-ui-package/template/src/components/providers/app-providers.tsx +29 -0
- package/src/templates/web/web-ui-package/template/src/components/shared/header.tsx +42 -0
- package/src/templates/web/web-ui-package/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/web-ui-package/template/src/lib/utils.ts +7 -0
- package/src/templates/web/web-ui-package/template/tailwind.config.js +77 -0
- package/src/templates/web/web-ui-package/template/tsconfig.json +33 -0
- package/src/templates/web/web-ui-package/template.backup/.env.example +15 -0
- package/src/templates/web/web-ui-package/template.backup.20250817/.env.example +15 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { Button } from '@/components/ui/button'
|
|
4
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
|
|
5
|
+
import { Badge } from '@/components/ui/badge'
|
|
6
|
+
import { ArrowRight, Zap, Shield, Rocket, LogOut } from 'lucide-react'
|
|
7
|
+
import { useAuth } from '@digilogiclabs/saas-factory-auth'
|
|
8
|
+
import Link from 'next/link'
|
|
9
|
+
|
|
10
|
+
export default function Home() {
|
|
11
|
+
const { user, signOut } = useAuth()
|
|
12
|
+
|
|
13
|
+
return (
|
|
14
|
+
<main className="min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800">
|
|
15
|
+
<div className="container mx-auto px-4 py-16">
|
|
16
|
+
{/* Hero Section */}
|
|
17
|
+
<div className="text-center mb-16">
|
|
18
|
+
<Badge variant="secondary" className="mb-4">
|
|
19
|
+
Built with DigitalLogic Labs
|
|
20
|
+
</Badge>
|
|
21
|
+
<h1 className="text-4xl md:text-6xl font-bold text-gray-900 dark:text-white mb-6">
|
|
22
|
+
Welcome to{' '}
|
|
23
|
+
<span className="text-blue-600 dark:text-blue-400">{{titleCaseName}}</span>
|
|
24
|
+
</h1>
|
|
25
|
+
<p className="text-xl text-gray-600 dark:text-gray-300 mb-8 max-w-2xl mx-auto">
|
|
26
|
+
{{description}}. Get started by editing{' '}
|
|
27
|
+
<code className="bg-gray-100 dark:bg-gray-800 px-2 py-1 rounded text-sm">
|
|
28
|
+
src/app/page.tsx
|
|
29
|
+
</code>
|
|
30
|
+
</p>
|
|
31
|
+
<div className="flex flex-col sm:flex-row gap-4 justify-center">
|
|
32
|
+
{!user ? (
|
|
33
|
+
<>
|
|
34
|
+
<Button size="lg" className="text-lg px-8" asChild>
|
|
35
|
+
<Link href="/signup">
|
|
36
|
+
Get Started
|
|
37
|
+
<ArrowRight className="ml-2 h-5 w-5" />
|
|
38
|
+
</Link>
|
|
39
|
+
</Button>
|
|
40
|
+
<Button variant="outline" size="lg" className="text-lg px-8" asChild>
|
|
41
|
+
<Link href="/login">Learn More</Link>
|
|
42
|
+
</Button>
|
|
43
|
+
</>
|
|
44
|
+
) : (
|
|
45
|
+
<>
|
|
46
|
+
<Button size="lg" className="text-lg px-8" asChild>
|
|
47
|
+
<Link href="/dashboard">
|
|
48
|
+
Go to Dashboard
|
|
49
|
+
<ArrowRight className="ml-2 h-5 w-5" />
|
|
50
|
+
</Link>
|
|
51
|
+
</Button>
|
|
52
|
+
<Button variant="outline" size="lg" className="text-lg px-8" onClick={signOut}>
|
|
53
|
+
<LogOut className="mr-2 h-5 w-5" />
|
|
54
|
+
Sign Out
|
|
55
|
+
</Button>
|
|
56
|
+
</>
|
|
57
|
+
)}
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
{/* Features Grid */}
|
|
62
|
+
<div className="grid md:grid-cols-3 gap-8 mb-16">
|
|
63
|
+
<Card className="text-center">
|
|
64
|
+
<CardHeader>
|
|
65
|
+
<div className="mx-auto w-12 h-12 bg-blue-100 dark:bg-blue-900 rounded-lg flex items-center justify-center mb-4">
|
|
66
|
+
<Zap className="h-6 w-6 text-blue-600 dark:text-blue-400" />
|
|
67
|
+
</div>
|
|
68
|
+
<CardTitle>Lightning Fast</CardTitle>
|
|
69
|
+
<CardDescription>
|
|
70
|
+
Built with Next.js 14 and optimized for performance
|
|
71
|
+
</CardDescription>
|
|
72
|
+
</CardHeader>
|
|
73
|
+
</Card>
|
|
74
|
+
|
|
75
|
+
<Card className="text-center">
|
|
76
|
+
<CardHeader>
|
|
77
|
+
<div className="mx-auto w-12 h-12 bg-green-100 dark:bg-green-900 rounded-lg flex items-center justify-center mb-4">
|
|
78
|
+
<Shield className="h-6 w-6 text-green-600 dark:text-green-400" />
|
|
79
|
+
</div>
|
|
80
|
+
<CardTitle>Secure by Default</CardTitle>
|
|
81
|
+
<CardDescription>
|
|
82
|
+
{{#auth}}{{#firebase}}Firebase{{/firebase}}{{#supabase}}Supabase{{/supabase}}{{/auth}} authentication and security best practices
|
|
83
|
+
</CardDescription>
|
|
84
|
+
</CardHeader>
|
|
85
|
+
</Card>
|
|
86
|
+
|
|
87
|
+
<Card className="text-center">
|
|
88
|
+
<CardHeader>
|
|
89
|
+
<div className="mx-auto w-12 h-12 bg-purple-100 dark:bg-purple-900 rounded-lg flex items-center justify-center mb-4">
|
|
90
|
+
<Rocket className="h-6 w-6 text-purple-600 dark:text-purple-400" />
|
|
91
|
+
</div>
|
|
92
|
+
<CardTitle>Ready to Scale</CardTitle>
|
|
93
|
+
<CardDescription>
|
|
94
|
+
Production-ready with TypeScript, Tailwind CSS, and modern tooling
|
|
95
|
+
</CardDescription>
|
|
96
|
+
</CardHeader>
|
|
97
|
+
</Card>
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
{/* Tech Stack */}
|
|
101
|
+
<Card className="max-w-4xl mx-auto">
|
|
102
|
+
<CardHeader className="text-center">
|
|
103
|
+
<CardTitle className="text-2xl">Built with Modern Technologies</CardTitle>
|
|
104
|
+
<CardDescription>
|
|
105
|
+
This template includes everything you need to build a modern SaaS application
|
|
106
|
+
</CardDescription>
|
|
107
|
+
</CardHeader>
|
|
108
|
+
<CardContent>
|
|
109
|
+
<div className="grid grid-cols-2 md:grid-cols-4 gap-4 text-center">
|
|
110
|
+
<div className="p-4">
|
|
111
|
+
<div className="font-semibold">Next.js 14</div>
|
|
112
|
+
<div className="text-sm text-gray-600 dark:text-gray-400">React Framework</div>
|
|
113
|
+
</div>
|
|
114
|
+
<div className="p-4">
|
|
115
|
+
<div className="font-semibold">TypeScript</div>
|
|
116
|
+
<div className="text-sm text-gray-600 dark:text-gray-400">Type Safety</div>
|
|
117
|
+
</div>
|
|
118
|
+
<div className="p-4">
|
|
119
|
+
<div className="font-semibold">Tailwind CSS</div>
|
|
120
|
+
<div className="text-sm text-gray-600 dark:text-gray-400">Styling</div>
|
|
121
|
+
</div>
|
|
122
|
+
<div className="p-4">
|
|
123
|
+
<div className="font-semibold">{{#auth}}{{#firebase}}Firebase{{/firebase}}{{#supabase}}Supabase{{/supabase}}{{/auth}}</div>
|
|
124
|
+
<div className="text-sm text-gray-600 dark:text-gray-400">Authentication</div>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
</CardContent>
|
|
128
|
+
</Card>
|
|
129
|
+
</div>
|
|
130
|
+
</main>
|
|
131
|
+
)
|
|
132
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { SignupForm } from '@digilogiclabs/saas-factory-ui';
|
|
4
|
+
import { AuthProvider } from '@digilogiclabs/saas-factory-auth';
|
|
5
|
+
import { createBrowserClient } from '@supabase/ssr';
|
|
6
|
+
import React from 'react';
|
|
7
|
+
|
|
8
|
+
export default function SignupPage() {
|
|
9
|
+
const supabase = createBrowserClient(
|
|
10
|
+
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
|
11
|
+
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
const handleSignup = async (values: any) => {
|
|
15
|
+
await supabase.auth.signUp({
|
|
16
|
+
email: values.email,
|
|
17
|
+
password: values.password,
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const handleGoogleSignup = async () => {
|
|
22
|
+
await supabase.auth.signInWithOAuth({
|
|
23
|
+
provider: 'google',
|
|
24
|
+
options: {
|
|
25
|
+
redirectTo: `${location.origin}/auth/callback`,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<div className="flex items-center justify-center min-h-screen bg-gray-100">
|
|
32
|
+
<SignupForm
|
|
33
|
+
onSubmit={handleSignup}
|
|
34
|
+
onGoogleSignIn={handleGoogleSignup}
|
|
35
|
+
authProvider={AuthProvider.SUPABASE}
|
|
36
|
+
/>
|
|
37
|
+
</div>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import React from 'react'
|
|
4
|
+
import { AuthProvider } from '@digilogiclabs/saas-factory-auth'
|
|
5
|
+
import { ThemeProvider } from 'next-themes'
|
|
6
|
+
import { StripeProvider } from '@digilogiclabs/saas-factory-payments'
|
|
7
|
+
|
|
8
|
+
interface AppProvidersProps {
|
|
9
|
+
children: React.ReactNode
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function AppProviders({ children }: AppProvidersProps) {
|
|
13
|
+
return (
|
|
14
|
+
<AuthProvider provider="supabase">
|
|
15
|
+
<StripeProvider
|
|
16
|
+
stripeKey={process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY!}
|
|
17
|
+
>
|
|
18
|
+
<ThemeProvider
|
|
19
|
+
attribute="class"
|
|
20
|
+
defaultTheme="system"
|
|
21
|
+
enableSystem
|
|
22
|
+
disableTransitionOnChange
|
|
23
|
+
>
|
|
24
|
+
{children}
|
|
25
|
+
</ThemeProvider>
|
|
26
|
+
</StripeProvider>
|
|
27
|
+
</AuthProvider>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import Link from 'next/link';
|
|
5
|
+
import { useAuth } from '@digilogiclabs/saas-factory-auth';
|
|
6
|
+
import { Button } from '@/components/ui/button';
|
|
7
|
+
import { LogOut } from 'lucide-react';
|
|
8
|
+
|
|
9
|
+
export function Header() {
|
|
10
|
+
const { user, signOut } = useAuth();
|
|
11
|
+
|
|
12
|
+
return (
|
|
13
|
+
<header className="bg-white dark:bg-gray-800 shadow-md">
|
|
14
|
+
<div className="container mx-auto px-4 py-4 flex justify-between items-center">
|
|
15
|
+
<Link href="/" className="text-2xl font-bold text-gray-900 dark:text-white">
|
|
16
|
+
{{titleCaseName}}
|
|
17
|
+
</Link>
|
|
18
|
+
<nav className="flex items-center gap-4">
|
|
19
|
+
{user ? (
|
|
20
|
+
<>
|
|
21
|
+
<Link href="/dashboard" className="text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white">
|
|
22
|
+
Dashboard
|
|
23
|
+
</Link>
|
|
24
|
+
<Button variant="ghost" size="icon" onClick={signOut}>
|
|
25
|
+
<LogOut className="h-5 w-5" />
|
|
26
|
+
</Button>
|
|
27
|
+
</>
|
|
28
|
+
) : (
|
|
29
|
+
<>
|
|
30
|
+
<Link href="/login" className="text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white">
|
|
31
|
+
Login
|
|
32
|
+
</Link>
|
|
33
|
+
<Button asChild>
|
|
34
|
+
<Link href="/signup">Sign Up</Link>
|
|
35
|
+
</Button>
|
|
36
|
+
</>
|
|
37
|
+
)}
|
|
38
|
+
</nav>
|
|
39
|
+
</div>
|
|
40
|
+
</header>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import { cva, type VariantProps } from "class-variance-authority"
|
|
3
|
+
import { cn } from "@/lib/utils"
|
|
4
|
+
|
|
5
|
+
const badgeVariants = cva(
|
|
6
|
+
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
|
7
|
+
{
|
|
8
|
+
variants: {
|
|
9
|
+
variant: {
|
|
10
|
+
default:
|
|
11
|
+
"border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
|
|
12
|
+
secondary:
|
|
13
|
+
"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
14
|
+
destructive:
|
|
15
|
+
"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
|
|
16
|
+
outline: "text-foreground",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
defaultVariants: {
|
|
20
|
+
variant: "default",
|
|
21
|
+
},
|
|
22
|
+
}
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
export interface BadgeProps
|
|
26
|
+
extends React.HTMLAttributes<HTMLDivElement>,
|
|
27
|
+
VariantProps<typeof badgeVariants> {}
|
|
28
|
+
|
|
29
|
+
function Badge({ className, variant, ...props }: BadgeProps) {
|
|
30
|
+
return (
|
|
31
|
+
<div className={cn(badgeVariants({ variant }), className)} {...props} />
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export { Badge, badgeVariants }
|
|
36
|
+
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import { Slot } from "@radix-ui/react-slot"
|
|
3
|
+
import { cva, type VariantProps } from "class-variance-authority"
|
|
4
|
+
import { cn } from "@/lib/utils"
|
|
5
|
+
|
|
6
|
+
const buttonVariants = cva(
|
|
7
|
+
"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
|
|
8
|
+
{
|
|
9
|
+
variants: {
|
|
10
|
+
variant: {
|
|
11
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
12
|
+
destructive:
|
|
13
|
+
"bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
14
|
+
outline:
|
|
15
|
+
"border border-input bg-background hover:bg-accent hover:text-accent-foreground",
|
|
16
|
+
secondary:
|
|
17
|
+
"bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
18
|
+
ghost: "hover:bg-accent hover:text-accent-foreground",
|
|
19
|
+
link: "text-primary underline-offset-4 hover:underline",
|
|
20
|
+
},
|
|
21
|
+
size: {
|
|
22
|
+
default: "h-10 px-4 py-2",
|
|
23
|
+
sm: "h-9 rounded-md px-3",
|
|
24
|
+
lg: "h-11 rounded-md px-8",
|
|
25
|
+
icon: "h-10 w-10",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
defaultVariants: {
|
|
29
|
+
variant: "default",
|
|
30
|
+
size: "default",
|
|
31
|
+
},
|
|
32
|
+
}
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
export interface ButtonProps
|
|
36
|
+
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
|
|
37
|
+
VariantProps<typeof buttonVariants> {
|
|
38
|
+
asChild?: boolean
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
|
|
42
|
+
({ className, variant, size, asChild = false, ...props }, ref) => {
|
|
43
|
+
const Comp = asChild ? Slot : "button"
|
|
44
|
+
return (
|
|
45
|
+
<Comp
|
|
46
|
+
className={cn(buttonVariants({ variant, size, className }))}
|
|
47
|
+
ref={ref}
|
|
48
|
+
{...props}
|
|
49
|
+
/>
|
|
50
|
+
)
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
Button.displayName = "Button"
|
|
54
|
+
|
|
55
|
+
export { Button, buttonVariants }
|
|
56
|
+
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import { cn } from "@/lib/utils"
|
|
3
|
+
|
|
4
|
+
const Card = React.forwardRef<
|
|
5
|
+
HTMLDivElement,
|
|
6
|
+
React.HTMLAttributes<HTMLDivElement>
|
|
7
|
+
>(({ className, ...props }, ref) => (
|
|
8
|
+
<div
|
|
9
|
+
ref={ref}
|
|
10
|
+
className={cn(
|
|
11
|
+
"rounded-lg border bg-card text-card-foreground shadow-sm",
|
|
12
|
+
className
|
|
13
|
+
)}
|
|
14
|
+
{...props}
|
|
15
|
+
/>
|
|
16
|
+
))
|
|
17
|
+
Card.displayName = "Card"
|
|
18
|
+
|
|
19
|
+
const CardHeader = React.forwardRef<
|
|
20
|
+
HTMLDivElement,
|
|
21
|
+
React.HTMLAttributes<HTMLDivElement>
|
|
22
|
+
>(({ className, ...props }, ref) => (
|
|
23
|
+
<div ref={ref} className={cn("flex flex-col space-y-1.5 p-6", className)} {...props} />
|
|
24
|
+
))
|
|
25
|
+
CardHeader.displayName = "CardHeader"
|
|
26
|
+
|
|
27
|
+
const CardTitle = React.forwardRef<
|
|
28
|
+
HTMLParagraphElement,
|
|
29
|
+
React.HTMLAttributes<HTMLHeadingElement>
|
|
30
|
+
>(({ className, ...props }, ref) => (
|
|
31
|
+
<h3
|
|
32
|
+
ref={ref}
|
|
33
|
+
className={cn(
|
|
34
|
+
"text-2xl font-semibold leading-none tracking-tight",
|
|
35
|
+
className
|
|
36
|
+
)}
|
|
37
|
+
{...props}
|
|
38
|
+
/>
|
|
39
|
+
))
|
|
40
|
+
CardTitle.displayName = "CardTitle"
|
|
41
|
+
|
|
42
|
+
const CardDescription = React.forwardRef<
|
|
43
|
+
HTMLParagraphElement,
|
|
44
|
+
React.HTMLAttributes<HTMLParagraphElement>
|
|
45
|
+
>(({ className, ...props }, ref) => (
|
|
46
|
+
<p
|
|
47
|
+
ref={ref}
|
|
48
|
+
className={cn("text-sm text-muted-foreground", className)}
|
|
49
|
+
{...props}
|
|
50
|
+
/>
|
|
51
|
+
))
|
|
52
|
+
CardDescription.displayName = "CardDescription"
|
|
53
|
+
|
|
54
|
+
const CardContent = React.forwardRef<
|
|
55
|
+
HTMLDivElement,
|
|
56
|
+
React.HTMLAttributes<HTMLDivElement>
|
|
57
|
+
>(({ className, ...props }, ref) => (
|
|
58
|
+
<div ref={ref} className={cn("p-6 pt-0", className)} {...props} />
|
|
59
|
+
))
|
|
60
|
+
CardContent.displayName = "CardContent"
|
|
61
|
+
|
|
62
|
+
const CardFooter = React.forwardRef<
|
|
63
|
+
HTMLDivElement,
|
|
64
|
+
React.HTMLAttributes<HTMLDivElement>
|
|
65
|
+
>(({ className, ...props }, ref) => (
|
|
66
|
+
<div ref={ref} className={cn("flex items-center p-6 pt-0", className)} {...props} />
|
|
67
|
+
))
|
|
68
|
+
CardFooter.displayName = "CardFooter"
|
|
69
|
+
|
|
70
|
+
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
|
|
71
|
+
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/** @type {import('tailwindcss').Config} */
|
|
2
|
+
module.exports = {
|
|
3
|
+
darkMode: ["class"],
|
|
4
|
+
content: [
|
|
5
|
+
'./pages/**/*.{ts,tsx}',
|
|
6
|
+
'./components/**/*.{ts,tsx}',
|
|
7
|
+
'./app/**/*.{ts,tsx}',
|
|
8
|
+
'./src/**/*.{ts,tsx}',
|
|
9
|
+
'../../node_modules/@digilogiclabs/saas-factory-ui/dist/**/*.{js,ts,jsx,tsx}',
|
|
10
|
+
],
|
|
11
|
+
theme: {
|
|
12
|
+
container: {
|
|
13
|
+
center: true,
|
|
14
|
+
padding: "2rem",
|
|
15
|
+
screens: {
|
|
16
|
+
"2xl": "1400px",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
extend: {
|
|
20
|
+
colors: {
|
|
21
|
+
border: "hsl(var(--border))",
|
|
22
|
+
input: "hsl(var(--input))",
|
|
23
|
+
ring: "hsl(var(--ring))",
|
|
24
|
+
background: "hsl(var(--background))",
|
|
25
|
+
foreground: "hsl(var(--foreground))",
|
|
26
|
+
primary: {
|
|
27
|
+
DEFAULT: "hsl(var(--primary))",
|
|
28
|
+
foreground: "hsl(var(--primary-foreground))",
|
|
29
|
+
},
|
|
30
|
+
secondary: {
|
|
31
|
+
DEFAULT: "hsl(var(--secondary))",
|
|
32
|
+
foreground: "hsl(var(--secondary-foreground))",
|
|
33
|
+
},
|
|
34
|
+
destructive: {
|
|
35
|
+
DEFAULT: "hsl(var(--destructive))",
|
|
36
|
+
foreground: "hsl(var(--destructive-foreground))",
|
|
37
|
+
},
|
|
38
|
+
muted: {
|
|
39
|
+
DEFAULT: "hsl(var(--muted))",
|
|
40
|
+
foreground: "hsl(var(--muted-foreground))",
|
|
41
|
+
},
|
|
42
|
+
accent: {
|
|
43
|
+
DEFAULT: "hsl(var(--accent))",
|
|
44
|
+
foreground: "hsl(var(--accent-foreground))",
|
|
45
|
+
},
|
|
46
|
+
popover: {
|
|
47
|
+
DEFAULT: "hsl(var(--popover))",
|
|
48
|
+
foreground: "hsl(var(--popover-foreground))",
|
|
49
|
+
},
|
|
50
|
+
card: {
|
|
51
|
+
DEFAULT: "hsl(var(--card))",
|
|
52
|
+
foreground: "hsl(var(--card-foreground))",
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
borderRadius: {
|
|
56
|
+
lg: "var(--radius)",
|
|
57
|
+
md: "calc(var(--radius) - 2px)",
|
|
58
|
+
sm: "calc(var(--radius) - 4px)",
|
|
59
|
+
},
|
|
60
|
+
keyframes: {
|
|
61
|
+
"accordion-down": {
|
|
62
|
+
from: { height: 0 },
|
|
63
|
+
to: { height: "var(--radix-accordion-content-height)" },
|
|
64
|
+
},
|
|
65
|
+
"accordion-up": {
|
|
66
|
+
from: { height: "var(--radix-accordion-content-height)" },
|
|
67
|
+
to: { height: 0 },
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
animation: {
|
|
71
|
+
"accordion-down": "accordion-down 0.2s ease-out",
|
|
72
|
+
"accordion-up": "accordion-up 0.2s ease-out",
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
plugins: [require("tailwindcss-animate")],
|
|
77
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "es5",
|
|
4
|
+
"lib": ["dom", "dom.iterable", "es6"],
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"jsx": "preserve",
|
|
15
|
+
"incremental": true,
|
|
16
|
+
"plugins": [
|
|
17
|
+
{
|
|
18
|
+
"name": "next"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"baseUrl": ".",
|
|
22
|
+
"paths": {
|
|
23
|
+
"@/*": ["./src/*"],
|
|
24
|
+
"@/components/*": ["./src/components/*"],
|
|
25
|
+
"@/lib/*": ["./src/lib/*"],
|
|
26
|
+
"@/hooks/*": ["./src/hooks/*"],
|
|
27
|
+
"@/types/*": ["./src/types/*"]
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
31
|
+
"exclude": ["node_modules"]
|
|
32
|
+
}
|
|
33
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Auth Configuration
|
|
2
|
+
NEXT_PUBLIC_AUTH_PROVIDER=supabase|firebase
|
|
3
|
+
|
|
4
|
+
# Supabase
|
|
5
|
+
NEXT_PUBLIC_SUPABASE_URL=
|
|
6
|
+
NEXT_PUBLIC_SUPABASE_ANON_KEY=
|
|
7
|
+
|
|
8
|
+
# Firebase
|
|
9
|
+
NEXT_PUBLIC_FIREBASE_API_KEY=
|
|
10
|
+
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
|
|
11
|
+
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
|
|
12
|
+
|
|
13
|
+
# Payments
|
|
14
|
+
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=
|
|
15
|
+
STRIPE_SECRET_KEY=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Auth Configuration
|
|
2
|
+
NEXT_PUBLIC_AUTH_PROVIDER=supabase|firebase
|
|
3
|
+
|
|
4
|
+
# Supabase
|
|
5
|
+
NEXT_PUBLIC_SUPABASE_URL=
|
|
6
|
+
NEXT_PUBLIC_SUPABASE_ANON_KEY=
|
|
7
|
+
|
|
8
|
+
# Firebase
|
|
9
|
+
NEXT_PUBLIC_FIREBASE_API_KEY=
|
|
10
|
+
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
|
|
11
|
+
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
|
|
12
|
+
|
|
13
|
+
# Payments
|
|
14
|
+
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=
|
|
15
|
+
STRIPE_SECRET_KEY=
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{packageName}}",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "{{description}} (with UI Package v0.7.3)",
|
|
5
|
+
"private": true,
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "next dev",
|
|
8
|
+
"build": "next build",
|
|
9
|
+
"start": "next start",
|
|
10
|
+
"lint": "next lint",
|
|
11
|
+
"type-check": "tsc --noEmit"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"next": "15.4.5",
|
|
15
|
+
"react": "19.1.0",
|
|
16
|
+
"react-dom": "19.1.0",
|
|
17
|
+
"@digilogiclabs/saas-factory-ui": "^0.7.3",
|
|
18
|
+
"tailwindcss": "^3.4.0",
|
|
19
|
+
"autoprefixer": "^10.4.16",
|
|
20
|
+
"postcss": "^8.4.31",
|
|
21
|
+
"clsx": "^2.0.0",
|
|
22
|
+
"class-variance-authority": "^0.7.0",
|
|
23
|
+
"tailwind-merge": "^2.0.0",
|
|
24
|
+
"next-themes": "^0.2.1",
|
|
25
|
+
"lucide-react": "^0.292.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"typescript": "^5.3.0",
|
|
29
|
+
"@types/node": "^20.10.0",
|
|
30
|
+
"@types/react": "^18.2.45",
|
|
31
|
+
"@types/react-dom": "^18.2.18",
|
|
32
|
+
"eslint": "^8.55.0",
|
|
33
|
+
"eslint-config-next": "15.4.5",
|
|
34
|
+
"prettier": "^3.1.0",
|
|
35
|
+
"prettier-plugin-tailwindcss": "^0.5.7",
|
|
36
|
+
"@typescript-eslint/eslint-plugin": "^6.14.0",
|
|
37
|
+
"@typescript-eslint/parser": "^6.14.0"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18.0.0"
|
|
41
|
+
}
|
|
42
|
+
}
|