{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "innovation", "type": "registry:block", "dependencies": [ "lucide-react", "motion", "recharts" ], "registryDependencies": [], "files": [ { "path": "registry/new-york/innovation/components/cta-button.tsx", "content": "import { Download } from \"lucide-react\";\n\ninterface CtaButtonProps {\n label?: string;\n href?: string;\n}\n\nexport function CtaButton({ label = \"Get Innovation Materials\", href = \"#\" }: CtaButtonProps) {\n return (\n
\n \n
\n
\n \n {label}\n
\n \n
\n );\n}\n", "type": "registry:component" }, { "path": "registry/new-york/innovation/components/get-it-section.tsx", "content": "import { Card } from \"@/components/ui\";\nimport { BookOpen } from \"lucide-react\";\nimport type { GetItData } from \"../types\";\n\nexport function GetItSection({ heading, body, resources, highlight }: GetItData) {\n return (\n
\n

How do I get it?

\n\n
\n \n
\n
\n

{heading}

\n

\n {body}\n

\n\n
\n {resources.map((resource, i) => (\n \n \n \n {resource.label}\n \n \n ))}\n
\n\n
\n

\n {highlight}\n

\n
\n
\n\n \n
\n
\n
\n
\n
\n
\n \n
\n
\n

\n Access all materials\n

\n
\n
\n
\n \n
\n \n );\n}\n", "type": "registry:component" }, { "path": "registry/new-york/innovation/components/hero-section.tsx", "content": "interface HeroSectionProps {\n title: string;\n subtitle: string;\n}\n\nexport function HeroSection({ title, subtitle }: HeroSectionProps) {\n return (\n
\n
\n
\n
\n
\n
\n

{title}

\n

{subtitle}

\n
\n
\n );\n}", "type": "registry:component" }, { "path": "registry/new-york/innovation/components/how-to-section.tsx", "content": "import { ArrowRight } from \"lucide-react\";\nimport { Card } from \"@/components/ui\";\nimport type { HowToUseData } from \"../types\";\n\nexport function HowToUseSection({ steps }: HowToUseData) {\n return (\n
\n
\n

How do you use it?

\n\n
\n \n
\n {steps.map((step, index) => (\n
\n \n
\n
\n \n {index + 1}.\n \n
\n \n
\n
\n
\n \n

{step.title}

\n

{step.description}

\n
\n
\n {index < steps.length - 1 && (\n \n \n
\n )}\n
\n ))}\n
\n \n \n \n \n );\n}\n", "type": "registry:component" }, { "path": "registry/new-york/innovation/components/nav-footer.tsx", "content": "\"use client\";\n\nimport { motion } from \"motion/react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\ninterface NavigationFooterProps {\n prevHref?: string;\n nextHref?: string;\n current?: number;\n total?: number;\n}\n\nexport function NavigationFooter({\n prevHref,\n nextHref,\n current = 1,\n total = 1,\n}: NavigationFooterProps) {\n const dots = Array.from({ length: total }, (_, i) => i + 1);\n\n return (\n
\n
\n
\n \n \n PREV\n \n\n
\n ALL INNOVATIONS\n
\n {dots.map((dot) => (\n \n ))}\n
\n
\n\n \n NEXT\n \n \n
\n
\n
\n );\n}\n", "type": "registry:component" }, { "path": "registry/new-york/innovation/components/test-it-section.tsx", "content": "\"use client\";\n\nimport { Card } from \"@/components/ui\";\nimport {\n BarChart,\n Bar,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n ResponsiveContainer,\n PieChart,\n Pie,\n Cell,\n} from \"recharts\";\nimport type { TestingData } from \"../types\";\n\nconst COLORS = [\"#033C5A\", \"#AA9868\", \"#5A6C7D\", \"#D4C5A0\"];\n\nexport function TestingSection({ headline, body, callout, barData, pieData1, pieData2 }: TestingData) {\n return (\n
\n

How have we tested it?

\n\n
\n \n
\n
\n

\n {headline}\n

\n

\n {body}\n

\n
\n

\n {callout}\n

\n
\n
\n\n
\n \n \n \n \n \n \n \n \n \n
\n
\n\n
\n
\n

\n Test Results Distribution\n

\n \n \n \n {pieData1.map((_entry, index) => (\n \n ))}\n \n \n \n \n
\n {pieData1.map((entry, index) => (\n
\n
\n \n {entry.name}: {entry.value}%\n \n
\n ))}\n
\n
\n\n
\n

Combination of testing data

\n
\n \n \n \n {pieData2.map((_entry, index) => (\n \n ))}\n \n \n \n \n
\n
\n
\n \n
\n \n );\n}\n", "type": "registry:component" }, { "path": "registry/new-york/innovation/components/user-story-section.tsx", "content": "\"use client\";\n\nimport { Card } from \"@/components/ui\";\nimport { User, Quote } from \"lucide-react\";\nimport type { UserStoryData } from \"../types\";\n\nexport function UserStorySection({ storyIntro, paragraphs, quote, name, role, org }: UserStoryData) {\n return (\n
\n
\n

Who has used it?

\n\n
\n \n
\n
\n\n
\n
\n
\n \n

\n {storyIntro}\n

\n
\n\n {paragraphs.map((p, i) => (\n

\n {p}\n

\n ))}\n\n
\n

\n “{quote}”\n

\n
\n
\n\n
\n
\n \n
\n\n
\n

{name}

\n

{role}

\n

\n {org}\n

\n
\n
\n
\n
\n
\n
\n
\n );\n}\n", "type": "registry:component" }, { "path": "registry/new-york/innovation/components/what-is-it-section.tsx", "content": "\"use client\";\n\nimport {\n Card,\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from \"@/components/ui\";\nimport type { WhatIsItData } from \"../types\";\n\nexport function WhatIsItSection({ headline, body, capabilities, highlight }: WhatIsItData) {\n return (\n
\n
\n

What is it?

\n
\n \n
\n
\n

\n {headline}\n

\n

\n {body}\n

\n \n {capabilities.map((cap, i) => (\n \n svg]:text-white\">\n {cap.label}\n \n \n {cap.detail}\n \n \n ))}\n \n
\n

{highlight}

\n
\n
\n
\n
\n
\n
\n
\n
\n

Visual representation

\n
\n
\n
\n
\n
\n
\n
\n );\n}\n", "type": "registry:component" }, { "path": "registry/new-york/innovation/innovation.tsx", "content": "import { HeroSection } from \"./components/hero-section\";\nimport { WhatIsItSection } from \"./components/what-is-it-section\";\nimport { HowToUseSection } from \"./components/how-to-section\";\nimport { TestingSection } from \"./components/test-it-section\";\nimport { UserStorySection } from \"./components/user-story-section\";\nimport { GetItSection } from \"./components/get-it-section\";\nimport { CtaButton } from \"./components/cta-button\";\nimport { NavigationFooter } from \"./components/nav-footer\";\nimport type { InnovationData } from \"./types\";\n\ninterface InnovationProps {\n data: InnovationData;\n}\n\nexport function Innovation({ data }: InnovationProps) {\n return (\n
\n
\n\n \n\n \n \n \n \n \n\n \n\n \n
\n
\n );\n}", "type": "registry:component" }, { "path": "registry/new-york/innovation/types.ts", "content": "import type { LucideIcon } from \"lucide-react\";\n\nexport interface WhatIsItData {\n headline: string;\n body: string;\n capabilities: { label: string; detail: string }[];\n highlight: string;\n}\n\nexport interface HowToUseData {\n steps: {\n title: string;\n description: string;\n icon: LucideIcon;\n }[];\n}\n\nexport interface TestingData {\n headline: string;\n body: string;\n callout: string;\n barData: { name: string; value: number }[];\n pieData1: { name: string; value: number }[];\n pieData2: { name: string; value: number }[];\n}\n\nexport interface UserStoryData {\n storyIntro: string;\n paragraphs: string[];\n quote: string;\n name: string;\n role: string;\n org: string;\n}\n\nexport interface GetItData {\n heading: string;\n body: string;\n resources: {\n icon: LucideIcon;\n label: string;\n href?: string;\n }[];\n highlight: string;\n}\n\nexport interface InnovationData {\n hero: {\n title: string;\n subtitle: string;\n };\n whatIsIt: WhatIsItData;\n howToUse: HowToUseData;\n testing: TestingData;\n userStory: UserStoryData;\n getIt: GetItData;\n cta?: {\n label?: string;\n href?: string;\n };\n navigation?: {\n prevHref?: string;\n nextHref?: string;\n current?: number;\n total?: number;\n };\n}\n", "type": "registry:file" } ] }