Pages Overview

71 lazy-loaded page components routed in frontend/src/App.tsx (as of 2026-06), backed by 167 .tsx files under frontend/src/pages/ — the file count includes co-located sections, dialogs, and useFooState hooks per the Component Decomposition pattern. All pages use lazy loading via React.lazy() + Suspense with a shared LoadingFallback.

Page Areas

Auth (11 pages, public)

PagePathPurpose
Login/loginEmail/password + SSO login (all @renewa.de emails route to SSO)
Signup/signupNew user registration
CheckEmail/check-emailEmail verification prompt
VerifyEmail/verify-emailEmail verification handler
ForgotPassword/forgot-passwordPassword reset request
ResetPassword/reset-passwordPassword reset form
PhoneNumberInput/phone-numberPhone number entry for verification
PhoneVerification/phone-verificationPhone code verification
MagicLinkRequest/magic-linkPasswordless login request
MagicLinkVerify/auth/magic-linkMagic link verification
AuthCallback/auth/callbackOAuth redirect handler

Core Business

PageRouteRelated Entity
Buildings/buildingsBuildings
BuildingDetail/buildings/:idBuildings, Building Components
ProjectDetail/buildings/:buildingId/projects/:projectIdProjects, Scenarios
ScenarioDetail.../scenarios/:scenarioIdScenarios, Measures
FundingApplications/funding-applicationsFunding Applications
Quotes/quotes/*Quotes

BuildingDetail is the building dashboard: tabbed via useTabState (overview, timeline, participants, revenue, protocols, plus coming-soon stubs), composed from pages/dashboard/ (58 files: construction/, process/, revenue/, audit/, header/). The protocols tab hosts site protocols (PR#1969) with PDF export (PR#1994).

The index route / redirects via HomeRedirectgetDefaultRoute() (components/sidebar/sidebarService.ts); the legacy pages/Dashboard.tsx landing page is no longer routed.

CRM (6 pages)

PageEntity
ContactsPage / ContactDetailPageContacts
CompaniesPage / CompanyDetailPageCompanies
LeadsPage / LeadDetailPageLeads

Admin (/admin/*, ~25 routed pages)

SettingsOverview (/admin/settings), TeamAdmin (/admin/responsibilities — old /admin/users, /admin/team-admin, /admin/departments redirect here), FundingProgramsList/Detail + Form/VersionForm/MeasureForm/LoanForm, FormBuilder, FormsAdmin, FormFieldsAdmin, FormSubmissionsAdmin, DocumentTemplatesAdmin, EngagementTaskTemplatesAdmin, PdfTemplatesList, TypologyUValuesAdmin + TypologyUValueForm (/admin/u-values), AdminProductsList/AdminProductDetail, HubSpot (/admin/hubspot, consolidated — old monitoring/test routes redirect), Admin Dashboard (/admin/dashboard).

See RBAC Authorization for admin route protection.

Internal (/internal/*, ~20 routed pages)

  • Document obtaining suite: DocumentObtainingDashboard, DocumentObtaining, DocumentObtainingSets, DocumentObtainingDocs, DocumentObtainingCollections, DocumentObtainingDetail (/internal/document-obtaining/*). See Document Obtaining.
  • DocumentReviewDetail: /internal/document-review/:collectionId/:fulfillmentId — fullscreen, mounted outside the main Layout for screen space. See Document Review.
  • WorkflowPage: /internal/workflow — Workflow v4 internal board with kanban orders tab; plus TaskTypesSettings (/internal/workflow/settings/task-types). See Workflows.
  • BillingPage: /internal/billing. See Invoices.
  • Collection settings: EmailTemplatesSettings, RejectionReasonsSettings, FlowDefinitionsSettings (/internal/collection-settings/*).
  • Others: TeamPage, PortalPreview (/internal/portal-preview/:id), HelpRequestsAdmin, Changelog, EntraGroupsList/EntraGroupDetail (/internal/entra-groups).

Portal (4 pages)

PageRouteAuth Method
PortalDashboard/portal, /portal/collections/:idToken-based (URL or localStorage)
PortalAppointmentView/portal/appointments/:proposalIdAppointment token
PortalFormPage/portal/forms/:formKey[/:submissionId]JWT (ProtectedRoute) — Form Builder v3 portal forms
PortalTokenErrorPagerendered on token failurePublic

See Portal for token-based authentication flow.

Profile (6 sections)

Profile page (/profile) with tabbed sections: PersonalInfo, Password, TwoFactor, Responsibility, DeleteAccount, plus a parent Profile shell.

Utility Pages

FilesDemo (/files-demo), FloorPlanDataCapture (/helper/floor-plan-capture), PdfExport (/helper/pdf-export).

Code Splitting

All pages are lazy-loaded in frontend/src/App.tsx (71 lazy() imports as of 2026-06):

const BuildingDetail = lazy(() => import('./pages/BuildingDetail'));

Wrapped in <Suspense fallback={<LoadingFallback />}> at the router level.