Lista de Componentes

Alert

Mensajes cortos de distinto tipo.

¡Información! Este es un mensaje informativo.
¡Éxito! Este es un mensaje de éxito.
¡Aviso! Este es un mensaje de aviso.
¡Error! Este es un mensaje de error.

Código de ejemplo

<Alert type="info">
  <span className="font-bold">¡Información! </span>
  <span>Este es un mensaje informativo.</span>
</Alert>

Propiedades

type por defecto info
  • info
  • success
  • warning
  • error

Alert small

Mensajes cortos de distinto tipo en formato pequeño.

¡Información! Este es un mensaje informativo.
¡Éxito! Este es un mensaje de éxito.
¡Aviso! Este es un mensaje de aviso.
¡Error! Este es un mensaje de error.

Código de ejemplo

<Alert small type="info">
  <span className="font-bold">¡Información! </span>
  <span>Este es un mensaje informativo.</span>
</Alert>

Propiedades

type por defecto info
  • info
  • success
  • warning
  • error
small

    Badge

    Insignias de distinto tipo.

    Información
    Éxito
    Aviso
    Error

    Código de ejemplo

    <Badge type="info">
      Información
    </Badge>
    

    Propiedades

    type por defecto info
    • info
    • success
    • warning
    • error

    Space

    Espacio vertical en blanco con alto indicado en píxeles.

    Código de ejemplo

    <Space height={40} />
    

    Propiedades

    height por defecto 10
    • cualquier valor mayor que 0

    Separator

    Línea de separación horizontal o vertical. La línea vertical sólo es de utilidad entre elementos mostrados en línea.

    Hola
    Mundo

    Código de ejemplo

    <Separator />
    
    <div className="flex gap-4 ">
      <div>Hola</div>
      <Separator type="vertical" />
      <div>Mundo </div>
    </div>
    

    Propiedades

    type por defecto horizontal
    • horizontal
    • vertical

    Skeleton

    Estructura de ejemplo para su uso como fallback de Suspense.

    Código de ejemplo

    <Skeleton />
    

    Propiedades

    Ninguna. Deberás hacer un copia del componente y editar a tu gusto.

    Spinner

    Icono animado para su uso como fallback de Suspense.

    Código de ejemplo

    <div className="flex items-center gap-2">
      <Spinner type={0} size={12} color="text-orange-500 dark:text-orange-600" />
      <Spinner type={1} size={8} color="text-blue-600 dark:text-blue-300" />
      <Spinner type={2} size={9} />
      <Spinner type={3} size={11} />
      <Spinner type={4} size={11} color="text-blue-500 dark:text-blue-400" />
      <Spinner type={5} size={7} color="text-slate-500 dark:text-slate-400" />
      <Spinner type={6} size={9} color="text-zinc-500 dark:text-zinc-400" />
      <Spinner type={7} size={9} />
    </div>
    

    Propiedades

    type por defecto 0
    • valores de 0 a 7
    size por defecto 10
    • cualquier valor mayor que 0
    color por defecto text-black dark:text-white
    • cualquier clase tailwindcss para text

    Bonus

    Los siguientes spinners no están incluidos en esta biblioteca. Se muestran aquí para demostrar lo fácil que es crear nuestros propios spinners.

    #🔥🦘❤️

    Código de ejemplo

    <div className="flex items-center gap-2">
      <div className="size-10 inline-block border-x-4 border-blue-600 dark:border-blue-500 rounded-full animate-spin" />
      <span className="text-5xl text-slate-400 animate-spin">#</span>
      <span className="text-4xl animate-pulse">🔥</span>
      <span className="inline-block text-5xl animate-bounce">🦘</span>
      <span className="inline-block text-lg text-red-500 animate-ping">❤️</span>
    </div>
    

    Tooltip

    Pequeño cuadro informativo que aparece cuando el usuario pasa el cursor por encima.

    Al pasar el ratón por encima de este párrafo se mostrará un pequeño mensaje de ayuda o tooltip.

    Código de ejemplo

    <Tooltip title="Esto es un tooltip">
      <div className="bg-blue-100 dark:bg-blue-500 px-4 py-2 border border-slate-300 dark:border-slate-600">
        Al pasar el ratón por encima de este párrafo se mostrará un pequeño mensaje de ayuda o tooltip. 
      </div>
    </Tooltip>
    

    Propiedades

    title
    • cualquier texto o componente

    Popover

    Cuadro que aparece cuando el usuario pasa el cursor por encima del title. Suele poseer un contenido más amplio e incluso elementos interactivo.

    Código de ejemplo

    <Popover title="Popover" className="bg-blue-100 dark:bg-blue-500 px-4 py-2 border border-slate-300 dark:border-slate-600">
      <div className="flex flex-col gap-1">
        <Link href="#" className="hover:opacity-60 active:opacity-40">Dashboard</Link>
        <Link href="#" className="hover:opacity-60 active:opacity-40">Autores</Link>
        <Link href="#" className="hover:opacity-60 active:opacity-40">Libros</Link>
        <Link href="#" className="hover:opacity-60 active:opacity-40">Prestamos</Link>
      </div>
    </Popover>
    

    Propiedades

    title
    • cualquier texto o componente

    Dropdown

    Cuadro desplegable que aparece cuando el usuario hace click en el title. El cuadro suele contener algún tipo de menú. Al pulsar en cualquier otro lugar de la página, el menu se repliega.

    Código de ejemplo

    <Dropdown title="Dropdown" className="bg-blue-100 dark:bg-blue-500 px-4 py-2 border border-slate-300 dark:border-slate-600">
      <div className="flex flex-col gap-2">
        <Link href="#" className="hover:opacity-60 active:opacity-40">Dashboard</Link>
        <Link href="#" className="hover:opacity-60 active:opacity-40">Autores</Link>
        <Link href="#" className="hover:opacity-60 active:opacity-40">Libros</Link>
        <Link href="#" className="hover:opacity-60 active:opacity-40">Prestamos</Link>
      </div>
    </Dropdown>
    

    Propiedades

    title
    • cualquier texto o componente

    Dropdown2

    Cuadro desplegable que aparece cuando el usuario hace click en el title. El cuadro suele contener algún tipo de menú. Al pulsar en el mismo sitio, el menu se repliega.

    +Dropdown2

    Código de ejemplo

    <Dropdown2 title="Dropdown2" className="bg-blue-100 dark:bg-blue-500 px-4 py-2 border border-slate-300 dark:border-slate-600">
      <div className="flex flex-col gap-2">
        <Link href="#" className="hover:opacity-60 active:opacity-40">Dashboard</Link>
        <Link href="#" className="hover:opacity-60 active:opacity-40">Autores</Link>
        <Link href="#" className="hover:opacity-60 active:opacity-40">Libros</Link>
        <Link href="#" className="hover:opacity-60 active:opacity-40">Prestamos</Link>
      </div>
    </Dropdown2>
    

    Propiedades

    title
    • cualquier texto o componente

    Drawer

    Abrir Drawer

    Código de ejemplo

    <Drawer 
      trigger={
        <div className="bg-blue-100 dark:bg-blue-500 px-4 py-2 border border-slate-300 dark:border-slate-600">
          Abrir Drawer
        </div>
      }
       position="right"    
       duration={700}
       area="w-20 md:w-40"
    >
      <p>Uno</p>
      <p>Dos</p>
      <p>Tres</p>
    </Drawer>
    

    Propiedades

    position por defecto left
    • left
    • right
    • top
    • down
    duraction por defecto 300
    • cualquier valor mayor que cero en ms
    area por defecto w-40 md:w-80
    • clases de tailwindcss

    Para mayor flexibilidad se usan clases tailwindcss para definir el área.
    De esta manera podemos definir el ancho (w-) y el alto (h-) para diferentes tamaños de pantalla (sm:, md:, ...)

    • Por defecto, para left y right el valor es w-40 md:w-80.
    • Por defecto, para top y bottom el valor es h-1/3 sm:h-80.

    Modal

    Diálogo modal que aparece al hacer click en el trigger y se muestra centrado en pantalla. Para cerrar se puede hacer clic fuera del diálogo o pulsar la tecla Esc.

    Abrir Modal

    Esto es un diálogo modal.

    Lorem, ipsum dolor sit amet consectetur adipisicing elit. Quam, nostrum dignissimos illum, ratione molestiae aut, esse a porro debitis quia eius modi nulla consequuntur! Iusto nulla eaque quis libero ducimus! Sint corrupti soluta, doloremque beatae vero facilis praesentium, perferendis officiis nam enim ratione exercitationem dolore aliquid adipisci veniam quos error obcaecati! Quis voluptatum aut alias ad placeat aliquid nihil obcaecati. Iste repellat culpa eligendi dolorem deleniti officiis ex magni, placeat magnam numquam nobis eveniet beatae. Debitis labore voluptate at, sint consequuntur minus ipsum optio vero quibusdam quam fugit ullam. Nostrum? Nam obcaecati error id, facilis ipsum, cupiditate omnis deserunt saepe aliquam maiores in perspiciatis consequatur consequuntur iure excepturi rerum provident. Cupiditate quis impedit atque, aspernatur alias itaque. Sint, cupiditate ipsa! Adipisci vel ad quos temporibus dicta quidem doloremque sed deleniti eos! Quis aspernatur veniam dolor, nulla blanditiis totam molestias perspiciatis nostrum laudantium corrupti, aliquam dolore? Ab amet officiis eligendi autem.

    Código de ejemplo

    <Modal trigger={
      <div className="bg-blue-100 dark:bg-blue-500 px-4 py-2 border border-slate-300 dark:border-slate-600">
       Abrir Modal
      </div>
    }>
      <div className="p-8">
        <p className="text-blue-500 font-bold">Esto es un diálogo modal.</p>
        <div className="text-wrap">
          Lorem, ipsum dolor sit amet consectetur adipisicing elit. Quam, nostrum dignissimos illum, ratione molestiae aut, esse a porro debitis quia eius modi nulla consequuntur! Iusto nulla eaque quis libero ducimus!
          Sint corrupti soluta, doloremque beatae vero facilis praesentium, perferendis officiis nam enim ratione exercitationem dolore aliquid adipisci veniam quos error obcaecati! Quis voluptatum aut alias ad placeat aliquid nihil obcaecati.
          Iste repellat culpa eligendi dolorem deleniti officiis ex magni, placeat magnam numquam nobis eveniet beatae. Debitis labore voluptate at, sint consequuntur minus ipsum optio vero quibusdam quam fugit ullam. Nostrum?
          Nam obcaecati error id, facilis ipsum, cupiditate omnis deserunt saepe aliquam maiores in perspiciatis consequatur consequuntur iure excepturi rerum provident. Cupiditate quis impedit atque, aspernatur alias itaque. Sint, cupiditate ipsa!
          Adipisci vel ad quos temporibus dicta quidem doloremque sed deleniti eos! Quis aspernatur veniam dolor, nulla blanditiis totam molestias perspiciatis nostrum laudantium corrupti, aliquam dolore? Ab amet officiis eligendi autem.
        </div>
      </div>
    </Modal>
    

    Propiedades

    trigger
    • cualquier texto o componente

    MenuLink

    Enlace que muestra la ruta activa.

    Simple UI Componentes Test

    Código de ejemplo

    <MenuLink href="/"><HomeIcon />Simple UI</MenuLink>
    <MenuLink href="/componentes">Componentes</MenuLink>
    <MenuLink href="/test">Test</MenuLink>
    

    Propiedades

    href
    • url del enlace
    className por defecto px-4 py-2 rounded-md dark:text-white
    • clases tailwindcss deseadas
    classCheck por defecto bg-slate-700 text-white
    • clases tailwindcss deseadas enlace marcado
    classHover por defecto hover:underline hover:underline-offset-8
    • clases tailwindcss deseadas para hover
    classActive por defecto active:decoration-2 active:decoration-blue-400
    • clases tailwindcss deseadas para active

    MainMenu

    Menú desplegable en pantalla de móvil.

    Código de ejemplo

    <MainMenu position="left">
      <MenuLink href="/"><HomeIcon /></MenuLink>
      <MenuLink href="/componentes">Componentes</MenuLink>
      <MenuLink href="/test">Test</MenuLink>
    </MainMenu>
    

    Propiedades

    position por defecto right
    • left
    • right

    La propiedad position determina la posición del menú desplegable respecto al icono en dispositivos móviles.

    Sidebar

    Barra lateral para mostrar información. Este componente se ha diseñado para ser usado dentro de un Layout. Consultar Layout.

    Código de ejemplo

    <Sidebar permanent>
     <div className="flex flex-col text-xs md:text-base md:pl-4">
        <div className="font-bold mt-4"> MENSAJES y SEPARADORES </div>
        <Link href="/componentes#alert" className="md:px-2 py-1 hover:bg-slate-200 dark:hover:bg-slate-900">Alert</Link>
        <Link href="/componentes#alertsmall" className="md:px-2 py-1 hover:bg-slate-200 dark:hover:bg-slate-900">Alert small</Link>
      </div>
    </Sidebar>
    

    Propiedades

    width por defecto w-20 md:w-80
    • clases tailwindcss para móvil y desktop (md)
    duration por defecto 300
    • tiempo en milisegundos que tarda en abrirse y cerrarse la barra lateral
    permanent por defecto false
    • poner a true si deseas que la barra lateral sea permanente

    Layout

    Layout global de la aplicación. Debe usarse sustituyendo a body de RootLayout. Gestiona el header, sidebar (left y right), contenido y footer.

    Código de ejemplo

    export default function RootLayout({ children }) {
      return (
        <html
          lang="es"
          suppressHydrationWarning
          className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}
        >
    
          <Layout
            header={<Header />} 
            footer={<Footer />}
            leftsidebar={ <Sidebar> <ListaComponentes /> </Sidebar> } 
          >
            {children}
          </Layout>
    
        </html >
      )
    }
    

    Propiedades

    header
    • componente que se muestra en la cabecera
    leftsidebar
    • componente que se muestra en la barra lateral izquierda
    rightsidebar
    • componente que se muestra en la barra lateral derecha
    footer
    • componente que se muestra en el pie de página
    children
    • contenido de la página

    Permite organizar las diferentes zonas de la aplicación (header, leftsidebar, rightsidebar y footer).
    Si no se desea utilizar una de las zonas, se puede pasar null como valor de la propiedad correspondiente o directamente no incluirla en el componente.
    El orden de las propiedades no importa.

    Bonus

    Esta biblioteca no tiene componentes para Header, ni Footer, pero puedes usar los que se muestran a continuación como plantilla.

    const Header = () => (
      <nav className="z-50 px-2 flex gap-2 items-center justify-between py-4 bg-neutral-500/50">
    
        <Link href="/" className="p-3 bg-white dark:bg-black flex gap-2 items-center hover:bg-neutral-200 dark:hover:bg-neutral-800 rounded-full">
          <HomeIcon />
          <span className="hidden md:block font-bold">
            Simple UI
          </span>
        </Link>
    
    
        <div className="flex gap-2 items-center">
          <ThemeToggle />
          <MainMenu>
            <MenuLink href="/componentes"> Componentes </MenuLink>
            <MenuLink href="/test"> Test </MenuLink>
          </MainMenu>
        </div>
    
      </nav>
    )
    
    
    
    const Footer = async () => {
      'use cache'
      return (
        <div className="text-center py-2 bg-neutral-500/50">{
          new Date().toLocaleDateString('es-ES', {
            weekday: 'long',
            year: 'numeric',
            month: 'long',
            day: 'numeric'
          })}
        </div>
      )
    }
    

    Button

    Este componente debe importarse dentro de una página o componente con 'use client'

    • Motivo: hace uso de función evento onClick

    Botón para ser utilizado en el lado cliente.

    Código de ejemplo

    <Button 
      color="blue"
      className="px-12"
      onClick={() => alert("Mensaje del navegador")}
    >
      Púlsame
    </Button>
    

    Propiedades

    onClick
    • función a ejectar
    color por defecto current
    • current
    • white
    • black
    • red
    • green
    • blue
    • yellow
    • amber
    • orange
    • pink
    • purple
    • indigo
    size por defecto lg
    • xs
    • sm
    • md
    • lg
    • xl
    • 2xl
    • 3xl
    round por defecto full
    • none
    • xs
    • sm
    • md
    • lg
    • xl
    • 2xl
    • 3xl
    • full

    Switch

    Este componente debe importarse dentro de una página o componente con 'use client'

    • Motivo: hace uso de función evento onChange

    Componente de lado cliente para ejecutar acción de servidor desde fuera de un formulario.

    Código de ejemplo

    <Switch
        labelOn="Activo"
        labelOff="Inactivo"
        value={empleado.activo}
        onChange={(value) => toggleEmpleadoActivo(empleado.id, value)}
    />
    

    Propiedades

    value por defecto false
    • true
    • false
    onChange
    • función a ejectar en el servidor
    labelOn
    • mensaje cuando valor es true
    labelOff
    • mensaje cuando valor es false

    InputText

    Input de tipo texto. La mayoría de las veces no necesitarás hacer uso de forma directa, sino a través del componente Form.

    Código de ejemplo

    <InputText
      label="Introduce tu nombre"
      name="nombre"
      value="José"
    />
    

    Propiedades

    label
    • cualquier texto a mostrar
    name
    • nombre del input
    value
    • valor por defecto

    InputNumber

    Input de tipo número. La mayoría de las veces no necesitarás hacer uso de forma directa, sino a través del componente Form.

    Código de ejemplo

    <InputNumber
      label="Introduce tu edad"
      name="edad"
      value={18} 
    />
    

    Propiedades

    label
    • cualquier texto a mostrar
    name
    • nombre del input
    value
    • valor por defecto

    InputRange

    Input de tipo rango. La mayoría de las veces no necesitarás hacer uso de forma directa, sino a través del componente Form.

    50

    Código de ejemplo

    <InputRange
      label="Volumen"
      name="volume"
      value={50}
      min={0}
      max={100}
      step={1}
    />
    

    Propiedades

    label
    • cualquier texto a mostrar
    name
    • nombre del input
    value
    • valor por defecto
    min
    • valor mínimo
    max
    • valor máximo
    step
    • incremento de valor

    InputDate

    Input de varios tipos de tiempo. La mayoría de las veces no necesitarás hacer uso de forma directa, sino a través del componente Form.

    Código de ejemplo

    <InputDate 
      type="datetime-local" 
      label="Evento musical" 
      name="evento" 
    />
    

    Propiedades

    type
    • date
    • time
    • datetime-local
    • month
    • week
    label
    • cualquier texto a mostrar
    name
    • nombre del input
    value
    • valor por defecto
    min
    • valor mínimo
    max
    • valor máximo
    step
    • incremento de valor

    InputImage

    Input de tipo file para imágenes. La mayoría de las veces no necesitarás hacer uso de forma directa, sino a través del componente Form.

    image

    Código de ejemplo

    <InputImage
      label="Foto de empleado"
      name="foto"
      value="https://randomuser.me/api/portraits/men/85.jpg"
      width={300}
      height={300}
    />
    

    Propiedades

    label por defecto Imagen
    • cualquier texto a mostrar
    name por defecto image
    • nombre del input
    value
    • url de la imagen
    width por defecto 320
    • ancho en píxeles
    height por defecto 200
    • alto en píxeles

    InputCheck

    Input de tipo radio. La mayoría de las veces no necesitarás hacer uso de forma directa, sino a través del componente InputGroup.

    Código de ejemplo

    <InputCheck
      label="Amateur"
      name="nivel"
      value="amateur"
      checked={false}
      icon={<CrossIcon />}
    />
    

    Propiedades

    label
    • cualquier texto a mostrar
    name
    • nombre del input
    value
    • valor por defecto
    icon por defecto check circular
    • consultar Icons

    InputCheck multiple

    Input de tipo checkbox. La mayoría de las veces no necesitarás hacer uso de forma directa, sino a través del componente InputGroup.

    Código de ejemplo

    <InputCheck
      multiple
      label="Lectura"
      name="gustos"
      value="leer"
      checked={true}
      icon={<HeartIcon />}
    />
    

    Propiedades

    label
    • cualquier texto a mostrar
    name
    • nombre del input
    value
    • valor por defecto
    icon por defecto check cuadrado
    • consultar Icons
    multiple

      InputGroup

      Grupo de inputs de tipo radio. La mayoría de las veces no necesitarás hacer uso de forma directa, sino a través del componente Form.

      Categoria

      Código de ejemplo

      <InputGroup
        label="Categoria"
        name="categoria"
        options={[
          // [label, value, checked]
          ["Amateur", "amateur", false],
          ["Junior", "junior", false],
          ["Senior", "senior", true],
          ["Veterano", "veterano", false]
        ]}
        icon={<CrossIcon />}
      />
      

      Propiedades

      label
      • cualquier texto a mostrar
      name
      • nombre del input
      options
      • formato que se muestra en el código de ejemplo
      icon por defecto check circular
      • consultar Icons

      InputGroup multiple

      Grupo de inputs de tipo checkbox. La mayoría de las veces no necesitarás hacer uso de forma directa, sino a través del componente Form.

      Aficiones

      Código de ejemplo

      <InputGroup
        multiple
        label="Aficiones"
        name="aficiones"
        options={[
          // [label, value, checked]
          ["Lectura", "leer", true],
          ["Actividad física", "deporte", false],
          ["Cine", "cine", true],
          ["Playa", "playa", true]
        ]}
        icon={<HeartIcon />}
      />
      

      Propiedades

      label
      • cualquier texto a mostrar
      name
      • nombre del input
      options
      • formato que se muestra en el código de ejemplo
      icon por defecto check cuadrado
      • consultar Icons
      multiple

        InputSelect

        Select. La mayoría de las veces no necesitarás hacer uso de forma directa, sino a través del componente Form.

        Código de ejemplo

        <InputSelect
          label="Categoría"
          name="categoria2"
          options={[
            // [label, value, checked]
            ["Amateur", "amateur", false],
            ["Junior", "junior", false],
            ["Senior", "senior", true],
            ["Veterano", "veterano", false]
          ]}
          className="w-80"
        />
        

        Propiedades

        label
        • cualquier texto a mostrar
        name
        • nombre del input
        options
        • formato que se muestra en el código de ejemplo
        icon por defecto check circular
        • consultar Icons

        InputSelect multiple

        Select múltiple. La mayoría de las veces no necesitarás hacer uso de forma directa, sino a través del componente Form.

        Código de ejemplo

        <InputSelect
          multiple
          label="Aficiones"
          name="aficiones2"
          options={[
            // [label, value, checked]
            ["Lectura", "leer", true],
            ["Actividad física", "deporte", false],
            ["Cine", "cine", true],
            ["Playa", "playa", true]
          ]}
          className="w-80"
        />
        

        Propiedades

        label
        • cualquier texto a mostrar
        name
        • nombre del input
        options
        • formato que se muestra en el código de ejemplo de ene
        icon por defecto check cuadrado
        • consultar Icons
        multiple

          InputArea

          Área de texto para datos de un formulario. La mayoría de las veces no necesitarás hacer uso de forma directa, sino a través del componente Form. Consultar Form.

          Código de ejemplo

          <InputArea
            label="Introduce tu comentario"
            name="nombre"
            value="Mi comentario es ..."
          />
          

          Propiedades

          label
          • cualquier texto a mostrar
          name
          • nombre del input
          value
          • valor por defecto

          Submit

          Botón para enviar datos de un formulario. La mayoría de las veces no necesitarás hacer uso de forma directa, sino a través del componente Form. Consultar Form.

          Código de ejemplo

          <Submit
            color="red"
            className="px-12"
            formAction={async () => {}}
          >
            Eliminar
          </Submit>
          

          Propiedades

          labels
          • array con 2 valores, por ej: ['Enviar datos', 'Procesando datos ...']
          formAction
          • acción de servidor a ejectar
          color por defecto current
          • current
          • white
          • black
          • red
          • green
          • blue
          • yellow
          • amber
          • orange
          • pink
          • purple
          • indigo
          size por defecto lg
          • xs
          • sm
          • md
          • lg
          • xl
          • 2xl
          • 3xl
          round por defecto full
          • none
          • xs
          • sm
          • md
          • lg
          • xl
          • 2xl
          • 3xl
          • full

          El componente Submit no tiene sentido fuera de Form.

          Form

          Este componente debe importarse dentro de una página o componente con 'use client'

          • Motivo: hace uso de función toast

          Formulario de recogida de datos.

          image
          Perfil laboral:
          Hobbies:

          Código de ejemplo

          <Form
            action={async () => {
                await new Promise(resolve => setTimeout(resolve, 1000))
                toast.info("Acción desactivada.")
            }}
            data={{ nombre: "Ana", empresa: "Junta Andalucía" }}
            className="border border-slate-100 shadow-lg rounded-md p-8 md:w-3/4 mx-auto"
            fields={[
                    {
                        name: "image",
                        component: "InputImage",
                        className: "self-end",
                        width: 240,
                        height: 240,
                    },
                    {
                        name: "nombre",
                        label: "Introduzca nombre:",
                    },
                    {
                        name: "empresa",
                        label: "Introduzca empresa:",
                    },
                    {
                        name: "perfil",
                        label: "Perfil laboral:",
                        component: "InputGroup",
                        options: [
                            // [label, value, checked]
                            ["Conserje", "conserje", false],
                            ["Administrativo", "administrativo", true],
                            ["Profesor", "profesor", true],
                            ["Alumno", "alumno", false],
                        ]
                    },
                    {
                        name: "hobbies",
                        label: "Hobbies:",
                        component: "InputGroup",
                        multiple: true,
                        options: [
                            // [label, value, checked]
                            ["Lectura", "leer", false],
                            ["Cine", "cine", true],
                            ["Música", "musica", true],
                            ["Playa", "playa", false]
                        ],
                        icon: <HeartIcon colorChecked="green" />
                    },
                    {
                        labels: ["Guardar datos", "Guardando datos ..."],
                        component: "Submit",
                        color: "blue",
                        round: "lg"
                    }
                    ]}
            />
          

          Propiedades

          data
          • objeto con datos de relleno del formulario
          action
          • acción a ejecutar en el servidor
          fields
          • campos del formulario

          Table

          Tabla tradicional organizada en filas y columnas.

          Lista de empleados
          Nombre
          Empresa
          Cargo
          NombreEmpresaCargoAcciones
          1Adriana Reyes DíazVéliz Mendoza S.A.Oficial de Contabilidad Dinánmico

          Ver Empleado

          Modificar Empleado

          Eliminar Empleado

          2Agustín Aguilera BernalMaya Montañez y Valentín VillarrealProductor de Grupo Gerente

          Ver Empleado

          Modificar Empleado

          Eliminar Empleado

          3Adán Guerrero RenteríaGil Zambrano y Baca IrizarryAdministrador de Métricas Adelante

          Ver Empleado

          Modificar Empleado

          Eliminar Empleado

          Código de ejemplo

          <Table
              width={1000}
              data={[
                {
                  id: 255,
                  nombre: 'Adán Guerrero Rentería',
                  empresa: 'Gil Zambrano y Baca Irizarry',
                  cargo: 'Administrador de Métricas Adelante',
                },
                {
                  id: 306,
                  nombre: 'Agustín Aguilera Bernal',
                  empresa: 'Maya Montañez y Valentín Villarreal',
                  cargo: 'Productor de Grupo Gerente',
                },
                {
                  id: 101,
                  nombre: 'Adriana Reyes Díaz',
                  empresa: 'Véliz Mendoza S.A.',
                  cargo: 'Oficial de Contabilidad Dinánmico',
                }
              ]}
              actions={[
                ViewEmpleado,
                UpdateEmpleado,
                DeleteEmpleado,
              ]} 
              columns={[
                  { name: "nombre", label: "Nombre" },
                  { name: "empresa", label: "Empresa" },
                  { name: "cargo", label: "Cargo" },
              ]}
              sort="empresa"
              direction="desc"
          >
            <div className="text-xl font-bold">Lista de empleados</div>
          </Table>
          
          

          Propiedades

          prefix
          • url de prefijo para los elementos
          width por defecto 1200
          • ancho de la tabla medida en píxeles
          data
          • una lista similar a la mostrada anteriormente
          actions
          • componentes para acciones de modificar, eliminar, ...
          columns
          • una lista similar a la mostrada anteriormente
          sort
          • columna de ordenación
          direction por defecto asc
          • asc
          • desc

          La propiedad prefix es opcional.
          En caso de existir permite que al hacer click en una fila se muestre la página asociada con información más detallada. Es responsabilidad del programador el desarrollo de esta página.
          Por ejemplo, si la página que contiene información detallada de un empleado es /empleados/[id], entonces prefix será /empleados (sin barra final).

          List

          Lista de elementos. Tradicionalmente cada elemento se representa mediante un Card.

          Lista de empleados
          Nombre
          Empresa
          Cargo

          Adriana Reyes Díaz

          Oficial de Contabilidad Dinánmico

          Véliz Mendoza S.A.

          junior

          baile, musica

          Ver Empleado

          Modificar Empleado

          Eliminar Empleado

          Agustín Aguilera Bernal

          Productor de Grupo Gerente

          Maya Montañez y Valentín Villarreal

          senior

          musica, cine

          Ver Empleado

          Modificar Empleado

          Eliminar Empleado

          Adán Guerrero Rentería

          Administrador de Métricas Adelante

          Gil Zambrano y Baca Irizarry

          junior

          leer, cine

          Ver Empleado

          Modificar Empleado

          Eliminar Empleado

          Código de ejemplo

          List
              card={CardEmpleado}
              data={[
                {
                  id: 255,
                  nombre: 'Adán Guerrero Rentería',
                  empresa: 'Gil Zambrano y Baca Irizarry',
                  cargo: 'Administrador de Métricas Adelante',
                  nivel: 'junior',
                  aficiones: ['leer', 'cine']
                },
                {
                  id: 306,
                  nombre: 'Agustín Aguilera Bernal',
                  empresa: 'Maya Montañez y Valentín Villarreal',
                  cargo: 'Productor de Grupo Gerente',
                  nivel: 'senior',
                  aficiones: ['musica', 'cine']
                },
                {
                  id: 101,
                  nombre: 'Adriana Reyes Díaz',
                  empresa: 'Véliz Mendoza S.A.',
                  cargo: 'Oficial de Contabilidad Dinánmico',
                  nivel: 'junior',
                  aficiones: ['baile', 'musica']
                }
              ]}
              actions={[
                ViewEmpleado,
                UpdateEmpleado,
                DeleteEmpleado,
              ]} 
              columns={[
                  { name: "nombre", label: "Nombre" },
                  { name: "empresa", label: "Empresa" },
                  { name: "cargo", label: "Cargo" },
              ]}
              sort="empresa"
              direction="desc"
          >
            <div className="text-xl font-bold">Lista de empleados</div>
          </List>
          

          Propiedades

          prefix
          • url de prefijo para los elementos
          card por defecto CardEmpty
          • card a utilizar, consulta más abajo
          data
          • una lista similar a la mostrada anteriormente
          actions
          • componentes para acciones de modificar, eliminar, ...
          columns
          • una lista similar a la mostrada anteriormente
          sort
          • columna de ordenación
          direction por defecto asc
          • asc
          • desc

          La propiedad prefix es opcional.
          En caso de existir permite que al hacer click en una fila se muestre la página asociada con información más detallada. Es responsabilidad del programador el desarrollo de esta página.
          Por ejemplo, si la página que contiene información detallada de un empleado es /empleados/[id], entonces prefix será /empleados (sin barra final).

          Card

          Card para mostrar información formateada de un objeto. Haz una copia de Card para adaptarlo al objeto que quieres visualizar.

          Adán Guerrero Rentería

          Administrador de Métricas Adelante

          Gil Zambrano y Baca Irizarry

          junior

          leer, cine

          Ver Empleado

          Modificar Empleado

          Eliminar Empleado

          Código de ejemplo

          'use client'
          
          export const CardEmpleado = ({ data, actions }) => (
              <div className="p-4 rounded-xl border border-gray-300 dark:border-gray-700 flex flex-col shadow-md shadow-gray-600">
          
                  <h3 className="text-xl font-bold">{data.nombre}</h3>
          
                  <p className="text-stone-500 font-bold">{data.cargo}</p>
                  
                  <p className="text-stone-500">{data.empresa}</p>
          
                  <p className="text-md">{data.nivel}</p>
          
                  <p className="text-stone-500">{data.aficiones.join(', ')}</p>
          
                  {actions &&
                      <div className="flex gap-1 self-end" onClick={e => e.stopPropagation()}>
                          {actions.map((Action, index) => (
                              <Action
                                  key={index}
                                  data={data}
                              />
                          ))}
                      </div>
                  }
              </div>
          )
          
          const data = {
                  id: 255,
                  nombre: 'Adán Guerrero Rentería',
                  empresa: 'Gil Zambrano y Baca Irizarry',
                  cargo: 'Administrador de Métricas Adelante',
                  nivel: 'junior',
                  aficiones: ['leer', 'cine']
          }
          
          const actions = [
            ViewEmpleado,
            UpdateEmpleado,
            DeleteEmpleado,
          ]
          
          
          <CardEmpleado data={data}  actions={actions} />
          

          Propiedades

          data
          • una lista similar a la mostrada anteriormente
          actions
          • componentes para acciones de modificar, eliminar, ...

          Este componente no suele usarse de forma directa.
          El componente Card de esta biblioteca debe servirte de plantilla para desarrollar los tuyos adaptados a la información que quieras mostrar.
          Una vez escrito tu propio Card, habitualmente se lo pasarás a List como propiedad card.

          List2

          Lista de elementos que los muestra en forma de tabla en pantallas grandes y como lista en pantallas pequeñas. Debe pasarsele como propiedad card un Card o un componente similar que cumpla con la misma interface de datos.
          Usar Card2 y adaptar al formato. Consultar ejemplo de uso de Card2.

          Lista de empleados
          Nombre
          Empresa
          Cargo
          Adriana Reyes Díaz
          Oficial de Contabilidad Dinánmico
          Véliz Mendoza S.A.

          Ver Empleado

          Modificar Empleado

          Eliminar Empleado

          Agustín Aguilera Bernal
          Productor de Grupo Gerente
          Maya Montañez y Valentín Villarreal

          Ver Empleado

          Modificar Empleado

          Eliminar Empleado

          Adán Guerrero Rentería
          Administrador de Métricas Adelante
          Gil Zambrano y Baca Irizarry

          Ver Empleado

          Modificar Empleado

          Eliminar Empleado

          Código de ejemplo

          <List2
              card={CardEmpleado2}
              data={[
                {
                  id: 255,
                  nombre: 'Adán Guerrero Rentería',
                  empresa: 'Gil Zambrano y Baca Irizarry',
                  cargo: 'Administrador de Métricas Adelante',
                  nivel: 'junior',
                  aficiones: ['leer', 'cine']
                },
                {
                  id: 306,
                  nombre: 'Agustín Aguilera Bernal',
                  empresa: 'Maya Montañez y Valentín Villarreal',
                  cargo: 'Productor de Grupo Gerente',
                  nivel: 'senior',
                  aficiones: ['musica', 'cine']
                },
                {
                  id: 101,
                  nombre: 'Adriana Reyes Díaz',
                  empresa: 'Véliz Mendoza S.A.',
                  cargo: 'Oficial de Contabilidad Dinánmico',
                  nivel: 'junior',
                  aficiones: ['baile', 'musica']
                }
              ]}
              actions={[
                ViewEmpleado,
                UpdateEmpleado,
                DeleteEmpleado,
              ]} 
              columns={[
                  { name: "nombre", label: "Nombre" },
                  { name: "empresa", label: "Empresa" },
                  { name: "cargo", label: "Cargo" },
              ]}
              sort="empresa"
              direction="desc"
          >
            <div className="text-xl font-bold">Lista de empleados</div>
          </List2>
          

          Propiedades

          prefix
          • url de prefijo para los elementos
          card por defecto CardEmpty
          • card a utilizar, consulta más abajo
          data
          • una lista similar a la mostrada anteriormente
          actions
          • componentes para acciones de modificar, eliminar, ...
          columns
          • una lista similar a la mostrada anteriormente
          sort
          • columna de ordenación
          direction por defecto asc
          • asc
          • desc

          La propiedad prefix es opcional.
          En caso de existir permite que al hacer click en una fila se muestre la página asociada con información más detallada. Es responsabilidad del programador el desarrollo de esta página.
          Por ejemplo, si la página que contiene información detallada de un empleado es /empleados/[id], entonces prefix será /empleados (sin barra final).

          Card2

          Card para mostrar información formateada de un objeto. Haz una copia de Card2 para adaptarlo al objeto que quieres visualizar.

          Adán Guerrero Rentería
          Administrador de Métricas Adelante
          Gil Zambrano y Baca Irizarry

          Ver Empleado

          Modificar Empleado

          Eliminar Empleado

          Código de ejemplo

          'use client'
          
          
          const genericUser = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKMAAACUCAMAAADIzWmnAAAAYFBMVEX///8AAAC9vb0PDw/4+Pje3t6Hh4f09PRqamphYWGVlZX7+/vCwsLv7+/o6Oi2trbS0tLY2NgzMzNDQ0OkpKRaWlpOTk4nJyesrKwdHR10dHSBgYEWFhY7OzvKysp7e3vcYfW6AAADcklEQVR4nO2bCbKiMBBAaQSBIPuiosL9bzmf8TsqI5i1G6ryTvAqIUlvOI7FYrFYLBshKfLedd0+LxJqlc8UbIjKM4ycy2hgBbXQlIRVd70n54qtaTWLPXxmv5bFDNhxRhHgyAJqvZG+nTUcaXtqQcerFw1Hao9WMZj7Et++Str9DjkUAUJCQ6/hUgRoyLbb49no3+2mksy4FQEyGsVCQBGA5DaPl+/FKW1M4Pj9Ynynxlf0K0HHykd3FF1GgoUMbsKON+zn5iCsCHBAdhQ71HdaXMVgJ+G4w91sV0IRwEV15H+pX9ljKsZ8MdmUEPOtSXiDsncazERR+JG5g/rU5KWUY5ljOs5nq0scMR17SUfMPHYL67iF73EL53oL9+MW3hmHSTkyTMVNxD2eVPyIXKyQOTQRrqLTSzhiV0sD8Vu8RC9DnoQdT9iKTiqaGbYpuqPwQuIvoyOaYiMn17/4087WEmf8itRfRHabZKdHBOrhVIqOM3AqDnSKTtxxKXYUdeZ/eBcOxQtxM845fUu/jmTH5Um/HAI19H3XH4Kl0ni9iv71DzH7nCdWjPSwTEjr7r95iq4miCIWCfzs8lzN6pL5a9nlCbGX5nmeUt81FotFK/EItcQMid+7Wc3YfoSxOnN7f00jcV5fX6JqWgHaVdGl7ldxVXpZWF5nQ4prGWbEmqnLE4h3Lt3D7TPeFLtlNKlrMog0QI4D/gnyxavNyGvpncRHPgBuJ8Tj48u1PhBrZxyjo/PgDJWmcr2ZByHCUhZybbgnlfEJvkym6fHOzvAspFx/a4rRfpfKaXnF4HicnlUcMbaS+hSNScr1Mecw0t88iJTov3M2MGnoy7zQS9z0hxgyA4/LaO/Y6DwvDzSfm8N8yiLPVesnmejf6ZFWZ2xuYqdHNO52akgRQF+gxtcpkqHTpWjkwNzRdWwCtcB7mVBP1VxmBIUfPS0mk8uo6X+0xKiinqMtN67Oj4b2e6CaB36jUj81GhLBZTSkiaa3WsNmp7KlHX4a1VOTG1cEUJ12Fh99E0d1mCFCcFSd3URQBFBTNBc5vqJ2aMzGEw/U4gpTScI7aimD2ZjngVrsY/4GH2lUFD3TAcWdSqWQL/HnrQxKf+smSI4qtYBU7n8jUUqVC9IvYWceKFXKfIGLw0rHviwWi8VisVgsFovFYuHkDz8GM1mb+/d5AAAAAElFTkSuQmCC"
          
          export const CardEmpleado2 = ({ data, actions }) => (
          
              <div className={`
                  place-self-stretch p-4 bg-slate-50 dark:bg-slate-800 border border-slate-100 dark:border-slate-600 rounded-md shadow-md shadow-current/20
                  xl:p-2 xl:grid xl:grid-cols-[2fr_3fr_1fr_1fr] xl:border-none xl:rounded-none xl:items-center xl:gap-4 xl:bg-inherit xl:dark:bg-inherit
                 `}
              >
          
                  {/* Observa el uso de xl:col-span-3 para que ocupe tres columnas en pantallas grandes */}
                  <div className="xl:col-span-3 grid grid-cols-[80px_auto] gap-2">
                      <img src={genericUser} />
          
                      <div>
                          <div className="font-semibold ">{data.nombre}</div>
          
                          <div className="text-sm text-gray-500 dark:text-gray-300">{data.cargo}</div>
          
                          <div className="mt-2 xl:mt-0">{data.empresa}</div>
                      </div>
                  </div>
          
                  <div className="mt-3 xl:mt-0 flex justify-end">
                      {actions &&
                          <div className="flex gap-1" onClick={e => e.stopPropagation()}>
                              {actions.map((Action, index) =>
                                  <Action key={index} data={data} />
                              )}
                          </div>
                      }
                  </div>
              </div>
          )
          
          const data = {
                  id: 255,
                  nombre: 'Adán Guerrero Rentería',
                  empresa: 'Gil Zambrano y Baca Irizarry',
                  cargo: 'Administrador de Métricas Adelante',
                  nivel: 'junior',
                  aficiones: ['leer', 'cine']
          }
          
          const actions = [
            ViewEmpleado,
            UpdateEmpleado,
            DeleteEmpleado,
          ]
          
          
          <CardEmpleado2 data={data}  actions={actions} />
          

          Propiedades

          data
          • una lista similar a la mostrada anteriormente
          actions
          • componentes para acciones de modificar, eliminar, ...

          Este componente no suele usarse de forma directa.
          El componente Card2 de esta biblioteca debe servirte de plantilla para desarrollar los tuyos adaptados a la información que quieras mostrar.
          Una vez escrito tu propio Card2, habitualmente se lo pasarás a List2 como propiedad card.

          Icons

          Algunos iconos para su uso con InputCheck e InputGroup. Probablemente no necesites hacer uso de ellos de forma directa.

          Código de ejemplo

          <div className="flex items-center gap-2">
            <CircleIcon color="fill-violet-400" />
            <SquareIcon color="fill-blue-400" />
            <HexagonIcon color="fill-teal-400" />
            <CrossIcon color="fill-lime-400" />
            <StarIcon color="fill-yellow-400" />
            <HeartIcon color="fill-red-400" />
          </div>
          

          Propiedades

          color por defecto fill-white
          • color de relleno de tailwindcss

          DragAndDrop

          Componente con varias columnas donde arrastrar y soltar notas. Proporciona un tablero similar a Kanban.

          To Do

          Diseñar base de datos

          Urgente

          Crear componentes

          Urgente

          In Progress

          Configurar enrutador

          Normal

          Done

          Instalar dependencias

          Baja

          Código de ejemplo

          const initColumns = {
              todo: {
                  titulo: 'To Do',
                  items: [
                      { id: '1', titulo: 'Diseñar base de datos', badge: 'Urgente', color: 'bg-red-100' },
                      { id: '2', titulo: 'Crear componentes', badge: 'Urgente', color: 'bg-red-100' }
                  ]
              },
              inProgress: {
                  titulo: 'In Progress',
                  items: [
                      { id: '3', titulo: 'Configurar enrutador', badge: 'Normal', color: 'bg-amber-100' }
                  ]
              },
              done: {
                  titulo: 'Done',
                  items: [
                      { id: '4', titulo: 'Instalar dependencias', badge: 'Baja', color: 'bg-lime-100' }
                  ]
              }
          }
          
          <DragAndDrop columns={initColumns} />
          
          

          Propiedades

          columns por defecto el mostrado en pantalla
          • un objeto similar al mostrado anteriormente, acepta distinto número de columnas
          miércoles, 23 de septiembre de 2026