From 0eec9f729b4a9381cd3f62633756fc0e629577da Mon Sep 17 00:00:00 2001 From: Mortezakoohjani Date: Mon, 27 Jul 2026 21:01:50 +0330 Subject: [PATCH] feat(experience): deploy Experience frontend FE-11.0-11.5 portal Commit completed Torbat Pages admin frontend module, BFF proxy, routes, and validation artifacts for official platform deploy. Co-authored-by: Cursor --- docs/experience-frontend-discovery.md | 36 ++ docs/experience-frontend-progress.md | 16 + docs/experience-frontend-roadmap.md | 28 ++ docs/experience-roadmap.md | 35 +- .../phase-experience-fe-11-5.md | 60 +++ docs/phases/Experience/README.md | 12 +- .../experience-frontend.yaml | 78 +++ docs/service-snapshots/experience.yaml | 54 ++- .../app/api/experience/[...path]/route.ts | 53 +++ .../analytics-report-definitions/error.tsx | 5 + .../analytics-report-definitions/loading.tsx | 4 + .../analytics-report-definitions/page.tsx | 2 + .../experience/analytics-snapshots/error.tsx | 5 + .../analytics-snapshots/loading.tsx | 4 + .../experience/analytics-snapshots/page.tsx | 2 + frontend/app/experience/analytics/error.tsx | 5 + frontend/app/experience/analytics/loading.tsx | 4 + frontend/app/experience/analytics/page.tsx | 2 + frontend/app/experience/audit/error.tsx | 5 + frontend/app/experience/audit/loading.tsx | 4 + frontend/app/experience/audit/page.tsx | 2 + .../app/experience/capabilities/error.tsx | 5 + .../app/experience/capabilities/loading.tsx | 4 + frontend/app/experience/capabilities/page.tsx | 2 + .../experience/component-versions/error.tsx | 5 + .../experience/component-versions/loading.tsx | 4 + .../experience/component-versions/page.tsx | 2 + frontend/app/experience/components/error.tsx | 5 + .../app/experience/components/loading.tsx | 4 + frontend/app/experience/components/page.tsx | 2 + .../app/experience/configurations/error.tsx | 5 + .../app/experience/configurations/loading.tsx | 4 + .../app/experience/configurations/page.tsx | 2 + .../app/experience/design-system/error.tsx | 4 + .../app/experience/design-system/loading.tsx | 4 + .../app/experience/design-system/page.tsx | 2 + .../experience/domain-edge-bindings/error.tsx | 5 + .../domain-edge-bindings/loading.tsx | 4 + .../experience/domain-edge-bindings/page.tsx | 2 + frontend/app/experience/embed/error.tsx | 5 + frontend/app/experience/embed/loading.tsx | 4 + frontend/app/experience/embed/page.tsx | 2 + frontend/app/experience/error.tsx | 5 + .../experience/external-providers/error.tsx | 5 + .../experience/external-providers/loading.tsx | 4 + .../experience/external-providers/page.tsx | 2 + .../app/experience/form-submissions/error.tsx | 5 + .../experience/form-submissions/loading.tsx | 4 + .../app/experience/form-submissions/page.tsx | 2 + .../experience/forms/[id]/builder/error.tsx | 5 + .../experience/forms/[id]/builder/loading.tsx | 4 + .../experience/forms/[id]/builder/page.tsx | 2 + frontend/app/experience/forms/error.tsx | 5 + frontend/app/experience/forms/loading.tsx | 4 + frontend/app/experience/forms/page.tsx | 2 + frontend/app/experience/health/error.tsx | 5 + frontend/app/experience/health/loading.tsx | 4 + frontend/app/experience/health/page.tsx | 2 + frontend/app/experience/hub/error.tsx | 5 + frontend/app/experience/hub/loading.tsx | 4 + frontend/app/experience/hub/page.tsx | 2 + .../app/experience/layout-versions/error.tsx | 5 + .../experience/layout-versions/loading.tsx | 4 + .../app/experience/layout-versions/page.tsx | 2 + frontend/app/experience/layout.tsx | 1 + frontend/app/experience/layouts/error.tsx | 5 + frontend/app/experience/layouts/loading.tsx | 4 + frontend/app/experience/layouts/page.tsx | 2 + frontend/app/experience/loading.tsx | 4 + .../app/experience/locale-profiles/error.tsx | 5 + .../experience/locale-profiles/loading.tsx | 4 + .../app/experience/locale-profiles/page.tsx | 2 + .../app/experience/localizations/error.tsx | 5 + .../app/experience/localizations/loading.tsx | 4 + .../app/experience/localizations/page.tsx | 2 + frontend/app/experience/media-refs/error.tsx | 5 + .../app/experience/media-refs/loading.tsx | 4 + frontend/app/experience/media-refs/page.tsx | 2 + frontend/app/experience/not-found.tsx | 4 + .../experience/page-layout-bindings/error.tsx | 5 + .../page-layout-bindings/loading.tsx | 4 + .../experience/page-layout-bindings/page.tsx | 2 + frontend/app/experience/page.tsx | 2 + .../experience/pages/[id]/builder/error.tsx | 5 + .../experience/pages/[id]/builder/loading.tsx | 4 + .../experience/pages/[id]/builder/page.tsx | 2 + frontend/app/experience/pages/error.tsx | 5 + frontend/app/experience/pages/loading.tsx | 4 + frontend/app/experience/pages/page.tsx | 2 + .../experience/preview/[type]/[id]/error.tsx | 5 + .../preview/[type]/[id]/loading.tsx | 4 + .../experience/preview/[type]/[id]/page.tsx | 2 + .../app/experience/publish-releases/error.tsx | 5 + .../experience/publish-releases/loading.tsx | 4 + .../app/experience/publish-releases/page.tsx | 2 + .../app/experience/publish-targets/error.tsx | 5 + .../experience/publish-targets/loading.tsx | 4 + .../app/experience/publish-targets/page.tsx | 2 + .../experience/published-actions/error.tsx | 5 + .../experience/published-actions/loading.tsx | 4 + .../app/experience/published-actions/page.tsx | 2 + .../app/experience/pwa-manifests/error.tsx | 5 + .../app/experience/pwa-manifests/loading.tsx | 4 + .../app/experience/pwa-manifests/page.tsx | 2 + .../app/experience/render-engines/error.tsx | 5 + .../app/experience/render-engines/loading.tsx | 4 + .../app/experience/render-engines/page.tsx | 2 + .../app/experience/robots-shells/error.tsx | 5 + .../app/experience/robots-shells/loading.tsx | 4 + .../app/experience/robots-shells/page.tsx | 2 + .../app/experience/seo-metadata/error.tsx | 5 + .../app/experience/seo-metadata/loading.tsx | 4 + frontend/app/experience/seo-metadata/page.tsx | 2 + frontend/app/experience/settings/error.tsx | 5 + frontend/app/experience/settings/loading.tsx | 4 + frontend/app/experience/settings/page.tsx | 2 + .../app/experience/site-domains/error.tsx | 5 + .../app/experience/site-domains/loading.tsx | 4 + frontend/app/experience/site-domains/page.tsx | 2 + .../experience/site-theme-bindings/error.tsx | 5 + .../site-theme-bindings/loading.tsx | 4 + .../experience/site-theme-bindings/page.tsx | 2 + .../app/experience/sitemap-shells/error.tsx | 5 + .../app/experience/sitemap-shells/loading.tsx | 4 + .../app/experience/sitemap-shells/page.tsx | 2 + frontend/app/experience/sites/error.tsx | 5 + frontend/app/experience/sites/loading.tsx | 4 + frontend/app/experience/sites/page.tsx | 2 + .../app/experience/survey-responses/error.tsx | 5 + .../experience/survey-responses/loading.tsx | 4 + .../app/experience/survey-responses/page.tsx | 2 + .../experience/surveys/[id]/builder/error.tsx | 5 + .../surveys/[id]/builder/loading.tsx | 4 + .../experience/surveys/[id]/builder/page.tsx | 2 + frontend/app/experience/surveys/error.tsx | 5 + frontend/app/experience/surveys/loading.tsx | 4 + frontend/app/experience/surveys/page.tsx | 2 + .../template-instantiations/error.tsx | 5 + .../template-instantiations/loading.tsx | 4 + .../template-instantiations/page.tsx | 2 + .../experience/template-versions/error.tsx | 5 + .../experience/template-versions/loading.tsx | 4 + .../app/experience/template-versions/page.tsx | 2 + frontend/app/experience/templates/error.tsx | 5 + frontend/app/experience/templates/loading.tsx | 4 + frontend/app/experience/templates/page.tsx | 2 + .../app/experience/theme-versions/error.tsx | 5 + .../app/experience/theme-versions/loading.tsx | 4 + .../app/experience/theme-versions/page.tsx | 2 + frontend/app/experience/themes/error.tsx | 5 + frontend/app/experience/themes/loading.tsx | 4 + frontend/app/experience/themes/page.tsx | 2 + .../experience/widget-definitions/error.tsx | 5 + .../experience/widget-definitions/loading.tsx | 4 + .../experience/widget-definitions/page.tsx | 2 + .../app/experience/widget-instances/error.tsx | 5 + .../experience/widget-instances/loading.tsx | 4 + .../app/experience/widget-instances/page.tsx | 2 + frontend/app/experience/workspaces/error.tsx | 5 + .../app/experience/workspaces/loading.tsx | 4 + frontend/app/experience/workspaces/page.tsx | 2 + frontend/docs/experience-design-system.md | 39 ++ .../docs/experience-frontend-architecture.md | 45 ++ frontend/docs/experience-routing-map.md | 58 +++ frontend/docs/experience-validation-report.md | 55 +++ frontend/modules/experience/README.md | 8 + .../experience/__tests__/a11y-smoke.mjs | 30 ++ .../experience/__tests__/nav-filter.mjs | 37 ++ .../experience/__tests__/perf-smoke.mjs | 35 ++ .../components/ExperienceBreadcrumbs.tsx | 41 ++ .../components/ExperienceListCrudPage.tsx | 384 +++++++++++++++ .../components/ExperiencePhaseGate.tsx | 60 +++ .../components/ExperiencePortalShell.tsx | 175 +++++++ .../components/WorkspaceSwitcher.tsx | 27 ++ .../components/createPortalLayout.tsx | 54 +++ .../experience/constants/permissions.ts | 17 + .../experience/constants/phaseRegistry.ts | 23 + .../modules/experience/constants/portals.ts | 175 +++++++ .../design-system/ExperienceChart.tsx | 57 +++ .../design-system/ExperienceEmptyState.tsx | 18 + .../design-system/ExperienceKanban.tsx | 84 ++++ .../design-system/ExperienceMap.tsx | 59 +++ .../design-system/ExperienceMotion.tsx | 62 +++ .../design-system/ExperienceSkeleton.tsx | 11 + .../design-system/ExperienceStatGrid.tsx | 15 + .../design-system/ExperienceStatusChip.tsx | 10 + .../design-system/ExperienceTablePage.tsx | 150 ++++++ .../design-system/ExperienceThemeProvider.tsx | 80 ++++ .../design-system/ExperienceTimeline.tsx | 54 +++ .../modules/experience/design-system/index.ts | 17 + .../experience/design-system/tokens.ts | 22 + .../features/analyticsDashboard.tsx | 86 ++++ .../features/analyticsReportDefinitions.tsx | 29 ++ .../features/analyticsSnapshots.tsx | 29 ++ .../modules/experience/features/audit.tsx | 52 ++ .../experience/features/capabilities.tsx | 28 ++ .../experience/features/componentVersions.tsx | 29 ++ .../experience/features/components.tsx | 29 ++ .../experience/features/configurations.tsx | 29 ++ .../modules/experience/features/dashboard.tsx | 141 ++++++ .../features/designSystemPlayground.tsx | 215 +++++++++ .../features/domainEdgeBindings.tsx | 29 ++ .../experience/features/embedPreview.tsx | 63 +++ .../experience/features/externalProviders.tsx | 29 ++ .../experience/features/formBuilder.tsx | 89 ++++ .../experience/features/formSubmissions.tsx | 30 ++ .../modules/experience/features/forms.tsx | 25 + .../modules/experience/features/health.tsx | 23 + frontend/modules/experience/features/hub.tsx | 28 ++ .../experience/features/layoutVersions.tsx | 29 ++ .../modules/experience/features/layouts.tsx | 29 ++ .../experience/features/localeProfiles.tsx | 29 ++ .../experience/features/localizations.tsx | 29 ++ .../modules/experience/features/mediaRefs.tsx | 29 ++ .../experience/features/pageBuilder.tsx | 223 +++++++++ .../features/pageLayoutBindings.tsx | 30 ++ .../modules/experience/features/pages.tsx | 31 ++ .../experience/features/publicPreview.tsx | 59 +++ .../experience/features/publishReleases.tsx | 29 ++ .../experience/features/publishTargets.tsx | 83 ++++ .../experience/features/publishedActions.tsx | 99 ++++ .../experience/features/pwaManifests.tsx | 29 ++ .../experience/features/renderEngines.tsx | 29 ++ .../experience/features/robotsShells.tsx | 29 ++ .../experience/features/seoMetadata.tsx | 29 ++ .../modules/experience/features/settings.tsx | 67 +++ .../experience/features/siteDomains.tsx | 29 ++ .../experience/features/siteThemeBindings.tsx | 30 ++ .../experience/features/sitemapShells.tsx | 29 ++ .../modules/experience/features/sites.tsx | 29 ++ .../experience/features/surveyBuilder.tsx | 72 +++ .../experience/features/surveyResponses.tsx | 30 ++ .../modules/experience/features/surveys.tsx | 25 + .../features/templateInstantiations.tsx | 30 ++ .../experience/features/templateVersions.tsx | 29 ++ .../modules/experience/features/templates.tsx | 29 ++ .../experience/features/themeVersions.tsx | 29 ++ .../modules/experience/features/themes.tsx | 29 ++ .../experience/features/widgetDefinitions.tsx | 29 ++ .../experience/features/widgetInstances.tsx | 29 ++ .../experience/features/workspaces.tsx | 29 ++ .../hooks/useExperienceCapabilities.ts | 42 ++ .../hooks/useExperiencePermissions.ts | 36 ++ .../hooks/useExperienceWorkspace.ts | 53 +++ frontend/modules/experience/index.ts | 3 + frontend/modules/experience/pages/shared.tsx | 54 +++ .../experience/services/experience-api.ts | 450 ++++++++++++++++++ frontend/modules/experience/types/index.ts | 38 ++ .../scripts/scaffold-experience-module.mjs | 343 +++++++++++++ .../scripts/validate-experience-routes.mjs | 36 ++ 250 files changed, 6222 insertions(+), 3 deletions(-) create mode 100644 docs/experience-frontend-discovery.md create mode 100644 docs/experience-frontend-progress.md create mode 100644 docs/experience-frontend-roadmap.md create mode 100644 docs/phase-handover/phase-experience-fe-11-5.md create mode 100644 docs/service-snapshots/experience-frontend.yaml create mode 100644 frontend/app/api/experience/[...path]/route.ts create mode 100644 frontend/app/experience/analytics-report-definitions/error.tsx create mode 100644 frontend/app/experience/analytics-report-definitions/loading.tsx create mode 100644 frontend/app/experience/analytics-report-definitions/page.tsx create mode 100644 frontend/app/experience/analytics-snapshots/error.tsx create mode 100644 frontend/app/experience/analytics-snapshots/loading.tsx create mode 100644 frontend/app/experience/analytics-snapshots/page.tsx create mode 100644 frontend/app/experience/analytics/error.tsx create mode 100644 frontend/app/experience/analytics/loading.tsx create mode 100644 frontend/app/experience/analytics/page.tsx create mode 100644 frontend/app/experience/audit/error.tsx create mode 100644 frontend/app/experience/audit/loading.tsx create mode 100644 frontend/app/experience/audit/page.tsx create mode 100644 frontend/app/experience/capabilities/error.tsx create mode 100644 frontend/app/experience/capabilities/loading.tsx create mode 100644 frontend/app/experience/capabilities/page.tsx create mode 100644 frontend/app/experience/component-versions/error.tsx create mode 100644 frontend/app/experience/component-versions/loading.tsx create mode 100644 frontend/app/experience/component-versions/page.tsx create mode 100644 frontend/app/experience/components/error.tsx create mode 100644 frontend/app/experience/components/loading.tsx create mode 100644 frontend/app/experience/components/page.tsx create mode 100644 frontend/app/experience/configurations/error.tsx create mode 100644 frontend/app/experience/configurations/loading.tsx create mode 100644 frontend/app/experience/configurations/page.tsx create mode 100644 frontend/app/experience/design-system/error.tsx create mode 100644 frontend/app/experience/design-system/loading.tsx create mode 100644 frontend/app/experience/design-system/page.tsx create mode 100644 frontend/app/experience/domain-edge-bindings/error.tsx create mode 100644 frontend/app/experience/domain-edge-bindings/loading.tsx create mode 100644 frontend/app/experience/domain-edge-bindings/page.tsx create mode 100644 frontend/app/experience/embed/error.tsx create mode 100644 frontend/app/experience/embed/loading.tsx create mode 100644 frontend/app/experience/embed/page.tsx create mode 100644 frontend/app/experience/error.tsx create mode 100644 frontend/app/experience/external-providers/error.tsx create mode 100644 frontend/app/experience/external-providers/loading.tsx create mode 100644 frontend/app/experience/external-providers/page.tsx create mode 100644 frontend/app/experience/form-submissions/error.tsx create mode 100644 frontend/app/experience/form-submissions/loading.tsx create mode 100644 frontend/app/experience/form-submissions/page.tsx create mode 100644 frontend/app/experience/forms/[id]/builder/error.tsx create mode 100644 frontend/app/experience/forms/[id]/builder/loading.tsx create mode 100644 frontend/app/experience/forms/[id]/builder/page.tsx create mode 100644 frontend/app/experience/forms/error.tsx create mode 100644 frontend/app/experience/forms/loading.tsx create mode 100644 frontend/app/experience/forms/page.tsx create mode 100644 frontend/app/experience/health/error.tsx create mode 100644 frontend/app/experience/health/loading.tsx create mode 100644 frontend/app/experience/health/page.tsx create mode 100644 frontend/app/experience/hub/error.tsx create mode 100644 frontend/app/experience/hub/loading.tsx create mode 100644 frontend/app/experience/hub/page.tsx create mode 100644 frontend/app/experience/layout-versions/error.tsx create mode 100644 frontend/app/experience/layout-versions/loading.tsx create mode 100644 frontend/app/experience/layout-versions/page.tsx create mode 100644 frontend/app/experience/layout.tsx create mode 100644 frontend/app/experience/layouts/error.tsx create mode 100644 frontend/app/experience/layouts/loading.tsx create mode 100644 frontend/app/experience/layouts/page.tsx create mode 100644 frontend/app/experience/loading.tsx create mode 100644 frontend/app/experience/locale-profiles/error.tsx create mode 100644 frontend/app/experience/locale-profiles/loading.tsx create mode 100644 frontend/app/experience/locale-profiles/page.tsx create mode 100644 frontend/app/experience/localizations/error.tsx create mode 100644 frontend/app/experience/localizations/loading.tsx create mode 100644 frontend/app/experience/localizations/page.tsx create mode 100644 frontend/app/experience/media-refs/error.tsx create mode 100644 frontend/app/experience/media-refs/loading.tsx create mode 100644 frontend/app/experience/media-refs/page.tsx create mode 100644 frontend/app/experience/not-found.tsx create mode 100644 frontend/app/experience/page-layout-bindings/error.tsx create mode 100644 frontend/app/experience/page-layout-bindings/loading.tsx create mode 100644 frontend/app/experience/page-layout-bindings/page.tsx create mode 100644 frontend/app/experience/page.tsx create mode 100644 frontend/app/experience/pages/[id]/builder/error.tsx create mode 100644 frontend/app/experience/pages/[id]/builder/loading.tsx create mode 100644 frontend/app/experience/pages/[id]/builder/page.tsx create mode 100644 frontend/app/experience/pages/error.tsx create mode 100644 frontend/app/experience/pages/loading.tsx create mode 100644 frontend/app/experience/pages/page.tsx create mode 100644 frontend/app/experience/preview/[type]/[id]/error.tsx create mode 100644 frontend/app/experience/preview/[type]/[id]/loading.tsx create mode 100644 frontend/app/experience/preview/[type]/[id]/page.tsx create mode 100644 frontend/app/experience/publish-releases/error.tsx create mode 100644 frontend/app/experience/publish-releases/loading.tsx create mode 100644 frontend/app/experience/publish-releases/page.tsx create mode 100644 frontend/app/experience/publish-targets/error.tsx create mode 100644 frontend/app/experience/publish-targets/loading.tsx create mode 100644 frontend/app/experience/publish-targets/page.tsx create mode 100644 frontend/app/experience/published-actions/error.tsx create mode 100644 frontend/app/experience/published-actions/loading.tsx create mode 100644 frontend/app/experience/published-actions/page.tsx create mode 100644 frontend/app/experience/pwa-manifests/error.tsx create mode 100644 frontend/app/experience/pwa-manifests/loading.tsx create mode 100644 frontend/app/experience/pwa-manifests/page.tsx create mode 100644 frontend/app/experience/render-engines/error.tsx create mode 100644 frontend/app/experience/render-engines/loading.tsx create mode 100644 frontend/app/experience/render-engines/page.tsx create mode 100644 frontend/app/experience/robots-shells/error.tsx create mode 100644 frontend/app/experience/robots-shells/loading.tsx create mode 100644 frontend/app/experience/robots-shells/page.tsx create mode 100644 frontend/app/experience/seo-metadata/error.tsx create mode 100644 frontend/app/experience/seo-metadata/loading.tsx create mode 100644 frontend/app/experience/seo-metadata/page.tsx create mode 100644 frontend/app/experience/settings/error.tsx create mode 100644 frontend/app/experience/settings/loading.tsx create mode 100644 frontend/app/experience/settings/page.tsx create mode 100644 frontend/app/experience/site-domains/error.tsx create mode 100644 frontend/app/experience/site-domains/loading.tsx create mode 100644 frontend/app/experience/site-domains/page.tsx create mode 100644 frontend/app/experience/site-theme-bindings/error.tsx create mode 100644 frontend/app/experience/site-theme-bindings/loading.tsx create mode 100644 frontend/app/experience/site-theme-bindings/page.tsx create mode 100644 frontend/app/experience/sitemap-shells/error.tsx create mode 100644 frontend/app/experience/sitemap-shells/loading.tsx create mode 100644 frontend/app/experience/sitemap-shells/page.tsx create mode 100644 frontend/app/experience/sites/error.tsx create mode 100644 frontend/app/experience/sites/loading.tsx create mode 100644 frontend/app/experience/sites/page.tsx create mode 100644 frontend/app/experience/survey-responses/error.tsx create mode 100644 frontend/app/experience/survey-responses/loading.tsx create mode 100644 frontend/app/experience/survey-responses/page.tsx create mode 100644 frontend/app/experience/surveys/[id]/builder/error.tsx create mode 100644 frontend/app/experience/surveys/[id]/builder/loading.tsx create mode 100644 frontend/app/experience/surveys/[id]/builder/page.tsx create mode 100644 frontend/app/experience/surveys/error.tsx create mode 100644 frontend/app/experience/surveys/loading.tsx create mode 100644 frontend/app/experience/surveys/page.tsx create mode 100644 frontend/app/experience/template-instantiations/error.tsx create mode 100644 frontend/app/experience/template-instantiations/loading.tsx create mode 100644 frontend/app/experience/template-instantiations/page.tsx create mode 100644 frontend/app/experience/template-versions/error.tsx create mode 100644 frontend/app/experience/template-versions/loading.tsx create mode 100644 frontend/app/experience/template-versions/page.tsx create mode 100644 frontend/app/experience/templates/error.tsx create mode 100644 frontend/app/experience/templates/loading.tsx create mode 100644 frontend/app/experience/templates/page.tsx create mode 100644 frontend/app/experience/theme-versions/error.tsx create mode 100644 frontend/app/experience/theme-versions/loading.tsx create mode 100644 frontend/app/experience/theme-versions/page.tsx create mode 100644 frontend/app/experience/themes/error.tsx create mode 100644 frontend/app/experience/themes/loading.tsx create mode 100644 frontend/app/experience/themes/page.tsx create mode 100644 frontend/app/experience/widget-definitions/error.tsx create mode 100644 frontend/app/experience/widget-definitions/loading.tsx create mode 100644 frontend/app/experience/widget-definitions/page.tsx create mode 100644 frontend/app/experience/widget-instances/error.tsx create mode 100644 frontend/app/experience/widget-instances/loading.tsx create mode 100644 frontend/app/experience/widget-instances/page.tsx create mode 100644 frontend/app/experience/workspaces/error.tsx create mode 100644 frontend/app/experience/workspaces/loading.tsx create mode 100644 frontend/app/experience/workspaces/page.tsx create mode 100644 frontend/docs/experience-design-system.md create mode 100644 frontend/docs/experience-frontend-architecture.md create mode 100644 frontend/docs/experience-routing-map.md create mode 100644 frontend/docs/experience-validation-report.md create mode 100644 frontend/modules/experience/README.md create mode 100644 frontend/modules/experience/__tests__/a11y-smoke.mjs create mode 100644 frontend/modules/experience/__tests__/nav-filter.mjs create mode 100644 frontend/modules/experience/__tests__/perf-smoke.mjs create mode 100644 frontend/modules/experience/components/ExperienceBreadcrumbs.tsx create mode 100644 frontend/modules/experience/components/ExperienceListCrudPage.tsx create mode 100644 frontend/modules/experience/components/ExperiencePhaseGate.tsx create mode 100644 frontend/modules/experience/components/ExperiencePortalShell.tsx create mode 100644 frontend/modules/experience/components/WorkspaceSwitcher.tsx create mode 100644 frontend/modules/experience/components/createPortalLayout.tsx create mode 100644 frontend/modules/experience/constants/permissions.ts create mode 100644 frontend/modules/experience/constants/phaseRegistry.ts create mode 100644 frontend/modules/experience/constants/portals.ts create mode 100644 frontend/modules/experience/design-system/ExperienceChart.tsx create mode 100644 frontend/modules/experience/design-system/ExperienceEmptyState.tsx create mode 100644 frontend/modules/experience/design-system/ExperienceKanban.tsx create mode 100644 frontend/modules/experience/design-system/ExperienceMap.tsx create mode 100644 frontend/modules/experience/design-system/ExperienceMotion.tsx create mode 100644 frontend/modules/experience/design-system/ExperienceSkeleton.tsx create mode 100644 frontend/modules/experience/design-system/ExperienceStatGrid.tsx create mode 100644 frontend/modules/experience/design-system/ExperienceStatusChip.tsx create mode 100644 frontend/modules/experience/design-system/ExperienceTablePage.tsx create mode 100644 frontend/modules/experience/design-system/ExperienceThemeProvider.tsx create mode 100644 frontend/modules/experience/design-system/ExperienceTimeline.tsx create mode 100644 frontend/modules/experience/design-system/index.ts create mode 100644 frontend/modules/experience/design-system/tokens.ts create mode 100644 frontend/modules/experience/features/analyticsDashboard.tsx create mode 100644 frontend/modules/experience/features/analyticsReportDefinitions.tsx create mode 100644 frontend/modules/experience/features/analyticsSnapshots.tsx create mode 100644 frontend/modules/experience/features/audit.tsx create mode 100644 frontend/modules/experience/features/capabilities.tsx create mode 100644 frontend/modules/experience/features/componentVersions.tsx create mode 100644 frontend/modules/experience/features/components.tsx create mode 100644 frontend/modules/experience/features/configurations.tsx create mode 100644 frontend/modules/experience/features/dashboard.tsx create mode 100644 frontend/modules/experience/features/designSystemPlayground.tsx create mode 100644 frontend/modules/experience/features/domainEdgeBindings.tsx create mode 100644 frontend/modules/experience/features/embedPreview.tsx create mode 100644 frontend/modules/experience/features/externalProviders.tsx create mode 100644 frontend/modules/experience/features/formBuilder.tsx create mode 100644 frontend/modules/experience/features/formSubmissions.tsx create mode 100644 frontend/modules/experience/features/forms.tsx create mode 100644 frontend/modules/experience/features/health.tsx create mode 100644 frontend/modules/experience/features/hub.tsx create mode 100644 frontend/modules/experience/features/layoutVersions.tsx create mode 100644 frontend/modules/experience/features/layouts.tsx create mode 100644 frontend/modules/experience/features/localeProfiles.tsx create mode 100644 frontend/modules/experience/features/localizations.tsx create mode 100644 frontend/modules/experience/features/mediaRefs.tsx create mode 100644 frontend/modules/experience/features/pageBuilder.tsx create mode 100644 frontend/modules/experience/features/pageLayoutBindings.tsx create mode 100644 frontend/modules/experience/features/pages.tsx create mode 100644 frontend/modules/experience/features/publicPreview.tsx create mode 100644 frontend/modules/experience/features/publishReleases.tsx create mode 100644 frontend/modules/experience/features/publishTargets.tsx create mode 100644 frontend/modules/experience/features/publishedActions.tsx create mode 100644 frontend/modules/experience/features/pwaManifests.tsx create mode 100644 frontend/modules/experience/features/renderEngines.tsx create mode 100644 frontend/modules/experience/features/robotsShells.tsx create mode 100644 frontend/modules/experience/features/seoMetadata.tsx create mode 100644 frontend/modules/experience/features/settings.tsx create mode 100644 frontend/modules/experience/features/siteDomains.tsx create mode 100644 frontend/modules/experience/features/siteThemeBindings.tsx create mode 100644 frontend/modules/experience/features/sitemapShells.tsx create mode 100644 frontend/modules/experience/features/sites.tsx create mode 100644 frontend/modules/experience/features/surveyBuilder.tsx create mode 100644 frontend/modules/experience/features/surveyResponses.tsx create mode 100644 frontend/modules/experience/features/surveys.tsx create mode 100644 frontend/modules/experience/features/templateInstantiations.tsx create mode 100644 frontend/modules/experience/features/templateVersions.tsx create mode 100644 frontend/modules/experience/features/templates.tsx create mode 100644 frontend/modules/experience/features/themeVersions.tsx create mode 100644 frontend/modules/experience/features/themes.tsx create mode 100644 frontend/modules/experience/features/widgetDefinitions.tsx create mode 100644 frontend/modules/experience/features/widgetInstances.tsx create mode 100644 frontend/modules/experience/features/workspaces.tsx create mode 100644 frontend/modules/experience/hooks/useExperienceCapabilities.ts create mode 100644 frontend/modules/experience/hooks/useExperiencePermissions.ts create mode 100644 frontend/modules/experience/hooks/useExperienceWorkspace.ts create mode 100644 frontend/modules/experience/index.ts create mode 100644 frontend/modules/experience/pages/shared.tsx create mode 100644 frontend/modules/experience/services/experience-api.ts create mode 100644 frontend/modules/experience/types/index.ts create mode 100644 frontend/scripts/scaffold-experience-module.mjs create mode 100644 frontend/scripts/validate-experience-routes.mjs diff --git a/docs/experience-frontend-discovery.md b/docs/experience-frontend-discovery.md new file mode 100644 index 0000000..4a888ae --- /dev/null +++ b/docs/experience-frontend-discovery.md @@ -0,0 +1,36 @@ +# Experience Frontend — Enterprise Phase Discovery (FE-11.0 → FE-11.5) + +| Field | Value | +| --- | --- | +| Service | `experience` / Torbat Pages | +| Backend | Complete through `experience-11.10` (`0.11.10.0`) | +| Architecture | **COMPLETE** ([ADR-022](architecture/adr/ADR-022.md)) | +| Frontend progress | **COMPLETE through FE-11.5** — stop boundary | +| Scope | FE-11.0 … FE-11.5 only | +| Stop after | FE-11.5 | + +## Inputs used + +- Project Index · Service snapshot · Architecture freeze handover +- ADR-022 · Published Resource / Action / Access / Embed contracts +- Delivery frontend module as reference implementation +- Backend APIs on port **8008** (`/api/v1/*`, `/health`, `/capabilities`, `/metrics`) + +## Gap analysis (resolved) + +| Capability | Backend | Frontend | +| --- | --- | --- | +| Workspaces / sites / pages / templates | ✅ | ✅ FE-11.2 | +| Components / themes / layouts / builder | ✅ | ✅ FE-11.3 | +| Forms / surveys / submissions | ✅ | ✅ FE-11.4 | +| Publishing / SEO / analytics / embed | ✅ | ✅ FE-11.5 | +| Design system module | N/A | ✅ light/dark, brand, RTL/LTR, charts/maps/tables/timeline/kanban, playground | +| Seed data | ✅ `scripts/seed_experience.py` | UI consumes APIs only | + +## Out of scope (hard stop) + +Checkout · Payment UI · Booking UI · QR · Short Links · Card Builder · Ticketing · Learning · Marketplace · Future products · FE-11.6+ registry engines + +## Data rule + +UI consumes Experience APIs only. Seed script populates DB via APIs (no fake frontend-only JSON). diff --git a/docs/experience-frontend-progress.md b/docs/experience-frontend-progress.md new file mode 100644 index 0000000..d951f39 --- /dev/null +++ b/docs/experience-frontend-progress.md @@ -0,0 +1,16 @@ +# Experience Frontend Progress + +| Phase | Status | Notes | +| --- | --- | --- | +| FE-11.0 Framework | **complete** | Shell, nav, permissions, workspace switcher, theme, i18n, design-system playground | +| FE-11.1 Dashboard | **complete** | Stats, activity, recent resources, quick actions, charts | +| FE-11.2 Workspace management | **complete** | Sites, pages, folders (metadata), publish targets, templates | +| FE-11.3 Visual builder | **complete** | DnD reorder, responsive preview, layers, undo/redo, properties, assets | +| FE-11.4 Forms & surveys | **complete** | Dynamic fields, validation, submission viewers | +| FE-11.5 Publishing | **complete** | Public preview, SEO, analytics, embed, published resources/actions, routing | + +**Stop boundary:** FE-11.5 — FE-11.6+ not started. + +**Quality:** see [experience-validation-report.md](../frontend/docs/experience-validation-report.md) +**Handover:** [phase-experience-fe-11-5.md](phase-handover/phase-experience-fe-11-5.md) +**Snapshot:** [experience-frontend.yaml](service-snapshots/experience-frontend.yaml) diff --git a/docs/experience-frontend-roadmap.md b/docs/experience-frontend-roadmap.md new file mode 100644 index 0000000..44880dc --- /dev/null +++ b/docs/experience-frontend-roadmap.md @@ -0,0 +1,28 @@ +# Experience Frontend Roadmap (Torbat Pages) + +Frontend phases **FE-11.0 through FE-11.5** — **STOP here**. FE-11.6+ (registry engines, payment/booking UI, QR, short links, cards, marketplace, checkout, ticketing, learning) **not started**. + +| Phase | Scope | Routes / screens | +| --- | --- | --- | +| **FE-11.0** | Framework | Hub, PortalShell, AuthGuard, workspace switcher, permissions/capabilities hooks, settings, configurations, health, capabilities, audit, locale-profiles, design-system playground | +| **FE-11.1** | Dashboard | Executive dashboard — stat counts, recharts bar, recent resources, audit activity, quick actions | +| **FE-11.2** | Workspace & content | CRUD: workspaces, sites, pages, site-domains, templates, template-versions, template-instantiations; publish-targets (provisional publish_id) | +| **FE-11.3** | Visual builder | Page builder canvas, placements PATCH, layers/properties, undo/redo, breakpoints, media drawer; CRUD components/themes/layouts/bindings/localizations | +| **FE-11.4** | Forms & surveys | CRUD forms/submissions/surveys/responses; form & survey builders; submission viewer — **no appointment booking UI** | +| **FE-11.5** | Publishing & public | publish-releases, SEO/PWA shells, public preview, analytics dashboard + snapshot refresh, embed preview, published-actions catalog | + +## Out of scope (FE-11.6+) + +- Publish Target Registry engine UI +- Payment / checkout UI +- Booking / appointment UI +- QR / short link / card products +- Marketplace / ticketing / learning + +## Module location + +`frontend/modules/experience/` — mirrors Delivery module patterns. + +## Handover + +[phase-experience-fe-11-5.md](phase-handover/phase-experience-fe-11-5.md) diff --git a/docs/experience-roadmap.md b/docs/experience-roadmap.md index 0fab86e..69b2f87 100644 --- a/docs/experience-roadmap.md +++ b/docs/experience-roadmap.md @@ -11,7 +11,7 @@ | Permission Prefix | `experience.*` | | API Port (planned) | 8008 | | Phases | 11.0 – 11.10 | -| Status | Phase 11.10 complete — Experience track 11.0–11.10 closed | +| Status | Phase 11.10 complete · **ARCHITECTURE COMPLETE** ([ADR-022](architecture/adr/ADR-022.md) — Published Resource + Actions + Access + Embed) | ## Vision @@ -51,6 +51,31 @@ In scope (over Phases 11.0–11.10): | FE/BE separation for builders & public shells | [ADR-002](architecture/adr/ADR-002.md) | | Implementation via AI Framework | [ai-framework/](ai-framework/README.md) | +## Published Resource Architecture + +Experience adopts the platform-wide **Published Resource** model ([ADR-022](architecture/adr/ADR-022.md), [published-resource-architecture.md](architecture/published-resource-architecture.md)). + +| Rule | Meaning for Experience | +| --- | --- | +| `publish_id` | Cross-service public identity for every publishable surface | +| Publish Target Registry | Logical registry fields: `publish_id`, `tenant_id`, `resource_type`, `resource_id`, `canonical_url`, `publish_status`, `visibility`, `owner_service` | +| Open `resource_type` | Not a closed enum — Site, Page, Form, Survey, Appointment, Menu surface, Catalog, Campaign, Card, Event, Booking, and unlimited future types | +| Independent Form / Survey / Appointment | **Must not** require Site or Page; optional Site binding allowed; standalone publish required | +| Consumer integrations | Payment, Communication, Short Link, QR, Analytics, CRM, verticals attach via **`publish_id` only** | +| Reserved public URL prefixes | `/s/`, `/p/`, `/f/`, `/survey/`, `/book/`, `/menu/`, `/card/`, `/event/` (routing not implemented) | +| Published Actions | Open Action Registry; Experience binds actions; owning services execute ([published-action-registry.md](reference/published-action-registry.md)) | +| Public Access Model | Open access strategies; auth/payment/membership/OTP not owned by Experience ([public-access-contract.md](reference/public-access-contract.md)) | +| Universal Embed | Open embed types + security/sizing/theme/analytics contracts ([embed-contract.md](reference/embed-contract.md)) | +| Architecture status | **ARCHITECTURE COMPLETE** — implementation deferred to future registered phases (including frontend) | + +**Implementation status:** Architecture / documentation only. Registry storage, access engine, embed SDK, and resolution APIs are **not** part of completed phases 11.0–11.10 and must not be coded until a future phase is registered. + +### Future products (consume Published Resources — never own Experience data) + +Torbat Link · Torbat QR · Torbat Card · Torbat Booking · Torbat Ticket · Torbat Event · Torbat Learning + +Contracts: [published-resource-contracts.md](reference/published-resource-contracts.md). + ## Platform Principles | Principle | Meaning | @@ -155,6 +180,8 @@ Forbidden: cross-DB queries, embedding SMS providers inside Experience, owning R | 11.8 | `experience-11.8` | Bundles, Licensing & Feature Toggles | Complete | | 11.9 | `experience-11.9` | Consumer Integrations & Widgets | Complete | | 11.10 | `experience-11.10` | Analytics, AI Content & Enterprise Validation | Complete | +| Arch | `platform-published-resource-arch` | Published Resource Architecture (docs) | Complete | +| Arch | `platform-experience-arch-freeze` | Actions + Access + Embed freeze (docs) | Complete · **ARCHITECTURE COMPLETE** | Details (dependencies, required docs/services, completion criteria): [phase-manifest.yaml](ai-framework/phase-manifest.yaml). @@ -168,6 +195,8 @@ Health API · Capability API · Metrics · Events · REST APIs · Permission API - Third-party theme/component marketplaces behind provider protocols - Deeper render CDN / edge caching when scoped - Cross-tenant platform-admin experience analytics (explicit + audited) +- Publish Target Registry storage + resolution APIs (future registered phase) +- Public URL edge routing for reserved prefixes ## Out of Scope @@ -180,12 +209,16 @@ Health API · Capability API · Metrics · Events · REST APIs · Permission API - Implementing Phase 11.x business code in the registration phase - Page Builder / public site UI (frontend phases) - Replacing Core white-label tenant branding ownership (Experience consumes it) +- Owning Short Link / QR issuance engines as source of truth (reserved products resolve `publish_id`) +- Implementing Publish Target Registry storage/APIs without a registered phase ## Related Documents - [ADR-016](architecture/adr/ADR-016.md) +- [ADR-022](architecture/adr/ADR-022.md) · [Published Resource Architecture](architecture/published-resource-architecture.md) - [Phases / Experience](phases/Experience/README.md) - [Phase Handover XP-Reg](phase-handover/phase-xp-reg.md) +- [Experience Published Resource handover](phase-handover/phase-experience-published-resource-arch.md) - [Module Registry](module-registry.md#experience) - [Module Boundaries](architecture/module-boundaries.md) - [AI Development Framework](ai-framework/README.md) diff --git a/docs/phase-handover/phase-experience-fe-11-5.md b/docs/phase-handover/phase-experience-fe-11-5.md new file mode 100644 index 0000000..0283f5e --- /dev/null +++ b/docs/phase-handover/phase-experience-fe-11-5.md @@ -0,0 +1,60 @@ +# Phase Handover — Experience Frontend FE-11.5 + +**Product:** Torbat Pages +**Backend:** experience-service v0.11.10.0 (unchanged business phases) +**Frontend stop:** FE-11.5 — **do not implement FE-11.6+ without new phase registration** + +## Delivered + +### FE-11.0 Framework +- Module scaffold `frontend/modules/experience/` +- Hub, PortalShell, AuthGuard, ColorModeProvider toggle, RTL/LTR via design-system theme provider +- Workspace switcher + localStorage persistence +- Permissions/capabilities hooks +- Admin CRUD: locale-profiles, external-providers, render-engines, configurations, settings, audit, health, capabilities +- Design system module + playground `/experience/design-system` + +### FE-11.1 Dashboard +- Executive dashboard with API-driven counts +- Charts (recharts / ExperienceChart), recent resources, audit activity, quick actions + +### FE-11.2 Workspace & content +- CRUD: workspaces, sites, pages, site-domains, templates, template-versions, template-instantiations +- Publish targets with provisional `publish_id = resource.id` + +### FE-11.3 Visual builder +- Page builder: placements, reorder via PATCH, layers/properties, undo/redo, breakpoints, media drawer +- CRUD: components, themes, layouts, bindings, localizations, media-refs +- Builder not gated off when `page_builder` false (ADR-002) + +### FE-11.4 Forms & surveys +- CRUD forms, form-submissions, surveys, survey-responses +- Form/survey JSON builders with field validation +- No appointment booking UI + +### FE-11.5 Publishing & public +- publish-releases, domain-edge-bindings, seo-metadata, sitemap/robots/pwa shells +- Public preview `/experience/preview/[type]/[id]` +- Analytics dashboard + snapshot refresh +- Embed preview with provisional publish_id snippet +- Published actions catalog UI + +## Infrastructure +- BFF `frontend/app/api/experience/[...path]/route.ts` +- Env: `NEXT_PUBLIC_EXPERIENCE_API_URL`, `EXPERIENCE_SERVICE_URL` +- Apps catalog: `experience` at `/experience/hub` +- Seed: `backend/services/experience/scripts/seed_experience.py` + +## Validation +```bash +cd frontend +npm run validate:experience +npm run typecheck +``` + +## Explicitly NOT delivered +- FE-11.6+ registry engines +- Payment, booking, QR, short links, cards, marketplace, checkout, ticketing, learning UI + +## Next when scoped +- `experience-fe-11.6` — Publish Target Registry UI, official publish_id consumption diff --git a/docs/phases/Experience/README.md b/docs/phases/Experience/README.md index bb881cd..0fdae6d 100644 --- a/docs/phases/Experience/README.md +++ b/docs/phases/Experience/README.md @@ -18,8 +18,18 @@ Independent enterprise Experience Platform (`experience-service`, `experience_db | 11.8 | Bundles, Licensing & Feature Toggles | Complete | | 11.9 | Consumer Integrations & Widgets | Complete | | 11.10 | Analytics, AI Content & Enterprise Validation | Complete | +| Arch | Published Resource Architecture ([ADR-022](../../architecture/adr/ADR-022.md)) | Docs complete | +| Freeze | Actions + Access + Embed ([ADR-022](../../architecture/adr/ADR-022.md) amended) | Docs complete · **ARCHITECTURE COMPLETE** | ## Documents +- [Published Resource Architecture](../../architecture/published-resource-architecture.md) +- [ADR-022](../../architecture/adr/ADR-022.md) +- [Published Resource Contracts](../../reference/published-resource-contracts.md) +- [Published Action Registry](../../reference/published-action-registry.md) +- [Public Access Contract](../../reference/public-access-contract.md) +- [Embed Contract](../../reference/embed-contract.md) +- [Handover — Architecture Freeze](../../phase-handover/phase-experience-arch-freeze.md) +- [Handover — Published Resource Arch](../../phase-handover/phase-experience-published-resource-arch.md) - [Phase 11.10](../../experience-phase-11-10.md) - [Handover 11.10](../../phase-handover/phase-11-10.md) - [Enterprise audit 11.10](../../experience-phase-11-10-audit.md) @@ -49,4 +59,4 @@ Independent enterprise Experience Platform (`experience-service`, `experience_db ## Boundary reminder -Experience owns page/site/theme/template/component resources and publishing shells only. Consume Core, Storage, CRM, Hospitality, Marketplace, Sports Center, Communication, Loyalty, AI, Delivery, Automation via API + Events. Prefer `experience` over historical `website_builder` scaffold for new work. +Experience owns page/site/theme/template/component resources, publishing, presentation, rendering/embed metadata, and access-policy metadata only. Forms, Surveys, and Appointments are **standalone-publishable**. Published Actions are open-registry bindings; business execution stays with owning services. Authentication stays Identity/Core; Payment and Loyalty own paid/membership gates. Cross-service public attachments use **`publish_id`** ([ADR-022](../../architecture/adr/ADR-022.md)). **Architecture is COMPLETE** — next work is implementation phases (frontend builders first when scoped). Consume Core, Storage, CRM, Hospitality, Marketplace, Sports Center, Communication, Loyalty, AI, Delivery, Automation, Payment via API + Events. Prefer `experience` over historical `website_builder` scaffold for new work. diff --git a/docs/service-snapshots/experience-frontend.yaml b/docs/service-snapshots/experience-frontend.yaml new file mode 100644 index 0000000..513cd6c --- /dev/null +++ b/docs/service-snapshots/experience-frontend.yaml @@ -0,0 +1,78 @@ +# docs/service-snapshots/experience-frontend.yaml + +schema_version: 1 +snapshot_version: 2 + +service_name: experience +layer: frontend +commercial_product: Torbat Pages +backend_version: "0.11.10.0" +current_phase: experience-fe-11.5 +last_completed_phase: experience-fe-11.5 +next_phase: experience-fe-11.6 +stop_boundary: FE-11.5 + +completed_phases: + - experience-fe-11.0 + - experience-fe-11.1 + - experience-fe-11.2 + - experience-fe-11.3 + - experience-fe-11.4 + - experience-fe-11.5 + +module_path: frontend/modules/experience +bff_path: frontend/app/api/experience/[...path]/route.ts +app_routes_prefix: /experience +route_count: 50 + +env_vars: + - NEXT_PUBLIC_EXPERIENCE_API_URL + - EXPERIENCE_SERVICE_URL + +apps_catalog: + id: experience + href: /experience/hub + status: available + +design_system: + path: frontend/modules/experience/design-system + playground: /experience/design-system + supports: + - light_dark + - tenant_brand_tokens + - rtl_ltr + - responsive + - wcag_smoke + - charts + - maps + - tables + - timeline + - kanban + - empty_states + - skeletons + - animations + +design_tokens: + - --experience-accent + - --experience-accent-soft + - --experience-success + - --experience-warning + - --experience-danger + +documentation: + - docs/experience-frontend-roadmap.md + - docs/experience-frontend-discovery.md + - frontend/docs/experience-frontend-architecture.md + - frontend/docs/experience-routing-map.md + - frontend/docs/experience-design-system.md + - frontend/docs/experience-validation-report.md + - docs/phase-handover/phase-experience-fe-11-5.md + - docs/experience-frontend-progress.md + +open_todos: + - FE-11.6+ Publish Target Registry UI and official publish_id + - Payment / booking / QR / short link / card / marketplace UI (explicitly out of scope) + - Fine-grained experience.* permission catalog from identity service + +last_handover_reference: docs/phase-handover/phase-experience-fe-11-5.md +last_updated: "2026-07-27" diff --git a/docs/service-snapshots/experience.yaml b/docs/service-snapshots/experience.yaml index 8f41ca8..2eecfca 100644 --- a/docs/service-snapshots/experience.yaml +++ b/docs/service-snapshots/experience.yaml @@ -1,8 +1,9 @@ # Experience Platform service snapshot — Phase 11.10 complete +# Architecture: ARCHITECTURE COMPLETE (Published Resource + Actions + Access + Embed) # Spec: docs/ai-framework/service-snapshot-policy.md schema_version: 1 -snapshot_version: 1 +snapshot_version: 3 service_name: experience commercial_product: Torbat Pages @@ -10,6 +11,7 @@ current_version: "0.11.10.0" current_phase: experience-11.10 last_completed_phase: experience-11.10 next_phase: null +architecture_status: complete completed_phases: - experience-reg @@ -24,6 +26,8 @@ completed_phases: - experience-11.8 - experience-11.9 - experience-11.10 + - platform-published-resource-arch + - platform-experience-arch-freeze remaining_phases: [] registered_modules: @@ -66,6 +70,8 @@ enabled_capabilities: - analytics - ai_content_hooks +enabled_bundles: [] + public_apis: - { method: POST, path: /api/v1/analytics-report-definitions, permission: experience.analytics.create } - { method: POST, path: /api/v1/analytics-snapshots/refresh, permission: experience.analytics.manage } @@ -81,3 +87,49 @@ published_events: database: experience_db permission_prefix: experience.* track_status: complete + +active_adrs: + - ADR-001 + - ADR-002 + - ADR-003 + - ADR-004 + - ADR-006 + - ADR-011 + - ADR-012 + - ADR-016 + - ADR-022 + +integration_contracts: + - publish_id_only_for_public_surfaces + - payment_may_attach_via_publish_id + - communication_triggers_via_publish_id + - short_link_and_qr_resolve_publish_id + - analytics_records_publish_id + - form_survey_appointment_standalone_publish + - published_actions_open_registry + - public_access_policies_open_registry + - universal_embed_open_types + - experience_never_owns_authentication + +known_limitations: + - Publish Target Registry / Action Registry / Access / Embed engines are not implemented (architecture only) + - Reserved public URL prefixes are not routed yet + - page_builder capability remains false on backend; Experience FE owns builder UX (ADR-002) + - Capability discovery keys for actions/access/embed are reserved (docs only) + - Short Link / QR / Card / Booking / Ticket / Event / Learning products are reserved consumers only + - FE-11.6+ frontend (official publish_id registry UI) not started + +open_todos: + - experience-fe-11.6+ when explicitly scoped (registry UI, payment/booking/QR/short-link UI out of FE-11.5 scope) + - Register and implement Publish Target Registry + Actions/Access/Embed in future backend phases after Discovery + +last_handover_reference: docs/phase-handover/phase-experience-fe-11-5.md +frontend_snapshot: docs/service-snapshots/experience-frontend.yaml +frontend_completed_phases: + - experience-fe-11.0 + - experience-fe-11.1 + - experience-fe-11.2 + - experience-fe-11.3 + - experience-fe-11.4 + - experience-fe-11.5 +last_updated: "2026-07-27" diff --git a/frontend/app/api/experience/[...path]/route.ts b/frontend/app/api/experience/[...path]/route.ts new file mode 100644 index 0000000..67377fa --- /dev/null +++ b/frontend/app/api/experience/[...path]/route.ts @@ -0,0 +1,53 @@ +import { NextRequest, NextResponse } from "next/server"; + +const UPSTREAM = + process.env.EXPERIENCE_SERVICE_URL || + process.env.NEXT_PUBLIC_EXPERIENCE_API_URL || + "http://localhost:8008"; + +async function proxy(req: NextRequest, pathSegments: string[]) { + const p = pathSegments.join("/"); + const url = new URL(req.url); + const target = `${UPSTREAM.replace(/\/$/, "")}/${p}${url.search}`; + const headers = new Headers(); + for (const h of ["authorization", "content-type", "x-tenant-id", "accept"]) { + const v = req.headers.get(h); + if (v) headers.set(h, v); + } + let body: ArrayBuffer | undefined; + if (req.method !== "GET" && req.method !== "HEAD") body = await req.arrayBuffer(); + try { + const res = await fetch(target, { method: req.method, headers, body, cache: "no-store" }); + const out = new Headers(); + const ct = res.headers.get("content-type"); + if (ct) out.set("content-type", ct); + return new NextResponse(await res.arrayBuffer(), { status: res.status, headers: out }); + } catch (err) { + const detail = err instanceof Error ? err.message : "upstream_unreachable"; + return NextResponse.json( + { error: { code: "experience_proxy_error", message: `پروکسی تربت پیجز — ${detail}` } }, + { status: 502 } + ); + } +} + +export async function GET(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) { + const { path: p } = await ctx.params; + return proxy(req, p); +} +export async function POST(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) { + const { path: p } = await ctx.params; + return proxy(req, p); +} +export async function PATCH(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) { + const { path: p } = await ctx.params; + return proxy(req, p); +} +export async function PUT(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) { + const { path: p } = await ctx.params; + return proxy(req, p); +} +export async function DELETE(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) { + const { path: p } = await ctx.params; + return proxy(req, p); +} diff --git a/frontend/app/experience/analytics-report-definitions/error.tsx b/frontend/app/experience/analytics-report-definitions/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/analytics-report-definitions/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/analytics-report-definitions/loading.tsx b/frontend/app/experience/analytics-report-definitions/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/analytics-report-definitions/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/analytics-report-definitions/page.tsx b/frontend/app/experience/analytics-report-definitions/page.tsx new file mode 100644 index 0000000..2de29b5 --- /dev/null +++ b/frontend/app/experience/analytics-report-definitions/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { AnalyticsReportDefinitionsPage as default } from "@/modules/experience/features/analyticsReportDefinitions"; diff --git a/frontend/app/experience/analytics-snapshots/error.tsx b/frontend/app/experience/analytics-snapshots/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/analytics-snapshots/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/analytics-snapshots/loading.tsx b/frontend/app/experience/analytics-snapshots/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/analytics-snapshots/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/analytics-snapshots/page.tsx b/frontend/app/experience/analytics-snapshots/page.tsx new file mode 100644 index 0000000..7818b96 --- /dev/null +++ b/frontend/app/experience/analytics-snapshots/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { AnalyticsSnapshotsPage as default } from "@/modules/experience/features/analyticsSnapshots"; diff --git a/frontend/app/experience/analytics/error.tsx b/frontend/app/experience/analytics/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/analytics/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/analytics/loading.tsx b/frontend/app/experience/analytics/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/analytics/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/analytics/page.tsx b/frontend/app/experience/analytics/page.tsx new file mode 100644 index 0000000..dfb130e --- /dev/null +++ b/frontend/app/experience/analytics/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { AnalyticsDashboardPage as default } from "@/modules/experience/features/analyticsDashboard"; diff --git a/frontend/app/experience/audit/error.tsx b/frontend/app/experience/audit/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/audit/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/audit/loading.tsx b/frontend/app/experience/audit/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/audit/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/audit/page.tsx b/frontend/app/experience/audit/page.tsx new file mode 100644 index 0000000..aef2201 --- /dev/null +++ b/frontend/app/experience/audit/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { AuditLogsPage as default } from "@/modules/experience/features/audit"; diff --git a/frontend/app/experience/capabilities/error.tsx b/frontend/app/experience/capabilities/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/capabilities/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/capabilities/loading.tsx b/frontend/app/experience/capabilities/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/capabilities/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/capabilities/page.tsx b/frontend/app/experience/capabilities/page.tsx new file mode 100644 index 0000000..49b8f7d --- /dev/null +++ b/frontend/app/experience/capabilities/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { CapabilitiesPage as default } from "@/modules/experience/features/capabilities"; diff --git a/frontend/app/experience/component-versions/error.tsx b/frontend/app/experience/component-versions/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/component-versions/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/component-versions/loading.tsx b/frontend/app/experience/component-versions/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/component-versions/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/component-versions/page.tsx b/frontend/app/experience/component-versions/page.tsx new file mode 100644 index 0000000..906519c --- /dev/null +++ b/frontend/app/experience/component-versions/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { ComponentVersionsPage as default } from "@/modules/experience/features/componentVersions"; diff --git a/frontend/app/experience/components/error.tsx b/frontend/app/experience/components/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/components/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/components/loading.tsx b/frontend/app/experience/components/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/components/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/components/page.tsx b/frontend/app/experience/components/page.tsx new file mode 100644 index 0000000..cc6683e --- /dev/null +++ b/frontend/app/experience/components/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { ComponentsPage as default } from "@/modules/experience/features/components"; diff --git a/frontend/app/experience/configurations/error.tsx b/frontend/app/experience/configurations/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/configurations/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/configurations/loading.tsx b/frontend/app/experience/configurations/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/configurations/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/configurations/page.tsx b/frontend/app/experience/configurations/page.tsx new file mode 100644 index 0000000..8dc724b --- /dev/null +++ b/frontend/app/experience/configurations/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { ConfigurationsPage as default } from "@/modules/experience/features/configurations"; diff --git a/frontend/app/experience/design-system/error.tsx b/frontend/app/experience/design-system/error.tsx new file mode 100644 index 0000000..f7c3323 --- /dev/null +++ b/frontend/app/experience/design-system/error.tsx @@ -0,0 +1,4 @@ +"use client"; +export default function Error({ error }: { error: Error }) { + return

{error.message}

; +} diff --git a/frontend/app/experience/design-system/loading.tsx b/frontend/app/experience/design-system/loading.tsx new file mode 100644 index 0000000..aea9548 --- /dev/null +++ b/frontend/app/experience/design-system/loading.tsx @@ -0,0 +1,4 @@ +"use client"; +export default function Loading() { + return null; +} diff --git a/frontend/app/experience/design-system/page.tsx b/frontend/app/experience/design-system/page.tsx new file mode 100644 index 0000000..f29176c --- /dev/null +++ b/frontend/app/experience/design-system/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { DesignSystemPlaygroundPage as default } from "@/modules/experience/features/designSystemPlayground"; diff --git a/frontend/app/experience/domain-edge-bindings/error.tsx b/frontend/app/experience/domain-edge-bindings/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/domain-edge-bindings/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/domain-edge-bindings/loading.tsx b/frontend/app/experience/domain-edge-bindings/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/domain-edge-bindings/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/domain-edge-bindings/page.tsx b/frontend/app/experience/domain-edge-bindings/page.tsx new file mode 100644 index 0000000..93e9ab6 --- /dev/null +++ b/frontend/app/experience/domain-edge-bindings/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { DomainEdgeBindingsPage as default } from "@/modules/experience/features/domainEdgeBindings"; diff --git a/frontend/app/experience/embed/error.tsx b/frontend/app/experience/embed/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/embed/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/embed/loading.tsx b/frontend/app/experience/embed/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/embed/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/embed/page.tsx b/frontend/app/experience/embed/page.tsx new file mode 100644 index 0000000..8b316ba --- /dev/null +++ b/frontend/app/experience/embed/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { EmbedPreviewPage as default } from "@/modules/experience/features/embedPreview"; diff --git a/frontend/app/experience/error.tsx b/frontend/app/experience/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/external-providers/error.tsx b/frontend/app/experience/external-providers/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/external-providers/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/external-providers/loading.tsx b/frontend/app/experience/external-providers/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/external-providers/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/external-providers/page.tsx b/frontend/app/experience/external-providers/page.tsx new file mode 100644 index 0000000..4e28f3c --- /dev/null +++ b/frontend/app/experience/external-providers/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { ExternalProvidersPage as default } from "@/modules/experience/features/externalProviders"; diff --git a/frontend/app/experience/form-submissions/error.tsx b/frontend/app/experience/form-submissions/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/form-submissions/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/form-submissions/loading.tsx b/frontend/app/experience/form-submissions/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/form-submissions/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/form-submissions/page.tsx b/frontend/app/experience/form-submissions/page.tsx new file mode 100644 index 0000000..a0984ff --- /dev/null +++ b/frontend/app/experience/form-submissions/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { FormSubmissionsPage as default } from "@/modules/experience/features/formSubmissions"; diff --git a/frontend/app/experience/forms/[id]/builder/error.tsx b/frontend/app/experience/forms/[id]/builder/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/forms/[id]/builder/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/forms/[id]/builder/loading.tsx b/frontend/app/experience/forms/[id]/builder/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/forms/[id]/builder/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/forms/[id]/builder/page.tsx b/frontend/app/experience/forms/[id]/builder/page.tsx new file mode 100644 index 0000000..5dae7e4 --- /dev/null +++ b/frontend/app/experience/forms/[id]/builder/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { FormBuilderPage as default } from "@/modules/experience/features/formBuilder"; diff --git a/frontend/app/experience/forms/error.tsx b/frontend/app/experience/forms/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/forms/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/forms/loading.tsx b/frontend/app/experience/forms/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/forms/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/forms/page.tsx b/frontend/app/experience/forms/page.tsx new file mode 100644 index 0000000..d98df2f --- /dev/null +++ b/frontend/app/experience/forms/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { FormsPage as default } from "@/modules/experience/features/forms"; diff --git a/frontend/app/experience/health/error.tsx b/frontend/app/experience/health/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/health/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/health/loading.tsx b/frontend/app/experience/health/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/health/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/health/page.tsx b/frontend/app/experience/health/page.tsx new file mode 100644 index 0000000..ad0a907 --- /dev/null +++ b/frontend/app/experience/health/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { HealthPage as default } from "@/modules/experience/features/health"; diff --git a/frontend/app/experience/hub/error.tsx b/frontend/app/experience/hub/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/hub/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/hub/loading.tsx b/frontend/app/experience/hub/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/hub/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/hub/page.tsx b/frontend/app/experience/hub/page.tsx new file mode 100644 index 0000000..df2ba18 --- /dev/null +++ b/frontend/app/experience/hub/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { ExperienceHub as default } from "@/modules/experience/features/hub"; diff --git a/frontend/app/experience/layout-versions/error.tsx b/frontend/app/experience/layout-versions/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/layout-versions/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/layout-versions/loading.tsx b/frontend/app/experience/layout-versions/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/layout-versions/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/layout-versions/page.tsx b/frontend/app/experience/layout-versions/page.tsx new file mode 100644 index 0000000..08c02f2 --- /dev/null +++ b/frontend/app/experience/layout-versions/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { LayoutVersionsPage as default } from "@/modules/experience/features/layoutVersions"; diff --git a/frontend/app/experience/layout.tsx b/frontend/app/experience/layout.tsx new file mode 100644 index 0000000..73468ae --- /dev/null +++ b/frontend/app/experience/layout.tsx @@ -0,0 +1 @@ +export { ExperienceRootLayout as default } from "@/modules/experience/components/createPortalLayout"; diff --git a/frontend/app/experience/layouts/error.tsx b/frontend/app/experience/layouts/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/layouts/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/layouts/loading.tsx b/frontend/app/experience/layouts/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/layouts/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/layouts/page.tsx b/frontend/app/experience/layouts/page.tsx new file mode 100644 index 0000000..28690a9 --- /dev/null +++ b/frontend/app/experience/layouts/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { LayoutsPage as default } from "@/modules/experience/features/layouts"; diff --git a/frontend/app/experience/loading.tsx b/frontend/app/experience/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/locale-profiles/error.tsx b/frontend/app/experience/locale-profiles/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/locale-profiles/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/locale-profiles/loading.tsx b/frontend/app/experience/locale-profiles/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/locale-profiles/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/locale-profiles/page.tsx b/frontend/app/experience/locale-profiles/page.tsx new file mode 100644 index 0000000..8e78690 --- /dev/null +++ b/frontend/app/experience/locale-profiles/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { LocaleProfilesPage as default } from "@/modules/experience/features/localeProfiles"; diff --git a/frontend/app/experience/localizations/error.tsx b/frontend/app/experience/localizations/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/localizations/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/localizations/loading.tsx b/frontend/app/experience/localizations/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/localizations/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/localizations/page.tsx b/frontend/app/experience/localizations/page.tsx new file mode 100644 index 0000000..d944bb7 --- /dev/null +++ b/frontend/app/experience/localizations/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { LocalizationsPage as default } from "@/modules/experience/features/localizations"; diff --git a/frontend/app/experience/media-refs/error.tsx b/frontend/app/experience/media-refs/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/media-refs/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/media-refs/loading.tsx b/frontend/app/experience/media-refs/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/media-refs/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/media-refs/page.tsx b/frontend/app/experience/media-refs/page.tsx new file mode 100644 index 0000000..7b90dd4 --- /dev/null +++ b/frontend/app/experience/media-refs/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { MediaRefsPage as default } from "@/modules/experience/features/mediaRefs"; diff --git a/frontend/app/experience/not-found.tsx b/frontend/app/experience/not-found.tsx new file mode 100644 index 0000000..3389174 --- /dev/null +++ b/frontend/app/experience/not-found.tsx @@ -0,0 +1,4 @@ +import { EmptyState } from "@/components/ds"; +export default function NotFound() { + return ; +} diff --git a/frontend/app/experience/page-layout-bindings/error.tsx b/frontend/app/experience/page-layout-bindings/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/page-layout-bindings/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/page-layout-bindings/loading.tsx b/frontend/app/experience/page-layout-bindings/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/page-layout-bindings/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/page-layout-bindings/page.tsx b/frontend/app/experience/page-layout-bindings/page.tsx new file mode 100644 index 0000000..c5af53b --- /dev/null +++ b/frontend/app/experience/page-layout-bindings/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { PageLayoutBindingsPage as default } from "@/modules/experience/features/pageLayoutBindings"; diff --git a/frontend/app/experience/page.tsx b/frontend/app/experience/page.tsx new file mode 100644 index 0000000..21baa47 --- /dev/null +++ b/frontend/app/experience/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { ExecutiveDashboard as default } from "@/modules/experience/features/dashboard"; diff --git a/frontend/app/experience/pages/[id]/builder/error.tsx b/frontend/app/experience/pages/[id]/builder/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/pages/[id]/builder/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/pages/[id]/builder/loading.tsx b/frontend/app/experience/pages/[id]/builder/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/pages/[id]/builder/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/pages/[id]/builder/page.tsx b/frontend/app/experience/pages/[id]/builder/page.tsx new file mode 100644 index 0000000..fb6902a --- /dev/null +++ b/frontend/app/experience/pages/[id]/builder/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { PageBuilderPage as default } from "@/modules/experience/features/pageBuilder"; diff --git a/frontend/app/experience/pages/error.tsx b/frontend/app/experience/pages/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/pages/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/pages/loading.tsx b/frontend/app/experience/pages/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/pages/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/pages/page.tsx b/frontend/app/experience/pages/page.tsx new file mode 100644 index 0000000..36c4e49 --- /dev/null +++ b/frontend/app/experience/pages/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { PagesPage as default } from "@/modules/experience/features/pages"; diff --git a/frontend/app/experience/preview/[type]/[id]/error.tsx b/frontend/app/experience/preview/[type]/[id]/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/preview/[type]/[id]/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/preview/[type]/[id]/loading.tsx b/frontend/app/experience/preview/[type]/[id]/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/preview/[type]/[id]/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/preview/[type]/[id]/page.tsx b/frontend/app/experience/preview/[type]/[id]/page.tsx new file mode 100644 index 0000000..2b47a81 --- /dev/null +++ b/frontend/app/experience/preview/[type]/[id]/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { PublicPreviewPage as default } from "@/modules/experience/features/publicPreview"; diff --git a/frontend/app/experience/publish-releases/error.tsx b/frontend/app/experience/publish-releases/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/publish-releases/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/publish-releases/loading.tsx b/frontend/app/experience/publish-releases/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/publish-releases/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/publish-releases/page.tsx b/frontend/app/experience/publish-releases/page.tsx new file mode 100644 index 0000000..01f521b --- /dev/null +++ b/frontend/app/experience/publish-releases/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { PublishReleasesPage as default } from "@/modules/experience/features/publishReleases"; diff --git a/frontend/app/experience/publish-targets/error.tsx b/frontend/app/experience/publish-targets/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/publish-targets/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/publish-targets/loading.tsx b/frontend/app/experience/publish-targets/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/publish-targets/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/publish-targets/page.tsx b/frontend/app/experience/publish-targets/page.tsx new file mode 100644 index 0000000..bd5c153 --- /dev/null +++ b/frontend/app/experience/publish-targets/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { PublishTargetsPage as default } from "@/modules/experience/features/publishTargets"; diff --git a/frontend/app/experience/published-actions/error.tsx b/frontend/app/experience/published-actions/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/published-actions/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/published-actions/loading.tsx b/frontend/app/experience/published-actions/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/published-actions/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/published-actions/page.tsx b/frontend/app/experience/published-actions/page.tsx new file mode 100644 index 0000000..7b027e3 --- /dev/null +++ b/frontend/app/experience/published-actions/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { PublishedActionsPage as default } from "@/modules/experience/features/publishedActions"; diff --git a/frontend/app/experience/pwa-manifests/error.tsx b/frontend/app/experience/pwa-manifests/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/pwa-manifests/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/pwa-manifests/loading.tsx b/frontend/app/experience/pwa-manifests/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/pwa-manifests/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/pwa-manifests/page.tsx b/frontend/app/experience/pwa-manifests/page.tsx new file mode 100644 index 0000000..53d55ae --- /dev/null +++ b/frontend/app/experience/pwa-manifests/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { PwaManifestsPage as default } from "@/modules/experience/features/pwaManifests"; diff --git a/frontend/app/experience/render-engines/error.tsx b/frontend/app/experience/render-engines/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/render-engines/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/render-engines/loading.tsx b/frontend/app/experience/render-engines/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/render-engines/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/render-engines/page.tsx b/frontend/app/experience/render-engines/page.tsx new file mode 100644 index 0000000..12c4ce8 --- /dev/null +++ b/frontend/app/experience/render-engines/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { RenderEnginesPage as default } from "@/modules/experience/features/renderEngines"; diff --git a/frontend/app/experience/robots-shells/error.tsx b/frontend/app/experience/robots-shells/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/robots-shells/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/robots-shells/loading.tsx b/frontend/app/experience/robots-shells/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/robots-shells/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/robots-shells/page.tsx b/frontend/app/experience/robots-shells/page.tsx new file mode 100644 index 0000000..695ac36 --- /dev/null +++ b/frontend/app/experience/robots-shells/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { RobotsShellsPage as default } from "@/modules/experience/features/robotsShells"; diff --git a/frontend/app/experience/seo-metadata/error.tsx b/frontend/app/experience/seo-metadata/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/seo-metadata/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/seo-metadata/loading.tsx b/frontend/app/experience/seo-metadata/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/seo-metadata/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/seo-metadata/page.tsx b/frontend/app/experience/seo-metadata/page.tsx new file mode 100644 index 0000000..ca0fbbe --- /dev/null +++ b/frontend/app/experience/seo-metadata/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { SeoMetadataPage as default } from "@/modules/experience/features/seoMetadata"; diff --git a/frontend/app/experience/settings/error.tsx b/frontend/app/experience/settings/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/settings/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/settings/loading.tsx b/frontend/app/experience/settings/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/settings/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/settings/page.tsx b/frontend/app/experience/settings/page.tsx new file mode 100644 index 0000000..8b75def --- /dev/null +++ b/frontend/app/experience/settings/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { SettingsPage as default } from "@/modules/experience/features/settings"; diff --git a/frontend/app/experience/site-domains/error.tsx b/frontend/app/experience/site-domains/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/site-domains/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/site-domains/loading.tsx b/frontend/app/experience/site-domains/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/site-domains/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/site-domains/page.tsx b/frontend/app/experience/site-domains/page.tsx new file mode 100644 index 0000000..b834072 --- /dev/null +++ b/frontend/app/experience/site-domains/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { SiteDomainsPage as default } from "@/modules/experience/features/siteDomains"; diff --git a/frontend/app/experience/site-theme-bindings/error.tsx b/frontend/app/experience/site-theme-bindings/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/site-theme-bindings/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/site-theme-bindings/loading.tsx b/frontend/app/experience/site-theme-bindings/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/site-theme-bindings/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/site-theme-bindings/page.tsx b/frontend/app/experience/site-theme-bindings/page.tsx new file mode 100644 index 0000000..2e50d8d --- /dev/null +++ b/frontend/app/experience/site-theme-bindings/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { SiteThemeBindingsPage as default } from "@/modules/experience/features/siteThemeBindings"; diff --git a/frontend/app/experience/sitemap-shells/error.tsx b/frontend/app/experience/sitemap-shells/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/sitemap-shells/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/sitemap-shells/loading.tsx b/frontend/app/experience/sitemap-shells/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/sitemap-shells/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/sitemap-shells/page.tsx b/frontend/app/experience/sitemap-shells/page.tsx new file mode 100644 index 0000000..7357d41 --- /dev/null +++ b/frontend/app/experience/sitemap-shells/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { SitemapShellsPage as default } from "@/modules/experience/features/sitemapShells"; diff --git a/frontend/app/experience/sites/error.tsx b/frontend/app/experience/sites/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/sites/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/sites/loading.tsx b/frontend/app/experience/sites/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/sites/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/sites/page.tsx b/frontend/app/experience/sites/page.tsx new file mode 100644 index 0000000..a4f79c6 --- /dev/null +++ b/frontend/app/experience/sites/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { SitesPage as default } from "@/modules/experience/features/sites"; diff --git a/frontend/app/experience/survey-responses/error.tsx b/frontend/app/experience/survey-responses/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/survey-responses/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/survey-responses/loading.tsx b/frontend/app/experience/survey-responses/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/survey-responses/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/survey-responses/page.tsx b/frontend/app/experience/survey-responses/page.tsx new file mode 100644 index 0000000..1a06fa6 --- /dev/null +++ b/frontend/app/experience/survey-responses/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { SurveyResponsesPage as default } from "@/modules/experience/features/surveyResponses"; diff --git a/frontend/app/experience/surveys/[id]/builder/error.tsx b/frontend/app/experience/surveys/[id]/builder/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/surveys/[id]/builder/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/surveys/[id]/builder/loading.tsx b/frontend/app/experience/surveys/[id]/builder/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/surveys/[id]/builder/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/surveys/[id]/builder/page.tsx b/frontend/app/experience/surveys/[id]/builder/page.tsx new file mode 100644 index 0000000..fbab6d5 --- /dev/null +++ b/frontend/app/experience/surveys/[id]/builder/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { SurveyBuilderPage as default } from "@/modules/experience/features/surveyBuilder"; diff --git a/frontend/app/experience/surveys/error.tsx b/frontend/app/experience/surveys/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/surveys/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/surveys/loading.tsx b/frontend/app/experience/surveys/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/surveys/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/surveys/page.tsx b/frontend/app/experience/surveys/page.tsx new file mode 100644 index 0000000..8c6b43c --- /dev/null +++ b/frontend/app/experience/surveys/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { SurveysPage as default } from "@/modules/experience/features/surveys"; diff --git a/frontend/app/experience/template-instantiations/error.tsx b/frontend/app/experience/template-instantiations/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/template-instantiations/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/template-instantiations/loading.tsx b/frontend/app/experience/template-instantiations/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/template-instantiations/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/template-instantiations/page.tsx b/frontend/app/experience/template-instantiations/page.tsx new file mode 100644 index 0000000..a8c4c47 --- /dev/null +++ b/frontend/app/experience/template-instantiations/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { TemplateInstantiationsPage as default } from "@/modules/experience/features/templateInstantiations"; diff --git a/frontend/app/experience/template-versions/error.tsx b/frontend/app/experience/template-versions/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/template-versions/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/template-versions/loading.tsx b/frontend/app/experience/template-versions/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/template-versions/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/template-versions/page.tsx b/frontend/app/experience/template-versions/page.tsx new file mode 100644 index 0000000..0b1bc92 --- /dev/null +++ b/frontend/app/experience/template-versions/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { TemplateVersionsPage as default } from "@/modules/experience/features/templateVersions"; diff --git a/frontend/app/experience/templates/error.tsx b/frontend/app/experience/templates/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/templates/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/templates/loading.tsx b/frontend/app/experience/templates/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/templates/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/templates/page.tsx b/frontend/app/experience/templates/page.tsx new file mode 100644 index 0000000..3daaa68 --- /dev/null +++ b/frontend/app/experience/templates/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { TemplatesPage as default } from "@/modules/experience/features/templates"; diff --git a/frontend/app/experience/theme-versions/error.tsx b/frontend/app/experience/theme-versions/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/theme-versions/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/theme-versions/loading.tsx b/frontend/app/experience/theme-versions/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/theme-versions/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/theme-versions/page.tsx b/frontend/app/experience/theme-versions/page.tsx new file mode 100644 index 0000000..5fbd1db --- /dev/null +++ b/frontend/app/experience/theme-versions/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { ThemeVersionsPage as default } from "@/modules/experience/features/themeVersions"; diff --git a/frontend/app/experience/themes/error.tsx b/frontend/app/experience/themes/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/themes/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/themes/loading.tsx b/frontend/app/experience/themes/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/themes/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/themes/page.tsx b/frontend/app/experience/themes/page.tsx new file mode 100644 index 0000000..fae85bc --- /dev/null +++ b/frontend/app/experience/themes/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { ThemesPage as default } from "@/modules/experience/features/themes"; diff --git a/frontend/app/experience/widget-definitions/error.tsx b/frontend/app/experience/widget-definitions/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/widget-definitions/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/widget-definitions/loading.tsx b/frontend/app/experience/widget-definitions/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/widget-definitions/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/widget-definitions/page.tsx b/frontend/app/experience/widget-definitions/page.tsx new file mode 100644 index 0000000..aba2dd0 --- /dev/null +++ b/frontend/app/experience/widget-definitions/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { WidgetDefinitionsPage as default } from "@/modules/experience/features/widgetDefinitions"; diff --git a/frontend/app/experience/widget-instances/error.tsx b/frontend/app/experience/widget-instances/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/widget-instances/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/widget-instances/loading.tsx b/frontend/app/experience/widget-instances/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/widget-instances/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/widget-instances/page.tsx b/frontend/app/experience/widget-instances/page.tsx new file mode 100644 index 0000000..6cbb27f --- /dev/null +++ b/frontend/app/experience/widget-instances/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { WidgetInstancesPage as default } from "@/modules/experience/features/widgetInstances"; diff --git a/frontend/app/experience/workspaces/error.tsx b/frontend/app/experience/workspaces/error.tsx new file mode 100644 index 0000000..8f69ee5 --- /dev/null +++ b/frontend/app/experience/workspaces/error.tsx @@ -0,0 +1,5 @@ +"use client"; +import { ErrorState } from "@/components/ds"; +export default function Error({ error, reset }: { error: Error; reset: () => void }) { + return ; +} diff --git a/frontend/app/experience/workspaces/loading.tsx b/frontend/app/experience/workspaces/loading.tsx new file mode 100644 index 0000000..8cb80a3 --- /dev/null +++ b/frontend/app/experience/workspaces/loading.tsx @@ -0,0 +1,4 @@ +import { LoadingState } from "@/components/ds"; +export default function Loading() { + return ; +} diff --git a/frontend/app/experience/workspaces/page.tsx b/frontend/app/experience/workspaces/page.tsx new file mode 100644 index 0000000..57a595d --- /dev/null +++ b/frontend/app/experience/workspaces/page.tsx @@ -0,0 +1,2 @@ +"use client"; +export { WorkspacesPage as default } from "@/modules/experience/features/workspaces"; diff --git a/frontend/docs/experience-design-system.md b/frontend/docs/experience-design-system.md new file mode 100644 index 0000000..1669545 --- /dev/null +++ b/frontend/docs/experience-design-system.md @@ -0,0 +1,39 @@ +# Experience Design System + +Independent module: `frontend/modules/experience/design-system/`. + +## Tokens (`globals.css` + `tokens.ts`) + +| Token | Light | Dark | +| --- | --- | --- | +| `--experience-accent` | `#0891b2` | `#22d3ee` | +| `--experience-accent-soft` | rgba cyan 12% | rgba cyan 16% | +| `--experience-success` | `#059669` | `#34d399` | +| `--experience-warning` | `#d97706` | `#fbbf24` | +| `--experience-danger` | `#dc2626` | `#f87171` | + +Use `var(--experience-accent)` — never hardcode hex in feature screens. + +## Capabilities + +| Capability | Component / mechanism | +| --- | --- | +| Light / Dark | Platform `ColorModeProvider` in PortalShell | +| Tenant / brand themes | `ExperienceThemeProvider` overrides accent tokens on subtree | +| Brand tokens | `experienceTokens` + CSS variables | +| RTL / LTR | `ExperienceThemeProvider` `direction` + `data-experience-dir` | +| Responsive | Tailwind breakpoints across shell, tables, kanban | +| WCAG | Chart `role=img`, Map `role=region`, Timeline `