@digilogiclabs/create-saas-app 1.1.2 → 1.4.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 -7
- package/README.md +46 -22
- package/bin/index.js +36 -36
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.js +59 -15
- package/dist/index.js.map +1 -1
- package/dist/templates/mobile/base/template/.env.example +15 -15
- package/dist/templates/mobile/base/template/app/checkout.tsx +20 -20
- package/dist/templates/web/base/template/src/app/checkout/page.tsx +28 -28
- package/dist/templates/web/ui-auth/template/next.config.js +12 -0
- package/dist/templates/web/ui-auth/template/package.json +40 -0
- package/dist/templates/web/ui-auth/template/postcss.config.js +7 -0
- package/dist/templates/web/ui-auth/template/src/app/auth/callback/route.ts +12 -0
- package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth}/template/src/app/checkout/page.tsx +25 -28
- package/dist/templates/web/ui-auth/template/src/app/globals.css +42 -0
- package/dist/templates/web/ui-auth/template/src/app/layout.tsx +29 -0
- package/dist/templates/web/ui-auth/template/src/app/login/page.tsx +109 -0
- package/dist/templates/web/ui-auth/template/src/app/page.tsx +129 -0
- package/dist/templates/web/ui-auth/template/src/app/signup/page.tsx +128 -0
- package/dist/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +25 -0
- package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth}/template/src/components/shared/header.tsx +17 -8
- package/dist/templates/web/ui-auth/template/src/components/ui/badge.tsx +36 -0
- package/dist/templates/web/ui-auth/template/src/lib/utils.ts +7 -0
- package/dist/templates/web/ui-auth/template/tailwind.config.js +77 -0
- package/dist/templates/web/ui-auth/template/tsconfig.json +33 -0
- package/dist/templates/web/ui-auth-payments/template/README.md +165 -0
- package/dist/templates/web/ui-auth-payments/template/next.config.js +12 -0
- package/dist/templates/web/ui-auth-payments/template/package.json +42 -0
- package/dist/templates/web/ui-auth-payments/template/postcss.config.js +7 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/auth/callback/route.ts +12 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +211 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +142 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/globals.css +42 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/layout.tsx +29 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/login/page.tsx +109 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/page.tsx +143 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +128 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +28 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +60 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/ui/badge.tsx +36 -0
- package/dist/templates/web/ui-auth-payments/template/src/lib/utils.ts +7 -0
- package/dist/templates/web/ui-auth-payments/template/tailwind.config.js +77 -0
- package/dist/templates/web/ui-auth-payments/template/tsconfig.json +33 -0
- package/dist/templates/web/ui-auth-payments-audio/template/README.md +187 -0
- package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-audio}/template/next.config.js +0 -3
- package/dist/templates/web/ui-auth-payments-audio/template/package.json +42 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/auth/callback/route.ts +12 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +211 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +142 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/login/page.tsx +109 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +181 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/signup/page.tsx +128 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +28 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +60 -0
- package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-audio}/template/tailwind.config.js +1 -1
- package/dist/templates/web/ui-auth-payments-video/template/README.md +190 -0
- package/dist/templates/web/{web-ui-package → ui-auth-payments-video}/template/next.config.js +0 -3
- package/dist/templates/web/ui-auth-payments-video/template/package.json +42 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/auth/callback/route.ts +12 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +211 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +142 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +109 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/page.tsx +187 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +128 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +28 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +60 -0
- package/dist/templates/web/{web-ui-package → ui-auth-payments-video}/template/tailwind.config.js +1 -1
- package/dist/templates/web/ui-only/template/next.config.js +12 -0
- package/dist/templates/web/{web-ui-package → ui-only}/template/package.json +3 -3
- package/dist/templates/web/ui-only/template/postcss.config.js +7 -0
- package/dist/templates/web/ui-only/template/src/app/auth/callback/route.ts +12 -0
- package/dist/templates/web/{web-ui-package → ui-only}/template/src/app/checkout/page.tsx +25 -28
- package/dist/templates/web/ui-only/template/src/app/globals.css +42 -0
- package/dist/templates/web/ui-only/template/src/app/layout.tsx +29 -0
- package/dist/templates/web/ui-only/template/src/app/login/page.tsx +63 -0
- package/dist/templates/web/ui-only/template/src/app/signup/page.tsx +79 -0
- package/dist/templates/web/ui-only/template/src/components/providers/app-providers.tsx +22 -0
- package/dist/templates/web/{web-ui-package → ui-only}/template/src/components/shared/header.tsx +17 -8
- package/dist/templates/web/ui-only/template/src/components/ui/badge.tsx +36 -0
- package/dist/templates/web/ui-only/template/src/lib/utils.ts +7 -0
- package/dist/templates/web/ui-only/template/tailwind.config.js +77 -0
- package/dist/templates/web/ui-only/template/tsconfig.json +33 -0
- package/dist/templates/web/ui-package-test/template/package.json +2 -2
- package/package.json +1 -1
- package/src/templates/mobile/base/template/.env.example +15 -15
- package/src/templates/mobile/base/template/app/checkout.tsx +20 -20
- package/src/templates/web/base/template/src/app/checkout/page.tsx +28 -28
- package/src/templates/web/ui-auth/template/README.md +68 -0
- package/src/templates/web/ui-auth/template/next.config.js +12 -0
- package/src/templates/web/ui-auth/template/package.json +40 -0
- package/src/templates/web/ui-auth/template/postcss.config.js +7 -0
- package/src/templates/web/ui-auth/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-auth/template/src/app/checkout/page.tsx +25 -0
- package/src/templates/web/ui-auth/template/src/app/globals.css +42 -0
- package/src/templates/web/ui-auth/template/src/app/layout.tsx +29 -0
- package/src/templates/web/ui-auth/template/src/app/login/page.tsx +109 -0
- package/src/templates/web/ui-auth/template/src/app/page.tsx +129 -0
- package/src/templates/web/ui-auth/template/src/app/signup/page.tsx +128 -0
- package/src/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +25 -0
- package/src/templates/web/ui-auth/template/src/components/shared/header.tsx +51 -0
- package/src/templates/web/ui-auth/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-auth/template/src/lib/utils.ts +7 -0
- package/src/templates/web/ui-auth/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-auth/template/tsconfig.json +33 -0
- package/src/templates/web/ui-auth-payments/template/README.md +165 -0
- package/src/templates/web/ui-auth-payments/template/next.config.js +12 -0
- package/src/templates/web/ui-auth-payments/template/package.json +42 -0
- package/src/templates/web/ui-auth-payments/template/postcss.config.js +7 -0
- package/src/templates/web/ui-auth-payments/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +211 -0
- package/src/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +142 -0
- package/src/templates/web/ui-auth-payments/template/src/app/globals.css +42 -0
- package/src/templates/web/ui-auth-payments/template/src/app/layout.tsx +29 -0
- package/src/templates/web/ui-auth-payments/template/src/app/login/page.tsx +109 -0
- package/src/templates/web/ui-auth-payments/template/src/app/page.tsx +143 -0
- package/src/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +128 -0
- package/src/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +28 -0
- package/src/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +60 -0
- package/src/templates/web/ui-auth-payments/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-auth-payments/template/src/lib/utils.ts +7 -0
- package/src/templates/web/ui-auth-payments/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-auth-payments/template/tsconfig.json +33 -0
- package/src/templates/web/ui-auth-payments-audio/template/README.md +187 -0
- package/src/templates/web/ui-auth-payments-audio/template/next.config.js +12 -0
- package/src/templates/web/ui-auth-payments-audio/template/package.json +42 -0
- package/src/templates/web/ui-auth-payments-audio/template/postcss.config.js +7 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +211 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +142 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/globals.css +42 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +29 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/login/page.tsx +109 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +181 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/signup/page.tsx +128 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +28 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +60 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/lib/utils.ts +7 -0
- package/src/templates/web/ui-auth-payments-audio/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-auth-payments-audio/template/tsconfig.json +33 -0
- package/src/templates/web/ui-auth-payments-video/template/README.md +190 -0
- package/src/templates/web/ui-auth-payments-video/template/next.config.js +12 -0
- package/src/templates/web/ui-auth-payments-video/template/package.json +42 -0
- package/src/templates/web/ui-auth-payments-video/template/postcss.config.js +7 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +211 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +142 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/globals.css +42 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +29 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +109 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/page.tsx +187 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +128 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +28 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +60 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-auth-payments-video/template/src/lib/utils.ts +7 -0
- package/src/templates/web/ui-auth-payments-video/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-auth-payments-video/template/tsconfig.json +33 -0
- package/src/templates/web/ui-only/template/.env.example +15 -0
- package/src/templates/web/ui-only/template/README.md +68 -0
- package/src/templates/web/ui-only/template/next.config.js +12 -0
- package/src/templates/web/{web-ui-package → ui-only}/template/package.json +3 -3
- package/src/templates/web/ui-only/template/postcss.config.js +7 -0
- package/src/templates/web/ui-only/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-only/template/src/app/checkout/page.tsx +25 -0
- package/src/templates/web/ui-only/template/src/app/globals.css +42 -0
- package/src/templates/web/ui-only/template/src/app/layout.tsx +29 -0
- package/src/templates/web/ui-only/template/src/app/login/page.tsx +63 -0
- package/src/templates/web/ui-only/template/src/app/signup/page.tsx +79 -0
- package/src/templates/web/ui-only/template/src/components/providers/app-providers.tsx +22 -0
- package/src/templates/web/ui-only/template/src/components/shared/header.tsx +51 -0
- package/src/templates/web/ui-only/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-only/template/src/lib/utils.ts +7 -0
- package/src/templates/web/ui-only/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-only/template/tsconfig.json +33 -0
- package/src/templates/web/ui-only/template.backup/.env.example +15 -0
- package/{dist/mobile/base/template → src/templates/web/ui-only/template.backup.20250817}/.env.example +15 -15
- package/src/templates/web/ui-package-test/template/package.json +2 -2
- package/dist/templates/web/web-ui-package/template/src/app/auth/callback/route.ts +0 -18
- package/dist/templates/web/web-ui-package/template/src/app/login/page.tsx +0 -39
- package/dist/templates/web/web-ui-package/template/src/app/signup/page.tsx +0 -39
- package/dist/templates/web/web-ui-package/template/src/components/providers/app-providers.tsx +0 -29
- package/src/templates/web/web-ui-package/template/.eslintrc.js +0 -8
- package/src/templates/web/web-ui-package/template/src/app/auth/callback/route.ts +0 -18
- package/src/templates/web/web-ui-package/template/src/app/login/page.tsx +0 -39
- package/src/templates/web/web-ui-package/template/src/app/signup/page.tsx +0 -39
- package/src/templates/web/web-ui-package/template/src/components/providers/app-providers.tsx +0 -29
- /package/dist/{web/base → templates/web/ui-auth}/template/.env.example +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth}/template/.eslintrc.js +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth}/template/README.md +0 -0
- /package/dist/{web/base → templates/web/ui-auth}/template.backup/.env.example +0 -0
- /package/dist/{web/base → templates/web/ui-auth}/template.backup.20250817/.env.example +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments}/template/.env.example +0 -0
- /package/dist/templates/web/{web-ui-package/template.backup.20250817 → ui-auth-payments-audio/template}/.env.example +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/postcss.config.js +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/src/app/globals.css +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/src/app/layout.tsx +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/src/components/ui/badge.tsx +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/src/lib/utils.ts +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/tsconfig.json +0 -0
- /package/dist/templates/web/{web-ui-package/template.backup → ui-auth-payments-video/template}/.env.example +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/postcss.config.js +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/src/app/globals.css +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/src/app/layout.tsx +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/src/components/ui/badge.tsx +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/src/lib/utils.ts +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/tsconfig.json +0 -0
- /package/dist/{web/ui-package-test → templates/web/ui-only}/template/.env.example +0 -0
- /package/dist/{web/base → templates/web/ui-only}/template/.eslintrc.js +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-only}/template/README.md +0 -0
- /package/dist/templates/web/{web-ui-package → ui-only}/template/src/app/page.tsx +0 -0
- /package/dist/{web/ui-package-test → templates/web/ui-only}/template.backup/.env.example +0 -0
- /package/dist/{web/ui-package-test → templates/web/ui-only}/template.backup.20250817/.env.example +0 -0
- /package/src/templates/web/{web-ui-package → ui-auth}/template/.env.example +0 -0
- /package/{dist/web/ui-package-test → src/templates/web/ui-auth}/template/.eslintrc.js +0 -0
- /package/src/templates/web/{web-ui-package → ui-auth}/template.backup/.env.example +0 -0
- /package/src/templates/web/{web-ui-package → ui-auth}/template.backup.20250817/.env.example +0 -0
- /package/{dist/web/web-ui-package → src/templates/web/ui-auth-payments}/template/.env.example +0 -0
- /package/{dist/web/web-ui-package/template.backup.20250817 → src/templates/web/ui-auth-payments-audio/template}/.env.example +0 -0
- /package/{dist/web/web-ui-package/template.backup → src/templates/web/ui-auth-payments-video/template}/.env.example +0 -0
- /package/{dist/web/web-ui-package → src/templates/web/ui-only}/template/.eslintrc.js +0 -0
- /package/src/templates/web/{web-ui-package → ui-only}/template/src/app/page.tsx +0 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# {{titleCaseName}}
|
|
2
|
+
|
|
3
|
+
{{description}}
|
|
4
|
+
|
|
5
|
+
This is a Next.js 15 project created with the **Video Player App** template from `@digilogiclabs/create-saas-app`. It includes:
|
|
6
|
+
|
|
7
|
+
- 🎬 **Video Player** - Advanced video streaming capabilities
|
|
8
|
+
- 🎨 **UI Components** - @digilogiclabs/saas-factory-ui v0.10.0 with video player
|
|
9
|
+
- 🔐 **Authentication** - @digilogiclabs/saas-factory-auth v0.4.4
|
|
10
|
+
- 💳 **Payments** - @digilogiclabs/saas-factory-payments v0.3.0
|
|
11
|
+
- ⚡ **Next.js 15** - Latest React framework
|
|
12
|
+
- 🎯 **TypeScript** - Full type safety
|
|
13
|
+
- 🎨 **Tailwind CSS** - Utility-first styling
|
|
14
|
+
- 🌙 **Dark Mode** - Built-in theme support
|
|
15
|
+
|
|
16
|
+
## Features
|
|
17
|
+
|
|
18
|
+
### Video Player
|
|
19
|
+
- Comprehensive video player with quality selection
|
|
20
|
+
- Fullscreen support and playlist functionality
|
|
21
|
+
- Custom controls overlay with auto-hide
|
|
22
|
+
- Progress tracking and seeking
|
|
23
|
+
- Volume controls and mute
|
|
24
|
+
- Cross-platform support (Web + React Native)
|
|
25
|
+
|
|
26
|
+
### Authentication
|
|
27
|
+
- User registration and login
|
|
28
|
+
- Protected routes
|
|
29
|
+
- Session management
|
|
30
|
+
- Sign out functionality
|
|
31
|
+
|
|
32
|
+
### Payments Integration
|
|
33
|
+
- Subscription plans display
|
|
34
|
+
- Payment form with Stripe integration
|
|
35
|
+
- Billing history
|
|
36
|
+
- Payment method management
|
|
37
|
+
- Subscription management
|
|
38
|
+
|
|
39
|
+
### UI Components
|
|
40
|
+
- Modern, accessible components including VideoPlayer
|
|
41
|
+
- Dark/light theme support
|
|
42
|
+
- Responsive design
|
|
43
|
+
- TypeScript definitions
|
|
44
|
+
|
|
45
|
+
## Getting Started
|
|
46
|
+
|
|
47
|
+
### Prerequisites
|
|
48
|
+
- Node.js 18+
|
|
49
|
+
- npm, yarn, or pnpm
|
|
50
|
+
|
|
51
|
+
### Installation
|
|
52
|
+
|
|
53
|
+
1. Install dependencies:
|
|
54
|
+
```bash
|
|
55
|
+
npm install
|
|
56
|
+
# or
|
|
57
|
+
yarn install
|
|
58
|
+
# or
|
|
59
|
+
pnpm install
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
2. Set up environment variables:
|
|
63
|
+
```bash
|
|
64
|
+
cp .env.example .env.local
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Edit `.env.local` with your configuration:
|
|
68
|
+
```env
|
|
69
|
+
# Authentication (choose one)
|
|
70
|
+
NEXT_PUBLIC_FIREBASE_API_KEY=your_firebase_api_key
|
|
71
|
+
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=your_project.firebaseapp.com
|
|
72
|
+
NEXT_PUBLIC_FIREBASE_PROJECT_ID=your_project_id
|
|
73
|
+
|
|
74
|
+
# OR
|
|
75
|
+
|
|
76
|
+
NEXT_PUBLIC_SUPABASE_URL=your_supabase_url
|
|
77
|
+
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
|
|
78
|
+
|
|
79
|
+
# Payments
|
|
80
|
+
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=your_stripe_publishable_key
|
|
81
|
+
STRIPE_SECRET_KEY=your_stripe_secret_key
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
3. Run the development server:
|
|
85
|
+
```bash
|
|
86
|
+
npm run dev
|
|
87
|
+
# or
|
|
88
|
+
yarn dev
|
|
89
|
+
# or
|
|
90
|
+
pnpm dev
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
|
94
|
+
|
|
95
|
+
## Available Pages
|
|
96
|
+
|
|
97
|
+
- `/` - Home page with feature showcase
|
|
98
|
+
- `/login` - User authentication
|
|
99
|
+
- `/signup` - User registration
|
|
100
|
+
- `/checkout` - Subscription plans and payment
|
|
101
|
+
- `/billing` - Subscription and billing management
|
|
102
|
+
|
|
103
|
+
## Package Integration
|
|
104
|
+
|
|
105
|
+
### UI Package (@digilogiclabs/saas-factory-ui)
|
|
106
|
+
```tsx
|
|
107
|
+
import { Button, Card, VideoPlayer } from '@digilogiclabs/saas-factory-ui'
|
|
108
|
+
|
|
109
|
+
<Button variant="primary">Click me</Button>
|
|
110
|
+
<Card>Content here</Card>
|
|
111
|
+
<VideoPlayer
|
|
112
|
+
videos={[
|
|
113
|
+
{
|
|
114
|
+
id: '1',
|
|
115
|
+
title: 'Video Title',
|
|
116
|
+
description: 'Video description',
|
|
117
|
+
duration: 300,
|
|
118
|
+
src: '/path/to/video.mp4',
|
|
119
|
+
thumbnail: '/path/to/thumbnail.jpg',
|
|
120
|
+
qualities: [
|
|
121
|
+
{ label: '480p', src: '/path/to/480p.mp4' },
|
|
122
|
+
{ label: '720p', src: '/path/to/720p.mp4' }
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
]}
|
|
126
|
+
/>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Auth Package (@digilogiclabs/saas-factory-auth)
|
|
130
|
+
```tsx
|
|
131
|
+
import { useAuth } from '@digilogiclabs/saas-factory-auth'
|
|
132
|
+
|
|
133
|
+
const { user, signIn, signOut, loading } = useAuth()
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Payments Package (@digilogiclabs/saas-factory-payments)
|
|
137
|
+
```tsx
|
|
138
|
+
import {
|
|
139
|
+
PaymentForm,
|
|
140
|
+
SubscriptionPlans,
|
|
141
|
+
SubscriptionManager
|
|
142
|
+
} from '@digilogiclabs/saas-factory-payments'
|
|
143
|
+
|
|
144
|
+
<SubscriptionPlans onPlanSelect={handlePlanSelect} />
|
|
145
|
+
<PaymentForm onSuccess={handleSuccess} onError={handleError} />
|
|
146
|
+
<SubscriptionManager onSubscriptionChange={handleChange} />
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Project Structure
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
src/
|
|
153
|
+
├── app/ # Next.js 15 app directory
|
|
154
|
+
│ ├── billing/ # Billing and subscription management
|
|
155
|
+
│ ├── checkout/ # Payment and subscription selection
|
|
156
|
+
│ ├── login/ # Authentication pages
|
|
157
|
+
│ ├── signup/
|
|
158
|
+
│ └── layout.tsx # Root layout with providers
|
|
159
|
+
├── components/
|
|
160
|
+
│ ├── providers/ # App-wide providers (Auth, Payments, Theme)
|
|
161
|
+
│ ├── shared/ # Shared components (Header, etc.)
|
|
162
|
+
│ └── ui/ # UI components
|
|
163
|
+
└── lib/ # Utilities and configurations
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Deployment
|
|
167
|
+
|
|
168
|
+
### Vercel (Recommended)
|
|
169
|
+
1. Push your code to GitHub
|
|
170
|
+
2. Connect your repository to Vercel
|
|
171
|
+
3. Add environment variables in Vercel dashboard
|
|
172
|
+
4. Deploy
|
|
173
|
+
|
|
174
|
+
### Other Platforms
|
|
175
|
+
This is a standard Next.js application and can be deployed to any platform that supports Node.js.
|
|
176
|
+
|
|
177
|
+
## Learn More
|
|
178
|
+
|
|
179
|
+
- [Next.js Documentation](https://nextjs.org/docs)
|
|
180
|
+
- [Digi Logic Labs Documentation](https://docs.digilogiclabs.com)
|
|
181
|
+
- [SaaS Factory UI Components](https://ui.digilogiclabs.com)
|
|
182
|
+
- [SaaS Factory Auth Guide](https://auth.digilogiclabs.com)
|
|
183
|
+
- [SaaS Factory Payments Guide](https://payments.digilogiclabs.com)
|
|
184
|
+
|
|
185
|
+
## Support
|
|
186
|
+
|
|
187
|
+
- 📚 [Documentation](https://docs.digilogiclabs.com)
|
|
188
|
+
- 💬 [Discord Community](https://discord.gg/digilogiclabs)
|
|
189
|
+
- 🐛 [Report Issues](https://github.com/DigiLogicLabs/create-saas-app/issues)
|
|
190
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{packageName}}",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "{{description}} - Video Player App (with UI Package v0.11.1 + Auth v1.0.0 + Payments)",
|
|
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.0.0",
|
|
15
|
+
"react": "^19.0.0",
|
|
16
|
+
"react-dom": "^19.0.0",
|
|
17
|
+
"@digilogiclabs/saas-factory-ui": "^0.11.1",
|
|
18
|
+
"@digilogiclabs/saas-factory-auth": "^1.0.0",
|
|
19
|
+
"@digilogiclabs/saas-factory-payments": "^1.0.0",
|
|
20
|
+
"stripe": "^14.0.0",
|
|
21
|
+
"tailwindcss": "^3.3.0",
|
|
22
|
+
"autoprefixer": "^10.4.16",
|
|
23
|
+
"postcss": "^8.4.31",
|
|
24
|
+
"clsx": "^2.0.0",
|
|
25
|
+
"class-variance-authority": "^0.7.0",
|
|
26
|
+
"tailwind-merge": "^2.0.0",
|
|
27
|
+
"next-themes": "^0.2.1",
|
|
28
|
+
"lucide-react": "^0.542.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"typescript": "^5.0.0",
|
|
32
|
+
"@types/node": "^20.0.0",
|
|
33
|
+
"@types/react": "^19.0.0",
|
|
34
|
+
"@types/react-dom": "^19.0.0",
|
|
35
|
+
"eslint": "^8.0.0",
|
|
36
|
+
"eslint-config-next": "^15.0.0",
|
|
37
|
+
"prettier": "^3.0.0"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18.0.0"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
import type { NextRequest } from 'next/server';
|
|
3
|
+
|
|
4
|
+
export async function GET(request: NextRequest) {
|
|
5
|
+
const requestUrl = new URL(request.url);
|
|
6
|
+
|
|
7
|
+
// Placeholder auth callback - requires @digilogiclabs/saas-factory-auth package
|
|
8
|
+
console.log('Auth callback triggered - requires auth package for full functionality');
|
|
9
|
+
|
|
10
|
+
// URL to redirect to after sign in process completes
|
|
11
|
+
return NextResponse.redirect(requestUrl.origin);
|
|
12
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { usePayments, formatCurrency, formatDate } from '@digilogiclabs/saas-factory-payments';
|
|
5
|
+
import { Button, Card } from '@digilogiclabs/saas-factory-ui';
|
|
6
|
+
|
|
7
|
+
export default function BillingPage() {
|
|
8
|
+
const { loading } = usePayments();
|
|
9
|
+
|
|
10
|
+
const handleSubscriptionChange = () => {
|
|
11
|
+
console.log('Subscription change requested');
|
|
12
|
+
// Handle subscription changes (upgrade, downgrade, cancel, resume)
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const handlePaymentMethodUpdate = () => {
|
|
16
|
+
console.log('Payment method update requested');
|
|
17
|
+
// Handle payment method updates (add, edit, delete, set default)
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const handleInvoiceDownload = (invoiceId: string) => {
|
|
21
|
+
console.log('Download invoice:', invoiceId);
|
|
22
|
+
// Handle invoice download
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// Mock current subscription data - in real app this would come from your backend
|
|
26
|
+
const currentSubscription = {
|
|
27
|
+
plan: 'Pro Plan',
|
|
28
|
+
price: 1999,
|
|
29
|
+
interval: 'month',
|
|
30
|
+
status: 'active',
|
|
31
|
+
nextBilling: new Date(Date.now() + 15 * 24 * 60 * 60 * 1000)
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// Mock payment methods - in real app this would come from your backend
|
|
35
|
+
const paymentMethods = [
|
|
36
|
+
{
|
|
37
|
+
id: 'pm_123',
|
|
38
|
+
type: 'card',
|
|
39
|
+
last4: '4242',
|
|
40
|
+
brand: 'visa',
|
|
41
|
+
expiryMonth: 12,
|
|
42
|
+
expiryYear: 2025,
|
|
43
|
+
isDefault: true
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: 'pm_456',
|
|
47
|
+
type: 'card',
|
|
48
|
+
last4: '0005',
|
|
49
|
+
brand: 'mastercard',
|
|
50
|
+
expiryMonth: 8,
|
|
51
|
+
expiryYear: 2026,
|
|
52
|
+
isDefault: false
|
|
53
|
+
}
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
// Mock billing history - in real app this would come from your backend
|
|
57
|
+
const invoices = [
|
|
58
|
+
{
|
|
59
|
+
id: 'inv_123',
|
|
60
|
+
amount: 1999,
|
|
61
|
+
currency: 'usd',
|
|
62
|
+
status: 'paid',
|
|
63
|
+
date: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),
|
|
64
|
+
description: 'Pro Plan - Monthly'
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: 'inv_456',
|
|
68
|
+
amount: 1999,
|
|
69
|
+
currency: 'usd',
|
|
70
|
+
status: 'paid',
|
|
71
|
+
date: new Date(Date.now() - 60 * 24 * 60 * 60 * 1000),
|
|
72
|
+
description: 'Pro Plan - Monthly'
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: 'inv_789',
|
|
76
|
+
amount: 999,
|
|
77
|
+
currency: 'usd',
|
|
78
|
+
status: 'paid',
|
|
79
|
+
date: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000),
|
|
80
|
+
description: 'Basic Plan - Monthly'
|
|
81
|
+
}
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<div className="min-h-screen bg-gray-100 py-8">
|
|
86
|
+
<div className="max-w-7xl mx-auto px-4">
|
|
87
|
+
<div className="mb-8">
|
|
88
|
+
<h1 className="text-4xl font-bold text-gray-900 mb-2">Billing & Subscription</h1>
|
|
89
|
+
<p className="text-xl text-gray-600">Manage your subscription and billing information</p>
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8 mb-8">
|
|
93
|
+
{/* Current Subscription */}
|
|
94
|
+
<Card className="p-6">
|
|
95
|
+
<h2 className="text-2xl font-bold mb-6">Current Subscription</h2>
|
|
96
|
+
<div className="space-y-4">
|
|
97
|
+
<div>
|
|
98
|
+
<h3 className="font-semibold">{currentSubscription.plan}</h3>
|
|
99
|
+
<p className="text-2xl font-bold">
|
|
100
|
+
{formatCurrency(currentSubscription.price)}
|
|
101
|
+
<span className="text-sm font-normal">/{currentSubscription.interval}</span>
|
|
102
|
+
</p>
|
|
103
|
+
</div>
|
|
104
|
+
<div>
|
|
105
|
+
<p className="text-sm text-gray-600">Status</p>
|
|
106
|
+
<span className="inline-block px-2 py-1 bg-green-100 text-green-800 rounded text-sm">
|
|
107
|
+
{currentSubscription.status}
|
|
108
|
+
</span>
|
|
109
|
+
</div>
|
|
110
|
+
<div>
|
|
111
|
+
<p className="text-sm text-gray-600">Next billing date</p>
|
|
112
|
+
<p>{formatDate(currentSubscription.nextBilling)}</p>
|
|
113
|
+
</div>
|
|
114
|
+
<Button
|
|
115
|
+
onClick={handleSubscriptionChange}
|
|
116
|
+
disabled={loading}
|
|
117
|
+
variant="outline"
|
|
118
|
+
className="w-full"
|
|
119
|
+
>
|
|
120
|
+
Change Plan
|
|
121
|
+
</Button>
|
|
122
|
+
</div>
|
|
123
|
+
</Card>
|
|
124
|
+
|
|
125
|
+
{/* Payment Methods */}
|
|
126
|
+
<Card className="p-6">
|
|
127
|
+
<h2 className="text-2xl font-bold mb-6">Payment Methods</h2>
|
|
128
|
+
<div className="space-y-4">
|
|
129
|
+
{paymentMethods.map((method) => (
|
|
130
|
+
<div key={method.id} className="flex items-center justify-between p-3 border rounded-lg">
|
|
131
|
+
<div className="flex items-center">
|
|
132
|
+
<div className="w-8 h-8 bg-blue-100 rounded flex items-center justify-center mr-3">
|
|
133
|
+
💳
|
|
134
|
+
</div>
|
|
135
|
+
<div>
|
|
136
|
+
<p className="font-medium">
|
|
137
|
+
{method.brand.toUpperCase()} •••• {method.last4}
|
|
138
|
+
</p>
|
|
139
|
+
<p className="text-sm text-gray-600">
|
|
140
|
+
Expires {method.expiryMonth}/{method.expiryYear}
|
|
141
|
+
{method.isDefault && <span className="ml-2 text-blue-600">(Default)</span>}
|
|
142
|
+
</p>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
<Button
|
|
146
|
+
onClick={handlePaymentMethodUpdate}
|
|
147
|
+
disabled={loading}
|
|
148
|
+
variant="outline"
|
|
149
|
+
size="sm"
|
|
150
|
+
>
|
|
151
|
+
Edit
|
|
152
|
+
</Button>
|
|
153
|
+
</div>
|
|
154
|
+
))}
|
|
155
|
+
<Button
|
|
156
|
+
onClick={handlePaymentMethodUpdate}
|
|
157
|
+
disabled={loading}
|
|
158
|
+
variant="outline"
|
|
159
|
+
className="w-full"
|
|
160
|
+
>
|
|
161
|
+
Add Payment Method
|
|
162
|
+
</Button>
|
|
163
|
+
</div>
|
|
164
|
+
</Card>
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
{/* Billing History */}
|
|
168
|
+
<Card className="p-6">
|
|
169
|
+
<h2 className="text-2xl font-bold mb-6">Billing History</h2>
|
|
170
|
+
<div className="overflow-x-auto">
|
|
171
|
+
<table className="w-full">
|
|
172
|
+
<thead>
|
|
173
|
+
<tr className="border-b">
|
|
174
|
+
<th className="text-left py-2">Date</th>
|
|
175
|
+
<th className="text-left py-2">Description</th>
|
|
176
|
+
<th className="text-left py-2">Amount</th>
|
|
177
|
+
<th className="text-left py-2">Status</th>
|
|
178
|
+
<th className="text-left py-2">Actions</th>
|
|
179
|
+
</tr>
|
|
180
|
+
</thead>
|
|
181
|
+
<tbody>
|
|
182
|
+
{invoices.map((invoice) => (
|
|
183
|
+
<tr key={invoice.id} className="border-b">
|
|
184
|
+
<td className="py-3">{formatDate(invoice.date)}</td>
|
|
185
|
+
<td className="py-3">{invoice.description}</td>
|
|
186
|
+
<td className="py-3">{formatCurrency(invoice.amount)}</td>
|
|
187
|
+
<td className="py-3">
|
|
188
|
+
<span className="inline-block px-2 py-1 bg-green-100 text-green-800 rounded text-sm">
|
|
189
|
+
{invoice.status}
|
|
190
|
+
</span>
|
|
191
|
+
</td>
|
|
192
|
+
<td className="py-3">
|
|
193
|
+
<Button
|
|
194
|
+
onClick={() => handleInvoiceDownload(invoice.id)}
|
|
195
|
+
variant="outline"
|
|
196
|
+
size="sm"
|
|
197
|
+
>
|
|
198
|
+
Download
|
|
199
|
+
</Button>
|
|
200
|
+
</td>
|
|
201
|
+
</tr>
|
|
202
|
+
))}
|
|
203
|
+
</tbody>
|
|
204
|
+
</table>
|
|
205
|
+
</div>
|
|
206
|
+
</Card>
|
|
207
|
+
</div>
|
|
208
|
+
</div>
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { usePayments, formatCurrency } from '@digilogiclabs/saas-factory-payments';
|
|
5
|
+
import { Button, Card } from '@digilogiclabs/saas-factory-ui';
|
|
6
|
+
|
|
7
|
+
export default function CheckoutPage() {
|
|
8
|
+
const { loading } = usePayments();
|
|
9
|
+
|
|
10
|
+
const handlePlanSelect = (planId: string) => {
|
|
11
|
+
console.log('Plan selected:', planId);
|
|
12
|
+
// Handle plan selection - redirect to payment processing
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const handlePayment = () => {
|
|
16
|
+
console.log('Processing payment...');
|
|
17
|
+
// Handle payment processing
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// Example pricing plans - in real app these would come from your backend/Stripe
|
|
21
|
+
const plans = [
|
|
22
|
+
{
|
|
23
|
+
id: 'basic',
|
|
24
|
+
name: 'Basic Plan',
|
|
25
|
+
price: 999, // in cents
|
|
26
|
+
interval: 'month',
|
|
27
|
+
features: ['Feature 1', 'Feature 2', 'Feature 3'],
|
|
28
|
+
stripePriceId: 'price_basic_monthly'
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: 'pro',
|
|
32
|
+
name: 'Pro Plan',
|
|
33
|
+
price: 1999, // in cents
|
|
34
|
+
interval: 'month',
|
|
35
|
+
features: ['All Basic features', 'Feature 4', 'Feature 5', 'Priority support'],
|
|
36
|
+
popular: true,
|
|
37
|
+
stripePriceId: 'price_pro_monthly'
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: 'enterprise',
|
|
41
|
+
name: 'Enterprise Plan',
|
|
42
|
+
price: 4999, // in cents
|
|
43
|
+
interval: 'month',
|
|
44
|
+
features: ['All Pro features', 'Custom integrations', 'Dedicated support', 'SLA guarantee'],
|
|
45
|
+
stripePriceId: 'price_enterprise_monthly'
|
|
46
|
+
}
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<div className="min-h-screen bg-gray-100 py-8">
|
|
51
|
+
<div className="max-w-6xl mx-auto px-4">
|
|
52
|
+
<div className="text-center mb-12">
|
|
53
|
+
<h1 className="text-4xl font-bold text-gray-900 mb-4">Choose Your Plan</h1>
|
|
54
|
+
<p className="text-xl text-gray-600">Select the perfect plan for your needs</p>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
{/* Subscription Plans */}
|
|
58
|
+
<div className="grid md:grid-cols-3 gap-6 mb-8">
|
|
59
|
+
{plans.map((plan) => (
|
|
60
|
+
<Card key={plan.id} className={`p-6 relative ${plan.popular ? 'ring-2 ring-blue-500' : ''}`}>
|
|
61
|
+
{plan.popular && (
|
|
62
|
+
<div className="absolute -top-3 left-1/2 transform -translate-x-1/2">
|
|
63
|
+
<span className="bg-blue-500 text-white px-3 py-1 rounded-full text-sm font-medium">
|
|
64
|
+
Most Popular
|
|
65
|
+
</span>
|
|
66
|
+
</div>
|
|
67
|
+
)}
|
|
68
|
+
<h3 className="text-xl font-bold mb-2">{plan.name}</h3>
|
|
69
|
+
<div className="text-3xl font-bold mb-4">
|
|
70
|
+
{formatCurrency(plan.price)}
|
|
71
|
+
<span className="text-sm font-normal">/{plan.interval}</span>
|
|
72
|
+
</div>
|
|
73
|
+
<ul className="mb-6 space-y-2">
|
|
74
|
+
{plan.features.map((feature, index) => (
|
|
75
|
+
<li key={index} className="flex items-center">
|
|
76
|
+
<span className="text-green-500 mr-2">✓</span>
|
|
77
|
+
{feature}
|
|
78
|
+
</li>
|
|
79
|
+
))}
|
|
80
|
+
</ul>
|
|
81
|
+
<Button
|
|
82
|
+
onClick={() => handlePlanSelect(plan.id)}
|
|
83
|
+
disabled={loading}
|
|
84
|
+
className="w-full"
|
|
85
|
+
variant={plan.popular ? 'default' : 'outline'}
|
|
86
|
+
>
|
|
87
|
+
{loading ? 'Processing...' : 'Select Plan'}
|
|
88
|
+
</Button>
|
|
89
|
+
</Card>
|
|
90
|
+
))}
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
{/* Payment Form */}
|
|
94
|
+
<Card className="p-6 max-w-md mx-auto">
|
|
95
|
+
<h2 className="text-2xl font-bold mb-6">Payment Details</h2>
|
|
96
|
+
<div className="space-y-4">
|
|
97
|
+
<div>
|
|
98
|
+
<label className="block text-sm font-medium mb-2">Card Number</label>
|
|
99
|
+
<input
|
|
100
|
+
type="text"
|
|
101
|
+
placeholder="1234 5678 9012 3456"
|
|
102
|
+
className="w-full p-3 border rounded-lg"
|
|
103
|
+
disabled
|
|
104
|
+
/>
|
|
105
|
+
</div>
|
|
106
|
+
<div className="grid grid-cols-2 gap-4">
|
|
107
|
+
<div>
|
|
108
|
+
<label className="block text-sm font-medium mb-2">Expiry Date</label>
|
|
109
|
+
<input
|
|
110
|
+
type="text"
|
|
111
|
+
placeholder="MM/YY"
|
|
112
|
+
className="w-full p-3 border rounded-lg"
|
|
113
|
+
disabled
|
|
114
|
+
/>
|
|
115
|
+
</div>
|
|
116
|
+
<div>
|
|
117
|
+
<label className="block text-sm font-medium mb-2">CVC</label>
|
|
118
|
+
<input
|
|
119
|
+
type="text"
|
|
120
|
+
placeholder="123"
|
|
121
|
+
className="w-full p-3 border rounded-lg"
|
|
122
|
+
disabled
|
|
123
|
+
/>
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
126
|
+
<Button
|
|
127
|
+
onClick={handlePayment}
|
|
128
|
+
disabled={loading}
|
|
129
|
+
className="w-full"
|
|
130
|
+
>
|
|
131
|
+
{loading ? 'Processing...' : 'Complete Payment'}
|
|
132
|
+
</Button>
|
|
133
|
+
<p className="text-sm text-gray-600 text-center">
|
|
134
|
+
This is a demo. Payment processing requires Stripe integration.
|
|
135
|
+
</p>
|
|
136
|
+
</div>
|
|
137
|
+
</Card>
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|