Aller au contenu

Descriptions

Afficher des paires clé-valeur dans un format structuré et lisible.

import { Descriptions } from 'asterui'

Descriptions de base

Affichage simple de paires clé-valeur.

NameJohn DoeEmailjohn@example.comPhone+1 234 567 890
LocationSan Francisco, CAStatusActive
import { Descriptions } from 'asterui'

function App() {
  const items = [
    { key: 'name', label: 'Name', children: 'John Doe' },
    { key: 'email', label: 'Email', children: 'john@example.com' },
    { key: 'phone', label: 'Phone', children: '+1 234 567 890' },
    { key: 'location', label: 'Location', children: 'San Francisco, CA' },
    { key: 'status', label: 'Status', children: 'Active' },
  ]
  
  return (
      <Descriptions items={items} />
    )
}

export default App

Avec bordures

Descriptions avec bordures.

Order Details
Order Details
ProductAsterUI ProPrice$99.00Quantity2
Total$198.00
import { Descriptions } from 'asterui'

function App() {
  const items = [
    { key: 'product', label: 'Product', children: 'AsterUI Pro' },
    { key: 'price', label: 'Price', children: '$99.00' },
    { key: 'quantity', label: 'Quantity', children: '2' },
    { key: 'total', label: 'Total', children: '$198.00' },
  ]
  
  return (
      <Descriptions items={items} bordered title="Order Details" />
    )
}

export default App

Tailles

Différentes variantes de taille.

Small
Small
NameJane SmithRoleEngineerTeamFrontend
Medium
Medium
NameJane SmithRoleEngineerTeamFrontend
Large
Large
NameJane SmithRoleEngineerTeamFrontend
import { Descriptions, Space } from 'asterui'

function App() {
  const items = [
    { key: 'name', label: 'Name', children: 'Jane Smith' },
    { key: 'role', label: 'Role', children: 'Engineer' },
    { key: 'team', label: 'Team', children: 'Frontend' },
  ]
  
  return (
      <Space direction="vertical" size="lg" className="w-full">
        <Descriptions items={items} size="sm" bordered title="Small" />
        <Descriptions items={items} size="md" bordered title="Medium" />
        <Descriptions items={items} size="lg" bordered title="Large" />
      </Space>
    )
}

export default App

Titre avec extra

Titre et contenu supplémentaire dans l'en-tête.

User Profile
User Profile
NameJohn DoeEmailjohn@example.comStatus
Active
import { Descriptions, Button, Badge } from 'asterui'

function App() {
  const items = [
    { key: 'name', label: 'Name', children: 'John Doe' },
    { key: 'email', label: 'Email', children: 'john@example.com' },
    { key: 'status', label: 'Status', children: <Badge color="success">Active</Badge> },
  ]
  
  return (
      <Descriptions
        items={items}
        bordered
        title="User Profile"
        extra={<Button size="sm">Edit</Button>}
      />
    )
}

export default App

Disposition verticale

Disposition verticale des étiquettes et du contenu.

CreatedUpdatedAuthor
2024-01-15 10:30:002024-01-20 14:45:00Jane Smith
import { Descriptions } from 'asterui'

function App() {
  const items = [
    { key: 'created', label: 'Created', children: '2024-01-15 10:30:00' },
    { key: 'updated', label: 'Updated', children: '2024-01-20 14:45:00' },
    { key: 'author', label: 'Author', children: 'Jane Smith' },
  ]
  
  return (
      <Descriptions items={items} layout="vertical" bordered />
    )
}

export default App

Colonnes personnalisées

Contrôler le nombre de colonnes.

NameAlice JohnsonAge28
GenderFemaleOccupationSoftware Engineer
DepartmentEngineeringStart Date2022-03-15
import { Descriptions } from 'asterui'

function App() {
  const items = [
    { key: 'name', label: 'Name', children: 'Alice Johnson' },
    { key: 'age', label: 'Age', children: '28' },
    { key: 'gender', label: 'Gender', children: 'Female' },
    { key: 'occupation', label: 'Occupation', children: 'Software Engineer' },
    { key: 'department', label: 'Department', children: 'Engineering' },
    { key: 'start-date', label: 'Start Date', children: '2022-03-15' },
  ]
  
  return (
      <Descriptions items={items} column={2} bordered />
    )
}

export default App

Colonnes réactives

Les colonnes s'ajustent en fonction de la largeur de la fenêtre.

Resize window to see columns change
Resize window to see columns change
Field 1Value 1Field 2Value 2Field 3Value 3
Field 4Value 4Field 5Value 5Field 6Value 6
import { Descriptions } from 'asterui'

function App() {
  const items = [
    { key: 'field1', label: 'Field 1', children: 'Value 1' },
    { key: 'field2', label: 'Field 2', children: 'Value 2' },
    { key: 'field3', label: 'Field 3', children: 'Value 3' },
    { key: 'field4', label: 'Field 4', children: 'Value 4' },
    { key: 'field5', label: 'Field 5', children: 'Value 5' },
    { key: 'field6', label: 'Field 6', children: 'Value 6' },
  ]
  
  return (
      <Descriptions
        items={items}
        bordered
        column={{ xs: 1, sm: 2, md: 3, lg: 4 }}
        title="Resize window to see columns change"
      />
    )
}

export default App

Avec espacement de colonnes

Éléments s'étendant sur plusieurs colonnes.

NameProduct XSKUPRD-12345CategoryElectronics
DescriptionA detailed product description that spans multiple columns for better readability.
import { Descriptions } from 'asterui'

function App() {
  const items = [
    { key: 'name', label: 'Name', children: 'Product X' },
    { key: 'sku', label: 'SKU', children: 'PRD-12345' },
    { key: 'category', label: 'Category', children: 'Electronics' },
    { key: 'description', label: 'Description', children: 'A detailed product description that spans multiple columns for better readability.', span: 3 },
  ]
  
  return (
      <Descriptions items={items} bordered />
    )
}

export default App

Espacement rempli

Éléments qui remplissent l'espace de ligne restant.

NameJohn DoeNotesThis field fills the remaining space in the row.
Emailjohn@example.comPhone+1 234 567 890Address123 Main St, San Francisco, CA 94102
import { Descriptions } from 'asterui'

function App() {
  const items = [
    { key: 'name', label: 'Name', children: 'John Doe' },
    { key: 'notes', label: 'Notes', children: 'This field fills the remaining space in the row.', span: 'filled' as const },
    { key: 'email', label: 'Email', children: 'john@example.com' },
    { key: 'phone', label: 'Phone', children: '+1 234 567 890' },
    { key: 'address', label: 'Address', children: '123 Main St, San Francisco, CA 94102', span: 'filled' as const },
  ]
  
  return (
      <Descriptions items={items} bordered />
    )
}

export default App

Sans deux-points

Masquer les deux-points après les étiquettes.

Field OneValue OneField TwoValue TwoField ThreeValue Three
import { Descriptions } from 'asterui'

function App() {
  const items = [
    { key: 'field1', label: 'Field One', children: 'Value One' },
    { key: 'field2', label: 'Field Two', children: 'Value Two' },
    { key: 'field3', label: 'Field Three', children: 'Value Three' },
  ]
  
  return (
      <Descriptions items={items} colon={false} bordered />
    )
}

export default App

Styles personnalisés

Appliquer des styles et classes personnalisés aux parties sémantiques.

Custom Styled
Custom Styled
NameJane DoeHighlightedThis item has custom stylesStatusActive
import { Descriptions } from 'asterui'

function App() {
  const items = [
    { key: 'name', label: 'Name', children: 'Jane Doe' },
    { key: 'highlight', label: 'Highlighted', children: 'This item has custom styles', labelClassName: 'text-primary', contentClassName: 'text-accent font-bold' },
    { key: 'status', label: 'Status', children: 'Active' },
  ]
  
  return (
      <Descriptions
        items={items}
        bordered
        styles={{
          label: { backgroundColor: 'oklch(var(--b2))' },
          content: { backgroundColor: 'oklch(var(--b1))' },
        }}
        classNames={{
          title: 'text-primary',
        }}
        title="Custom Styled"
      />
    )
}

export default App

Modèle composé

Utiliser les enfants Descriptions.Item au lieu de la prop items.

Using Compound Pattern
Using Compound Pattern
NameJohn DoeEmailjohn@example.comPhone+1 234 567 890
Address123 Main Street, San Francisco, CA 94102
import { Descriptions } from 'asterui'

function App() {
  const { Item } = Descriptions
  
  return (
      <Descriptions bordered title="Using Compound Pattern">
        <Item key="name" label="Name">John Doe</Item>
        <Item key="email" label="Email">john@example.com</Item>
        <Item key="phone" label="Phone">+1 234 567 890</Item>
        <Item key="address" label="Address" span={3}>
          123 Main Street, San Francisco, CA 94102
        </Item>
      </Descriptions>
    )
}

export default App
PropriétéDescriptionTypeDéfaut
itemsÉléments de description (alternative aux enfants)DescriptionsItemConfig[]-
titleTitre du bloc de descriptionsReact.ReactNode-
extraContenu supplémentaire dans le coin supérieur droitReact.ReactNode-
columnNombre de colonnes (ou configuration réactive)number | { xs?, sm?, md?, lg?, xl?, 2xl? }3
borderedAfficher les bordures autour des cellulesbooleanfalse
layoutDirection de la disposition'horizontal' | 'vertical''horizontal'
sizeVariante de taille'sm' | 'md' | 'lg''md'
colonAfficher les deux-points après les étiquettesbooleantrue
stylesStyles sémantiques pour les parties du composantPartial<Record<SemanticDOM, CSSProperties>>-
classNamesClasses sémantiques pour les parties du composantPartial<Record<SemanticDOM, string>>-
labelStyleStyles d’étiquette par défaut (déprécié, utiliser styles.label)React.CSSProperties-
contentStyleStyles de contenu par défaut (déprécié, utiliser styles.content)React.CSSProperties-
classNameClasses CSS supplémentairesstring-
styleStyles en ligne pour l’élément racineReact.CSSProperties-
data-testidID de test pour le composantstring'descriptions'
PropriétéDescriptionTypeDéfaut
keyClé unique pour l’élément (utilisée pour les ID de test et les clés React)string-
labelÉtiquette pour l’élémentReact.ReactNode-
childrenContenu de l’élémentReact.ReactNode-
spanNombre de colonnes à occuper, ou ‘filled’ pour remplir l’espace restantnumber | 'filled'1
labelStyleStyles d’étiquette personnalisésReact.CSSProperties-
contentStyleStyles de contenu personnalisésReact.CSSProperties-
labelClassNameClasse d’étiquette personnaliséestring-
contentClassNameClasse de contenu personnaliséestring-
PropriétéDescriptionTypeDéfaut
keyClé React, extraite par le parentstring-
itemKeyClé explicite (alternative à la clé React)string-
labelÉtiquette pour l’élémentReact.ReactNode-
childrenContenu de l’élémentReact.ReactNode-
spanNombre de colonnes à occuper, ou ‘filled’number | 'filled'1
labelStyleStyles d’étiquette personnalisésReact.CSSProperties-
contentStyleStyles de contenu personnalisésReact.CSSProperties-
labelClassNameClasse d’étiquette personnaliséestring-
contentClassNameClasse de contenu personnaliséestring-
PropriétéDescriptionType
rootÉlément conteneur racine-
headerEn-tête contenant le titre et l’extra-
titleÉlément de titre-
extraÉlément de contenu supplémentaire-
tableÉlément de tableau-
labelCellules d’étiquette (éléments th)-
contentCellules de contenu (éléments td)-
  • Utilise le balisage sémantique <table> pour une structure appropriée
  • Les cellules d’en-tête utilisent l’attribut scope pour les lecteurs d’écran
  • Le tableau a un élément <caption> (visuellement masqué) lorsqu’un titre est fourni
  • Les cellules de contenu ont aria-labelledby lié à leurs étiquettes
  • Les deux-points après les étiquettes sont marqués avec aria-hidden pour éviter les annonces redondantes