@digilogiclabs/create-saas-app 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/CHANGELOG.md +7 -0
- package/README.md +472 -0
- package/bin/index.js +3 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +20791 -0
- package/dist/index.js.map +1 -0
- package/package.json +105 -0
- package/src/templates/mobile/base/template/App.tsx +47 -0
- package/src/templates/mobile/base/template/package.json +38 -0
- package/src/templates/shared/auth/firebase/web/config.ts +24 -0
- package/src/templates/shared/auth/supabase/web/config.ts +9 -0
- package/src/templates/web/base/template/.env.example +34 -0
- package/src/templates/web/base/template/.eslintrc.js +8 -0
- package/src/templates/web/base/template/README.md +68 -0
- package/src/templates/web/base/template/next.config.js +15 -0
- package/src/templates/web/base/template/package.json +48 -0
- package/src/templates/web/base/template/postcss.config.js +7 -0
- package/src/templates/web/base/template/src/app/globals.css +60 -0
- package/src/templates/web/base/template/src/app/layout.tsx +28 -0
- package/src/templates/web/base/template/src/app/page.tsx +108 -0
- package/src/templates/web/base/template/src/components/providers/app-providers.tsx +21 -0
- package/src/templates/web/base/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/base/template/src/components/ui/button.tsx +56 -0
- package/src/templates/web/base/template/src/components/ui/card.tsx +71 -0
- package/src/templates/web/base/template/src/lib/utils.ts +7 -0
- package/src/templates/web/base/template/tailwind.config.js +77 -0
- package/src/templates/web/base/template/tsconfig.json +33 -0
package/package.json
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@digilogiclabs/create-saas-app",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Create modern SaaS applications with DigitalLogic Labs packages",
|
|
5
|
+
"main": "dist/cli/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"create-saas-app": "bin/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsup",
|
|
11
|
+
"dev": "tsup --watch",
|
|
12
|
+
"test": "jest",
|
|
13
|
+
"test:watch": "jest --watch",
|
|
14
|
+
"test:coverage": "jest --coverage",
|
|
15
|
+
"test:templates": "tsx scripts/test-all-templates.ts",
|
|
16
|
+
"lint": "eslint src --ext .ts,.tsx",
|
|
17
|
+
"lint:fix": "eslint src --ext .ts,.tsx --fix",
|
|
18
|
+
"type-check": "tsc --noEmit",
|
|
19
|
+
"validate": "tsx scripts/validate-templates.ts",
|
|
20
|
+
"update-deps": "tsx scripts/update-dependencies.ts",
|
|
21
|
+
"changeset": "changeset",
|
|
22
|
+
"version": "changeset version",
|
|
23
|
+
"release": "npm run build && changeset publish",
|
|
24
|
+
"prepublishOnly": "npm run build"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"cli",
|
|
28
|
+
"saas",
|
|
29
|
+
"template",
|
|
30
|
+
"nextjs",
|
|
31
|
+
"react-native",
|
|
32
|
+
"expo",
|
|
33
|
+
"typescript",
|
|
34
|
+
"tailwind",
|
|
35
|
+
"firebase",
|
|
36
|
+
"supabase",
|
|
37
|
+
"digilogiclabs"
|
|
38
|
+
],
|
|
39
|
+
"author": "DigitalLogic Labs",
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "git+https://github.com/DigiLogicLabs/create-saas-app.git"
|
|
44
|
+
},
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/DigiLogicLabs/create-saas-app/issues"
|
|
47
|
+
},
|
|
48
|
+
"homepage": "https://github.com/DigiLogicLabs/create-saas-app#readme",
|
|
49
|
+
"files": [
|
|
50
|
+
"dist",
|
|
51
|
+
"bin",
|
|
52
|
+
"src/templates",
|
|
53
|
+
"README.md",
|
|
54
|
+
"CHANGELOG.md"
|
|
55
|
+
],
|
|
56
|
+
"engines": {
|
|
57
|
+
"node": ">=16.0.0"
|
|
58
|
+
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"commander": "^11.1.0",
|
|
61
|
+
"inquirer": "^9.2.12",
|
|
62
|
+
"chalk": "^5.3.0",
|
|
63
|
+
"ora": "^7.0.1",
|
|
64
|
+
"mustache": "^4.2.0",
|
|
65
|
+
"fs-extra": "^11.1.1",
|
|
66
|
+
"glob": "^10.3.10",
|
|
67
|
+
"semver": "^7.5.4",
|
|
68
|
+
"validate-npm-package-name": "^5.0.0",
|
|
69
|
+
"execa": "^8.0.1",
|
|
70
|
+
"listr2": "^7.0.2",
|
|
71
|
+
"cosmiconfig": "^8.3.6",
|
|
72
|
+
"zod": "^3.22.4"
|
|
73
|
+
},
|
|
74
|
+
"devDependencies": {
|
|
75
|
+
"@types/node": "^20.8.7",
|
|
76
|
+
"@types/inquirer": "^9.0.7",
|
|
77
|
+
"@types/mustache": "^4.2.5",
|
|
78
|
+
"@types/fs-extra": "^11.0.4",
|
|
79
|
+
"@types/semver": "^7.5.4",
|
|
80
|
+
"@types/validate-npm-package-name": "^4.0.2",
|
|
81
|
+
"@types/jest": "^29.5.6",
|
|
82
|
+
"@typescript-eslint/eslint-plugin": "^6.9.0",
|
|
83
|
+
"@typescript-eslint/parser": "^6.9.0",
|
|
84
|
+
"@changesets/cli": "^2.26.2",
|
|
85
|
+
"eslint": "^8.52.0",
|
|
86
|
+
"eslint-config-prettier": "^9.0.0",
|
|
87
|
+
"eslint-plugin-prettier": "^5.0.1",
|
|
88
|
+
"jest": "^29.7.0",
|
|
89
|
+
"ts-jest": "^29.1.1",
|
|
90
|
+
"tsx": "^3.14.0",
|
|
91
|
+
"tsup": "^7.2.0",
|
|
92
|
+
"typescript": "^5.2.2",
|
|
93
|
+
"prettier": "^3.0.3"
|
|
94
|
+
},
|
|
95
|
+
"peerDependencies": {
|
|
96
|
+
"typescript": ">=4.9.0"
|
|
97
|
+
},
|
|
98
|
+
"publishConfig": {
|
|
99
|
+
"access": "restricted"
|
|
100
|
+
},
|
|
101
|
+
"directories": {
|
|
102
|
+
"doc": "docs",
|
|
103
|
+
"test": "tests"
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { StatusBar } from 'expo-status-bar';
|
|
3
|
+
import { StyleSheet, Text, View } from 'react-native';
|
|
4
|
+
import { SafeAreaProvider } from 'react-native-safe-area-context';
|
|
5
|
+
|
|
6
|
+
export default function App() {
|
|
7
|
+
return (
|
|
8
|
+
<SafeAreaProvider>
|
|
9
|
+
<View style={styles.container}>
|
|
10
|
+
<Text style={styles.title}>Welcome to {{titleCaseName}}</Text>
|
|
11
|
+
<Text style={styles.subtitle}>{{description}}</Text>
|
|
12
|
+
<Text style={styles.description}>
|
|
13
|
+
Built with Expo and DigitalLogic Labs packages
|
|
14
|
+
</Text>
|
|
15
|
+
<StatusBar style="auto" />
|
|
16
|
+
</View>
|
|
17
|
+
</SafeAreaProvider>
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const styles = StyleSheet.create({
|
|
22
|
+
container: {
|
|
23
|
+
flex: 1,
|
|
24
|
+
backgroundColor: '#fff',
|
|
25
|
+
alignItems: 'center',
|
|
26
|
+
justifyContent: 'center',
|
|
27
|
+
padding: 20,
|
|
28
|
+
},
|
|
29
|
+
title: {
|
|
30
|
+
fontSize: 24,
|
|
31
|
+
fontWeight: 'bold',
|
|
32
|
+
marginBottom: 10,
|
|
33
|
+
textAlign: 'center',
|
|
34
|
+
},
|
|
35
|
+
subtitle: {
|
|
36
|
+
fontSize: 16,
|
|
37
|
+
color: '#666',
|
|
38
|
+
marginBottom: 20,
|
|
39
|
+
textAlign: 'center',
|
|
40
|
+
},
|
|
41
|
+
description: {
|
|
42
|
+
fontSize: 14,
|
|
43
|
+
color: '#999',
|
|
44
|
+
textAlign: 'center',
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{packageName}}",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "{{description}}",
|
|
5
|
+
"main": "node_modules/expo/AppEntry.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"start": "expo start",
|
|
8
|
+
"android": "expo start --android",
|
|
9
|
+
"ios": "expo start --ios",
|
|
10
|
+
"web": "expo start --web",
|
|
11
|
+
"build": "expo build",
|
|
12
|
+
"eject": "expo eject"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"expo": "~49.0.0",
|
|
16
|
+
"react": "18.2.0",
|
|
17
|
+
"react-native": "0.72.6",
|
|
18
|
+
"@expo/vector-icons": "^13.0.0",
|
|
19
|
+
"@react-navigation/native": "^6.1.0",
|
|
20
|
+
"@react-navigation/stack": "^6.3.0",
|
|
21
|
+
"@react-navigation/bottom-tabs": "^6.5.0",
|
|
22
|
+
"react-native-screens": "~3.22.0",
|
|
23
|
+
"react-native-safe-area-context": "4.6.3",
|
|
24
|
+
"react-native-gesture-handler": "~2.12.0",
|
|
25
|
+
"@digilogiclabs/saas-factory-ui": "^1.0.0",
|
|
26
|
+
"@digilogiclabs/saas-factory-auth": "^1.0.0"{{#auth}}{{#firebase}},
|
|
27
|
+
"firebase": "^10.0.0"{{/firebase}}{{#supabase}},
|
|
28
|
+
"@supabase/supabase-js": "^2.0.0"{{/supabase}}{{/auth}}
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@babel/core": "^7.20.0",
|
|
32
|
+
"@types/react": "~18.2.14",
|
|
33
|
+
"@types/react-native": "~0.72.2",
|
|
34
|
+
"typescript": "^5.1.3"
|
|
35
|
+
},
|
|
36
|
+
"private": true
|
|
37
|
+
}
|
|
38
|
+
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { initializeApp } from 'firebase/app';
|
|
2
|
+
import { getAuth } from 'firebase/auth';
|
|
3
|
+
import { getFirestore } from 'firebase/firestore';
|
|
4
|
+
|
|
5
|
+
const firebaseConfig = {
|
|
6
|
+
apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
|
|
7
|
+
authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
|
|
8
|
+
projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
|
|
9
|
+
storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
|
|
10
|
+
messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
|
|
11
|
+
appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
// Initialize Firebase
|
|
15
|
+
const app = initializeApp(firebaseConfig);
|
|
16
|
+
|
|
17
|
+
// Initialize Firebase Authentication and get a reference to the service
|
|
18
|
+
export const auth = getAuth(app);
|
|
19
|
+
|
|
20
|
+
// Initialize Cloud Firestore and get a reference to the service
|
|
21
|
+
export const db = getFirestore(app);
|
|
22
|
+
|
|
23
|
+
export default app;
|
|
24
|
+
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createClient } from '@supabase/supabase-js';
|
|
2
|
+
|
|
3
|
+
const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL!;
|
|
4
|
+
const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!;
|
|
5
|
+
|
|
6
|
+
export const supabase = createClient(supabaseUrl, supabaseAnonKey);
|
|
7
|
+
|
|
8
|
+
export default supabase;
|
|
9
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# App Configuration
|
|
2
|
+
NEXT_PUBLIC_APP_NAME={{projectName}}
|
|
3
|
+
NEXT_PUBLIC_APP_URL=http://localhost:3000
|
|
4
|
+
|
|
5
|
+
{{#auth}}
|
|
6
|
+
{{#firebase}}
|
|
7
|
+
# Firebase Configuration
|
|
8
|
+
NEXT_PUBLIC_FIREBASE_API_KEY=your_firebase_api_key
|
|
9
|
+
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=your_project.firebaseapp.com
|
|
10
|
+
NEXT_PUBLIC_FIREBASE_PROJECT_ID=your_project_id
|
|
11
|
+
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=your_project.appspot.com
|
|
12
|
+
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=your_sender_id
|
|
13
|
+
NEXT_PUBLIC_FIREBASE_APP_ID=your_app_id
|
|
14
|
+
{{/firebase}}
|
|
15
|
+
{{#supabase}}
|
|
16
|
+
# Supabase Configuration
|
|
17
|
+
NEXT_PUBLIC_SUPABASE_URL=your_supabase_url
|
|
18
|
+
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
|
|
19
|
+
{{/supabase}}
|
|
20
|
+
{{/auth}}
|
|
21
|
+
|
|
22
|
+
# Database Configuration
|
|
23
|
+
{{#database}}
|
|
24
|
+
{{#supabase}}
|
|
25
|
+
DATABASE_URL=your_database_url
|
|
26
|
+
{{/supabase}}
|
|
27
|
+
{{#firebase}}
|
|
28
|
+
# Firebase Admin (Server-side)
|
|
29
|
+
FIREBASE_ADMIN_PROJECT_ID=your_project_id
|
|
30
|
+
FIREBASE_ADMIN_CLIENT_EMAIL=your_service_account_email
|
|
31
|
+
FIREBASE_ADMIN_PRIVATE_KEY=your_private_key
|
|
32
|
+
{{/firebase}}
|
|
33
|
+
{{/database}}
|
|
34
|
+
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# {{titleCaseName}}
|
|
2
|
+
|
|
3
|
+
{{description}}
|
|
4
|
+
|
|
5
|
+
## Getting Started
|
|
6
|
+
|
|
7
|
+
First, run the development server:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm run dev
|
|
11
|
+
# or
|
|
12
|
+
yarn dev
|
|
13
|
+
# or
|
|
14
|
+
pnpm dev
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
|
18
|
+
|
|
19
|
+
## Features
|
|
20
|
+
|
|
21
|
+
- ⚡ **Next.js 14** - React framework with App Router
|
|
22
|
+
- 🎨 **Tailwind CSS** - Utility-first CSS framework
|
|
23
|
+
- 🔒 **{{#auth}}{{#firebase}}Firebase{{/firebase}}{{#supabase}}Supabase{{/supabase}}{{/auth}} Auth** - Authentication ready
|
|
24
|
+
- 📱 **Responsive Design** - Mobile-first approach
|
|
25
|
+
- 🌙 **Dark Mode** - Built-in theme switching
|
|
26
|
+
- 📦 **TypeScript** - Type-safe development
|
|
27
|
+
- 🎯 **ESLint & Prettier** - Code quality tools
|
|
28
|
+
|
|
29
|
+
## Project Structure
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
src/
|
|
33
|
+
├── app/ # Next.js App Router
|
|
34
|
+
│ ├── globals.css # Global styles
|
|
35
|
+
│ ├── layout.tsx # Root layout
|
|
36
|
+
│ └── page.tsx # Home page
|
|
37
|
+
├── components/ # React components
|
|
38
|
+
│ ├── ui/ # UI components
|
|
39
|
+
│ └── providers/ # Context providers
|
|
40
|
+
├── lib/ # Utility functions
|
|
41
|
+
├── hooks/ # Custom React hooks
|
|
42
|
+
└── types/ # TypeScript definitions
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Environment Variables
|
|
46
|
+
|
|
47
|
+
Copy `.env.example` to `.env.local` and fill in your configuration:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
cp .env.example .env.local
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Deployment
|
|
54
|
+
|
|
55
|
+
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new).
|
|
56
|
+
|
|
57
|
+
Check out the [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
|
|
58
|
+
|
|
59
|
+
## Learn More
|
|
60
|
+
|
|
61
|
+
- [Next.js Documentation](https://nextjs.org/docs)
|
|
62
|
+
- [Tailwind CSS Documentation](https://tailwindcss.com/docs)
|
|
63
|
+
- [{{#auth}}{{#firebase}}Firebase Documentation{{/firebase}}{{#supabase}}Supabase Documentation{{/supabase}}{{/auth}}]({{#auth}}{{#firebase}}https://firebase.google.com/docs{{/firebase}}{{#supabase}}https://supabase.com/docs{{/supabase}}{{/auth}})
|
|
64
|
+
|
|
65
|
+
## Support
|
|
66
|
+
|
|
67
|
+
For support, email support@digilogiclabs.com or join our Discord community.
|
|
68
|
+
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{packageName}}",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "{{description}}",
|
|
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": "^14.0.0",
|
|
15
|
+
"react": "^18.0.0",
|
|
16
|
+
"react-dom": "^18.0.0",
|
|
17
|
+
"@digilogiclabs/saas-factory-ui": "^1.0.0",
|
|
18
|
+
"@digilogiclabs/saas-factory-auth": "^1.0.0",
|
|
19
|
+
"tailwindcss": "^3.3.0",
|
|
20
|
+
"autoprefixer": "^10.4.16",
|
|
21
|
+
"postcss": "^8.4.31",
|
|
22
|
+
"clsx": "^2.0.0",
|
|
23
|
+
"class-variance-authority": "^0.7.0",
|
|
24
|
+
"tailwind-merge": "^2.0.0",
|
|
25
|
+
"next-themes": "^0.2.1",
|
|
26
|
+
"@radix-ui/react-slot": "^1.0.2",
|
|
27
|
+
"tailwindcss-animate": "^1.0.7",
|
|
28
|
+
"lucide-react": "^0.292.0"{{#auth}}{{#firebase}},
|
|
29
|
+
"firebase": "^10.0.0"{{/firebase}}{{#supabase}},
|
|
30
|
+
"@supabase/supabase-js": "^2.0.0"{{/supabase}}{{/auth}}
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"typescript": "^5.0.0",
|
|
34
|
+
"@types/node": "^20.0.0",
|
|
35
|
+
"@types/react": "^18.0.0",
|
|
36
|
+
"@types/react-dom": "^18.0.0",
|
|
37
|
+
"eslint": "^8.0.0",
|
|
38
|
+
"eslint-config-next": "^14.0.0",
|
|
39
|
+
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
40
|
+
"@typescript-eslint/parser": "^6.0.0",
|
|
41
|
+
"prettier": "^3.0.0",
|
|
42
|
+
"prettier-plugin-tailwindcss": "^0.5.0"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=18.0.0"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
@tailwind base;
|
|
2
|
+
@tailwind components;
|
|
3
|
+
@tailwind utilities;
|
|
4
|
+
|
|
5
|
+
@layer base {
|
|
6
|
+
:root {
|
|
7
|
+
--background: 0 0% 100%;
|
|
8
|
+
--foreground: 222.2 84% 4.9%;
|
|
9
|
+
--card: 0 0% 100%;
|
|
10
|
+
--card-foreground: 222.2 84% 4.9%;
|
|
11
|
+
--popover: 0 0% 100%;
|
|
12
|
+
--popover-foreground: 222.2 84% 4.9%;
|
|
13
|
+
--primary: 221.2 83.2% 53.3%;
|
|
14
|
+
--primary-foreground: 210 40% 98%;
|
|
15
|
+
--secondary: 210 40% 96%;
|
|
16
|
+
--secondary-foreground: 222.2 84% 4.9%;
|
|
17
|
+
--muted: 210 40% 96%;
|
|
18
|
+
--muted-foreground: 215.4 16.3% 46.9%;
|
|
19
|
+
--accent: 210 40% 96%;
|
|
20
|
+
--accent-foreground: 222.2 84% 4.9%;
|
|
21
|
+
--destructive: 0 84.2% 60.2%;
|
|
22
|
+
--destructive-foreground: 210 40% 98%;
|
|
23
|
+
--border: 214.3 31.8% 91.4%;
|
|
24
|
+
--input: 214.3 31.8% 91.4%;
|
|
25
|
+
--ring: 221.2 83.2% 53.3%;
|
|
26
|
+
--radius: 0.5rem;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.dark {
|
|
30
|
+
--background: 222.2 84% 4.9%;
|
|
31
|
+
--foreground: 210 40% 98%;
|
|
32
|
+
--card: 222.2 84% 4.9%;
|
|
33
|
+
--card-foreground: 210 40% 98%;
|
|
34
|
+
--popover: 222.2 84% 4.9%;
|
|
35
|
+
--popover-foreground: 210 40% 98%;
|
|
36
|
+
--primary: 217.2 91.2% 59.8%;
|
|
37
|
+
--primary-foreground: 222.2 84% 4.9%;
|
|
38
|
+
--secondary: 217.2 32.6% 17.5%;
|
|
39
|
+
--secondary-foreground: 210 40% 98%;
|
|
40
|
+
--muted: 217.2 32.6% 17.5%;
|
|
41
|
+
--muted-foreground: 215 20.2% 65.1%;
|
|
42
|
+
--accent: 217.2 32.6% 17.5%;
|
|
43
|
+
--accent-foreground: 210 40% 98%;
|
|
44
|
+
--destructive: 0 62.8% 30.6%;
|
|
45
|
+
--destructive-foreground: 210 40% 98%;
|
|
46
|
+
--border: 217.2 32.6% 17.5%;
|
|
47
|
+
--input: 217.2 32.6% 17.5%;
|
|
48
|
+
--ring: 224.3 76.3% 94.1%;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@layer base {
|
|
53
|
+
* {
|
|
54
|
+
@apply border-border;
|
|
55
|
+
}
|
|
56
|
+
body {
|
|
57
|
+
@apply bg-background text-foreground;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Metadata } from 'next'
|
|
2
|
+
import { Inter } from 'next/font/google'
|
|
3
|
+
import './globals.css'
|
|
4
|
+
import { AppProviders } from '@/components/providers/app-providers'
|
|
5
|
+
|
|
6
|
+
const inter = Inter({ subsets: ['latin'] })
|
|
7
|
+
|
|
8
|
+
export const metadata: Metadata = {
|
|
9
|
+
title: '{{titleCaseName}}',
|
|
10
|
+
description: '{{description}}',
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export default function RootLayout({
|
|
14
|
+
children,
|
|
15
|
+
}: {
|
|
16
|
+
children: React.ReactNode
|
|
17
|
+
}) {
|
|
18
|
+
return (
|
|
19
|
+
<html lang="en" suppressHydrationWarning>
|
|
20
|
+
<body className={inter.className}>
|
|
21
|
+
<AppProviders>
|
|
22
|
+
{children}
|
|
23
|
+
</AppProviders>
|
|
24
|
+
</body>
|
|
25
|
+
</html>
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Button } from '@/components/ui/button'
|
|
2
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
|
|
3
|
+
import { Badge } from '@/components/ui/badge'
|
|
4
|
+
import { ArrowRight, Zap, Shield, Rocket } from 'lucide-react'
|
|
5
|
+
|
|
6
|
+
export default function Home() {
|
|
7
|
+
return (
|
|
8
|
+
<main className="min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800">
|
|
9
|
+
<div className="container mx-auto px-4 py-16">
|
|
10
|
+
{/* Hero Section */}
|
|
11
|
+
<div className="text-center mb-16">
|
|
12
|
+
<Badge variant="secondary" className="mb-4">
|
|
13
|
+
Built with DigitalLogic Labs
|
|
14
|
+
</Badge>
|
|
15
|
+
<h1 className="text-4xl md:text-6xl font-bold text-gray-900 dark:text-white mb-6">
|
|
16
|
+
Welcome to{' '}
|
|
17
|
+
<span className="text-blue-600 dark:text-blue-400">{{titleCaseName}}</span>
|
|
18
|
+
</h1>
|
|
19
|
+
<p className="text-xl text-gray-600 dark:text-gray-300 mb-8 max-w-2xl mx-auto">
|
|
20
|
+
{{description}}. Get started by editing{' '}
|
|
21
|
+
<code className="bg-gray-100 dark:bg-gray-800 px-2 py-1 rounded text-sm">
|
|
22
|
+
src/app/page.tsx
|
|
23
|
+
</code>
|
|
24
|
+
</p>
|
|
25
|
+
<div className="flex flex-col sm:flex-row gap-4 justify-center">
|
|
26
|
+
<Button size="lg" className="text-lg px-8">
|
|
27
|
+
Get Started
|
|
28
|
+
<ArrowRight className="ml-2 h-5 w-5" />
|
|
29
|
+
</Button>
|
|
30
|
+
<Button variant="outline" size="lg" className="text-lg px-8">
|
|
31
|
+
Learn More
|
|
32
|
+
</Button>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
{/* Features Grid */}
|
|
37
|
+
<div className="grid md:grid-cols-3 gap-8 mb-16">
|
|
38
|
+
<Card className="text-center">
|
|
39
|
+
<CardHeader>
|
|
40
|
+
<div className="mx-auto w-12 h-12 bg-blue-100 dark:bg-blue-900 rounded-lg flex items-center justify-center mb-4">
|
|
41
|
+
<Zap className="h-6 w-6 text-blue-600 dark:text-blue-400" />
|
|
42
|
+
</div>
|
|
43
|
+
<CardTitle>Lightning Fast</CardTitle>
|
|
44
|
+
<CardDescription>
|
|
45
|
+
Built with Next.js 14 and optimized for performance
|
|
46
|
+
</CardDescription>
|
|
47
|
+
</CardHeader>
|
|
48
|
+
</Card>
|
|
49
|
+
|
|
50
|
+
<Card className="text-center">
|
|
51
|
+
<CardHeader>
|
|
52
|
+
<div className="mx-auto w-12 h-12 bg-green-100 dark:bg-green-900 rounded-lg flex items-center justify-center mb-4">
|
|
53
|
+
<Shield className="h-6 w-6 text-green-600 dark:text-green-400" />
|
|
54
|
+
</div>
|
|
55
|
+
<CardTitle>Secure by Default</CardTitle>
|
|
56
|
+
<CardDescription>
|
|
57
|
+
{{#auth}}{{#firebase}}Firebase{{/firebase}}{{#supabase}}Supabase{{/supabase}}{{/auth}} authentication and security best practices
|
|
58
|
+
</CardDescription>
|
|
59
|
+
</CardHeader>
|
|
60
|
+
</Card>
|
|
61
|
+
|
|
62
|
+
<Card className="text-center">
|
|
63
|
+
<CardHeader>
|
|
64
|
+
<div className="mx-auto w-12 h-12 bg-purple-100 dark:bg-purple-900 rounded-lg flex items-center justify-center mb-4">
|
|
65
|
+
<Rocket className="h-6 w-6 text-purple-600 dark:text-purple-400" />
|
|
66
|
+
</div>
|
|
67
|
+
<CardTitle>Ready to Scale</CardTitle>
|
|
68
|
+
<CardDescription>
|
|
69
|
+
Production-ready with TypeScript, Tailwind CSS, and modern tooling
|
|
70
|
+
</CardDescription>
|
|
71
|
+
</CardHeader>
|
|
72
|
+
</Card>
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
{/* Tech Stack */}
|
|
76
|
+
<Card className="max-w-4xl mx-auto">
|
|
77
|
+
<CardHeader className="text-center">
|
|
78
|
+
<CardTitle className="text-2xl">Built with Modern Technologies</CardTitle>
|
|
79
|
+
<CardDescription>
|
|
80
|
+
This template includes everything you need to build a modern SaaS application
|
|
81
|
+
</CardDescription>
|
|
82
|
+
</CardHeader>
|
|
83
|
+
<CardContent>
|
|
84
|
+
<div className="grid grid-cols-2 md:grid-cols-4 gap-4 text-center">
|
|
85
|
+
<div className="p-4">
|
|
86
|
+
<div className="font-semibold">Next.js 14</div>
|
|
87
|
+
<div className="text-sm text-gray-600 dark:text-gray-400">React Framework</div>
|
|
88
|
+
</div>
|
|
89
|
+
<div className="p-4">
|
|
90
|
+
<div className="font-semibold">TypeScript</div>
|
|
91
|
+
<div className="text-sm text-gray-600 dark:text-gray-400">Type Safety</div>
|
|
92
|
+
</div>
|
|
93
|
+
<div className="p-4">
|
|
94
|
+
<div className="font-semibold">Tailwind CSS</div>
|
|
95
|
+
<div className="text-sm text-gray-600 dark:text-gray-400">Styling</div>
|
|
96
|
+
</div>
|
|
97
|
+
<div className="p-4">
|
|
98
|
+
<div className="font-semibold">{{#auth}}{{#firebase}}Firebase{{/firebase}}{{#supabase}}Supabase{{/supabase}}{{/auth}}</div>
|
|
99
|
+
<div className="text-sm text-gray-600 dark:text-gray-400">Authentication</div>
|
|
100
|
+
</div>
|
|
101
|
+
</div>
|
|
102
|
+
</CardContent>
|
|
103
|
+
</Card>
|
|
104
|
+
</div>
|
|
105
|
+
</main>
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { ThemeProvider } from 'next-themes'
|
|
4
|
+
|
|
5
|
+
interface AppProvidersProps {
|
|
6
|
+
children: React.ReactNode
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function AppProviders({ children }: AppProvidersProps) {
|
|
10
|
+
return (
|
|
11
|
+
<ThemeProvider
|
|
12
|
+
attribute="class"
|
|
13
|
+
defaultTheme="system"
|
|
14
|
+
enableSystem
|
|
15
|
+
disableTransitionOnChange
|
|
16
|
+
>
|
|
17
|
+
{children}
|
|
18
|
+
</ThemeProvider>
|
|
19
|
+
)
|
|
20
|
+
}
|
|
21
|
+
|
|
@@ -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
|
+
|