Drawer Component
CSS-only Tailwind CSS drawer using native checkbox toggle. Slide-in side panel for navigation or filters without JavaScript. WCAG AA accessible, works with Django, HTMX, Laravel, React, and any stack.
Les composants du tiroir glissent depuis les côtés de la fenêtre pour révéler une navigation cachée, des filtres ou du contenu supplémentaire. Construits sur l'élément de dialogue HTML natif avec des animations CSS, les tiroirs offrent un moyen réactif de gérer les mises en page sur les appareils mobiles et de bureau. Le système de tiroirs Frutjam prend en charge des largeurs personnalisables, des animations fluides et des arrière-plans superposés pour une navigation professionnelle dans la barre latérale.
CSS uniquement, aucun JavaScript requis. WCAG AA accessible et indépendant du framework – fonctionne avec Django, HTMX, Laravel, React et n'importe quelle pile.
| Classe | Taper | Description |
|---|---|---|
| drawer | Base | Panneau coulissant construit sur l'élément de dialogue natif |
| drawer-content | Modificateur | Zone de contenu intérieure du tiroir |
| drawer-backdrop | Modificateur | Superposition derrière le tiroir |
| drawer-start | Modificateur | Se glisse par la gauche |
| drawer-end | Modificateur | Se glisse par la droite |
| drawer-top | Modificateur | Se glisse par le haut |
| drawer-bottom | Modificateur | Se glisse par le bas |
Utilisation de base
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <button type="button" class="btn btn-sm" onclick="defaultDrawer.show()">Open drawer</button> <dialog class="drawer" id="defaultDrawer"> <div class="drawer-content w-full lg:w-56 p-4"> <ul class="menu"> <li class="menu-title"><span>Dashboard</span></li> <li><a class="menu-item">Overview</a></li> <li><a class="menu-item">Analytics</a></li> <li class="menu-title mt-4"><span>Management</span></li> <li><a class="menu-item">Users</a></li> <li><a class="menu-item">Inventory</a></li> <li><a class="menu-item">Settings</a></li> </ul> </div> <button type="button" class="drawer-backdrop" onclick="defaultDrawer.close()">Close Drawer via Backdrop</button> </dialog> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import { useDrawer } from 'frutjam/react' export default function DrawerDemo() { const drawer = useDrawer() return ( <> <button type="button" className="btn btn-sm" onClick={drawer.open}>Open drawer</button> <dialog ref={drawer.ref} className="drawer"> <div className="drawer-content w-full lg:w-56 p-4"> <ul className="menu"> <li className="menu-title"><span>Dashboard</span></li> <li><a className="menu-item">Overview</a></li> <li><a className="menu-item">Analytics</a></li> <li className="menu-title mt-4"><span>Management</span></li> <li><a className="menu-item">Users</a></li> <li><a className="menu-item">Inventory</a></li> <li><a className="menu-item">Settings</a></li> </ul> </div> <button type="button" className="drawer-backdrop" onClick={drawer.close}>Close Drawer via Backdrop</button> </dialog> </> ) } |
Aide JS et React
Utilisez createDrawer depuis frutjam/js ou useDrawer depuis frutjam/react lorsque le déclencheur se trouve à l'extérieur du tiroir ou que vous avez besoin d'un contrôle programmatique depuis n'importe où dans votre code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <button class="btn btn-sm" id="helper-open-btn">Open drawer</button> <dialog class="drawer" id="helper-drawer"> <div class="drawer-content w-full lg:w-56 p-4"> <p class="mb-4 text-sm opacity-70">Controlled via <code>createDrawer</code>.</p> <button class="btn btn-sm" id="helper-close-btn">Close</button> </div> <button type="button" class="drawer-backdrop" id="helper-backdrop">Close</button> </dialog> <script type="module"> import { createDrawer } from 'frutjam/js' const drawer = createDrawer(document.getElementById('helper-drawer')) document.getElementById('helper-open-btn').onclick = () => drawer.open() document.getElementById('helper-close-btn').onclick = () => drawer.close() document.getElementById('helper-backdrop').onclick = () => drawer.close() </script> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import { useDrawer } from 'frutjam/react' export default function DrawerDemo() { const drawer = useDrawer() return ( <> <button className="btn btn-sm" onClick={drawer.open}>Open drawer</button> <dialog ref={drawer.ref} className="drawer"> <div className="drawer-content w-full lg:w-56 p-4"> <p className="mb-4 text-sm opacity-70">Controlled via useDrawer.</p> <button className="btn btn-sm" onClick={drawer.close}>Close</button> </div> <button type="button" className="drawer-backdrop" onClick={drawer.close}>Close</button> </dialog> </> ) } |
Personnalisation des tiroirs
Le .drawer-backdrop fournit un arrière-plan cliquable qui ferme le tiroir lorsque vous cliquez à l'extérieur du tiroir, en supprimant cet élément par défaut pour empêcher le tiroir de se fermer lorsque vous cliquez à l'extérieur.
Fermer sur Toile de Fond Cliquez
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <button type="button" class="btn btn-sm" onclick="closeDrawerOnBackdropClick.show()">Open drawer</button> <dialog class="drawer" id="closeDrawerOnBackdropClick"> <div class="drawer-content w-full lg:w-56 p-4"> <div class="flex justify-between mb-3"> <strong>Drawer</strong> <button type="button" class="btn btn-xs btn-square btn-rounded btn-ghost" onclick="closeDrawerOnBackdropClick.close()"> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M18 6l-12 12" /><path d="M6 6l12 12" /></svg> </button> </div> <ul class="menu"> <li class="menu-title"><span>Dashboard</span></li> <li><a class="menu-item">Overview</a></li> <li><a class="menu-item">Analytics</a></li> <li class="menu-title mt-4"><span>Management</span></li> <li><a class="menu-item">Users</a></li> <li><a class="menu-item">Inventory</a></li> <li><a class="menu-item">Settings</a></li> </ul> </div> <button type="button" class="drawer-backdrop" onclick="closeDrawerOnBackdropClick.close()">Close Drawer via Backdrop</button> </dialog> |
Empêcher la fermeture lors d'un clic à l'extérieur
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <button type="button" class="btn btn-sm" onclick="preventCloseClickOutsideDrawer.show()">Open drawer</button> <dialog class="drawer" id="preventCloseClickOutsideDrawer"> <div class="drawer-content w-full lg:w-56 p-4"> <div class="flex justify-between mb-3"> <strong>Drawer</strong> <button type="button" class="btn btn-xs btn-square btn-rounded btn-ghost" onclick="preventCloseClickOutsideDrawer.close()"> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M18 6l-12 12" /><path d="M6 6l12 12" /></svg> </button> </div> <ul class="menu"> <li class="menu-title"><span>Dashboard</span></li> <li><a class="menu-item">Overview</a></li> <li><a class="menu-item">Analytics</a></li> <li class="menu-title mt-4"><span>Management</span></li> <li><a class="menu-item">Users</a></li> <li><a class="menu-item">Inventory</a></li> <li><a class="menu-item">Settings</a></li> </ul> </div> </dialog> |
Emplacements des tiroirs
Tiroir gauche (Début)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <button type="button" class="btn btn-sm" onclick="leftDrawer.show()">Open drawer</button> <dialog class="drawer drawer-start" id="leftDrawer"> <div class="drawer-content w-full lg:w-56 p-4"> <ul class="menu"> <li> <div class="menu-title">Dashboard</div> <ul> <li><a class="menu-item">Overview</a></li> <li><a class="menu-item">Analytics</a></li> </ul> </li> <li> <div class="menu-title">Management</div> <ul> <li><a class="menu-item">Users</a></li> <li><a class="menu-item">Inventory</a></li> <li><a class="menu-item">Settings</a></li> </ul> </li> </ul> </div> <button type="button" class="drawer-backdrop" onclick="leftDrawer.close()">Close Drawer via Backdrop</button> </dialog> |
Tiroir droit (fin)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <button type="button" class="btn btn-sm" onclick="rightDrawer.show()">Open drawer</button> <dialog class="drawer drawer-end" id="rightDrawer"> <div class="drawer-content w-full lg:w-56 p-4"> <ul class="menu w-full"> <li> <div class="menu-title">Dashboard</div> <ul> <li><a class="menu-item">Overview</a></li> <li><a class="menu-item">Analytics</a></li> </ul> </li> <li> <div class="menu-title">Management</div> <ul> <li><a class="menu-item">Users</a></li> <li><a class="menu-item">Inventory</a></li> <li><a class="menu-item">Settings</a></li> </ul> </li> </ul> </div> <button type="button" class="drawer-backdrop" onclick="rightDrawer.close()">Close Drawer via Backdrop</button> </dialog> |
Tiroir supérieur
1 2 3 4 5 6 7 8 9 10 11 12 | <button type="button" class="btn btn-sm" onclick="topDrawer.show()">Open drawer</button> <dialog class="drawer drawer-top" id="topDrawer"> <div class="drawer-content p-4"> <div class="heading-3xl mb-3">Contact us</div> <form class="grid grid-cols-12 gap-3"> <input type="text" placeholder="Enter your text here" class="input col-span-5"> <input type="text" placeholder="Enter your text here" class="input col-span-5"> <button class="btn col-span-2">Submit</button> </form> </div> <button type="button" class="drawer-backdrop" onclick="topDrawer.close()">Close Drawer via Backdrop</button> </dialog> |
Tiroir inférieur
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <button type="button" class="btn btn-sm" onclick="bottomDrawer.show()">Open drawer</button> <dialog class="drawer drawer-bottom" id="bottomDrawer"> <div class="drawer-content p-4"> <ul class="menu menu-md w-full"> <li> <div class="accordion accordion-flush"> <details name="nav" open> <summary><span class="heading-md">Dashboard</span></summary> <div class="accordion-content"> <ul> <li class="menu-item"><span>Overview</span></li> <li class="menu-item"> <span>Analytics</span> <div class="badge badge-xs badge-accent ml-1 uppercase">Live</div> </li> </ul> </div> </details> <details name="nav"> <summary><span class="heading-md">Settings</span></summary> <div class="accordion-content"> <ul> <li class="menu-item"><span>Profile</span></li> <li class="menu-item"><span>Security</span></li> </ul> </div> </details> </div> </li> </ul> </div> <button type="button" class="drawer-backdrop" onclick="bottomDrawer.close()">Close Drawer viaBackdrop</button> </dialog> |