{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "lathe-riso",
  "title": "Lathe Riso",
  "author": "Visant Labs <visantsupply@gmail.com>",
  "description": "A peça 3D de revolução do lathe-object impressa ao vivo em duas tintas de risografia: gira, orbita no arrasto e sai do registro onde o cursor passa.",
  "dependencies": [
    "three@^0.170.0"
  ],
  "devDependencies": [
    "@types/three@^0.170.0"
  ],
  "registryDependencies": [
    "utils",
    "@visant/lathe-object",
    "@visant/shader-riso"
  ],
  "files": [
    {
      "path": "registry/visant/ui/lathe-riso.tsx",
      "content": "\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { LatheObject, type LatheObjectProps } from \"@/components/ui/lathe-object\";\nimport { ShaderRiso, type ShaderRisoProps } from \"@/components/ui/shader-riso\";\n\n/**\n * Lathe Riso — a peça 3D do `lathe-object` impressa ao vivo pelo `shader-riso`:\n * gira, orbita no arrasto e sai do registro onde o cursor passa, em duas tintas.\n *\n * ── As decisões que não se veem ────────────────────────────────────────────\n *\n * 1. **Dois itens, não um shader novo.** A peça desenha no canvas dela e o riso\n *    lê esse canvas como fonte viva (`source`), quadro a quadro. Cada item segue\n *    servindo sozinho, e o riso imprime qualquer outra fonte (vídeo, outro canvas).\n * 2. **A peça fica por baixo, invisível e tocável.** `opacity: 0` continua\n *    desenhando e recebendo o arrasto; o riso por cima tem `pointer-events: none`\n *    e lê o cursor na janela. Assim o arrasto gira a peça e o mesmo gesto puxa as\n *    tintas.\n * 3. **`preserveDrawingBuffer` ligado só aqui.** Sem ele o navegador pode limpar o\n *    buffer antes do riso ler, e a fruta pisca em papel branco.\n * 4. **Fundo transparente vira papel.** O alfa da peça entra na cobertura, então\n *    não há caixa em volta: só a tinta onde há objeto.\n */\n\nexport interface LatheRisoProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\">,\n    Pick<LatheObjectProps, \"profile\" | \"sticks\" | \"autoRotate\">,\n    Pick<ShaderRisoProps, \"mode\" | \"cell\" | \"misregistration\" | \"paper\" | \"interactive\"> {\n  /**\n   * Paradas do riso: papel, primeira tinta e segunda tinta. Qualquer cor CSS ou token.\n   * Padrão: `--background`, `--brand` e a marca escurecida.\n   */\n  colors?: string[];\n  /** Cor do corpo da peça antes da tinta (só o valor tonal conta). */\n  body?: string;\n  /** Cor das varetas antes da tinta. */\n  detail?: string;\n  /** Descrição para leitor de tela. */\n  \"aria-label\"?: string;\n}\n\nexport function LatheRiso({\n  profile,\n  sticks,\n  autoRotate = true,\n  mode = \"grain\",\n  cell = 4,\n  misregistration = 35,\n  paper = 40,\n  interactive = true,\n  colors,\n  body = \"var(--muted-foreground)\",\n  detail = \"var(--foreground)\",\n  \"aria-label\": ariaLabel = \"Objeto em 3D impresso em risografia, arraste para girar\",\n  className,\n  ...props\n}: LatheRisoProps) {\n  const [fonte, setFonte] = React.useState<HTMLCanvasElement | null>(null);\n\n  return (\n    <div className={cn(\"relative aspect-square w-full\", className)} {...props}>\n      <LatheObject\n        profile={profile}\n        sticks={sticks}\n        autoRotate={autoRotate}\n        body={body}\n        detail={detail}\n        preserveDrawingBuffer\n        onCanvas={setFonte}\n        aria-label={ariaLabel}\n        className=\"absolute inset-0 opacity-0\"\n      />\n      {fonte && (\n        <ShaderRiso\n          source={fonte}\n          alt={ariaLabel}\n          aria-hidden=\"true\"\n          mode={mode}\n          cell={cell}\n          misregistration={misregistration}\n          paper={paper}\n          interactive={interactive}\n          colors={colors}\n          className=\"pointer-events-none absolute inset-0 aspect-auto h-full\"\n        />\n      )}\n    </div>\n  );\n}\n",
      "type": "registry:ui"
    }
  ],
  "meta": {
    "uso": {
      "quando": "Hero com objeto 3D (fruta, frasco, pote) que precisa de cara de impresso, em duas tintas, arrastável",
      "evite": "Foto estática em riso: shader-riso; produto em 3D sem efeito: lathe-object"
    }
  },
  "categories": [
    "efeitos",
    "3d",
    "webgl",
    "shader",
    "riso",
    "produto",
    "impressao"
  ],
  "type": "registry:ui"
}