Ir al contenido

ResponsiveDrawer

Un diseño de barra lateral responsiva usando el drawer de DaisyUI. Úsalo para barras laterales de navegación que se alternan en móvil pero pueden estar siempre visibles en pantallas más grandes.

import { ResponsiveDrawer } from 'asterui'

ResponsiveDrawer básico

Barra lateral responsiva que se alterna en móvil.

Main content area

import { ResponsiveDrawer, Button, Menu } from 'asterui'
import { useState } from 'react'

function App() {
  const [open, setOpen] = useState(false)
  
  return (
      <ResponsiveDrawer
        open={open}
        onOpenChange={setOpen}
        sidebar={
          <Menu>
            <Menu.Item>Dashboard</Menu.Item>
            <Menu.Item>Settings</Menu.Item>
            <Menu.Item>Profile</Menu.Item>
          </Menu>
        }
      >
        <div className="p-4">
          <Button onClick={() => setOpen(true)}>
            Open Sidebar
          </Button>
          <p className="mt-4">Main content area</p>
        </div>
      </ResponsiveDrawer>
    )
}

export default App

Siempre abierto en escritorio

La barra lateral se alterna en móvil pero siempre es visible en pantallas lg y superiores.

Resize the window to see the responsive behavior. On large screens, the sidebar is always visible.

import { ResponsiveDrawer, Button, Menu } from 'asterui'
import { useState } from 'react'

function App() {
  const [open, setOpen] = useState(false)
  
  return (
      <ResponsiveDrawer
        open={open}
        onOpenChange={setOpen}
        responsive="lg"
        sidebar={
          <Menu>
            <Menu.Title>Navigation</Menu.Title>
            <Menu.Item>Dashboard</Menu.Item>
            <Menu.Item>Analytics</Menu.Item>
            <Menu.Item>Settings</Menu.Item>
          </Menu>
        }
      >
        <div className="p-4">
          <Button className="lg:hidden" onClick={() => setOpen(true)}>
            Menu
          </Button>
          <p className="mt-4">
            Resize the window to see the responsive behavior.
            On large screens, the sidebar is always visible.
          </p>
        </div>
      </ResponsiveDrawer>
    )
}

export default App

Ancho personalizado

Barra lateral con ancho personalizado.

import { ResponsiveDrawer, Button, Menu } from 'asterui'
import { useState } from 'react'

function App() {
  const [open, setOpen] = useState(false)
  
  return (
      <ResponsiveDrawer
        open={open}
        onOpenChange={setOpen}
        width={400}
        sidebar={
          <Menu>
            <Menu.Title>Wide Sidebar</Menu.Title>
            <Menu.Item>Item with more space</Menu.Item>
            <Menu.Item>Another item</Menu.Item>
          </Menu>
        }
      >
        <div className="p-4">
          <Button onClick={() => setOpen(true)}>
            Open Wide Sidebar
          </Button>
        </div>
      </ResponsiveDrawer>
    )
}

export default App

Barra lateral derecha

Barra lateral posicionada en el lado derecho.

Main content area

import { ResponsiveDrawer, Button, Menu } from 'asterui'
import { useState } from 'react'

function App() {
  const [open, setOpen] = useState(false)
  
  return (
      <ResponsiveDrawer
        open={open}
        onOpenChange={setOpen}
        end
        sidebar={
          <Menu>
            <Menu.Item>Info Panel</Menu.Item>
            <Menu.Item>Quick Actions</Menu.Item>
            <Menu.Item>Help</Menu.Item>
          </Menu>
        }
      >
        <div className="p-4">
          <Button onClick={() => setOpen(true)}>
            Open Right Sidebar
          </Button>
          <p className="mt-4">Main content area</p>
        </div>
      </ResponsiveDrawer>
    )
}

export default App

Contenido personalizado de barra lateral

Barra lateral con contenido estilizado personalizado.

Application content

import { ResponsiveDrawer, Button, Avatar } from 'asterui'
import { useState } from 'react'

function App() {
  const [open, setOpen] = useState(false)
  
  return (
      <ResponsiveDrawer
        open={open}
        onOpenChange={setOpen}
        sidebarClassName="bg-base-300"
        sidebar={
          <div className="space-y-4">
            <div className="flex items-center gap-3">
              <Avatar>JD</Avatar>
              <div>
                <div className="font-semibold">John Doe</div>
                <div className="text-sm opacity-70">Admin</div>
              </div>
            </div>
            <ul className="menu">
              <li><a>Dashboard</a></li>
              <li><a>Users</a></li>
              <li><a>Reports</a></li>
              <li><a>Settings</a></li>
            </ul>
          </div>
        }
      >
        <div className="p-4">
          <Button onClick={() => setOpen(true)}>
            Toggle Sidebar
          </Button>
          <p className="mt-4">Application content</p>
        </div>
      </ResponsiveDrawer>
    )
}

export default App
PropiedadDescripciónTipoPredeterminado
childrenÁrea de contenido principalReact.ReactNode-
sidebarContenido de barra lateralReact.ReactNode-
openEstado abierto controladobooleanfalse
onOpenChangeCallback cuando cambia el estado abierto(open: boolean) => void-
endPosicionar barra lateral en el lado derechobooleanfalse
widthAncho de la barra lateralnumber | string320
responsiveBreakpoint en el cual la barra lateral se vuelve siempre visible'sm' | 'md' | 'lg' | 'xl' | '2xl'-
sidebarClassNameClases adicionales para contenedor de barra lateralstring-
contentClassNameClases adicionales para área de contenidostring-
overlayClassNameClases adicionales para el overlaystring-
idID único para el drawer (auto-generado si no se proporciona)string-
classNameClases CSS adicionales para envoltorio del drawerstring-
data-testidID de prueba para testingstring-
  • ResponsiveDrawer envuelve el componente drawer de DaisyUI
  • Usa open y onOpenChange para estado controlado
  • Usa la prop responsive para hacer la barra lateral siempre visible sobre un breakpoint
  • Usa width para personalizar el ancho de la barra lateral (predeterminado: 320px)
  • Usa la prop end para posicionar la barra lateral en el lado derecho
  • Para drawers de panel que se deslizan sobre el contenido (como formularios o vistas de detalles), usa el componente Drawer en su lugar
CaracterísticaResponsiveDrawerDrawerLayout.Sider
Caso de usoBarras laterales de navegación responsivasPaneles overlay para formularios, detallesBarras laterales colapsables permanentes
RenderizadoParte del diseño de páginaPortal a document.bodyParte de la estructura Layout
OverlaySí (móvil)Sí (siempre)No
ResponsivoSí (auto-apertura en breakpoint)NoSí (auto-colapso)
PosiciónIzquierda o derechaLos 4 ladosIzquierda o derecha
Header/FooterNo integradoSí (props title, footer)No integrado