{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "sf-empty-state", "title": "SF EmptyState", "description": "Designed empty state with Bayer dither texture and optional ScrambleText", "files": [ { "path": "components/sf/sf-empty-state.tsx", "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { ScrambleText } from \"@/components/animation/scramble-text\";\n\n/**\n * Designed empty state -- FRAME layer placeholder with DU/TDR tension.\n * Bayer dither background, monospace text, optional ScrambleText SIGNAL treatment.\n *\n * @param title - Primary message text displayed in monospace uppercase\n * @param scramble - When true, title renders inside ScrambleText for SIGNAL layer effect\n * @param action - Optional action slot (e.g., a button to retry or navigate)\n * @param className - Additional classes merged onto the outer container\n * @param children - Optional description content rendered below the title\n *\n * @example\n * \n *

Try adjusting your filters.

\n *
\n */\n\ninterface SFEmptyStateProps {\n title: string;\n scramble?: boolean;\n action?: React.ReactNode;\n className?: string;\n children?: React.ReactNode;\n}\n\n/* 4x4 Bayer ordered dither pattern as base64 PNG (8x8 px, black/white checkerboard-like noise) */\nconst BAYER_DITHER_URI =\n \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAAXNSR0IArs4c6QAAADFJREFUGFdj/P///38GBgZGRkZGBhBgAAMmJiYGZMDIyAgXAAuAAchqRrgqsCBIFQMAAPwJBgmjMXwAAAAASUVORK5CYII=\";\n\nfunction SFEmptyState({\n title,\n scramble = false,\n action,\n className,\n children,\n}: SFEmptyStateProps) {\n return (\n \n {/* Bayer dither background layer */}\n \n\n {/* Content */}\n
\n {scramble ? (\n \n ) : (\n

{title}

\n )}\n\n {children && (\n
{children}
\n )}\n\n {action}\n
\n \n );\n}\n\nexport { SFEmptyState };\n", "type": "registry:ui" } ], "meta": { "layer": "frame", "pattern": "C" }, "type": "registry:ui" }