{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "feature-interactive-tabs",
  "title": "Feature Interactive Tabs",
  "type": "registry:block",
  "description": "Master-detail architectural feature workbench with interactive source snippets, copy action, telemetry stats, and verified technical checks.",
  "categories": [
    "marketing"
  ],
  "files": [
    {
      "path": "packages/elements-lit/src/blocks/feature-interactive-tabs/feature-interactive-tabs.ts",
      "content": "import { LitElement, css, html } from 'lit'\nimport { Activity, Check, CheckCircle2, Code2, Copy, LayoutGrid, Terminal, Zap, type IconNode } from 'lucide'\nimport { cn } from '../../lib/utils'\nimport { tailwind } from '../../lib/styles'\nimport { ThemeController } from '../../lib/theme'\nimport { icon } from '../../lib/icon'\n// Side-effect import: registers <uip-badge> for standalone use (consumers\n// who install only this block still get a working badge).\nimport '../../components/badge/badge'\n\ninterface FeatureTab {\n  id: string\n  title: string\n  subtitle: string\n  icon: IconNode\n  iconName: string\n  tag: string\n  headline: string\n  description: string\n  codeSnippet: string\n  stats: { label: string; value: string }[]\n  checks: string[]\n}\n\nconst tabs: FeatureTab[] = [\n  {\n    id: 'unbundled',\n    title: 'Zero-Package Registry',\n    subtitle: 'Direct AST source ownership',\n    icon: Code2,\n    iconName: 'code-2',\n    tag: 'No Node Modules Bloat',\n    headline: 'You own 100% of the source code. No semver breaking changes.',\n    description:\n      'Unlike monolithic component packages that lock you into inflexible dependency trees, UIPKGE copies pristine, tree-shakeable source files directly into your project repository.',\n    codeSnippet: `// Terminal command:\\nnpx shadcn@latest add https://uipkge.dev/r/react/hero-developer-terminal.json\\n\\n// Output in your repo:\\n// ✔ Placed components/blocks/HeroDeveloperTerminal.tsx\\n// ✔ Installed zero runtime wrapper overhead`,\n    stats: [\n      { label: 'Bundle Size Overhead', value: '0.0 kB' },\n      { label: 'Semver Breakage Risk', value: '0%' },\n      { label: 'Customization Freedom', value: '100%' },\n    ],\n    checks: [\n      'Raw SFC/TSX files living right in your /components directory',\n      'Edit Tailwind tokens, props, or behavior anytime without forking',\n      'Never wait on upstream maintainers for critical hotfixes or styling tweaks',\n    ],\n  },\n  {\n    id: 'parity',\n    title: 'Dual-Framework Parity',\n    subtitle: 'Synchronized Vue 3.5 & React 19',\n    icon: LayoutGrid,\n    iconName: 'layout-grid',\n    tag: '1:1 AST Parity',\n    headline: 'One design system, identical aesthetics across Vue and React.',\n    description:\n      'Whether your engineering organization uses Nuxt 3, Vite, Next.js, or Astro, every primitive and block shares identical OKLCH color spaces, CVA variant tokens, and spring transition curves.',\n    codeSnippet: `// Vue 3.5 SFC:\\n<Button variant=\"default\" size=\"sm\">Deploy</Button>\\n\\n// React 19 JSX:\\n<Button variant=\"default\" size=\"sm\">Deploy</Button>\\n\\n// Both generate identical DOM attributes & micro-interactions`,\n    stats: [\n      { label: 'Token Parity', value: '100.0%' },\n      { label: 'Supported Frameworks', value: 'Vue 3.5 + React 19' },\n      { label: 'Shared CVA Tokens', value: '31 Primitives' },\n    ],\n    checks: [\n      'Reka UI (Vue) and Radix UI (React) accessible headless engines',\n      'Automated CI check verifying cross-framework class string equality',\n      'Identical behavior in Vue and React microfrontends',\n    ],\n  },\n  {\n    id: 'telemetry',\n    title: 'Interactive Workbenches',\n    subtitle: 'Beyond static cards & fluff',\n    icon: Activity,\n    iconName: 'activity',\n    tag: 'Dense & Functional',\n    headline: 'Real-time controls, telemetry, and live interactive state.',\n    description:\n      'Every UIPKGE marketing block functions as a live interactive workbench with stateful sliders, timeframe toggles, and reactive calculation engines.',\n    codeSnippet: `// Composing live reactive telemetry in your blocks:\\nconst [activeCohort, setActiveCohort] = React.useState<'enterprise' | 'growth'>('enterprise')\\nconst liveThroughput = activeCohort === 'enterprise' ? '1.2M QPS' : '45k QPS'`,\n    stats: [\n      { label: 'Interactive Demos', value: '450+ Blocks' },\n      { label: 'Keyboard Ergonomics', value: 'WCAG AA' },\n      { label: 'Telemetry Visualizers', value: 'Real SVG Sparklines' },\n    ],\n    checks: [\n      'Functional master-detail views and comparative toggles',\n      'Integrated mock API testers, terminal sandboxes, and pricing calculators',\n      'Zero placeholder text or dummy lorum ipsum shapes',\n    ],\n  },\n  {\n    id: 'performance',\n    title: 'Sub-Millisecond Speed',\n    subtitle: 'OKLCH Tailwind v4 Engine',\n    icon: Zap,\n    iconName: 'zap',\n    tag: 'Lighthouse 100',\n    headline: 'Engineered for zero-latency interactions and pristine Lighthouse scores.',\n    description:\n      'Built on modern CSS custom properties and lightweight headless primitives, our blocks avoid hefty client-side runtime libraries, keeping your First Contentful Paint blazing fast.',\n    codeSnippet: `@theme inline {\\n  --color-primary: oklch(0.205 0 0);\\n  --color-primary-foreground: oklch(0.985 0 0);\\n  --ease-spring: cubic-bezier(0.16, 1, 0.3, 1);\\n}`,\n    stats: [\n      { label: 'Interaction to Next Paint (INP)', value: '< 16ms' },\n      { label: 'Lighthouse Score', value: '100 / 100' },\n      { label: 'CSS Engine', value: 'Tailwind CSS v4' },\n    ],\n    checks: [\n      'OKLCH native color spaces with automatic light/dark mode adaptation',\n      'Hardware-accelerated transforms and calibrated spring physics',\n      'Zero runtime JavaScript CSS parsing or CSS-in-JS style injection',\n    ],\n  },\n]\n\n/**\n * <uip-feature-interactive-tabs> — the registry FeatureInteractiveTabs block\n * as a web component.\n *\n * Class strings are React's FeatureInteractiveTabs verbatim. React state\n * (useState) becomes @state fields; the copy-label timeout is cleared in\n * `disconnectedCallback`. The detail panel is a plain div carrying the\n * registry Card classes (see the login-01 block).\n */\nexport class UipFeatureInteractiveTabs extends LitElement {\n  static shadowRootOptions = { ...LitElement.shadowRootOptions, delegatesFocus: true }\n  // :host display can't be a utility class (the host has no template of its own).\n  static styles = [tailwind, css`:host { display: block; }`]\n\n  static properties = {\n    activeTabId: { state: true },\n    copiedCode: { state: true },\n  }\n\n  private activeTabId = 'unbundled'\n  private copiedCode = false\n  private timer?: number\n\n  constructor() {\n    super()\n    new ThemeController(this)\n  }\n\n  connectedCallback() {\n    super.connectedCallback()\n    this.setAttribute('data-uipkge', '')\n    this.setAttribute('data-slot', 'feature-interactive-tabs')\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback()\n    if (this.timer) window.clearTimeout(this.timer)\n  }\n\n  private copySnippet() {\n    const current = tabs.find((t) => t.id === this.activeTabId) ?? tabs[0]\n    try {\n      navigator.clipboard?.writeText(current.codeSnippet)?.catch(() => {})\n    } catch {\n      // Clipboard unavailable (insecure context): still flash the label.\n    }\n    this.copiedCode = true\n    if (this.timer) window.clearTimeout(this.timer)\n    this.timer = window.setTimeout(() => {\n      this.copiedCode = false\n    }, 2000)\n  }\n\n  render() {\n    const currentTab = tabs.find((t) => t.id === this.activeTabId) ?? tabs[0]\n    return html`\n      <section\n        data-slot=\"feature-interactive-tabs\"\n        class=\"bg-background relative overflow-hidden px-4 py-16 sm:px-6 sm:py-24 lg:px-8\"\n      >\n        <div class=\"bg-primary/5 pointer-events-none absolute top-1/2 left-1/2 -z-10 h-80 w-full max-w-5xl -translate-x-1/2 -translate-y-1/2 rounded-full blur-xl\"></div>\n\n        <div class=\"mx-auto max-w-7xl space-y-12\">\n          <div class=\"mx-auto max-w-3xl space-y-4 text-center\">\n            <uip-badge variant=\"secondary\" class=\"gap-1.5 px-3 py-1 font-mono text-xs shadow-xs\">\n              ${icon(LayoutGrid, 'layout-grid', 'text-primary size-3.5')} Architecture Differentiation\n            </uip-badge>\n            <h2 class=\"text-foreground text-3xl font-bold tracking-tight sm:text-4xl\">\n              Why engineering teams choose UIPKGE.\n            </h2>\n            <p class=\"text-muted-foreground text-base\">\n              Explore the architectural pillars behind our unbundled component registry.\n            </p>\n          </div>\n\n          <div class=\"grid grid-cols-1 items-start gap-6 lg:grid-cols-12\">\n            <div class=\"flex flex-col gap-2.5 lg:col-span-4\">\n              ${tabs.map((tab) => {\n                const isActive = this.activeTabId === tab.id\n                return html`<button\n                  type=\"button\"\n                  class=${cn(\n                    'group relative overflow-hidden rounded-2xl border p-4 text-left transition-[colors,box-shadow,transform] duration-150 active:scale-[0.98]',\n                    isActive\n                      ? 'border-primary/80 bg-card ring-primary/20 shadow-sm ring-1'\n                      : 'border-border bg-card/60 hover:border-border hover:bg-card',\n                  )}\n                  @click=${() => {\n                    this.activeTabId = tab.id\n                  }}\n                >\n                  <div class=\"flex items-start gap-3.5\">\n                    <div\n                      class=${cn(\n                        'flex size-9 shrink-0 items-center justify-center rounded-lg font-mono transition-colors',\n                        isActive\n                          ? 'bg-primary text-primary-foreground font-bold shadow-xs'\n                          : 'bg-muted text-muted-foreground group-hover:text-foreground',\n                      )}\n                    >\n                      ${icon(tab.icon, tab.iconName, 'size-4')}\n                    </div>\n\n                    <div class=\"min-w-0 space-y-0.5\">\n                      <div class=\"flex items-center justify-between gap-2\">\n                        <h3 class=\"text-foreground truncate font-mono text-xs font-bold\">${tab.title}</h3>\n                        <span\n                          class=${cn(\n                            'size-1.5 shrink-0 rounded-full',\n                            isActive ? 'bg-primary animate-pulse' : 'bg-transparent',\n                          )}\n                        ></span>\n                      </div>\n                      <p class=\"text-muted-foreground truncate text-xs\">${tab.subtitle}</p>\n                    </div>\n                  </div>\n                </button>`\n              })}\n            </div>\n\n            <div\n              data-uipkge=\"\"\n              data-slot=\"card\"\n              class=\"bg-card text-card-foreground rounded-xl border border-border shadow-sm transition-colors duration-150 overflow-hidden bg-card/95 space-y-6 rounded-2xl p-6 text-left sm:p-8 lg:col-span-8\"\n            >\n              <div class=\"border-border/80 space-y-3 border-b pb-6\">\n                <div class=\"flex flex-wrap items-center justify-between gap-2\">\n                  <uip-badge variant=\"outline\" class=\"text-primary bg-primary/5 border-primary/20 font-mono text-xs\">\n                    ${currentTab.tag}\n                  </uip-badge>\n                  <span class=\"text-muted-foreground font-mono text-xs\">Architectural Specification</span>\n                </div>\n                <h3 class=\"text-foreground text-xl font-bold tracking-tight sm:text-2xl\">${currentTab.headline}</h3>\n                <p class=\"text-muted-foreground text-xs leading-relaxed sm:text-sm\">${currentTab.description}</p>\n              </div>\n\n              <div class=\"space-y-2\">\n                <div class=\"text-muted-foreground flex items-center justify-between font-mono text-xs\">\n                  <span class=\"flex items-center gap-1.5\">\n                    ${icon(Terminal, 'terminal', 'text-primary size-3.5')} Source Implementation\n                  </span>\n                  <button\n                    type=\"button\"\n                    class=\"text-primary flex items-center gap-1 hover:underline\"\n                    @click=${this.copySnippet}\n                  >\n                    ${this.copiedCode ? icon(Check, 'check', 'text-success size-3') : icon(Copy, 'copy', 'size-3')}\n                    <span>${this.copiedCode ? 'Copied' : 'Copy Snippet'}</span>\n                  </button>\n                </div>\n                <pre\n                  class=\"border-border bg-muted/40 text-foreground overflow-x-auto rounded-xl border p-4 font-mono text-xs leading-relaxed\"\n                ><code>${currentTab.codeSnippet}</code></pre>\n              </div>\n\n              <div class=\"grid grid-cols-1 gap-3 pt-2 sm:grid-cols-3\">\n                ${currentTab.stats.map(\n                  (st) => html`<div class=\"border-border bg-background/50 space-y-0.5 rounded-xl border p-3.5\">\n                    <p class=\"text-muted-foreground font-mono text-xs tracking-wider uppercase\">${st.label}</p>\n                    <p class=\"text-foreground font-mono text-base font-bold\">${st.value}</p>\n                  </div>`,\n                )}\n              </div>\n\n              <div class=\"border-border/60 space-y-2 border-t pt-2\">\n                <p class=\"text-muted-foreground font-mono text-xs tracking-wider uppercase\">Verified Enforcements</p>\n                <ul class=\"space-y-2\">\n                  ${currentTab.checks.map(\n                    (chk) => html`<li class=\"text-foreground/90 flex items-start gap-2 text-xs\">\n                      ${icon(CheckCircle2, 'circle-check-big', 'text-success mt-0.5 size-4 shrink-0')}\n                      <span>${chk}</span>\n                    </li>`,\n                  )}\n                </ul>\n              </div>\n            </div>\n          </div>\n        </div>\n      </section>\n    `\n  }\n}\n\ncustomElements.get('uip-feature-interactive-tabs') ||\n  customElements.define('uip-feature-interactive-tabs', UipFeatureInteractiveTabs)\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'uip-feature-interactive-tabs': UipFeatureInteractiveTabs\n  }\n}\n",
      "type": "registry:file",
      "target": "src/uip/blocks/feature-interactive-tabs/feature-interactive-tabs.ts"
    }
  ],
  "dependencies": [
    "lit",
    "lucide"
  ],
  "registryDependencies": [
    "https://uipkge.dev/r/lit/badge.json",
    "https://uipkge.dev/r/lit/lit-core.json"
  ]
}
