{
  "name": "UIBlocks",
  "version": "0.3.0",
  "homepage": "https://uiblocks.org",
  "framework": "TanStack Start",
  "mcp": "/mcp",
  "aiAccess": "/ai-access",
  "registry": "/r/registry.json",
  "instructions": "/ai-usage.md",
  "previewManifest": "/previews/manifest.json",
  "scenarios": [
    {
      "id": "media-tool",
      "name": "Media processing tool",
      "description": "File selection, processing tasks, results, and a usage summary.",
      "query": "video compression tool",
      "aliases": [
        "video compression",
        "video compressor",
        "compress video",
        "media processing",
        "media tool",
        "file processing",
        "视频压缩",
        "视频处理",
        "视频转换",
        "视频转码",
        "文件处理",
        "图片处理",
        "音频转换"
      ],
      "concepts": [
        "media",
        "upload",
        "tasks"
      ],
      "blockIds": [
        "upload-workflow-01",
        "workspace-header-01",
        "task-queue-01",
        "results-gallery-01",
        "usage-panel-01"
      ],
      "categories": [
        "workspace",
        "file-upload"
      ],
      "recipeIds": [
        "tool-workspace"
      ]
    },
    {
      "id": "product-landing",
      "name": "Product landing page",
      "description": "A product introduction, features, plans, FAQs, and navigation.",
      "query": "a landing page with pricing and login",
      "aliases": [
        "landing page",
        "product website",
        "product page",
        "saas website",
        "homepage",
        "官网",
        "产品站",
        "营销页",
        "落地页",
        "着陆页"
      ],
      "concepts": [
        "landing"
      ],
      "blockIds": [
        "navigation-01",
        "hero-01",
        "logo-cloud-01",
        "features-01",
        "pricing-01",
        "faq-01",
        "footer-01"
      ],
      "categories": [
        "marketing"
      ],
      "recipeIds": [
        "tool-landing"
      ]
    },
    {
      "id": "saas-dashboard",
      "name": "SaaS dashboard",
      "description": "Navigation, metrics, tables, and settings for an application.",
      "query": "SaaS admin dashboard with metrics and tables",
      "aliases": [
        "admin dashboard",
        "admin panel",
        "control panel",
        "saas dashboard",
        "管理后台",
        "后台管理",
        "控制台",
        "仪表盘",
        "数据看板"
      ],
      "concepts": [
        "dashboard"
      ],
      "blockIds": [
        "dashboard-01",
        "sidebar-05",
        "stats-01",
        "table-01",
        "form-layout-01"
      ],
      "categories": [
        "dashboard",
        "sidebar",
        "stats",
        "tables",
        "form-layout"
      ],
      "recipeIds": []
    },
    {
      "id": "authentication",
      "name": "Login & signup",
      "description": "Account entry and signup forms to connect to your auth provider.",
      "query": "login and signup forms",
      "aliases": [
        "login",
        "signup",
        "sign in",
        "sign up",
        "authentication",
        "登录",
        "注册",
        "认证"
      ],
      "concepts": [
        "login"
      ],
      "blockIds": [
        "login-01",
        "login-02",
        "login-03"
      ],
      "categories": [
        "login"
      ],
      "recipeIds": []
    },
    {
      "id": "chat-assistant",
      "name": "Chat assistant",
      "description": "Conversation layouts, prompt inputs, and attachment controls.",
      "query": "AI chat assistant with file attachments",
      "aliases": [
        "chat assistant",
        "chatbot",
        "chat bot",
        "ai chat",
        "聊天助手",
        "聊天机器人",
        "AI对话",
        "智能对话"
      ],
      "concepts": [
        "chat"
      ],
      "blockIds": [
        "chat-03",
        "ai-05",
        "ai-04",
        "chat-01",
        "chat-02"
      ],
      "categories": [
        "chat",
        "ai"
      ],
      "recipeIds": []
    }
  ],
  "blocks": [
    {
      "id": "navigation-01",
      "category": "marketing",
      "name": "Product Navigation",
      "iframeHeight": "280px",
      "type": "file",
      "description": "A compact product header with responsive navigation and a clear workspace call to action.",
      "tags": [
        "navigation",
        "header",
        "menu",
        "navbar",
        "landing",
        "导航",
        "页头",
        "菜单",
        "官网"
      ],
      "pageType": "marketing",
      "style": "clean-saas",
      "featured": true,
      "source": {
        "name": "UIBlocks",
        "url": "https://uiblocks.org",
        "license": "MIT",
        "author": "UIBlocks contributors",
        "revision": "uiblocks-v0.1.0"
      },
      "contentGuidelines": [
        "Use a short product name and three to four navigation links.",
        "Set the primary link to your real product entry route."
      ],
      "recommendedWith": [
        "hero-01",
        "footer-01"
      ],
      "version": "0.1.0",
      "url": "/marketing/navigation-01",
      "preview": "/preview/navigation-01",
      "screenshot": "/previews/navigation-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "navigation-01",
        "image": "navigation-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/marketing/navigation-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "9047310efc01f1ba6784fa257ace278d3e8ea4b7b8b69b51927bbbe4d0a00328",
        "imageHash": "ee244c0ff8a19768a205d4c2d878988636440618ac23d2428e9f169b3e7c0138",
        "capturedAt": "2026-10-30T04:02:25.910Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 82
        },
        "state": "default"
      },
      "registry": "/r/navigation-01.json"
    },
    {
      "id": "hero-01",
      "category": "marketing",
      "name": "Product Hero with Preview",
      "iframeHeight": "720px",
      "type": "file",
      "description": "A product landing hero with an editorial headline, two calls to action, and a media workspace preview.",
      "tags": [
        "hero",
        "landing",
        "product",
        "video",
        "preview",
        "split",
        "首屏",
        "官网",
        "视频",
        "预览",
        "长标题"
      ],
      "pageType": "marketing",
      "style": "clean-saas",
      "featured": true,
      "source": {
        "name": "UIBlocks",
        "url": "https://uiblocks.org",
        "license": "MIT",
        "author": "UIBlocks contributors",
        "revision": "uiblocks-v0.1.0"
      },
      "contentGuidelines": [
        "Aim for two to three headline lines; test longer Chinese copy on mobile.",
        "Keep the introduction to two short sentences and use at most two calls to action."
      ],
      "recommendedWith": [
        "navigation-01",
        "logo-cloud-01",
        "features-01"
      ],
      "version": "0.1.0",
      "url": "/marketing/hero-01",
      "preview": "/preview/hero-01",
      "screenshot": "/previews/hero-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "hero-01",
        "image": "hero-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/marketing/hero-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "827fc3e867e436a6bfd5db1c1d26fb237abbf94d89286c26214f4118ebb8bb06",
        "imageHash": "e31bf67f81d809fe2a972a4e90511f5fd1b8d1f636edafecaa0509302121295d",
        "capturedAt": "2026-10-30T04:02:28.281Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 798
        },
        "state": "default"
      },
      "registry": "/r/hero-01.json"
    },
    {
      "id": "logo-cloud-01",
      "category": "marketing",
      "name": "Supported Format Cloud",
      "iframeHeight": "220px",
      "type": "file",
      "description": "A quiet format compatibility strip that introduces the file types and workflow capabilities supported by your product.",
      "tags": [
        "formats",
        "compatibility",
        "workflow",
        "files",
        "logo cloud",
        "格式",
        "兼容",
        "流程",
        "文件",
        "支持"
      ],
      "pageType": "marketing",
      "style": "clean-saas",
      "featured": true,
      "source": {
        "name": "UIBlocks",
        "url": "https://uiblocks.org",
        "license": "MIT",
        "author": "UIBlocks contributors",
        "revision": "uiblocks-v0.1.0"
      },
      "contentGuidelines": [
        "List only file formats and workflow capabilities your product actually supports.",
        "This strip describes format compatibility and does not imply customer endorsements."
      ],
      "recommendedWith": [
        "hero-01",
        "features-01"
      ],
      "version": "0.1.0",
      "url": "/marketing/logo-cloud-01",
      "preview": "/preview/logo-cloud-01",
      "screenshot": "/previews/logo-cloud-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "logo-cloud-01",
        "image": "logo-cloud-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/marketing/logo-cloud-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "f0a9036e39bec0509efb542ee8d21a8eaefc0564b33acd80389bad404364b2e1",
        "imageHash": "d5f38c757e9f2313eddc2e8949c788179d83c3756651f4e0a0642c3bf3e6068b",
        "capturedAt": "2026-10-30T04:02:30.608Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 154
        },
        "state": "default"
      },
      "registry": "/r/logo-cloud-01.json"
    },
    {
      "id": "features-01",
      "category": "marketing",
      "name": "Workflow Feature Grid",
      "iframeHeight": "640px",
      "type": "file",
      "description": "A three-part feature grid that explains an input, processing, and output workflow.",
      "tags": [
        "features",
        "bento",
        "workflow",
        "benefits",
        "功能",
        "网格",
        "流程",
        "优势"
      ],
      "pageType": "marketing",
      "style": "clean-saas",
      "featured": true,
      "source": {
        "name": "UIBlocks",
        "url": "https://uiblocks.org",
        "license": "MIT",
        "author": "UIBlocks contributors",
        "revision": "uiblocks-v0.1.0"
      },
      "contentGuidelines": [
        "Keep each feature focused on one concrete user outcome.",
        "Use three equally detailed feature descriptions for balanced cards."
      ],
      "recommendedWith": [
        "hero-01",
        "pricing-01",
        "faq-01"
      ],
      "version": "0.1.0",
      "url": "/marketing/features-01",
      "preview": "/preview/features-01",
      "screenshot": "/previews/features-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "features-01",
        "image": "features-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/marketing/features-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "7fc486e2c419406605a4e72a54c2e8059ab865191888d23e3b76fcff8931d791",
        "imageHash": "4e3edc8427c1ffbcb1a219bfc044dcd69ae423cd35b9406e6ac1376c83abb190",
        "capturedAt": "2026-10-30T04:02:32.946Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 566
        },
        "state": "default"
      },
      "registry": "/r/features-01.json"
    },
    {
      "id": "pricing-01",
      "category": "marketing",
      "name": "Simple Subscription Pricing",
      "iframeHeight": "800px",
      "type": "file",
      "description": "A three-tier pricing section with a monthly/yearly selector and a visually emphasized recommended plan.",
      "tags": [
        "pricing",
        "subscription",
        "plans",
        "billing",
        "价格",
        "定价",
        "套餐",
        "订阅",
        "账单"
      ],
      "pageType": "marketing",
      "style": "clean-saas",
      "featured": true,
      "source": {
        "name": "UIBlocks",
        "url": "https://uiblocks.org",
        "license": "MIT",
        "author": "UIBlocks contributors",
        "revision": "uiblocks-v0.1.0"
      },
      "contentGuidelines": [
        "Demo prices are examples; define real entitlements and billing periods before launch.",
        "Keep feature lists comparable across the three plans and connect purchase links."
      ],
      "recommendedWith": [
        "features-01",
        "faq-01",
        "usage-panel-01"
      ],
      "version": "0.1.0",
      "url": "/marketing/pricing-01",
      "preview": "/preview/pricing-01",
      "screenshot": "/previews/pricing-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "pricing-01",
        "image": "pricing-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/marketing/pricing-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "651a3f9e24ffea0c7eda20f8d06b5f1a4bf113f51a2b0c3d22abb925eaa211e6",
        "imageHash": "31e547cf9469d0838be48a613946d7907a0aaa7d40f36c7e4bf986b291ce6963",
        "capturedAt": "2026-10-30T04:02:35.344Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 864
        },
        "state": "default"
      },
      "registry": "/r/pricing-01.json"
    },
    {
      "id": "faq-01",
      "category": "marketing",
      "name": "Product FAQ",
      "iframeHeight": "620px",
      "type": "file",
      "description": "A keyboard-accessible FAQ accordion for product fit, privacy, and billing questions.",
      "tags": [
        "faq",
        "accordion",
        "questions",
        "support",
        "常见问题",
        "问答",
        "折叠",
        "帮助"
      ],
      "pageType": "marketing",
      "style": "clean-saas",
      "featured": true,
      "source": {
        "name": "UIBlocks",
        "url": "https://uiblocks.org",
        "license": "MIT",
        "author": "UIBlocks contributors",
        "revision": "uiblocks-v0.1.0"
      },
      "contentGuidelines": [
        "Write five or fewer common questions with direct, short answers.",
        "Replace demo service and privacy claims with statements that match your product."
      ],
      "recommendedWith": [
        "pricing-01",
        "footer-01"
      ],
      "version": "0.1.0",
      "url": "/marketing/faq-01",
      "preview": "/preview/faq-01",
      "screenshot": "/previews/faq-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "faq-01",
        "image": "faq-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/marketing/faq-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "17e559bc08e485c36f77cdc91ce3fcfb334b1dbabfb975cf3052aaf13c988a20",
        "imageHash": "67bdf305da8929f28c108e3200d50a43ca6175139cf51d63a2aa2dacc47094d4",
        "capturedAt": "2026-10-30T04:02:37.664Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 562
        },
        "state": "default"
      },
      "registry": "/r/faq-01.json"
    },
    {
      "id": "footer-01",
      "category": "marketing",
      "name": "Product Footer",
      "iframeHeight": "320px",
      "type": "file",
      "description": "A minimal product footer with a brand statement, useful links, and a final workspace entry.",
      "tags": [
        "footer",
        "navigation",
        "links",
        "legal",
        "页脚",
        "底部",
        "链接",
        "版权"
      ],
      "pageType": "marketing",
      "style": "clean-saas",
      "featured": true,
      "source": {
        "name": "UIBlocks",
        "url": "https://uiblocks.org",
        "license": "MIT",
        "author": "UIBlocks contributors",
        "revision": "uiblocks-v0.1.0"
      },
      "contentGuidelines": [
        "Only show links that have a real destination.",
        "Set the product name, copyright owner, and legal destinations for your product."
      ],
      "recommendedWith": [
        "navigation-01",
        "faq-01"
      ],
      "version": "0.1.0",
      "url": "/marketing/footer-01",
      "preview": "/preview/footer-01",
      "screenshot": "/previews/footer-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "footer-01",
        "image": "footer-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/marketing/footer-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "2b1d24099ede01724003fd6c3edb2e41a8d1b9ccc1eb3848dea45de15995944e",
        "imageHash": "fe5fca349748f999a7ae7bda8c49351f2b46ae5233de4c81604af9b4cc645e94",
        "capturedAt": "2026-10-30T04:02:40.014Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 214
        },
        "state": "default"
      },
      "registry": "/r/footer-01.json"
    },
    {
      "id": "workspace-header-01",
      "category": "workspace",
      "name": "Workspace Header",
      "iframeHeight": "280px",
      "type": "file",
      "description": "A responsive tool workspace heading with project context, status, and a primary creation action.",
      "tags": [
        "workspace",
        "header",
        "project",
        "tool",
        "工作台",
        "页头",
        "项目",
        "工具"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": true,
      "source": {
        "name": "UIBlocks",
        "url": "https://uiblocks.org",
        "license": "MIT",
        "author": "UIBlocks contributors",
        "revision": "uiblocks-v0.1.0"
      },
      "contentGuidelines": [
        "Use one workspace title and a short status message.",
        "Connect the primary action to file selection or creation in the containing page."
      ],
      "recommendedWith": [
        "upload-workflow-01",
        "usage-panel-01"
      ],
      "version": "0.1.0",
      "url": "/workspace/workspace-header-01",
      "preview": "/preview/workspace-header-01",
      "screenshot": "/previews/workspace-header-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "workspace-header-01",
        "image": "workspace-header-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/workspace/workspace-header-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "b801eba55f8a156372aafaa69ea2c0b79b36676eabf976bc1a94ccbd2e4b613d",
        "imageHash": "1a1692b846ba4034bfeb95408fac7b6de14bfaa427bf22a64dd16fb5438b6b09",
        "capturedAt": "2026-10-30T04:02:42.320Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 228
        },
        "state": "default"
      },
      "registry": "/r/workspace-header-01.json"
    },
    {
      "id": "upload-workflow-01",
      "category": "workspace",
      "name": "File Processing Workspace",
      "iframeHeight": "650px",
      "type": "file",
      "description": "A file processing input panel with drag and drop, format controls, and a local demo processing state.",
      "tags": [
        "upload",
        "dropzone",
        "file",
        "processing",
        "video",
        "workspace",
        "上传",
        "文件",
        "处理",
        "视频",
        "工作台"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": true,
      "source": {
        "name": "UIBlocks",
        "url": "https://uiblocks.org",
        "license": "MIT",
        "author": "UIBlocks contributors",
        "revision": "uiblocks-v0.1.0"
      },
      "contentGuidelines": [
        "The preview simulates processing locally; supply your own processing service.",
        "Validate supported file types and limits on both client and server in a production integration."
      ],
      "recommendedWith": [
        "task-queue-01",
        "results-gallery-01",
        "usage-panel-01"
      ],
      "version": "0.1.0",
      "url": "/workspace/upload-workflow-01",
      "preview": "/preview/upload-workflow-01",
      "screenshot": "/previews/upload-workflow-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "upload-workflow-01",
        "image": "upload-workflow-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/workspace/upload-workflow-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "167542a77bea6bcf9b5d51fda1be02aed97b5bc8bbab13a0307b38fbc2f0e678",
        "imageHash": "d1a76d3a51fd98fe623c400d60f6fa4ef20ca77e896183e3062b3b4fefddd487",
        "capturedAt": "2026-10-30T04:02:44.618Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 526
        },
        "state": "default"
      },
      "registry": "/r/upload-workflow-01.json"
    },
    {
      "id": "task-queue-01",
      "category": "workspace",
      "name": "Processing Task Queue",
      "iframeHeight": "520px",
      "type": "file",
      "description": "A compact task queue with progress, status labels, and row actions for media processing workflows.",
      "tags": [
        "queue",
        "tasks",
        "jobs",
        "progress",
        "status",
        "队列",
        "任务",
        "进度",
        "状态",
        "批量"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": true,
      "source": {
        "name": "UIBlocks",
        "url": "https://uiblocks.org",
        "license": "MIT",
        "author": "UIBlocks contributors",
        "revision": "uiblocks-v0.1.0"
      },
      "contentGuidelines": [
        "Use a stable identifier and explicit status for each task.",
        "Connect cancellation and retry to actual background job controls."
      ],
      "recommendedWith": [
        "upload-workflow-01",
        "results-gallery-01"
      ],
      "version": "0.1.0",
      "url": "/workspace/task-queue-01",
      "preview": "/preview/task-queue-01",
      "screenshot": "/previews/task-queue-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "task-queue-01",
        "image": "task-queue-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/workspace/task-queue-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "dd7237e2cd8d606f176f468aae7240d2a91726156c9013084193ffd56de2a415",
        "imageHash": "37030356900cfc78457538c7684c71247f919876dd24d1bb05d2f62ad262f849",
        "capturedAt": "2026-10-30T04:02:46.972Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 374
        },
        "state": "default"
      },
      "registry": "/r/task-queue-01.json"
    },
    {
      "id": "results-gallery-01",
      "category": "workspace",
      "name": "Generated Results Gallery",
      "iframeHeight": "600px",
      "type": "file",
      "description": "A result gallery with output previews and download actions for a media creation workspace.",
      "tags": [
        "results",
        "gallery",
        "output",
        "download",
        "media",
        "结果",
        "作品",
        "图库",
        "下载",
        "媒体"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": true,
      "source": {
        "name": "UIBlocks",
        "url": "https://uiblocks.org",
        "license": "MIT",
        "author": "UIBlocks contributors",
        "revision": "uiblocks-v0.1.0"
      },
      "contentGuidelines": [
        "Give each output a useful title, format, and downloadable file.",
        "Keep thumbnail aspect ratios consistent and provide an empty state."
      ],
      "recommendedWith": [
        "upload-workflow-01",
        "task-queue-01"
      ],
      "version": "0.1.0",
      "url": "/workspace/results-gallery-01",
      "preview": "/preview/results-gallery-01",
      "screenshot": "/previews/results-gallery-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "results-gallery-01",
        "image": "results-gallery-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/workspace/results-gallery-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "563821e0efc895bf65b4d41ccbe929ed4fa987b7dc970487b259373b519da112",
        "imageHash": "3c9a86f468caca9d90dc3f5c89cb3f8b5f014f272575f88f5fe63d2b4644515a",
        "capturedAt": "2026-10-30T04:02:49.272Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 524
        },
        "state": "default"
      },
      "registry": "/r/results-gallery-01.json"
    },
    {
      "id": "usage-panel-01",
      "category": "workspace",
      "name": "Credits and Usage",
      "iframeHeight": "420px",
      "type": "file",
      "description": "A credits and usage summary that makes the remaining processing allowance easy to understand.",
      "tags": [
        "usage",
        "credits",
        "quota",
        "billing",
        "allowance",
        "额度",
        "积分",
        "用量",
        "账单",
        "剩余"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": true,
      "source": {
        "name": "UIBlocks",
        "url": "https://uiblocks.org",
        "license": "MIT",
        "author": "UIBlocks contributors",
        "revision": "uiblocks-v0.1.0"
      },
      "contentGuidelines": [
        "Display the allowance period and unit alongside usage.",
        "Calculate authoritative usage and entitlements in your backend."
      ],
      "recommendedWith": [
        "workspace-header-01",
        "upload-workflow-01",
        "pricing-01"
      ],
      "version": "0.1.0",
      "url": "/workspace/usage-panel-01",
      "preview": "/preview/usage-panel-01",
      "screenshot": "/previews/usage-panel-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "usage-panel-01",
        "image": "usage-panel-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/workspace/usage-panel-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "9b8621fc7d38eb2dfafa52b91c8f82186c48522d9f6d1b51eddfaa102895ded1",
        "imageHash": "c4b91a987584f848f54dad5fed4563a257681dca4ad58571c31ee1991190d7bf",
        "capturedAt": "2026-10-30T04:02:51.577Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 370
        },
        "state": "default"
      },
      "registry": "/r/usage-panel-01.json"
    },
    {
      "id": "file-upload-01",
      "category": "file-upload",
      "name": "File Upload with Preview",
      "iframeHeight": "506px",
      "type": "directory",
      "description": "File Upload with Preview. File selection, drag and drop, previews, and upload progress for a product workspace.",
      "tags": [
        "upload",
        "file",
        "dropzone",
        "media",
        "上传",
        "文件",
        "拖拽",
        "工作台"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Connect file validation and upload callbacks to your own service.",
        "Test long filenames, rejected files, and the empty state."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/file-upload/file-upload-01",
      "preview": "/preview/file-upload-01",
      "screenshot": "/previews/file-upload-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "file-upload-01",
        "image": "file-upload-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/select.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/file-upload/file-upload-01/dropzone.tsx",
          "content/components/file-upload/file-upload-01/file-item.tsx",
          "content/components/file-upload/file-upload-01/file-list.tsx",
          "content/components/file-upload/file-upload-01/form.tsx",
          "content/components/file-upload/file-upload-01/index.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "c4f175e9e54763f99cc671fb360507a7ed282b5d366cf6b791674d802ee87291",
        "imageHash": "a889ac5362e799cae28685c4694d33f22395f961cb6ade9d722a47e24e509aab",
        "capturedAt": "2026-10-30T04:02:53.974Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 476
        },
        "state": "default"
      },
      "registry": "/r/file-upload-01.json"
    },
    {
      "id": "file-upload-02",
      "category": "file-upload",
      "name": "File Upload Simple",
      "iframeHeight": "460px",
      "type": "file",
      "description": "File Upload Simple. File selection, drag and drop, previews, and upload progress for a product workspace.",
      "tags": [
        "upload",
        "file",
        "dropzone",
        "media",
        "上传",
        "文件",
        "拖拽",
        "工作台"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Connect file validation and upload callbacks to your own service.",
        "Test long filenames, rejected files, and the empty state."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/file-upload/file-upload-02",
      "preview": "/preview/file-upload-02",
      "screenshot": "/previews/file-upload-02.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "file-upload-02",
        "image": "file-upload-02.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/file-upload/file-upload-02.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "80d50181db18be95b764e7c615c8bbf22b5264fa6040b99d8d5e2df3c28d1362",
        "imageHash": "b848a3f8cf492ae46d51633f302f912463dff775f718447836ccb72277463718",
        "capturedAt": "2026-10-30T04:02:56.235Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 418
        },
        "state": "default"
      },
      "registry": "/r/file-upload-02.json"
    },
    {
      "id": "file-upload-03",
      "category": "file-upload",
      "name": "File Upload Multi-File Dropzone",
      "iframeHeight": "685px",
      "type": "file",
      "description": "File Upload Multi-File Dropzone. File selection, drag and drop, previews, and upload progress for a product workspace.",
      "tags": [
        "upload",
        "file",
        "dropzone",
        "media",
        "上传",
        "文件",
        "拖拽",
        "工作台"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Connect file validation and upload callbacks to your own service.",
        "Test long filenames, rejected files, and the empty state."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/file-upload/file-upload-03",
      "preview": "/preview/file-upload-03",
      "screenshot": "/previews/file-upload-03.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "file-upload-03",
        "image": "file-upload-03.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/select.tsx",
          "components/ui/separator.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/file-upload/file-upload-03.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "234dd75063288f45d4f912fc0e0c75ffc2356fdfdf10cbdb3b82c1cb5c0398d7",
        "imageHash": "662a3469ac9516e3dd9e07f9c1bebbc92427d3da8d996de7b736a5612081325f",
        "capturedAt": "2026-10-30T04:02:58.562Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 650
        },
        "state": "default"
      },
      "registry": "/r/file-upload-03.json"
    },
    {
      "id": "file-upload-04",
      "category": "file-upload",
      "name": "File Upload Drag & Drop",
      "iframeHeight": "550px",
      "type": "file",
      "description": "File Upload Drag & Drop. File selection, drag and drop, previews, and upload progress for a product workspace.",
      "tags": [
        "upload",
        "file",
        "dropzone",
        "media",
        "上传",
        "文件",
        "拖拽",
        "工作台"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Connect file validation and upload callbacks to your own service.",
        "Test long filenames, rejected files, and the empty state."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/file-upload/file-upload-04",
      "preview": "/preview/file-upload-04",
      "screenshot": "/previews/file-upload-04.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "file-upload-04",
        "image": "file-upload-04.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/progress.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/file-upload/file-upload-04.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "e2410041da92ae1c242941290d6f561cdd0b37a85faac58eb90a68c18620eadd",
        "imageHash": "f67841b193a06eef9a06a9c1753748637ded8471b012fae6fc72bcab2a83f18a",
        "capturedAt": "2026-10-30T04:03:00.911Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 514
        },
        "state": "default"
      },
      "registry": "/r/file-upload-04.json"
    },
    {
      "id": "file-upload-05",
      "category": "file-upload",
      "name": "File Upload with Progress",
      "iframeHeight": "430px",
      "type": "file",
      "description": "File Upload with Progress. File selection, drag and drop, previews, and upload progress for a product workspace.",
      "tags": [
        "upload",
        "file",
        "dropzone",
        "media",
        "上传",
        "文件",
        "拖拽",
        "工作台"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Connect file validation and upload callbacks to your own service.",
        "Test long filenames, rejected files, and the empty state."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/file-upload/file-upload-05",
      "preview": "/preview/file-upload-05",
      "screenshot": "/previews/file-upload-05.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "file-upload-05",
        "image": "file-upload-05.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/label.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/file-upload/file-upload-05.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "65e32103cb87f36743e217e4fc00f67d176321eb10a482b1c11e9b9b96feb0f1",
        "imageHash": "2b8491889ca71562de6433225e28bbc79f9e76aa4384543eb520b1be9e7d63b7",
        "capturedAt": "2026-10-30T04:03:03.204Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 418
        },
        "state": "default"
      },
      "registry": "/r/file-upload-05.json"
    },
    {
      "id": "file-upload-06",
      "category": "file-upload",
      "name": "File Upload with Status Sections",
      "iframeHeight": "800px",
      "type": "file",
      "description": "File Upload with Status Sections. File selection, drag and drop, previews, and upload progress for a product workspace.",
      "tags": [
        "upload",
        "file",
        "dropzone",
        "media",
        "上传",
        "文件",
        "拖拽",
        "工作台"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Connect file validation and upload callbacks to your own service.",
        "Test long filenames, rejected files, and the empty state."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/file-upload/file-upload-06",
      "preview": "/preview/file-upload-06",
      "screenshot": "/previews/file-upload-06.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "file-upload-06",
        "image": "file-upload-06.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/progress.tsx",
          "components/ui/separator.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/file-upload/file-upload-06.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "3b02e8f17d0d5e0442b7585159102f19bfb7433d2c3a993f4b225564e1e87132",
        "imageHash": "4fbd86400466f6178fe9734b2c33b496c9ce9c06be30ffce54ae9b700cff6f87",
        "capturedAt": "2026-10-30T04:03:05.558Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 448
        },
        "state": "default"
      },
      "registry": "/r/file-upload-06.json"
    },
    {
      "id": "form-layout-01",
      "category": "form-layout",
      "name": "Form with Workspace Fields",
      "iframeHeight": "585px",
      "type": "file",
      "description": "Form with Workspace Fields. Structured product forms with labeled fields, preferences, and account settings.",
      "tags": [
        "form",
        "settings",
        "fields",
        "preferences",
        "表单",
        "设置",
        "输入",
        "账号"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Keep labels concise and place validation messages beside the relevant field.",
        "Replace sample handlers with your own save and validation logic."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/form-layout/form-layout-01",
      "preview": "/preview/form-layout-01",
      "screenshot": "/previews/form-layout-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "form-layout-01",
        "image": "form-layout-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/field.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/separator.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/form-layout/form-layout-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "4ecec99d02685cb9cc3062318e241acde7bbb1ee630af0a7d59440cbafc2a369",
        "imageHash": "d06dfcec21821d9116cae4187871ed9ccb40734d0deafdfd52e944a6bab6a388",
        "capturedAt": "2026-10-30T04:03:07.886Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 558
        },
        "state": "default"
      },
      "registry": "/r/form-layout-01.json"
    },
    {
      "id": "form-layout-02",
      "category": "form-layout",
      "name": "Form with Side Labels",
      "iframeHeight": "920px",
      "type": "file",
      "description": "Form with Side Labels. Structured product forms with labeled fields, preferences, and account settings.",
      "tags": [
        "form",
        "settings",
        "fields",
        "preferences",
        "表单",
        "设置",
        "输入",
        "账号"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Keep labels concise and place validation messages beside the relevant field.",
        "Replace sample handlers with your own save and validation logic."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/form-layout/form-layout-02",
      "preview": "/preview/form-layout-02",
      "screenshot": "/previews/form-layout-02.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "form-layout-02",
        "image": "form-layout-02.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/field.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/radio-group.tsx",
          "components/ui/select.tsx",
          "components/ui/separator.tsx",
          "components/ui/sonner.tsx",
          "components/ui/textarea.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/form-layout/form-layout-02.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "384fcb9402b3de38e021bf6f61f9f35d880721ee77fe1caf47a8c8bb9b1ed4fb",
        "imageHash": "11b783ffa173ace0d13eb826b65693d8d12783c4faabd435a389c42856ab72e2",
        "capturedAt": "2026-10-30T04:03:11.020Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 879
        },
        "state": "default"
      },
      "registry": "/r/form-layout-02.json"
    },
    {
      "id": "form-layout-03",
      "category": "form-layout",
      "name": "Form with Checkbox Settings",
      "iframeHeight": "1060px",
      "type": "file",
      "description": "Form with Checkbox Settings. Structured product forms with labeled fields, preferences, and account settings.",
      "tags": [
        "form",
        "settings",
        "fields",
        "preferences",
        "表单",
        "设置",
        "输入",
        "账号"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Keep labels concise and place validation messages beside the relevant field.",
        "Replace sample handlers with your own save and validation logic."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/form-layout/form-layout-03",
      "preview": "/preview/form-layout-03",
      "screenshot": "/previews/form-layout-03.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "form-layout-03",
        "image": "form-layout-03.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/checkbox.tsx",
          "components/ui/dialog.tsx",
          "components/ui/field.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/select.tsx",
          "components/ui/separator.tsx",
          "components/ui/sonner.tsx",
          "components/ui/textarea.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/form-layout/form-layout-03.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "167c86a533f9cd8df19fe5ca7b8b76ca7afafdf9cc3635f418185d8f56a5f8ac",
        "imageHash": "606c97e4656788cc60dc1797c3361eaad9aa9b9bad89c9424a2b2548a0413fba",
        "capturedAt": "2026-10-30T04:03:13.343Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 1025
        },
        "state": "default"
      },
      "registry": "/r/form-layout-03.json"
    },
    {
      "id": "form-layout-04",
      "category": "form-layout",
      "name": "Form with Package Selection",
      "iframeHeight": "800px",
      "type": "file",
      "description": "Form with Package Selection. Structured product forms with labeled fields, preferences, and account settings.",
      "tags": [
        "form",
        "settings",
        "fields",
        "preferences",
        "表单",
        "设置",
        "输入",
        "账号"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Keep labels concise and place validation messages beside the relevant field.",
        "Replace sample handlers with your own save and validation logic."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/form-layout/form-layout-04",
      "preview": "/preview/form-layout-04",
      "screenshot": "/previews/form-layout-04.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "form-layout-04",
        "image": "form-layout-04.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/field.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/radio-group.tsx",
          "components/ui/select.tsx",
          "components/ui/separator.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/form-layout/form-layout-04.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "2aaf480f0c4962e21352ad273b7f816bc5a3e8313074f47a8f07d3bf685e11fc",
        "imageHash": "69b2051c0bb073853f36f40b8f473426aa6eed717317cd80f1762cfbcdd1d7c0",
        "capturedAt": "2026-10-30T04:03:15.694Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 776
        },
        "state": "default"
      },
      "registry": "/r/form-layout-04.json"
    },
    {
      "id": "form-layout-05",
      "category": "form-layout",
      "name": "Form with Plan Selection",
      "iframeHeight": "1240px",
      "type": "file",
      "description": "Form with Plan Selection. Structured product forms with labeled fields, preferences, and account settings.",
      "tags": [
        "form",
        "settings",
        "fields",
        "preferences",
        "表单",
        "设置",
        "输入",
        "账号"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Keep labels concise and place validation messages beside the relevant field.",
        "Replace sample handlers with your own save and validation logic."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/form-layout/form-layout-05",
      "preview": "/preview/form-layout-05",
      "screenshot": "/previews/form-layout-05.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "form-layout-05",
        "image": "form-layout-05.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/badge.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/field.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/radio-group.tsx",
          "components/ui/select.tsx",
          "components/ui/separator.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/form-layout/form-layout-05.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "240cc02e94d03310870b540e3f3b4d7c5f2a78dfacd6c6c3da9d623a17861d85",
        "imageHash": "d9ae2a1bf35fde367e8f0e69fee813f32a796d7bb22a8f962cff9b092d91ff99",
        "capturedAt": "2026-10-30T04:03:18.162Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 1218
        },
        "state": "default"
      },
      "registry": "/r/form-layout-05.json"
    },
    {
      "id": "login-01",
      "category": "login",
      "name": "Login with Email and Google",
      "iframeHeight": "400px",
      "type": "file",
      "description": "Login with Email and Google. Authentication forms and account entry screens for SaaS applications.",
      "tags": [
        "login",
        "signup",
        "authentication",
        "account",
        "登录",
        "注册",
        "认证",
        "账号"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Connect your authentication provider before using in a live product.",
        "Test password errors, long email addresses, and keyboard submission."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/login/login-01",
      "preview": "/preview/login-01",
      "screenshot": "/previews/login-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "login-01",
        "image": "login-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/separator.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/login/login-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "bdddd2283aada96476bba043255fd2ed133a4c02cfa5ea3392eab85ec9dc8f86",
        "imageHash": "b8d658399bb468dac5b7d8729844eafa0f61387a8d2728436631b74f4bd69ea7",
        "capturedAt": "2026-10-30T04:03:20.467Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/login-01.json"
    },
    {
      "id": "login-02",
      "category": "login",
      "name": "Login with Email, Password and Google",
      "iframeHeight": "500px",
      "type": "file",
      "description": "Login with Email, Password and Google. Authentication forms and account entry screens for SaaS applications.",
      "tags": [
        "login",
        "signup",
        "authentication",
        "account",
        "登录",
        "注册",
        "认证",
        "账号"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Connect your authentication provider before using in a live product.",
        "Test password errors, long email addresses, and keyboard submission."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/login/login-02",
      "preview": "/preview/login-02",
      "screenshot": "/previews/login-02.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "login-02",
        "image": "login-02.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/separator.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/login/login-02.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "302042abc160d367de5b25e2b8887610c47f77afe173a344c178f4d11466b2ee",
        "imageHash": "ecc66f96b67f8c98cd394540fdcda65289e236dccdf3b7e9d909d14a7cb94e4f",
        "capturedAt": "2026-10-30T04:03:22.788Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/login-02.json"
    },
    {
      "id": "login-03",
      "category": "login",
      "name": "Login with Email and Password",
      "iframeHeight": "420px",
      "type": "file",
      "description": "Login with Email and Password. Authentication forms and account entry screens for SaaS applications.",
      "tags": [
        "login",
        "signup",
        "authentication",
        "account",
        "登录",
        "注册",
        "认证",
        "账号"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Connect your authentication provider before using in a live product.",
        "Test password errors, long email addresses, and keyboard submission."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/login/login-03",
      "preview": "/preview/login-03",
      "screenshot": "/previews/login-03.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "login-03",
        "image": "login-03.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/login/login-03.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "4b946b92e9d456bd25df0480d032fde8366bbc6b775559c1d22aff9ae78c0e81",
        "imageHash": "eff7d2294f79ca3a4fc28340af77bee737979d8a3afabd2b9551eff87cd8d95f",
        "capturedAt": "2026-10-30T04:03:25.164Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/login-03.json"
    },
    {
      "id": "login-04",
      "category": "login",
      "name": "Login with Social Buttons",
      "iframeHeight": "620px",
      "type": "file",
      "description": "Login with Social Buttons. Authentication forms and account entry screens for SaaS applications.",
      "tags": [
        "login",
        "signup",
        "authentication",
        "account",
        "登录",
        "注册",
        "认证",
        "账号"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Connect your authentication provider before using in a live product.",
        "Test password errors, long email addresses, and keyboard submission."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/login/login-04",
      "preview": "/preview/login-04",
      "screenshot": "/previews/login-04.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "login-04",
        "image": "login-04.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/separator.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/login/login-04.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "b93f6fe3bc46173e673bcd80273fe2fa45522411cd481ce452e19470705988fe",
        "imageHash": "0862e80e4702c19e2fcc19f3828dd3900df6a09c6d0cb0d59c4f1669758f72a3",
        "capturedAt": "2026-10-30T04:03:27.544Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/login-04.json"
    },
    {
      "id": "login-05",
      "category": "login",
      "name": "Login Card Signup Form",
      "iframeHeight": "750px",
      "type": "file",
      "description": "Login Card Signup Form. Authentication forms and account entry screens for SaaS applications.",
      "tags": [
        "login",
        "signup",
        "authentication",
        "account",
        "登录",
        "注册",
        "认证",
        "账号"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Connect your authentication provider before using in a live product.",
        "Test password errors, long email addresses, and keyboard submission."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/login/login-05",
      "preview": "/preview/login-05",
      "screenshot": "/previews/login-05.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "login-05",
        "image": "login-05.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/checkbox.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/login/login-05.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "d17a48a3cd001c13cfb8bb1475ebf96e1f60400344bae0a5b6941144e4252cc9",
        "imageHash": "fce17170165d4ce69a243b0e339be84fda949fe9a06fdb49a6771fc0887af1f5",
        "capturedAt": "2026-10-30T04:03:29.936Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/login-05.json"
    },
    {
      "id": "login-06",
      "category": "login",
      "name": "Login with Magic Link and SSO",
      "iframeHeight": "700px",
      "type": "file",
      "description": "Login with Magic Link and SSO. Authentication forms and account entry screens for SaaS applications.",
      "tags": [
        "login",
        "signup",
        "authentication",
        "account",
        "登录",
        "注册",
        "认证",
        "账号"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Connect your authentication provider before using in a live product.",
        "Test password errors, long email addresses, and keyboard submission."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/login/login-06",
      "preview": "/preview/login-06",
      "screenshot": "/previews/login-06.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "login-06",
        "image": "login-06.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/separator.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/login/login-06.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "d720e7bc4a90289fba044861289977aec93b12c264f759fafcaff5e128864dc1",
        "imageHash": "644e52ab10b55da26f8e6b785bf48e1e3eb242b7e3b1cbdcc7c1c7a4e26926ad",
        "capturedAt": "2026-10-30T04:03:32.304Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/login-06.json"
    },
    {
      "id": "login-07",
      "category": "login",
      "name": "Login Full Page with Icons",
      "iframeHeight": "700px",
      "type": "file",
      "description": "Login Full Page with Icons. Authentication forms and account entry screens for SaaS applications.",
      "tags": [
        "login",
        "signup",
        "authentication",
        "account",
        "登录",
        "注册",
        "认证",
        "账号"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Connect your authentication provider before using in a live product.",
        "Test password errors, long email addresses, and keyboard submission."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/login/login-07",
      "preview": "/preview/login-07",
      "screenshot": "/previews/login-07.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "login-07",
        "image": "login-07.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/checkbox.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/separator.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/login/login-07.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "b37abf684ec8442a6aa7ccc7d0c7094297a9b6312b8cdacda0453b9215b98c62",
        "imageHash": "75dadbad3a9104b9236a97d722040f3c93cbf556fca25f5c4032f28fba0bb91d",
        "capturedAt": "2026-10-30T04:03:34.760Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/login-07.json"
    },
    {
      "id": "login-08",
      "category": "login",
      "name": "Login with SSO",
      "iframeHeight": "680px",
      "type": "file",
      "description": "Login with SSO. Authentication forms and account entry screens for SaaS applications.",
      "tags": [
        "login",
        "signup",
        "authentication",
        "account",
        "登录",
        "注册",
        "认证",
        "账号"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f",
        "modifications": [
          "Replaced Next.js Link with standard anchors for framework-independent authentication UI."
        ]
      },
      "contentGuidelines": [
        "Connect your authentication provider before using in a live product.",
        "Test password errors, long email addresses, and keyboard submission."
      ],
      "recommendedWith": [],
      "version": "0.2.0",
      "url": "/login/login-08",
      "preview": "/preview/login-08",
      "screenshot": "/previews/login-08.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "login-08",
        "image": "login-08.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/checkbox.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/login/login-08.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "fad21a2f234296389de92be0e8abb9bedaa310b1652e4ac4eea3c81880f74333",
        "imageHash": "45b1b8b5829a3de3453115c96f797b065d43a302154fd2cf20778c15514dda75",
        "capturedAt": "2026-10-30T04:03:37.074Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/login-08.json"
    },
    {
      "id": "login-09",
      "category": "login",
      "name": "Login Signup with Role Selection",
      "iframeHeight": "880px",
      "type": "file",
      "description": "Login Signup with Role Selection. Authentication forms and account entry screens for SaaS applications.",
      "tags": [
        "login",
        "signup",
        "authentication",
        "account",
        "登录",
        "注册",
        "认证",
        "账号"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f",
        "modifications": [
          "Replaced Next.js Link with standard anchors for framework-independent authentication UI."
        ]
      },
      "contentGuidelines": [
        "Connect your authentication provider before using in a live product.",
        "Test password errors, long email addresses, and keyboard submission."
      ],
      "recommendedWith": [],
      "version": "0.2.0",
      "url": "/login/login-09",
      "preview": "/preview/login-09",
      "screenshot": "/previews/login-09.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "login-09",
        "image": "login-09.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/checkbox.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/select.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/login/login-09.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "e765fc26439a8eeff87acabbea74d37d8dc5da44942fbe021dd0662843e07efc",
        "imageHash": "0ca41797a20ccc2849d5d44788b6406ffa20f25a6978ca9891473f5dd5ebb982",
        "capturedAt": "2026-10-30T04:03:39.385Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/login-09.json"
    },
    {
      "id": "stats-01",
      "category": "stats",
      "name": "Stats with Trending",
      "iframeHeight": "200px",
      "type": "file",
      "description": "Stats with Trending. Product metrics, usage summaries, and dashboard statistics with clear visual hierarchy.",
      "tags": [
        "stats",
        "analytics",
        "metrics",
        "dashboard",
        "usage",
        "统计",
        "数据",
        "仪表盘",
        "用量"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Label the time window and units for every value.",
        "Test large values, negative trends, and missing data."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/stats/stats-01",
      "preview": "/preview/stats-01",
      "screenshot": "/previews/stats-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "stats-01",
        "image": "stats-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/stats/stats-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "4bcdb3f9b58ff478717e9155afdf5cc2697d71d8d80279076975b9ca44f04678",
        "imageHash": "537c38b16dd515e0ab8c531a7832ce49882283d152cc8a3197152414da4b613f",
        "capturedAt": "2026-10-30T04:03:42.711Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 192
        },
        "state": "default"
      },
      "registry": "/r/stats-01.json"
    },
    {
      "id": "stats-02",
      "category": "stats",
      "name": "Stats with Borders",
      "iframeHeight": "200px",
      "type": "file",
      "description": "Stats with Borders. Product metrics, usage summaries, and dashboard statistics with clear visual hierarchy.",
      "tags": [
        "stats",
        "analytics",
        "metrics",
        "dashboard",
        "usage",
        "统计",
        "数据",
        "仪表盘",
        "用量"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Label the time window and units for every value.",
        "Test large values, negative trends, and missing data."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/stats/stats-02",
      "preview": "/preview/stats-02",
      "screenshot": "/previews/stats-02.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "stats-02",
        "image": "stats-02.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/badge.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/stats/stats-02.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "2b740e7555908a95b67824e747fb8e27d90d1d8cae60788e37b0728a41317bdf",
        "imageHash": "bafb701851c53eee5b5cdc41b1c8f11aa2d43b6fcefed304126650641d0048b0",
        "capturedAt": "2026-10-30T04:03:45.011Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 188
        },
        "state": "default"
      },
      "registry": "/r/stats-02.json"
    },
    {
      "id": "stats-03",
      "category": "stats",
      "name": "Stats with Card Layout",
      "iframeHeight": "220px",
      "type": "file",
      "description": "Stats with Card Layout. Product metrics, usage summaries, and dashboard statistics with clear visual hierarchy.",
      "tags": [
        "stats",
        "analytics",
        "metrics",
        "dashboard",
        "usage",
        "统计",
        "数据",
        "仪表盘",
        "用量"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Label the time window and units for every value.",
        "Test large values, negative trends, and missing data."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/stats/stats-03",
      "preview": "/preview/stats-03",
      "screenshot": "/previews/stats-03.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "stats-03",
        "image": "stats-03.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/stats/stats-03.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "7473f675d7a2a41b2cebbc29a891fdf6f58573d06ea913a00fcb878dec548fa2",
        "imageHash": "fcd1d341b027d6416a98f987c4694f55da070d05505f10cc52d86f72cb3a7f06",
        "capturedAt": "2026-10-30T04:03:47.325Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 176
        },
        "state": "default"
      },
      "registry": "/r/stats-03.json"
    },
    {
      "id": "stats-04",
      "category": "stats",
      "name": "Stats with Badges",
      "iframeHeight": "200px",
      "type": "file",
      "description": "Stats with Badges. Product metrics, usage summaries, and dashboard statistics with clear visual hierarchy.",
      "tags": [
        "stats",
        "analytics",
        "metrics",
        "dashboard",
        "usage",
        "统计",
        "数据",
        "仪表盘",
        "用量"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Label the time window and units for every value.",
        "Test large values, negative trends, and missing data."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/stats/stats-04",
      "preview": "/preview/stats-04",
      "screenshot": "/previews/stats-04.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "stats-04",
        "image": "stats-04.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/badge.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/stats/stats-04.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "c6a318a068ad2947712c078923104adbebdbd4c522cb843170a6bd584d1a83cd",
        "imageHash": "36412cdb3b86be5936789849f5951b23db02f24f079e248e958a94dc528fa5e4",
        "capturedAt": "2026-10-30T04:03:49.625Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 176
        },
        "state": "default"
      },
      "registry": "/r/stats-04.json"
    },
    {
      "id": "stats-05",
      "category": "stats",
      "name": "Stats with Links",
      "iframeHeight": "240px",
      "type": "file",
      "description": "Stats with Links. Product metrics, usage summaries, and dashboard statistics with clear visual hierarchy.",
      "tags": [
        "stats",
        "analytics",
        "metrics",
        "dashboard",
        "usage",
        "统计",
        "数据",
        "仪表盘",
        "用量"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Label the time window and units for every value.",
        "Test large values, negative trends, and missing data."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/stats/stats-05",
      "preview": "/preview/stats-05",
      "screenshot": "/previews/stats-05.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "stats-05",
        "image": "stats-05.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/stats/stats-05.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "b257feefabcd793ac0f4a5c6c0b01f36f64167b139745ce133dc83236d07847d",
        "imageHash": "35f0b0b7a861f0dc70579786da2158d4fc5d353bd2e7edc1bb299a48fb8d1ac2",
        "capturedAt": "2026-10-30T04:03:52.002Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 234
        },
        "state": "default"
      },
      "registry": "/r/stats-05.json"
    },
    {
      "id": "stats-06",
      "category": "stats",
      "name": "Stats with Status",
      "iframeHeight": "360px",
      "type": "file",
      "description": "Stats with Status. Product metrics, usage summaries, and dashboard statistics with clear visual hierarchy.",
      "tags": [
        "stats",
        "analytics",
        "metrics",
        "dashboard",
        "usage",
        "统计",
        "数据",
        "仪表盘",
        "用量"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f",
        "modifications": [
          "Replaced Next.js Link with standard anchors; destinations remain controlled by the host application."
        ]
      },
      "contentGuidelines": [
        "Label the time window and units for every value.",
        "Test large values, negative trends, and missing data."
      ],
      "recommendedWith": [],
      "version": "0.2.0",
      "url": "/stats/stats-06",
      "preview": "/preview/stats-06",
      "screenshot": "/previews/stats-06.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "stats-06",
        "image": "stats-06.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/stats/stats-06.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "32c0f5082fb003ca705f2c0e409a67f7d7d296fe939fd13a5a8b793adc4afd7f",
        "imageHash": "a01781aabceeeb0ec4acb65d0648f009e0c0a00fabf4b60f1b62afb3ec9a28f0",
        "capturedAt": "2026-10-30T04:03:54.364Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 310
        },
        "state": "default"
      },
      "registry": "/r/stats-06.json"
    },
    {
      "id": "stats-07",
      "category": "stats",
      "name": "Stats with Circular Progress",
      "iframeHeight": "280px",
      "type": "file",
      "description": "Stats with Circular Progress. Product metrics, usage summaries, and dashboard statistics with clear visual hierarchy.",
      "tags": [
        "stats",
        "analytics",
        "metrics",
        "dashboard",
        "usage",
        "统计",
        "数据",
        "仪表盘",
        "用量"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f",
        "modifications": [
          "Replaced Next.js Link with standard anchors; destinations remain controlled by the host application."
        ]
      },
      "contentGuidelines": [
        "Label the time window and units for every value.",
        "Test large values, negative trends, and missing data."
      ],
      "recommendedWith": [],
      "version": "0.2.0",
      "url": "/stats/stats-07",
      "preview": "/preview/stats-07",
      "screenshot": "/previews/stats-07.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "stats-07",
        "image": "stats-07.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/chart.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/stats/stats-07.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "ca1aef0e9398e2fa9ee714400d91890771e3ecb6c904c3afb93e5a816283259f",
        "imageHash": "11b8d549cf6a8954e1d8ec0db4915a2d3f98b582570fc8b972e61432336a7559",
        "capturedAt": "2026-10-30T04:03:58.988Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 272
        },
        "state": "default"
      },
      "registry": "/r/stats-07.json"
    },
    {
      "id": "stats-08",
      "category": "stats",
      "name": "Stats with Circular Progress and Links",
      "iframeHeight": "240px",
      "type": "file",
      "description": "Stats with Circular Progress and Links. Product metrics, usage summaries, and dashboard statistics with clear visual hierarchy.",
      "tags": [
        "stats",
        "analytics",
        "metrics",
        "dashboard",
        "usage",
        "统计",
        "数据",
        "仪表盘",
        "用量"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Label the time window and units for every value.",
        "Test large values, negative trends, and missing data."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/stats/stats-08",
      "preview": "/preview/stats-08",
      "screenshot": "/previews/stats-08.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "stats-08",
        "image": "stats-08.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/chart.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/stats/stats-08.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "750a155c589d25594fbb9195b37ea01c8ff6eda97f56bbccc4e59a08b5b628bb",
        "imageHash": "888aba5a1cca2af29a147c9052d140c304a1be1e01f372f5a9c66dd03bdbdef3",
        "capturedAt": "2026-10-30T04:04:03.637Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 238
        },
        "state": "default"
      },
      "registry": "/r/stats-08.json"
    },
    {
      "id": "stats-09",
      "category": "stats",
      "name": "Stats with Progress",
      "iframeHeight": "230px",
      "type": "file",
      "description": "Stats with Progress. Product metrics, usage summaries, and dashboard statistics with clear visual hierarchy.",
      "tags": [
        "stats",
        "analytics",
        "metrics",
        "dashboard",
        "usage",
        "统计",
        "数据",
        "仪表盘",
        "用量"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Label the time window and units for every value.",
        "Test large values, negative trends, and missing data."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/stats/stats-09",
      "preview": "/preview/stats-09",
      "screenshot": "/previews/stats-09.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "stats-09",
        "image": "stats-09.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/progress.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/stats/stats-09.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "e9eb6426b25e020c4d7191f29db523c3a6d71ad623e425c05aa7a42955f0c190",
        "imageHash": "e115535046f45126c454685c2d7d987ab7eae2c8ac7fcc80c48fb882dd857785",
        "capturedAt": "2026-10-30T04:04:05.977Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 224
        },
        "state": "default"
      },
      "registry": "/r/stats-09.json"
    },
    {
      "id": "stats-10",
      "category": "stats",
      "name": "Stats with Area Chart",
      "iframeHeight": "220px",
      "type": "file",
      "description": "Stats with Area Chart. Product metrics, usage summaries, and dashboard statistics with clear visual hierarchy.",
      "tags": [
        "stats",
        "analytics",
        "metrics",
        "dashboard",
        "usage",
        "统计",
        "数据",
        "仪表盘",
        "用量"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Label the time window and units for every value.",
        "Test large values, negative trends, and missing data."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/stats/stats-10",
      "preview": "/preview/stats-10",
      "screenshot": "/previews/stats-10.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "stats-10",
        "image": "stats-10.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/chart.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/stats/stats-10.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "8ed961d78c5b6938fb808be13d96281ae4f455bdfb43893f6e6c5dde71ab6ca2",
        "imageHash": "6dcd4c577f6beafc57d65d4eb7e3fce05aca9ca78e8662e0055111b079b05bf1",
        "capturedAt": "2026-10-30T04:04:10.516Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 216
        },
        "state": "default"
      },
      "registry": "/r/stats-10.json"
    },
    {
      "id": "stats-11",
      "category": "stats",
      "name": "Stats Dashboard with Progress Bars",
      "iframeHeight": "280px",
      "type": "file",
      "description": "Stats Dashboard with Progress Bars. Product metrics, usage summaries, and dashboard statistics with clear visual hierarchy.",
      "tags": [
        "stats",
        "analytics",
        "metrics",
        "dashboard",
        "usage",
        "统计",
        "数据",
        "仪表盘",
        "用量"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Label the time window and units for every value.",
        "Test large values, negative trends, and missing data."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/stats/stats-11",
      "preview": "/preview/stats-11",
      "screenshot": "/previews/stats-11.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "stats-11",
        "image": "stats-11.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/stats/stats-11.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "f72f0b52700df25c9949094e6c7cacef437cd58434cf49e8d3c11e37178f22af",
        "imageHash": "cceeb149f7a18430fbb36ce6714242996e02b234efbce6daf713561c63c4e302",
        "capturedAt": "2026-10-30T04:04:12.866Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 180
        },
        "state": "default"
      },
      "registry": "/r/stats-11.json"
    },
    {
      "id": "stats-12",
      "category": "stats",
      "name": "Stats Usage Dashboard",
      "iframeHeight": "700px",
      "type": "file",
      "description": "Stats Usage Dashboard. Product metrics, usage summaries, and dashboard statistics with clear visual hierarchy.",
      "tags": [
        "stats",
        "analytics",
        "metrics",
        "dashboard",
        "usage",
        "统计",
        "数据",
        "仪表盘",
        "用量"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Label the time window and units for every value.",
        "Test large values, negative trends, and missing data."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/stats/stats-12",
      "preview": "/preview/stats-12",
      "screenshot": "/previews/stats-12.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "stats-12",
        "image": "stats-12.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/chart.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/stats/stats-12.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "43b61adf386b468bad61f3cb10920d822a5a98c43654fd409b7337f9f4f5ee4c",
        "imageHash": "25750fa957d92b838c1011fde4a24a53af677ffbae1d1f8906933abad3af2aaa",
        "capturedAt": "2026-10-30T04:04:17.484Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 488
        },
        "state": "default"
      },
      "registry": "/r/stats-12.json"
    },
    {
      "id": "stats-13",
      "category": "stats",
      "name": "Stats with Segmented Progress",
      "iframeHeight": "250px",
      "type": "file",
      "description": "Stats with Segmented Progress. Product metrics, usage summaries, and dashboard statistics with clear visual hierarchy.",
      "tags": [
        "stats",
        "analytics",
        "metrics",
        "dashboard",
        "usage",
        "统计",
        "数据",
        "仪表盘",
        "用量"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Label the time window and units for every value.",
        "Test large values, negative trends, and missing data."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/stats/stats-13",
      "preview": "/preview/stats-13",
      "screenshot": "/previews/stats-13.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "stats-13",
        "image": "stats-13.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/stats/stats-13.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "011de60b3222ea958beba2cd8179121dd4e2c4ac5f6c24466a7b3d37f0559a5c",
        "imageHash": "bb4faa7a2e7f920245d89b5ad54ac847eb2ae81cf380933507dc921516b88124",
        "capturedAt": "2026-10-30T04:04:19.798Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 118
        },
        "state": "default"
      },
      "registry": "/r/stats-13.json"
    },
    {
      "id": "stats-14",
      "category": "stats",
      "name": "Stats with Usage Breakdown",
      "iframeHeight": "400px",
      "type": "file",
      "description": "Stats with Usage Breakdown. Product metrics, usage summaries, and dashboard statistics with clear visual hierarchy.",
      "tags": [
        "stats",
        "analytics",
        "metrics",
        "dashboard",
        "usage",
        "统计",
        "数据",
        "仪表盘",
        "用量"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Label the time window and units for every value.",
        "Test large values, negative trends, and missing data."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/stats/stats-14",
      "preview": "/preview/stats-14",
      "screenshot": "/previews/stats-14.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "stats-14",
        "image": "stats-14.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/badge.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/stats/stats-14.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "253bdcf0a06966f54a7221108f63d93a6c9b884eacdac206d7d2851c89edbf3c",
        "imageHash": "8007cecabe00119c558f7c2e6e011494288ab974ad228364fc2166f108a025a1",
        "capturedAt": "2026-10-30T04:04:22.184Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 262
        },
        "state": "default"
      },
      "registry": "/r/stats-14.json"
    },
    {
      "id": "stats-15",
      "category": "stats",
      "name": "Stats with Value Breakdown",
      "iframeHeight": "280px",
      "type": "file",
      "description": "Stats with Value Breakdown. Product metrics, usage summaries, and dashboard statistics with clear visual hierarchy.",
      "tags": [
        "stats",
        "analytics",
        "metrics",
        "dashboard",
        "usage",
        "统计",
        "数据",
        "仪表盘",
        "用量"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Label the time window and units for every value.",
        "Test large values, negative trends, and missing data."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/stats/stats-15",
      "preview": "/preview/stats-15",
      "screenshot": "/previews/stats-15.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "stats-15",
        "image": "stats-15.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/stats/stats-15.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "30574e2f4893aa900d08088eaf4a6ae1503031ca0c62fc28b3b0310c3b36e4cc",
        "imageHash": "d14a99ab49c27d27cfc3daf5dc3dbb1a0039415ffaa290194ed6a5e514722cda",
        "capturedAt": "2026-10-30T04:04:24.544Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 174
        },
        "state": "default"
      },
      "registry": "/r/stats-15.json"
    },
    {
      "id": "grid-list-01",
      "category": "grid-list",
      "name": "Grid List with Dropdown",
      "iframeHeight": "200px",
      "type": "file",
      "description": "Grid List with Dropdown. Responsive resource grids and card lists for projects, workspaces, and collections.",
      "tags": [
        "grid",
        "list",
        "cards",
        "projects",
        "网格",
        "列表",
        "卡片",
        "项目"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use a consistent number of metadata fields per item.",
        "Test long resource names and the empty collection state."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/grid-list/grid-list-01",
      "preview": "/preview/grid-list-01",
      "screenshot": "/previews/grid-list-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "grid-list-01",
        "image": "grid-list-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/dropdown-menu.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/grid-list/grid-list-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "368c6a5f41ab5e383460aba8edb6ebec1acec8eeec67afabb6b8bc890dd8f85a",
        "imageHash": "e020c6709e557bf73fec5096f4e6585858cc13f67787e873dc5054e8c590da85",
        "capturedAt": "2026-10-30T04:04:26.930Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 152
        },
        "state": "default"
      },
      "registry": "/r/grid-list-01.json"
    },
    {
      "id": "grid-list-02",
      "category": "grid-list",
      "name": "Grid List with Links",
      "iframeHeight": "250px",
      "type": "file",
      "description": "Grid List with Links. Responsive resource grids and card lists for projects, workspaces, and collections.",
      "tags": [
        "grid",
        "list",
        "cards",
        "projects",
        "网格",
        "列表",
        "卡片",
        "项目"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use a consistent number of metadata fields per item.",
        "Test long resource names and the empty collection state."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/grid-list/grid-list-02",
      "preview": "/preview/grid-list-02",
      "screenshot": "/previews/grid-list-02.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "grid-list-02",
        "image": "grid-list-02.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/avatar.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/grid-list/grid-list-02.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "bad7d96d7cf7107d96e3e6f347a02a638171246afefd145896d7dfe5eb6fbfa9",
        "imageHash": "fc9352f3486eb854dd25d8af57ebc6fb9e46e636b665b08ec20672dc99cbc1ce",
        "capturedAt": "2026-10-30T04:04:29.267Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 228
        },
        "state": "default"
      },
      "registry": "/r/grid-list-02.json"
    },
    {
      "id": "grid-list-03",
      "category": "grid-list",
      "name": "Grid List with Icons",
      "iframeHeight": "500px",
      "type": "file",
      "description": "Grid List with Icons. Responsive resource grids and card lists for projects, workspaces, and collections.",
      "tags": [
        "grid",
        "list",
        "cards",
        "projects",
        "网格",
        "列表",
        "卡片",
        "项目"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use a consistent number of metadata fields per item.",
        "Test long resource names and the empty collection state."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/grid-list/grid-list-03",
      "preview": "/preview/grid-list-03",
      "screenshot": "/previews/grid-list-03.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "grid-list-03",
        "image": "grid-list-03.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/card.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/grid-list/grid-list-03.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "ad283a85e2e225a470440be445b9d8b4fce96d7ebe1fb2e5d3cca33e71b0eb14",
        "imageHash": "86198a126391acc74c3ddc98c14b9d038dc9be6864936edb913b47273ceafec6",
        "capturedAt": "2026-10-30T04:04:31.650Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 438
        },
        "state": "default"
      },
      "registry": "/r/grid-list-03.json"
    },
    {
      "id": "command-menu-01",
      "category": "command-menu",
      "name": "Command Menu with Groups",
      "iframeHeight": "550px",
      "type": "file",
      "description": "Command Menu with Groups. Keyboard-friendly command palettes for navigation, search, and quick actions.",
      "tags": [
        "command",
        "search",
        "palette",
        "keyboard",
        "命令",
        "搜索",
        "快捷键"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Give each command a clear label and an actual destination or action.",
        "Verify shortcuts do not conflict with browser or form behavior."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/command-menu/command-menu-01",
      "preview": "/preview/command-menu-01",
      "screenshot": "/previews/command-menu-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "command-menu-01",
        "image": "command-menu-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/command.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input-group.tsx",
          "components/ui/input.tsx",
          "components/ui/kbd.tsx",
          "components/ui/sonner.tsx",
          "components/ui/textarea.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/command-menu/command-menu-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "abbf2f0c6fd16f7d995056627b1b67655e51b8979ec673ab1bb9e88e06fb34f3",
        "imageHash": "c9b6e102d69bf42491d2a3567c10f83d479ba19de09ef051ad5df18c8862ea3b",
        "capturedAt": "2026-10-30T04:04:34.076Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default-open"
      },
      "registry": "/r/command-menu-01.json"
    },
    {
      "id": "command-menu-02",
      "category": "command-menu",
      "name": "Command Menu with Keyboard Shortcuts",
      "iframeHeight": "650px",
      "type": "file",
      "description": "Command Menu with Keyboard Shortcuts. Keyboard-friendly command palettes for navigation, search, and quick actions.",
      "tags": [
        "command",
        "search",
        "palette",
        "keyboard",
        "命令",
        "搜索",
        "快捷键"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Give each command a clear label and an actual destination or action.",
        "Verify shortcuts do not conflict with browser or form behavior."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/command-menu/command-menu-02",
      "preview": "/preview/command-menu-02",
      "screenshot": "/previews/command-menu-02.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "command-menu-02",
        "image": "command-menu-02.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/command.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input-group.tsx",
          "components/ui/input.tsx",
          "components/ui/kbd.tsx",
          "components/ui/sonner.tsx",
          "components/ui/textarea.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/command-menu/command-menu-02.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "b0572f3e14f66d31e734cb4d1c86b077fa2b83daf9cdca139808df0a810a95c5",
        "imageHash": "2904640aab770eb0478a6e76a69e2769c9ade86e4d135913165b293869fdb50a",
        "capturedAt": "2026-10-30T04:04:36.435Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default-open"
      },
      "registry": "/r/command-menu-02.json"
    },
    {
      "id": "command-menu-03",
      "category": "command-menu",
      "name": "Command Menu with Documentation Search",
      "iframeHeight": "550px",
      "type": "file",
      "description": "Command Menu with Documentation Search. Keyboard-friendly command palettes for navigation, search, and quick actions.",
      "tags": [
        "command",
        "search",
        "palette",
        "keyboard",
        "命令",
        "搜索",
        "快捷键"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f",
        "modifications": [
          "Replaced Next.js navigation with an optional onNavigate callback. The standalone demo displays the selected destination without visiting fictional routes."
        ]
      },
      "contentGuidelines": [
        "Give each command a clear label and an actual destination or action.",
        "Verify shortcuts do not conflict with browser or form behavior.",
        "Pass onNavigate(href) to connect the command palette to your host router. Without it, navigation selections only display their demo destination."
      ],
      "recommendedWith": [],
      "version": "0.2.0",
      "url": "/command-menu/command-menu-03",
      "preview": "/preview/command-menu-03",
      "screenshot": "/previews/command-menu-03.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "command-menu-03",
        "image": "command-menu-03.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/command.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input-group.tsx",
          "components/ui/input.tsx",
          "components/ui/kbd.tsx",
          "components/ui/sonner.tsx",
          "components/ui/textarea.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/command-menu/command-menu-03.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "dbb29c54f8ca3019e1e74a1a62d334572e1e499bef590b40ee8a5fe3b7f35249",
        "imageHash": "6ffd0fee21159bfade4aaa9cf9d6827b7ffc0a0c896dd5d21b4cc242b8a20851",
        "capturedAt": "2026-10-30T04:04:39.603Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default-open"
      },
      "registry": "/r/command-menu-03.json"
    },
    {
      "id": "command-menu-04",
      "category": "command-menu",
      "name": "Command Menu with Global Search",
      "iframeHeight": "650px",
      "type": "file",
      "description": "Command Menu with Global Search. Keyboard-friendly command palettes for navigation, search, and quick actions.",
      "tags": [
        "command",
        "search",
        "palette",
        "keyboard",
        "命令",
        "搜索",
        "快捷键"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Give each command a clear label and an actual destination or action.",
        "Verify shortcuts do not conflict with browser or form behavior."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/command-menu/command-menu-04",
      "preview": "/preview/command-menu-04",
      "screenshot": "/previews/command-menu-04.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "command-menu-04",
        "image": "command-menu-04.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/command.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input-group.tsx",
          "components/ui/input.tsx",
          "components/ui/sonner.tsx",
          "components/ui/textarea.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/command-menu/command-menu-04.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "37de1160854b1e965d24f0f2fad56ca6503e2b41481a366ea9479dde53f9f04b",
        "imageHash": "a327033aaaead0ebc9b06f0234a46ba8faf15c06bdb25b3c0b013249551fe8b2",
        "capturedAt": "2026-10-30T04:04:41.931Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default-open"
      },
      "registry": "/r/command-menu-04.json"
    },
    {
      "id": "dialog-01",
      "category": "dialogs",
      "name": "Dialog Confirmation",
      "iframeHeight": "350px",
      "type": "file",
      "description": "Dialog Confirmation. Focused modal dialogs for confirmations, editing, and multi-step product actions.",
      "tags": [
        "dialog",
        "modal",
        "confirmation",
        "弹窗",
        "对话框",
        "确认",
        "编辑"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use one primary action and a clear cancel path.",
        "Connect actions to product logic and verify keyboard focus behavior."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/dialogs/dialog-01",
      "preview": "/preview/dialog-01",
      "screenshot": "/previews/dialog-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "dialog-01",
        "image": "dialog-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/dialogs/dialog-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "e2dac12148ab11fcd809aebb154043d4410cefa4b13e4d9a25490ae2dfaadb7e",
        "imageHash": "b0071972c42f3c7a77099e71779dc3486be32ebed0101e0119bbfb1fe5aca5be",
        "capturedAt": "2026-10-30T04:04:44.274Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default-open"
      },
      "registry": "/r/dialog-01.json"
    },
    {
      "id": "dialog-02",
      "category": "dialogs",
      "name": "Dialog with Warning Icon",
      "iframeHeight": "350px",
      "type": "file",
      "description": "Dialog with Warning Icon. Focused modal dialogs for confirmations, editing, and multi-step product actions.",
      "tags": [
        "dialog",
        "modal",
        "confirmation",
        "弹窗",
        "对话框",
        "确认",
        "编辑"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use one primary action and a clear cancel path.",
        "Connect actions to product logic and verify keyboard focus behavior."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/dialogs/dialog-02",
      "preview": "/preview/dialog-02",
      "screenshot": "/previews/dialog-02.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "dialog-02",
        "image": "dialog-02.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/dialogs/dialog-02.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "4946c35504bc8e9f1331bb0f352fda7f4e0c4df790cb2730827c2c02fcb16627",
        "imageHash": "0fa61e9c066fdbd05db49ee7ff35b45ca401786aa6a71414b07431e40568bc85",
        "capturedAt": "2026-10-30T04:04:46.583Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default-open"
      },
      "registry": "/r/dialog-02.json"
    },
    {
      "id": "dialog-03",
      "category": "dialogs",
      "name": "Dialog with Input Field",
      "iframeHeight": "400px",
      "type": "file",
      "description": "Dialog with Input Field. Focused modal dialogs for confirmations, editing, and multi-step product actions.",
      "tags": [
        "dialog",
        "modal",
        "confirmation",
        "弹窗",
        "对话框",
        "确认",
        "编辑"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use one primary action and a clear cancel path.",
        "Connect actions to product logic and verify keyboard focus behavior."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/dialogs/dialog-03",
      "preview": "/preview/dialog-03",
      "screenshot": "/previews/dialog-03.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "dialog-03",
        "image": "dialog-03.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/dialogs/dialog-03.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "720c456fcb2c4ff9de10240abffa2df302ebef136754a33a99986e16ef998c15",
        "imageHash": "5b688710c4ac57180f776c483c346c040f19b2572162da96f20a492af260affa",
        "capturedAt": "2026-10-30T04:04:48.884Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default-open"
      },
      "registry": "/r/dialog-03.json"
    },
    {
      "id": "dialog-04",
      "category": "dialogs",
      "name": "Dialog with Two Buttons",
      "iframeHeight": "350px",
      "type": "file",
      "description": "Dialog with Two Buttons. Focused modal dialogs for confirmations, editing, and multi-step product actions.",
      "tags": [
        "dialog",
        "modal",
        "confirmation",
        "弹窗",
        "对话框",
        "确认",
        "编辑"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use one primary action and a clear cancel path.",
        "Connect actions to product logic and verify keyboard focus behavior."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/dialogs/dialog-04",
      "preview": "/preview/dialog-04",
      "screenshot": "/previews/dialog-04.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "dialog-04",
        "image": "dialog-04.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/dialogs/dialog-04.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "b8cd50749e87975c6aad024ef0de5fbea86a6c78a583e9644a99c51106482603",
        "imageHash": "97458e0e2126017ff28af0b4c84ff6411c8682e29de2b7d6cff45845476d1ad9",
        "capturedAt": "2026-10-30T04:04:51.177Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default-open"
      },
      "registry": "/r/dialog-04.json"
    },
    {
      "id": "dialog-05",
      "category": "dialogs",
      "name": "Dialog with Password Confirmation",
      "iframeHeight": "400px",
      "type": "file",
      "description": "Dialog with Password Confirmation. Focused modal dialogs for confirmations, editing, and multi-step product actions.",
      "tags": [
        "dialog",
        "modal",
        "confirmation",
        "弹窗",
        "对话框",
        "确认",
        "编辑"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use one primary action and a clear cancel path.",
        "Connect actions to product logic and verify keyboard focus behavior."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/dialogs/dialog-05",
      "preview": "/preview/dialog-05",
      "screenshot": "/previews/dialog-05.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "dialog-05",
        "image": "dialog-05.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/alert-dialog.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/dialogs/dialog-05.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "ac55af89fced0171e09483dfd7f5604fb663d7d64d60133d22702bf660f0714a",
        "imageHash": "5a21df9e5a1a1d846b8ba95d835afed3636b818077023cda057d7b2ac075ba17",
        "capturedAt": "2026-10-30T04:04:53.551Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default-open"
      },
      "registry": "/r/dialog-05.json"
    },
    {
      "id": "dialog-06",
      "category": "dialogs",
      "name": "Dialog with Privacy Toggle",
      "iframeHeight": "450px",
      "type": "file",
      "description": "Dialog with Privacy Toggle. Focused modal dialogs for confirmations, editing, and multi-step product actions.",
      "tags": [
        "dialog",
        "modal",
        "confirmation",
        "弹窗",
        "对话框",
        "确认",
        "编辑"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use one primary action and a clear cancel path.",
        "Connect actions to product logic and verify keyboard focus behavior."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/dialogs/dialog-06",
      "preview": "/preview/dialog-06",
      "screenshot": "/previews/dialog-06.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "dialog-06",
        "image": "dialog-06.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/sonner.tsx",
          "components/ui/switch.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/dialogs/dialog-06.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "414b67ea83e206052f4a6447855160486a4071d1d6a2f26be5ad91cd38331bfb",
        "imageHash": "23c1f824cfd36e60b4cdd39464521e5dac0e8656926a2cb639120cfa7d30878e",
        "capturedAt": "2026-10-30T04:04:55.905Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default-open"
      },
      "registry": "/r/dialog-06.json"
    },
    {
      "id": "dialog-07",
      "category": "dialogs",
      "name": "Dialog with Member List",
      "iframeHeight": "450px",
      "type": "file",
      "description": "Dialog with Member List. Focused modal dialogs for confirmations, editing, and multi-step product actions.",
      "tags": [
        "dialog",
        "modal",
        "confirmation",
        "弹窗",
        "对话框",
        "确认",
        "编辑"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use one primary action and a clear cancel path.",
        "Connect actions to product logic and verify keyboard focus behavior."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/dialogs/dialog-07",
      "preview": "/preview/dialog-07",
      "screenshot": "/previews/dialog-07.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "dialog-07",
        "image": "dialog-07.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/alert-dialog.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/dialogs/dialog-07.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "724e3a82930ce7a8592e813de8bd67c60ae33ec8dd273c11298988a549d73dd5",
        "imageHash": "36915223a7d8908c12b922f58b7102e95cc79471e2caa0332020763edabad1e5",
        "capturedAt": "2026-10-30T04:04:58.234Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default-open"
      },
      "registry": "/r/dialog-07.json"
    },
    {
      "id": "dialog-08",
      "category": "dialogs",
      "name": "Dialog with Email and Password Fields",
      "iframeHeight": "600px",
      "type": "file",
      "description": "Dialog with Email and Password Fields. Focused modal dialogs for confirmations, editing, and multi-step product actions.",
      "tags": [
        "dialog",
        "modal",
        "confirmation",
        "弹窗",
        "对话框",
        "确认",
        "编辑"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use one primary action and a clear cancel path.",
        "Connect actions to product logic and verify keyboard focus behavior."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/dialogs/dialog-08",
      "preview": "/preview/dialog-08",
      "screenshot": "/previews/dialog-08.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "dialog-08",
        "image": "dialog-08.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/avatar.tsx",
          "components/ui/badge.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/dialogs/dialog-08.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "69ee99026c38050c05514edb7185aa518af6d8ce794891d77893d3d094790a90",
        "imageHash": "6a32de55ea0d62231ac677dcd5a1602a8d42b740d15b782bd317fbb67960c82f",
        "capturedAt": "2026-10-30T04:05:00.549Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default-open"
      },
      "registry": "/r/dialog-08.json"
    },
    {
      "id": "dialog-09",
      "category": "dialogs",
      "name": "Dialog with Link Share and Toggles",
      "iframeHeight": "350px",
      "type": "file",
      "description": "Dialog with Link Share and Toggles. Focused modal dialogs for confirmations, editing, and multi-step product actions.",
      "tags": [
        "dialog",
        "modal",
        "confirmation",
        "弹窗",
        "对话框",
        "确认",
        "编辑"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use one primary action and a clear cancel path.",
        "Connect actions to product logic and verify keyboard focus behavior."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/dialogs/dialog-09",
      "preview": "/preview/dialog-09",
      "screenshot": "/previews/dialog-09.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "dialog-09",
        "image": "dialog-09.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/sonner.tsx",
          "components/ui/switch.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/dialogs/dialog-09.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "641a1ea67fa7efa03887988b58dc77c4f3e19ecc5b0a7f6c2d1a7d96a0a58bc7",
        "imageHash": "a6caaf948aa8306c31e7781217fe9d9fced925d6a3e38acfe47d894bbc6bbaf2",
        "capturedAt": "2026-10-30T04:05:02.873Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default-open"
      },
      "registry": "/r/dialog-09.json"
    },
    {
      "id": "dialog-10",
      "category": "dialogs",
      "name": "Dialog with Calendar and Time Picker",
      "iframeHeight": "750px",
      "type": "file",
      "description": "Dialog with Calendar and Time Picker. Focused modal dialogs for confirmations, editing, and multi-step product actions.",
      "tags": [
        "dialog",
        "modal",
        "confirmation",
        "弹窗",
        "对话框",
        "确认",
        "编辑"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use one primary action and a clear cancel path.",
        "Connect actions to product logic and verify keyboard focus behavior."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/dialogs/dialog-10",
      "preview": "/preview/dialog-10",
      "screenshot": "/previews/dialog-10.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "dialog-10",
        "image": "dialog-10.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/calendar.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/popover.tsx",
          "components/ui/select.tsx",
          "components/ui/sonner.tsx",
          "components/ui/textarea.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/dialogs/dialog-10.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "91788c5b36d0ac3bc9571ee4d5029b2e3754e2141ef2924ba5678da0e73ec336",
        "imageHash": "218a15e299182f29543c9a222d07376dfce103ffbb6cc9e8e0aada5355032242",
        "capturedAt": "2026-10-30T04:05:05.181Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default-open"
      },
      "registry": "/r/dialog-10.json"
    },
    {
      "id": "dialog-11",
      "category": "dialogs",
      "name": "Dialog Multi-Step Wizard",
      "iframeHeight": "650px",
      "type": "file",
      "description": "Dialog Multi-Step Wizard. Focused modal dialogs for confirmations, editing, and multi-step product actions.",
      "tags": [
        "dialog",
        "modal",
        "confirmation",
        "弹窗",
        "对话框",
        "确认",
        "编辑"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use one primary action and a clear cancel path.",
        "Connect actions to product logic and verify keyboard focus behavior."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/dialogs/dialog-11",
      "preview": "/preview/dialog-11",
      "screenshot": "/previews/dialog-11.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "dialog-11",
        "image": "dialog-11.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/label.tsx",
          "components/ui/select.tsx",
          "components/ui/separator.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/dialogs/dialog-11.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "6212e51506ba81eb3fc4789437995741396dff5c3da28182ffe4ce84abf28d33",
        "imageHash": "2caa3ecad5fb4ac8b0462d89f212a354d76caab426c34007d0e9dfdf5bd031b8",
        "capturedAt": "2026-10-30T04:05:07.453Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default-open"
      },
      "registry": "/r/dialog-11.json"
    },
    {
      "id": "dialog-12",
      "category": "dialogs",
      "name": "Dialog with Avatar Upload",
      "iframeHeight": "650px",
      "type": "file",
      "description": "Dialog with Avatar Upload. Focused modal dialogs for confirmations, editing, and multi-step product actions.",
      "tags": [
        "dialog",
        "modal",
        "confirmation",
        "弹窗",
        "对话框",
        "确认",
        "编辑"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use one primary action and a clear cancel path.",
        "Connect actions to product logic and verify keyboard focus behavior."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/dialogs/dialog-12",
      "preview": "/preview/dialog-12",
      "screenshot": "/previews/dialog-12.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "dialog-12",
        "image": "dialog-12.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/avatar.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/dialogs/dialog-12.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "7a067d17944db71e04fd91976eb6bf2b09163d67c310a3557b41af0904a66f9b",
        "imageHash": "1a1ee9b8b4e18e69ad17e08e3a564fcee720809d9b2b33c20aac88f88eaef18b",
        "capturedAt": "2026-10-30T04:05:09.779Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default-open"
      },
      "registry": "/r/dialog-12.json"
    },
    {
      "id": "sidebar-01",
      "category": "sidebar",
      "name": "Sidebar Collapsible Sections",
      "iframeHeight": "1000px",
      "type": "directory",
      "description": "Sidebar Collapsible Sections. Application navigation shells with collapsible sidebars and responsive workspace layouts.",
      "tags": [
        "sidebar",
        "navigation",
        "shell",
        "dashboard",
        "侧栏",
        "导航",
        "布局",
        "后台"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Replace sample destinations and resource data with real routes.",
        "Keep top-level navigation short and verify the mobile drawer."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/sidebar/sidebar-01",
      "preview": "/preview/sidebar-01",
      "screenshot": "/previews/sidebar-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "sidebar-01",
        "image": "sidebar-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/avatar.tsx",
          "components/ui/button.tsx",
          "components/ui/collapsible.tsx",
          "components/ui/command.tsx",
          "components/ui/dialog.tsx",
          "components/ui/dropdown-menu.tsx",
          "components/ui/input-group.tsx",
          "components/ui/input.tsx",
          "components/ui/separator.tsx",
          "components/ui/sheet.tsx",
          "components/ui/sidebar.tsx",
          "components/ui/skeleton.tsx",
          "components/ui/sonner.tsx",
          "components/ui/textarea.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/sidebar/sidebar-01/app-sidebar.tsx",
          "content/components/sidebar/sidebar-01/index.tsx",
          "content/components/sidebar/sidebar-01/nav-collapsible.tsx",
          "content/components/sidebar/sidebar-01/nav-footer.tsx",
          "content/components/sidebar/sidebar-01/nav-header.tsx",
          "content/components/sidebar/sidebar-01/nav-main.tsx",
          "content/components/sidebar/sidebar-01/types.ts",
          "content/declarations.ts",
          "hooks/use-mobile.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/avatar-01.png",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "b71eea08e12bc309de6653fb0161023e49581a301aaf32fa450f74bcb2f4f75c",
        "imageHash": "34bbf43a72d83ca06626a9850bca4a836b3c40974fc0a322ed92f9dd2a0c7ccb",
        "capturedAt": "2026-10-30T04:05:12.167Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/sidebar-01.json"
    },
    {
      "id": "sidebar-02",
      "category": "sidebar",
      "name": "Sidebar Dashboard Inset",
      "iframeHeight": "1000px",
      "type": "directory",
      "description": "Sidebar Dashboard Inset. Application navigation shells with collapsible sidebars and responsive workspace layouts.",
      "tags": [
        "sidebar",
        "navigation",
        "shell",
        "dashboard",
        "侧栏",
        "导航",
        "布局",
        "后台"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f",
        "modifications": [
          "Replaced Next.js Link and route prefetching with standard anchors in the navigation component."
        ]
      },
      "contentGuidelines": [
        "Replace sample destinations and resource data with real routes.",
        "Keep top-level navigation short and verify the mobile drawer."
      ],
      "recommendedWith": [],
      "version": "0.2.0",
      "url": "/sidebar/sidebar-02",
      "preview": "/preview/sidebar-02",
      "screenshot": "/previews/sidebar-02.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "sidebar-02",
        "image": "sidebar-02.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/avatar.tsx",
          "components/ui/button.tsx",
          "components/ui/collapsible.tsx",
          "components/ui/dialog.tsx",
          "components/ui/dropdown-menu.tsx",
          "components/ui/input.tsx",
          "components/ui/separator.tsx",
          "components/ui/sheet.tsx",
          "components/ui/sidebar.tsx",
          "components/ui/skeleton.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/sidebar/sidebar-02/app-sidebar.tsx",
          "content/components/sidebar/sidebar-02/index.tsx",
          "content/components/sidebar/sidebar-02/logo.tsx",
          "content/components/sidebar/sidebar-02/nav-main.tsx",
          "content/components/sidebar/sidebar-02/nav-notifications.tsx",
          "content/components/sidebar/sidebar-02/team-switcher.tsx",
          "content/declarations.ts",
          "hooks/use-mobile.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "e8eefd22a20b8542332938e61e17e9318cb487fa4a82d61ffba11b0e3751c76a",
        "imageHash": "00aef835103b002a679cd2f48e60e912e03ca127776c1507150a61c3a66dff36",
        "capturedAt": "2026-10-30T04:05:14.561Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/sidebar-02.json"
    },
    {
      "id": "sidebar-03",
      "category": "sidebar",
      "name": "Sidebar Dashboard Floating",
      "iframeHeight": "1000px",
      "type": "directory",
      "description": "Sidebar Dashboard Floating. Application navigation shells with collapsible sidebars and responsive workspace layouts.",
      "tags": [
        "sidebar",
        "navigation",
        "shell",
        "dashboard",
        "侧栏",
        "导航",
        "布局",
        "后台"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f",
        "modifications": [
          "Replaced Next.js Link and route prefetching with standard anchors in the navigation component."
        ]
      },
      "contentGuidelines": [
        "Replace sample destinations and resource data with real routes.",
        "Keep top-level navigation short and verify the mobile drawer."
      ],
      "recommendedWith": [],
      "version": "0.2.0",
      "url": "/sidebar/sidebar-03",
      "preview": "/preview/sidebar-03",
      "screenshot": "/previews/sidebar-03.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "sidebar-03",
        "image": "sidebar-03.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/avatar.tsx",
          "components/ui/button.tsx",
          "components/ui/collapsible.tsx",
          "components/ui/dialog.tsx",
          "components/ui/dropdown-menu.tsx",
          "components/ui/input.tsx",
          "components/ui/separator.tsx",
          "components/ui/sheet.tsx",
          "components/ui/sidebar.tsx",
          "components/ui/skeleton.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/sidebar/sidebar-03/app-sidebar.tsx",
          "content/components/sidebar/sidebar-03/index.tsx",
          "content/components/sidebar/sidebar-03/logo.tsx",
          "content/components/sidebar/sidebar-03/nav-main.tsx",
          "content/components/sidebar/sidebar-03/nav-notifications.tsx",
          "content/components/sidebar/sidebar-03/team-switcher.tsx",
          "content/declarations.ts",
          "hooks/use-mobile.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "b6bdfc1271433342d0ee679c3db64cde6bf5030f673d66a7513f1be6d6885b29",
        "imageHash": "5573e7db38ece0a474463f1bbddd3ad470595faf3a308e37d99c65de3583274e",
        "capturedAt": "2026-10-30T04:05:16.883Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/sidebar-03.json"
    },
    {
      "id": "sidebar-04",
      "category": "sidebar",
      "name": "Sidebar Double-Sided Mail",
      "iframeHeight": "1000px",
      "type": "directory",
      "description": "Sidebar Double-Sided Mail. Application navigation shells with collapsible sidebars and responsive workspace layouts.",
      "tags": [
        "sidebar",
        "navigation",
        "shell",
        "dashboard",
        "侧栏",
        "导航",
        "布局",
        "后台"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Replace sample destinations and resource data with real routes.",
        "Keep top-level navigation short and verify the mobile drawer."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/sidebar/sidebar-04",
      "preview": "/preview/sidebar-04",
      "screenshot": "/previews/sidebar-04.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "sidebar-04",
        "image": "sidebar-04.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/avatar.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/dropdown-menu.tsx",
          "components/ui/input.tsx",
          "components/ui/separator.tsx",
          "components/ui/sheet.tsx",
          "components/ui/sidebar.tsx",
          "components/ui/skeleton.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/sidebar/sidebar-04/app-sidebar.tsx",
          "content/components/sidebar/sidebar-04/app/page.tsx",
          "content/components/sidebar/sidebar-04/mail-context.tsx",
          "content/components/sidebar/sidebar-04/nav-user.tsx",
          "content/declarations.ts",
          "hooks/use-mobile.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/avatar-01.png",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "ae4d70f41ad7e1b92c753c41091bd7e126c4689b267694e63f26d9141d8ed536",
        "imageHash": "3c7b2b73cc1d297b144cf9296901e6f2f80f7d045cac79625e75d90a032c4e39",
        "capturedAt": "2026-10-30T04:05:19.285Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/sidebar-04.json"
    },
    {
      "id": "sidebar-05",
      "category": "sidebar",
      "name": "Sidebar Double-Sided",
      "iframeHeight": "1000px",
      "type": "directory",
      "description": "Sidebar Double-Sided. Application navigation shells with collapsible sidebars and responsive workspace layouts.",
      "tags": [
        "sidebar",
        "navigation",
        "shell",
        "dashboard",
        "侧栏",
        "导航",
        "布局",
        "后台"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Replace sample destinations and resource data with real routes.",
        "Keep top-level navigation short and verify the mobile drawer."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/sidebar/sidebar-05",
      "preview": "/preview/sidebar-05",
      "screenshot": "/previews/sidebar-05.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "sidebar-05",
        "image": "sidebar-05.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/avatar.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/dropdown-menu.tsx",
          "components/ui/input.tsx",
          "components/ui/separator.tsx",
          "components/ui/sheet.tsx",
          "components/ui/sidebar.tsx",
          "components/ui/skeleton.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/sidebar/sidebar-05/app-sidebar.tsx",
          "content/components/sidebar/sidebar-05/app/page.tsx",
          "content/components/sidebar/sidebar-05/team-switcher.tsx",
          "content/declarations.ts",
          "hooks/use-mobile.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/avatar-01.png",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "b601ce691f912c2274a628d3570436748db83370dfd2c37f97d2962ecfc2e965",
        "imageHash": "bbfbe9fee611abeb84379d4bd5ccc207c4877536901841efe2be78a8a7ea971c",
        "capturedAt": "2026-10-30T04:05:21.676Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/sidebar-05.json"
    },
    {
      "id": "sidebar-06",
      "category": "sidebar",
      "name": "Sidebar Replacement",
      "iframeHeight": "1000px",
      "type": "directory",
      "description": "Sidebar Replacement. Application navigation shells with collapsible sidebars and responsive workspace layouts.",
      "tags": [
        "sidebar",
        "navigation",
        "shell",
        "dashboard",
        "侧栏",
        "导航",
        "布局",
        "后台"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Replace sample destinations and resource data with real routes.",
        "Keep top-level navigation short and verify the mobile drawer."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/sidebar/sidebar-06",
      "preview": "/preview/sidebar-06",
      "screenshot": "/previews/sidebar-06.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "sidebar-06",
        "image": "sidebar-06.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/avatar.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/dropdown-menu.tsx",
          "components/ui/input.tsx",
          "components/ui/separator.tsx",
          "components/ui/sheet.tsx",
          "components/ui/sidebar.tsx",
          "components/ui/skeleton.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/sidebar/sidebar-06/app-sidebar.tsx",
          "content/components/sidebar/sidebar-06/app/page.tsx",
          "content/components/sidebar/sidebar-06/team-switcher.tsx",
          "content/declarations.ts",
          "hooks/use-mobile.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/avatar-01.png",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "36e0c464fac5fe29252633c5219e26104f92cbdc9b44c3abc13ed8142a605691",
        "imageHash": "5af167764f0bc94ee683fd2c5cc92ae0d1e0acf4d0891867d899ebd0cfcc5f4d",
        "capturedAt": "2026-10-30T04:05:23.941Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/sidebar-06.json"
    },
    {
      "id": "dashboard-01",
      "category": "dashboard",
      "name": "Dashboard with Revenue and Customers",
      "iframeHeight": "1340px",
      "type": "directory",
      "description": "Dashboard with Revenue and Customers. Complete application dashboards combining navigation, metrics, charts, and customer data.",
      "tags": [
        "dashboard",
        "analytics",
        "customers",
        "revenue",
        "后台",
        "仪表盘",
        "分析",
        "客户"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Keep one primary dashboard question and a consistent reporting period.",
        "Replace demo data and verify charts with sparse and long datasets."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/dashboard/dashboard-01",
      "preview": "/preview/dashboard-01",
      "screenshot": "/previews/dashboard-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "dashboard-01",
        "image": "dashboard-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/avatar.tsx",
          "components/ui/button.tsx",
          "components/ui/chart.tsx",
          "components/ui/dialog.tsx",
          "components/ui/dropdown-menu.tsx",
          "components/ui/field.tsx",
          "components/ui/input-group.tsx",
          "components/ui/input.tsx",
          "components/ui/label.tsx",
          "components/ui/popover.tsx",
          "components/ui/progress.tsx",
          "components/ui/separator.tsx",
          "components/ui/sheet.tsx",
          "components/ui/sidebar.tsx",
          "components/ui/skeleton.tsx",
          "components/ui/sonner.tsx",
          "components/ui/table.tsx",
          "components/ui/textarea.tsx",
          "components/ui/toggle-group.tsx",
          "components/ui/toggle.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/dashboard/dashboard-01/app/page.tsx",
          "content/components/dashboard/dashboard-01/customers-table.tsx",
          "content/components/dashboard/dashboard-01/dashboard-charts.tsx",
          "content/components/dashboard/dashboard-01/dashboard-header.tsx",
          "content/components/dashboard/dashboard-01/dashboard-sidebar.tsx",
          "content/declarations.ts",
          "hooks/use-mobile.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "8bd467de11fe74d84b7237cf3577f7b80be6fdde383cc84ed688f7a86af22ca8",
        "imageHash": "d1703f1c00e13ea1421aaf5605df18e0aa03a2747c053699390da224ca1a7e52",
        "capturedAt": "2026-10-30T04:05:28.611Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 1296
        },
        "state": "default"
      },
      "registry": "/r/dashboard-01.json"
    },
    {
      "id": "ai-01",
      "category": "ai",
      "name": "AI Chat with Voice Input",
      "iframeHeight": "450px",
      "type": "file",
      "description": "AI Chat with Voice Input. AI prompt inputs and assistant interfaces with model selection and media attachments.",
      "tags": [
        "ai",
        "prompt",
        "chat",
        "assistant",
        "人工智能",
        "提示词",
        "聊天",
        "助手"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Provide your own generation endpoint, cancellation, and error handling.",
        "Test a long prompt, empty submission, and pending generation state."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/ai/ai-01",
      "preview": "/preview/ai-01",
      "screenshot": "/previews/ai-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "ai-01",
        "image": "ai-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/dropdown-menu.tsx",
          "components/ui/sonner.tsx",
          "components/ui/textarea.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/ai/ai-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "7332aa475ea4ff9c0a7179decd5841078e54db53d4ee37cc61ac728965cc9e95",
        "imageHash": "0c1659f8c9b03a08259a0f0912aabecfab382ac39b4dc2f86f47bfe9d41fcb3b",
        "capturedAt": "2026-10-30T04:05:30.990Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 118
        },
        "state": "default"
      },
      "registry": "/r/ai-01.json"
    },
    {
      "id": "ai-02",
      "category": "ai",
      "name": "AI Chat with Model Selection",
      "iframeHeight": "400px",
      "type": "file",
      "description": "AI Chat with Model Selection. AI prompt inputs and assistant interfaces with model selection and media attachments.",
      "tags": [
        "ai",
        "prompt",
        "chat",
        "assistant",
        "人工智能",
        "提示词",
        "聊天",
        "助手"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Provide your own generation endpoint, cancellation, and error handling.",
        "Test a long prompt, empty submission, and pending generation state."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/ai/ai-02",
      "preview": "/preview/ai-02",
      "screenshot": "/previews/ai-02.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "ai-02",
        "image": "ai-02.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/select.tsx",
          "components/ui/sonner.tsx",
          "components/ui/textarea.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/ai/ai-02.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "ab40a1a6baea304faa3dceaeb4fef6d6e34c1247d27dc425481eed5747f26756",
        "imageHash": "372c911bd75875226b6e09a34c282cf895989ce6b9434cbe9a5393a7a1e97165",
        "capturedAt": "2026-10-30T04:05:33.348Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 168
        },
        "state": "default"
      },
      "registry": "/r/ai-02.json"
    },
    {
      "id": "ai-03",
      "category": "ai",
      "name": "AI Chat Compact Interface",
      "iframeHeight": "350px",
      "type": "file",
      "description": "AI Chat Compact Interface. AI prompt inputs and assistant interfaces with model selection and media attachments.",
      "tags": [
        "ai",
        "prompt",
        "chat",
        "assistant",
        "人工智能",
        "提示词",
        "聊天",
        "助手"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Provide your own generation endpoint, cancellation, and error handling.",
        "Test a long prompt, empty submission, and pending generation state."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/ai/ai-03",
      "preview": "/preview/ai-03",
      "screenshot": "/previews/ai-03.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "ai-03",
        "image": "ai-03.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/dropdown-menu.tsx",
          "components/ui/sonner.tsx",
          "components/ui/textarea.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/ai/ai-03.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "336f92db743d8437be330ae55fa8a8b41bf72f92cbc16700212bfafd1a5446f5",
        "imageHash": "a0511c7e5171edf6e17c294f1b456584750bfa0f8884a66051b48522a51ed99a",
        "capturedAt": "2026-10-30T04:05:35.755Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 130
        },
        "state": "default"
      },
      "registry": "/r/ai-03.json"
    },
    {
      "id": "ai-04",
      "category": "ai",
      "name": "AI Chat with File Attachments",
      "iframeHeight": "650px",
      "type": "file",
      "description": "AI Chat with File Attachments. AI prompt inputs and assistant interfaces with model selection and media attachments.",
      "tags": [
        "ai",
        "prompt",
        "chat",
        "assistant",
        "人工智能",
        "提示词",
        "聊天",
        "助手"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f",
        "modifications": [
          "Replaced the Next.js image component with a standard image element for local attachment previews."
        ]
      },
      "contentGuidelines": [
        "Provide your own generation endpoint, cancellation, and error handling.",
        "Test a long prompt, empty submission, and pending generation state."
      ],
      "recommendedWith": [],
      "version": "0.2.0",
      "url": "/ai/ai-04",
      "preview": "/preview/ai-04",
      "screenshot": "/previews/ai-04.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "ai-04",
        "image": "ai-04.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/badge.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/dropdown-menu.tsx",
          "components/ui/label.tsx",
          "components/ui/sonner.tsx",
          "components/ui/switch.tsx",
          "components/ui/textarea.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/ai/ai-04.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "b3ba7d07ffb82142990130e551b12f46cc30edae856cca22327678b61aad7b83",
        "imageHash": "1be66e3128f8e38cadaa3b2ebfb61545d8dc6d701633a722c213131076806743",
        "capturedAt": "2026-10-30T04:05:38.191Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 244
        },
        "state": "default"
      },
      "registry": "/r/ai-04.json"
    },
    {
      "id": "ai-05",
      "category": "ai",
      "name": "AI Elements Chat",
      "iframeHeight": "720px",
      "type": "file",
      "description": "AI Elements Chat. AI prompt inputs and assistant interfaces with model selection and media attachments.",
      "tags": [
        "ai",
        "prompt",
        "chat",
        "assistant",
        "人工智能",
        "提示词",
        "聊天",
        "助手"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Provide your own generation endpoint, cancellation, and error handling.",
        "Test a long prompt, empty submission, and pending generation state."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/ai/ai-05",
      "preview": "/preview/ai-05",
      "screenshot": "/previews/ai-05.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "ai-05",
        "image": "ai-05.png",
        "sourceFiles": [
          "app/globals.css",
          "components/ai-elements/conversation.tsx",
          "components/ai-elements/message.tsx",
          "components/ai-elements/prompt-input.tsx",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/input-group.tsx",
          "components/ui/input.tsx",
          "components/ui/sonner.tsx",
          "components/ui/textarea.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/ai/ai-05.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "edd3183742de93c5f6ed8dd0baaad7454a02582b35c072fe3f476a5a144997e5",
        "imageHash": "98471dd2588f322ca8c5abf3e9127fc10f1d8c8b16f0f8fdd353f08c25094d71",
        "capturedAt": "2026-10-30T04:05:40.604Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 560
        },
        "state": "default"
      },
      "registry": "/r/ai-05.json"
    },
    {
      "id": "chat-01",
      "category": "chat",
      "name": "Chat Basic",
      "iframeHeight": "640px",
      "type": "file",
      "description": "Chat Basic. AI chat interfaces with message history, prompt controls, and conversation navigation.",
      "tags": [
        "chat",
        "ai",
        "conversation",
        "messages",
        "聊天",
        "对话",
        "消息",
        "助手"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Connect message streaming and persistence to your application.",
        "Test empty history, long responses, and failed requests."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/chat/chat-01",
      "preview": "/preview/chat-01",
      "screenshot": "/previews/chat-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "chat-01",
        "image": "chat-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/bubble.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/dropdown-menu.tsx",
          "components/ui/input-group.tsx",
          "components/ui/input.tsx",
          "components/ui/message-scroller.tsx",
          "components/ui/message.tsx",
          "components/ui/sonner.tsx",
          "components/ui/textarea.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/chat/chat-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "54c31aa67f1262641be4bbc51a8f344036ef929e645f5e4d1fdc6a1406376529",
        "imageHash": "fe32b741a8d0c2279ba339c3190ead185bbbb8613545381b5bef04009b84dbaf",
        "capturedAt": "2026-10-30T04:05:43.044Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/chat-01.json"
    },
    {
      "id": "chat-02",
      "category": "chat",
      "name": "Chat with Model Menu",
      "iframeHeight": "640px",
      "type": "file",
      "description": "Chat with Model Menu. AI chat interfaces with message history, prompt controls, and conversation navigation.",
      "tags": [
        "chat",
        "ai",
        "conversation",
        "messages",
        "聊天",
        "对话",
        "消息",
        "助手"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Connect message streaming and persistence to your application.",
        "Test empty history, long responses, and failed requests."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/chat/chat-02",
      "preview": "/preview/chat-02",
      "screenshot": "/previews/chat-02.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "chat-02",
        "image": "chat-02.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/bubble.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/dropdown-menu.tsx",
          "components/ui/input-group.tsx",
          "components/ui/input.tsx",
          "components/ui/message-scroller.tsx",
          "components/ui/message.tsx",
          "components/ui/sonner.tsx",
          "components/ui/textarea.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/chat/chat-02.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "2872f19350e39c75aa89360dd709b1a4c0e01459da2a1b8c60cadece374a30c7",
        "imageHash": "26bc3ecae10a2410cccb449930853d89a04c08ab4ad074b29dbc4d1695064fc4",
        "capturedAt": "2026-10-30T04:05:45.367Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/chat-02.json"
    },
    {
      "id": "chat-03",
      "category": "chat",
      "name": "Chat Application",
      "iframeHeight": "800px",
      "type": "directory",
      "description": "Chat Application. AI chat interfaces with message history, prompt controls, and conversation navigation.",
      "tags": [
        "chat",
        "ai",
        "conversation",
        "messages",
        "聊天",
        "对话",
        "消息",
        "助手"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Connect message streaming and persistence to your application.",
        "Test empty history, long responses, and failed requests."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/chat/chat-03",
      "preview": "/preview/chat-03",
      "screenshot": "/previews/chat-03.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "chat-03",
        "image": "chat-03.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/avatar.tsx",
          "components/ui/button.tsx",
          "components/ui/collapsible.tsx",
          "components/ui/command.tsx",
          "components/ui/dialog.tsx",
          "components/ui/dropdown-menu.tsx",
          "components/ui/input-group.tsx",
          "components/ui/input.tsx",
          "components/ui/kbd.tsx",
          "components/ui/message-scroller.tsx",
          "components/ui/separator.tsx",
          "components/ui/sheet.tsx",
          "components/ui/sidebar.tsx",
          "components/ui/skeleton.tsx",
          "components/ui/sonner.tsx",
          "components/ui/textarea.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/chat/chat-03/app/chat/data.json",
          "content/components/chat/chat-03/app/chat/page.tsx",
          "content/components/chat/chat-03/components/chat-sidebar.tsx",
          "content/components/chat/chat-03/components/command-menu.tsx",
          "content/components/chat/chat-03/components/composer.tsx",
          "content/components/chat/chat-03/components/conversation.tsx",
          "content/components/chat/chat-03/components/logos.tsx",
          "content/declarations.ts",
          "hooks/use-mobile.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "7988fe715174660f078c00b935eb2e3765406b2dc99bb574e042423fc447e3c9",
        "imageHash": "ea8dae9b9e6a396a5002374fec23c5f8f47960770b2bfcbbaa379a674ece4af4",
        "capturedAt": "2026-10-30T04:05:47.802Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/chat-03.json"
    },
    {
      "id": "table-01",
      "category": "tables",
      "name": "Table with Accordion",
      "iframeHeight": "800px",
      "type": "file",
      "description": "Table with Accordion. Product data tables with row actions, grouping, filters, and useful data density.",
      "tags": [
        "table",
        "data",
        "filter",
        "rows",
        "表格",
        "数据",
        "筛选",
        "列表"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use stable row identifiers and label row actions.",
        "Test long cells, no results, and horizontal overflow on mobile."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/tables/table-01",
      "preview": "/preview/table-01",
      "screenshot": "/previews/table-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "table-01",
        "image": "table-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/collapsible.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/table.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/tables/table-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "7584ecaba1577025226648b64c5520ca2ee68353616c97b238455eea474e373e",
        "imageHash": "553d18586f75a167ac0b1de0e2ce63404a2b13616f2cd5bedc3d8d2a4ab03b35",
        "capturedAt": "2026-10-30T04:05:50.139Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 354
        },
        "state": "default"
      },
      "registry": "/r/table-01.json"
    },
    {
      "id": "table-02",
      "category": "tables",
      "name": "Table with Actions",
      "iframeHeight": "600px",
      "type": "file",
      "description": "Table with Actions. Product data tables with row actions, grouping, filters, and useful data density.",
      "tags": [
        "table",
        "data",
        "filter",
        "rows",
        "表格",
        "数据",
        "筛选",
        "列表"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use stable row identifiers and label row actions.",
        "Test long cells, no results, and horizontal overflow on mobile."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/tables/table-02",
      "preview": "/preview/table-02",
      "screenshot": "/previews/table-02.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "table-02",
        "image": "table-02.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/badge.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/table.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/tables/table-02.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "c203dfbd4b230be27e792e466b7e59d6c08eec77ce568c96a01dc05b3c3dbfa2",
        "imageHash": "d1b78d3be55133d6b6ba2561ca6ee463499b59b856613a10c400d27b090f9df1",
        "capturedAt": "2026-10-30T04:05:52.511Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 498
        },
        "state": "default"
      },
      "registry": "/r/table-02.json"
    },
    {
      "id": "table-03",
      "category": "tables",
      "name": "Table with Filters",
      "iframeHeight": "700px",
      "type": "file",
      "description": "Table with Filters. Product data tables with row actions, grouping, filters, and useful data density.",
      "tags": [
        "table",
        "data",
        "filter",
        "rows",
        "表格",
        "数据",
        "筛选",
        "列表"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use stable row identifiers and label row actions.",
        "Test long cells, no results, and horizontal overflow on mobile."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/tables/table-03",
      "preview": "/preview/table-03",
      "screenshot": "/previews/table-03.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "table-03",
        "image": "table-03.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/badge.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/select.tsx",
          "components/ui/sonner.tsx",
          "components/ui/table.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/tables/table-03.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "18b2662c7f7807996c7b513faa1babf9d84b08d09da0125e662275bb2f37a59f",
        "imageHash": "4f7bece2717122a686ee827da3d8ef18aa26d15eba6a362e4b5fa39a46453c4a",
        "capturedAt": "2026-10-30T04:05:54.918Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 518
        },
        "state": "default"
      },
      "registry": "/r/table-03.json"
    },
    {
      "id": "table-04",
      "category": "tables",
      "name": "Table with Grouped Rows",
      "iframeHeight": "600px",
      "type": "file",
      "description": "Table with Grouped Rows. Product data tables with row actions, grouping, filters, and useful data density.",
      "tags": [
        "table",
        "data",
        "filter",
        "rows",
        "表格",
        "数据",
        "筛选",
        "列表"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use stable row identifiers and label row actions.",
        "Test long cells, no results, and horizontal overflow on mobile."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/tables/table-04",
      "preview": "/preview/table-04",
      "screenshot": "/previews/table-04.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "table-04",
        "image": "table-04.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/avatar.tsx",
          "components/ui/badge.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/table.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/tables/table-04.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "50275fd9f5c97556edb9621087c00884e32459ceb95e6f1c6df2b1036145d5a2",
        "imageHash": "6d7b22984fcc7f9be52243b1989eff2c45f52f853f4e849e37829411c4fff2b0",
        "capturedAt": "2026-10-30T04:05:57.260Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 440
        },
        "state": "default"
      },
      "registry": "/r/table-04.json"
    },
    {
      "id": "table-05",
      "category": "tables",
      "name": "Data Table",
      "iframeHeight": "600px",
      "type": "file",
      "description": "Data Table. Product data tables with row actions, grouping, filters, and useful data density.",
      "tags": [
        "table",
        "data",
        "filter",
        "rows",
        "表格",
        "数据",
        "筛选",
        "列表"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Use stable row identifiers and label row actions.",
        "Test long cells, no results, and horizontal overflow on mobile."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/tables/table-05",
      "preview": "/preview/table-05",
      "screenshot": "/previews/table-05.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "table-05",
        "image": "table-05.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/badge.tsx",
          "components/ui/button.tsx",
          "components/ui/checkbox.tsx",
          "components/ui/dialog.tsx",
          "components/ui/dropdown-menu.tsx",
          "components/ui/input.tsx",
          "components/ui/select.tsx",
          "components/ui/sonner.tsx",
          "components/ui/table.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/tables/table-05.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "a8927d327929910a0179d11e864ddea20e3f1979f08407bbce64b7b0f361773e",
        "imageHash": "99918b70ac3084283b9b6edab6de66ea5ae8bb6f9a9643082a77122dfb23eea7",
        "capturedAt": "2026-10-30T04:05:59.644Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 384
        },
        "state": "default"
      },
      "registry": "/r/table-05.json"
    },
    {
      "id": "onboarding-01",
      "category": "onboarding",
      "name": "Onboarding",
      "iframeHeight": "700px",
      "type": "file",
      "description": "Onboarding. Guided setup, checklists, timelines, and onboarding progress for new users.",
      "tags": [
        "onboarding",
        "setup",
        "steps",
        "progress",
        "引导",
        "入门",
        "步骤",
        "进度"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Give each step a concrete outcome and a way to continue.",
        "Persist completed setup steps in your application."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/onboarding/onboarding-01",
      "preview": "/preview/onboarding-01",
      "screenshot": "/previews/onboarding-01.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "onboarding-01",
        "image": "onboarding-01.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/collapsible.tsx",
          "components/ui/dialog.tsx",
          "components/ui/dropdown-menu.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/onboarding/onboarding-01.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "8655c64f377b47f16d15cd3dd52ea2fb9f283889e1f1c7ed055aada16be6ea97",
        "imageHash": "4491cc52e1bafec457b0f406507a7ddc1246bc546f722a705603624ea2f46d72",
        "capturedAt": "2026-10-30T04:06:01.994Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/onboarding-01.json"
    },
    {
      "id": "onboarding-02",
      "category": "onboarding",
      "name": "Onboarding Workspace Setup",
      "iframeHeight": "650px",
      "type": "file",
      "description": "Onboarding Workspace Setup. Guided setup, checklists, timelines, and onboarding progress for new users.",
      "tags": [
        "onboarding",
        "setup",
        "steps",
        "progress",
        "引导",
        "入门",
        "步骤",
        "进度"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Give each step a concrete outcome and a way to continue.",
        "Persist completed setup steps in your application."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/onboarding/onboarding-02",
      "preview": "/preview/onboarding-02",
      "screenshot": "/previews/onboarding-02.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "onboarding-02",
        "image": "onboarding-02.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/onboarding/onboarding-02.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "a85859d49de5231de1b5c50508d56a7f2e7b3c1e00398d271e523867ce3fb161",
        "imageHash": "5d6a36aed4a6064ae68b11bfc1bfe535f7418cdcad1754b8d0fec63ee9c812fb",
        "capturedAt": "2026-10-30T04:06:04.313Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/onboarding-02.json"
    },
    {
      "id": "onboarding-03",
      "category": "onboarding",
      "name": "Onboarding Steps with Progress",
      "iframeHeight": "800px",
      "type": "file",
      "description": "Onboarding Steps with Progress. Guided setup, checklists, timelines, and onboarding progress for new users.",
      "tags": [
        "onboarding",
        "setup",
        "steps",
        "progress",
        "引导",
        "入门",
        "步骤",
        "进度"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Give each step a concrete outcome and a way to continue.",
        "Persist completed setup steps in your application."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/onboarding/onboarding-03",
      "preview": "/preview/onboarding-03",
      "screenshot": "/previews/onboarding-03.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "onboarding-03",
        "image": "onboarding-03.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/progress.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/onboarding/onboarding-03.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "2063ca908f0c2dda528f25eee426b3803fb0feaab4c18c585238ad7df5b01363",
        "imageHash": "c6ff99ca15d60c55b9fb62bec0c916c36c3e1bd3ed3ce462c67df93bdd1e764a",
        "capturedAt": "2026-10-30T04:06:06.611Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/onboarding-03.json"
    },
    {
      "id": "onboarding-04",
      "category": "onboarding",
      "name": "Onboarding Accordion",
      "iframeHeight": "650px",
      "type": "file",
      "description": "Onboarding Accordion. Guided setup, checklists, timelines, and onboarding progress for new users.",
      "tags": [
        "onboarding",
        "setup",
        "steps",
        "progress",
        "引导",
        "入门",
        "步骤",
        "进度"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Give each step a concrete outcome and a way to continue.",
        "Persist completed setup steps in your application."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/onboarding/onboarding-04",
      "preview": "/preview/onboarding-04",
      "screenshot": "/previews/onboarding-04.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "onboarding-04",
        "image": "onboarding-04.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/accordion.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/onboarding/onboarding-04.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "da0a12d0d8bc7f33c27335cdbfbd13333252e7b8595084866ac9c462ace91031",
        "imageHash": "d40b0d6ee425815bfb0bf498e26308967364d6e063f8d5bc89e58404acf6b030",
        "capturedAt": "2026-10-30T04:06:08.916Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/onboarding-04.json"
    },
    {
      "id": "onboarding-05",
      "category": "onboarding",
      "name": "Onboarding Activity Feed",
      "iframeHeight": "500px",
      "type": "file",
      "description": "Onboarding Activity Feed. Guided setup, checklists, timelines, and onboarding progress for new users.",
      "tags": [
        "onboarding",
        "setup",
        "steps",
        "progress",
        "引导",
        "入门",
        "步骤",
        "进度"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Give each step a concrete outcome and a way to continue.",
        "Persist completed setup steps in your application."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/onboarding/onboarding-05",
      "preview": "/preview/onboarding-05",
      "screenshot": "/previews/onboarding-05.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "onboarding-05",
        "image": "onboarding-05.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/onboarding/onboarding-05.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "5c58dd6d1317eb09d1508c5e546b029f682dab6f7dc4b091280601213c766d7a",
        "imageHash": "842ed226595fa05ec9c6fc00a622237a09bd278b3147c77103479d35e2a1cbf3",
        "capturedAt": "2026-10-30T04:06:11.256Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/onboarding-05.json"
    },
    {
      "id": "onboarding-06",
      "category": "onboarding",
      "name": "Onboarding Timeline",
      "iframeHeight": "500px",
      "type": "file",
      "description": "Onboarding Timeline. Guided setup, checklists, timelines, and onboarding progress for new users.",
      "tags": [
        "onboarding",
        "setup",
        "steps",
        "progress",
        "引导",
        "入门",
        "步骤",
        "进度"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Give each step a concrete outcome and a way to continue.",
        "Persist completed setup steps in your application."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/onboarding/onboarding-06",
      "preview": "/preview/onboarding-06",
      "screenshot": "/previews/onboarding-06.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "onboarding-06",
        "image": "onboarding-06.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/onboarding/onboarding-06.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "b5927d78f5bce745f5bada5928eff76f4e3738de442956b3a80dbc1f40058153",
        "imageHash": "6598c9b29623fe47b858d60db59b5a88d50812ef6d113d6d83a397c0ef6d175e",
        "capturedAt": "2026-10-30T04:06:13.581Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "default"
      },
      "registry": "/r/onboarding-06.json"
    },
    {
      "id": "onboarding-07",
      "category": "onboarding",
      "name": "Onboarding Deploy Pipeline",
      "iframeHeight": "600px",
      "type": "file",
      "description": "Onboarding Deploy Pipeline. Guided setup, checklists, timelines, and onboarding progress for new users.",
      "tags": [
        "onboarding",
        "setup",
        "steps",
        "progress",
        "引导",
        "入门",
        "步骤",
        "进度"
      ],
      "pageType": "application",
      "style": "clean-saas",
      "featured": false,
      "source": {
        "name": "Blocks.so",
        "url": "https://github.com/ephraimduncan/blocks",
        "license": "MIT",
        "author": "Ephraim Duncan",
        "revision": "3f759d5171c2391253ec4c772e9e5b3db2bc7c7f"
      },
      "contentGuidelines": [
        "Give each step a concrete outcome and a way to continue.",
        "Persist completed setup steps in your application."
      ],
      "recommendedWith": [],
      "version": "0.1.0",
      "url": "/onboarding/onboarding-07",
      "preview": "/preview/onboarding-07",
      "screenshot": "/previews/onboarding-07.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "onboarding-07",
        "image": "onboarding-07.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/accordion.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/progress.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-components.tsx",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/onboarding/onboarding-07.tsx",
          "content/declarations.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.$blockId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "6be9fda5a7f5fdc18b10312c2fb7df21dfedfe2306cc2de8e8e22d4f0299dda0",
        "imageHash": "342a61b331809d90dcbf2dc1cecd4b53a74ebe2e17442a96bf7395057ff59a66",
        "capturedAt": "2026-10-30T04:06:19.752Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 800
        },
        "state": "simulation-completed"
      },
      "registry": "/r/onboarding-07.json"
    }
  ],
  "recipes": [
    {
      "id": "tool-landing",
      "name": "AI tool landing page",
      "description": "A complete, quietly confident product page. Introduce your tool, show its workflow, explain the plans, and answer the questions that matter.",
      "category": "Marketing",
      "blockIds": [
        "navigation-01",
        "hero-01",
        "logo-cloud-01",
        "features-01",
        "pricing-01",
        "faq-01",
        "footer-01"
      ],
      "style": "clean-saas",
      "registryId": "recipe-tool-landing",
      "componentName": "ToolLandingRecipe",
      "componentSource": "content/recipe-components/tool-landing.tsx",
      "installUsage": "import ToolLandingRecipe from \"@/components/uiblocks/recipe-tool-landing/recipe-tool-landing\";\n\nexport default function ProductPage() {\n  return (\n    <ToolLandingRecipe\n      brand=\"Your product\"\n      primaryHref=\"/app\"\n      primaryLabel=\"Open workspace\"\n      hero={{ title: \"A clearer starting point for your next project.\", description: \"Replace this with your actual product description.\" }}\n    />\n  );\n}",
      "propsContract": [
        {
          "name": "brand, homeHref, primaryHref, primaryLabel",
          "description": "Set the shared product identity and primary action across navigation, hero, plans, FAQ, and footer; ordinary anchors use the host's URLs."
        },
        {
          "name": "navigation, hero, formats, features, pricing, faq, footer",
          "description": "Pass each section's typed props for real copy, links, capabilities, plan prices, and FAQs. Pricing plans without an actionHref inherit primaryHref."
        },
        {
          "name": "theme, className",
          "description": "Inherit the host theme by default, or set theme='dark' to enable a class-based dark variant. Use the host Tailwind 4 theme and className to customize the visual system."
        }
      ],
      "contentGuidelines": [
        "Keep the hero title around 8–12 English words or 14–24 Chinese characters; choose a shorter title if it wraps beyond three lines.",
        "Use one primary action across the navigation and hero. Connect the action to your real workspace or onboarding route.",
        "Keep the 1152px content width, violet accent, neutral borders, and shared section spacing throughout the page.",
        "The format strip describes supported formats, not customer endorsements. Replace it with verified capabilities only.",
        "Use three concise feature stories, three plans, and around four FAQs. Check longer content on mobile.",
        "Frame is a fictional demonstration product. Replace all plan details, demo notices, and claims with your own verified product information before launch."
      ],
      "prompt": "Build a product landing page using the UIBlocks tool-landing recipe in the clean-saas style. Install the complete recipe-tool-landing registry item in one command and import its ToolLandingRecipe entry. Inspect the complete page preview before adapting typed section props. Keep the content width, typography, borders, violet accent, and section spacing consistent. Replace the fictional Frame content, sample prices and capability claims with my actual product information, and connect primaryHref to my workspace. Do not invent customer logos or reviews. Check the final page with real English and Chinese content at desktop and mobile sizes.",
      "preview": "/preview/recipes/tool-landing",
      "screenshot": "/previews/recipe-tool-landing.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "recipe-tool-landing",
        "image": "recipe-tool-landing.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/recipes/recipe-preview.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/marketing/faq-01.tsx",
          "content/components/marketing/features-01.tsx",
          "content/components/marketing/footer-01.tsx",
          "content/components/marketing/hero-01.tsx",
          "content/components/marketing/logo-cloud-01.tsx",
          "content/components/marketing/navigation-01.tsx",
          "content/components/marketing/pricing-01.tsx",
          "content/components/workspace/results-gallery-01.tsx",
          "content/components/workspace/task-queue-01.tsx",
          "content/components/workspace/upload-workflow-01.tsx",
          "content/components/workspace/usage-panel-01.tsx",
          "content/components/workspace/workspace-header-01.tsx",
          "content/declarations.ts",
          "content/recipe-components/tool-landing.tsx",
          "content/recipe-components/tool-workspace.tsx",
          "content/recipes.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.recipes.$recipeId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "1f69a4a7ff8fd903f87a60e88eeb9d6bfb5ad6ec446871ef4128e9e789ae5be9",
        "imageHash": "5f43e2c3a35538bdcd70ecf1e667c4e89a042e8a25ff51aabfdfb01032b97508",
        "capturedAt": "2026-10-30T04:06:22.145Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 3236
        },
        "state": "default"
      },
      "url": "/recipes/tool-landing",
      "registry": "/r/recipe-tool-landing.json",
      "install": {
        "direct": "npx shadcn@latest add https://uiblocks.org/r/recipe-tool-landing.json",
        "namespaced": "npx shadcn@latest add @uiblocks/recipe-tool-landing",
        "registryConfig": {
          "registries": {
            "@uiblocks": "https://uiblocks.org/r/{name}.json"
          }
        },
        "entry": "@components/uiblocks/recipe-tool-landing/recipe-tool-landing.tsx",
        "exportName": "default",
        "dependencies": [
          "lucide-react@0.577.0"
        ],
        "requirements": {
          "react": ">=19",
          "tailwind": ">=4"
        },
        "usage": "import ToolLandingRecipe from \"@/components/uiblocks/recipe-tool-landing/recipe-tool-landing\";\n\nexport default function ProductPage() {\n  return (\n    <ToolLandingRecipe\n      brand=\"Your product\"\n      primaryHref=\"/app\"\n      primaryLabel=\"Open workspace\"\n      hero={{ title: \"A clearer starting point for your next project.\", description: \"Replace this with your actual product description.\" }}\n    />\n  );\n}"
      },
      "compositionSource": {
        "language": "tsx",
        "componentName": "ToolLandingRecipe",
        "referenceOnly": false,
        "installedEntry": "@components/uiblocks/recipe-tool-landing/recipe-tool-landing.tsx",
        "content": "\"use client\";\n\nimport type { ComponentProps } from \"react\";\nimport Faq01 from \"./shared/content/components/marketing/faq-01\";\nimport Features01 from \"./shared/content/components/marketing/features-01\";\nimport Footer01 from \"./shared/content/components/marketing/footer-01\";\nimport Hero01 from \"./shared/content/components/marketing/hero-01\";\nimport LogoCloud01 from \"./shared/content/components/marketing/logo-cloud-01\";\nimport Navigation01 from \"./shared/content/components/marketing/navigation-01\";\nimport Pricing01, {\n  type PricingPlan,\n} from \"./shared/content/components/marketing/pricing-01\";\n\nconst samplePlans: PricingPlan[] = [\n  {\n    name: \"Personal\",\n    description: \"For the occasional good idea.\",\n    monthlyPrice: 0,\n    annualMonthlyPrice: 0,\n    features: [\n      \"3 projects\",\n      \"Single-file workflow\",\n      \"Standard exports\",\n      \"Local demo workspace\",\n    ],\n    actionLabel: \"Explore the demo\",\n  },\n  {\n    name: \"Creator\",\n    description: \"For a workflow that keeps moving.\",\n    monthlyPrice: 19,\n    annualMonthlyPrice: 15,\n    features: [\n      \"Unlimited projects\",\n      \"Batch file workflows\",\n      \"Reusable presets\",\n      \"Export history\",\n    ],\n    highlighted: true,\n    actionLabel: \"Explore Creator\",\n  },\n  {\n    name: \"Studio\",\n    description: \"For a little more room to make.\",\n    monthlyPrice: 39,\n    annualMonthlyPrice: 32,\n    features: [\n      \"Everything in Creator\",\n      \"Shared project folders\",\n      \"Team-ready layouts\",\n      \"Usage overview\",\n    ],\n    actionLabel: \"Explore Studio\",\n  },\n];\n\nconst sectionLinks = [\n  { label: \"Features\", href: \"#features\" },\n  { label: \"Pricing\", href: \"#pricing\" },\n  { label: \"Questions\", href: \"#faq\" },\n];\n\nexport type ToolLandingRecipeProps = {\n  /** Inherit the host theme, or enable its class-based dark variant for this page. */\n  theme?: \"inherit\" | \"dark\";\n  className?: string;\n  brand?: string;\n  homeHref?: string;\n  primaryHref?: string;\n  primaryLabel?: string;\n  navigation?: ComponentProps<typeof Navigation01>;\n  hero?: ComponentProps<typeof Hero01>;\n  formats?: ComponentProps<typeof LogoCloud01>;\n  features?: ComponentProps<typeof Features01>;\n  pricing?: ComponentProps<typeof Pricing01>;\n  faq?: ComponentProps<typeof Faq01>;\n  footer?: ComponentProps<typeof Footer01>;\n};\n\n/**\n * An installable seven-section page, independent of the host router.\n * Replace the fictional Frame copy, sample prices, and capability claims through\n * the section props before publishing. Anchors are ordinary host-owned URLs.\n */\nexport default function ToolLandingRecipe({\n  theme = \"inherit\",\n  className = \"\",\n  brand = \"Frame\",\n  homeHref = \"#frame-top\",\n  primaryHref = \"#pricing\",\n  primaryLabel = \"Get started\",\n  navigation,\n  hero,\n  formats,\n  features,\n  pricing,\n  faq,\n  footer,\n}: ToolLandingRecipeProps) {\n  return (\n    <div\n      className={`${theme === \"inherit\" ? \"\" : theme} min-h-screen bg-white dark:bg-zinc-950 ${className}`}\n    >\n      <Navigation01\n        actionHref={primaryHref}\n        actionLabel={primaryLabel}\n        brand={brand}\n        homeHref={homeHref}\n        links={sectionLinks}\n        {...navigation}\n      />\n      <main>\n        <Hero01\n          primaryHref={primaryHref}\n          primaryLabel={primaryLabel}\n          secondaryHref=\"#features\"\n          {...hero}\n        />\n        <LogoCloud01 {...formats} />\n        <Features01 {...features} />\n        <Pricing01\n          {...pricing}\n          plans={(pricing?.plans ?? samplePlans).map((plan) => ({\n            ...plan,\n            actionHref: plan.actionHref ?? primaryHref,\n          }))}\n        />\n        <Faq01 actionHref={primaryHref} actionLabel={primaryLabel} {...faq} />\n      </main>\n      <Footer01\n        brand={brand}\n        homeHref={homeHref}\n        links={[...sectionLinks, { label: \"Workspace\", href: primaryHref }]}\n        {...footer}\n      />\n    </div>\n  );\n}\n",
        "guidance": "Install this complete recipe with its single shadcn command, then import the component using your configured components alias and meta.entry. Matching blocks, helpers, and MIT notices are bundled. Pass your own copy, navigation, and callbacks through the published props. Workspace simulation requires explicit demo mode; controlled mode delegates processing to your application."
      }
    },
    {
      "id": "tool-workspace",
      "name": "File processing workspace",
      "description": "A focused media workspace with local file selection, output controls, a filterable task queue, downloadable demo previews, and a clear usage summary.",
      "category": "Application",
      "blockIds": [
        "workspace-header-01",
        "upload-workflow-01",
        "task-queue-01",
        "results-gallery-01",
        "usage-panel-01"
      ],
      "style": "clean-saas",
      "registryId": "recipe-tool-workspace",
      "componentName": "ToolWorkspaceRecipe",
      "componentSource": "content/recipe-components/tool-workspace.tsx",
      "installUsage": "import ToolWorkspaceRecipe from \"@/components/uiblocks/recipe-tool-workspace/recipe-tool-workspace\";\n\nexport default function WorkspacePage() {\n  return <ToolWorkspaceRecipe mode=\"demo\" websiteHref=\"/\" upgradeHref=\"/pricing\" />;\n}",
      "propsContract": [
        {
          "name": "mode",
          "description": "Default 'controlled' mode never fabricates processing or results. Explicit mode='demo' enables browser-only timers, illustrative files, SVG downloads, and optional state controls."
        },
        {
          "name": "files, onFilesChange, status, progress, tasks, results",
          "description": "Supply real service state in controlled mode. The default file selector retains metadata only, not File bytes. Keep File objects in the host uploader and use renderUpload for authenticated uploads."
        },
        {
          "name": "onRun, onRetry",
          "description": "Controlled-mode callbacks receive selected file metadata/format or a task ID. The host performs network work and supplies status/results; rejected callbacks show a retryable error, never a simulated success."
        },
        {
          "name": "renderUpload, renderResults, headerSlot, footer",
          "description": "Replace example UI with your real upload control, authenticated result/download links, navigation/account header, and product footer. The bundled blocks retain explicit demo labels; the default gallery only downloads SVG examples."
        },
        {
          "name": "header, upload, queueTitle, resultsTitle, usage, websiteHref, upgradeHref",
          "description": "Adapt workspace copy, product identity, plan/usage data, and normal host navigation links. Do not treat illustrative credits or download previews as real billing or conversion."
        },
        {
          "name": "searchQuery, onSearchChange",
          "description": "Share one search state across the workspace header, task queue, and results, or allow the page to manage local search."
        },
        {
          "name": "theme, className",
          "description": "Inherit the host theme, or enable its class-based dark variant with theme='dark'; customize shared Tailwind 4 theme tokens and the page className."
        }
      ],
      "contentGuidelines": [
        "Keep the workspace heading to one short sentence and file names to their original values, truncating visual labels when needed.",
        "Use shared state for file selection, queue progress, and results; keep the upload controls disabled while a task runs.",
        "Provide empty, processing, completed, and error states. Status must remain understandable without relying on color.",
        "The preview is a local interface simulation. Selected videos are never uploaded or converted; downloads are labeled SVG demo previews.",
        "Connect the upload and retry callbacks to your own authenticated processing service before using this as a production tool.",
        "Keep demo credits and illustrative usage separate from real billing data. Validate the layout with long file names and mobile widths."
      ],
      "prompt": "Build a file-processing workspace using the UIBlocks tool-workspace recipe and clean-saas style. Install the complete recipe-tool-workspace registry item in one command and import ToolWorkspaceRecipe. Inspect its full preview and preserve the neutral surfaces, violet accent, type scale, and spacing. Use explicit mode='demo' only to inspect the browser-only sample. For a real product, use controlled mode with one source of files/tasks/results/search state and onRun/onRetry service callbacks; supply renderUpload for actual File bytes and renderResults for real authenticated download URLs. Adapt the blocks' explicit demo copy. Implement empty, processing, completed, and error states without presenting simulated conversion or credits as real. Check keyboard navigation, long file names, and mobile layout.",
      "preview": "/preview/recipes/tool-workspace",
      "screenshot": "/previews/recipe-tool-workspace.png",
      "screenshotMetadata": {
        "renderer": "Chromium",
        "id": "recipe-tool-workspace",
        "image": "recipe-tool-workspace.png",
        "sourceFiles": [
          "app/globals.css",
          "components/brand.tsx",
          "components/copy-button.tsx",
          "components/footer.tsx",
          "components/header.tsx",
          "components/recipes/recipe-preview.tsx",
          "components/registry-setup.tsx",
          "components/seo-jsonld.tsx",
          "components/theme-toggle.tsx",
          "components/ui/button.tsx",
          "components/ui/dialog.tsx",
          "components/ui/sonner.tsx",
          "components/ui/tooltip.tsx",
          "config.ts",
          "content/blocks-metadata.ts",
          "content/catalog.ts",
          "content/components/marketing/faq-01.tsx",
          "content/components/marketing/features-01.tsx",
          "content/components/marketing/footer-01.tsx",
          "content/components/marketing/hero-01.tsx",
          "content/components/marketing/logo-cloud-01.tsx",
          "content/components/marketing/navigation-01.tsx",
          "content/components/marketing/pricing-01.tsx",
          "content/components/workspace/results-gallery-01.tsx",
          "content/components/workspace/task-queue-01.tsx",
          "content/components/workspace/upload-workflow-01.tsx",
          "content/components/workspace/usage-panel-01.tsx",
          "content/components/workspace/workspace-header-01.tsx",
          "content/declarations.ts",
          "content/recipe-components/tool-landing.tsx",
          "content/recipe-components/tool-workspace.tsx",
          "content/recipes.ts",
          "hooks/use-registry-origin.ts",
          "lib/utils.ts",
          "package-lock.json",
          "package.json",
          "postcss.config.mjs",
          "public/icon.svg",
          "public/opengraph-image.png",
          "scripts/capture-previews.mjs",
          "scripts/preview-provenance.mjs",
          "src/lib/head.ts",
          "src/routes/__root.tsx",
          "src/routes/preview.recipes.$recipeId.tsx",
          "vite.config.ts"
        ],
        "sourceHash": "7d9951cf56825d8a963922f577370c3aa3d7ea94fab9dfee24dfa70ff6594543",
        "imageHash": "43a8b7ae4072ea4bde2f10e431abb79a3a03da8e86e32e11e08cbe6abdf7697d",
        "capturedAt": "2026-10-30T04:06:24.492Z",
        "viewport": {
          "width": 1200,
          "height": 800
        },
        "dimensions": {
          "width": 1200,
          "height": 1470
        },
        "state": "default"
      },
      "url": "/recipes/tool-workspace",
      "registry": "/r/recipe-tool-workspace.json",
      "install": {
        "direct": "npx shadcn@latest add https://uiblocks.org/r/recipe-tool-workspace.json",
        "namespaced": "npx shadcn@latest add @uiblocks/recipe-tool-workspace",
        "registryConfig": {
          "registries": {
            "@uiblocks": "https://uiblocks.org/r/{name}.json"
          }
        },
        "entry": "@components/uiblocks/recipe-tool-workspace/recipe-tool-workspace.tsx",
        "exportName": "default",
        "dependencies": [
          "lucide-react@0.577.0"
        ],
        "requirements": {
          "react": ">=19",
          "tailwind": ">=4"
        },
        "usage": "import ToolWorkspaceRecipe from \"@/components/uiblocks/recipe-tool-workspace/recipe-tool-workspace\";\n\nexport default function WorkspacePage() {\n  return <ToolWorkspaceRecipe mode=\"demo\" websiteHref=\"/\" upgradeHref=\"/pricing\" />;\n}"
      },
      "compositionSource": {
        "language": "tsx",
        "componentName": "ToolWorkspaceRecipe",
        "referenceOnly": false,
        "installedEntry": "@components/uiblocks/recipe-tool-workspace/recipe-tool-workspace.tsx",
        "content": "\"use client\";\n\nimport {\n  CheckCircle2,\n  Circle,\n  CircleAlert,\n  FlaskConical,\n  LoaderCircle,\n  RotateCcw,\n} from \"lucide-react\";\nimport {\n  useEffect,\n  useState,\n  type ReactNode,\n  type ComponentProps,\n} from \"react\";\nimport ResultsGallery01, {\n  type DemoResult,\n} from \"./shared/content/components/workspace/results-gallery-01\";\nimport TaskQueue01, {\n  type DemoTask,\n} from \"./shared/content/components/workspace/task-queue-01\";\nimport UploadWorkflow01, {\n  type WorkflowFile,\n} from \"./shared/content/components/workspace/upload-workflow-01\";\nimport UsagePanel01 from \"./shared/content/components/workspace/usage-panel-01\";\nimport WorkspaceHeader01 from \"./shared/content/components/workspace/workspace-header-01\";\n\nexport type WorkspaceStatus =\n  | \"empty\"\n  | \"ready\"\n  | \"processing\"\n  | \"completed\"\n  | \"error\";\nexport type { WorkflowFile, DemoTask, DemoResult };\nexport type WorkspaceUploadContext = {\n  files: WorkflowFile[];\n  busy: boolean;\n  onFilesChange: (files: WorkflowFile[]) => void;\n  onRun: (files: WorkflowFile[], format: string) => Promise<void>;\n};\nexport type ToolWorkspaceRecipeProps = {\n  /** Only explicit demo mode starts local timers or fabricates sample results. */\n  mode?: \"controlled\" | \"demo\";\n  theme?: \"inherit\" | \"dark\";\n  className?: string;\n  websiteHref?: string;\n  upgradeHref?: string;\n  header?: Omit<\n    NonNullable<ComponentProps<typeof WorkspaceHeader01>>,\n    \"onSearch\" | \"searchQuery\" | \"websiteHref\"\n  >;\n  upload?: Pick<\n    NonNullable<ComponentProps<typeof UploadWorkflow01>>,\n    \"title\" | \"description\"\n  >;\n  queueTitle?: string;\n  resultsTitle?: string;\n  usage?: ComponentProps<typeof UsagePanel01>;\n  files?: WorkflowFile[];\n  onFilesChange?: (files: WorkflowFile[]) => void;\n  status?: WorkspaceStatus;\n  progress?: number;\n  tasks?: DemoTask[];\n  results?: DemoResult[];\n  searchQuery?: string;\n  onSearchChange?: (query: string) => void;\n  /** Invoked only in controlled mode; the host owns network work and status updates. */\n  onRun?: (files: WorkflowFile[], format: string) => void | Promise<void>;\n  onRetry?: (id: string) => void | Promise<void>;\n  errorMessage?: string;\n  initialDemoState?: WorkspaceStatus;\n  demoFiles?: WorkflowFile[];\n  showDemoControls?: boolean;\n  /** The default selector returns metadata, not File bytes. Supply a real upload control here. */\n  renderUpload?: (context: WorkspaceUploadContext) => ReactNode;\n  /** The default gallery downloads SVG examples. Supply real result links here. */\n  renderResults?: (context: {\n    results: DemoResult[];\n    searchQuery: string;\n    status: WorkspaceStatus;\n  }) => ReactNode;\n  headerSlot?: ReactNode;\n  footer?: ReactNode;\n};\nconst exampleFiles: WorkflowFile[] = [\n  { id: \"sample-launch\", name: \"Launch-film.mp4\", size: 26_738_000 },\n  { id: \"sample-studio\", name: \"Studio-walkthrough.mov\", size: 48_124_000 },\n];\n\n/**\n * Five-block workspace composition. Controlled mode never simulates a backend.\n * The included UI blocks retain their honest demo labels; adapt these source\n * files, renderUpload/renderResults/headerSlot, and service callbacks for a\n * production product. No upload, transcoding, authentication, or billing API is included.\n */\nexport default function ToolWorkspaceRecipe({\n  mode = \"controlled\",\n  theme = \"inherit\",\n  className = \"\",\n  websiteHref = \"/\",\n  upgradeHref = \"#pricing\",\n  header,\n  upload,\n  queueTitle,\n  resultsTitle,\n  usage,\n  files: suppliedFiles,\n  onFilesChange,\n  status: suppliedStatus,\n  progress: suppliedProgress,\n  tasks: suppliedTasks,\n  results: suppliedResults,\n  searchQuery: suppliedSearch,\n  onSearchChange,\n  onRun,\n  onRetry,\n  errorMessage,\n  initialDemoState = \"completed\",\n  demoFiles = exampleFiles,\n  showDemoControls = true,\n  renderUpload,\n  renderResults,\n  headerSlot,\n  footer,\n}: ToolWorkspaceRecipeProps) {\n  const [localFiles, setLocalFiles] = useState<WorkflowFile[]>(\n    mode === \"demo\" && initialDemoState !== \"empty\" ? demoFiles : []\n  );\n  const files = suppliedFiles ?? localFiles;\n  const [demoState, setDemoState] = useState<WorkspaceStatus>(initialDemoState);\n  const state =\n    mode === \"demo\"\n      ? demoState\n      : (suppliedStatus ?? (files.length ? \"ready\" : \"empty\"));\n  const [format, setFormat] = useState(\"MP4\");\n  const [demoProgress, setDemoProgress] = useState(\n    initialDemoState === \"completed\" ? 100 : 0\n  );\n  const rawProgress = mode === \"demo\" ? demoProgress : (suppliedProgress ?? 0);\n  const progress = Number.isFinite(rawProgress)\n    ? Math.max(0, Math.min(100, rawProgress))\n    : 0;\n  const [submitting, setSubmitting] = useState(false);\n  const [serviceError, setServiceError] = useState(\"\");\n  const [localSearch, setLocalSearch] = useState(\"\");\n  const searchQuery = suppliedSearch ?? localSearch;\n  function setSearchQuery(query: string) {\n    setLocalSearch(query);\n    onSearchChange?.(query);\n  }\n\n  useEffect(() => {\n    if (mode !== \"demo\" || state !== \"processing\") return;\n    const interval = window.setInterval(\n      () => setDemoProgress((value) => Math.min(96, value + 14)),\n      350\n    );\n    const timeout = window.setTimeout(() => {\n      setDemoProgress(100);\n      setDemoState(\"completed\");\n    }, 2400);\n    return () => {\n      window.clearInterval(interval);\n      window.clearTimeout(timeout);\n    };\n  }, [mode, state]);\n\n  const tasks: DemoTask[] =\n    suppliedTasks?.map((task) =>\n      task.status === \"processing\" && task.progress === undefined\n        ? { ...task, progress }\n        : task\n    ) ??\n    (mode === \"demo\"\n      ? files.map((file, index) => ({\n          id: file.id,\n          name: file.name,\n          detail: `${format} · Demo workflow`,\n          status:\n            state === \"completed\"\n              ? \"completed\"\n              : state === \"error\" && index === 0\n                ? \"error\"\n                : state === \"processing\" && index === 0\n                  ? \"processing\"\n                  : \"queued\",\n          progress:\n            state === \"processing\" && index === 0 ? progress : undefined,\n        }))\n      : []);\n  const results: DemoResult[] =\n    suppliedResults ??\n    (mode === \"demo\" && state === \"completed\"\n      ? files.map((file, index) => ({\n          id: file.id,\n          name: file.name.replace(/\\.[^.]+$/, \"\"),\n          format,\n          detail: \"SVG demo preview · No video conversion\",\n          tone: ([\"violet\", \"mint\", \"peach\"] as const)[index % 3],\n        }))\n      : []);\n\n  function changeFiles(nextFiles: WorkflowFile[]) {\n    setLocalFiles(nextFiles);\n    if (mode === \"demo\") {\n      setDemoProgress(0);\n      setDemoState(nextFiles.length ? \"ready\" : \"empty\");\n    } else onFilesChange?.(nextFiles);\n  }\n\n  async function startWorkflow(nextFiles: WorkflowFile[], nextFormat: string) {\n    if (!nextFiles.length || submitting) return;\n    setFormat(nextFormat);\n    setServiceError(\"\");\n    if (mode === \"demo\") {\n      setLocalFiles(nextFiles);\n      setDemoProgress(8);\n      setDemoState(\"processing\");\n      return;\n    }\n    if (!onRun) {\n      setServiceError(\n        \"This workflow is not connected to a processing service yet.\"\n      );\n      return;\n    }\n    setSubmitting(true);\n    try {\n      await onRun(nextFiles, nextFormat);\n    } catch {\n      setServiceError(\"The workflow could not start. Please try again.\");\n    } finally {\n      setSubmitting(false);\n    }\n  }\n\n  async function retryTask(id: string) {\n    if (submitting) return;\n    if (mode === \"demo\") return startWorkflow(files, format);\n    if (!onRetry) {\n      if (onRun && files.length) return startWorkflow(files, format);\n      setServiceError(\"This task is not connected to a retry action yet.\");\n      return;\n    }\n    setServiceError(\"\");\n    setSubmitting(true);\n    try {\n      await onRetry(id);\n    } catch {\n      setServiceError(\"The task could not restart. Please try again.\");\n    } finally {\n      setSubmitting(false);\n    }\n  }\n  const uploadContext: WorkspaceUploadContext = {\n    files,\n    busy: state === \"processing\" || submitting,\n    onFilesChange: changeFiles,\n    onRun: startWorkflow,\n  };\n\n  function changeDemoState(nextState: WorkspaceStatus) {\n    if (nextState === \"empty\") {\n      setLocalFiles([]);\n      setSearchQuery(\"\");\n    } else if (!files.length) {\n      setLocalFiles(demoFiles);\n    }\n    setDemoProgress(\n      nextState === \"processing\" ? 8 : nextState === \"completed\" ? 100 : 0\n    );\n    setDemoState(nextState);\n  }\n\n  const states = [\n    { value: \"empty\", label: \"Empty\", icon: Circle },\n    { value: \"processing\", label: \"Processing\", icon: LoaderCircle },\n    { value: \"completed\", label: \"Complete\", icon: CheckCircle2 },\n    { value: \"error\", label: \"Error\", icon: CircleAlert },\n  ] as const;\n\n  return (\n    <div\n      className={`${theme === \"inherit\" ? \"\" : theme} min-h-screen bg-zinc-50 text-zinc-950 dark:bg-zinc-900/50 dark:text-zinc-50 ${className}`}\n    >\n      {headerSlot ?? (\n        <WorkspaceHeader01\n          {...header}\n          onSearch={setSearchQuery}\n          searchQuery={searchQuery}\n          websiteHref={websiteHref}\n        />\n      )}\n      <main className=\"mx-auto max-w-7xl px-5 pb-12 sm:px-8\">\n        {mode === \"demo\" && showDemoControls && (\n          <div className=\"mb-6 flex flex-col justify-between gap-3 rounded-xl border border-zinc-200 bg-white px-4 py-3 sm:flex-row sm:items-center dark:border-zinc-800 dark:bg-zinc-950\">\n            <div className=\"flex items-center gap-2.5\">\n              <FlaskConical\n                aria-hidden=\"true\"\n                className=\"size-4 shrink-0 text-violet-500\"\n              />\n              <p className=\"text-[11px] leading-5 text-zinc-500 dark:text-zinc-400\">\n                <span className=\"font-medium text-zinc-700 dark:text-zinc-200\">\n                  Try every state.\n                </span>{\" \"}\n                Sample files are illustrative. Nothing is uploaded or converted.\n              </p>\n            </div>\n            <div\n              aria-label=\"Choose a demo state\"\n              className=\"flex flex-wrap gap-1\"\n              role=\"group\"\n            >\n              {states.map(({ value, label, icon: Icon }) => (\n                <button\n                  aria-pressed={state === value}\n                  className={`inline-flex min-h-8 items-center gap-1.5 rounded-md px-2.5 text-[10px] font-medium transition-colors focus-visible:outline-2 focus-visible:outline-violet-500 ${state === value ? \"bg-violet-50 text-violet-600 dark:bg-violet-950/50 dark:text-violet-300\" : \"text-zinc-400 hover:bg-zinc-100 hover:text-zinc-700 dark:hover:bg-zinc-800 dark:hover:text-zinc-200\"}`}\n                  key={value}\n                  onClick={() => changeDemoState(value)}\n                  type=\"button\"\n                >\n                  <Icon\n                    aria-hidden=\"true\"\n                    className={`size-3 ${state === value && value === \"processing\" ? \"animate-spin\" : \"\"}`}\n                  />\n                  {label}\n                </button>\n              ))}\n            </div>\n          </div>\n        )}\n        {(state === \"error\" || serviceError) && (\n          <div\n            className=\"mb-6 flex flex-wrap items-center gap-3 rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-red-700 dark:border-red-900 dark:bg-red-950/20 dark:text-red-300\"\n            role=\"alert\"\n          >\n            <CircleAlert aria-hidden=\"true\" className=\"size-4 shrink-0\" />\n            <p className=\"flex-1 text-xs leading-5\">\n              {errorMessage ??\n                (serviceError ||\n                  (mode === \"demo\"\n                    ? \"Demo error: this task needs another try. Your selected file details are still here.\"\n                    : \"This task needs another try. Your selected file details are still here.\"))}\n            </p>\n            {(mode === \"demo\" || onRetry || onRun) && (\n              <button\n                className=\"inline-flex min-h-8 items-center gap-1.5 rounded-lg border border-red-200 bg-white px-3 text-[11px] font-medium hover:bg-red-100 dark:border-red-800 dark:bg-red-950/30 dark:hover:bg-red-950\"\n                disabled={submitting}\n                onClick={() =>\n                  void retryTask(\n                    tasks.find((task) => task.status === \"error\")?.id ??\n                      files[0]?.id ??\n                      \"\"\n                  )\n                }\n                type=\"button\"\n              >\n                <RotateCcw aria-hidden=\"true\" className=\"size-3\" />{\" \"}\n                {mode === \"demo\" ? \"Retry demo\" : \"Retry\"}\n              </button>\n            )}\n          </div>\n        )}\n        <div className=\"grid grid-cols-1 items-start gap-6 md:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)] xl:grid-cols-[320px_minmax(0,1fr)_250px]\">\n          {renderUpload ? (\n            renderUpload(uploadContext)\n          ) : (\n            <UploadWorkflow01\n              {...upload}\n              busy={uploadContext.busy}\n              files={files}\n              onFilesChange={changeFiles}\n              onRun={(nextFiles, nextFormat) =>\n                void startWorkflow(nextFiles, nextFormat)\n              }\n            />\n          )}\n          <div className=\"min-w-0 space-y-6\">\n            <TaskQueue01\n              onRetry={(id) => void retryTask(id)}\n              title={queueTitle}\n              searchQuery={searchQuery}\n              tasks={tasks}\n            />\n            {renderResults ? (\n              renderResults({ results, searchQuery, status: state })\n            ) : (\n              <ResultsGallery01\n                title={resultsTitle}\n                results={results}\n                searchQuery={searchQuery}\n              />\n            )}\n          </div>\n          <div className=\"md:col-span-2 xl:col-span-1\">\n            <UsagePanel01\n              planName={mode === \"demo\" ? \"Studio demo\" : \"Usage\"}\n              upgradeHref={upgradeHref}\n              used={\n                mode === \"demo\"\n                  ? 38 + (state === \"completed\" ? files.length : 0)\n                  : 0\n              }\n              {...usage}\n            />\n          </div>\n        </div>\n        {footer ??\n          (mode === \"demo\" && (\n            <p className=\"mt-7 text-center text-[10px] leading-5 text-zinc-400\">\n              Frame is a fictional product. This UIBlocks recipe demonstrates\n              local interface behavior, not a hosted processing service.\n            </p>\n          ))}\n      </main>\n    </div>\n  );\n}\n",
        "guidance": "Install this complete recipe with its single shadcn command, then import the component using your configured components alias and meta.entry. Matching blocks, helpers, and MIT notices are bundled. Pass your own copy, navigation, and callbacks through the published props. Workspace simulation requires explicit demo mode; controlled mode delegates processing to your application."
      }
    }
  ]
}
