{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "description-list",
  "title": "Description List",
  "description": "Key–value pairs such as applicant, property and fee, as valid dl markup in stacked, side-by-side or grid layouts.",
  "files": [
    {
      "path": "registry/rapid/ui/description-list/description-list.tsx",
      "content": "import type * as React from 'react'\nimport { cn } from '@/lib/utils'\n\n// The layout is driven by data attributes on the <dl>, so the parts need no React context and work in server components.\n// The grid of pairs responds to the list's own width, not the viewport, so it also behaves inside cards and side panels:\n// it shows up to `columns` columns, and drops to fewer when a column would be narrower than --description-list-column-min.\nfunction DescriptionList({\n\tclassName,\n\torientation = 'vertical',\n\tdivided = false,\n\tcolumns = 1,\n\t...props\n}: React.ComponentProps<'dl'> & {\n\t/** `vertical` stacks the term above the value; `horizontal` puts terms in a column beside the values */\n\torientation?: 'vertical' | 'horizontal'\n\t/** Draw a rule between the pairs */\n\tdivided?: boolean\n\t/** The largest number of pairs per row; fewer are shown when the list is too narrow */\n\tcolumns?: 1 | 2 | 3 | 4\n}) {\n\treturn (\n\t\t<dl\n\t\t\tdata-slot=\"description-list\"\n\t\t\tdata-orientation={orientation}\n\t\t\tdata-divided={divided ? '' : undefined}\n\t\t\tdata-columns={columns}\n\t\t\tclassName={cn(\n\t\t\t\t'group/description-list grid w-full grid-cols-[repeat(auto-fill,minmax(min(100%,max(var(--description-list-column-min),calc((100%_-_(var(--description-list-columns)_-_1)_*_var(--description-list-gap))_/_var(--description-list-columns)))),1fr))] gap-x-(--description-list-gap) gap-y-4 text-sm [--description-list-column-min:--spacing(64)] [--description-list-columns:1] [--description-list-gap:--spacing(6)] [--description-list-details-min:--spacing(40)] [--description-list-term-width:--spacing(40)] data-[columns=2]:[--description-list-columns:2] data-[columns=3]:[--description-list-columns:3] data-[columns=4]:[--description-list-columns:4]',\n\t\t\t\t// Dividers: every pair gets a top rule and the clip-path hides the rules of the first row, whatever the number\n\t\t\t\t// of columns. The clip only trims the top edge, so focus rings at the sides and bottom stay visible.\n\t\t\t\t'data-divided:gap-y-0 data-divided:[clip-path:inset(1px_-1rem_-1rem_-1rem)]',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction DescriptionListItem({ className, ...props }: React.ComponentProps<'div'>) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"description-list-item\"\n\t\t\tclassName={cn(\n\t\t\t\t'flex min-w-0 flex-col gap-1',\n\t\t\t\t// Horizontal: the term has a fixed width and the value takes the rest. When the value would get narrower than\n\t\t\t\t// --description-list-details-min (10rem) it wraps below the term, so the pair stays readable on small screens\n\t\t\t\t// and in narrow panels.\n\t\t\t\t'group-data-[orientation=horizontal]/description-list:flex-row group-data-[orientation=horizontal]/description-list:flex-wrap group-data-[orientation=horizontal]/description-list:items-baseline group-data-[orientation=horizontal]/description-list:gap-x-4',\n\t\t\t\t'group-data-divided/description-list:border-t group-data-divided/description-list:py-3',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction DescriptionListTerm({ className, ...props }: React.ComponentProps<'dt'>) {\n\treturn (\n\t\t<dt\n\t\t\tdata-slot=\"description-list-term\"\n\t\t\tclassName={cn(\n\t\t\t\t'min-w-0 text-muted-foreground wrap-break-word group-data-[orientation=horizontal]/description-list:w-(--description-list-term-width) group-data-[orientation=horizontal]/description-list:max-w-full group-data-[orientation=horizontal]/description-list:shrink-0',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction DescriptionListDetails({ className, ...props }: React.ComponentProps<'dd'>) {\n\treturn (\n\t\t<dd\n\t\t\tdata-slot=\"description-list-details\"\n\t\t\tclassName={cn(\n\t\t\t\t'min-w-0 text-foreground wrap-break-word group-data-[orientation=horizontal]/description-list:min-w-[min(100%,var(--description-list-details-min))] group-data-[orientation=horizontal]/description-list:flex-1 [&_a:not([data-slot])]:underline [&_a:not([data-slot])]:underline-offset-4 [&_a:not([data-slot])]:hover:text-primary',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nexport { DescriptionList, DescriptionListItem, DescriptionListTerm, DescriptionListDetails }\n",
      "type": "registry:ui",
      "target": "components/ui/description-list.tsx"
    }
  ],
  "meta": {
    "new": true
  },
  "type": "registry:ui"
}