@nextsparkjs/theme-default 0.1.0-beta.1 → 0.1.0-beta.101
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/LICENSE +21 -0
- 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 +75 -62
- package/config/dashboard.config.ts +14 -0
- package/config/features.config.ts +10 -0
- package/config/permissions.config.ts +26 -1
- 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/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/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/package.json +8 -3
- package/styles/globals.css +42 -0
- package/templates/(public)/blog/[slug]/page.tsx +1 -1
- 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
|
@@ -44,7 +44,7 @@ export function TextContentBlock({
|
|
|
44
44
|
|
|
45
45
|
// Build section classes with background and custom className
|
|
46
46
|
const sectionClasses = buildSectionClasses(
|
|
47
|
-
'py-16 px-4 md:py-24',
|
|
47
|
+
'py-16 px-4 @md:py-24',
|
|
48
48
|
{ backgroundColor, className }
|
|
49
49
|
)
|
|
50
50
|
|
|
@@ -58,21 +58,23 @@ export function TextContentBlock({
|
|
|
58
58
|
maxWidthClasses[maxWidth],
|
|
59
59
|
alignmentClasses[alignment]
|
|
60
60
|
)}>
|
|
61
|
-
<h2 className="text-3xl font-bold md:text-4xl">
|
|
61
|
+
<h2 className="text-3xl font-bold @md:text-4xl">
|
|
62
62
|
{title}
|
|
63
63
|
</h2>
|
|
64
64
|
</div>
|
|
65
65
|
)}
|
|
66
66
|
|
|
67
67
|
{/* Rich Text Content */}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
68
|
+
{content && (
|
|
69
|
+
<div
|
|
70
|
+
className={cn(
|
|
71
|
+
'prose prose-lg dark:prose-invert',
|
|
72
|
+
maxWidthClasses[maxWidth],
|
|
73
|
+
alignmentClasses[alignment]
|
|
74
|
+
)}
|
|
75
|
+
dangerouslySetInnerHTML={{ __html: content }}
|
|
76
|
+
/>
|
|
77
|
+
)}
|
|
76
78
|
|
|
77
79
|
{/* Optional CTA */}
|
|
78
80
|
{cta && (
|
|
@@ -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,27 @@ 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
|
+
|
|
37
58
|
// =============================================================================
|
|
38
59
|
// INTERNATIONALIZATION OVERRIDES
|
|
39
60
|
// =============================================================================
|
|
@@ -72,17 +93,19 @@ export const APP_CONFIG_OVERRIDES = {
|
|
|
72
93
|
// =============================================================================
|
|
73
94
|
api: {
|
|
74
95
|
cors: {
|
|
75
|
-
|
|
96
|
+
// Theme-specific CORS origins (extends core defaults, does not replace)
|
|
97
|
+
// Core already includes: localhost:3000, localhost:5173, and their 127.0.0.1 variants
|
|
98
|
+
additionalOrigins: {
|
|
76
99
|
development: [
|
|
77
|
-
'http://localhost:
|
|
78
|
-
'http://localhost:
|
|
79
|
-
'http://
|
|
80
|
-
'http://
|
|
81
|
-
//
|
|
100
|
+
'http://localhost:8081', // Expo mobile web
|
|
101
|
+
'http://localhost:8082', // Expo alternate port
|
|
102
|
+
'http://localhost:19006', // Expo web (legacy)
|
|
103
|
+
'http://192.168.68.106:8081', // Local network Expo
|
|
104
|
+
// Add theme-specific development origins here
|
|
82
105
|
],
|
|
83
106
|
production: [
|
|
84
|
-
// Add
|
|
85
|
-
// 'https://boilerplate-themoneyteam.xyz',
|
|
107
|
+
// Add theme-specific production domains
|
|
108
|
+
// 'https://mobile.boilerplate-themoneyteam.xyz',
|
|
86
109
|
],
|
|
87
110
|
},
|
|
88
111
|
},
|
|
@@ -91,78 +114,51 @@ export const APP_CONFIG_OVERRIDES = {
|
|
|
91
114
|
// =============================================================================
|
|
92
115
|
// DOCUMENTATION CONFIGURATION
|
|
93
116
|
// =============================================================================
|
|
117
|
+
/**
|
|
118
|
+
* Documentation system configuration
|
|
119
|
+
*
|
|
120
|
+
* Structure:
|
|
121
|
+
* - public: User-facing documentation at /docs
|
|
122
|
+
* - superadmin: Admin documentation at /superadmin/docs
|
|
123
|
+
*
|
|
124
|
+
* NOTE: Plugin docs are NOT in the registry - they are for developer reference only (IDE/LLM).
|
|
125
|
+
*/
|
|
94
126
|
docs: {
|
|
95
|
-
/**
|
|
96
|
-
* Enable/disable documentation system
|
|
97
|
-
*/
|
|
127
|
+
/** Enable/disable documentation system */
|
|
98
128
|
enabled: true,
|
|
99
129
|
|
|
100
|
-
/**
|
|
101
|
-
|
|
102
|
-
* - true: Documentation accessible without authentication
|
|
103
|
-
* - false: Requires user to be logged in
|
|
104
|
-
*/
|
|
105
|
-
public: true,
|
|
130
|
+
/** Make public documentation accessible without authentication */
|
|
131
|
+
publicAccess: true,
|
|
106
132
|
|
|
107
|
-
/**
|
|
108
|
-
* Enable search functionality in documentation
|
|
109
|
-
*/
|
|
133
|
+
/** Enable search functionality in documentation */
|
|
110
134
|
searchEnabled: true,
|
|
111
135
|
|
|
112
|
-
/**
|
|
113
|
-
* Show breadcrumbs in documentation pages
|
|
114
|
-
*/
|
|
136
|
+
/** Show breadcrumbs in documentation pages */
|
|
115
137
|
breadcrumbs: true,
|
|
116
138
|
|
|
117
139
|
/**
|
|
118
|
-
*
|
|
119
|
-
* Controls
|
|
140
|
+
* Public Documentation Configuration
|
|
141
|
+
* Controls public-facing documentation at /docs routes
|
|
120
142
|
*/
|
|
121
|
-
|
|
122
|
-
/** Show/hide
|
|
143
|
+
public: {
|
|
144
|
+
/** Show/hide public documentation */
|
|
123
145
|
enabled: true,
|
|
124
|
-
/** Expand
|
|
146
|
+
/** Expand sections by default on page load */
|
|
125
147
|
open: true,
|
|
126
|
-
/** Custom label displayed in sidebar
|
|
127
|
-
label: "
|
|
148
|
+
/** Custom label displayed in sidebar */
|
|
149
|
+
label: "Documentation",
|
|
128
150
|
},
|
|
129
151
|
|
|
130
152
|
/**
|
|
131
|
-
*
|
|
132
|
-
* Controls
|
|
153
|
+
* Superadmin Documentation Configuration
|
|
154
|
+
* Controls admin documentation at /superadmin/docs routes
|
|
133
155
|
*/
|
|
134
|
-
|
|
135
|
-
/** Show/hide
|
|
156
|
+
superadmin: {
|
|
157
|
+
/** Show/hide superadmin documentation */
|
|
136
158
|
enabled: true,
|
|
137
|
-
/**
|
|
138
|
-
|
|
139
|
-
/** Custom label displayed in sidebar for plugins category */
|
|
140
|
-
label: "Plugins",
|
|
159
|
+
/** Custom label displayed in sidebar */
|
|
160
|
+
label: "Admin Docs",
|
|
141
161
|
},
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Core Documentation Configuration
|
|
145
|
-
* Controls how core framework documentation appears in the sidebar
|
|
146
|
-
*/
|
|
147
|
-
core: {
|
|
148
|
-
/** Show/hide core documentation category */
|
|
149
|
-
enabled: true,
|
|
150
|
-
/** Expand core category by default on page load */
|
|
151
|
-
open: true,
|
|
152
|
-
/** Custom label displayed in sidebar for core category */
|
|
153
|
-
label: "Core",
|
|
154
|
-
},
|
|
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
162
|
},
|
|
167
163
|
|
|
168
164
|
// =============================================================================
|
|
@@ -358,6 +354,23 @@ export const APP_CONFIG_OVERRIDES = {
|
|
|
358
354
|
},
|
|
359
355
|
},
|
|
360
356
|
|
|
357
|
+
// =============================================================================
|
|
358
|
+
// MEDIA LIBRARY OVERRIDES
|
|
359
|
+
// =============================================================================
|
|
360
|
+
// Uncomment and modify to customize media upload limits and accepted file types.
|
|
361
|
+
//
|
|
362
|
+
// media: {
|
|
363
|
+
// maxSizeMB: 10, // General fallback max size
|
|
364
|
+
// maxSizeImageMB: 10, // Max size for image/* files (overrides maxSizeMB)
|
|
365
|
+
// maxSizeVideoMB: 50, // Max size for video/* files (overrides maxSizeMB)
|
|
366
|
+
// acceptedTypes: ['image/*', 'video/*', 'application/pdf'],
|
|
367
|
+
// allowedMimeTypes: [
|
|
368
|
+
// 'image/jpeg', 'image/png', 'image/webp',
|
|
369
|
+
// 'video/mp4', 'video/webm',
|
|
370
|
+
// 'application/pdf',
|
|
371
|
+
// ],
|
|
372
|
+
// },
|
|
373
|
+
|
|
361
374
|
// =============================================================================
|
|
362
375
|
// DEV KEYRING - MOVED TO dev.config.ts
|
|
363
376
|
// =============================================================================
|
|
@@ -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
|
|
@@ -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
|
// ==========================================
|
|
@@ -188,12 +199,26 @@ export const PERMISSIONS_CONFIG_OVERRIDES: ThemePermissionsConfig = {
|
|
|
188
199
|
},
|
|
189
200
|
|
|
190
201
|
// MEDIA MANAGEMENT
|
|
202
|
+
{
|
|
203
|
+
action: 'media.read',
|
|
204
|
+
label: 'View Media',
|
|
205
|
+
description: 'Can browse and view media files in the library',
|
|
206
|
+
category: 'Media',
|
|
207
|
+
roles: ['owner', 'admin', 'editor', 'member', 'viewer'],
|
|
208
|
+
},
|
|
191
209
|
{
|
|
192
210
|
action: 'media.upload',
|
|
193
211
|
label: 'Upload Media',
|
|
194
212
|
description: 'Can upload images, videos, and other media files',
|
|
195
213
|
category: 'Media',
|
|
196
|
-
roles: ['owner', 'admin', 'editor'
|
|
214
|
+
roles: ['owner', 'admin', 'editor'],
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
action: 'media.update',
|
|
218
|
+
label: 'Edit Media',
|
|
219
|
+
description: 'Can edit media metadata, tags, and captions',
|
|
220
|
+
category: 'Media',
|
|
221
|
+
roles: ['owner', 'admin', 'editor'],
|
|
197
222
|
},
|
|
198
223
|
{
|
|
199
224
|
action: 'media.delete',
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: AI Assistant Overview
|
|
3
|
+
description: Learn about the AI-powered assistant features and multi-agent architecture.
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# AI Assistant - Overview
|
|
2
7
|
|
|
3
8
|
This theme includes an AI-powered assistant that helps users manage tasks, customers, and pages through natural language.
|