Ir al contenido

Card

Componente de tarjeta flexible para mostrar contenido agrupado con varios diseños.

import { Card } from 'asterui'

Card Básica

Tarjeta simple con título y contenido.

Card Title

Card content goes here. This is a basic card with a title.

import { Card } from 'asterui'

function App() {
  return (
      <Card title="Card Title" style={{ width: '20rem' }}>
        <p>Card content goes here. This is a basic card with a title.</p>
      </Card>
    )
}

export default App

Con Borde

Tarjeta con borde sólido en lugar de sombra.

Card Title

A card with a solid border instead of a shadow.

import { Card } from 'asterui'

function App() {
  return (
      <Card variant="border" title="Card Title" style={{ width: '20rem' }}>
        <p>A card with a solid border instead of a shadow.</p>
      </Card>
    )
}

export default App

Con Imagen de Portada

Tarjeta con imagen de portada encima del contenido.

Cover

Card with Cover

Cards can have cover images that appear above the content.

import { Card } from 'asterui'

function App() {
  return (
      <Card
        cover={<img src="https://picsum.photos/seed/card1/400/200" alt="Cover" />}
        title="Card with Cover"
        style={{ width: '20rem' }}
      >
        <p>Cards can have cover images that appear above the content.</p>
      </Card>
    )
}

export default App

Con Acciones

Tarjeta con botones de acción en la parte inferior.

Cover

Card with Actions

Action buttons appear at the bottom of the card.

import { Card, Button } from 'asterui'

function App() {
  return (
      <Card
        cover={<img src="https://picsum.photos/seed/card2/400/200" alt="Cover" />}
        title="Card with Actions"
        style={{ width: '20rem' }}
        actions={
          <>
            <Button variant="ghost" size="sm">Cancel</Button>
            <Button color="primary" size="sm">Buy Now</Button>
          </>
        }
      >
        <p>Action buttons appear at the bottom of the card.</p>
      </Card>
    )
}

export default App

Variantes

Diferentes variantes de estilo de tarjeta: shadow, border, dash, borderless.

Shadow

Shadow style

Border

Solid border

Dash

Dashed border

Borderless

No border
import { Card, Space } from 'asterui'

function App() {
  return (
      <Space direction="horizontal" wrap size="md">
        <Card title="Shadow" variant="shadow" style={{ width: '14rem' }}>
          Shadow style
        </Card>
        <Card title="Border" variant="border" style={{ width: '14rem' }}>
          Solid border
        </Card>
        <Card title="Dash" variant="dash" style={{ width: '14rem' }}>
          Dashed border
        </Card>
        <Card title="Borderless" variant="borderless" style={{ width: '14rem' }}>
          No border
        </Card>
      </Space>
    )
}

export default App

Tamaños

Tamaños de tarjeta desde xs hasta lg con relleno variable.

Extra Small

Compact content

Small

Small card content

Medium

Medium card content

Large

Large card content

import { Card, Space } from 'asterui'

function App() {
  return (
      <Space direction="horizontal" wrap size="md" align="start">
        <Card title="Extra Small" size="xs" style={{ width: '12rem' }}>
          <p>Compact content</p>
        </Card>
        <Card title="Small" size="sm" style={{ width: '14rem' }}>
          <p>Small card content</p>
        </Card>
        <Card title="Medium" size="md" style={{ width: '16rem' }}>
          <p>Medium card content</p>
        </Card>
        <Card title="Large" size="lg" style={{ width: '18rem' }}>
          <p>Large card content</p>
        </Card>
      </Space>
    )
}

export default App

Contenido Extra

Agrega contenido extra en el encabezado de la tarjeta con la prop extra.

Card Title

Use the extra prop to add content in the top-right corner.

import { Card } from 'asterui'

function App() {
  return (
      <Card
        title="Card Title"
        extra={<a href="#" className="link link-primary text-sm">More</a>}
        style={{ width: '20rem' }}
      >
        <p>Use the extra prop to add content in the top-right corner.</p>
      </Card>
    )
}

export default App

Diseño Meta

Diseño integrado de avatar, título y descripción.

avatar

John Doe

Software Engineer

Use avatar, title, and description for a meta layout.

import { Card, Avatar } from 'asterui'

function App() {
  return (
      <Card
        avatar={<Avatar src="/avatar-2.webp" />}
        title="John Doe"
        description="Software Engineer"
        style={{ width: '20rem' }}
      >
        <p className="mt-4">Use avatar, title, and description for a meta layout.</p>
      </Card>
    )
}

export default App

Componente Card.Meta

Componente meta independiente para posicionamiento flexible.

avatar
Jane Smith
Product Designer

Card.Meta can be used anywhere inside the card body.

import { Card, Avatar } from 'asterui'

function App() {
  return (
      <Card style={{ width: '20rem' }}>
        <Card.Meta
          avatar={<Avatar src="/avatar-1.webp" />}
          title="Jane Smith"
          description="Product Designer"
        />
        <p className="mt-4">Card.Meta can be used anywhere inside the card body.</p>
      </Card>
    )
}

export default App

Hoverable

Tarjeta con efecto de sombra al pasar el mouse.

Cover

Hoverable Card

Hover over this card to see the shadow effect.

import { Card } from 'asterui'

function App() {
  return (
      <Card
        hoverable
        cover={<img src="https://picsum.photos/seed/card3/400/200" alt="Cover" />}
        title="Hoverable Card"
        style={{ width: '20rem' }}
      >
        <p>Hover over this card to see the shadow effect.</p>
      </Card>
    )
}

export default App

Estado de Carga

Estado de carga skeleton mientras se carga el contenido.

import { Card, Button, Space, Avatar } from 'asterui'
import { useState } from 'react'

function App() {
  const [loading, setLoading] = useState(true)
  
  return (
      <Space direction="vertical" size="md">
        <Button size="sm" onClick={() => setLoading(!loading)}>
          Toggle Loading
        </Button>
        <Card
          loading={loading}
          avatar={<Avatar />}
          title="Card Title"
          description="Card description"
          style={{ width: '20rem' }}
          actions={
            <>
              <Button variant="ghost" size="sm">Action</Button>
              <Button color="primary" size="sm">Submit</Button>
            </>
          }
        >
          <p className="mt-4">Card content that appears when not loading.</p>
        </Card>
      </Space>
    )
}

export default App

Imagen Completa

El contenido se superpone sobre la imagen de portada.

Cover

Image Full

Content overlays on top of the image with dark gradient.

import { Card, Button } from 'asterui'

function App() {
  return (
      <Card
        imageFull
        cover={<img src="https://picsum.photos/seed/card4/400/250" alt="Cover" />}
        title="Image Full"
        style={{ width: '20rem' }}
        actions={<Button color="primary" size="sm">Learn More</Button>}
      >
        <p>Content overlays on top of the image with dark gradient.</p>
      </Card>
    )
}

export default App

Diseño Lateral

Diseño horizontal con imagen en el lateral.

Cover

Side Layout

The cover image appears on the side instead of the top.

import { Card, Button } from 'asterui'

function App() {
  return (
      <Card
        side
        cover={<img src="https://picsum.photos/seed/card5/200/200" alt="Cover" className="max-w-[200px]" />}
        title="Side Layout"
        style={{ width: '28rem' }}
        actions={<Button color="primary" size="sm">Details</Button>}
      >
        <p>The cover image appears on the side instead of the top.</p>
      </Card>
    )
}

export default App

Tarjeta Interna

Tarjetas anidadas con distinción de fondo sutil.

Outer Card

This is the outer card content.

Inner Card

Inner cards have a subtle background distinction.

import { Card } from 'asterui'

function App() {
  return (
      <Card title="Outer Card" style={{ width: '24rem' }}>
        <p className="mb-4">This is the outer card content.</p>
        <Card type="inner" title="Inner Card">
          <p>Inner cards have a subtle background distinction.</p>
        </Card>
      </Card>
    )
}

export default App

Con Pestañas

Tarjeta con navegación de contenido por pestañas.

Article content here...

import { Card } from 'asterui'
import { useState } from 'react'

function App() {
  const [activeKey, setActiveKey] = useState('tab1')
  
  return (
      <Card
        tabList={[
          { key: 'tab1', label: 'Article' },
          { key: 'tab2', label: 'App' },
          { key: 'tab3', label: 'Project' },
        ]}
        activeTabKey={activeKey}
        onTabChange={setActiveKey}
        style={{ width: '24rem' }}
      >
        {activeKey === 'tab1' && <p>Article content here...</p>}
        {activeKey === 'tab2' && <p>App content here...</p>}
        {activeKey === 'tab3' && <p>Project content here...</p>}
      </Card>
    )
}

export default App

Cuadrícula de Tarjeta

Diseño de cuadrícula dentro de tarjetas con celdas hoverable.

Card Grid

Grid Item 1
Grid Item 2
Grid Item 3
Grid Item 4
import { Card } from 'asterui'

function App() {
  return (
      <Card title="Card Grid" style={{ width: '28rem' }}>
        <div className="grid grid-cols-2 -mx-6 -mb-6">
          <Card.Grid hoverable>Grid Item 1</Card.Grid>
          <Card.Grid hoverable>Grid Item 2</Card.Grid>
          <Card.Grid hoverable>Grid Item 3</Card.Grid>
          <Card.Grid hoverable>Grid Item 4</Card.Grid>
        </div>
      </Card>
    )
}

export default App
PropiedadDescripciónTipoPredeterminado
titleTítulo de la tarjetaReactNode-
extraContenido en la parte superior derecha del encabezadoReactNode-
coverElemento de imagen de portadaReactNode-
actionsBotones de acción en la parte inferiorReactNode-
sizeTamaño de la tarjeta'xs' | 'sm' | 'md' | 'lg' | 'xl'-
variantVariante de estilo de tarjeta'shadow' | 'border' | 'dash' | 'borderless''shadow'
typeEstilo de tarjeta interna para anidación'inner'-
sideDiseño horizontal con imagen lateralbooleanfalse
imageFullContenido se superpone sobre imagen de portadabooleanfalse
actionsJustifyAlineación de acciones'start' | 'center' | 'end''end'
loadingMostrar estado de carga skeletonbooleanfalse
hoverableAgregar efecto de sombra al pasar el mousebooleanfalse
avatarAvatar para diseño metaReactNode-
descriptionDescripción para diseño metaReactNode-
tabListElementos de pestaña para pestañas de tarjetaCardTabItem[]-
activeTabKeyClave de pestaña activa (controlado)string-
defaultActiveTabKeyClave de pestaña activa predeterminadastring-
onTabChangeCallback de cambio de pestaña(key: string) => void-
tabBarExtraContentContenido extra al lado de las pestañasReactNode-
childrenContenido del cuerpo de la tarjetaReactNode-
classNameClases CSS adicionalesstring-
bodyClassNameClases CSS adicionales para el elemento card-bodystring-
styleEstilos en líneaCSSProperties-
PropiedadDescripciónTipoPredeterminado
avatarElemento de avatar o iconoReactNode-
titleContenido del títuloReactNode-
descriptionContenido de descripciónReactNode-
PropiedadDescripciónTipoPredeterminado
hoverableAgregar efecto hoverbooleanfalse
childrenContenido de celda de cuadrículaReactNode-
PropiedadDescripciónTipoPredeterminado
keyIdentificador único de pestañastring-
labelContenido de etiqueta de pestañaReactNode-
disabledDeshabilitar la pestañabooleanfalse
  • La estructura de la tarjeta usa HTML semántico
  • La navegación por pestañas usa roles y estados ARIA apropiados
  • El estado de carga proporciona retroalimentación visual
  • Los estados de foco son visibles para elementos interactivos