Skip to content

Layouts

De frontend layouts zijn opgebouwd in lagen. Dit document beschrijft ze chronologisch: van het fundament (BaseLayout) naar de entry experience (LoginLayout), de huidige standaard (DashboardLayout) en de legacy variant (ProjectLayout).


  • Bestand: BaseLayout.astro
  • Rol: levert de HTML-structuur, SEO-meta, globale styling en Alpine.js bootstrap.
  • Belangrijkste dependencies: global.css, formatPageTitle() uit lib/utils/strings, VersionCheck.astro.
  • Props: biedt een <body {...props}> element waarin eventuele benodigde atributen kunnen worden doorgegeven.
  • Automatische titel: de formatPageTitle(Astro.url.pathname) genereerd automatisch een titel conform het patroon: "VEMAP | {pageTitle}".
LoginLayout.astro
<BaseLayout>
<div
class="min-h-screen bg-map-blue text-gray-50 w-full flex items-center justify-center flex-col relative"
>
<main class="w-full flex items-center justify-center">
<slot />
</main>
</div>
</BaseLayout>

Alle andere layouts wrappen hun content in BaseLayout om consistente metadata en styling te behouden.


  • Bestand: LoginLayout.astro
  • Gebruikt sinds: introductie van de login/reset/challenge pagina’s.
  • Wrapt: BaseLayout en zet een minimalistische full-height container neer voor auth forms.
  • Prop: pageTitle (default Login) → bepaalt <title> en headertekst.
  • Token hygiene: inline script verwijdert tokenExp uit localStorage zodra de pagina laadt.

De <LoginLayout /> wordt gebruikt op de pagina’s:

  • /login
  • /login/nieuw-wachtwoord
  • /login/wachtwoord-vergeten
  • /login/wachtwoord-reset
login/index.astro
<LoginLayout>
<ForgotPasswordForm />
</LoginLayout>

  • Bestand: DashboardLayout.astro
  • Rol: standaard layout voor alle applicatiepagina’s na login.
  • Wrapt: BaseLayout.
  • Belangrijkste onderdelen:
    • SidebarNav.astro (vast links, 5rem breed vanaf lg)
    • Header.astro (4rem hoog, sticky)
  • Slot: main-content (vereist) – bevat de pagina-inhoud.
index.astro
<DashboardLayout>
<div
class="h-[calc(100vh-10rem)] lg:h-[calc(100vh-7rem)] grid grid-rows-[auto_1fr] gap-4 p-4 pb-0"
x-data="tabs()"
slot="main-content"
>
<div class="min-h-0 overflow-hidden">
{hasRole(user, ROLES.ADMIN) && <AdminDashboard />}
{hasRole(user, ROLES.ORGANISATION) && <OrganisationDashboard />}
{hasRole(user, ROLES.MANAGER) && <ManagerDashboard />}
{hasRole(user, ROLES.STAKEHOLDER) && <StakeholderDashboard />}
</div>
</div>
</DashboardLayout>

  • Bestand: ProjectLayout.astro
  • Status: actief voor dynamische pagina’s waar breadcrumbs uit de slug opgebouwd moeten worden (bijv. /projectbeheer/[project]/[afsluiting]).
  • Wrapt: BaseLayout, maar met oudere versies van sidebar/header/notification componenten.
  • Props: title (default "VEMAP") → <title>VEMAP | {title}</title>.
  • Slots:
    • main-content (vereist) - hoofdinhoud.
    • modal-content (optioneel) - modals die buiten de DOM-flow moeten hangen.
projectbeheer/[project].astro
<ProjectLayout title={project ?? "Project"} data-page="project">
<div slot="main-content" class="overflow-y-auto h-full w-full relative">
<ClosuresPreviewList />
<BreadCrumbs />
<Slideover>
<ClosureCreate />
</Slideover>
</div>
</ProjectLayout>

FaseLayoutDoelStatus
1BaseLayoutSEO, metadata, body wrapperActief
2LoginLayoutAuth-flow containerActief
3DashboardLayoutHoofdapplicatie met navigatieActief
4ProjectLayoutDynamische pagina’s (incl. breadcrumbs)Actief