@nextsparkjs/core 0.1.0-beta.82 → 0.1.0-beta.83
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/dist/components/entities/wrappers/EntityDetailWrapper.d.ts.map +1 -1
- package/dist/components/entities/wrappers/EntityDetailWrapper.js +11 -39
- package/dist/hooks/useEntityQuery.d.ts.map +1 -1
- package/dist/hooks/useEntityQuery.js +21 -3
- package/dist/lib/theme/get-default-theme-mode.d.ts +11 -0
- package/dist/lib/theme/get-default-theme-mode.d.ts.map +1 -1
- package/dist/lib/theme/get-default-theme-mode.js +42 -25
- package/dist/styles/classes.json +1 -1
- package/dist/types/theme.d.ts +2 -0
- package/dist/types/theme.d.ts.map +1 -1
- package/package.json +16 -16
- package/scripts/build/docs-registry.mjs +0 -0
- package/scripts/create-theme.mjs +0 -0
- package/scripts/deploy/release-version.mjs +0 -0
- package/scripts/deploy/vercel-deploy.mjs +0 -0
- package/scripts/dev/watch-plugins.mjs +0 -0
- package/scripts/maintenance/update-core.mjs +0 -0
- package/scripts/setup/npm-postinstall.mjs +0 -0
- package/scripts/setup/setup-claude.mjs +0 -0
- package/scripts/validation/check-imports.sh +0 -0
- package/dist/templates/app/(auth)/forgot-password/page.tsx +0 -216
- package/dist/templates/app/(auth)/layout.tsx +0 -51
- package/dist/templates/app/(auth)/login/page.tsx +0 -21
- package/dist/templates/app/(auth)/reset-password/page.tsx +0 -212
- package/dist/templates/app/(auth)/signup/page.tsx +0 -21
- package/dist/templates/app/(auth)/verify-email/page.tsx +0 -190
- package/dist/templates/app/(public)/[...slug]/page.tsx +0 -378
- package/dist/templates/app/(public)/docs/[section]/[page]/page.tsx +0 -90
- package/dist/templates/app/(public)/docs/layout.tsx +0 -25
- package/dist/templates/app/(public)/docs/page.tsx +0 -81
- package/dist/templates/app/(public)/layout.tsx +0 -41
- package/dist/templates/app/(public)/page.tsx +0 -19
- package/dist/templates/app/403/page.tsx +0 -89
- package/dist/templates/app/api/auth/[...all]/route.ts +0 -78
- package/dist/templates/app/api/cron/billing/lifecycle/route.ts +0 -98
- package/dist/templates/app/api/csp-report/route.ts +0 -175
- package/dist/templates/app/api/devtools/config/entities/route.ts +0 -108
- package/dist/templates/app/api/devtools/config/theme/route.ts +0 -66
- package/dist/templates/app/api/devtools/tests/[...path]/route.ts +0 -130
- package/dist/templates/app/api/devtools/tests/route.ts +0 -134
- package/dist/templates/app/api/health/route.ts +0 -29
- package/dist/templates/app/api/internal/user-metadata/route.ts +0 -36
- package/dist/templates/app/api/superadmin/subscriptions/route.ts +0 -310
- package/dist/templates/app/api/superadmin/teams/[teamId]/route.ts +0 -286
- package/dist/templates/app/api/superadmin/teams/route.ts +0 -188
- package/dist/templates/app/api/superadmin/users/[userId]/route.ts +0 -540
- package/dist/templates/app/api/superadmin/users/route.ts +0 -323
- package/dist/templates/app/api/user/delete-account/route.ts +0 -55
- package/dist/templates/app/api/user/plan-flags/route.ts +0 -283
- package/dist/templates/app/api/user/profile/route.ts +0 -133
- package/dist/templates/app/api/v1/[entity]/[id]/child/[childType]/[childId]/route.ts +0 -210
- package/dist/templates/app/api/v1/[entity]/[id]/child/[childType]/route.ts +0 -331
- package/dist/templates/app/api/v1/[entity]/[id]/route.ts +0 -35
- package/dist/templates/app/api/v1/[entity]/docs.md +0 -369
- package/dist/templates/app/api/v1/[entity]/presets.ts +0 -194
- package/dist/templates/app/api/v1/[entity]/route.ts +0 -31
- package/dist/templates/app/api/v1/api-keys/[id]/route.ts +0 -303
- package/dist/templates/app/api/v1/api-keys/docs.md +0 -101
- package/dist/templates/app/api/v1/api-keys/presets.ts +0 -31
- package/dist/templates/app/api/v1/api-keys/route.ts +0 -250
- package/dist/templates/app/api/v1/auth/docs.md +0 -184
- package/dist/templates/app/api/v1/auth/presets.ts +0 -44
- package/dist/templates/app/api/v1/auth/signup-with-invite/route.ts +0 -227
- package/dist/templates/app/api/v1/billing/cancel/route.ts +0 -206
- package/dist/templates/app/api/v1/billing/change-plan/route.ts +0 -97
- package/dist/templates/app/api/v1/billing/check-action/route.ts +0 -81
- package/dist/templates/app/api/v1/billing/checkout/route.ts +0 -124
- package/dist/templates/app/api/v1/billing/docs.md +0 -209
- package/dist/templates/app/api/v1/billing/plans/route.ts +0 -85
- package/dist/templates/app/api/v1/billing/portal/route.ts +0 -90
- package/dist/templates/app/api/v1/billing/presets.ts +0 -121
- package/dist/templates/app/api/v1/billing/webhooks/stripe/route.ts +0 -428
- package/dist/templates/app/api/v1/blocks/[slug]/route.ts +0 -29
- package/dist/templates/app/api/v1/blocks/docs.md +0 -173
- package/dist/templates/app/api/v1/blocks/presets.ts +0 -121
- package/dist/templates/app/api/v1/blocks/route.ts +0 -45
- package/dist/templates/app/api/v1/blocks/validate/route.ts +0 -45
- package/dist/templates/app/api/v1/cron/docs.md +0 -116
- package/dist/templates/app/api/v1/cron/presets.ts +0 -26
- package/dist/templates/app/api/v1/cron/process/route.ts +0 -108
- package/dist/templates/app/api/v1/devtools/blocks/route.ts +0 -82
- package/dist/templates/app/api/v1/devtools/docs/route.ts +0 -150
- package/dist/templates/app/api/v1/devtools/docs.md +0 -204
- package/dist/templates/app/api/v1/devtools/features/route.ts +0 -61
- package/dist/templates/app/api/v1/devtools/flows/route.ts +0 -61
- package/dist/templates/app/api/v1/devtools/presets.ts +0 -113
- package/dist/templates/app/api/v1/devtools/scheduled-actions/route.ts +0 -120
- package/dist/templates/app/api/v1/devtools/testing/route.ts +0 -82
- package/dist/templates/app/api/v1/media/docs.md +0 -117
- package/dist/templates/app/api/v1/media/presets.ts +0 -24
- package/dist/templates/app/api/v1/media/upload/route.ts +0 -150
- package/dist/templates/app/api/v1/patterns/[id]/usages/route.ts +0 -116
- package/dist/templates/app/api/v1/plugin/[...path]/route.ts +0 -373
- package/dist/templates/app/api/v1/plugin/docs.md +0 -79
- package/dist/templates/app/api/v1/plugin/presets.ts +0 -21
- package/dist/templates/app/api/v1/plugin/route.ts +0 -96
- package/dist/templates/app/api/v1/post-categories/[id]/route.ts +0 -255
- package/dist/templates/app/api/v1/post-categories/docs.md +0 -134
- package/dist/templates/app/api/v1/post-categories/presets.ts +0 -78
- package/dist/templates/app/api/v1/post-categories/route.ts +0 -119
- package/dist/templates/app/api/v1/team-invitations/[token]/accept/route.ts +0 -179
- package/dist/templates/app/api/v1/team-invitations/[token]/decline/route.ts +0 -120
- package/dist/templates/app/api/v1/team-invitations/[token]/route.ts +0 -89
- package/dist/templates/app/api/v1/team-invitations/docs.md +0 -88
- package/dist/templates/app/api/v1/team-invitations/presets.ts +0 -43
- package/dist/templates/app/api/v1/team-invitations/route.ts +0 -114
- package/dist/templates/app/api/v1/teams/[teamId]/invitations/route.ts +0 -171
- package/dist/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +0 -105
- package/dist/templates/app/api/v1/teams/[teamId]/invoices/route.ts +0 -125
- package/dist/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +0 -263
- package/dist/templates/app/api/v1/teams/[teamId]/members/route.ts +0 -358
- package/dist/templates/app/api/v1/teams/[teamId]/route.ts +0 -322
- package/dist/templates/app/api/v1/teams/[teamId]/subscription/route.ts +0 -50
- package/dist/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +0 -91
- package/dist/templates/app/api/v1/teams/docs.md +0 -320
- package/dist/templates/app/api/v1/teams/presets.ts +0 -178
- package/dist/templates/app/api/v1/teams/route.ts +0 -293
- package/dist/templates/app/api/v1/teams/switch/route.ts +0 -88
- package/dist/templates/app/api/v1/theme/[...path]/route.ts +0 -361
- package/dist/templates/app/api/v1/theme/docs.md +0 -74
- package/dist/templates/app/api/v1/theme/presets.ts +0 -21
- package/dist/templates/app/api/v1/theme/route.ts +0 -96
- package/dist/templates/app/api/v1/users/[id]/meta/[key]/route.ts +0 -363
- package/dist/templates/app/api/v1/users/[id]/route.ts +0 -302
- package/dist/templates/app/api/v1/users/docs.md +0 -93
- package/dist/templates/app/api/v1/users/presets.ts +0 -59
- package/dist/templates/app/api/v1/users/route.ts +0 -197
- package/dist/templates/app/dashboard/(main)/[entity]/[id]/edit/page.tsx +0 -117
- package/dist/templates/app/dashboard/(main)/[entity]/[id]/page.tsx +0 -103
- package/dist/templates/app/dashboard/(main)/[entity]/create/page.tsx +0 -95
- package/dist/templates/app/dashboard/(main)/[entity]/error.tsx +0 -51
- package/dist/templates/app/dashboard/(main)/[entity]/layout.tsx +0 -113
- package/dist/templates/app/dashboard/(main)/[entity]/loading.tsx +0 -61
- package/dist/templates/app/dashboard/(main)/[entity]/page.tsx +0 -90
- package/dist/templates/app/dashboard/(main)/layout.tsx +0 -98
- package/dist/templates/app/dashboard/(main)/loading.tsx +0 -5
- package/dist/templates/app/dashboard/(main)/page.tsx +0 -201
- package/dist/templates/app/dashboard/(main)/patterns/[id]/edit/page.tsx +0 -114
- package/dist/templates/app/dashboard/(main)/patterns/[id]/page.tsx +0 -20
- package/dist/templates/app/dashboard/(main)/patterns/[id]/reports/page.tsx +0 -171
- package/dist/templates/app/dashboard/(main)/patterns/create/page.tsx +0 -86
- package/dist/templates/app/dashboard/(main)/patterns/page.tsx +0 -444
- package/dist/templates/app/dashboard/features/analytics/page.tsx +0 -35
- package/dist/templates/app/dashboard/features/automation/page.tsx +0 -35
- package/dist/templates/app/dashboard/features/layout.tsx +0 -13
- package/dist/templates/app/dashboard/features/loading.tsx +0 -5
- package/dist/templates/app/dashboard/features/webhooks/page.tsx +0 -35
- package/dist/templates/app/dashboard/layout.tsx +0 -86
- package/dist/templates/app/dashboard/permission-denied/page.tsx +0 -29
- package/dist/templates/app/dashboard/settings/api-keys/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/api-keys/page.tsx +0 -513
- package/dist/templates/app/dashboard/settings/billing/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/billing/page.tsx +0 -284
- package/dist/templates/app/dashboard/settings/invoices/[invoiceNumber]/page.tsx +0 -222
- package/dist/templates/app/dashboard/settings/invoices/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/invoices/page.tsx +0 -82
- package/dist/templates/app/dashboard/settings/layout.tsx +0 -151
- package/dist/templates/app/dashboard/settings/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/notifications/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/notifications/page.tsx +0 -462
- package/dist/templates/app/dashboard/settings/page.tsx +0 -92
- package/dist/templates/app/dashboard/settings/password/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/password/page.tsx +0 -306
- package/dist/templates/app/dashboard/settings/plans/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/plans/page.tsx +0 -40
- package/dist/templates/app/dashboard/settings/profile/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/profile/page.tsx +0 -686
- package/dist/templates/app/dashboard/settings/security/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/security/page.tsx +0 -505
- package/dist/templates/app/dashboard/settings/teams/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/teams/page.tsx +0 -272
- package/dist/templates/app/dashboard/settings/teams/permissions/page.tsx +0 -92
- package/dist/templates/app/devtools/blocks/[slug]/page.tsx +0 -39
- package/dist/templates/app/devtools/blocks/page.tsx +0 -31
- package/dist/templates/app/devtools/config/page.tsx +0 -31
- package/dist/templates/app/devtools/features/page.tsx +0 -31
- package/dist/templates/app/devtools/flows/page.tsx +0 -31
- package/dist/templates/app/devtools/layout.tsx +0 -58
- package/dist/templates/app/devtools/page.tsx +0 -121
- package/dist/templates/app/devtools/scheduled-actions/page.tsx +0 -157
- package/dist/templates/app/devtools/style/page.tsx +0 -330
- package/dist/templates/app/devtools/tags/page.tsx +0 -31
- package/dist/templates/app/devtools/tests/[[...path]]/page.tsx +0 -47
- package/dist/templates/app/favicon.ico +0 -0
- package/dist/templates/app/globals.css +0 -12
- package/dist/templates/app/layout.tsx +0 -96
- package/dist/templates/app/public/page.tsx +0 -30
- package/dist/templates/app/superadmin/docs/[section]/[page]/page.tsx +0 -92
- package/dist/templates/app/superadmin/docs/page.tsx +0 -75
- package/dist/templates/app/superadmin/layout.tsx +0 -67
- package/dist/templates/app/superadmin/page.tsx +0 -149
- package/dist/templates/app/superadmin/subscriptions/page.tsx +0 -655
- package/dist/templates/app/superadmin/team-roles/page.tsx +0 -493
- package/dist/templates/app/superadmin/teams/[teamId]/page.tsx +0 -687
- package/dist/templates/app/superadmin/teams/page.tsx +0 -302
- package/dist/templates/app/superadmin/users/[userId]/page.tsx +0 -548
- package/dist/templates/app/superadmin/users/page.tsx +0 -528
- package/templates/app/(auth)/forgot-password/page.tsx +0 -216
- package/templates/app/(auth)/layout.tsx +0 -51
- package/templates/app/(auth)/login/page.tsx +0 -21
- package/templates/app/(auth)/reset-password/page.tsx +0 -212
- package/templates/app/(auth)/signup/page.tsx +0 -21
- package/templates/app/(auth)/verify-email/page.tsx +0 -190
- package/templates/app/(public)/[...slug]/page.tsx +0 -378
- package/templates/app/(public)/docs/[section]/[page]/page.tsx +0 -90
- package/templates/app/(public)/docs/layout.tsx +0 -25
- package/templates/app/(public)/docs/page.tsx +0 -81
- package/templates/app/(public)/layout.tsx +0 -41
- package/templates/app/(public)/page.tsx +0 -19
- package/templates/app/403/page.tsx +0 -89
- package/templates/app/api/auth/[...all]/route.ts +0 -78
- package/templates/app/api/cron/billing/lifecycle/route.ts +0 -98
- package/templates/app/api/csp-report/route.ts +0 -175
- package/templates/app/api/devtools/config/entities/route.ts +0 -108
- package/templates/app/api/devtools/config/theme/route.ts +0 -66
- package/templates/app/api/devtools/tests/[...path]/route.ts +0 -130
- package/templates/app/api/devtools/tests/route.ts +0 -134
- package/templates/app/api/health/route.ts +0 -29
- package/templates/app/api/internal/user-metadata/route.ts +0 -36
- package/templates/app/api/superadmin/subscriptions/route.ts +0 -310
- package/templates/app/api/superadmin/teams/[teamId]/route.ts +0 -286
- package/templates/app/api/superadmin/teams/route.ts +0 -188
- package/templates/app/api/superadmin/users/[userId]/route.ts +0 -540
- package/templates/app/api/superadmin/users/route.ts +0 -323
- package/templates/app/api/user/delete-account/route.ts +0 -55
- package/templates/app/api/user/plan-flags/route.ts +0 -283
- package/templates/app/api/user/profile/route.ts +0 -133
- package/templates/app/api/v1/[entity]/[id]/child/[childType]/[childId]/route.ts +0 -210
- package/templates/app/api/v1/[entity]/[id]/child/[childType]/route.ts +0 -331
- package/templates/app/api/v1/[entity]/[id]/route.ts +0 -35
- package/templates/app/api/v1/[entity]/docs.md +0 -369
- package/templates/app/api/v1/[entity]/presets.ts +0 -194
- package/templates/app/api/v1/[entity]/route.ts +0 -31
- package/templates/app/api/v1/api-keys/[id]/route.ts +0 -303
- package/templates/app/api/v1/api-keys/docs.md +0 -101
- package/templates/app/api/v1/api-keys/presets.ts +0 -31
- package/templates/app/api/v1/api-keys/route.ts +0 -250
- package/templates/app/api/v1/auth/docs.md +0 -184
- package/templates/app/api/v1/auth/presets.ts +0 -44
- package/templates/app/api/v1/auth/signup-with-invite/route.ts +0 -227
- package/templates/app/api/v1/billing/cancel/route.ts +0 -206
- package/templates/app/api/v1/billing/change-plan/route.ts +0 -97
- package/templates/app/api/v1/billing/check-action/route.ts +0 -81
- package/templates/app/api/v1/billing/checkout/route.ts +0 -124
- package/templates/app/api/v1/billing/docs.md +0 -209
- package/templates/app/api/v1/billing/plans/route.ts +0 -85
- package/templates/app/api/v1/billing/portal/route.ts +0 -90
- package/templates/app/api/v1/billing/presets.ts +0 -121
- package/templates/app/api/v1/billing/webhooks/stripe/route.ts +0 -428
- package/templates/app/api/v1/blocks/[slug]/route.ts +0 -29
- package/templates/app/api/v1/blocks/docs.md +0 -173
- package/templates/app/api/v1/blocks/presets.ts +0 -121
- package/templates/app/api/v1/blocks/route.ts +0 -45
- package/templates/app/api/v1/blocks/validate/route.ts +0 -45
- package/templates/app/api/v1/cron/docs.md +0 -116
- package/templates/app/api/v1/cron/presets.ts +0 -26
- package/templates/app/api/v1/cron/process/route.ts +0 -108
- package/templates/app/api/v1/devtools/blocks/route.ts +0 -82
- package/templates/app/api/v1/devtools/docs/route.ts +0 -150
- package/templates/app/api/v1/devtools/docs.md +0 -204
- package/templates/app/api/v1/devtools/features/route.ts +0 -61
- package/templates/app/api/v1/devtools/flows/route.ts +0 -61
- package/templates/app/api/v1/devtools/presets.ts +0 -113
- package/templates/app/api/v1/devtools/scheduled-actions/route.ts +0 -120
- package/templates/app/api/v1/devtools/testing/route.ts +0 -82
- package/templates/app/api/v1/media/docs.md +0 -117
- package/templates/app/api/v1/media/presets.ts +0 -24
- package/templates/app/api/v1/media/upload/route.ts +0 -150
- package/templates/app/api/v1/patterns/[id]/usages/route.ts +0 -116
- package/templates/app/api/v1/plugin/[...path]/route.ts +0 -373
- package/templates/app/api/v1/plugin/docs.md +0 -79
- package/templates/app/api/v1/plugin/presets.ts +0 -21
- package/templates/app/api/v1/plugin/route.ts +0 -96
- package/templates/app/api/v1/post-categories/[id]/route.ts +0 -255
- package/templates/app/api/v1/post-categories/docs.md +0 -134
- package/templates/app/api/v1/post-categories/presets.ts +0 -78
- package/templates/app/api/v1/post-categories/route.ts +0 -119
- package/templates/app/api/v1/team-invitations/[token]/accept/route.ts +0 -179
- package/templates/app/api/v1/team-invitations/[token]/decline/route.ts +0 -120
- package/templates/app/api/v1/team-invitations/[token]/route.ts +0 -89
- package/templates/app/api/v1/team-invitations/docs.md +0 -88
- package/templates/app/api/v1/team-invitations/presets.ts +0 -43
- package/templates/app/api/v1/team-invitations/route.ts +0 -114
- package/templates/app/api/v1/teams/[teamId]/invitations/route.ts +0 -171
- package/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +0 -105
- package/templates/app/api/v1/teams/[teamId]/invoices/route.ts +0 -125
- package/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +0 -263
- package/templates/app/api/v1/teams/[teamId]/members/route.ts +0 -358
- package/templates/app/api/v1/teams/[teamId]/route.ts +0 -322
- package/templates/app/api/v1/teams/[teamId]/subscription/route.ts +0 -50
- package/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +0 -91
- package/templates/app/api/v1/teams/docs.md +0 -320
- package/templates/app/api/v1/teams/presets.ts +0 -178
- package/templates/app/api/v1/teams/route.ts +0 -293
- package/templates/app/api/v1/teams/switch/route.ts +0 -88
- package/templates/app/api/v1/theme/[...path]/route.ts +0 -361
- package/templates/app/api/v1/theme/docs.md +0 -74
- package/templates/app/api/v1/theme/presets.ts +0 -21
- package/templates/app/api/v1/theme/route.ts +0 -96
- package/templates/app/api/v1/users/[id]/meta/[key]/route.ts +0 -363
- package/templates/app/api/v1/users/[id]/route.ts +0 -302
- package/templates/app/api/v1/users/docs.md +0 -93
- package/templates/app/api/v1/users/presets.ts +0 -59
- package/templates/app/api/v1/users/route.ts +0 -197
- package/templates/app/dashboard/(main)/[entity]/[id]/edit/page.tsx +0 -117
- package/templates/app/dashboard/(main)/[entity]/[id]/page.tsx +0 -103
- package/templates/app/dashboard/(main)/[entity]/create/page.tsx +0 -95
- package/templates/app/dashboard/(main)/[entity]/error.tsx +0 -51
- package/templates/app/dashboard/(main)/[entity]/layout.tsx +0 -113
- package/templates/app/dashboard/(main)/[entity]/loading.tsx +0 -61
- package/templates/app/dashboard/(main)/[entity]/page.tsx +0 -90
- package/templates/app/dashboard/(main)/layout.tsx +0 -98
- package/templates/app/dashboard/(main)/loading.tsx +0 -5
- package/templates/app/dashboard/(main)/page.tsx +0 -201
- package/templates/app/dashboard/(main)/patterns/[id]/edit/page.tsx +0 -114
- package/templates/app/dashboard/(main)/patterns/[id]/page.tsx +0 -20
- package/templates/app/dashboard/(main)/patterns/[id]/reports/page.tsx +0 -171
- package/templates/app/dashboard/(main)/patterns/create/page.tsx +0 -86
- package/templates/app/dashboard/(main)/patterns/page.tsx +0 -444
- package/templates/app/dashboard/features/analytics/page.tsx +0 -35
- package/templates/app/dashboard/features/automation/page.tsx +0 -35
- package/templates/app/dashboard/features/layout.tsx +0 -13
- package/templates/app/dashboard/features/loading.tsx +0 -5
- package/templates/app/dashboard/features/webhooks/page.tsx +0 -35
- package/templates/app/dashboard/layout.tsx +0 -86
- package/templates/app/dashboard/permission-denied/page.tsx +0 -29
- package/templates/app/dashboard/settings/api-keys/loading.tsx +0 -5
- package/templates/app/dashboard/settings/api-keys/page.tsx +0 -513
- package/templates/app/dashboard/settings/billing/loading.tsx +0 -5
- package/templates/app/dashboard/settings/billing/page.tsx +0 -284
- package/templates/app/dashboard/settings/invoices/[invoiceNumber]/page.tsx +0 -222
- package/templates/app/dashboard/settings/invoices/loading.tsx +0 -5
- package/templates/app/dashboard/settings/invoices/page.tsx +0 -82
- package/templates/app/dashboard/settings/layout.tsx +0 -151
- package/templates/app/dashboard/settings/loading.tsx +0 -5
- package/templates/app/dashboard/settings/notifications/loading.tsx +0 -5
- package/templates/app/dashboard/settings/notifications/page.tsx +0 -462
- package/templates/app/dashboard/settings/page.tsx +0 -92
- package/templates/app/dashboard/settings/password/loading.tsx +0 -5
- package/templates/app/dashboard/settings/password/page.tsx +0 -306
- package/templates/app/dashboard/settings/plans/loading.tsx +0 -5
- package/templates/app/dashboard/settings/plans/page.tsx +0 -40
- package/templates/app/dashboard/settings/profile/loading.tsx +0 -5
- package/templates/app/dashboard/settings/profile/page.tsx +0 -686
- package/templates/app/dashboard/settings/security/loading.tsx +0 -5
- package/templates/app/dashboard/settings/security/page.tsx +0 -505
- package/templates/app/dashboard/settings/teams/loading.tsx +0 -5
- package/templates/app/dashboard/settings/teams/page.tsx +0 -272
- package/templates/app/dashboard/settings/teams/permissions/page.tsx +0 -92
- package/templates/app/devtools/blocks/[slug]/page.tsx +0 -39
- package/templates/app/devtools/blocks/page.tsx +0 -31
- package/templates/app/devtools/config/page.tsx +0 -31
- package/templates/app/devtools/features/page.tsx +0 -31
- package/templates/app/devtools/flows/page.tsx +0 -31
- package/templates/app/devtools/layout.tsx +0 -58
- package/templates/app/devtools/page.tsx +0 -121
- package/templates/app/devtools/scheduled-actions/page.tsx +0 -157
- package/templates/app/devtools/style/page.tsx +0 -330
- package/templates/app/devtools/tags/page.tsx +0 -31
- package/templates/app/devtools/tests/[[...path]]/page.tsx +0 -47
- package/templates/app/favicon.ico +0 -0
- package/templates/app/globals.css +0 -12
- package/templates/app/layout.tsx +0 -96
- package/templates/app/public/page.tsx +0 -30
- package/templates/app/superadmin/docs/[section]/[page]/page.tsx +0 -92
- package/templates/app/superadmin/docs/page.tsx +0 -75
- package/templates/app/superadmin/layout.tsx +0 -67
- package/templates/app/superadmin/page.tsx +0 -149
- package/templates/app/superadmin/subscriptions/page.tsx +0 -655
- package/templates/app/superadmin/team-roles/page.tsx +0 -493
- package/templates/app/superadmin/teams/[teamId]/page.tsx +0 -687
- package/templates/app/superadmin/teams/page.tsx +0 -302
- package/templates/app/superadmin/users/[userId]/page.tsx +0 -548
- package/templates/app/superadmin/users/page.tsx +0 -528
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityDetailWrapper.d.ts","sourceRoot":"","sources":["../../../../src/components/entities/wrappers/EntityDetailWrapper.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAoD,MAAM,OAAO,CAAA;AAYxE,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;CAChE;AAED,wBAAgB,mBAAmB,CAAC,EAClC,UAAU,EACV,EAAE,EACF,gBAAqB,EACrB,OAAO,EACP,SAAS,EACT,oBAAyB,GAC1B,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"EntityDetailWrapper.d.ts","sourceRoot":"","sources":["../../../../src/components/entities/wrappers/EntityDetailWrapper.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAoD,MAAM,OAAO,CAAA;AAYxE,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;CAChE;AAED,wBAAgB,mBAAmB,CAAC,EAClC,UAAU,EACV,EAAE,EACF,gBAAqB,EACrB,OAAO,EACP,SAAS,EACT,oBAAyB,GAC1B,EAAE,wBAAwB,2CAoZ1B"}
|
|
@@ -6,7 +6,7 @@ import { Alert, AlertDescription } from "../../ui/alert.js";
|
|
|
6
6
|
import { SkeletonEntityDetail } from "../../ui/skeleton-detail.js";
|
|
7
7
|
import { useEntityConfig } from "../../../hooks/useEntityConfig.js";
|
|
8
8
|
import { useRouter } from "next/navigation";
|
|
9
|
-
import { getEntityData, deleteEntityData } from "../../../lib/api/entities.js";
|
|
9
|
+
import { getEntityData, deleteEntityData, fetchWithTeam } from "../../../lib/api/entities.js";
|
|
10
10
|
import { TeamDetailSection } from "../../teams/TeamDetailSection.js";
|
|
11
11
|
function EntityDetailWrapper({
|
|
12
12
|
entityType,
|
|
@@ -46,13 +46,8 @@ function EntityDetailWrapper({
|
|
|
46
46
|
for (const childName of childEntityNames) {
|
|
47
47
|
try {
|
|
48
48
|
console.log(`[EntityDetailWrapper] Loading child data for ${childName}`);
|
|
49
|
-
const response = await
|
|
50
|
-
method: "GET"
|
|
51
|
-
headers: {
|
|
52
|
-
"Content-Type": "application/json"
|
|
53
|
-
},
|
|
54
|
-
credentials: "include"
|
|
55
|
-
// Include cookies for session auth
|
|
49
|
+
const response = await fetchWithTeam(`/api/v1/${entityType}/${parentId}/child/${childName}`, {
|
|
50
|
+
method: "GET"
|
|
56
51
|
});
|
|
57
52
|
if (response.ok) {
|
|
58
53
|
const result = await response.json();
|
|
@@ -101,12 +96,8 @@ function EntityDetailWrapper({
|
|
|
101
96
|
url.searchParams.set("child", "all");
|
|
102
97
|
url.searchParams.set("metas", "all");
|
|
103
98
|
console.log(`[EntityDetailWrapper] Loading parent+child data from:`, url.toString());
|
|
104
|
-
const response = await
|
|
105
|
-
method: "GET"
|
|
106
|
-
headers: {
|
|
107
|
-
"Content-Type": "application/json"
|
|
108
|
-
},
|
|
109
|
-
credentials: "include"
|
|
99
|
+
const response = await fetchWithTeam(url.toString(), {
|
|
100
|
+
method: "GET"
|
|
110
101
|
});
|
|
111
102
|
if (!response.ok) {
|
|
112
103
|
throw new Error(`Failed to load ${entityType} with children: ${response.status}`);
|
|
@@ -169,12 +160,8 @@ function EntityDetailWrapper({
|
|
|
169
160
|
const url = new URL(`/api/v1/${endpointPath}/${id}`, window.location.origin);
|
|
170
161
|
url.searchParams.set("child", "all");
|
|
171
162
|
url.searchParams.set("metas", "all");
|
|
172
|
-
const response = await
|
|
173
|
-
method: "GET"
|
|
174
|
-
headers: {
|
|
175
|
-
"Content-Type": "application/json"
|
|
176
|
-
},
|
|
177
|
-
credentials: "include"
|
|
163
|
+
const response = await fetchWithTeam(url.toString(), {
|
|
164
|
+
method: "GET"
|
|
178
165
|
});
|
|
179
166
|
if (!response.ok) {
|
|
180
167
|
throw new Error(`Failed to reload ${entityType} with children: ${response.status}`);
|
|
@@ -205,13 +192,8 @@ function EntityDetailWrapper({
|
|
|
205
192
|
const url = `/api/v1/${endpointPath}/${id}/child/${childName}`;
|
|
206
193
|
console.log(`[EntityDetailWrapper] Calling URL: ${url}`);
|
|
207
194
|
console.log(`[EntityDetailWrapper] Sending data:`, JSON.stringify(childData2, null, 2));
|
|
208
|
-
const response = await
|
|
195
|
+
const response = await fetchWithTeam(url, {
|
|
209
196
|
method: "POST",
|
|
210
|
-
headers: {
|
|
211
|
-
"Content-Type": "application/json"
|
|
212
|
-
},
|
|
213
|
-
credentials: "include",
|
|
214
|
-
// Include cookies for session auth
|
|
215
197
|
body: JSON.stringify(childData2)
|
|
216
198
|
});
|
|
217
199
|
console.log(`[EntityDetailWrapper] Response status: ${response.status}`);
|
|
@@ -237,13 +219,8 @@ function EntityDetailWrapper({
|
|
|
237
219
|
try {
|
|
238
220
|
console.log(`[EntityDetailWrapper] Editing child ${childName} with id ${childId}`, childData2);
|
|
239
221
|
const endpointPath = (entityConfig == null ? void 0 : entityConfig.slug) || `${entityType}s`;
|
|
240
|
-
const response = await
|
|
222
|
+
const response = await fetchWithTeam(`/api/v1/${endpointPath}/${id}/child/${childName}/${childId}`, {
|
|
241
223
|
method: "PUT",
|
|
242
|
-
headers: {
|
|
243
|
-
"Content-Type": "application/json"
|
|
244
|
-
},
|
|
245
|
-
credentials: "include",
|
|
246
|
-
// Include cookies for session auth
|
|
247
224
|
body: JSON.stringify(childData2)
|
|
248
225
|
});
|
|
249
226
|
if (!response.ok) {
|
|
@@ -268,13 +245,8 @@ function EntityDetailWrapper({
|
|
|
268
245
|
try {
|
|
269
246
|
console.log(`[EntityDetailWrapper] Deleting child ${childName} with id ${childId}`);
|
|
270
247
|
const endpointPath = (entityConfig == null ? void 0 : entityConfig.slug) || `${entityType}s`;
|
|
271
|
-
const response = await
|
|
272
|
-
method: "DELETE"
|
|
273
|
-
headers: {
|
|
274
|
-
"Content-Type": "application/json"
|
|
275
|
-
},
|
|
276
|
-
credentials: "include"
|
|
277
|
-
// Include cookies for session auth
|
|
248
|
+
const response = await fetchWithTeam(`/api/v1/${endpointPath}/${id}/child/${childName}/${childId}`, {
|
|
249
|
+
method: "DELETE"
|
|
278
250
|
});
|
|
279
251
|
if (!response.ok) {
|
|
280
252
|
throw new Error(`Failed to delete ${childName}: ${response.status}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useEntityQuery.d.ts","sourceRoot":"","sources":["../../src/hooks/useEntityQuery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useEntityQuery.d.ts","sourceRoot":"","sources":["../../src/hooks/useEntityQuery.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEzD,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,YAAY,CAAA;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,CAAA;IACnD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6F5D;AAGD,wBAAgB,YAAY,CAC1B,YAAY,EAAE,YAAY,EAC1B,EAAE,EAAE,MAAM,EACV,OAAO,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,8DA2C/D"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useQuery } from "@tanstack/react-query";
|
|
3
3
|
import { useAuth } from "./useAuth.js";
|
|
4
|
+
import { fetchWithTeam } from "../lib/api/entities.js";
|
|
4
5
|
function useEntityQuery(options) {
|
|
5
6
|
var _a, _b, _c;
|
|
6
7
|
const {
|
|
@@ -17,9 +18,11 @@ function useEntityQuery(options) {
|
|
|
17
18
|
// 1 hour default
|
|
18
19
|
} = options;
|
|
19
20
|
const { user } = useAuth();
|
|
21
|
+
const activeTeamId = typeof window !== "undefined" ? localStorage.getItem("activeTeamId") : null;
|
|
20
22
|
const queryKey = [
|
|
21
23
|
"entity",
|
|
22
24
|
entityConfig.slug,
|
|
25
|
+
activeTeamId,
|
|
23
26
|
{
|
|
24
27
|
pageSize,
|
|
25
28
|
includeChildren,
|
|
@@ -48,8 +51,15 @@ function useEntityQuery(options) {
|
|
|
48
51
|
});
|
|
49
52
|
const params = new URLSearchParams(queryParams);
|
|
50
53
|
const url = `/api/v1/${entityConfig.slug}?${params.toString()}`;
|
|
51
|
-
const response = await
|
|
54
|
+
const response = await fetchWithTeam(url);
|
|
52
55
|
if (!response.ok) {
|
|
56
|
+
if (response.status === 400) {
|
|
57
|
+
const errorData = await response.json().catch(() => ({}));
|
|
58
|
+
if (errorData.code === "TEAM_CONTEXT_REQUIRED") {
|
|
59
|
+
console.warn("[useEntityQuery] Team context not ready yet, returning empty list");
|
|
60
|
+
return { items: [], total: 0, page: 1, totalPages: 0 };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
53
63
|
throw new Error(`Failed to fetch ${entityConfig.names.plural}`);
|
|
54
64
|
}
|
|
55
65
|
const data = await response.json();
|
|
@@ -74,17 +84,25 @@ function useEntityQuery(options) {
|
|
|
74
84
|
function useEntityOne(entityConfig, id, options = {}) {
|
|
75
85
|
const { user } = useAuth();
|
|
76
86
|
const { includeChildren = false, enabled = true } = options;
|
|
77
|
-
const
|
|
87
|
+
const activeTeamId = typeof window !== "undefined" ? localStorage.getItem("activeTeamId") : null;
|
|
88
|
+
const queryKey = ["entity", entityConfig.slug, activeTeamId, id, { includeChildren }];
|
|
78
89
|
return useQuery({
|
|
79
90
|
queryKey,
|
|
80
91
|
queryFn: async () => {
|
|
81
92
|
const params = includeChildren ? "?child=all" : "";
|
|
82
93
|
const url = `/api/v1/${entityConfig.slug}/${id}${params}`;
|
|
83
|
-
const response = await
|
|
94
|
+
const response = await fetchWithTeam(url);
|
|
84
95
|
if (!response.ok) {
|
|
85
96
|
if (response.status === 404) {
|
|
86
97
|
throw new Error(`${entityConfig.names.singular} not found`);
|
|
87
98
|
}
|
|
99
|
+
if (response.status === 400) {
|
|
100
|
+
const errorData = await response.json().catch(() => ({}));
|
|
101
|
+
if (errorData.code === "TEAM_CONTEXT_REQUIRED") {
|
|
102
|
+
console.warn("[useEntityOne] Team context not ready yet, returning null");
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
88
106
|
throw new Error(`Failed to fetch ${entityConfig.names.singular}`);
|
|
89
107
|
}
|
|
90
108
|
const data = await response.json();
|
|
@@ -6,9 +6,20 @@
|
|
|
6
6
|
* 2. User not logged in → use defaultMode from theme.config
|
|
7
7
|
*/
|
|
8
8
|
type ThemeMode = 'light' | 'dark' | 'system';
|
|
9
|
+
export interface ThemeSettings {
|
|
10
|
+
defaultMode: ThemeMode;
|
|
11
|
+
allowUserToggle: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get theme settings for the RootLayout
|
|
15
|
+
* Returns defaultMode and whether user can toggle theme
|
|
16
|
+
* Server-side only function
|
|
17
|
+
*/
|
|
18
|
+
export declare function getThemeSettings(): Promise<ThemeSettings>;
|
|
9
19
|
/**
|
|
10
20
|
* Get the default theme mode for the current user
|
|
11
21
|
* Server-side only function
|
|
22
|
+
* @deprecated Use getThemeSettings() instead for full theme configuration
|
|
12
23
|
*/
|
|
13
24
|
export declare function getDefaultThemeMode(): Promise<ThemeMode>;
|
|
14
25
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-default-theme-mode.d.ts","sourceRoot":"","sources":["../../../src/lib/theme/get-default-theme-mode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,KAAK,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAA;AAE5C
|
|
1
|
+
{"version":3,"file":"get-default-theme-mode.d.ts","sourceRoot":"","sources":["../../../src/lib/theme/get-default-theme-mode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,KAAK,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAA;AAE5C,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,SAAS,CAAA;IACtB,eAAe,EAAE,OAAO,CAAA;CACzB;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAqB/D;AA8CD;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,SAAS,CAAC,CAG9D"}
|
|
@@ -1,42 +1,59 @@
|
|
|
1
1
|
import { auth } from "../auth.js";
|
|
2
2
|
import { ThemeService } from "../services/theme.service.js";
|
|
3
3
|
import { headers } from "next/headers";
|
|
4
|
-
async function
|
|
4
|
+
async function getThemeSettings() {
|
|
5
|
+
var _a, _b;
|
|
6
|
+
const activeThemeName = process.env.NEXT_PUBLIC_ACTIVE_THEME || "default";
|
|
7
|
+
const themeConfig = ThemeService.getByName(activeThemeName);
|
|
8
|
+
const appConfig = ThemeService.getAppConfig(activeThemeName);
|
|
9
|
+
const allowUserToggle = ((_b = (_a = appConfig == null ? void 0 : appConfig.ui) == null ? void 0 : _a.theme) == null ? void 0 : _b.allowUserToggle) ?? true;
|
|
10
|
+
const configDefaultMode = (themeConfig == null ? void 0 : themeConfig.defaultMode) || "system";
|
|
11
|
+
if (allowUserToggle) {
|
|
12
|
+
const userTheme = await getUserThemePreference();
|
|
13
|
+
if (userTheme) {
|
|
14
|
+
return { defaultMode: userTheme, allowUserToggle };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return { defaultMode: configDefaultMode, allowUserToggle };
|
|
18
|
+
}
|
|
19
|
+
const VALID_THEME_MODES = ["light", "dark", "system"];
|
|
20
|
+
function isValidThemeMode(value) {
|
|
21
|
+
return typeof value === "string" && VALID_THEME_MODES.includes(value);
|
|
22
|
+
}
|
|
23
|
+
async function getUserThemePreference() {
|
|
5
24
|
var _a, _b, _c;
|
|
6
25
|
try {
|
|
7
26
|
const session = await auth.api.getSession({
|
|
8
27
|
headers: await headers()
|
|
9
28
|
});
|
|
10
29
|
if ((_a = session == null ? void 0 : session.user) == null ? void 0 : _a.id) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return userTheme;
|
|
24
|
-
}
|
|
30
|
+
const baseUrl = process.env.NEXT_PUBLIC_APP_URL || "http://localhost:5173";
|
|
31
|
+
const response = await fetch(`${baseUrl}/api/user/profile?includeMeta=true`, {
|
|
32
|
+
headers: {
|
|
33
|
+
cookie: (await headers()).get("cookie") || ""
|
|
34
|
+
},
|
|
35
|
+
cache: "no-store"
|
|
36
|
+
});
|
|
37
|
+
if (response.ok) {
|
|
38
|
+
const data = await response.json();
|
|
39
|
+
const theme = (_c = (_b = data.meta) == null ? void 0 : _b.uiPreferences) == null ? void 0 : _c.theme;
|
|
40
|
+
if (isValidThemeMode(theme)) {
|
|
41
|
+
return theme;
|
|
25
42
|
}
|
|
26
|
-
} catch (error) {
|
|
27
43
|
}
|
|
28
44
|
}
|
|
29
45
|
} catch (error) {
|
|
46
|
+
if (process.env.NODE_ENV === "development") {
|
|
47
|
+
console.warn("[getThemeSettings] Failed to fetch user preference:", error);
|
|
48
|
+
}
|
|
30
49
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
} catch (error) {
|
|
37
|
-
return "system";
|
|
38
|
-
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
async function getDefaultThemeMode() {
|
|
53
|
+
const { defaultMode } = await getThemeSettings();
|
|
54
|
+
return defaultMode;
|
|
39
55
|
}
|
|
40
56
|
export {
|
|
41
|
-
getDefaultThemeMode
|
|
57
|
+
getDefaultThemeMode,
|
|
58
|
+
getThemeSettings
|
|
42
59
|
};
|
package/dist/styles/classes.json
CHANGED
package/dist/types/theme.d.ts
CHANGED
|
@@ -15,6 +15,8 @@ export interface ThemeConfig {
|
|
|
15
15
|
description?: string;
|
|
16
16
|
author?: string;
|
|
17
17
|
enabled?: boolean;
|
|
18
|
+
/** Default theme mode - controls next-themes behavior */
|
|
19
|
+
defaultMode?: 'light' | 'dark' | 'system';
|
|
18
20
|
dependencies?: string[];
|
|
19
21
|
plugins?: string[];
|
|
20
22
|
styles?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/types/theme.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/types/theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,yDAAyD;IACzD,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAA;IACzC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KACnC,CAAA;IACD,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE;QACX,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IACD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,GAAG,CAAA;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,GAAG,CAAA;IACd,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,YAAY,EAAE,gBAAgB,EAAE,CAAA;CACjC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nextsparkjs/core",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.83",
|
|
4
4
|
"description": "NextSpark - The complete SaaS framework for Next.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "NextSpark <hello@nextspark.dev>",
|
|
@@ -316,6 +316,17 @@
|
|
|
316
316
|
"README.md",
|
|
317
317
|
"scripts"
|
|
318
318
|
],
|
|
319
|
+
"scripts": {
|
|
320
|
+
"postinstall": "node scripts/postinstall.mjs || true",
|
|
321
|
+
"build": "tsup && pnpm build:dts && pnpm build:ui-css",
|
|
322
|
+
"build:js": "tsup",
|
|
323
|
+
"build:dts": "tsc -p tsconfig.dts.json || echo '⚠️ DTS generation completed with some type errors (partial coverage)'",
|
|
324
|
+
"build:ui-css": "node scripts/build/build-ui-css.mjs",
|
|
325
|
+
"dev": "tsup --watch",
|
|
326
|
+
"test": "jest",
|
|
327
|
+
"test:watch": "jest --watch",
|
|
328
|
+
"test:coverage": "jest --coverage"
|
|
329
|
+
},
|
|
319
330
|
"peerDependencies": {
|
|
320
331
|
"next": ">=14.0.0",
|
|
321
332
|
"react": ">=18.0.0",
|
|
@@ -343,12 +354,14 @@
|
|
|
343
354
|
"typescript": "^5"
|
|
344
355
|
},
|
|
345
356
|
"dependencies": {
|
|
357
|
+
"@nextsparkjs/ui": "^0.1.0-beta.2",
|
|
346
358
|
"@codemirror/lang-json": "^6.0.2",
|
|
347
359
|
"@dnd-kit/core": "^6.3.1",
|
|
348
360
|
"@dnd-kit/sortable": "^10.0.0",
|
|
349
361
|
"@dnd-kit/utilities": "^3.2.2",
|
|
350
362
|
"@hookform/resolvers": "^5.2.1",
|
|
351
363
|
"@inquirer/prompts": "^7.2.0",
|
|
364
|
+
"@nextsparkjs/testing": "workspace:*",
|
|
352
365
|
"@radix-ui/react-accordion": "^1.2.12",
|
|
353
366
|
"@radix-ui/react-alert-dialog": "^1.1.15",
|
|
354
367
|
"@radix-ui/react-avatar": "^1.1.10",
|
|
@@ -409,19 +422,6 @@
|
|
|
409
422
|
"stripe": "^18.5.0",
|
|
410
423
|
"tailwind-merge": "^3.3.1",
|
|
411
424
|
"uuid": "^13.0.0",
|
|
412
|
-
"zod": "^4.1.5"
|
|
413
|
-
"@nextsparkjs/testing": "0.1.0-beta.82",
|
|
414
|
-
"@nextsparkjs/ui": "0.1.0-beta.82"
|
|
415
|
-
},
|
|
416
|
-
"scripts": {
|
|
417
|
-
"postinstall": "node scripts/postinstall.mjs || true",
|
|
418
|
-
"build": "tsup && pnpm build:dts && pnpm build:ui-css",
|
|
419
|
-
"build:js": "tsup",
|
|
420
|
-
"build:dts": "tsc -p tsconfig.dts.json || echo '⚠️ DTS generation completed with some type errors (partial coverage)'",
|
|
421
|
-
"build:ui-css": "node scripts/build/build-ui-css.mjs",
|
|
422
|
-
"dev": "tsup --watch",
|
|
423
|
-
"test": "jest",
|
|
424
|
-
"test:watch": "jest --watch",
|
|
425
|
-
"test:coverage": "jest --coverage"
|
|
425
|
+
"zod": "^4.1.5"
|
|
426
426
|
}
|
|
427
|
-
}
|
|
427
|
+
}
|
|
File without changes
|
package/scripts/create-theme.mjs
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { resetPasswordSchema, type ResetPasswordFormData } from '@nextsparkjs/core/lib/validation';
|
|
4
|
-
import { useAuth } from '@nextsparkjs/core/hooks/useAuth';
|
|
5
|
-
import { zodResolver } from '@hookform/resolvers/zod';
|
|
6
|
-
import { AlertCircle, ArrowLeft, CheckCircle, Loader2, Mail } from 'lucide-react';
|
|
7
|
-
import Link from 'next/link';
|
|
8
|
-
import { useState, useCallback } from 'react';
|
|
9
|
-
import { sel } from '@nextsparkjs/core/selectors';
|
|
10
|
-
import { useTranslations } from 'next-intl';
|
|
11
|
-
import { useForm } from 'react-hook-form';
|
|
12
|
-
import { Button } from '@nextsparkjs/core/components/ui/button';
|
|
13
|
-
import { Input } from '@nextsparkjs/core/components/ui/input';
|
|
14
|
-
import { Label } from '@nextsparkjs/core/components/ui/label';
|
|
15
|
-
import { Alert, AlertDescription } from '@nextsparkjs/core/components/ui/alert';
|
|
16
|
-
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@nextsparkjs/core/components/ui/card';
|
|
17
|
-
import { getTemplateOrDefaultClient } from '@nextsparkjs/registries/template-registry.client'
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
function ForgotPasswordPage() {
|
|
21
|
-
const { resetPassword } = useAuth();
|
|
22
|
-
const [loading, setLoading] = useState(false);
|
|
23
|
-
const [error, setError] = useState<string | null>(null);
|
|
24
|
-
const [success, setSuccess] = useState(false);
|
|
25
|
-
const [statusMessage, setStatusMessage] = useState('');
|
|
26
|
-
const t = useTranslations('auth');
|
|
27
|
-
|
|
28
|
-
const form = useForm<ResetPasswordFormData>({
|
|
29
|
-
resolver: zodResolver(resetPasswordSchema),
|
|
30
|
-
defaultValues: {
|
|
31
|
-
email: '',
|
|
32
|
-
},
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
const {
|
|
36
|
-
register,
|
|
37
|
-
handleSubmit,
|
|
38
|
-
formState: { errors },
|
|
39
|
-
watch,
|
|
40
|
-
} = form;
|
|
41
|
-
|
|
42
|
-
const email = watch('email');
|
|
43
|
-
|
|
44
|
-
const onSubmit = useCallback(async (data: ResetPasswordFormData) => {
|
|
45
|
-
setLoading(true);
|
|
46
|
-
setError(null);
|
|
47
|
-
setStatusMessage(t('forgotPassword.messages.sending'));
|
|
48
|
-
|
|
49
|
-
try {
|
|
50
|
-
const result = await resetPassword(data.email);
|
|
51
|
-
|
|
52
|
-
if (!result.success) {
|
|
53
|
-
const errorMsg = result.error || 'Failed to send reset email';
|
|
54
|
-
setError(errorMsg);
|
|
55
|
-
setStatusMessage(`Error: ${errorMsg}`);
|
|
56
|
-
} else {
|
|
57
|
-
setSuccess(true);
|
|
58
|
-
setStatusMessage(t('forgotPassword.messages.sent'));
|
|
59
|
-
}
|
|
60
|
-
} catch {
|
|
61
|
-
setError('An unexpected error occurred');
|
|
62
|
-
setStatusMessage(t('forgotPassword.messages.error'));
|
|
63
|
-
} finally {
|
|
64
|
-
setLoading(false);
|
|
65
|
-
}
|
|
66
|
-
}, [resetPassword, t]);
|
|
67
|
-
|
|
68
|
-
if (success) {
|
|
69
|
-
return (
|
|
70
|
-
<>
|
|
71
|
-
<div aria-live="polite" className="sr-only">
|
|
72
|
-
{statusMessage}
|
|
73
|
-
</div>
|
|
74
|
-
<Card
|
|
75
|
-
className="w-full max-w-md"
|
|
76
|
-
data-cy={sel('auth.forgotPassword.successMessage')}
|
|
77
|
-
>
|
|
78
|
-
<CardContent className="pt-6">
|
|
79
|
-
<div className="text-center space-y-4">
|
|
80
|
-
<div className="w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto">
|
|
81
|
-
<CheckCircle className="w-8 h-8 text-green-600" />
|
|
82
|
-
</div>
|
|
83
|
-
<div className="space-y-2">
|
|
84
|
-
<h1 className="text-2xl font-bold">{t('forgotPassword.success.title')}</h1>
|
|
85
|
-
<p className="text-muted-foreground">
|
|
86
|
-
We've sent a password reset link to <strong>{email}</strong>
|
|
87
|
-
</p>
|
|
88
|
-
<p className="text-muted-foreground">
|
|
89
|
-
Please check your inbox and click the link to reset your password.
|
|
90
|
-
</p>
|
|
91
|
-
</div>
|
|
92
|
-
|
|
93
|
-
<Alert>
|
|
94
|
-
<AlertCircle className="h-4 w-4" />
|
|
95
|
-
<AlertDescription>
|
|
96
|
-
<strong>Didn't receive the email?</strong>
|
|
97
|
-
<br />
|
|
98
|
-
• Check your spam folder
|
|
99
|
-
<br />
|
|
100
|
-
• Make sure you entered the correct email address
|
|
101
|
-
<br />• Wait a few minutes and try again
|
|
102
|
-
</AlertDescription>
|
|
103
|
-
</Alert>
|
|
104
|
-
|
|
105
|
-
<div className="flex gap-2">
|
|
106
|
-
<Button variant="outline" asChild className="flex-1" data-cy={sel('auth.forgotPassword.successBack')}>
|
|
107
|
-
<Link href="/login">
|
|
108
|
-
<ArrowLeft className="w-4 h-4 mr-2" />
|
|
109
|
-
Back to Login
|
|
110
|
-
</Link>
|
|
111
|
-
</Button>
|
|
112
|
-
<Button
|
|
113
|
-
onClick={() => {
|
|
114
|
-
setSuccess(false);
|
|
115
|
-
setError(null);
|
|
116
|
-
form.reset();
|
|
117
|
-
}}
|
|
118
|
-
className="flex-1"
|
|
119
|
-
data-cy={sel('auth.forgotPassword.retryButton')}
|
|
120
|
-
>
|
|
121
|
-
Try Again
|
|
122
|
-
</Button>
|
|
123
|
-
</div>
|
|
124
|
-
</div>
|
|
125
|
-
</CardContent>
|
|
126
|
-
</Card>
|
|
127
|
-
</>
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return (
|
|
132
|
-
<>
|
|
133
|
-
<div aria-live="polite" className="sr-only">
|
|
134
|
-
{statusMessage}
|
|
135
|
-
</div>
|
|
136
|
-
<Card className="w-full max-w-md" data-cy={sel('auth.forgotPassword.form')}>
|
|
137
|
-
<CardHeader className="space-y-1">
|
|
138
|
-
<CardTitle className="text-2xl font-bold" id="forgot-password-heading">
|
|
139
|
-
{t('forgotPassword.title')}
|
|
140
|
-
</CardTitle>
|
|
141
|
-
<CardDescription>
|
|
142
|
-
{t('forgotPassword.description')}
|
|
143
|
-
</CardDescription>
|
|
144
|
-
</CardHeader>
|
|
145
|
-
<CardContent>
|
|
146
|
-
{error && (
|
|
147
|
-
<Alert variant="destructive" className="mb-4" data-cy={sel('auth.forgotPassword.error')}>
|
|
148
|
-
<AlertCircle className="h-4 w-4" />
|
|
149
|
-
<AlertDescription>
|
|
150
|
-
{error}
|
|
151
|
-
<div className="mt-1 text-sm">
|
|
152
|
-
Please check your email address and try again.
|
|
153
|
-
</div>
|
|
154
|
-
</AlertDescription>
|
|
155
|
-
</Alert>
|
|
156
|
-
)}
|
|
157
|
-
|
|
158
|
-
<form onSubmit={handleSubmit(onSubmit)} className="space-y-4">
|
|
159
|
-
<div className="space-y-2">
|
|
160
|
-
<Label htmlFor="email">Email</Label>
|
|
161
|
-
<div className="relative">
|
|
162
|
-
<Mail className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
|
|
163
|
-
<Input
|
|
164
|
-
{...register('email')}
|
|
165
|
-
id="email"
|
|
166
|
-
type="email"
|
|
167
|
-
autoComplete="email"
|
|
168
|
-
placeholder="email@example.com"
|
|
169
|
-
className="pl-9"
|
|
170
|
-
data-cy={sel('auth.forgotPassword.email')}
|
|
171
|
-
/>
|
|
172
|
-
</div>
|
|
173
|
-
{errors.email && (
|
|
174
|
-
<p className="text-sm text-destructive">
|
|
175
|
-
{errors.email.message}
|
|
176
|
-
</p>
|
|
177
|
-
)}
|
|
178
|
-
</div>
|
|
179
|
-
|
|
180
|
-
<Button
|
|
181
|
-
type="submit"
|
|
182
|
-
disabled={loading}
|
|
183
|
-
className="w-full"
|
|
184
|
-
data-cy={sel('auth.forgotPassword.submitButton')}
|
|
185
|
-
>
|
|
186
|
-
{loading ? (
|
|
187
|
-
<>
|
|
188
|
-
<Loader2 className="mr-2 h-4 w-4 animate-spin" />
|
|
189
|
-
Sending reset link...
|
|
190
|
-
</>
|
|
191
|
-
) : (
|
|
192
|
-
'Send Reset Link'
|
|
193
|
-
)}
|
|
194
|
-
</Button>
|
|
195
|
-
</form>
|
|
196
|
-
|
|
197
|
-
<div className="text-center mt-4">
|
|
198
|
-
<Link
|
|
199
|
-
href="/login"
|
|
200
|
-
className="inline-flex items-center text-sm text-primary hover:underline"
|
|
201
|
-
data-cy={sel('auth.forgotPassword.backToLogin')}
|
|
202
|
-
>
|
|
203
|
-
<ArrowLeft className="w-4 h-4 mr-1" />
|
|
204
|
-
Back to Login
|
|
205
|
-
</Link>
|
|
206
|
-
</div>
|
|
207
|
-
</CardContent>
|
|
208
|
-
</Card>
|
|
209
|
-
</>
|
|
210
|
-
);
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// Opt out of static generation due to client-side state
|
|
214
|
-
export const dynamic = 'force-dynamic';
|
|
215
|
-
|
|
216
|
-
export default getTemplateOrDefaultClient('app/(auth)/forgot-password/page.tsx', ForgotPasswordPage)
|