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 `