Lista de Componentes
Alert
Mensajes cortos de distinto tipo.
Código de ejemplo
<Alert type="info">
<span className="font-bold">¡Información! </span>
<span>Este es un mensaje informativo.</span>
</Alert>
Propiedades
- info
- success
- warning
- error
Alert small
Mensajes cortos de distinto tipo en formato pequeño.
Código de ejemplo
<Alert small type="info">
<span className="font-bold">¡Información! </span>
<span>Este es un mensaje informativo.</span>
</Alert>
Propiedades
- info
- success
- warning
- error
Badge
Insignias de distinto tipo.
Código de ejemplo
<Badge type="info">
Información
</Badge>
Propiedades
- info
- success
- warning
- error
Space
Espacio vertical en blanco con alto indicado en píxeles.
Código de ejemplo
<Space height={40} />
Propiedades
- 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.
Código de ejemplo
<Separator />
<div className="flex gap-4 ">
<div>Hola</div>
<Separator type="vertical" />
<div>Mundo </div>
</div>
Propiedades
- 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
- valores de 0 a 7
- cualquier valor mayor que 0
- 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
- 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
- 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
- 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.
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
- cualquier texto o componente
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
- left
- right
- top
- down
- cualquier valor mayor que cero en ms
- 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.
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
- cualquier texto o componente
MenuLink
Simple UI Componentes TestEnlace que muestra la ruta activa.
Código de ejemplo
<MenuLink href="/"><HomeIcon />Simple UI</MenuLink>
<MenuLink href="/componentes">Componentes</MenuLink>
<MenuLink href="/test">Test</MenuLink>
Propiedades
- url del enlace
- clases tailwindcss deseadas
- clases tailwindcss deseadas enlace marcado
- clases tailwindcss deseadas para hover
- 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
- 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
- clases tailwindcss para móvil y desktop (md)
- tiempo en milisegundos que tarda en abrirse y cerrarse la barra lateral
- 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
- componente que se muestra en la cabecera
- componente que se muestra en la barra lateral izquierda
- componente que se muestra en la barra lateral derecha
- componente que se muestra en el pie de página
- 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
- función a ejectar
- current
- white
- black
- red
- green
- blue
- yellow
- amber
- orange
- pink
- purple
- indigo
- xs
- sm
- md
- lg
- xl
- 2xl
- 3xl
- 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
- true
- false
- función a ejectar en el servidor
- mensaje cuando valor es true
- 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
- cualquier texto a mostrar
- nombre del input
- 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
- cualquier texto a mostrar
- nombre del input
- 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.
Código de ejemplo
<InputRange
label="Volumen"
name="volume"
value={50}
min={0}
max={100}
step={1}
/>
Propiedades
- cualquier texto a mostrar
- nombre del input
- valor por defecto
- valor mínimo
- valor máximo
- 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
- date
- time
- datetime-local
- month
- week
- cualquier texto a mostrar
- nombre del input
- valor por defecto
- valor mínimo
- valor máximo
- 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.

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
- cualquier texto a mostrar
- nombre del input
- url de la imagen
- ancho en píxeles
- 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
- cualquier texto a mostrar
- nombre del input
- valor por defecto
- 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
- cualquier texto a mostrar
- nombre del input
- valor por defecto
- consultar Icons
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.
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
- cualquier texto a mostrar
- nombre del input
- formato que se muestra en el código de ejemplo
- 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.
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
- cualquier texto a mostrar
- nombre del input
- formato que se muestra en el código de ejemplo
- consultar Icons
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
- cualquier texto a mostrar
- nombre del input
- formato que se muestra en el código de ejemplo
- 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
- cualquier texto a mostrar
- nombre del input
- formato que se muestra en el código de ejemplo de ene
- consultar Icons
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
- cualquier texto a mostrar
- nombre del input
- 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
- array con 2 valores, por ej: ['Enviar datos', 'Procesando datos ...']
- acción de servidor a ejectar
- current
- white
- black
- red
- green
- blue
- yellow
- amber
- orange
- pink
- purple
- indigo
- xs
- sm
- md
- lg
- xl
- 2xl
- 3xl
- 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.
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
- objeto con datos de relleno del formulario
- acción a ejecutar en el servidor
- campos del formulario
Table
Tabla tradicional organizada en filas y columnas.
| Nombre | Empresa ▼ | Cargo | Acciones | |
|---|---|---|---|---|
| 1 | Adriana Reyes Díaz | Véliz Mendoza S.A. | Oficial de Contabilidad Dinánmico | |
| 2 | Agustín Aguilera Bernal | Maya Montañez y Valentín Villarreal | Productor de Grupo Gerente | |
| 3 | Adán Guerrero Rentería | Gil Zambrano y Baca Irizarry | Administrador de Métricas Adelante |
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
- url de prefijo para los elementos
- ancho de la tabla medida en píxeles
- una lista similar a la mostrada anteriormente
- componentes para acciones de modificar, eliminar, ...
- una lista similar a la mostrada anteriormente
- columna de ordenación
- 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.
Adriana Reyes Díaz
Oficial de Contabilidad Dinánmico
Véliz Mendoza S.A.
junior
baile, musica
Agustín Aguilera Bernal
Productor de Grupo Gerente
Maya Montañez y Valentín Villarreal
senior
musica, cine
Adán Guerrero Rentería
Administrador de Métricas Adelante
Gil Zambrano y Baca Irizarry
junior
leer, cine
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
- url de prefijo para los elementos
- card a utilizar, consulta más abajo
- una lista similar a la mostrada anteriormente
- componentes para acciones de modificar, eliminar, ...
- una lista similar a la mostrada anteriormente
- columna de ordenación
- 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
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
- una lista similar a la mostrada anteriormente
- 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.
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
- url de prefijo para los elementos
- card a utilizar, consulta más abajo
- una lista similar a la mostrada anteriormente
- componentes para acciones de modificar, eliminar, ...
- una lista similar a la mostrada anteriormente
- columna de ordenación
- 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.
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
- una lista similar a la mostrada anteriormente
- 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 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
UrgenteCrear componentes
UrgenteIn Progress
Configurar enrutador
NormalDone
Instalar dependencias
BajaCó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
- un objeto similar al mostrado anteriormente, acepta distinto número de columnas