{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "portfolio-template",
  "title": "Portfolio template",
  "author": "andongmin94",
  "description": "A minimal portfolio with an introduction, selected work, and contact links.",
  "dependencies": [
    "lucide-react@^1.24.0"
  ],
  "registryDependencies": [
    "https://neobrutal-ui.andongmin.com/r/neobrutal-ui.json",
    "https://neobrutal-ui.andongmin.com/r/button.json"
  ],
  "files": [
    {
      "path": "src/blocks/templates/portfolio-template.tsx",
      "content": "\"use client\";\n\nimport { ArrowUpRight, ChevronDown, Mail } from \"lucide-react\";\n\nimport { Button } from \"@/components/ui/button\";\n\nconst TEMPLATE_THEME =\n  \"[color-scheme:light] [--background:#fff0dc] [--secondary-background:#fff] [--foreground:#000] [--main-foreground:#000] [--main:#ff7b07] [--border:#000] [--ring:#000] [--box-shadow-x:4px] [--box-shadow-y:4px] [--reverse-box-shadow-x:-4px] [--reverse-box-shadow-y:-4px] [--shadow:4px_4px_0px_0px_var(--border)] [--radius:5px] [--base-font-weight:500] [--heading-font-weight:700] dark:[color-scheme:dark] dark:[--background:#2c304c] dark:[--secondary-background:#222] dark:[--foreground:#ececec] dark:[--main:#ff7b07] dark:[--ring:#fff]\";\n\nconst NAV_ITEMS = [\n  { label: \"Work\", href: \"#work\" },\n  { label: \"Contact\", href: \"#contact\" },\n] as const;\n\nconst PROJECTS = [\n  {\n    title: \"Wayline\",\n    type: \"Product design and front-end\",\n    year: \"2026\",\n    summary: \"A dispatch planning workspace that turns route changes into clear next actions.\",\n  },\n  {\n    title: \"Ledgerline\",\n    type: \"Product design\",\n    year: \"2025\",\n    summary: \"A calm reporting system for finance teams reviewing a busy monthly close.\",\n  },\n  {\n    title: \"Open Index\",\n    type: \"Web design and development\",\n    year: \"2025\",\n    summary: \"An accessible public directory for shared tools, datasets, and practical guides.\",\n  },\n] as const;\n\nexport default function PortfolioTemplate() {\n  return (\n    <div\n      id=\"top\"\n      className={`min-h-dvh flex flex-col bg-background text-foreground selection:bg-main selection:text-main-foreground ${TEMPLATE_THEME}`}\n    >\n      <header className=\"border-b-2 border-border\">\n        <div className=\"mx-auto flex h-12 w-full max-w-3xl items-center justify-between gap-4 px-4 sm:px-6\">\n          <a href=\"#top\" className=\"font-heading text-sm\" aria-label=\"Sora Han home\">\n            Sora Han\n          </a>\n\n          <nav aria-label=\"Primary navigation\" className=\"flex items-center gap-4 text-sm\">\n            {NAV_ITEMS.map((item) => (\n              <a key={item.href} href={item.href} className=\"hover:underline\">\n                {item.label}\n              </a>\n            ))}\n          </nav>\n        </div>\n      </header>\n\n      <main className=\"flex-1\">\n        <div className=\"mx-auto w-full max-w-3xl px-4 py-8 sm:px-6 sm:py-10\">\n          <section aria-labelledby=\"portfolio-title\">\n            <h1 id=\"portfolio-title\" className=\"font-heading text-4xl sm:text-5xl\">\n              Sora Han\n            </h1>\n            <p className=\"mt-3 font-heading text-lg sm:text-xl\">\n              Product designer and front-end developer.\n            </p>\n            <div className=\"mt-6 max-w-2xl space-y-2 leading-relaxed\">\n              <p>I design focused digital products for people doing complex work.</p>\n              <p>I work from early product thinking through accessible front-end delivery.</p>\n            </div>\n          </section>\n\n          <section id=\"work\" aria-labelledby=\"work-title\" className=\"mt-9 scroll-mt-16\">\n            <h2 id=\"work-title\" className=\"font-heading text-lg\">\n              Selected work\n            </h2>\n\n            <ul className=\"mt-3 border-y-2 border-border\">\n              {PROJECTS.map((project) => (\n                <li key={project.title} className=\"border-b-2 border-border last:border-b-0\">\n                  <details className=\"group\">\n                    <summary className=\"flex cursor-pointer list-none items-center justify-between gap-6 py-3 hover:bg-secondary-background sm:px-3 [&::-webkit-details-marker]:hidden\">\n                      <span className=\"min-w-0\">\n                        <span className=\"block font-heading\">{project.title}</span>\n                        <span className=\"mt-1 block text-sm opacity-70\">{project.type}</span>\n                      </span>\n                      <span className=\"flex shrink-0 items-center gap-3 text-sm\">\n                        {project.year}\n                        <ChevronDown\n                          className=\"size-4 transition-transform group-open:rotate-180\"\n                          aria-hidden=\"true\"\n                        />\n                      </span>\n                    </summary>\n                    <p className=\"border-t-2 border-border px-0 py-3 text-sm leading-relaxed text-foreground/75 sm:px-3\">\n                      {project.summary}\n                    </p>\n                  </details>\n                </li>\n              ))}\n            </ul>\n          </section>\n\n          <div\n            id=\"contact\"\n            aria-label=\"Contact links\"\n            className=\"mt-6 flex scroll-mt-16 flex-wrap items-center gap-x-5 gap-y-3 border-t-2 border-border pt-4\"\n          >\n            <Button asChild nativeButton={false} size=\"sm\">\n              <a href=\"mailto:hello@sorahan.design\">\n                <Mail aria-hidden=\"true\" />\n                Email\n              </a>\n            </Button>\n            <a\n              href=\"https://github.com\"\n              target=\"_blank\"\n              rel=\"noreferrer\"\n              className=\"inline-flex items-center gap-1 text-sm hover:underline\"\n            >\n              GitHub\n              <ArrowUpRight className=\"size-4\" aria-hidden=\"true\" />\n            </a>\n            <a\n              href=\"https://www.linkedin.com\"\n              target=\"_blank\"\n              rel=\"noreferrer\"\n              className=\"inline-flex items-center gap-1 text-sm hover:underline\"\n            >\n              LinkedIn\n              <ArrowUpRight className=\"size-4\" aria-hidden=\"true\" />\n            </a>\n          </div>\n        </div>\n      </main>\n\n      <footer className=\"border-t-2 border-border\">\n        <div className=\"mx-auto flex w-full max-w-3xl items-center justify-between gap-4 px-4 py-4 text-xs sm:px-6\">\n          <p>(c) 2026 Sora Han</p>\n          <a href=\"#top\" className=\"hover:underline\">\n            Back to top\n          </a>\n        </div>\n      </footer>\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/templates/portfolio-template.tsx"
    },
    {
      "path": "src/blocks/templates/pages/portfolio/page.tsx",
      "content": "import PortfolioTemplate from \"@/components/templates/portfolio-template\";\n\nexport default function Page() {\n  return <PortfolioTemplate />;\n}\n",
      "type": "registry:page",
      "target": "app/portfolio/page.tsx"
    }
  ],
  "categories": [
    "template",
    "portfolio"
  ],
  "type": "registry:block"
}