page.mdx 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. import { pageMetadata } from "@/lib/page-metadata"
  2. export const metadata = pageMetadata("docs/api/react-three-fiber")
  3. # @json-render/react-three-fiber
  4. React Three Fiber renderer for json-render. 19 built-in 3D components for meshes, lights, models, environments, text, cameras, and controls.
  5. ## Installation
  6. ```bash
  7. npm install @json-render/react-three-fiber @json-render/core @json-render/react @react-three/fiber @react-three/drei three zod
  8. ```
  9. ## Entry Points
  10. <table>
  11. <thead>
  12. <tr>
  13. <th>Entry Point</th>
  14. <th>Exports</th>
  15. <th>Use For</th>
  16. </tr>
  17. </thead>
  18. <tbody>
  19. <tr>
  20. <td><code>@json-render/react-three-fiber</code></td>
  21. <td><code>threeComponents</code>, <code>ThreeRenderer</code>, <code>ThreeCanvas</code>, schemas</td>
  22. <td>React Three Fiber implementations and renderer</td>
  23. </tr>
  24. <tr>
  25. <td><code>@json-render/react-three-fiber/catalog</code></td>
  26. <td><code>threeComponentDefinitions</code></td>
  27. <td>Catalog schemas (no R3F dependency, safe for server)</td>
  28. </tr>
  29. </tbody>
  30. </table>
  31. ## Usage
  32. ```tsx
  33. import {'{ defineCatalog }'} from "@json-render/core";
  34. import {'{ schema, defineRegistry }'} from "@json-render/react";
  35. import {'{'}
  36. threeComponentDefinitions,
  37. threeComponents,
  38. ThreeCanvas,
  39. {'}'} from "@json-render/react-three-fiber";
  40. const catalog = defineCatalog(schema, {'{'}
  41. components: {'{'}
  42. Box: threeComponentDefinitions.Box,
  43. Sphere: threeComponentDefinitions.Sphere,
  44. AmbientLight: threeComponentDefinitions.AmbientLight,
  45. DirectionalLight: threeComponentDefinitions.DirectionalLight,
  46. OrbitControls: threeComponentDefinitions.OrbitControls,
  47. {'}'},
  48. actions: {'{}'},
  49. {'}'});
  50. const {'{ registry }'} = defineRegistry(catalog, {'{'}
  51. components: {'{'}
  52. Box: threeComponents.Box,
  53. Sphere: threeComponents.Sphere,
  54. AmbientLight: threeComponents.AmbientLight,
  55. DirectionalLight: threeComponents.DirectionalLight,
  56. OrbitControls: threeComponents.OrbitControls,
  57. {'}'},
  58. {'}'});
  59. ```
  60. ### ThreeCanvas (convenience)
  61. ```tsx
  62. <ThreeCanvas
  63. spec={'{spec}'}
  64. registry={'{registry}'}
  65. shadows
  66. camera={'{'}{'{ position: [5, 5, 5], fov: 50 }'}{'}'}
  67. style={'{'}{'{ width: "100%", height: "100vh" }'}{'}'}
  68. />
  69. ```
  70. ### Manual Canvas Setup
  71. ```tsx
  72. import {'{ Canvas }'} from "@react-three/fiber";
  73. import {'{ ThreeRenderer }'} from "@json-render/react-three-fiber";
  74. <Canvas shadows>
  75. <ThreeRenderer spec={'{spec}'} registry={'{registry}'} />
  76. </Canvas>
  77. ```
  78. ## Components
  79. ### Primitives
  80. <table>
  81. <thead>
  82. <tr>
  83. <th>Component</th>
  84. <th>Description</th>
  85. <th>Key Props</th>
  86. </tr>
  87. </thead>
  88. <tbody>
  89. <tr>
  90. <td><code>Box</code></td>
  91. <td>Box mesh (default 1x1x1)</td>
  92. <td><code>width</code>, <code>height</code>, <code>depth</code>, <code>material</code></td>
  93. </tr>
  94. <tr>
  95. <td><code>Sphere</code></td>
  96. <td>Sphere mesh</td>
  97. <td><code>radius</code>, <code>widthSegments</code>, <code>heightSegments</code>, <code>material</code></td>
  98. </tr>
  99. <tr>
  100. <td><code>Cylinder</code></td>
  101. <td>Cylinder mesh</td>
  102. <td><code>radiusTop</code>, <code>radiusBottom</code>, <code>height</code>, <code>material</code></td>
  103. </tr>
  104. <tr>
  105. <td><code>Cone</code></td>
  106. <td>Cone mesh</td>
  107. <td><code>radius</code>, <code>height</code>, <code>material</code></td>
  108. </tr>
  109. <tr>
  110. <td><code>Torus</code></td>
  111. <td>Torus (donut) mesh</td>
  112. <td><code>radius</code>, <code>tube</code>, <code>material</code></td>
  113. </tr>
  114. <tr>
  115. <td><code>Plane</code></td>
  116. <td>Flat plane mesh</td>
  117. <td><code>width</code>, <code>height</code>, <code>material</code></td>
  118. </tr>
  119. <tr>
  120. <td><code>Capsule</code></td>
  121. <td>Capsule mesh</td>
  122. <td><code>radius</code>, <code>length</code>, <code>material</code></td>
  123. </tr>
  124. </tbody>
  125. </table>
  126. All primitives share: <code>position</code>, <code>rotation</code>, <code>scale</code>, <code>castShadow</code>, <code>receiveShadow</code>, <code>material</code>.
  127. ### Material Schema
  128. <table>
  129. <thead>
  130. <tr>
  131. <th>Property</th>
  132. <th>Type</th>
  133. <th>Default</th>
  134. </tr>
  135. </thead>
  136. <tbody>
  137. <tr>
  138. <td><code>color</code></td>
  139. <td><code>string</code></td>
  140. <td><code>"#ffffff"</code></td>
  141. </tr>
  142. <tr>
  143. <td><code>metalness</code></td>
  144. <td><code>number</code></td>
  145. <td><code>0</code></td>
  146. </tr>
  147. <tr>
  148. <td><code>roughness</code></td>
  149. <td><code>number</code></td>
  150. <td><code>1</code></td>
  151. </tr>
  152. <tr>
  153. <td><code>emissive</code></td>
  154. <td><code>string</code></td>
  155. <td><code>"#000000"</code></td>
  156. </tr>
  157. <tr>
  158. <td><code>emissiveIntensity</code></td>
  159. <td><code>number</code></td>
  160. <td><code>1</code></td>
  161. </tr>
  162. <tr>
  163. <td><code>opacity</code></td>
  164. <td><code>number</code></td>
  165. <td><code>1</code></td>
  166. </tr>
  167. <tr>
  168. <td><code>transparent</code></td>
  169. <td><code>boolean</code></td>
  170. <td><code>false</code></td>
  171. </tr>
  172. <tr>
  173. <td><code>wireframe</code></td>
  174. <td><code>boolean</code></td>
  175. <td><code>false</code></td>
  176. </tr>
  177. </tbody>
  178. </table>
  179. ### Lights
  180. <table>
  181. <thead>
  182. <tr>
  183. <th>Component</th>
  184. <th>Description</th>
  185. <th>Key Props</th>
  186. </tr>
  187. </thead>
  188. <tbody>
  189. <tr>
  190. <td><code>AmbientLight</code></td>
  191. <td>Uniform illumination</td>
  192. <td><code>color</code>, <code>intensity</code></td>
  193. </tr>
  194. <tr>
  195. <td><code>DirectionalLight</code></td>
  196. <td>Sunlight-style</td>
  197. <td><code>position</code>, <code>color</code>, <code>intensity</code>, <code>castShadow</code></td>
  198. </tr>
  199. <tr>
  200. <td><code>PointLight</code></td>
  201. <td>Radiates from a point</td>
  202. <td><code>position</code>, <code>color</code>, <code>intensity</code>, <code>distance</code>, <code>decay</code></td>
  203. </tr>
  204. <tr>
  205. <td><code>SpotLight</code></td>
  206. <td>Cone of light</td>
  207. <td><code>position</code>, <code>color</code>, <code>intensity</code>, <code>angle</code>, <code>penumbra</code></td>
  208. </tr>
  209. </tbody>
  210. </table>
  211. ### Other Components
  212. <table>
  213. <thead>
  214. <tr>
  215. <th>Component</th>
  216. <th>Description</th>
  217. <th>Key Props</th>
  218. </tr>
  219. </thead>
  220. <tbody>
  221. <tr>
  222. <td><code>Group</code></td>
  223. <td>Container for children</td>
  224. <td><code>position</code>, <code>rotation</code>, <code>scale</code></td>
  225. </tr>
  226. <tr>
  227. <td><code>Model</code></td>
  228. <td>GLTF/GLB model loader</td>
  229. <td><code>url</code>, <code>position</code>, <code>rotation</code>, <code>scale</code></td>
  230. </tr>
  231. <tr>
  232. <td><code>Environment</code></td>
  233. <td>HDRI environment map</td>
  234. <td><code>preset</code>, <code>background</code>, <code>blur</code>, <code>intensity</code></td>
  235. </tr>
  236. <tr>
  237. <td><code>Fog</code></td>
  238. <td>Linear fog effect</td>
  239. <td><code>color</code>, <code>near</code>, <code>far</code></td>
  240. </tr>
  241. <tr>
  242. <td><code>GridHelper</code></td>
  243. <td>Reference grid</td>
  244. <td><code>size</code>, <code>divisions</code>, <code>color</code></td>
  245. </tr>
  246. <tr>
  247. <td><code>Text3D</code></td>
  248. <td>3D text (SDF)</td>
  249. <td><code>text</code>, <code>fontSize</code>, <code>color</code>, <code>anchorX</code>, <code>anchorY</code></td>
  250. </tr>
  251. <tr>
  252. <td><code>PerspectiveCamera</code></td>
  253. <td>Camera</td>
  254. <td><code>position</code>, <code>fov</code>, <code>near</code>, <code>far</code>, <code>makeDefault</code></td>
  255. </tr>
  256. <tr>
  257. <td><code>OrbitControls</code></td>
  258. <td>Camera controls</td>
  259. <td><code>enableDamping</code>, <code>enableZoom</code>, <code>autoRotate</code></td>
  260. </tr>
  261. </tbody>
  262. </table>
  263. ## Shared Schemas
  264. Reusable Zod schemas for custom 3D components:
  265. ```tsx
  266. import {'{ vector3Schema, materialSchema, transformProps, shadowProps }'} from "@json-render/react-three-fiber";
  267. ```
  268. <table>
  269. <thead>
  270. <tr>
  271. <th>Export</th>
  272. <th>Description</th>
  273. </tr>
  274. </thead>
  275. <tbody>
  276. <tr>
  277. <td><code>vector3Schema</code></td>
  278. <td><code>z.tuple([z.number(), z.number(), z.number()])</code></td>
  279. </tr>
  280. <tr>
  281. <td><code>materialSchema</code></td>
  282. <td>Standard material props (color, metalness, roughness, etc.)</td>
  283. </tr>
  284. <tr>
  285. <td><code>transformProps</code></td>
  286. <td><code>{'{ position, rotation, scale }'}</code> schema fields</td>
  287. </tr>
  288. <tr>
  289. <td><code>shadowProps</code></td>
  290. <td><code>{'{ castShadow, receiveShadow }'}</code> schema fields</td>
  291. </tr>
  292. </tbody>
  293. </table>
  294. ## ThreeRenderer
  295. <table>
  296. <thead>
  297. <tr>
  298. <th>Prop</th>
  299. <th>Type</th>
  300. <th>Description</th>
  301. </tr>
  302. </thead>
  303. <tbody>
  304. <tr>
  305. <td><code>spec</code></td>
  306. <td><code>Spec | null</code></td>
  307. <td>The spec to render as a 3D scene</td>
  308. </tr>
  309. <tr>
  310. <td><code>registry</code></td>
  311. <td><code>ComponentRegistry</code></td>
  312. <td>Component registry from <code>defineRegistry</code></td>
  313. </tr>
  314. <tr>
  315. <td><code>store</code></td>
  316. <td><code>StateStore</code></td>
  317. <td>External state store (controlled mode)</td>
  318. </tr>
  319. <tr>
  320. <td><code>initialState</code></td>
  321. <td><code>Record&lt;string, unknown&gt;</code></td>
  322. <td>Initial state (uncontrolled mode)</td>
  323. </tr>
  324. <tr>
  325. <td><code>handlers</code></td>
  326. <td><code>Record&lt;string, Function&gt;</code></td>
  327. <td>Action handlers</td>
  328. </tr>
  329. <tr>
  330. <td><code>loading</code></td>
  331. <td><code>boolean</code></td>
  332. <td>Whether the spec is streaming</td>
  333. </tr>
  334. <tr>
  335. <td><code>children</code></td>
  336. <td><code>ReactNode</code></td>
  337. <td>Additional R3F elements alongside the spec</td>
  338. </tr>
  339. </tbody>
  340. </table>
  341. ## ThreeCanvas
  342. Extends <code>ThreeRendererProps</code> with Canvas options:
  343. <table>
  344. <thead>
  345. <tr>
  346. <th>Prop</th>
  347. <th>Type</th>
  348. <th>Description</th>
  349. </tr>
  350. </thead>
  351. <tbody>
  352. <tr>
  353. <td><code>shadows</code></td>
  354. <td><code>boolean</code></td>
  355. <td>Enable shadow maps</td>
  356. </tr>
  357. <tr>
  358. <td><code>camera</code></td>
  359. <td><code>object</code></td>
  360. <td>Default camera config (position, fov, etc.)</td>
  361. </tr>
  362. <tr>
  363. <td><code>className</code></td>
  364. <td><code>string</code></td>
  365. <td>CSS class for the canvas container</td>
  366. </tr>
  367. <tr>
  368. <td><code>style</code></td>
  369. <td><code>CSSProperties</code></td>
  370. <td>Inline styles for the canvas container</td>
  371. </tr>
  372. </tbody>
  373. </table>
  374. ## Type Helpers
  375. ```tsx
  376. import type {'{ ThreeProps }'} from "@json-render/react-three-fiber";
  377. type BoxProps = ThreeProps<"Box">;
  378. type SphereProps = ThreeProps<"Sphere">;
  379. ```