@nextsparkjs/theme-default 0.1.0-beta.17 → 0.1.0-beta.171
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/api/ai/chat/stream/route.ts +4 -1
- package/api/ai/orchestrator/route.ts +10 -3
- package/api/ai/single-agent/route.ts +10 -3
- package/api/ai/usage/route.ts +4 -1
- package/blocks/benefits/component.tsx +4 -4
- package/blocks/cta-section/component.tsx +4 -4
- package/blocks/faq-accordion/component.tsx +2 -2
- package/blocks/features-grid/component.tsx +5 -5
- package/blocks/hero/component.tsx +2 -2
- package/blocks/hero/fields.ts +1 -1
- package/blocks/hero-with-form/component.tsx +7 -7
- package/blocks/hero-with-form/fields.ts +1 -1
- package/blocks/jumbotron/component.tsx +7 -7
- package/blocks/jumbotron/fields.ts +1 -1
- package/blocks/logo-cloud/component.tsx +6 -6
- package/blocks/logo-cloud/fields.ts +1 -1
- package/blocks/post-content/component.tsx +2 -2
- package/blocks/pricing-table/component.tsx +5 -5
- package/blocks/split-content/component.tsx +5 -5
- package/blocks/split-content/fields.ts +1 -1
- package/blocks/stats-counter/component.tsx +9 -9
- package/blocks/testimonials/component.tsx +4 -4
- package/blocks/testimonials/fields.ts +1 -1
- package/blocks/text-content/component.tsx +12 -10
- package/blocks/timeline/component.tsx +12 -12
- package/blocks/video-hero/component.tsx +7 -7
- package/blocks/video-hero/fields.ts +1 -1
- package/components/ai-chat/ChatPanel.tsx +7 -7
- package/components/ai-chat/Message.tsx +2 -2
- package/components/ai-chat/MessageInput.tsx +3 -3
- package/components/ai-chat/MessageList.tsx +3 -3
- package/components/ai-chat/TypingIndicator.tsx +2 -2
- package/config/app.config.ts +90 -62
- package/config/billing.config.ts +5 -10
- package/config/dashboard.config.ts +14 -0
- package/config/features.config.ts +10 -0
- package/config/permissions.config.ts +22 -23
- package/docs/{01-overview → public/01-overview}/01-introduction.md +5 -0
- package/docs/{01-overview → public/01-overview}/02-customization.md +5 -0
- package/docs/{02-features → public/02-features}/03-tasks-entity.md +5 -0
- package/docs/{03-ai → public/03-ai}/01-overview.md +5 -0
- package/docs/{03-ai → public/03-ai}/02-customization.md +5 -0
- package/docs/superadmin/01-setup/01-configuration.md +79 -0
- package/docs/superadmin/01-setup/02-deployment.md +82 -0
- package/docs/superadmin/02-management/01-users.md +83 -0
- package/docs/superadmin/03-integrations/01-langchain.md +139 -0
- package/emails/verify-email.ts +33 -0
- package/entities/customers/api/docs.md +107 -0
- package/entities/customers/api/presets.ts +80 -0
- package/entities/pages/api/docs.md +114 -0
- package/entities/pages/api/presets.ts +72 -0
- package/entities/posts/api/docs.md +120 -0
- package/entities/posts/api/presets.ts +74 -0
- package/entities/tasks/api/docs.md +126 -0
- package/entities/tasks/api/presets.ts +84 -0
- package/lib/selectors.ts +7 -4
- package/messages/de/admin.json +45 -0
- package/messages/en/admin.json +56 -0
- package/messages/en/navigation.json +2 -1
- package/messages/es/admin.json +56 -0
- package/messages/es/navigation.json +2 -1
- package/messages/fr/admin.json +45 -0
- package/messages/it/admin.json +45 -0
- package/messages/pt/admin.json +45 -0
- package/migrations/089_add_editor_team_role.sql +15 -23
- package/migrations/090_demo_users_teams.sql +11 -11
- package/migrations/091_greek_teams_billing.sql +15 -15
- package/migrations/093_pages_sample_data.sql +7 -7
- package/migrations/098_patterns_sample_data.sql +234 -0
- package/nextsparkjs-theme-default-0.1.0-beta.137.tgz +0 -0
- package/package.json +4 -3
- package/styles/globals.css +42 -0
- package/templates/(public)/page.tsx +1 -1
- package/tests/cypress/e2e/_utils/devtools/access.bdd.md +262 -0
- package/tests/cypress/e2e/_utils/devtools/access.cy.ts +171 -0
- package/tests/cypress/e2e/_utils/devtools/navigation.bdd.md +261 -0
- package/tests/cypress/e2e/_utils/devtools/navigation.cy.ts +157 -0
- package/tests/cypress/e2e/_utils/devtools/pages.bdd.md +303 -0
- package/tests/cypress/e2e/_utils/devtools/pages.cy.ts +184 -0
- package/tests/cypress/e2e/_utils/docs/README.md +215 -0
- package/tests/cypress/e2e/_utils/selectors/auth.bdd.md +354 -0
- package/tests/cypress/e2e/_utils/selectors/auth.cy.ts +310 -0
- package/tests/cypress/e2e/_utils/selectors/billing.bdd.md +276 -0
- package/tests/cypress/e2e/_utils/selectors/billing.cy.ts +182 -0
- package/tests/cypress/e2e/_utils/selectors/block-editor.bdd.md +615 -0
- package/tests/cypress/e2e/_utils/selectors/block-editor.cy.ts +783 -0
- package/tests/cypress/e2e/_utils/selectors/dashboard-container.cy.ts +52 -0
- package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.bdd.md +205 -0
- package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.cy.ts +137 -0
- package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.bdd.md +147 -0
- package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.cy.ts +114 -0
- package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.bdd.md +76 -0
- package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.cy.ts +68 -0
- package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.bdd.md +326 -0
- package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.cy.ts +177 -0
- package/tests/cypress/e2e/_utils/selectors/devtools.bdd.md +306 -0
- package/tests/cypress/e2e/_utils/selectors/devtools.cy.ts +273 -0
- package/tests/cypress/e2e/_utils/selectors/global-search.bdd.md +115 -0
- package/tests/cypress/e2e/_utils/selectors/global-search.cy.ts +93 -0
- package/tests/cypress/e2e/_utils/selectors/patterns.bdd.md +388 -0
- package/tests/cypress/e2e/_utils/selectors/patterns.cy.ts +559 -0
- package/tests/cypress/e2e/_utils/selectors/public.cy.ts +112 -0
- package/tests/cypress/e2e/_utils/selectors/settings-api-keys.bdd.md +266 -0
- package/tests/cypress/e2e/_utils/selectors/settings-api-keys.cy.ts +233 -0
- package/tests/cypress/e2e/_utils/selectors/settings-billing.bdd.md +78 -0
- package/tests/cypress/e2e/_utils/selectors/settings-billing.cy.ts +108 -0
- package/tests/cypress/e2e/_utils/selectors/settings-layout.bdd.md +129 -0
- package/tests/cypress/e2e/_utils/selectors/settings-layout.cy.ts +115 -0
- package/tests/cypress/e2e/_utils/selectors/settings-password.bdd.md +82 -0
- package/tests/cypress/e2e/_utils/selectors/settings-password.cy.ts +74 -0
- package/tests/cypress/e2e/_utils/selectors/settings-profile.bdd.md +77 -0
- package/tests/cypress/e2e/_utils/selectors/settings-profile.cy.ts +79 -0
- package/tests/cypress/e2e/_utils/selectors/settings-teams.bdd.md +130 -0
- package/tests/cypress/e2e/_utils/selectors/settings-teams.cy.ts +86 -0
- package/tests/cypress/e2e/_utils/selectors/superadmin.bdd.md +261 -0
- package/tests/cypress/e2e/_utils/selectors/superadmin.cy.ts +193 -0
- package/tests/cypress/e2e/_utils/selectors/tasks.bdd.md +593 -0
- package/tests/cypress/e2e/_utils/selectors/tasks.cy.ts +864 -0
- package/tests/cypress/e2e/_utils/selectors/taxonomies.cy.ts +126 -0
- package/tests/cypress/e2e/_utils/selectors/teams.bdd.md +278 -0
- package/tests/cypress/e2e/_utils/selectors/teams.cy.ts +195 -0
- package/tests/cypress/e2e/_utils/superadmin/all-teams.bdd.md +261 -0
- package/tests/cypress/e2e/_utils/superadmin/all-teams.cy.ts +177 -0
- package/tests/cypress/e2e/_utils/superadmin/all-users.bdd.md +406 -0
- package/tests/cypress/e2e/_utils/superadmin/all-users.cy.ts +294 -0
- package/tests/cypress/e2e/_utils/superadmin/dashboard.bdd.md +235 -0
- package/tests/cypress/e2e/_utils/superadmin/dashboard.cy.ts +149 -0
- package/tests/cypress/e2e/_utils/superadmin/subscriptions-overview.bdd.md +290 -0
- package/tests/cypress/e2e/_utils/superadmin/subscriptions-overview.cy.ts +194 -0
- package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
- package/tests/cypress/e2e/ai/chat-api.cy.ts +119 -0
- package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
- package/tests/cypress/e2e/api/_core/billing/BillingAPIController.js +319 -0
- package/tests/cypress/e2e/api/_core/billing/check-action.cy.ts +326 -0
- package/tests/cypress/e2e/api/_core/billing/checkout.cy.ts +358 -0
- package/tests/cypress/e2e/api/_core/billing/lifecycle.cy.ts +423 -0
- package/tests/cypress/e2e/api/_core/billing/plans/README.md +345 -0
- package/tests/cypress/e2e/api/_core/billing/plans/business.cy.ts +412 -0
- package/tests/cypress/e2e/api/_core/billing/plans/downgrade.cy.ts +510 -0
- package/tests/cypress/e2e/api/_core/billing/plans/fixtures/billing-plans.json +163 -0
- package/tests/cypress/e2e/api/_core/billing/plans/free.cy.ts +500 -0
- package/tests/cypress/e2e/api/_core/billing/plans/pro.cy.ts +497 -0
- package/tests/cypress/e2e/api/_core/billing/plans/starter.cy.ts +342 -0
- package/tests/cypress/e2e/api/_core/billing/portal.cy.ts +313 -0
- package/tests/cypress/e2e/api/_core/devtools/registries.bdd.md +300 -0
- package/tests/cypress/e2e/api/_core/devtools/registries.cy.ts +368 -0
- package/tests/cypress/e2e/api/_core/scheduled-actions/cron-endpoint.bdd.md +375 -0
- package/tests/cypress/e2e/api/_core/scheduled-actions/cron-endpoint.cy.ts +346 -0
- package/tests/cypress/e2e/api/_core/scheduled-actions/devtools-endpoint.bdd.md +451 -0
- package/tests/cypress/e2e/api/_core/scheduled-actions/devtools-endpoint.cy.ts +447 -0
- package/tests/cypress/e2e/api/_core/scheduled-actions/scheduling.bdd.md +649 -0
- package/tests/cypress/e2e/api/_core/scheduled-actions/scheduling.cy.ts +333 -0
- package/tests/cypress/e2e/api/_core/security/security-headers.cy.ts +601 -0
- package/tests/cypress/e2e/api/_core/settings/api-keys.crud.cy.ts +923 -0
- package/tests/cypress/e2e/api/_core/teams/teams-security.cy.ts +415 -0
- package/tests/cypress/e2e/api/_core/users/users-crud.cy.ts +469 -0
- package/tests/cypress/e2e/api/_core/users/users-metas.cy.ts +913 -0
- package/tests/cypress/e2e/api/_core/users/users-security.cy.ts +375 -0
- package/tests/cypress/e2e/api/entities/customers/customers-crud.cy.ts +648 -0
- package/tests/cypress/e2e/api/entities/customers/customers-metas.cy.ts +839 -0
- package/tests/cypress/e2e/api/entities/media/media-crud.cy.ts +600 -0
- package/tests/cypress/e2e/api/entities/media/media-role-permissions.cy.ts +617 -0
- package/tests/cypress/e2e/api/entities/media/media-team-isolation.cy.ts +464 -0
- package/tests/cypress/e2e/api/entities/pages/blocks-scope.cy.ts +396 -0
- package/tests/cypress/e2e/api/entities/pages/pages-crud.cy.ts +425 -0
- package/tests/cypress/e2e/api/entities/pages/pages-status.cy.ts +335 -0
- package/tests/cypress/e2e/api/entities/posts/post-categories-crud.cy.ts +610 -0
- package/tests/cypress/e2e/api/entities/posts/posts-crud.cy.ts +709 -0
- package/tests/cypress/e2e/api/entities/posts/posts-status.cy.ts +396 -0
- package/tests/cypress/e2e/api/entities/tasks/tasks-crud.cy.ts +602 -0
- package/tests/cypress/e2e/api/entities/tasks/tasks-metas.cy.ts +878 -0
- package/tests/cypress/e2e/patterns/patterns-in-pages.cy.ts +367 -0
- package/tests/cypress/e2e/uat/_core/auth/app-roles/developer-login.bdd.md +231 -0
- package/tests/cypress/e2e/uat/_core/auth/app-roles/developer-login.cy.ts +144 -0
- package/tests/cypress/e2e/uat/_core/auth/app-roles/superadmin-login.bdd.md +118 -0
- package/tests/cypress/e2e/uat/_core/auth/app-roles/superadmin-login.cy.ts +84 -0
- package/tests/cypress/e2e/uat/_core/auth/custom-roles/editor-login.bdd.md +288 -0
- package/tests/cypress/e2e/uat/_core/auth/custom-roles/editor-login.cy.ts +188 -0
- package/tests/cypress/e2e/uat/_core/auth/login-logout.bdd.md +160 -0
- package/tests/cypress/e2e/uat/_core/auth/login-logout.cy.ts +116 -0
- package/tests/cypress/e2e/uat/_core/auth/password-reset.bdd.md +289 -0
- package/tests/cypress/e2e/uat/_core/auth/password-reset.cy.ts +200 -0
- package/tests/cypress/e2e/uat/_core/auth/registration-control-invitation.cy.ts +176 -0
- package/tests/cypress/e2e/uat/_core/auth/registration-control-open.cy.ts +131 -0
- package/tests/cypress/e2e/uat/_core/auth/registration-control.cy.ts +140 -0
- package/tests/cypress/e2e/uat/_core/auth/team-roles/admin-login.bdd.md +225 -0
- package/tests/cypress/e2e/uat/_core/auth/team-roles/admin-login.cy.ts +148 -0
- package/tests/cypress/e2e/uat/_core/auth/team-roles/member-login.bdd.md +251 -0
- package/tests/cypress/e2e/uat/_core/auth/team-roles/member-login.cy.ts +163 -0
- package/tests/cypress/e2e/uat/_core/auth/team-roles/owner-login.bdd.md +231 -0
- package/tests/cypress/e2e/uat/_core/auth/team-roles/owner-login.cy.ts +141 -0
- package/tests/cypress/e2e/uat/_core/billing/extended.bdd.md +273 -0
- package/tests/cypress/e2e/uat/_core/billing/extended.cy.ts +209 -0
- package/tests/cypress/e2e/uat/_core/billing/feature-gates.bdd.md +407 -0
- package/tests/cypress/e2e/uat/_core/billing/feature-gates.cy.ts +307 -0
- package/tests/cypress/e2e/uat/_core/billing/page.bdd.md +329 -0
- package/tests/cypress/e2e/uat/_core/billing/page.cy.ts +250 -0
- package/tests/cypress/e2e/uat/_core/billing/status.bdd.md +190 -0
- package/tests/cypress/e2e/uat/_core/billing/status.cy.ts +145 -0
- package/tests/cypress/e2e/uat/_core/billing/team-switch.bdd.md +156 -0
- package/tests/cypress/e2e/uat/_core/billing/team-switch.cy.ts +122 -0
- package/tests/cypress/e2e/uat/_core/billing/usage.bdd.md +218 -0
- package/tests/cypress/e2e/uat/_core/billing/usage.cy.ts +176 -0
- package/tests/cypress/e2e/uat/_core/blocks/hero.bdd.md +124 -0
- package/tests/cypress/e2e/uat/_core/blocks/hero.cy.ts +56 -0
- package/tests/cypress/e2e/uat/_core/devtools/api-tester.cy.ts +390 -0
- package/tests/cypress/e2e/uat/_core/performance/suspense-loading.cy.ts +134 -0
- package/tests/cypress/e2e/uat/_core/scheduled-actions/devtools-ui.bdd.md +736 -0
- package/tests/cypress/e2e/uat/_core/scheduled-actions/devtools-ui.cy.ts +740 -0
- package/tests/cypress/e2e/uat/_core/teams/inline-edit.cy.ts +278 -0
- package/tests/cypress/e2e/uat/_core/teams/roles-matrix.bdd.md +553 -0
- package/tests/cypress/e2e/uat/_core/teams/roles-matrix.cy.ts +185 -0
- package/tests/cypress/e2e/uat/_core/teams/switcher.bdd.md +1151 -0
- package/tests/cypress/e2e/uat/_core/teams/switcher.cy.ts +497 -0
- package/tests/cypress/e2e/uat/_core/teams/team-switcher.md +198 -0
- package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
- package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
- package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
- package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
- package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
- package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
- package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
- package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
- package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
- package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
- package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
- package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
- package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
- package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
- package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
- package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
- package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
- package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
- package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
- package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
- package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
- package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
- package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
- package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
- package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
- package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
- package/tests/cypress/e2e/uat/features/roles/editor-role.bdd.md +552 -0
- package/tests/cypress/e2e/uat/features/roles/editor-role.cy.ts +210 -0
- package/tests/cypress/e2e/uat/features/roles/member-restrictions.bdd.md +450 -0
- package/tests/cypress/e2e/uat/features/roles/member-restrictions.cy.ts +189 -0
- package/tests/cypress/e2e/uat/features/roles/owner-full-crud.bdd.md +530 -0
- package/tests/cypress/e2e/uat/features/roles/owner-full-crud.cy.ts +247 -0
- package/tests/cypress/fixtures/blocks.json +218 -0
- package/tests/cypress/fixtures/entities.json +87 -0
- package/tests/cypress/fixtures/page-builder.json +21 -0
- package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
- package/tests/cypress/src/components/CustomersPOM.ts +439 -0
- package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
- package/tests/cypress/src/components/EntityForm.ts +375 -0
- package/tests/cypress/src/components/EntityList.ts +389 -0
- package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
- package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
- package/tests/cypress/src/components/PostsListPOM.ts +223 -0
- package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
- package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
- package/tests/cypress/src/components/TasksPOM.ts +272 -0
- package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
- package/tests/cypress/src/components/index.ts +21 -0
- package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
- package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
- package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
- package/tests/cypress/src/controllers/MediaAPIController.js +231 -0
- package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
- package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
- package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
- package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
- package/tests/cypress/src/controllers/index.js +25 -0
- package/tests/cypress/src/core/AuthPOM.ts +450 -0
- package/tests/cypress/src/core/BasePOM.ts +33 -0
- package/tests/cypress/src/core/BlockEditorBasePOM.ts +874 -0
- package/tests/cypress/src/core/DashboardEntityPOM.ts +41 -0
- package/tests/cypress/src/core/index.ts +14 -0
- package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
- package/tests/cypress/src/entities/PagesPOM.ts +137 -0
- package/tests/cypress/src/entities/PatternsPOM.ts +329 -0
- package/tests/cypress/src/entities/PostsPOM.ts +137 -0
- package/tests/cypress/src/entities/TasksPOM.ts +246 -0
- package/tests/cypress/src/entities/index.ts +16 -0
- package/tests/cypress/src/features/BillingPOM.ts +385 -0
- package/tests/cypress/src/features/DashboardPOM.ts +271 -0
- package/tests/cypress/src/features/DevtoolsPOM.ts +750 -0
- package/tests/cypress/src/features/PageBuilderPOM.ts +283 -0
- package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
- package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
- package/tests/cypress/src/features/SettingsPOM.ts +707 -0
- package/tests/cypress/src/features/SuperadminPOM.ts +851 -0
- package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
- package/tests/cypress/src/features/index.ts +28 -0
- package/tests/cypress/src/helpers/ApiInterceptor.ts +20 -0
- package/tests/cypress/src/index.ts +101 -0
- package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
- package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
- package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
- package/tests/cypress/src/pages/dashboard/index.js +6 -0
- package/tests/cypress/src/pages/index.js +5 -0
- package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
- package/tests/cypress/src/pages/public/LandingPage.js +69 -0
- package/tests/cypress/src/pages/public/PricingPage.js +33 -0
- package/tests/cypress/src/pages/public/index.js +6 -0
- package/tests/cypress/src/selectors.ts +46 -0
- package/tests/cypress/src/session-helpers.ts +518 -0
- package/tests/cypress/support/doc-commands.ts +260 -0
- package/tests/cypress/support/e2e.ts +90 -0
- package/tests/cypress.config.ts +178 -0
- package/tests/jest/__mocks__/@nextsparkjs/core/components/ui/badge.js +16 -0
- package/tests/jest/__mocks__/@nextsparkjs/core/lib/db.js +11 -0
- package/tests/jest/__mocks__/@nextsparkjs/registries/permissions-registry.ts +160 -0
- package/tests/jest/__mocks__/@nextsparkjs/registries/theme-registry.ts +68 -0
- package/tests/jest/__mocks__/jose.js +22 -0
- package/tests/jest/__mocks__/next/image.js +15 -0
- package/tests/jest/__mocks__/next-server.js +56 -0
- package/tests/jest/components/post-header.test.tsx +377 -0
- package/tests/jest/jest.config.cjs +154 -0
- package/tests/jest/langchain/COVERAGE.md +372 -0
- package/tests/jest/langchain/guardrails.test.ts +465 -0
- package/tests/jest/langchain/streaming.test.ts +370 -0
- package/tests/jest/langchain/token-tracker.test.ts +455 -0
- package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
- package/tests/jest/langchain/tracer.test.ts +823 -0
- package/tests/jest/services/tasks.service.test.ts +707 -0
- package/tests/jest/setup.ts +170 -0
- package/tests/jest/tsconfig.jest.json +6 -0
- package/tests/jest/validation/categories.test.ts +429 -0
- package/tests/jest/validation/posts.test.ts +546 -0
- package/tests/tsconfig.json +21 -0
- /package/docs/{02-features → public/02-features}/01-components.md +0 -0
- /package/docs/{02-features → public/02-features}/02-styling.md +0 -0
|
@@ -32,7 +32,7 @@ export function TimelineBlock({
|
|
|
32
32
|
}: TimelineBlockProps) {
|
|
33
33
|
// Build section classes with background and custom className
|
|
34
34
|
const sectionClasses = buildSectionClasses(
|
|
35
|
-
'py-16 px-4 md:py-24',
|
|
35
|
+
'py-16 px-4 @md:py-24',
|
|
36
36
|
{ backgroundColor, className }
|
|
37
37
|
)
|
|
38
38
|
|
|
@@ -46,7 +46,7 @@ export function TimelineBlock({
|
|
|
46
46
|
{(title || subtitle) && (
|
|
47
47
|
<div className="mb-16 text-center">
|
|
48
48
|
{title && (
|
|
49
|
-
<h2 className="mb-4 text-4xl font-bold md:text-5xl">
|
|
49
|
+
<h2 className="mb-4 text-4xl font-bold @md:text-5xl">
|
|
50
50
|
{title}
|
|
51
51
|
</h2>
|
|
52
52
|
)}
|
|
@@ -96,10 +96,10 @@ function VerticalTimeline({
|
|
|
96
96
|
<div className="relative">
|
|
97
97
|
{/* Connector Line */}
|
|
98
98
|
{showConnector && (
|
|
99
|
-
<div className="absolute left-1/2 top-0 bottom-0 w-0.5 bg-border -translate-x-1/2 hidden md:block" />
|
|
99
|
+
<div className="absolute left-1/2 top-0 bottom-0 w-0.5 bg-border -translate-x-1/2 hidden @md:block" />
|
|
100
100
|
)}
|
|
101
101
|
{showConnector && (
|
|
102
|
-
<div className="absolute left-8 top-0 bottom-0 w-0.5 bg-border md:hidden" />
|
|
102
|
+
<div className="absolute left-8 top-0 bottom-0 w-0.5 bg-border @md:hidden" />
|
|
103
103
|
)}
|
|
104
104
|
|
|
105
105
|
{/* Timeline Items */}
|
|
@@ -112,27 +112,27 @@ function VerticalTimeline({
|
|
|
112
112
|
key={index}
|
|
113
113
|
className={cn(
|
|
114
114
|
'relative flex items-center gap-8',
|
|
115
|
-
alternating ? 'md:justify-center' : 'md:justify-start md:pl-[50%]',
|
|
116
|
-
'justify-start pl-16 md:pl-0'
|
|
115
|
+
alternating ? '@md:justify-center' : '@md:justify-start @md:pl-[50%]',
|
|
116
|
+
'justify-start pl-16 @md:pl-0'
|
|
117
117
|
)}
|
|
118
118
|
>
|
|
119
119
|
{/* Mobile/Left Content */}
|
|
120
120
|
<div className={cn(
|
|
121
121
|
'flex-1',
|
|
122
|
-
alternating && !isLeft && 'md:text-right md:order-1',
|
|
123
|
-
!alternating && 'md:pl-8'
|
|
122
|
+
alternating && !isLeft && '@md:text-right @md:order-1',
|
|
123
|
+
!alternating && '@md:pl-8'
|
|
124
124
|
)}>
|
|
125
125
|
<TimelineItemContent item={item} variant={variant} align={alternating && !isLeft ? 'right' : 'left'} />
|
|
126
126
|
</div>
|
|
127
127
|
|
|
128
128
|
{/* Center Dot */}
|
|
129
|
-
<div className="absolute left-8 md:left-1/2 md:-translate-x-1/2 flex-shrink-0">
|
|
129
|
+
<div className="absolute left-8 @md:left-1/2 @md:-translate-x-1/2 flex-shrink-0">
|
|
130
130
|
<TimelineIcon item={item} />
|
|
131
131
|
</div>
|
|
132
132
|
|
|
133
133
|
{/* Desktop Spacer (for alternating layout) */}
|
|
134
134
|
{alternating && (
|
|
135
|
-
<div className="hidden md:block flex-1" />
|
|
135
|
+
<div className="hidden @md:block flex-1" />
|
|
136
136
|
)}
|
|
137
137
|
</div>
|
|
138
138
|
)
|
|
@@ -158,7 +158,7 @@ function HorizontalTimeline({
|
|
|
158
158
|
return (
|
|
159
159
|
<div className="relative">
|
|
160
160
|
{/* Mobile: Vertical Layout */}
|
|
161
|
-
<div className="md:hidden">
|
|
161
|
+
<div className="@md:hidden">
|
|
162
162
|
{showConnector && (
|
|
163
163
|
<div className="absolute left-8 top-0 bottom-0 w-0.5 bg-border" />
|
|
164
164
|
)}
|
|
@@ -175,7 +175,7 @@ function HorizontalTimeline({
|
|
|
175
175
|
</div>
|
|
176
176
|
|
|
177
177
|
{/* Desktop: Horizontal Layout */}
|
|
178
|
-
<div className="hidden md:block overflow-x-auto pb-4">
|
|
178
|
+
<div className="hidden @md:block overflow-x-auto pb-4">
|
|
179
179
|
<div className="relative min-w-max">
|
|
180
180
|
{/* Connector Line */}
|
|
181
181
|
{showConnector && (
|
|
@@ -151,13 +151,13 @@ export function VideoHeroBlock({
|
|
|
151
151
|
{/* Content Overlay */}
|
|
152
152
|
<div className="container relative z-10 mx-auto max-w-4xl text-center px-4 py-20 text-white">
|
|
153
153
|
{title && (
|
|
154
|
-
<h1 className="mb-6 text-5xl font-bold leading-tight md:text-6xl lg:text-7xl">
|
|
154
|
+
<h1 className="mb-6 text-5xl font-bold leading-tight @md:text-6xl @lg:text-7xl">
|
|
155
155
|
{title}
|
|
156
156
|
</h1>
|
|
157
157
|
)}
|
|
158
158
|
|
|
159
159
|
{content && (
|
|
160
|
-
<p className="mb-8 text-xl md:text-2xl opacity-90">
|
|
160
|
+
<p className="mb-8 text-xl @md:text-2xl opacity-90">
|
|
161
161
|
{content}
|
|
162
162
|
</p>
|
|
163
163
|
)}
|
|
@@ -187,17 +187,17 @@ export function VideoHeroBlock({
|
|
|
187
187
|
data-cy={sel('blocks.videoHero.container')}
|
|
188
188
|
>
|
|
189
189
|
<div className="container mx-auto">
|
|
190
|
-
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8 items-center">
|
|
190
|
+
<div className="grid grid-cols-1 @lg:grid-cols-2 gap-8 items-center">
|
|
191
191
|
{/* Text Content */}
|
|
192
192
|
<div className="space-y-6">
|
|
193
193
|
{title && (
|
|
194
|
-
<h1 className="text-4xl font-bold leading-tight md:text-5xl lg:text-6xl">
|
|
194
|
+
<h1 className="text-4xl font-bold leading-tight @md:text-5xl @lg:text-6xl">
|
|
195
195
|
{title}
|
|
196
196
|
</h1>
|
|
197
197
|
)}
|
|
198
198
|
|
|
199
199
|
{content && (
|
|
200
|
-
<p className="text-lg md:text-xl text-gray-600">
|
|
200
|
+
<p className="text-lg @md:text-xl text-gray-600">
|
|
201
201
|
{content}
|
|
202
202
|
</p>
|
|
203
203
|
)}
|
|
@@ -236,13 +236,13 @@ export function VideoHeroBlock({
|
|
|
236
236
|
{/* Text Content */}
|
|
237
237
|
<div className="text-center mb-10 space-y-6">
|
|
238
238
|
{title && (
|
|
239
|
-
<h1 className="text-4xl font-bold leading-tight md:text-5xl lg:text-6xl">
|
|
239
|
+
<h1 className="text-4xl font-bold leading-tight @md:text-5xl @lg:text-6xl">
|
|
240
240
|
{title}
|
|
241
241
|
</h1>
|
|
242
242
|
)}
|
|
243
243
|
|
|
244
244
|
{content && (
|
|
245
|
-
<p className="text-lg md:text-xl text-gray-600 max-w-3xl mx-auto">
|
|
245
|
+
<p className="text-lg @md:text-xl text-gray-600 max-w-3xl mx-auto">
|
|
246
246
|
{content}
|
|
247
247
|
</p>
|
|
248
248
|
)}
|
|
@@ -28,7 +28,7 @@ const videoHeroContentFields: FieldDefinition[] = [
|
|
|
28
28
|
{
|
|
29
29
|
name: 'videoThumbnail',
|
|
30
30
|
label: 'Custom Thumbnail',
|
|
31
|
-
type: '
|
|
31
|
+
type: 'media-library',
|
|
32
32
|
tab: 'content',
|
|
33
33
|
required: false,
|
|
34
34
|
helpText: 'Optional custom thumbnail shown before video plays (recommended: 1920x1080px)',
|
|
@@ -8,7 +8,7 @@ import { MessageInput } from './MessageInput'
|
|
|
8
8
|
import { MarkdownRenderer } from './MarkdownRenderer'
|
|
9
9
|
import { TypingIndicator } from './TypingIndicator'
|
|
10
10
|
import { ConversationSidebar } from './ConversationSidebar'
|
|
11
|
-
import {
|
|
11
|
+
import { sel } from '@nextsparkjs/core/selectors'
|
|
12
12
|
import { cn } from '@nextsparkjs/core/lib/utils'
|
|
13
13
|
import { Bot, User, Loader2, Trash2, ListTodo, Users, FileText, Sparkles, X } from 'lucide-react'
|
|
14
14
|
import type { ConversationInfo } from '../../lib/hooks/useConversations'
|
|
@@ -163,7 +163,7 @@ function ChatMessageItem({
|
|
|
163
163
|
|
|
164
164
|
return (
|
|
165
165
|
<div
|
|
166
|
-
data-cy={
|
|
166
|
+
data-cy={sel(message.role === 'user' ? 'common.aiChat.messageUser' : 'common.aiChat.messageAssistant')}
|
|
167
167
|
className={cn(
|
|
168
168
|
'flex w-full gap-3 p-4',
|
|
169
169
|
isUser ? 'flex-row-reverse' : 'flex-row'
|
|
@@ -351,7 +351,7 @@ export function ChatPanel({
|
|
|
351
351
|
return (
|
|
352
352
|
<div className="h-[calc(100vh-4rem)] p-4 md:p-6 lg:p-8">
|
|
353
353
|
<Card
|
|
354
|
-
data-cy={
|
|
354
|
+
data-cy={sel('common.aiChat.panel')}
|
|
355
355
|
className={cn(
|
|
356
356
|
'flex h-full mx-auto overflow-hidden shadow-lg',
|
|
357
357
|
layoutClass
|
|
@@ -408,7 +408,7 @@ export function ChatPanel({
|
|
|
408
408
|
{/* Clear button */}
|
|
409
409
|
{header.showClearButton && header.onClear && (
|
|
410
410
|
<Button
|
|
411
|
-
data-cy={
|
|
411
|
+
data-cy={sel('common.aiChat.clearBtn')}
|
|
412
412
|
variant="ghost"
|
|
413
413
|
size="sm"
|
|
414
414
|
onClick={header.onClear}
|
|
@@ -470,13 +470,13 @@ export function ChatPanel({
|
|
|
470
470
|
) : (
|
|
471
471
|
/* Messages */
|
|
472
472
|
<ScrollArea
|
|
473
|
-
data-cy={
|
|
473
|
+
data-cy={sel('common.aiChat.messageList')}
|
|
474
474
|
className="flex-1 p-4"
|
|
475
475
|
>
|
|
476
476
|
<div className="flex flex-col gap-4">
|
|
477
477
|
{error && (
|
|
478
478
|
<div
|
|
479
|
-
data-cy={
|
|
479
|
+
data-cy={sel('common.aiChat.errorMessage')}
|
|
480
480
|
className="p-4 mb-2 text-sm text-red-600 bg-red-50 dark:bg-red-900/20 dark:text-red-400 rounded-lg"
|
|
481
481
|
>
|
|
482
482
|
{error}
|
|
@@ -517,7 +517,7 @@ export function ChatPanel({
|
|
|
517
517
|
variant="outline"
|
|
518
518
|
size="sm"
|
|
519
519
|
onClick={onCancelStream}
|
|
520
|
-
data-cy=
|
|
520
|
+
data-cy={sel('common.aiChat.cancelBtn')}
|
|
521
521
|
>
|
|
522
522
|
<X className="h-4 w-4 mr-1" />
|
|
523
523
|
Stop generating
|
|
@@ -2,7 +2,7 @@ import { cn } from '@nextsparkjs/core/lib/utils'
|
|
|
2
2
|
import { Message as MessageType } from '../../lib/hooks/useAiChat'
|
|
3
3
|
import { MarkdownRenderer } from './MarkdownRenderer'
|
|
4
4
|
import { User, Bot } from 'lucide-react'
|
|
5
|
-
import {
|
|
5
|
+
import { sel } from '@nextsparkjs/core/selectors'
|
|
6
6
|
|
|
7
7
|
interface MessageProps {
|
|
8
8
|
message: MessageType
|
|
@@ -13,7 +13,7 @@ export function Message({ message }: MessageProps) {
|
|
|
13
13
|
|
|
14
14
|
return (
|
|
15
15
|
<div
|
|
16
|
-
data-cy={
|
|
16
|
+
data-cy={sel(message.role === 'user' ? 'common.aiChat.messageUser' : 'common.aiChat.messageAssistant')}
|
|
17
17
|
className={cn(
|
|
18
18
|
'flex w-full gap-3 p-4',
|
|
19
19
|
isUser ? 'flex-row-reverse' : 'flex-row'
|
|
@@ -2,7 +2,7 @@ import { KeyboardEvent } from 'react'
|
|
|
2
2
|
import { Button } from '@nextsparkjs/core/components/ui/button'
|
|
3
3
|
import { Textarea } from '@nextsparkjs/core/components/ui/textarea'
|
|
4
4
|
import { Send } from 'lucide-react'
|
|
5
|
-
import {
|
|
5
|
+
import { sel } from '@nextsparkjs/core/selectors'
|
|
6
6
|
|
|
7
7
|
interface MessageInputProps {
|
|
8
8
|
value: string
|
|
@@ -23,7 +23,7 @@ export function MessageInput({ value, onChange, onSend, isLoading }: MessageInpu
|
|
|
23
23
|
<div className="p-4 border-t bg-background">
|
|
24
24
|
<div className="flex gap-2">
|
|
25
25
|
<Textarea
|
|
26
|
-
data-cy={
|
|
26
|
+
data-cy={sel('common.aiChat.messageInput')}
|
|
27
27
|
value={value}
|
|
28
28
|
onChange={(e) => onChange(e.target.value)}
|
|
29
29
|
onKeyDown={handleKeyDown}
|
|
@@ -32,7 +32,7 @@ export function MessageInput({ value, onChange, onSend, isLoading }: MessageInpu
|
|
|
32
32
|
disabled={isLoading}
|
|
33
33
|
/>
|
|
34
34
|
<Button
|
|
35
|
-
data-cy={
|
|
35
|
+
data-cy={sel('common.aiChat.sendBtn')}
|
|
36
36
|
size="icon"
|
|
37
37
|
onClick={onSend}
|
|
38
38
|
disabled={!value.trim() || isLoading}
|
|
@@ -3,7 +3,7 @@ import { ScrollArea } from '@nextsparkjs/core/components/ui/scroll-area'
|
|
|
3
3
|
import { Message as MessageType } from '../../lib/hooks/useAiChat'
|
|
4
4
|
import { Message } from './Message'
|
|
5
5
|
import { TypingIndicator } from './TypingIndicator'
|
|
6
|
-
import {
|
|
6
|
+
import { sel } from '@nextsparkjs/core/selectors'
|
|
7
7
|
|
|
8
8
|
interface MessageListProps {
|
|
9
9
|
messages: MessageType[]
|
|
@@ -21,11 +21,11 @@ export function MessageList({ messages, isLoading, error }: MessageListProps) {
|
|
|
21
21
|
}, [messages, isLoading])
|
|
22
22
|
|
|
23
23
|
return (
|
|
24
|
-
<ScrollArea data-cy={
|
|
24
|
+
<ScrollArea data-cy={sel('common.aiChat.messageList')} className="flex-1 p-4">
|
|
25
25
|
<div className="flex flex-col gap-4">
|
|
26
26
|
{error && (
|
|
27
27
|
<div
|
|
28
|
-
data-cy={
|
|
28
|
+
data-cy={sel('common.aiChat.errorMessage')}
|
|
29
29
|
className="p-4 mb-2 text-sm text-red-600 bg-red-50 dark:bg-red-900/20 dark:text-red-400 rounded-lg"
|
|
30
30
|
>
|
|
31
31
|
{error}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { sel } from '@nextsparkjs/core/selectors'
|
|
2
2
|
|
|
3
3
|
export function TypingIndicator() {
|
|
4
4
|
return (
|
|
5
|
-
<div data-cy={
|
|
5
|
+
<div data-cy={sel('common.aiChat.typingIndicator')} className="flex items-center gap-1 p-2">
|
|
6
6
|
<div className="w-2 h-2 bg-muted-foreground/40 rounded-full animate-bounce [animation-delay:-0.3s]" />
|
|
7
7
|
<div className="w-2 h-2 bg-muted-foreground/40 rounded-full animate-bounce [animation-delay:-0.15s]" />
|
|
8
8
|
<div className="w-2 h-2 bg-muted-foreground/40 rounded-full animate-bounce" />
|
package/config/app.config.ts
CHANGED
|
@@ -34,6 +34,42 @@ export const APP_CONFIG_OVERRIDES = {
|
|
|
34
34
|
},
|
|
35
35
|
},
|
|
36
36
|
|
|
37
|
+
// =============================================================================
|
|
38
|
+
// AUTHENTICATION CONFIGURATION
|
|
39
|
+
// =============================================================================
|
|
40
|
+
/**
|
|
41
|
+
* Registration modes:
|
|
42
|
+
* - 'open': Anyone can register (email+password and Google OAuth) - DEFAULT
|
|
43
|
+
* - 'domain-restricted': Only Google OAuth for specific email domains
|
|
44
|
+
* - 'invitation-only': Registration only via invitation link
|
|
45
|
+
*/
|
|
46
|
+
auth: {
|
|
47
|
+
registration: {
|
|
48
|
+
mode: 'domain-restricted' as const,
|
|
49
|
+
allowedDomains: ['nextspark.dev'],
|
|
50
|
+
},
|
|
51
|
+
providers: {
|
|
52
|
+
google: {
|
|
53
|
+
enabled: true,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
/**
|
|
57
|
+
* Whether Better Auth automatically sends the verification email on signup.
|
|
58
|
+
*
|
|
59
|
+
* - `true` (default): users get a "Verify Your Email Address" link email
|
|
60
|
+
* immediately when they sign up via `/api/auth/sign-up/email`.
|
|
61
|
+
* - `false`: suppress the automatic email. Use this when your project
|
|
62
|
+
* verifies email ownership through other means (OTP code, invitation
|
|
63
|
+
* token, claim-account flow). The `sendVerificationEmail` function
|
|
64
|
+
* remains available — you can still trigger link-based verification
|
|
65
|
+
* explicitly when you need to.
|
|
66
|
+
*
|
|
67
|
+
* `requireEmailVerification: true` is enforced regardless: users with
|
|
68
|
+
* `emailVerified: false` cannot sign in.
|
|
69
|
+
*/
|
|
70
|
+
sendVerificationEmailOnSignup: true,
|
|
71
|
+
},
|
|
72
|
+
|
|
37
73
|
// =============================================================================
|
|
38
74
|
// INTERNATIONALIZATION OVERRIDES
|
|
39
75
|
// =============================================================================
|
|
@@ -72,17 +108,19 @@ export const APP_CONFIG_OVERRIDES = {
|
|
|
72
108
|
// =============================================================================
|
|
73
109
|
api: {
|
|
74
110
|
cors: {
|
|
75
|
-
|
|
111
|
+
// Theme-specific CORS origins (extends core defaults, does not replace)
|
|
112
|
+
// Core already includes: localhost:3000, localhost:5173, and their 127.0.0.1 variants
|
|
113
|
+
additionalOrigins: {
|
|
76
114
|
development: [
|
|
77
|
-
'http://localhost:
|
|
78
|
-
'http://localhost:
|
|
79
|
-
'http://
|
|
80
|
-
'http://
|
|
81
|
-
//
|
|
115
|
+
'http://localhost:8081', // Expo mobile web
|
|
116
|
+
'http://localhost:8082', // Expo alternate port
|
|
117
|
+
'http://localhost:19006', // Expo web (legacy)
|
|
118
|
+
'http://192.168.68.106:8081', // Local network Expo
|
|
119
|
+
// Add theme-specific development origins here
|
|
82
120
|
],
|
|
83
121
|
production: [
|
|
84
|
-
// Add
|
|
85
|
-
// 'https://boilerplate-themoneyteam.xyz',
|
|
122
|
+
// Add theme-specific production domains
|
|
123
|
+
// 'https://mobile.boilerplate-themoneyteam.xyz',
|
|
86
124
|
],
|
|
87
125
|
},
|
|
88
126
|
},
|
|
@@ -91,78 +129,51 @@ export const APP_CONFIG_OVERRIDES = {
|
|
|
91
129
|
// =============================================================================
|
|
92
130
|
// DOCUMENTATION CONFIGURATION
|
|
93
131
|
// =============================================================================
|
|
132
|
+
/**
|
|
133
|
+
* Documentation system configuration
|
|
134
|
+
*
|
|
135
|
+
* Structure:
|
|
136
|
+
* - public: User-facing documentation at /docs
|
|
137
|
+
* - superadmin: Admin documentation at /superadmin/docs
|
|
138
|
+
*
|
|
139
|
+
* NOTE: Plugin docs are NOT in the registry - they are for developer reference only (IDE/LLM).
|
|
140
|
+
*/
|
|
94
141
|
docs: {
|
|
95
|
-
/**
|
|
96
|
-
* Enable/disable documentation system
|
|
97
|
-
*/
|
|
142
|
+
/** Enable/disable documentation system */
|
|
98
143
|
enabled: true,
|
|
99
144
|
|
|
100
|
-
/**
|
|
101
|
-
|
|
102
|
-
* - true: Documentation accessible without authentication
|
|
103
|
-
* - false: Requires user to be logged in
|
|
104
|
-
*/
|
|
105
|
-
public: true,
|
|
145
|
+
/** Make public documentation accessible without authentication */
|
|
146
|
+
publicAccess: true,
|
|
106
147
|
|
|
107
|
-
/**
|
|
108
|
-
* Enable search functionality in documentation
|
|
109
|
-
*/
|
|
148
|
+
/** Enable search functionality in documentation */
|
|
110
149
|
searchEnabled: true,
|
|
111
150
|
|
|
112
|
-
/**
|
|
113
|
-
* Show breadcrumbs in documentation pages
|
|
114
|
-
*/
|
|
151
|
+
/** Show breadcrumbs in documentation pages */
|
|
115
152
|
breadcrumbs: true,
|
|
116
153
|
|
|
117
154
|
/**
|
|
118
|
-
*
|
|
119
|
-
* Controls
|
|
155
|
+
* Public Documentation Configuration
|
|
156
|
+
* Controls public-facing documentation at /docs routes
|
|
120
157
|
*/
|
|
121
|
-
|
|
122
|
-
/** Show/hide
|
|
158
|
+
public: {
|
|
159
|
+
/** Show/hide public documentation */
|
|
123
160
|
enabled: true,
|
|
124
|
-
/** Expand
|
|
161
|
+
/** Expand sections by default on page load */
|
|
125
162
|
open: true,
|
|
126
|
-
/** Custom label displayed in sidebar
|
|
127
|
-
label: "
|
|
128
|
-
},
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Plugins Documentation Configuration
|
|
132
|
-
* Controls how plugin documentation appears in the sidebar
|
|
133
|
-
*/
|
|
134
|
-
plugins: {
|
|
135
|
-
/** Show/hide plugin documentation category */
|
|
136
|
-
enabled: true,
|
|
137
|
-
/** Expand plugins category by default on page load */
|
|
138
|
-
open: false,
|
|
139
|
-
/** Custom label displayed in sidebar for plugins category */
|
|
140
|
-
label: "Plugins",
|
|
163
|
+
/** Custom label displayed in sidebar */
|
|
164
|
+
label: "Documentation",
|
|
141
165
|
},
|
|
142
166
|
|
|
143
167
|
/**
|
|
144
|
-
*
|
|
145
|
-
* Controls
|
|
168
|
+
* Superadmin Documentation Configuration
|
|
169
|
+
* Controls admin documentation at /superadmin/docs routes
|
|
146
170
|
*/
|
|
147
|
-
|
|
148
|
-
/** Show/hide
|
|
171
|
+
superadmin: {
|
|
172
|
+
/** Show/hide superadmin documentation */
|
|
149
173
|
enabled: true,
|
|
150
|
-
/**
|
|
151
|
-
|
|
152
|
-
/** Custom label displayed in sidebar for core category */
|
|
153
|
-
label: "Core",
|
|
174
|
+
/** Custom label displayed in sidebar */
|
|
175
|
+
label: "Admin Docs",
|
|
154
176
|
},
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Additional environment-based check for plugin docs in production
|
|
158
|
-
* Plugin docs will only show if BOTH conditions are met:
|
|
159
|
-
* 1. plugins.enabled is true
|
|
160
|
-
* 2. Either in development OR showPluginsDocsInProd is true
|
|
161
|
-
*
|
|
162
|
-
* @deprecated Prefer using plugins.enabled for simpler control
|
|
163
|
-
* By default plugins documentation is not available in prod environments
|
|
164
|
-
*/
|
|
165
|
-
showPluginsDocsInProd: false,
|
|
166
177
|
},
|
|
167
178
|
|
|
168
179
|
// =============================================================================
|
|
@@ -358,6 +369,23 @@ export const APP_CONFIG_OVERRIDES = {
|
|
|
358
369
|
},
|
|
359
370
|
},
|
|
360
371
|
|
|
372
|
+
// =============================================================================
|
|
373
|
+
// MEDIA LIBRARY OVERRIDES
|
|
374
|
+
// =============================================================================
|
|
375
|
+
// Uncomment and modify to customize media upload limits and accepted file types.
|
|
376
|
+
//
|
|
377
|
+
// media: {
|
|
378
|
+
// maxSizeMB: 10, // General fallback max size
|
|
379
|
+
// maxSizeImageMB: 10, // Max size for image/* files (overrides maxSizeMB)
|
|
380
|
+
// maxSizeVideoMB: 50, // Max size for video/* files (overrides maxSizeMB)
|
|
381
|
+
// acceptedTypes: ['image/*', 'video/*', 'application/pdf'],
|
|
382
|
+
// allowedMimeTypes: [
|
|
383
|
+
// 'image/jpeg', 'image/png', 'image/webp',
|
|
384
|
+
// 'video/mp4', 'video/webm',
|
|
385
|
+
// 'application/pdf',
|
|
386
|
+
// ],
|
|
387
|
+
// },
|
|
388
|
+
|
|
361
389
|
// =============================================================================
|
|
362
390
|
// DEV KEYRING - MOVED TO dev.config.ts
|
|
363
391
|
// =============================================================================
|
package/config/billing.config.ts
CHANGED
|
@@ -163,8 +163,7 @@ export const billingConfig: BillingConfig = {
|
|
|
163
163
|
file_uploads: 100,
|
|
164
164
|
webhooks_count: 0,
|
|
165
165
|
},
|
|
166
|
-
|
|
167
|
-
stripePriceIdYearly: null,
|
|
166
|
+
providerPriceIds: { monthly: null, yearly: null },
|
|
168
167
|
},
|
|
169
168
|
|
|
170
169
|
// Starter Plan - For growing teams
|
|
@@ -194,8 +193,7 @@ export const billingConfig: BillingConfig = {
|
|
|
194
193
|
file_uploads: 500,
|
|
195
194
|
webhooks_count: 3,
|
|
196
195
|
},
|
|
197
|
-
|
|
198
|
-
stripePriceIdYearly: 'price_starter_yearly',
|
|
196
|
+
providerPriceIds: { monthly: 'price_1TAIW6QetGjJvG5hzCCpMwXT', yearly: 'price_1TAIWuQetGjJvG5hkI3aJYTw' },
|
|
199
197
|
},
|
|
200
198
|
|
|
201
199
|
// Pro Plan - For professional teams
|
|
@@ -230,8 +228,7 @@ export const billingConfig: BillingConfig = {
|
|
|
230
228
|
file_uploads: 2000,
|
|
231
229
|
webhooks_count: 10,
|
|
232
230
|
},
|
|
233
|
-
|
|
234
|
-
stripePriceIdYearly: 'price_pro_yearly',
|
|
231
|
+
providerPriceIds: { monthly: 'price_1TAIZMQetGjJvG5hqDh3dbCv', yearly: 'price_1TAIZMQetGjJvG5haLm28w3H' },
|
|
235
232
|
},
|
|
236
233
|
|
|
237
234
|
// Business Plan - For larger organizations
|
|
@@ -270,8 +267,7 @@ export const billingConfig: BillingConfig = {
|
|
|
270
267
|
file_uploads: 10000,
|
|
271
268
|
webhooks_count: 50,
|
|
272
269
|
},
|
|
273
|
-
|
|
274
|
-
stripePriceIdYearly: 'price_business_yearly',
|
|
270
|
+
providerPriceIds: { monthly: 'price_1TAIaNQetGjJvG5hn6fgXx1n', yearly: 'price_1TAIacQetGjJvG5hVQO6i2UL' },
|
|
275
271
|
},
|
|
276
272
|
|
|
277
273
|
// Enterprise Plan - Custom unlimited plan
|
|
@@ -292,8 +288,7 @@ export const billingConfig: BillingConfig = {
|
|
|
292
288
|
file_uploads: -1,
|
|
293
289
|
webhooks_count: -1,
|
|
294
290
|
},
|
|
295
|
-
|
|
296
|
-
stripePriceIdYearly: null,
|
|
291
|
+
providerPriceIds: { monthly: null, yearly: null },
|
|
297
292
|
},
|
|
298
293
|
],
|
|
299
294
|
|
|
@@ -94,6 +94,20 @@ export const DASHBOARD_CONFIG = {
|
|
|
94
94
|
enabled: true,
|
|
95
95
|
},
|
|
96
96
|
|
|
97
|
+
/**
|
|
98
|
+
* Settings menu dropdown (gear icon)
|
|
99
|
+
*/
|
|
100
|
+
settingsMenu: {
|
|
101
|
+
enabled: true,
|
|
102
|
+
links: [
|
|
103
|
+
{
|
|
104
|
+
label: 'navigation.patterns',
|
|
105
|
+
href: '/dashboard/patterns',
|
|
106
|
+
icon: 'layers',
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
|
|
97
111
|
/**
|
|
98
112
|
* User menu dropdown
|
|
99
113
|
*/
|
|
@@ -91,6 +91,16 @@ export default defineFeatures({
|
|
|
91
91
|
docs: ['18-page-builder/*'],
|
|
92
92
|
},
|
|
93
93
|
|
|
94
|
+
patterns: {
|
|
95
|
+
name: 'Patterns',
|
|
96
|
+
description: 'Reusable block patterns for page builder',
|
|
97
|
+
category: 'content',
|
|
98
|
+
icon: 'grid',
|
|
99
|
+
entities: ['patterns'],
|
|
100
|
+
permissions: ['patterns.*'],
|
|
101
|
+
docs: [],
|
|
102
|
+
},
|
|
103
|
+
|
|
94
104
|
// ===========================================================================
|
|
95
105
|
// CORE FEATURES
|
|
96
106
|
// Platform-level features that exist in all themes
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - roles: Custom roles beyond core (owner, admin, member, viewer)
|
|
8
8
|
* - teams: Team-level permissions (team.view, team.edit, etc.)
|
|
9
9
|
* - entities: Entity CRUD permissions (customers, tasks, etc.)
|
|
10
|
-
* - features: Theme-specific feature permissions (page-builder, blog
|
|
10
|
+
* - features: Theme-specific feature permissions (page-builder, blog)
|
|
11
11
|
*
|
|
12
12
|
* All sections use unified format: { action: '...', roles: [...] }
|
|
13
13
|
*
|
|
@@ -110,6 +110,17 @@ export const PERMISSIONS_CONFIG_OVERRIDES: ThemePermissionsConfig = {
|
|
|
110
110
|
{ action: 'delete', label: 'Delete Pages', description: 'Can delete pages', roles: ['owner', 'admin'], dangerous: true },
|
|
111
111
|
{ action: 'publish', label: 'Publish Pages', description: 'Can publish pages to make them public', roles: ['owner', 'admin'] },
|
|
112
112
|
],
|
|
113
|
+
|
|
114
|
+
// ------------------------------------------
|
|
115
|
+
// PATTERNS
|
|
116
|
+
// ------------------------------------------
|
|
117
|
+
patterns: [
|
|
118
|
+
{ action: 'create', label: 'Create Patterns', description: 'Can create reusable patterns', roles: ['owner', 'admin'] },
|
|
119
|
+
{ action: 'read', label: 'View Patterns', description: 'Can view pattern details', roles: ['owner', 'admin', 'member', 'viewer'] },
|
|
120
|
+
{ action: 'list', label: 'List Patterns', description: 'Can see the patterns list', roles: ['owner', 'admin', 'member', 'viewer'] },
|
|
121
|
+
{ action: 'update', label: 'Edit Patterns', description: 'Can modify patterns', roles: ['owner', 'admin'] },
|
|
122
|
+
{ action: 'delete', label: 'Delete Patterns', description: 'Can delete patterns', roles: ['owner', 'admin'], dangerous: true },
|
|
123
|
+
],
|
|
113
124
|
},
|
|
114
125
|
|
|
115
126
|
// ==========================================
|
|
@@ -187,24 +198,18 @@ export const PERMISSIONS_CONFIG_OVERRIDES: ThemePermissionsConfig = {
|
|
|
187
198
|
roles: ['owner', 'admin'],
|
|
188
199
|
},
|
|
189
200
|
|
|
190
|
-
// MEDIA MANAGEMENT
|
|
191
|
-
{
|
|
192
|
-
action: 'media.upload',
|
|
193
|
-
label: 'Upload Media',
|
|
194
|
-
description: 'Can upload images, videos, and other media files',
|
|
195
|
-
category: 'Media',
|
|
196
|
-
roles: ['owner', 'admin', 'editor', 'member'],
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
action: 'media.delete',
|
|
200
|
-
label: 'Delete Media',
|
|
201
|
-
description: 'Can permanently delete media files',
|
|
202
|
-
category: 'Media',
|
|
203
|
-
roles: ['owner', 'admin'],
|
|
204
|
-
dangerous: true,
|
|
205
|
-
},
|
|
206
201
|
],
|
|
207
202
|
|
|
203
|
+
// ==========================================
|
|
204
|
+
// CORE PERMISSION OVERRIDES
|
|
205
|
+
// ==========================================
|
|
206
|
+
// Extend core media permissions with the 'editor' custom role
|
|
207
|
+
overrides: {
|
|
208
|
+
'media.read': { roles: ['owner', 'admin', 'editor', 'member', 'viewer'] },
|
|
209
|
+
'media.upload': { roles: ['owner', 'admin', 'editor'] },
|
|
210
|
+
'media.update': { roles: ['owner', 'admin', 'editor'] },
|
|
211
|
+
},
|
|
212
|
+
|
|
208
213
|
// ==========================================
|
|
209
214
|
// UI SECTIONS
|
|
210
215
|
// ==========================================
|
|
@@ -233,12 +238,6 @@ export const PERMISSIONS_CONFIG_OVERRIDES: ThemePermissionsConfig = {
|
|
|
233
238
|
description: 'Blog publishing and management features',
|
|
234
239
|
categories: ['Blog'],
|
|
235
240
|
},
|
|
236
|
-
{
|
|
237
|
-
id: 'media',
|
|
238
|
-
label: 'Media',
|
|
239
|
-
description: 'Media library management',
|
|
240
|
-
categories: ['Media'],
|
|
241
|
-
},
|
|
242
241
|
],
|
|
243
242
|
}
|
|
244
243
|
|