Split left + split right fullwidth
Version fullwidth avec double sidebar : navigation à gauche, panneau secondaire à droite.
Viewport, max 1920px
Double sidebar
Code du template
Structure du layout, avec le slot de contenu sous forme de <%- body %>.
Split left + split right fullwidth
Html
<div class="min-h-screen bg-muted/30 lg:h-[100dvh] lg:overflow-hidden" style="--layout-max-width: 1920px;">
<div class="mx-auto grid min-h-screen w-full max-w-[var(--layout-max-width)] grid-cols-1 lg:grid-cols-[17rem_minmax(0,1fr)_17rem] bg-background shadow-sm lg:h-[100dvh] lg:min-h-0 lg:overflow-hidden">
<aside class="hidden h-[100dvh] overflow-x-hidden overflow-y-auto border-border bg-muted/20 lg:border-r lg:block">
<div id="layout-left-side-panel-content" class="flex min-h-full min-w-0 flex-col p-4">
<div class="border-b border-border pb-4">
<a href="/" class="font-semibold">Product</a>
<p class="mt-1 text-sm text-muted-foreground">Workspace navigation</p>
</div>
<nav class="flex-1 py-4">
<%- include('ui/nav', { orientation: 'vertical', items: navItems }) %>
</nav>
<div class="border-t border-border pt-4">
<button class="ui-btn ui-btn-outline ui-btn-color-primary ui-btn-sm w-full">Action</button>
</div>
</div>
</aside>
<section class="flex min-h-screen min-w-0 flex-col lg:h-[100dvh] lg:min-h-0 lg:overflow-hidden">
<div class="border-b border-border bg-background/95 p-3 lg:hidden">
<button id="layout-nav-trigger"
data-ui="drawer-trigger"
data-target="layout-nav-drawer"
class="ui-btn ui-btn-outline ui-btn-color-primary ui-btn-sm"
hidden>
Navigation
</button>
</div>
<main class="min-w-0 flex-1 lg:min-h-0 lg:overflow-y-auto">
<div class="p-4 sm:p-6 lg:p-8">
<%- body %>
</div>
<footer id="template-footer" class="shrink-0 border-t border-border bg-background/95">
<div class="flex min-h-14 items-center justify-between gap-4 px-4 text-sm text-muted-foreground sm:px-6">
<span>Footer</span>
<a href="/settings">Settings</a>
</div>
</footer>
</main>
</section>
<aside class="hidden h-[100dvh] overflow-x-hidden overflow-y-auto border-border bg-muted/20 lg:border-l lg:block">
<div id="layout-right-side-panel-content" class="flex min-h-full min-w-0 flex-col p-4">
<div class="border-b border-border pb-4">
<a href="/" class="font-semibold">Product</a>
<p class="mt-1 text-sm text-muted-foreground">Secondary panel</p>
</div>
<nav class="flex-1 py-4">
<%- include('ui/nav', { orientation: 'vertical', items: navItems }) %>
</nav>
<div class="border-t border-border pt-4">
<button class="ui-btn ui-btn-outline ui-btn-color-primary ui-btn-sm w-full">Action</button>
</div>
</div>
</aside>
</div>
<div id="layout-mobile-side-panel-content" class="flex min-h-full min-w-0 flex-col lg:hidden">
<div class="flex min-h-0 flex-1 flex-col gap-6">
<section class="shrink-0">
<p class="mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground">Navigation gauche</p>
<%- include('ui/nav', { orientation: 'vertical', items: navItems }) %>
</section>
<section class="flex min-h-0 flex-1 flex-col border-t border-border pt-4">
<p class="mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground">Panneau droit</p>
<%- include('ui/nav', { class: 'flex-1', orientation: 'vertical', items: navItems }) %>
<div class="mt-4 space-y-2 border-t border-border pt-4">
<button class="ui-btn ui-btn-outline ui-btn-color-primary ui-btn-sm w-full">Action secondaire</button>
</div>
</section>
</div>
</div>
<%- include('ui/drawer', {
id: 'layout-nav-drawer',
title: 'Navigation',
titleIcon: 'panel-left',
side: 'left',
width: { base: 'calc(100vw - 2rem)', sm: '22rem' },
responsive: {
source: '#layout-mobile-side-panel-content',
breakpoint: 'lg',
controls: '#layout-nav-trigger',
},
}) %>
</div>