@digilogiclabs/create-saas-app 2.11.0 β 2.12.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 +6 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/generators/template-generator.d.ts.map +1 -1
- package/dist/generators/template-generator.js +15 -8
- package/dist/generators/template-generator.js.map +1 -1
- package/dist/templates/shared/admin/web/src/components/admin-nav.tsx +3 -3
- package/dist/templates/shared/auth/supabase/web/src/lib/auth-session.ts +36 -16
- package/dist/templates/shared/auth/supabase/web/src/middleware.ts +6 -0
- package/dist/templates/shared/cookie-consent/web/components/cookie-consent.tsx +5 -5
- package/dist/templates/shared/design/web/src/components/ui/button.tsx +56 -0
- package/dist/templates/shared/email/web/src/lib/email/client.ts +1 -1
- package/dist/templates/shared/error-pages/web/src/app/error.tsx +13 -11
- package/dist/templates/shared/error-pages/web/src/app/global-error.tsx +2 -0
- package/dist/templates/shared/error-pages/web/src/app/not-found.tsx +6 -6
- package/dist/templates/shared/legal/web/src/app/(legal)/privacy/page.tsx +4 -4
- package/dist/templates/shared/legal/web/src/app/(legal)/terms/page.tsx +4 -4
- package/dist/templates/shared/loading/web/components/skeleton.tsx +4 -4
- package/dist/templates/shared/mock/web/.env.local +55 -0
- package/dist/templates/shared/mock/web/src/components/mock-auth-provider.tsx +72 -0
- package/dist/templates/shared/mock/web/src/components/mock-banner.tsx +29 -0
- package/dist/templates/shared/mock/web/src/lib/mock.ts +147 -0
- package/dist/templates/shared/payments/web/src/app/api/webhooks/stripe/route.ts +10 -4
- package/dist/templates/shared/redis/web/src/lib/redis.ts +1 -1
- package/dist/templates/web/base/template/eslint.config.mjs +14 -0
- package/dist/templates/web/base/template/src/app/auth/callback/route.ts +1 -1
- package/dist/templates/web/base/template/src/app/checkout/page.tsx +76 -103
- package/dist/templates/web/base/template/src/app/dashboard/page.tsx +145 -329
- package/dist/templates/web/base/template/src/app/layout.tsx +40 -38
- package/dist/templates/web/base/template/src/app/login/page.tsx +116 -66
- package/dist/templates/web/base/template/src/app/page.tsx +97 -193
- package/dist/templates/web/base/template/src/app/settings/page.tsx +154 -0
- package/dist/templates/web/base/template/src/app/signup/page.tsx +117 -66
- package/dist/templates/web/base/template/src/components/providers/app-providers.tsx +8 -3
- package/dist/templates/web/base/template/src/components/shared/header.tsx +229 -63
- package/dist/templates/web/ui-auth/template/eslint.config.mjs +14 -0
- package/dist/templates/web/ui-auth/template/src/app/checkout/page.tsx +3 -3
- package/dist/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +81 -91
- package/dist/templates/web/ui-auth/template/src/app/layout.tsx +38 -36
- package/dist/templates/web/ui-auth/template/src/app/login/page.tsx +22 -45
- package/dist/templates/web/ui-auth/template/src/app/page.tsx +106 -306
- package/dist/templates/web/ui-auth/template/src/app/setup/page.tsx +387 -402
- package/dist/templates/web/ui-auth/template/src/app/signup/page.tsx +24 -47
- package/dist/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +8 -3
- package/dist/templates/web/ui-auth/template/src/components/shared/header.tsx +229 -94
- package/dist/templates/web/ui-auth-ai/template/src/app/layout.tsx +38 -45
- package/dist/templates/web/ui-auth-ai/template/src/app/login/page.tsx +86 -0
- package/dist/templates/web/ui-auth-ai/template/src/app/page.tsx +107 -193
- package/dist/templates/web/ui-auth-ai/template/src/app/signup/page.tsx +105 -0
- package/dist/templates/web/ui-auth-ai/template/src/components/ai/audio-generator.tsx +144 -140
- package/dist/templates/web/ui-auth-ai/template/src/components/ai/video-generator.tsx +156 -157
- package/dist/templates/web/ui-auth-ai/template/src/components/auth/login-form.tsx +7 -3
- package/dist/templates/web/ui-auth-ai/template/src/components/providers/app-providers.tsx +25 -0
- package/dist/templates/web/ui-auth-ai/template/src/components/shared/footer.tsx +36 -0
- package/dist/templates/web/ui-auth-ai/template/src/components/shared/header.tsx +228 -0
- package/dist/templates/web/ui-auth-ai/template/src/components/ui/button.tsx +5 -5
- package/dist/templates/web/ui-auth-ai/template/src/components/ui/input.tsx +1 -1
- package/dist/templates/web/ui-auth-ai/template/src/components/ui/select.tsx +1 -1
- package/dist/templates/web/ui-auth-ai/template/src/components/ui/textarea.tsx +1 -1
- package/dist/templates/web/ui-auth-ai/template/src/components/ui/theme-toggle.tsx +34 -0
- package/dist/templates/web/ui-auth-ai/template/src/lib/supabase.ts +6 -4
- package/dist/templates/web/ui-auth-ai/template/src/providers/auth-provider.tsx +7 -5
- package/dist/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +63 -192
- package/dist/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +104 -296
- package/dist/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +27 -27
- package/dist/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +70 -81
- package/dist/templates/web/ui-auth-payments/template/src/app/layout.tsx +38 -36
- package/dist/templates/web/ui-auth-payments/template/src/app/login/loading.tsx +9 -9
- package/dist/templates/web/ui-auth-payments/template/src/app/login/page.tsx +4 -104
- package/dist/templates/web/ui-auth-payments/template/src/app/page.tsx +69 -337
- package/dist/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +55 -68
- package/dist/templates/web/ui-auth-payments/template/src/app/signup/loading.tsx +13 -13
- package/dist/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +4 -123
- package/dist/templates/web/ui-auth-payments/template/src/components/client/auth-status.tsx +37 -52
- package/dist/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +49 -103
- package/dist/templates/web/ui-auth-payments/template/src/components/client/newsletter-signup.tsx +4 -4
- package/dist/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +60 -140
- package/dist/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +25 -28
- package/dist/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +229 -230
- package/dist/templates/web/ui-auth-payments/template/src/lib/actions/auth.ts +245 -245
- package/dist/templates/web/ui-auth-payments/template/src/lib/actions/index.ts +339 -339
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +305 -309
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +62 -312
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +109 -125
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +27 -27
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +68 -83
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +40 -38
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +20 -20
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +140 -394
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +28 -27
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +51 -66
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +37 -52
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +50 -79
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +58 -111
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +8 -3
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +229 -252
- package/dist/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +245 -245
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +63 -192
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +109 -125
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +27 -27
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +40 -38
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +122 -385
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +340 -344
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/auth-status.tsx +37 -52
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +49 -103
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +60 -140
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +8 -3
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +229 -252
- package/dist/templates/web/ui-auth-payments-audio/template/src/lib/actions/auth.ts +3 -3
- package/dist/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +63 -192
- package/dist/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +109 -125
- package/dist/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +38 -36
- package/dist/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +9 -109
- package/dist/templates/web/ui-auth-payments-video/template/src/app/page.tsx +132 -392
- package/dist/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +346 -350
- package/dist/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +9 -128
- package/dist/templates/web/ui-auth-payments-video/template/src/components/client/login-form.tsx +90 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/client/signup-form.tsx +105 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +8 -3
- package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +229 -246
- package/dist/templates/web/ui-only/template/eslint.config.mjs +14 -0
- package/dist/templates/web/ui-only/template/src/app/checkout/page.tsx +2 -2
- package/dist/templates/web/ui-only/template/src/app/login/page.tsx +69 -63
- package/dist/templates/web/ui-only/template/src/app/page.tsx +69 -91
- package/dist/templates/web/ui-only/template/src/app/signup/page.tsx +94 -79
- package/dist/templates/web/ui-only/template/src/components/providers/app-providers.tsx +1 -6
- package/dist/templates/web/ui-only/template/src/components/shared/header.tsx +90 -53
- package/dist/templates/web/ui-package-test/template/package.json +19 -23
- package/dist/templates/web/ui-package-test/template/postcss.config.mjs +8 -0
- package/dist/templates/web/ui-package-test/template/src/app/globals.css +88 -0
- package/dist/templates/web/ui-package-test/template/src/app/layout.tsx +27 -0
- package/dist/templates/web/ui-package-test/template/src/app/page.tsx +46 -106
- package/package.json +1 -1
- package/src/templates/shared/admin/web/src/components/admin-nav.tsx +3 -3
- package/src/templates/shared/auth/supabase/web/src/lib/auth-session.ts +36 -16
- package/src/templates/shared/auth/supabase/web/src/middleware.ts +6 -0
- package/src/templates/shared/cookie-consent/web/components/cookie-consent.tsx +5 -5
- package/src/templates/shared/design/web/src/components/ui/button.tsx +56 -0
- package/src/templates/shared/email/web/src/lib/email/client.ts +1 -1
- package/src/templates/shared/error-pages/web/src/app/error.tsx +13 -11
- package/src/templates/shared/error-pages/web/src/app/global-error.tsx +2 -0
- package/src/templates/shared/error-pages/web/src/app/not-found.tsx +6 -6
- package/src/templates/shared/legal/web/src/app/(legal)/privacy/page.tsx +4 -4
- package/src/templates/shared/legal/web/src/app/(legal)/terms/page.tsx +4 -4
- package/src/templates/shared/loading/web/components/skeleton.tsx +4 -4
- package/src/templates/shared/mock/web/.env.local +55 -0
- package/src/templates/shared/mock/web/src/components/mock-auth-provider.tsx +72 -0
- package/src/templates/shared/mock/web/src/components/mock-banner.tsx +29 -0
- package/src/templates/shared/mock/web/src/lib/mock.ts +147 -0
- package/src/templates/shared/payments/web/src/app/api/webhooks/stripe/route.ts +10 -4
- package/src/templates/shared/redis/web/src/lib/redis.ts +1 -1
- package/src/templates/web/base/template/eslint.config.mjs +14 -0
- package/src/templates/web/base/template/src/app/auth/callback/route.ts +1 -1
- package/src/templates/web/base/template/src/app/checkout/page.tsx +76 -103
- package/src/templates/web/base/template/src/app/dashboard/page.tsx +145 -329
- package/src/templates/web/base/template/src/app/layout.tsx +40 -38
- package/src/templates/web/base/template/src/app/login/page.tsx +116 -66
- package/src/templates/web/base/template/src/app/page.tsx +97 -193
- package/src/templates/web/base/template/src/app/settings/page.tsx +154 -0
- package/src/templates/web/base/template/src/app/signup/page.tsx +117 -66
- package/src/templates/web/base/template/src/components/providers/app-providers.tsx +8 -3
- package/src/templates/web/base/template/src/components/shared/header.tsx +229 -63
- package/src/templates/web/ui-auth/template/eslint.config.mjs +14 -0
- package/src/templates/web/ui-auth/template/src/app/checkout/page.tsx +3 -3
- package/src/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +81 -91
- package/src/templates/web/ui-auth/template/src/app/layout.tsx +38 -36
- package/src/templates/web/ui-auth/template/src/app/login/page.tsx +22 -45
- package/src/templates/web/ui-auth/template/src/app/page.tsx +106 -306
- package/src/templates/web/ui-auth/template/src/app/setup/page.tsx +387 -402
- package/src/templates/web/ui-auth/template/src/app/signup/page.tsx +24 -47
- package/src/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +8 -3
- package/src/templates/web/ui-auth/template/src/components/shared/header.tsx +229 -94
- package/src/templates/web/ui-auth-ai/template/src/app/layout.tsx +38 -45
- package/src/templates/web/ui-auth-ai/template/src/app/login/page.tsx +86 -0
- package/src/templates/web/ui-auth-ai/template/src/app/page.tsx +107 -193
- package/src/templates/web/ui-auth-ai/template/src/app/signup/page.tsx +105 -0
- package/src/templates/web/ui-auth-ai/template/src/components/ai/audio-generator.tsx +144 -140
- package/src/templates/web/ui-auth-ai/template/src/components/ai/video-generator.tsx +156 -157
- package/src/templates/web/ui-auth-ai/template/src/components/auth/login-form.tsx +7 -3
- package/src/templates/web/ui-auth-ai/template/src/components/providers/app-providers.tsx +25 -0
- package/src/templates/web/ui-auth-ai/template/src/components/shared/footer.tsx +36 -0
- package/src/templates/web/ui-auth-ai/template/src/components/shared/header.tsx +228 -0
- package/src/templates/web/ui-auth-ai/template/src/components/ui/button.tsx +5 -5
- package/src/templates/web/ui-auth-ai/template/src/components/ui/input.tsx +1 -1
- package/src/templates/web/ui-auth-ai/template/src/components/ui/select.tsx +1 -1
- package/src/templates/web/ui-auth-ai/template/src/components/ui/textarea.tsx +1 -1
- package/src/templates/web/ui-auth-ai/template/src/components/ui/theme-toggle.tsx +34 -0
- package/src/templates/web/ui-auth-ai/template/src/lib/supabase.ts +6 -4
- package/src/templates/web/ui-auth-ai/template/src/providers/auth-provider.tsx +7 -5
- package/src/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +63 -192
- package/src/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +104 -296
- package/src/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +27 -27
- package/src/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +70 -81
- package/src/templates/web/ui-auth-payments/template/src/app/layout.tsx +38 -36
- package/src/templates/web/ui-auth-payments/template/src/app/login/loading.tsx +9 -9
- package/src/templates/web/ui-auth-payments/template/src/app/login/page.tsx +4 -104
- package/src/templates/web/ui-auth-payments/template/src/app/page.tsx +69 -337
- package/src/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +55 -68
- package/src/templates/web/ui-auth-payments/template/src/app/signup/loading.tsx +13 -13
- package/src/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +4 -123
- package/src/templates/web/ui-auth-payments/template/src/components/client/auth-status.tsx +37 -52
- package/src/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +49 -103
- package/src/templates/web/ui-auth-payments/template/src/components/client/newsletter-signup.tsx +4 -4
- package/src/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +60 -140
- package/src/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +25 -28
- package/src/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +229 -230
- package/src/templates/web/ui-auth-payments/template/src/lib/actions/auth.ts +245 -245
- package/src/templates/web/ui-auth-payments/template/src/lib/actions/index.ts +339 -339
- package/src/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +305 -309
- package/src/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +62 -312
- package/src/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +109 -125
- package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +27 -27
- package/src/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +68 -83
- package/src/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +40 -38
- package/src/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +20 -20
- package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +140 -394
- package/src/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +28 -27
- package/src/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +51 -66
- package/src/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +37 -52
- package/src/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +50 -79
- package/src/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +58 -111
- package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +8 -3
- package/src/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +229 -252
- package/src/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +245 -245
- package/src/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +63 -192
- package/src/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +109 -125
- package/src/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +27 -27
- package/src/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +40 -38
- package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +122 -385
- package/src/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +340 -344
- package/src/templates/web/ui-auth-payments-audio/template/src/components/client/auth-status.tsx +37 -52
- package/src/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +49 -103
- package/src/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +60 -140
- package/src/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +8 -3
- package/src/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +229 -252
- package/src/templates/web/ui-auth-payments-audio/template/src/lib/actions/auth.ts +3 -3
- package/src/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +63 -192
- package/src/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +109 -125
- package/src/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +38 -36
- package/src/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +9 -109
- package/src/templates/web/ui-auth-payments-video/template/src/app/page.tsx +132 -392
- package/src/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +346 -350
- package/src/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +9 -128
- package/src/templates/web/ui-auth-payments-video/template/src/components/client/login-form.tsx +90 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/client/signup-form.tsx +105 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +8 -3
- package/src/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +229 -246
- package/src/templates/web/ui-only/template/eslint.config.mjs +14 -0
- package/src/templates/web/ui-only/template/src/app/checkout/page.tsx +2 -2
- package/src/templates/web/ui-only/template/src/app/login/page.tsx +69 -63
- package/src/templates/web/ui-only/template/src/app/page.tsx +69 -91
- package/src/templates/web/ui-only/template/src/app/signup/page.tsx +94 -79
- package/src/templates/web/ui-only/template/src/components/providers/app-providers.tsx +1 -6
- package/src/templates/web/ui-only/template/src/components/shared/header.tsx +90 -53
- package/src/templates/web/ui-package-test/template/package.json +19 -23
- package/src/templates/web/ui-package-test/template/postcss.config.mjs +8 -0
- package/src/templates/web/ui-package-test/template/src/app/globals.css +88 -0
- package/src/templates/web/ui-package-test/template/src/app/layout.tsx +27 -0
- package/src/templates/web/ui-package-test/template/src/app/page.tsx +46 -106
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/README.md +0 -655
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app/(tabs)/ai.tsx +0 -683
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app/_layout.tsx +0 -124
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app.json +0 -74
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/babel.config.js +0 -25
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/docs/MOBILE-SETUP.md +0 -787
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/eas.json +0 -25
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/expo-env.d.ts +0 -3
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -346
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/jest-setup.ts +0 -37
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -180
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/metro.config.js +0 -11
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/package.json +0 -122
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -599
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/tsconfig.json +0 -32
- package/dist/templates/web/base/template/.eslintrc.js +0 -8
- package/dist/templates/web/base/template/src/components/__tests__/example.test.tsx +0 -49
- package/dist/templates/web/base/template/src/test/setup.ts +0 -74
- package/dist/templates/web/base/template/vitest.config.ts +0 -17
- package/dist/templates/web/ui-auth/template/.eslintrc.js +0 -8
- package/dist/templates/web/ui-auth/template/src/components/__tests__/example.test.tsx +0 -49
- package/dist/templates/web/ui-auth/template/src/test/setup.ts +0 -74
- package/dist/templates/web/ui-auth/template/vitest.config.ts +0 -17
- package/dist/templates/web/ui-auth-payments/template/src/components/__tests__/example.test.tsx +0 -49
- package/dist/templates/web/ui-auth-payments/template/src/test/setup.ts +0 -74
- package/dist/templates/web/ui-auth-payments/template/vitest.config.ts +0 -17
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +0 -49
- package/dist/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +0 -74
- package/dist/templates/web/ui-auth-payments-ai/template/vitest.config.ts +0 -17
- package/dist/templates/web/ui-auth-payments-ai-rag/template/README.md +0 -434
- package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/KnowledgeManager.tsx +0 -642
- package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGAnalytics.tsx +0 -466
- package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGChatInterface.tsx +0 -393
- package/dist/templates/web/ui-auth-payments-ai-rag/template/docs/GETTING-STARTED.md +0 -457
- package/dist/templates/web/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -478
- package/dist/templates/web/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -250
- package/dist/templates/web/ui-auth-payments-ai-rag/template/package.json +0 -73
- package/dist/templates/web/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -622
- package/dist/templates/web/ui-auth-payments-ai-rag/template/src/app/ai/page.tsx +0 -396
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/__tests__/example.test.tsx +0 -49
- package/dist/templates/web/ui-auth-payments-audio/template/src/test/setup.ts +0 -74
- package/dist/templates/web/ui-auth-payments-audio/template/vitest.config.ts +0 -17
- package/dist/templates/web/ui-auth-payments-video/template/src/components/__tests__/example.test.tsx +0 -49
- package/dist/templates/web/ui-auth-payments-video/template/src/test/setup.ts +0 -74
- package/dist/templates/web/ui-auth-payments-video/template/vitest.config.ts +0 -17
- package/dist/templates/web/ui-only/template/.eslintrc.js +0 -8
- package/dist/templates/web/ui-only/template/src/components/__tests__/example.test.tsx +0 -49
- package/dist/templates/web/ui-only/template/src/test/setup.ts +0 -74
- package/dist/templates/web/ui-only/template/vitest.config.ts +0 -17
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/README.md +0 -655
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/app/(tabs)/ai.tsx +0 -683
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/app/_layout.tsx +0 -124
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/app.json +0 -74
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/babel.config.js +0 -25
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/docs/MOBILE-SETUP.md +0 -787
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/eas.json +0 -25
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/expo-env.d.ts +0 -3
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -346
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/jest-setup.ts +0 -37
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -180
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/metro.config.js +0 -11
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/package.json +0 -122
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -599
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/tsconfig.json +0 -32
- package/src/templates/web/base/template/.eslintrc.js +0 -8
- package/src/templates/web/base/template/src/components/__tests__/example.test.tsx +0 -49
- package/src/templates/web/base/template/src/test/setup.ts +0 -74
- package/src/templates/web/base/template/vitest.config.ts +0 -17
- package/src/templates/web/ui-auth/template/.eslintrc.js +0 -8
- package/src/templates/web/ui-auth/template/src/components/__tests__/example.test.tsx +0 -49
- package/src/templates/web/ui-auth/template/src/test/setup.ts +0 -74
- package/src/templates/web/ui-auth/template/vitest.config.ts +0 -17
- package/src/templates/web/ui-auth-payments/template/src/components/__tests__/example.test.tsx +0 -49
- package/src/templates/web/ui-auth-payments/template/src/test/setup.ts +0 -74
- package/src/templates/web/ui-auth-payments/template/vitest.config.ts +0 -17
- package/src/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +0 -49
- package/src/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +0 -74
- package/src/templates/web/ui-auth-payments-ai/template/vitest.config.ts +0 -17
- package/src/templates/web/ui-auth-payments-ai-rag/template/README.md +0 -434
- package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/KnowledgeManager.tsx +0 -642
- package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGAnalytics.tsx +0 -466
- package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGChatInterface.tsx +0 -393
- package/src/templates/web/ui-auth-payments-ai-rag/template/docs/GETTING-STARTED.md +0 -457
- package/src/templates/web/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -478
- package/src/templates/web/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -250
- package/src/templates/web/ui-auth-payments-ai-rag/template/package.json +0 -73
- package/src/templates/web/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -622
- package/src/templates/web/ui-auth-payments-ai-rag/template/src/app/ai/page.tsx +0 -396
- package/src/templates/web/ui-auth-payments-audio/template/src/components/__tests__/example.test.tsx +0 -49
- package/src/templates/web/ui-auth-payments-audio/template/src/test/setup.ts +0 -74
- package/src/templates/web/ui-auth-payments-audio/template/vitest.config.ts +0 -17
- package/src/templates/web/ui-auth-payments-video/template/src/components/__tests__/example.test.tsx +0 -49
- package/src/templates/web/ui-auth-payments-video/template/src/test/setup.ts +0 -74
- package/src/templates/web/ui-auth-payments-video/template/vitest.config.ts +0 -17
- package/src/templates/web/ui-only/template/.eslintrc.js +0 -8
- package/src/templates/web/ui-only/template/src/components/__tests__/example.test.tsx +0 -49
- package/src/templates/web/ui-only/template/src/test/setup.ts +0 -74
- package/src/templates/web/ui-only/template/vitest.config.ts +0 -17
|
@@ -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
|
+
|
|
@@ -37,7 +37,7 @@ function getResend(): Resend | null {
|
|
|
37
37
|
|
|
38
38
|
try {
|
|
39
39
|
// Dynamic import to avoid requiring resend in all environments
|
|
40
|
-
// eslint-disable-next-line
|
|
40
|
+
// eslint-disable-next-line
|
|
41
41
|
const { Resend } = require('resend');
|
|
42
42
|
resendClient = new Resend(apiKey);
|
|
43
43
|
return resendClient;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
+
import Link from 'next/link';
|
|
4
|
+
|
|
3
5
|
/**
|
|
4
6
|
* Error boundary page.
|
|
5
7
|
*
|
|
@@ -14,11 +16,11 @@ export default function Error({
|
|
|
14
16
|
reset: () => void;
|
|
15
17
|
}) {
|
|
16
18
|
return (
|
|
17
|
-
<main className="flex min-h-screen items-center justify-center bg-
|
|
19
|
+
<main className="flex min-h-screen items-center justify-center bg-background px-4">
|
|
18
20
|
<div className="text-center">
|
|
19
|
-
<div className="mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-
|
|
21
|
+
<div className="mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-destructive/10">
|
|
20
22
|
<svg
|
|
21
|
-
className="h-8 w-8 text-
|
|
23
|
+
className="h-8 w-8 text-destructive"
|
|
22
24
|
fill="none"
|
|
23
25
|
viewBox="0 0 24 24"
|
|
24
26
|
strokeWidth="1.5"
|
|
@@ -31,20 +33,20 @@ export default function Error({
|
|
|
31
33
|
/>
|
|
32
34
|
</svg>
|
|
33
35
|
</div>
|
|
34
|
-
<h1 className="text-2xl font-semibold text-
|
|
36
|
+
<h1 className="text-2xl font-semibold text-foreground">
|
|
35
37
|
Something went wrong
|
|
36
38
|
</h1>
|
|
37
|
-
<p className="mt-2 max-w-md text-
|
|
39
|
+
<p className="mt-2 max-w-md text-muted-foreground">
|
|
38
40
|
An unexpected error occurred. Please try again.
|
|
39
41
|
</p>
|
|
40
42
|
{error.digest && (
|
|
41
|
-
<p className="mt-1 text-xs text-
|
|
43
|
+
<p className="mt-1 text-xs text-muted-foreground/70">
|
|
42
44
|
Error ID: {error.digest}
|
|
43
45
|
</p>
|
|
44
46
|
)}
|
|
45
47
|
|
|
46
48
|
{process.env.NODE_ENV === 'development' && (
|
|
47
|
-
<pre className="mx-auto mt-4 max-w-lg overflow-auto rounded-lg bg-
|
|
49
|
+
<pre className="mx-auto mt-4 max-w-lg overflow-auto rounded-lg bg-muted p-4 text-left text-xs text-destructive">
|
|
48
50
|
{error.message}
|
|
49
51
|
{error.stack && `\n\n${error.stack}`}
|
|
50
52
|
</pre>
|
|
@@ -53,16 +55,16 @@ export default function Error({
|
|
|
53
55
|
<div className="mt-8 flex items-center justify-center gap-4">
|
|
54
56
|
<button
|
|
55
57
|
onClick={reset}
|
|
56
|
-
className="rounded-lg bg-
|
|
58
|
+
className="rounded-lg bg-primary px-5 py-2.5 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90"
|
|
57
59
|
>
|
|
58
60
|
Try Again
|
|
59
61
|
</button>
|
|
60
|
-
<
|
|
62
|
+
<Link
|
|
61
63
|
href="/"
|
|
62
|
-
className="rounded-lg border border-
|
|
64
|
+
className="rounded-lg border border-border px-5 py-2.5 text-sm font-medium text-foreground transition-colors hover:bg-muted"
|
|
63
65
|
>
|
|
64
66
|
Go Home
|
|
65
|
-
</
|
|
67
|
+
</Link>
|
|
66
68
|
</div>
|
|
67
69
|
</div>
|
|
68
70
|
</main>
|
|
@@ -8,27 +8,27 @@ import Link from 'next/link';
|
|
|
8
8
|
*/
|
|
9
9
|
export default function NotFound() {
|
|
10
10
|
return (
|
|
11
|
-
<main className="flex min-h-screen items-center justify-center bg-
|
|
11
|
+
<main className="flex min-h-screen items-center justify-center bg-background px-4">
|
|
12
12
|
<div className="text-center">
|
|
13
|
-
<p className="bg-gradient-to-r from-
|
|
13
|
+
<p className="bg-gradient-to-r from-primary to-accent bg-clip-text text-8xl font-bold text-transparent">
|
|
14
14
|
404
|
|
15
15
|
</p>
|
|
16
|
-
<h1 className="mt-4 text-2xl font-semibold text-
|
|
16
|
+
<h1 className="mt-4 text-2xl font-semibold text-foreground">
|
|
17
17
|
Page not found
|
|
18
18
|
</h1>
|
|
19
|
-
<p className="mt-2 max-w-md text-
|
|
19
|
+
<p className="mt-2 max-w-md text-muted-foreground">
|
|
20
20
|
The page you're looking for doesn't exist or has been moved.
|
|
21
21
|
</p>
|
|
22
22
|
<div className="mt-8 flex items-center justify-center gap-4">
|
|
23
23
|
<Link
|
|
24
24
|
href="/"
|
|
25
|
-
className="rounded-lg bg-
|
|
25
|
+
className="rounded-lg bg-primary px-5 py-2.5 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90"
|
|
26
26
|
>
|
|
27
27
|
Go Home
|
|
28
28
|
</Link>
|
|
29
29
|
<Link
|
|
30
30
|
href="/dashboard"
|
|
31
|
-
className="rounded-lg border border-
|
|
31
|
+
className="rounded-lg border border-border px-5 py-2.5 text-sm font-medium text-foreground transition-colors hover:bg-muted"
|
|
32
32
|
>
|
|
33
33
|
Dashboard
|
|
34
34
|
</Link>
|
|
@@ -23,16 +23,16 @@ export default function PrivacyPage() {
|
|
|
23
23
|
} = LEGAL_CONFIG;
|
|
24
24
|
|
|
25
25
|
return (
|
|
26
|
-
<main className="min-h-screen bg-
|
|
26
|
+
<main className="min-h-screen bg-background">
|
|
27
27
|
<div className="mx-auto max-w-3xl px-4 py-16 sm:px-6 lg:px-8">
|
|
28
|
-
<h1 className="mb-2 text-3xl font-bold tracking-tight text-
|
|
28
|
+
<h1 className="mb-2 text-3xl font-bold tracking-tight text-foreground">
|
|
29
29
|
Privacy Policy
|
|
30
30
|
</h1>
|
|
31
|
-
<p className="mb-8 text-sm text-
|
|
31
|
+
<p className="mb-8 text-sm text-muted-foreground">
|
|
32
32
|
Effective: {effectiveDate}
|
|
33
33
|
</p>
|
|
34
34
|
|
|
35
|
-
<div className="prose
|
|
35
|
+
<div className="prose dark:prose-invert max-w-none">
|
|
36
36
|
<section>
|
|
37
37
|
<h2>1. Information We Collect</h2>
|
|
38
38
|
<p>We collect information you provide directly:</p>
|
|
@@ -23,16 +23,16 @@ export default function TermsPage() {
|
|
|
23
23
|
} = LEGAL_CONFIG;
|
|
24
24
|
|
|
25
25
|
return (
|
|
26
|
-
<main className="min-h-screen bg-
|
|
26
|
+
<main className="min-h-screen bg-background">
|
|
27
27
|
<div className="mx-auto max-w-3xl px-4 py-16 sm:px-6 lg:px-8">
|
|
28
|
-
<h1 className="mb-2 text-3xl font-bold tracking-tight text-
|
|
28
|
+
<h1 className="mb-2 text-3xl font-bold tracking-tight text-foreground">
|
|
29
29
|
Terms of Service
|
|
30
30
|
</h1>
|
|
31
|
-
<p className="mb-8 text-sm text-
|
|
31
|
+
<p className="mb-8 text-sm text-muted-foreground">
|
|
32
32
|
Effective: {effectiveDate}
|
|
33
33
|
</p>
|
|
34
34
|
|
|
35
|
-
<div className="prose
|
|
35
|
+
<div className="prose dark:prose-invert max-w-none">
|
|
36
36
|
<section>
|
|
37
37
|
<h2>1. Acceptance of Terms</h2>
|
|
38
38
|
<p>
|
|
@@ -13,7 +13,7 @@ export function Skeleton({
|
|
|
13
13
|
}) {
|
|
14
14
|
return (
|
|
15
15
|
<div
|
|
16
|
-
className={`animate-pulse rounded bg-
|
|
16
|
+
className={`animate-pulse rounded bg-muted ${className}`}
|
|
17
17
|
/>
|
|
18
18
|
);
|
|
19
19
|
}
|
|
@@ -21,7 +21,7 @@ export function Skeleton({
|
|
|
21
21
|
/** Skeleton for a card with title, description, and action area */
|
|
22
22
|
export function CardSkeleton() {
|
|
23
23
|
return (
|
|
24
|
-
<div className="rounded-lg border border-
|
|
24
|
+
<div className="rounded-lg border border-border p-6">
|
|
25
25
|
<Skeleton className="mb-4 h-4 w-3/4" />
|
|
26
26
|
<Skeleton className="mb-2 h-3 w-full" />
|
|
27
27
|
<Skeleton className="mb-4 h-3 w-5/6" />
|
|
@@ -46,7 +46,7 @@ export function TableSkeleton({ rows = 5 }: { rows?: number }) {
|
|
|
46
46
|
return (
|
|
47
47
|
<div className="space-y-3">
|
|
48
48
|
{/* Header */}
|
|
49
|
-
<div className="flex gap-4 border-b border-
|
|
49
|
+
<div className="flex gap-4 border-b border-border pb-3">
|
|
50
50
|
<Skeleton className="h-4 w-1/4" />
|
|
51
51
|
<Skeleton className="h-4 w-1/3" />
|
|
52
52
|
<Skeleton className="h-4 w-1/4" />
|
|
@@ -89,7 +89,7 @@ export function PageSkeleton() {
|
|
|
89
89
|
export function LoadingSpinner() {
|
|
90
90
|
return (
|
|
91
91
|
<div className="flex min-h-[50vh] items-center justify-center">
|
|
92
|
-
<div className="h-8 w-8 animate-spin rounded-full border-4 border-
|
|
92
|
+
<div className="h-8 w-8 animate-spin rounded-full border-4 border-muted border-t-primary" />
|
|
93
93
|
</div>
|
|
94
94
|
);
|
|
95
95
|
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
2
|
+
# MOCK MODE (default: enabled for local development)
|
|
3
|
+
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
4
|
+
# true = Mock user, mock data, no auth required, all pages accessible
|
|
5
|
+
# false = Real providers required (configure below)
|
|
6
|
+
NEXT_PUBLIC_MOCK_MODE=true
|
|
7
|
+
|
|
8
|
+
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
9
|
+
# AUTH PROVIDER β uncomment and configure your chosen provider
|
|
10
|
+
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
11
|
+
|
|
12
|
+
# --- Supabase ---
|
|
13
|
+
# NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
|
|
14
|
+
# NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
|
|
15
|
+
# SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
|
|
16
|
+
|
|
17
|
+
# --- Firebase ---
|
|
18
|
+
# NEXT_PUBLIC_FIREBASE_API_KEY=
|
|
19
|
+
# NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
|
|
20
|
+
# NEXT_PUBLIC_FIREBASE_PROJECT_ID=
|
|
21
|
+
|
|
22
|
+
# --- Keycloak ---
|
|
23
|
+
# KEYCLOAK_ISSUER=https://auth.yourdomain.com/realms/your-realm
|
|
24
|
+
# KEYCLOAK_CLIENT_ID=your-client-id
|
|
25
|
+
# KEYCLOAK_CLIENT_SECRET=your-client-secret
|
|
26
|
+
|
|
27
|
+
# --- NextAuth / Auth.js ---
|
|
28
|
+
# AUTH_SECRET=your-secret-here
|
|
29
|
+
# NEXTAUTH_URL=http://localhost:3000
|
|
30
|
+
|
|
31
|
+
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
32
|
+
# DATABASE β uncomment and configure your chosen provider
|
|
33
|
+
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
34
|
+
|
|
35
|
+
# --- PostgreSQL (direct) ---
|
|
36
|
+
# DATABASE_URL=postgres://user:password@localhost:5432/mydb
|
|
37
|
+
|
|
38
|
+
# --- Supabase (uses same URL as auth above) ---
|
|
39
|
+
|
|
40
|
+
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
41
|
+
# PAYMENTS β uncomment when ready
|
|
42
|
+
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
43
|
+
|
|
44
|
+
# STRIPE_SECRET_KEY=sk_test_...
|
|
45
|
+
# STRIPE_WEBHOOK_SECRET=whsec_...
|
|
46
|
+
# NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...
|
|
47
|
+
|
|
48
|
+
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
49
|
+
# OPTIONAL SERVICES
|
|
50
|
+
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
51
|
+
|
|
52
|
+
# REDIS_URL=redis://localhost:6379
|
|
53
|
+
# RESEND_API_KEY=re_...
|
|
54
|
+
# OPENAI_API_KEY=sk-...
|
|
55
|
+
# ANTHROPIC_API_KEY=sk-ant-...
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { createContext, useContext, useState, useCallback, type ReactNode } from 'react';
|
|
4
|
+
import { MOCK_MODE, MOCK_USER, type MockUser } from '@/lib/mock';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Mock Auth Context β provides login/logout state for mock mode.
|
|
8
|
+
*
|
|
9
|
+
* When MOCK_MODE=true:
|
|
10
|
+
* - User starts as "logged in" with MOCK_USER
|
|
11
|
+
* - signOut() sets user to null (shows logged-out UI)
|
|
12
|
+
* - signIn() restores mock user (shows logged-in UI)
|
|
13
|
+
* - All pages still accessible (no real redirects)
|
|
14
|
+
*
|
|
15
|
+
* When MOCK_MODE=false:
|
|
16
|
+
* - This provider is a passthrough (renders children only)
|
|
17
|
+
* - TODO: [REAL_DATA] Replace with your real auth provider
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
type MockAuthState = {
|
|
21
|
+
user: MockUser | null;
|
|
22
|
+
isAuthenticated: boolean;
|
|
23
|
+
signIn: (email?: string, password?: string) => void;
|
|
24
|
+
signOut: () => void;
|
|
25
|
+
loading: boolean;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const MockAuthContext = createContext<MockAuthState | undefined>(undefined);
|
|
29
|
+
|
|
30
|
+
export function MockAuthProvider({ children }: { children: ReactNode }) {
|
|
31
|
+
const [user, setUser] = useState<MockUser | null>(MOCK_MODE ? MOCK_USER : null);
|
|
32
|
+
const [loading] = useState(false);
|
|
33
|
+
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
35
|
+
const signIn = useCallback((_email?: string, _password?: string) => {
|
|
36
|
+
// TODO: [REAL_DATA] Replace with your auth provider's sign in
|
|
37
|
+
setUser(MOCK_USER);
|
|
38
|
+
}, []);
|
|
39
|
+
|
|
40
|
+
const signOut = useCallback(() => {
|
|
41
|
+
// TODO: [REAL_DATA] Replace with your auth provider's sign out
|
|
42
|
+
setUser(null);
|
|
43
|
+
}, []);
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<MockAuthContext.Provider value={{ user, isAuthenticated: !!user, signIn, signOut, loading }}>
|
|
47
|
+
{children}
|
|
48
|
+
</MockAuthContext.Provider>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Hook to access mock auth state.
|
|
54
|
+
* Works identically to a real useAuth() hook β same shape, same behavior.
|
|
55
|
+
*
|
|
56
|
+
* TODO: [REAL_DATA] When switching to a real auth provider, replace
|
|
57
|
+
* useMockAuth() calls with your provider's hook (e.g. useAuth(), useSession()).
|
|
58
|
+
*/
|
|
59
|
+
export function useMockAuth() {
|
|
60
|
+
const context = useContext(MockAuthContext);
|
|
61
|
+
if (context === undefined) {
|
|
62
|
+
// Fallback for non-mock mode or missing provider
|
|
63
|
+
return {
|
|
64
|
+
user: null,
|
|
65
|
+
isAuthenticated: false,
|
|
66
|
+
signIn: () => {},
|
|
67
|
+
signOut: () => {},
|
|
68
|
+
loading: false,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return context;
|
|
72
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useState, useEffect } from 'react';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Mock mode indicator banner.
|
|
7
|
+
* Shown at the top of every page when NEXT_PUBLIC_MOCK_MODE=true.
|
|
8
|
+
* Uses useEffect to render only on the client (avoids SSR double-render).
|
|
9
|
+
*/
|
|
10
|
+
export function MockBanner() {
|
|
11
|
+
const [show, setShow] = useState(false);
|
|
12
|
+
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
setShow(process.env.NEXT_PUBLIC_MOCK_MODE === 'true');
|
|
15
|
+
}, []);
|
|
16
|
+
|
|
17
|
+
if (!show) return null;
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<div className="bg-primary/10 border-b border-primary/20 px-4 py-2 text-center text-xs text-primary">
|
|
21
|
+
<strong>Mock Mode</strong> β Showing demo data. All pages accessible without auth.
|
|
22
|
+
<span className="hidden sm:inline">
|
|
23
|
+
{' '}Set <code className="rounded bg-primary/10 px-1 py-0.5 font-mono">NEXT_PUBLIC_MOCK_MODE=false</code> and
|
|
24
|
+
configure your providers to use real data. Search for{' '}
|
|
25
|
+
<code className="rounded bg-primary/10 px-1 py-0.5 font-mono">TODO: [REAL_DATA]</code> in the code.
|
|
26
|
+
</span>
|
|
27
|
+
</div>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock Mode β for local development and template smoke testing.
|
|
3
|
+
*
|
|
4
|
+
* Set NEXT_PUBLIC_MOCK_MODE=true in .env.local to enable.
|
|
5
|
+
* Provides mock user, mock data, and bypasses all auth/provider checks
|
|
6
|
+
* so you can explore every page without any backend configuration.
|
|
7
|
+
*
|
|
8
|
+
* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
9
|
+
* β TO CONNECT REAL PROVIDERS: β
|
|
10
|
+
* β β
|
|
11
|
+
* β 1. Set NEXT_PUBLIC_MOCK_MODE=false in .env.local β
|
|
12
|
+
* β 2. Configure your auth provider (see .env.example) β
|
|
13
|
+
* β 3. Configure your database provider β
|
|
14
|
+
* β 4. Search for "TODO: [REAL_DATA]" in this codebase β
|
|
15
|
+
* β to find all mockβreal integration points β
|
|
16
|
+
* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
17
|
+
*
|
|
18
|
+
* This file is provider-agnostic β works with Supabase, Firebase,
|
|
19
|
+
* Keycloak, Auth0, NextAuth, or any custom auth/database solution.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
23
|
+
// CORE
|
|
24
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
25
|
+
|
|
26
|
+
export const MOCK_MODE = process.env.NEXT_PUBLIC_MOCK_MODE === 'true';
|
|
27
|
+
|
|
28
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
29
|
+
// MOCK USER
|
|
30
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
31
|
+
|
|
32
|
+
export const MOCK_USER = {
|
|
33
|
+
id: 'mock-user-000-0000-000000000000',
|
|
34
|
+
email: 'demo@example.com',
|
|
35
|
+
name: 'Demo User',
|
|
36
|
+
avatar_url: null,
|
|
37
|
+
role: 'admin' as const,
|
|
38
|
+
plan: 'pro' as const,
|
|
39
|
+
createdAt: '2025-01-15T00:00:00Z',
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export type MockUser = typeof MOCK_USER;
|
|
43
|
+
|
|
44
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
45
|
+
// MOCK DASHBOARD DATA
|
|
46
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
47
|
+
|
|
48
|
+
export const MOCK_STATS = {
|
|
49
|
+
totalUsers: 1_234,
|
|
50
|
+
activeUsers: 847,
|
|
51
|
+
revenue: 12_580,
|
|
52
|
+
mrr: 4_250,
|
|
53
|
+
growth: 12.5,
|
|
54
|
+
churn: 2.1,
|
|
55
|
+
newSignups: 42,
|
|
56
|
+
avgSessionMinutes: 8.3,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export const MOCK_RECENT_ACTIVITY = [
|
|
60
|
+
{ id: '1', action: 'New signup', user: 'alice@example.com', timestamp: '2 min ago' },
|
|
61
|
+
{ id: '2', action: 'Plan upgraded', user: 'bob@corp.io', timestamp: '15 min ago' },
|
|
62
|
+
{ id: '3', action: 'Invoice paid', user: 'carol@startup.co', timestamp: '1 hour ago' },
|
|
63
|
+
{ id: '4', action: 'Support ticket', user: 'dave@agency.com', timestamp: '2 hours ago' },
|
|
64
|
+
{ id: '5', action: 'New signup', user: 'eve@freelance.dev', timestamp: '3 hours ago' },
|
|
65
|
+
];
|
|
66
|
+
|
|
67
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
68
|
+
// MOCK BILLING DATA
|
|
69
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
70
|
+
|
|
71
|
+
export const MOCK_SUBSCRIPTION = {
|
|
72
|
+
plan: 'Pro',
|
|
73
|
+
status: 'active' as const,
|
|
74
|
+
price: '$29/month',
|
|
75
|
+
nextBilling: '2025-04-15',
|
|
76
|
+
cardLast4: '4242',
|
|
77
|
+
cardBrand: 'Visa',
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export const MOCK_INVOICES = [
|
|
81
|
+
{ id: 'inv_001', date: '2025-03-01', amount: '$29.00', status: 'paid' as const },
|
|
82
|
+
{ id: 'inv_002', date: '2025-02-01', amount: '$29.00', status: 'paid' as const },
|
|
83
|
+
{ id: 'inv_003', date: '2025-01-01', amount: '$29.00', status: 'paid' as const },
|
|
84
|
+
];
|
|
85
|
+
|
|
86
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
87
|
+
// MOCK PRODUCTS (for marketplace/checkout)
|
|
88
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
89
|
+
|
|
90
|
+
export const MOCK_PRODUCTS = [
|
|
91
|
+
{
|
|
92
|
+
id: 'prod_1',
|
|
93
|
+
name: 'Starter',
|
|
94
|
+
price: 9,
|
|
95
|
+
features: ['1,000 users', 'Basic analytics', 'Email support'],
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
id: 'prod_2',
|
|
99
|
+
name: 'Pro',
|
|
100
|
+
price: 29,
|
|
101
|
+
features: ['Unlimited users', 'Advanced analytics', 'Priority support', 'Custom domains'],
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: 'prod_3',
|
|
105
|
+
name: 'Enterprise',
|
|
106
|
+
price: 99,
|
|
107
|
+
features: ['Everything in Pro', 'SSO/SAML', 'Dedicated support', 'SLA guarantee'],
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
|
|
111
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
112
|
+
// MOCK NOTIFICATIONS
|
|
113
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
114
|
+
|
|
115
|
+
export const MOCK_NOTIFICATIONS = [
|
|
116
|
+
{
|
|
117
|
+
id: 'n1',
|
|
118
|
+
title: 'Welcome!',
|
|
119
|
+
message: 'Your account is set up and ready to go.',
|
|
120
|
+
read: true,
|
|
121
|
+
timestamp: '1 day ago',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
id: 'n2',
|
|
125
|
+
title: 'New feature',
|
|
126
|
+
message: 'Check out our latest dashboard improvements.',
|
|
127
|
+
read: false,
|
|
128
|
+
timestamp: '2 hours ago',
|
|
129
|
+
},
|
|
130
|
+
];
|
|
131
|
+
|
|
132
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
133
|
+
// HELPERS
|
|
134
|
+
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Returns mock data when in mock mode, or calls the real fetcher.
|
|
138
|
+
* Use this to wrap any data-fetching function for easy mockβreal transition.
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* // TODO: [REAL_DATA] Replace mockData with your actual API call
|
|
142
|
+
* const stats = await mockOr(MOCK_STATS, () => fetchDashboardStats());
|
|
143
|
+
*/
|
|
144
|
+
export async function mockOr<T>(mockData: T, realFetcher: () => Promise<T>): Promise<T> {
|
|
145
|
+
if (MOCK_MODE) return mockData;
|
|
146
|
+
return realFetcher();
|
|
147
|
+
}
|
|
@@ -15,9 +15,11 @@ import { enforceRateLimit, AppRateLimits } from '@/lib/api-security';
|
|
|
15
15
|
|
|
16
16
|
export const dynamic = 'force-dynamic';
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
function getStripe() {
|
|
19
|
+
return new Stripe(process.env.STRIPE_SECRET_KEY!, {
|
|
20
|
+
apiVersion: '2025-02-24.acacia',
|
|
21
|
+
});
|
|
22
|
+
}
|
|
21
23
|
|
|
22
24
|
/**
|
|
23
25
|
* Check if this webhook event has already been processed (idempotency).
|
|
@@ -49,7 +51,11 @@ export async function POST(request: NextRequest) {
|
|
|
49
51
|
|
|
50
52
|
let event: Stripe.Event;
|
|
51
53
|
try {
|
|
52
|
-
event =
|
|
54
|
+
event = getStripe().webhooks.constructEvent(
|
|
55
|
+
body,
|
|
56
|
+
signature,
|
|
57
|
+
process.env.STRIPE_WEBHOOK_SECRET!,
|
|
58
|
+
);
|
|
53
59
|
} catch (err) {
|
|
54
60
|
console.error('[Stripe Webhook] Signature verification failed:', err);
|
|
55
61
|
return NextResponse.json({ error: 'Invalid signature' }, { status: 400 });
|
|
@@ -32,7 +32,7 @@ export function getRedisClient(): RedisClient | null {
|
|
|
32
32
|
|
|
33
33
|
try {
|
|
34
34
|
// Dynamic require β only loads if ioredis is installed
|
|
35
|
-
// eslint-disable-next-line
|
|
35
|
+
// eslint-disable-next-line
|
|
36
36
|
const Redis = require('ioredis');
|
|
37
37
|
_client = new Redis(url, {
|
|
38
38
|
keyPrefix: process.env.REDIS_KEY_PREFIX || 'app:',
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { dirname } from 'path';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { FlatCompat } from '@eslint/eslintrc';
|
|
4
|
+
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
7
|
+
|
|
8
|
+
const compat = new FlatCompat({
|
|
9
|
+
baseDirectory: __dirname,
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const eslintConfig = [...compat.extends('next/core-web-vitals')];
|
|
13
|
+
|
|
14
|
+
export default eslintConfig;
|
|
@@ -16,7 +16,7 @@ export async function GET(request: NextRequest) {
|
|
|
16
16
|
{
|
|
17
17
|
cookies: {
|
|
18
18
|
getAll: () => cookieStore.getAll(),
|
|
19
|
-
setAll: (cookiesToSet) => {
|
|
19
|
+
setAll: (cookiesToSet: Array<{ name: string; value: string; options?: Record<string, unknown> }>) => {
|
|
20
20
|
cookiesToSet.forEach(({ name, value, options }) =>
|
|
21
21
|
cookieStore.set(name, value, options)
|
|
22
22
|
);
|