{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "ds-empty",
  "title": "Empty UI",
  "description": "Contextual empty states with built-in SVG icons for no-data, search, error, and no-results scenarios, i18n titles, action button, compact mode, and skeleton loading.",
  "dependencies": [
    "class-variance-authority",
    "lucide-react"
  ],
  "registryDependencies": [
    "@lema-ds/empty",
    "@lema-ds/button",
    "@lema-ds/skeleton",
    "@lema-ds/ui-i18n",
    "@lema-ds/ds-locale-provider"
  ],
  "files": [
    {
      "path": "components/ds/ds-empty.tsx",
      "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport {\n  InboxIcon,\n  SearchXIcon,\n  AlertCircleIcon,\n  FileSearch2Icon,\n} from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n  Empty as EmptyRoot,\n  EmptyHeader,\n  EmptyTitle,\n  EmptyDescription,\n  EmptyContent,\n  EmptyMedia,\n} from \"@/components/ui/empty\"\nimport { Button } from \"@/components/ui/button\"\nimport { Skeleton } from \"@/components/ui/skeleton\"\nimport { UI_I18N, type UILocale } from \"@/lib/ui-i18n\"\nimport { useUILocale } from \"@/components/ui/ds-locale-provider\"\n\n// ── Types ──\n\nexport type EmptyVariant = \"no-data\" | \"search\" | \"error\" | \"no-results\"\n\nexport interface EmptyAction {\n  label: string\n  onClick: () => void\n}\n\nexport interface EmptyProps\n  extends\n    Omit<React.ComponentProps<\"div\">, \"className\">,\n    VariantProps<typeof emptyVariants> {\n  variant?: EmptyVariant\n  /** Overrides the i18n title */\n  title?: string\n  /** Overrides the i18n description */\n  description?: string\n  action?: EmptyAction\n  compact?: boolean\n  loading?: boolean\n  locale?: UILocale\n  className?: string\n}\n\n// ── Variants ──\n\nexport const emptyVariants = cva(\"\", {\n  variants: {\n    compact: {\n      true: \"p-6\",\n      false: \"p-12\",\n    },\n  },\n  defaultVariants: { compact: false },\n})\n\nexport const iconVariants = cva(\n  \"flex shrink-0 items-center justify-center rounded-full bg-muted\",\n  {\n    variants: {\n      compact: {\n        true: \"size-10 [&_svg]:size-5\",\n        false: \"size-16 [&_svg]:size-8\",\n      },\n    },\n    defaultVariants: { compact: false },\n  }\n)\n\n// ── Icons Map ──\n\nconst EMPTY_ICONS: Record<EmptyVariant, React.ReactNode> = {\n  \"no-data\": <InboxIcon className=\"text-muted-foreground\" />,\n  search: <FileSearch2Icon className=\"text-muted-foreground\" />,\n  error: <AlertCircleIcon className=\"text-muted-foreground\" />,\n  \"no-results\": <SearchXIcon className=\"text-muted-foreground\" />,\n}\n\n// ── Component ──\n\nfunction Empty({\n  variant = \"no-data\",\n  title,\n  description,\n  action,\n  compact = false,\n  loading = false,\n  locale: localeProp,\n  className,\n  ...htmlProps\n}: EmptyProps) {\n  const locale = useUILocale(localeProp)\n  const i18n = UI_I18N[locale]\n\n  const resolvedTitle =\n    title ??\n    (variant === \"search\"\n      ? i18n.empty.search\n      : variant === \"error\"\n        ? i18n.empty.error\n        : variant === \"no-results\"\n          ? i18n.empty.noResults\n          : i18n.empty.noData)\n\n  const resolvedDescription =\n    description ??\n    (variant === \"search\"\n      ? i18n.empty.searchDescription\n      : variant === \"error\"\n        ? i18n.empty.errorDescription\n        : variant === \"no-results\"\n          ? i18n.empty.noResultsDescription\n          : i18n.empty.noDataDescription)\n\n  if (loading) {\n    return (\n      <div\n        data-slot=\"ds-empty\"\n        {...htmlProps}\n        className={cn(\n          \"flex w-full flex-col items-center justify-center gap-4\",\n          emptyVariants({ compact }),\n          className\n        )}\n      >\n        <Skeleton\n          className={cn(\"rounded-full\", compact ? \"size-10\" : \"size-16\")}\n        />\n        <Skeleton className=\"h-5 w-48 rounded-md\" />\n        <Skeleton className=\"h-4 w-72 rounded-md\" />\n      </div>\n    )\n  }\n\n  return (\n    <EmptyRoot\n      data-slot=\"ds-empty\"\n      role=\"status\"\n      aria-live=\"polite\"\n      aria-label={resolvedTitle}\n      {...htmlProps}\n      className={cn(emptyVariants({ compact }), className)}\n    >\n      <EmptyHeader>\n        <EmptyMedia className={iconVariants({ compact })}>\n          {EMPTY_ICONS[variant]}\n        </EmptyMedia>\n        <EmptyTitle>{resolvedTitle}</EmptyTitle>\n        <EmptyDescription>{resolvedDescription}</EmptyDescription>\n      </EmptyHeader>\n      {action && (\n        <EmptyContent>\n          <Button variant=\"outline\" onClick={action.onClick}>\n            {action.label}\n          </Button>\n        </EmptyContent>\n      )}\n    </EmptyRoot>\n  )\n}\n\nexport { Empty }\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}
