@puckeditor/cli 0.24.0-canary.301a0304

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +45 -0
  3. package/dist/bin.mjs +7304 -0
  4. package/dist/docs/api-reference/actions.md +63 -0
  5. package/dist/docs/api-reference/components/action-bar-action.md +35 -0
  6. package/dist/docs/api-reference/components/action-bar-group.md +24 -0
  7. package/dist/docs/api-reference/components/action-bar-label.md +25 -0
  8. package/dist/docs/api-reference/components/action-bar-separator.md +16 -0
  9. package/dist/docs/api-reference/components/action-bar.md +32 -0
  10. package/dist/docs/api-reference/components/auto-field.md +63 -0
  11. package/dist/docs/api-reference/components/drawer-item.md +75 -0
  12. package/dist/docs/api-reference/components/drawer.md +29 -0
  13. package/dist/docs/api-reference/components/drop-zone.md +232 -0
  14. package/dist/docs/api-reference/components/field-label.md +138 -0
  15. package/dist/docs/api-reference/components/inline-text-field.md +77 -0
  16. package/dist/docs/api-reference/components/puck-components.md +19 -0
  17. package/dist/docs/api-reference/components/puck-fields.md +39 -0
  18. package/dist/docs/api-reference/components/puck-layout.md +27 -0
  19. package/dist/docs/api-reference/components/puck-outline.md +19 -0
  20. package/dist/docs/api-reference/components/puck-preview.md +39 -0
  21. package/dist/docs/api-reference/components/puck.md +561 -0
  22. package/dist/docs/api-reference/components/render.md +94 -0
  23. package/dist/docs/api-reference/components/rich-text-menu-control.md +87 -0
  24. package/dist/docs/api-reference/components/rich-text-menu-group.md +27 -0
  25. package/dist/docs/api-reference/components/rich-text-menu.md +99 -0
  26. package/dist/docs/api-reference/components.md +32 -0
  27. package/dist/docs/api-reference/configuration/component-config.md +569 -0
  28. package/dist/docs/api-reference/configuration/config.md +108 -0
  29. package/dist/docs/api-reference/configuration.md +4 -0
  30. package/dist/docs/api-reference/data-model/app-state.md +168 -0
  31. package/dist/docs/api-reference/data-model/component-data.md +62 -0
  32. package/dist/docs/api-reference/data-model/data.md +95 -0
  33. package/dist/docs/api-reference/data-model/item-selector.md +34 -0
  34. package/dist/docs/api-reference/data-model/root-data.md +59 -0
  35. package/dist/docs/api-reference/data-model.md +8 -0
  36. package/dist/docs/api-reference/dictionary.md +172 -0
  37. package/dist/docs/api-reference/field-transforms.md +51 -0
  38. package/dist/docs/api-reference/fields/array.md +211 -0
  39. package/dist/docs/api-reference/fields/base.md +96 -0
  40. package/dist/docs/api-reference/fields/custom.md +193 -0
  41. package/dist/docs/api-reference/fields/external.md +413 -0
  42. package/dist/docs/api-reference/fields/number.md +132 -0
  43. package/dist/docs/api-reference/fields/object.md +78 -0
  44. package/dist/docs/api-reference/fields/radio.md +82 -0
  45. package/dist/docs/api-reference/fields/richtext.md +422 -0
  46. package/dist/docs/api-reference/fields/select.md +79 -0
  47. package/dist/docs/api-reference/fields/slot.md +302 -0
  48. package/dist/docs/api-reference/fields/text.md +93 -0
  49. package/dist/docs/api-reference/fields/textarea.md +93 -0
  50. package/dist/docs/api-reference/fields.md +16 -0
  51. package/dist/docs/api-reference/functions/migrate.md +204 -0
  52. package/dist/docs/api-reference/functions/register-overlay-portal.md +45 -0
  53. package/dist/docs/api-reference/functions/resolve-all-data.md +27 -0
  54. package/dist/docs/api-reference/functions/set-deep.md +55 -0
  55. package/dist/docs/api-reference/functions/transform-props.md +51 -0
  56. package/dist/docs/api-reference/functions/use-get-puck.md +24 -0
  57. package/dist/docs/api-reference/functions/use-puck.md +43 -0
  58. package/dist/docs/api-reference/functions/walk-tree.md +88 -0
  59. package/dist/docs/api-reference/functions.md +8 -0
  60. package/dist/docs/api-reference/overrides/action-bar.md +35 -0
  61. package/dist/docs/api-reference/overrides/component-overlay.md +41 -0
  62. package/dist/docs/api-reference/overrides/drawer-item.md +24 -0
  63. package/dist/docs/api-reference/overrides/drawer.md +19 -0
  64. package/dist/docs/api-reference/overrides/field-label.md +18 -0
  65. package/dist/docs/api-reference/overrides/field-types.md +51 -0
  66. package/dist/docs/api-reference/overrides/fields.md +19 -0
  67. package/dist/docs/api-reference/overrides/header-actions.md +24 -0
  68. package/dist/docs/api-reference/overrides/header.md +29 -0
  69. package/dist/docs/api-reference/overrides/iframe.md +32 -0
  70. package/dist/docs/api-reference/overrides/outline.md +19 -0
  71. package/dist/docs/api-reference/overrides/preview.md +19 -0
  72. package/dist/docs/api-reference/overrides/puck.md +19 -0
  73. package/dist/docs/api-reference/overrides.md +28 -0
  74. package/dist/docs/api-reference/permissions.md +55 -0
  75. package/dist/docs/api-reference/plugin.md +112 -0
  76. package/dist/docs/api-reference/plugins/blocks-plugin.md +57 -0
  77. package/dist/docs/api-reference/plugins/fields-plugin.md +68 -0
  78. package/dist/docs/api-reference/plugins/legacy-side-bar-plugin.md +54 -0
  79. package/dist/docs/api-reference/plugins/outline-plugin.md +57 -0
  80. package/dist/docs/api-reference/puck-api.md +278 -0
  81. package/dist/docs/api-reference/theming/action-bar.md +32 -0
  82. package/dist/docs/api-reference/theming/button.md +65 -0
  83. package/dist/docs/api-reference/theming/canvas.md +20 -0
  84. package/dist/docs/api-reference/theming/computed-values.md +194 -0
  85. package/dist/docs/api-reference/theming/drawer.md +34 -0
  86. package/dist/docs/api-reference/theming/fields.md +70 -0
  87. package/dist/docs/api-reference/theming/global.md +127 -0
  88. package/dist/docs/api-reference/theming/header.md +19 -0
  89. package/dist/docs/api-reference/theming/icon-button.md +28 -0
  90. package/dist/docs/api-reference/theming/outline.md +35 -0
  91. package/dist/docs/api-reference/theming/plugin-bar.md +24 -0
  92. package/dist/docs/api-reference/theming/sidebar.md +19 -0
  93. package/dist/docs/api-reference/theming/slot.md +27 -0
  94. package/dist/docs/cli.md +201 -0
  95. package/dist/docs/extending-puck/composition.md +54 -0
  96. package/dist/docs/extending-puck/custom-fields.md +133 -0
  97. package/dist/docs/extending-puck/field-transforms.md +89 -0
  98. package/dist/docs/extending-puck/internal-puck-api.md +96 -0
  99. package/dist/docs/extending-puck/plugins.md +159 -0
  100. package/dist/docs/extending-puck/theming.md +88 -0
  101. package/dist/docs/extending-puck/ui-overrides.md +134 -0
  102. package/dist/docs/getting-started.md +68 -0
  103. package/dist/docs/guides/migrations/dropzones-to-slots.md +138 -0
  104. package/dist/docs/index.json +466 -0
  105. package/dist/docs/index.md +37 -0
  106. package/dist/docs/integrating-puck/categories.md +92 -0
  107. package/dist/docs/integrating-puck/component-configuration.md +159 -0
  108. package/dist/docs/integrating-puck/data-migration.md +86 -0
  109. package/dist/docs/integrating-puck/dynamic-fields.md +86 -0
  110. package/dist/docs/integrating-puck/dynamic-props.md +137 -0
  111. package/dist/docs/integrating-puck/external-data-sources.md +149 -0
  112. package/dist/docs/integrating-puck/feature-toggling.md +121 -0
  113. package/dist/docs/integrating-puck/localization.md +228 -0
  114. package/dist/docs/integrating-puck/multi-column-layouts.md +226 -0
  115. package/dist/docs/integrating-puck/overlay-portals.md +25 -0
  116. package/dist/docs/integrating-puck/rich-text-editing.md +230 -0
  117. package/dist/docs/integrating-puck/root-configuration.md +171 -0
  118. package/dist/docs/integrating-puck/server-components.md +199 -0
  119. package/dist/docs/integrating-puck/styling.md +117 -0
  120. package/dist/docs/integrating-puck/viewports.md +75 -0
  121. package/dist/templates/astro/README.md +52 -0
  122. package/dist/templates/astro/_gitignore +24 -0
  123. package/dist/templates/astro/astro.config.mjs +14 -0
  124. package/dist/templates/astro/database.json +1 -0
  125. package/dist/templates/astro/package.json +25 -0
  126. package/dist/templates/astro/public/favicon.svg +9 -0
  127. package/dist/templates/astro/src/lib/pages.ts +21 -0
  128. package/dist/templates/astro/src/lib/resolve-puck-path.ts +19 -0
  129. package/dist/templates/astro/src/pages/[...puckPath].astro +25 -0
  130. package/dist/templates/astro/src/pages/api/pages.ts +18 -0
  131. package/dist/templates/astro/src/puck/editor.tsx +32 -0
  132. package/dist/templates/astro/src/puck/pages.ts +15 -0
  133. package/dist/templates/astro/src/puck/render.tsx +9 -0
  134. package/dist/templates/astro/src/puck.config.tsx +23 -0
  135. package/dist/templates/astro/tsconfig.json +14 -0
  136. package/dist/templates/astro-ai/README.md +64 -0
  137. package/dist/templates/astro-ai/_gitignore +24 -0
  138. package/dist/templates/astro-ai/astro.config.mjs +21 -0
  139. package/dist/templates/astro-ai/database.json +1 -0
  140. package/dist/templates/astro-ai/package.json +27 -0
  141. package/dist/templates/astro-ai/public/favicon.svg +9 -0
  142. package/dist/templates/astro-ai/src/lib/pages.ts +21 -0
  143. package/dist/templates/astro-ai/src/lib/resolve-puck-path.ts +19 -0
  144. package/dist/templates/astro-ai/src/pages/[...puckPath].astro +25 -0
  145. package/dist/templates/astro-ai/src/pages/api/pages.ts +18 -0
  146. package/dist/templates/astro-ai/src/pages/api/puck/[...all].ts +36 -0
  147. package/dist/templates/astro-ai/src/puck/editor.tsx +53 -0
  148. package/dist/templates/astro-ai/src/puck/pages.ts +15 -0
  149. package/dist/templates/astro-ai/src/puck/render.tsx +10 -0
  150. package/dist/templates/astro-ai/src/puck.config.tsx +23 -0
  151. package/dist/templates/astro-ai/tsconfig.json +14 -0
  152. package/dist/templates/express/README.md +66 -0
  153. package/dist/templates/express/_gitignore +16 -0
  154. package/dist/templates/express/database.json +1 -0
  155. package/dist/templates/express/package.json +20 -0
  156. package/dist/templates/express/src/index.ts +15 -0
  157. package/dist/templates/express/src/puck/pages.ts +39 -0
  158. package/dist/templates/express/tsconfig.json +12 -0
  159. package/dist/templates/express-ai/README.md +81 -0
  160. package/dist/templates/express-ai/_gitignore +16 -0
  161. package/dist/templates/express-ai/database.json +1 -0
  162. package/dist/templates/express-ai/package.json +22 -0
  163. package/dist/templates/express-ai/src/index.ts +17 -0
  164. package/dist/templates/express-ai/src/puck/cloud.ts +71 -0
  165. package/dist/templates/express-ai/src/puck/pages.ts +39 -0
  166. package/dist/templates/express-ai/tsconfig.json +12 -0
  167. package/dist/templates/hono/README.md +66 -0
  168. package/dist/templates/hono/_gitignore +32 -0
  169. package/dist/templates/hono/database.json +1 -0
  170. package/dist/templates/hono/package.json +20 -0
  171. package/dist/templates/hono/src/index.ts +21 -0
  172. package/dist/templates/hono/src/puck/pages.ts +32 -0
  173. package/dist/templates/hono/tsconfig.json +13 -0
  174. package/dist/templates/hono-ai/README.md +81 -0
  175. package/dist/templates/hono-ai/_gitignore +32 -0
  176. package/dist/templates/hono-ai/database.json +1 -0
  177. package/dist/templates/hono-ai/package.json +22 -0
  178. package/dist/templates/hono-ai/src/index.ts +23 -0
  179. package/dist/templates/hono-ai/src/puck/cloud.ts +30 -0
  180. package/dist/templates/hono-ai/src/puck/pages.ts +32 -0
  181. package/dist/templates/hono-ai/tsconfig.json +13 -0
  182. package/dist/templates/manifest.json +4 -0
  183. package/dist/templates/next/README.md +112 -0
  184. package/dist/templates/next/_gitignore +35 -0
  185. package/dist/templates/next/app/[...puckPath]/client.tsx +9 -0
  186. package/dist/templates/next/app/[...puckPath]/page.tsx +49 -0
  187. package/dist/templates/next/app/favicon.ico +0 -0
  188. package/dist/templates/next/app/layout.tsx +13 -0
  189. package/dist/templates/next/app/page.tsx +1 -0
  190. package/dist/templates/next/app/puck/[...puckPath]/client.tsx +20 -0
  191. package/dist/templates/next/app/puck/[...puckPath]/page.tsx +55 -0
  192. package/dist/templates/next/app/puck/api/route.ts +25 -0
  193. package/dist/templates/next/app/puck/page.tsx +3 -0
  194. package/dist/templates/next/app/styles.css +3 -0
  195. package/dist/templates/next/database.json +1 -0
  196. package/dist/templates/next/lib/get-page.ts +11 -0
  197. package/dist/templates/next/next.config.js +3 -0
  198. package/dist/templates/next/package.json +25 -0
  199. package/dist/templates/next/proxy.ts +27 -0
  200. package/dist/templates/next/puck.config.tsx +25 -0
  201. package/dist/templates/next/tsconfig/base.json +20 -0
  202. package/dist/templates/next/tsconfig/nextjs.json +21 -0
  203. package/dist/templates/next/tsconfig.json +8 -0
  204. package/dist/templates/next-ai/README.md +169 -0
  205. package/dist/templates/next-ai/_gitignore +35 -0
  206. package/dist/templates/next-ai/app/[...puckPath]/client.tsx +12 -0
  207. package/dist/templates/next-ai/app/[...puckPath]/page.tsx +49 -0
  208. package/dist/templates/next-ai/app/api/pages/route.ts +26 -0
  209. package/dist/templates/next-ai/app/api/puck/[...all]/route.ts +31 -0
  210. package/dist/templates/next-ai/app/layout.tsx +13 -0
  211. package/dist/templates/next-ai/app/page.tsx +1 -0
  212. package/dist/templates/next-ai/app/puck/[...puckPath]/client.tsx +38 -0
  213. package/dist/templates/next-ai/app/puck/[...puckPath]/page.tsx +57 -0
  214. package/dist/templates/next-ai/app/puck/page.tsx +3 -0
  215. package/dist/templates/next-ai/app/styles.css +3 -0
  216. package/dist/templates/next-ai/database.json +1 -0
  217. package/dist/templates/next-ai/lib/get-page.ts +11 -0
  218. package/dist/templates/next-ai/next.config.js +3 -0
  219. package/dist/templates/next-ai/package.json +27 -0
  220. package/dist/templates/next-ai/proxy.ts +27 -0
  221. package/dist/templates/next-ai/public/favicon.ico +0 -0
  222. package/dist/templates/next-ai/puck.config.tsx +25 -0
  223. package/dist/templates/next-ai/tsconfig/base.json +20 -0
  224. package/dist/templates/next-ai/tsconfig/nextjs.json +21 -0
  225. package/dist/templates/next-ai/tsconfig.json +8 -0
  226. package/dist/templates/react-router/README.md +113 -0
  227. package/dist/templates/react-router/_gitignore +6 -0
  228. package/dist/templates/react-router/app/components/puck-render.tsx +8 -0
  229. package/dist/templates/react-router/app/lib/pages.server.ts +29 -0
  230. package/dist/templates/react-router/app/lib/resolve-puck-path.server.ts +19 -0
  231. package/dist/templates/react-router/app/root.tsx +65 -0
  232. package/dist/templates/react-router/app/routes/_index.tsx +31 -0
  233. package/dist/templates/react-router/app/routes/puck-splat.tsx +95 -0
  234. package/dist/templates/react-router/app/routes.ts +7 -0
  235. package/dist/templates/react-router/database.json +1 -0
  236. package/dist/templates/react-router/package.json +33 -0
  237. package/dist/templates/react-router/public/favicon.ico +0 -0
  238. package/dist/templates/react-router/puck.config.tsx +23 -0
  239. package/dist/templates/react-router/react-router.config.ts +7 -0
  240. package/dist/templates/react-router/tsconfig.json +29 -0
  241. package/dist/templates/react-router/vite.config.ts +10 -0
  242. package/dist/templates/react-router-ai/README.md +172 -0
  243. package/dist/templates/react-router-ai/_gitignore +6 -0
  244. package/dist/templates/react-router-ai/app/components/puck-render.tsx +11 -0
  245. package/dist/templates/react-router-ai/app/lib/pages.server.ts +29 -0
  246. package/dist/templates/react-router-ai/app/lib/resolve-puck-path.server.ts +19 -0
  247. package/dist/templates/react-router-ai/app/root.tsx +65 -0
  248. package/dist/templates/react-router-ai/app/routes/_index.tsx +31 -0
  249. package/dist/templates/react-router-ai/app/routes/api.puck.ts +34 -0
  250. package/dist/templates/react-router-ai/app/routes/puck-splat.tsx +119 -0
  251. package/dist/templates/react-router-ai/app/routes.ts +8 -0
  252. package/dist/templates/react-router-ai/database.json +1 -0
  253. package/dist/templates/react-router-ai/package.json +35 -0
  254. package/dist/templates/react-router-ai/public/favicon.ico +0 -0
  255. package/dist/templates/react-router-ai/puck.config.tsx +25 -0
  256. package/dist/templates/react-router-ai/react-router.config.ts +7 -0
  257. package/dist/templates/react-router-ai/tsconfig.json +29 -0
  258. package/dist/templates/react-router-ai/vite.config.ts +10 -0
  259. package/dist/templates/tanstack-start/README.md +113 -0
  260. package/dist/templates/tanstack-start/_gitignore +12 -0
  261. package/dist/templates/tanstack-start/database.json +1 -0
  262. package/dist/templates/tanstack-start/package.json +26 -0
  263. package/dist/templates/tanstack-start/puck.config.tsx +23 -0
  264. package/dist/templates/tanstack-start/src/components/puck-render.tsx +8 -0
  265. package/dist/templates/tanstack-start/src/lib/pages.server.ts +26 -0
  266. package/dist/templates/tanstack-start/src/lib/pages.ts +39 -0
  267. package/dist/templates/tanstack-start/src/lib/resolve-puck-path.ts +19 -0
  268. package/dist/templates/tanstack-start/src/routeTree.gen.ts +86 -0
  269. package/dist/templates/tanstack-start/src/router.tsx +19 -0
  270. package/dist/templates/tanstack-start/src/routes/$.tsx +41 -0
  271. package/dist/templates/tanstack-start/src/routes/__root.tsx +42 -0
  272. package/dist/templates/tanstack-start/src/routes/index.tsx +18 -0
  273. package/dist/templates/tanstack-start/src/styles.css +13 -0
  274. package/dist/templates/tanstack-start/tsconfig.json +24 -0
  275. package/dist/templates/tanstack-start/vite.config.ts +15 -0
  276. package/dist/templates/tanstack-start-ai/README.md +171 -0
  277. package/dist/templates/tanstack-start-ai/_gitignore +12 -0
  278. package/dist/templates/tanstack-start-ai/database.json +1 -0
  279. package/dist/templates/tanstack-start-ai/package.json +28 -0
  280. package/dist/templates/tanstack-start-ai/puck.config.tsx +23 -0
  281. package/dist/templates/tanstack-start-ai/src/components/puck-render.tsx +11 -0
  282. package/dist/templates/tanstack-start-ai/src/lib/pages.server.ts +26 -0
  283. package/dist/templates/tanstack-start-ai/src/lib/pages.ts +39 -0
  284. package/dist/templates/tanstack-start-ai/src/lib/resolve-puck-path.ts +19 -0
  285. package/dist/templates/tanstack-start-ai/src/routeTree.gen.ts +104 -0
  286. package/dist/templates/tanstack-start-ai/src/router.tsx +19 -0
  287. package/dist/templates/tanstack-start-ai/src/routes/$.tsx +73 -0
  288. package/dist/templates/tanstack-start-ai/src/routes/__root.tsx +42 -0
  289. package/dist/templates/tanstack-start-ai/src/routes/api/puck/$.ts +39 -0
  290. package/dist/templates/tanstack-start-ai/src/routes/index.tsx +18 -0
  291. package/dist/templates/tanstack-start-ai/src/styles.css +13 -0
  292. package/dist/templates/tanstack-start-ai/tsconfig.json +24 -0
  293. package/dist/templates/tanstack-start-ai/vite.config.ts +15 -0
  294. package/dist/templates/vinext/README.md +112 -0
  295. package/dist/templates/vinext/_gitignore +33 -0
  296. package/dist/templates/vinext/app/[...puckPath]/client.tsx +9 -0
  297. package/dist/templates/vinext/app/[...puckPath]/page.tsx +49 -0
  298. package/dist/templates/vinext/app/favicon.ico +0 -0
  299. package/dist/templates/vinext/app/layout.tsx +13 -0
  300. package/dist/templates/vinext/app/page.tsx +1 -0
  301. package/dist/templates/vinext/app/puck/[...puckPath]/client.tsx +20 -0
  302. package/dist/templates/vinext/app/puck/[...puckPath]/page.tsx +55 -0
  303. package/dist/templates/vinext/app/puck/api/route.ts +25 -0
  304. package/dist/templates/vinext/app/puck/page.tsx +3 -0
  305. package/dist/templates/vinext/app/styles.css +3 -0
  306. package/dist/templates/vinext/database.json +1 -0
  307. package/dist/templates/vinext/lib/get-page.ts +11 -0
  308. package/dist/templates/vinext/package.json +30 -0
  309. package/dist/templates/vinext/proxy.ts +27 -0
  310. package/dist/templates/vinext/puck.config.tsx +25 -0
  311. package/dist/templates/vinext/tsconfig.json +30 -0
  312. package/dist/templates/vinext/vite.config.ts +6 -0
  313. package/dist/templates/vinext-ai/README.md +169 -0
  314. package/dist/templates/vinext-ai/_gitignore +33 -0
  315. package/dist/templates/vinext-ai/app/[...puckPath]/client.tsx +12 -0
  316. package/dist/templates/vinext-ai/app/[...puckPath]/page.tsx +49 -0
  317. package/dist/templates/vinext-ai/app/api/pages/route.ts +26 -0
  318. package/dist/templates/vinext-ai/app/api/puck/[...all]/route.ts +31 -0
  319. package/dist/templates/vinext-ai/app/layout.tsx +13 -0
  320. package/dist/templates/vinext-ai/app/page.tsx +1 -0
  321. package/dist/templates/vinext-ai/app/puck/[...puckPath]/client.tsx +38 -0
  322. package/dist/templates/vinext-ai/app/puck/[...puckPath]/page.tsx +57 -0
  323. package/dist/templates/vinext-ai/app/puck/page.tsx +3 -0
  324. package/dist/templates/vinext-ai/app/styles.css +3 -0
  325. package/dist/templates/vinext-ai/database.json +1 -0
  326. package/dist/templates/vinext-ai/lib/get-page.ts +11 -0
  327. package/dist/templates/vinext-ai/package.json +32 -0
  328. package/dist/templates/vinext-ai/proxy.ts +27 -0
  329. package/dist/templates/vinext-ai/public/favicon.ico +0 -0
  330. package/dist/templates/vinext-ai/puck.config.tsx +25 -0
  331. package/dist/templates/vinext-ai/tsconfig.json +30 -0
  332. package/dist/templates/vinext-ai/vite.config.ts +9 -0
  333. package/dist/templates/vite/README.md +56 -0
  334. package/dist/templates/vite/_gitignore +24 -0
  335. package/dist/templates/vite/database.json +1 -0
  336. package/dist/templates/vite/index.html +12 -0
  337. package/dist/templates/vite/package.json +29 -0
  338. package/dist/templates/vite/server/index.ts +13 -0
  339. package/dist/templates/vite/server/prod.ts +18 -0
  340. package/dist/templates/vite/server/puck/pages.ts +32 -0
  341. package/dist/templates/vite/src/App.tsx +11 -0
  342. package/dist/templates/vite/src/main.tsx +12 -0
  343. package/dist/templates/vite/src/puck/editor.tsx +28 -0
  344. package/dist/templates/vite/src/puck/page.tsx +27 -0
  345. package/dist/templates/vite/src/puck/pages.ts +15 -0
  346. package/dist/templates/vite/src/puck/root.tsx +27 -0
  347. package/dist/templates/vite/src/puck.config.tsx +23 -0
  348. package/dist/templates/vite/tsconfig.app.json +26 -0
  349. package/dist/templates/vite/tsconfig.json +7 -0
  350. package/dist/templates/vite/tsconfig.node.json +23 -0
  351. package/dist/templates/vite/vite.config.ts +14 -0
  352. package/dist/templates/vite-ai/README.md +67 -0
  353. package/dist/templates/vite-ai/_gitignore +24 -0
  354. package/dist/templates/vite-ai/database.json +1 -0
  355. package/dist/templates/vite-ai/index.html +12 -0
  356. package/dist/templates/vite-ai/package.json +31 -0
  357. package/dist/templates/vite-ai/server/index.ts +15 -0
  358. package/dist/templates/vite-ai/server/prod.ts +18 -0
  359. package/dist/templates/vite-ai/server/puck/cloud.ts +30 -0
  360. package/dist/templates/vite-ai/server/puck/pages.ts +32 -0
  361. package/dist/templates/vite-ai/src/App.tsx +11 -0
  362. package/dist/templates/vite-ai/src/main.tsx +12 -0
  363. package/dist/templates/vite-ai/src/puck/editor.tsx +49 -0
  364. package/dist/templates/vite-ai/src/puck/page.tsx +28 -0
  365. package/dist/templates/vite-ai/src/puck/pages.ts +15 -0
  366. package/dist/templates/vite-ai/src/puck/root.tsx +27 -0
  367. package/dist/templates/vite-ai/src/puck.config.tsx +23 -0
  368. package/dist/templates/vite-ai/tsconfig.app.json +26 -0
  369. package/dist/templates/vite-ai/tsconfig.json +7 -0
  370. package/dist/templates/vite-ai/tsconfig.node.json +23 -0
  371. package/dist/templates/vite-ai/vite.config.ts +14 -0
  372. package/package.json +51 -0
@@ -0,0 +1,171 @@
1
+ # Puck AI + TanStack Start recipe
2
+
3
+ [Puck](https://puckeditor.com) is the open-source visual editor for React. It lets you create page builders that use your own components.
4
+
5
+ [Puck AI](https://puckeditor.com/docs/ai/overview) builds on the same principles to let you generate pages by assembling your existing components or creating new ones on the fly, either as a copilot in the editor or headlessly.
6
+
7
+ This recipe connects Puck and Puck AI to [TanStack Start](https://tanstack.com/start), so you can create and edit pages for any route in this app.
8
+
9
+ ## Core concepts
10
+
11
+ If you're new to Puck, this section introduces the core concepts you need to know.
12
+
13
+ ### Puck
14
+
15
+ The Puck visual editor has three main parts: a config, the editor, and the renderer.
16
+
17
+ #### Config
18
+
19
+ The [config](https://puckeditor.com/docs/integrating-puck/component-configuration) registers the components users can use to build pages in the editor and the fields they can edit.
20
+
21
+ ```tsx
22
+ const config = {
23
+ components: {
24
+ HeadingBlock: {
25
+ fields: {
26
+ title: { type: "text" },
27
+ },
28
+ render: ({ title }) => <h1>{title}</h1>,
29
+ },
30
+ },
31
+ };
32
+ ```
33
+
34
+ #### The editor
35
+
36
+ The [`<Puck>`](https://puckeditor.com/docs/api-reference/components/puck) component renders the editor. It uses a config, exports [pages as JSON](https://puckeditor.com/docs/api-reference/data-model/data), and accepts initial page data for editing existing pages.
37
+
38
+ ```tsx
39
+ <Puck
40
+ config={config} // The components available to the editor
41
+ data={data} // The page JSON to edit
42
+ onPublish={(data) => {
43
+ // Save data to your database
44
+ }}
45
+ />
46
+ ```
47
+
48
+ #### The renderer
49
+
50
+ The [`<Render>`](https://puckeditor.com/docs/api-reference/components/render) component renders pages. It expects the page JSON and the config used to create that page.
51
+
52
+ ```tsx
53
+ <Render
54
+ config={config} // The components used to create the page
55
+ data={data} // The page JSON to render
56
+ />
57
+ ```
58
+
59
+ ### Puck AI
60
+
61
+ This recipe adds Puck AI as a copilot. It has two parts: the AI plugin (browser) and the Cloud Client (server).
62
+
63
+ #### The AI plugin
64
+
65
+ The [AI plugin](https://puckeditor.com/docs/api-reference/ai/ai-plugin/installation) renders the chat in the editor and sends each message to the Cloud Client on your server.
66
+
67
+ ```tsx
68
+ const aiPlugin = createAiPlugin();
69
+
70
+ function Editor() {
71
+ return <Puck plugins={[aiPlugin]} config={config} data={data} />;
72
+ }
73
+ ```
74
+
75
+ #### The Cloud Client
76
+
77
+ The [Cloud Client](https://puckeditor.com/docs/api-reference/ai/cloud-client/installation) provides APIs for connecting your server to the Puck cloud. This recipe uses its [`puckHandler`](https://puckeditor.com/docs/api-reference/ai/cloud-client/puck-handler) API, which receives each chat message, forwards it to the Puck cloud, and streams the response back to the plugin in the browser.
78
+
79
+ ```ts
80
+ const options = {
81
+ ai: {
82
+ context: "We are Google. You create Google landing pages.",
83
+ },
84
+ };
85
+
86
+ const handleRequest = ({ request }: { request: Request }) =>
87
+ puckHandler(request, options);
88
+
89
+ export const Route = createFileRoute("/api/puck/$")({
90
+ server: { handlers: { GET: handleRequest, POST: handleRequest } },
91
+ });
92
+ ```
93
+
94
+ #### Puck AI modes
95
+
96
+ Puck AI can build pages in two ways:
97
+
98
+ - **Assembly mode** only builds pages using components from your config.
99
+ - **Design mode** can generate new components when needed.
100
+
101
+ This recipe comes with [Design mode](https://puckeditor.com/docs/api-reference/ai/cloud-client/puck-handler#aidesignmode) enabled out of the box.
102
+
103
+ ## Run the recipe
104
+
105
+ ### 1. Add a Puck API key
106
+
107
+ Start by creating an account, [generating an API key](https://cloud.puckeditor.com/api-keys), and adding it to an `.env.local` file:
108
+
109
+ ```sh
110
+ PUCK_API_KEY=your-api-key
111
+ ```
112
+
113
+ ### 2. Start the development server
114
+
115
+ Run:
116
+
117
+ ```sh
118
+ npm run dev
119
+ ```
120
+
121
+ Once the server is running, navigate to [http://localhost:3000](http://localhost:3000) to view the home page, or [http://localhost:3000/edit](http://localhost:3000/edit) to edit it with Puck.
122
+
123
+ ### 3. Create a page with Puck AI
124
+
125
+ Navigate to [http://localhost:3000/edit](http://localhost:3000/edit), click the **AI** button in the left sidebar, enter a prompt, and press Enter.
126
+
127
+ ### 4. Publish the page
128
+
129
+ Once your page is ready, select **Publish** in the header to save the result, then navigate to [http://localhost:3000](http://localhost:3000) to view the published page.
130
+
131
+ You can also create a page at any path by navigating to `/your/path/edit` and publishing it. The route `/your/path` will render the page.
132
+
133
+ ## How it works
134
+
135
+ When a URL ends in `/edit`, `resolvePuckPath` (`src/lib/resolve-puck-path.ts`) returns the path of the page being edited. The loader in `src/routes/$.tsx` calls the `loadPuckPage` server function, which loads the saved page, or starts with an empty page if the path is new.
136
+
137
+ Selecting **Publish** calls the `publishPuckPage` server function (`src/lib/pages.ts`), which writes the JSON to `database.json`. The route then loads the same data and renders it with [`<Render>`](https://puckeditor.com/docs/api-reference/components/render).
138
+
139
+ The table below shows the files that implement this flow.
140
+
141
+ | File | Purpose |
142
+ | -------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
143
+ | `puck.config.tsx` | Defines the components, fields, and default props available to Puck and Assembly mode. Add your own components here. |
144
+ | `src/routes/$.tsx` | Loads page data, then renders the editor or published page. |
145
+ | `src/routes/index.tsx` | Loads and renders the home page. |
146
+ | `src/routes/api/puck/$.ts` | Handles requests from the AI plugin and configures AI generation. |
147
+ | `src/lib/pages.ts` | Server functions that load and publish pages. |
148
+ | `src/lib/resolve-puck-path.ts` | Maps an `/edit` URL to the path of the page being edited. |
149
+ | `src/lib/pages.server.ts` | Reads and writes page data in `database.json`. Replace this with your own data fetching and saving logic. |
150
+ | `src/components/puck-render.tsx` | Renders saved page data with `<Render>`. |
151
+ | `database.json` | Acts as a local database. Replace this with your own database solution. |
152
+
153
+ ## Before deploying to production
154
+
155
+ Before deploying this recipe, make sure to:
156
+
157
+ - **Protect the editor and APIs.** The `/edit` routes, `publishPuckPage` server function, and `/api/puck` route are public by default. Add authentication, authorization, and rate limits to protect page data and AI usage.
158
+ - **Add your component library.** Replace the example `HeadingBlock` in `puck.config.tsx` with the components and fields your users need.
159
+ - **Set your business context.** Replace the example Google context in `src/routes/api/puck/$.ts` with clear information about your product, audience, and content rules.
160
+ - **Use a real database.** Replace `database.json` and the functions in `src/lib/pages.server.ts`. Local files are not reliable across server instances or serverless deployments.
161
+ - **Choose a deployment strategy.** This recipe uses server-side rendering, loaders, and server functions. Deploy it with one of [TanStack Start's hosting options](https://tanstack.com/start/latest/docs/framework/react/guide/hosting).
162
+
163
+ ## Learn more
164
+
165
+ - [Puck documentation](https://puckeditor.com/docs)
166
+ - [Getting started with Puck](https://puckeditor.com/docs/getting-started)
167
+ - [Integrating Puck](https://puckeditor.com/docs/integrating-puck/component-configuration)
168
+ - [Puck AI documentation](https://puckeditor.com/docs/ai/overview)
169
+ - [Getting started with Puck AI](https://puckeditor.com/docs/ai/getting-started)
170
+ - [TanStack Start](https://tanstack.com/start/latest/docs/framework/react/overview)
171
+ - [Puck Discord](https://discord.gg/D9e4E3MQVZ)
@@ -0,0 +1,12 @@
1
+ node_modules
2
+ .DS_Store
3
+ dist
4
+ dist-ssr
5
+ *.local
6
+ .env
7
+ .nitro
8
+ .tanstack
9
+ .wrangler
10
+ .output
11
+ .vinxi
12
+ __unconfig*
@@ -0,0 +1 @@
1
+ {"/":{"content":[{"type":"HeadingBlock","props":{"title":"Edit this page by adding /edit to the end of the URL","id":"HeadingBlock-1694032984497"}}],"root":{"props": {"title":""}}}}
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "tanstack-start-ai-recipe",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite dev --port 3000",
8
+ "build": "vite build",
9
+ "start": "vite preview --port 3000"
10
+ },
11
+ "dependencies": {
12
+ "@puckeditor/cloud-client": "^0",
13
+ "@puckeditor/core": "workspace:*",
14
+ "@puckeditor/plugin-ai": "^0",
15
+ "@tanstack/react-router": "^1.168.0",
16
+ "@tanstack/react-start": "^1.168.0",
17
+ "react": "^19.2.0",
18
+ "react-dom": "^19.2.0"
19
+ },
20
+ "devDependencies": {
21
+ "@types/node": "^22.10.2",
22
+ "@types/react": "^19.2.0",
23
+ "@types/react-dom": "^19.2.0",
24
+ "@vitejs/plugin-react": "^6.0.1",
25
+ "typescript": "^5.9.3",
26
+ "vite": "^8.0.0"
27
+ }
28
+ }
@@ -0,0 +1,23 @@
1
+ import type { Config } from "@puckeditor/core";
2
+
3
+ type Props = {
4
+ HeadingBlock: { title: string };
5
+ };
6
+
7
+ export const config: Config<Props> = {
8
+ components: {
9
+ HeadingBlock: {
10
+ fields: {
11
+ title: { type: "text" },
12
+ },
13
+ defaultProps: {
14
+ title: "Heading",
15
+ },
16
+ render: ({ title }) => (
17
+ <div style={{ padding: 64 }}>
18
+ <h1>{title}</h1>
19
+ </div>
20
+ ),
21
+ },
22
+ },
23
+ };
@@ -0,0 +1,11 @@
1
+ import type { Data } from "@puckeditor/core";
2
+ import { Render } from "@puckeditor/core";
3
+ import { withDynamicConfig } from "@puckeditor/plugin-ai";
4
+
5
+ import { config } from "../../puck.config";
6
+
7
+ export function PuckRender({ data }: { data: Data }) {
8
+ const configWithDesignedComponents = withDynamicConfig(config, data);
9
+
10
+ return <Render config={configWithDesignedComponents} data={data} />;
11
+ }
@@ -0,0 +1,26 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs/promises";
3
+ import type { Data } from "@puckeditor/core";
4
+
5
+ const databasePath = path.join(process.cwd(), "database.json");
6
+
7
+ export async function getPage(path: string) {
8
+ const pages = await readDatabase();
9
+ return pages[path];
10
+ }
11
+
12
+ export async function savePage(path: string, data: Data) {
13
+ const pages = await readDatabase();
14
+ pages[path] = data;
15
+ await fs.writeFile(databasePath, JSON.stringify(pages), { encoding: "utf8" });
16
+ }
17
+
18
+ async function readDatabase() {
19
+ try {
20
+ const file = await fs.readFile(databasePath, "utf8");
21
+ return JSON.parse(file) as Record<string, Data>;
22
+ } catch (error: unknown) {
23
+ console.error(error);
24
+ return {};
25
+ }
26
+ }
@@ -0,0 +1,39 @@
1
+ import { createServerFn } from "@tanstack/react-start";
2
+ import { notFound } from "@tanstack/react-router";
3
+ import type { Data } from "@puckeditor/core";
4
+
5
+ import { getPage, savePage } from "./pages.server";
6
+ import { resolvePuckPath } from "./resolve-puck-path";
7
+
8
+ // Loads the page for a URL, or an empty page when editing a new path
9
+ export const loadPuckPage = createServerFn({ method: "GET" })
10
+ .validator((pathname: string) => pathname)
11
+ .handler(async ({ data: pathname }) => {
12
+ const { isEditorRoute, path } = resolvePuckPath(pathname);
13
+ let page = await getPage(path);
14
+
15
+ // Throw a 404 if we're not rendering the editor and data for the page does not exist
16
+ if (!isEditorRoute && !page) {
17
+ throw notFound();
18
+ }
19
+
20
+ // Empty shell for new pages
21
+ if (isEditorRoute && !page) {
22
+ page = {
23
+ content: [],
24
+ root: {
25
+ props: {
26
+ title: "",
27
+ },
28
+ },
29
+ };
30
+ }
31
+
32
+ return { isEditorRoute, path, data: page as Data };
33
+ });
34
+
35
+ export const publishPuckPage = createServerFn({ method: "POST" })
36
+ .validator((input: { path: string; data: Data }) => input)
37
+ .handler(async ({ data }) => {
38
+ await savePage(data.path, data.data);
39
+ });
@@ -0,0 +1,19 @@
1
+ export function resolvePuckPath(
2
+ path = "",
3
+ // `base` can be any valid origin, it is required for the URL constructor so
4
+ // we can return a pathname - you can change this if you want, but it isn't
5
+ // important
6
+ base = "https://placeholder.com/"
7
+ ) {
8
+ const url = new URL(path, base);
9
+ const segments = url.pathname.split("/");
10
+ const isEditorRoute = segments.at(-1) === "edit";
11
+ const pathname = isEditorRoute
12
+ ? segments.slice(0, -1).join("/")
13
+ : url.pathname;
14
+
15
+ return {
16
+ isEditorRoute,
17
+ path: new URL(pathname, base).pathname,
18
+ };
19
+ }
@@ -0,0 +1,104 @@
1
+ /* eslint-disable */
2
+
3
+ // @ts-nocheck
4
+
5
+ // noinspection JSUnusedGlobalSymbols
6
+
7
+ // This file was automatically generated by TanStack Router.
8
+ // You should NOT make any changes in this file as it will be overwritten.
9
+ // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
10
+
11
+ import { Route as rootRouteImport } from './routes/__root'
12
+ import { Route as IndexRouteImport } from './routes/index'
13
+ import { Route as SplatRouteImport } from './routes/$'
14
+ import { Route as ApiPuckSplatRouteImport } from './routes/api/puck/$'
15
+
16
+ const IndexRoute = IndexRouteImport.update({
17
+ id: '/',
18
+ path: '/',
19
+ getParentRoute: () => rootRouteImport,
20
+ } as any)
21
+ const SplatRoute = SplatRouteImport.update({
22
+ id: '/$',
23
+ path: '/$',
24
+ getParentRoute: () => rootRouteImport,
25
+ } as any)
26
+ const ApiPuckSplatRoute = ApiPuckSplatRouteImport.update({
27
+ id: '/api/puck/$',
28
+ path: '/api/puck/$',
29
+ getParentRoute: () => rootRouteImport,
30
+ } as any)
31
+
32
+ export interface FileRoutesByFullPath {
33
+ '/': typeof IndexRoute
34
+ '/$': typeof SplatRoute
35
+ '/api/puck/$': typeof ApiPuckSplatRoute
36
+ }
37
+ export interface FileRoutesByTo {
38
+ '/': typeof IndexRoute
39
+ '/$': typeof SplatRoute
40
+ '/api/puck/$': typeof ApiPuckSplatRoute
41
+ }
42
+ export interface FileRoutesById {
43
+ __root__: typeof rootRouteImport
44
+ '/': typeof IndexRoute
45
+ '/$': typeof SplatRoute
46
+ '/api/puck/$': typeof ApiPuckSplatRoute
47
+ }
48
+ export interface FileRouteTypes {
49
+ fileRoutesByFullPath: FileRoutesByFullPath
50
+ fullPaths: '/' | '/$' | '/api/puck/$'
51
+ fileRoutesByTo: FileRoutesByTo
52
+ to: '/' | '/$' | '/api/puck/$'
53
+ id: '__root__' | '/' | '/$' | '/api/puck/$'
54
+ fileRoutesById: FileRoutesById
55
+ }
56
+ export interface RootRouteChildren {
57
+ IndexRoute: typeof IndexRoute
58
+ SplatRoute: typeof SplatRoute
59
+ ApiPuckSplatRoute: typeof ApiPuckSplatRoute
60
+ }
61
+
62
+ declare module '@tanstack/react-router' {
63
+ interface FileRoutesByPath {
64
+ '/': {
65
+ id: '/'
66
+ path: '/'
67
+ fullPath: '/'
68
+ preLoaderRoute: typeof IndexRouteImport
69
+ parentRoute: typeof rootRouteImport
70
+ }
71
+ '/$': {
72
+ id: '/$'
73
+ path: '/$'
74
+ fullPath: '/$'
75
+ preLoaderRoute: typeof SplatRouteImport
76
+ parentRoute: typeof rootRouteImport
77
+ }
78
+ '/api/puck/$': {
79
+ id: '/api/puck/$'
80
+ path: '/api/puck/$'
81
+ fullPath: '/api/puck/$'
82
+ preLoaderRoute: typeof ApiPuckSplatRouteImport
83
+ parentRoute: typeof rootRouteImport
84
+ }
85
+ }
86
+ }
87
+
88
+ const rootRouteChildren: RootRouteChildren = {
89
+ IndexRoute: IndexRoute,
90
+ SplatRoute: SplatRoute,
91
+ ApiPuckSplatRoute: ApiPuckSplatRoute,
92
+ }
93
+ export const routeTree = rootRouteImport
94
+ ._addFileChildren(rootRouteChildren)
95
+ ._addFileTypes<FileRouteTypes>()
96
+
97
+ import type { getRouter } from './router.tsx'
98
+ import type { createStart } from '@tanstack/react-start'
99
+ declare module '@tanstack/react-start' {
100
+ interface Register {
101
+ ssr: true
102
+ router: Awaited<ReturnType<typeof getRouter>>
103
+ }
104
+ }
@@ -0,0 +1,19 @@
1
+ import { createRouter as createTanStackRouter } from "@tanstack/react-router";
2
+ import { routeTree } from "./routeTree.gen";
3
+
4
+ export function getRouter() {
5
+ const router = createTanStackRouter({
6
+ routeTree,
7
+ scrollRestoration: true,
8
+ defaultPreload: "intent",
9
+ defaultPreloadStaleTime: 0,
10
+ });
11
+
12
+ return router;
13
+ }
14
+
15
+ declare module "@tanstack/react-router" {
16
+ interface Register {
17
+ router: ReturnType<typeof getRouter>;
18
+ }
19
+ }
@@ -0,0 +1,73 @@
1
+ import { useMemo } from "react";
2
+ import { createFileRoute } from "@tanstack/react-router";
3
+ import type { Data } from "@puckeditor/core";
4
+ import { Puck, blocksPlugin, outlinePlugin } from "@puckeditor/core";
5
+ import { createAiPlugin, withDynamicConfig } from "@puckeditor/plugin-ai";
6
+
7
+ import { config } from "../../puck.config";
8
+ import { loadPuckPage, publishPuckPage } from "../lib/pages";
9
+ import { PuckRender } from "../components/puck-render";
10
+
11
+ import editorStyles from "@puckeditor/core/puck.css?url";
12
+ import pluginStyles from "@puckeditor/plugin-ai/styles.css?url";
13
+
14
+ export const Route = createFileRoute("/$")({
15
+ loader: ({ params }) => loadPuckPage({ data: params._splat ?? "" }),
16
+ head: ({ loaderData }) => ({
17
+ meta: [
18
+ {
19
+ title: loaderData?.isEditorRoute
20
+ ? `Edit: ${loaderData.path}`
21
+ : loaderData?.data.root.props?.title ?? "",
22
+ },
23
+ ],
24
+ links: loaderData?.isEditorRoute
25
+ ? [
26
+ { rel: "stylesheet", href: editorStyles },
27
+ { rel: "stylesheet", href: pluginStyles },
28
+ ]
29
+ : [],
30
+ }),
31
+ component: PuckSplatRoute,
32
+ });
33
+
34
+ const aiPlugin = createAiPlugin({
35
+ // Allow users to switch between design and assembly mode.
36
+ // Read more: https://puckeditor.com/docs/ai/design-mode
37
+ designMode: {
38
+ visible: true,
39
+ },
40
+ // Select design mode by default.
41
+ defaultMode: "design",
42
+ });
43
+
44
+ // Place the ai plugin in the first position in the side nav.
45
+ const plugins = [aiPlugin, blocksPlugin(), outlinePlugin()];
46
+
47
+ function Editor({ path, data }: { path: string; data: Data }) {
48
+ const configWithDesignedComponents = useMemo(
49
+ () => withDynamicConfig(config, data),
50
+ [config, data]
51
+ );
52
+
53
+ return (
54
+ <Puck
55
+ plugins={plugins}
56
+ config={configWithDesignedComponents}
57
+ data={data}
58
+ onPublish={async (data) => {
59
+ await publishPuckPage({ data: { path, data } });
60
+ }}
61
+ />
62
+ );
63
+ }
64
+
65
+ function PuckSplatRoute() {
66
+ const { isEditorRoute, path, data } = Route.useLoaderData();
67
+
68
+ return isEditorRoute ? (
69
+ <Editor path={path} data={data} />
70
+ ) : (
71
+ <PuckRender data={data} />
72
+ );
73
+ }
@@ -0,0 +1,42 @@
1
+ import { HeadContent, Scripts, createRootRoute } from "@tanstack/react-router";
2
+
3
+ import appCss from "../styles.css?url";
4
+
5
+ export const Route = createRootRoute({
6
+ head: () => ({
7
+ meta: [
8
+ {
9
+ charSet: "utf-8",
10
+ },
11
+ {
12
+ name: "viewport",
13
+ content: "width=device-width, initial-scale=1",
14
+ },
15
+ {
16
+ title: "TanStack Start Starter",
17
+ },
18
+ ],
19
+ links: [
20
+ {
21
+ rel: "stylesheet",
22
+ href: appCss,
23
+ },
24
+ ],
25
+ }),
26
+ shellComponent: RootDocument,
27
+ });
28
+
29
+ function RootDocument({ children }: { children: React.ReactNode }) {
30
+ return (
31
+ <html lang="en">
32
+ <head>
33
+ <HeadContent />
34
+ </head>
35
+ <body>
36
+ {children}
37
+
38
+ <Scripts />
39
+ </body>
40
+ </html>
41
+ );
42
+ }
@@ -0,0 +1,39 @@
1
+ // Handles all requests for Puck AI
2
+ // Learn more: https://puckeditor.com/docs/ai/getting-started
3
+ import { createFileRoute } from "@tanstack/react-router";
4
+ import type { PuckCloudOptions } from "@puckeditor/cloud-client";
5
+ import { puckHandler } from "@puckeditor/cloud-client";
6
+
7
+ const options: PuckCloudOptions = {
8
+ ai: {
9
+ // Replace with your business context
10
+ context: "We are Google. You create Google landing pages.",
11
+ designMode: {
12
+ // Allow AI to generate new components using "design mode"
13
+ // Learn more: https://puckeditor.com/docs/ai/design-mode
14
+ allowed: true,
15
+ // Constrain component generation, replace with your own instructions
16
+ instructions: `
17
+ #### Color Palette
18
+
19
+ Always use the following colors:
20
+
21
+ * Primary: \`#1976d2\`
22
+ * Secondary: \`#9c27b0\`
23
+ `,
24
+ },
25
+ },
26
+ };
27
+
28
+ const handleRequest = ({ request }: { request: Request }) =>
29
+ puckHandler(request, options);
30
+
31
+ export const Route = createFileRoute("/api/puck/$")({
32
+ server: {
33
+ handlers: {
34
+ GET: handleRequest,
35
+ POST: handleRequest,
36
+ DELETE: handleRequest,
37
+ },
38
+ },
39
+ });
@@ -0,0 +1,18 @@
1
+ import { createFileRoute } from "@tanstack/react-router";
2
+
3
+ import { loadPuckPage } from "../lib/pages";
4
+ import { PuckRender } from "../components/puck-render";
5
+
6
+ export const Route = createFileRoute("/")({
7
+ loader: () => loadPuckPage({ data: "/" }),
8
+ head: ({ loaderData }) => ({
9
+ meta: [{ title: loaderData?.data.root.props?.title ?? "" }],
10
+ }),
11
+ component: Home,
12
+ });
13
+
14
+ function Home() {
15
+ const { data } = Route.useLoaderData();
16
+
17
+ return <PuckRender data={data} />;
18
+ }
@@ -0,0 +1,13 @@
1
+ * {
2
+ box-sizing: border-box;
3
+ }
4
+
5
+ body {
6
+ margin: 0;
7
+ font-family: system-ui, sans-serif;
8
+ }
9
+
10
+ main {
11
+ width: min(42rem, calc(100% - 2rem));
12
+ margin: 4rem auto;
13
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "include": ["**/*.ts", "**/*.tsx"],
3
+ "compilerOptions": {
4
+ "target": "ES2022",
5
+ "jsx": "react-jsx",
6
+ "module": "ESNext",
7
+ "paths": {
8
+ "#/*": ["./src/*"],
9
+ "@/*": ["./src/*"]
10
+ },
11
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
12
+ "types": ["vite/client"],
13
+ "moduleResolution": "bundler",
14
+ "allowImportingTsExtensions": true,
15
+ "verbatimModuleSyntax": true,
16
+ "noEmit": true,
17
+ "skipLibCheck": true,
18
+ "strict": true,
19
+ "noUnusedLocals": true,
20
+ "noUnusedParameters": true,
21
+ "noFallthroughCasesInSwitch": true,
22
+ "noUncheckedSideEffectImports": true
23
+ }
24
+ }