PyBlade/ui
Menu⌄
DocsComposantsSidebar

Sidebar

A collapsible app sidebar: offcanvas or icon mode, a sheet on mobile, Ctrl/⌘+B, and its state kept in a cookie read on the server.

Alpine.js23 fichiers

Installation

pyblade-ui add sidebar

Utilisation

Les balises <pb-ui.sidebar-provider> <pb-ui.sidebar> <pb-ui.sidebar-trigger> <pb-ui.sidebar-rail> <pb-ui.sidebar-inset> <pb-ui.sidebar-header> <pb-ui.sidebar-footer> <pb-ui.sidebar-separator> <pb-ui.sidebar-content> <pb-ui.sidebar-input> <pb-ui.sidebar-group> <pb-ui.sidebar-group-label> <pb-ui.sidebar-group-action> <pb-ui.sidebar-group-content> <pb-ui.sidebar-menu> <pb-ui.sidebar-menu-item> <pb-ui.sidebar-menu-button> <pb-ui.sidebar-menu-action> <pb-ui.sidebar-menu-badge> <pb-ui.sidebar-menu-skeleton> <pb-ui.sidebar-menu-sub> <pb-ui.sidebar-menu-sub-item> <pb-ui.sidebar-menu-sub-button> sont disponibles dans tous vos templates.

<pb-ui.sidebar-provider :open="sidebar_open" collapsible="icon">
  <pb-ui.sidebar>
    <pb-ui.sidebar-content>
      <pb-ui.sidebar-group>
        <pb-ui.sidebar-group-label>Application</pb-ui.sidebar-group-label>
        <pb-ui.sidebar-menu>
          <pb-ui.sidebar-menu-item>
            <pb-ui.sidebar-menu-button href="/" active tooltip="Home"><span>Home</span></pb-ui.sidebar-menu-button>
          </pb-ui.sidebar-menu-item>
        </pb-ui.sidebar-menu>
      </pb-ui.sidebar-group>
    </pb-ui.sidebar-content>
    <pb-ui.sidebar-rail />
  </pb-ui.sidebar>
  <pb-ui.sidebar-inset>
    <header class="flex h-14 items-center gap-2 border-b px-4"><pb-ui.sidebar-trigger /></header>
    <main class="p-4">...</main>
  </pb-ui.sidebar-inset>
</pb-ui.sidebar-provider>
{# sidebar_open comes from the cookie: pyblade_ui.sidebar_open(request), or the Django context processor #}

État côté serveur

Quand on replie ou déplie le sidebar, il écrit le cookie sidebar_state=true|false (7 jours). À la requête suivante, le serveur le relit et passe sidebar_open au provider : la page arrive déjà dans le bon état, sans clignotement ni attente du JavaScript.

settings.py
TEMPLATES = [
    {
        "BACKEND": "pyblade.django.PyBladeEngine",
        # ...
        "OPTIONS": {
            "context_processors": [
                # ...
                "pyblade_ui.context_processors.sidebar",  # ajoute sidebar_open
            ],
        },
    },
]

Puis dans le template : <pb-ui.sidebar-provider :open="sidebar_open">. sidebar_open(request, default=True) accepte la requête de Django (request.COOKIES) comme celle de Flask, Starlette, FastAPI, Litestar, Quart ou Sanic (request.cookies).

Couleurs

Le sidebar a ses propres variables : --sidebar, --sidebar-foreground, --sidebar-primary, --sidebar-accent, --sidebar-border, --sidebar-ring. Si votre theme.css date d'avant le sidebar, régénérez-le :

pyblade-ui theme set

Les largeurs se règlent sur le provider : --sidebar-width (16rem), --sidebar-width-mobile (18rem) et --sidebar-width-icon (3rem), par exemple style="--sidebar-width: 20rem".

Clavier et mobile

Ctrl + B (ou ⌘ + B) replie ou déplie le sidebar. Sous 768px, il devient un panneau qui glisse par-dessus la page, avec un fond cliquable et la touche Échap pour le fermer ; l'état mobile n'est pas enregistré dans le cookie.

Exemples

Offcanvas

Floating

Inset

À droite

Props

<pb-ui.sidebar-provider>
PropDéfaut
openTrue
collapsible'offcanvas'
variant'sidebar'
side'left'
<pb-ui.sidebar-input>
PropDéfaut
type'text'
<pb-ui.sidebar-menu-button>
PropDéfaut
hrefNone
activeFalse
size'default'
variant'default'
tooltip''
<pb-ui.sidebar-menu-action>
PropDéfaut
show_on_hoverFalse
<pb-ui.sidebar-menu-skeleton>
PropDéfaut
show_iconFalse
width'70%'
<pb-ui.sidebar-menu-sub-button>
PropDéfaut
hrefNone
activeFalse
size'md'

Tout autre attribut (class, id, x-on:click, hx-post…) est transmis à l'élément racine ; vos classes Tailwind l'emportent sur celles du composant.