create-aron-app 0.1.5 → 0.1.7

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 (261) hide show
  1. package/README.md +73 -38
  2. package/dist/index.js +50 -115
  3. package/package.json +5 -2
  4. package/templates/{_base/.cursor → .cursor}/rules/api_architecture.mdc +27 -33
  5. package/templates/{_base/.cursor → .cursor}/rules/coding_standards.mdc +1 -1
  6. package/templates/{_base/.cursor → .cursor}/rules/convex_rules.mdc +78 -422
  7. package/templates/.cursor/rules/frontend_architecture_core.mdc +495 -0
  8. package/templates/.cursor/rules/frontend_architecture_nextjs.mdc +458 -0
  9. package/templates/.cursor/rules/frontend_architecture_reactrouter.mdc +473 -0
  10. package/templates/apps/api/_generated/api.d.ts +57 -0
  11. package/templates/apps/api/_generated/api.js +23 -0
  12. package/templates/apps/api/_generated/dataModel.d.ts +60 -0
  13. package/templates/apps/api/_generated/server.d.ts +143 -0
  14. package/templates/apps/api/_generated/server.js +93 -0
  15. package/templates/apps/api/http.ts +16 -0
  16. package/templates/apps/nextjs/.env.example +10 -0
  17. package/templates/{nextjs → apps/nextjs}/project.json +5 -5
  18. package/templates/{nextjs → apps/nextjs}/src/app/(auth)/not-allowed/page.tsx +1 -0
  19. package/templates/apps/nextjs/src/app/(dashboard)/layout.tsx +22 -0
  20. package/templates/apps/nextjs/src/app/(dashboard)/page.tsx +12 -0
  21. package/templates/{nextjs → apps/nextjs}/src/app/(dashboard)/todos/[id]/page.tsx +5 -2
  22. package/templates/apps/nextjs/src/app/(dashboard)/todos/page.tsx +19 -0
  23. package/templates/apps/nextjs/src/middleware.ts +18 -0
  24. package/templates/apps/nextjs/src/surfaces/home/bootstrap.ts +9 -0
  25. package/templates/apps/nextjs/src/surfaces/home/home.tsx +27 -0
  26. package/templates/apps/nextjs/src/surfaces/home/install.tsx +17 -0
  27. package/templates/apps/nextjs/src/surfaces/home/layout.tsx +44 -0
  28. package/templates/apps/nextjs/src/surfaces/home/main/create.tsx +34 -0
  29. package/templates/apps/nextjs/src/surfaces/sidebar/install.tsx +23 -0
  30. package/templates/apps/nextjs/src/surfaces/sidebar/layout.tsx +118 -0
  31. package/templates/apps/nextjs/src/surfaces/sidebar/nav_main/create.tsx +19 -0
  32. package/templates/apps/nextjs/src/surfaces/sidebar/nav_main/nav_config.ts +22 -0
  33. package/templates/apps/nextjs/src/surfaces/sidebar/nav_main/nav_main.tsx +25 -0
  34. package/templates/apps/nextjs/src/surfaces/sidebar/nav_secondary/create.tsx +21 -0
  35. package/templates/apps/nextjs/src/surfaces/sidebar/nav_secondary/nav_secondary.tsx +33 -0
  36. package/templates/apps/nextjs/src/surfaces/sidebar/sidebar.tsx +23 -0
  37. package/templates/{nextjs/src/ui/sidebar/nav_link.tsx → apps/nextjs/src/surfaces/sidebar/ui/sidebar_nav_link.tsx} +13 -10
  38. package/templates/apps/nextjs/src/surfaces/sidebar/user_menu/create.tsx +28 -0
  39. package/templates/apps/nextjs/src/surfaces/sidebar/user_menu/user_menu.tsx +42 -0
  40. package/templates/apps/nextjs/src/surfaces/todos/all_todos/all_todos.tsx +29 -0
  41. package/templates/apps/nextjs/src/surfaces/todos/all_todos/all_todos_controller.ts +61 -0
  42. package/templates/apps/nextjs/src/surfaces/todos/all_todos/bootstrap.ts +21 -0
  43. package/templates/apps/nextjs/src/surfaces/todos/all_todos/header/create.tsx +23 -0
  44. package/templates/apps/nextjs/src/surfaces/todos/all_todos/install.tsx +23 -0
  45. package/templates/apps/nextjs/src/surfaces/todos/all_todos/layout.tsx +44 -0
  46. package/templates/apps/nextjs/src/surfaces/todos/all_todos/main/create.tsx +49 -0
  47. package/templates/apps/nextjs/src/surfaces/todos/all_todos/main/main.tsx +70 -0
  48. package/templates/apps/nextjs/src/surfaces/todos/all_todos/main/new_todo_sheet/create.tsx +56 -0
  49. package/templates/apps/nextjs/src/surfaces/todos/all_todos/main/new_todo_sheet/new_todo_sheet.tsx +99 -0
  50. package/templates/apps/nextjs/src/surfaces/todos/all_todos/main/new_todo_sheet/schema.ts +11 -0
  51. package/templates/apps/nextjs/src/surfaces/todos/single_todo/bootstrap.ts +32 -0
  52. package/templates/apps/nextjs/src/surfaces/todos/single_todo/header/create.tsx +26 -0
  53. package/templates/apps/nextjs/src/surfaces/todos/single_todo/header/header.tsx +22 -0
  54. package/templates/apps/nextjs/src/surfaces/todos/single_todo/install.tsx +27 -0
  55. package/templates/apps/nextjs/src/surfaces/todos/single_todo/layout.tsx +55 -0
  56. package/templates/apps/nextjs/src/surfaces/todos/single_todo/main/create.tsx +38 -0
  57. package/templates/apps/nextjs/src/surfaces/todos/single_todo/main/main.tsx +49 -0
  58. package/templates/apps/nextjs/src/surfaces/todos/single_todo/single_todo.tsx +29 -0
  59. package/templates/apps/nextjs/src/surfaces/todos/single_todo/single_todo_controller.ts +13 -0
  60. package/templates/apps/nextjs/src/utils/auth.ts +18 -0
  61. package/templates/apps/react-router/.env.example +10 -0
  62. package/templates/apps/react-router/.react-router/types/+future.ts +9 -0
  63. package/templates/apps/react-router/.react-router/types/+routes.ts +71 -0
  64. package/templates/apps/react-router/.react-router/types/+server-build.d.ts +18 -0
  65. package/templates/apps/react-router/.react-router/types/src/+types/root.ts +59 -0
  66. package/templates/apps/react-router/.react-router/types/src/routes/(auth)/+types/layout.ts +62 -0
  67. package/templates/apps/react-router/.react-router/types/src/routes/(auth)/sign-in/+types/index.ts +65 -0
  68. package/templates/apps/react-router/.react-router/types/src/routes/(dashboard)/+types/index.ts +65 -0
  69. package/templates/apps/react-router/.react-router/types/src/routes/(dashboard)/+types/layout.ts +62 -0
  70. package/templates/apps/react-router/.react-router/types/src/routes/(dashboard)/todos/+types/[id].ts +65 -0
  71. package/templates/apps/react-router/.react-router/types/src/routes/(dashboard)/todos/+types/index.ts +65 -0
  72. package/templates/{react-router → apps/react-router}/project.json +4 -4
  73. package/templates/apps/react-router/src/app.css +3 -0
  74. package/templates/{react-router → apps/react-router}/src/components/error_boundary.tsx +1 -1
  75. package/templates/{react-router → apps/react-router}/src/providers/api_auth_provider.tsx +2 -0
  76. package/templates/{react-router/src/routes/auth → apps/react-router/src/routes/(auth)}/layout.tsx +1 -1
  77. package/templates/apps/react-router/src/routes/(dashboard)/index.tsx +19 -0
  78. package/templates/apps/react-router/src/routes/(dashboard)/layout.tsx +37 -0
  79. package/templates/apps/react-router/src/routes/(dashboard)/todos/[id].tsx +19 -0
  80. package/templates/apps/react-router/src/routes/(dashboard)/todos/index.tsx +19 -0
  81. package/templates/apps/react-router/src/routes.ts +12 -0
  82. package/templates/apps/react-router/src/surfaces/home/bootstrap.ts +9 -0
  83. package/templates/apps/react-router/src/surfaces/home/home.tsx +25 -0
  84. package/templates/apps/react-router/src/surfaces/home/install.tsx +17 -0
  85. package/templates/apps/react-router/src/surfaces/home/layout.tsx +35 -0
  86. package/templates/apps/react-router/src/surfaces/home/main/create.tsx +32 -0
  87. package/templates/apps/react-router/src/surfaces/sidebar/install.tsx +23 -0
  88. package/templates/apps/react-router/src/surfaces/sidebar/layout.tsx +110 -0
  89. package/templates/apps/react-router/src/surfaces/sidebar/nav_main/create.tsx +31 -0
  90. package/templates/apps/react-router/src/surfaces/sidebar/nav_main/nav_main.tsx +42 -0
  91. package/templates/apps/react-router/src/surfaces/sidebar/nav_secondary/create.tsx +21 -0
  92. package/templates/apps/react-router/src/surfaces/sidebar/nav_secondary/nav_secondary.tsx +31 -0
  93. package/templates/apps/react-router/src/surfaces/sidebar/sidebar.tsx +18 -0
  94. package/templates/apps/react-router/src/surfaces/sidebar/user_menu/create.tsx +26 -0
  95. package/templates/{react-router/src/layouts/sidebar/sidebar_aside → apps/react-router/src/surfaces/sidebar/user_menu}/user_menu.tsx +13 -9
  96. package/templates/apps/react-router/src/surfaces/todos/all_todos/all_todos.tsx +25 -0
  97. package/templates/apps/react-router/src/surfaces/todos/all_todos/all_todos_controller.ts +47 -0
  98. package/templates/apps/react-router/src/surfaces/todos/all_todos/bootstrap.ts +18 -0
  99. package/templates/apps/react-router/src/surfaces/todos/all_todos/header/create.tsx +21 -0
  100. package/templates/apps/react-router/src/surfaces/todos/all_todos/install.tsx +20 -0
  101. package/templates/apps/react-router/src/surfaces/todos/all_todos/layout.tsx +35 -0
  102. package/templates/apps/react-router/src/surfaces/todos/all_todos/main/create.tsx +47 -0
  103. package/templates/apps/react-router/src/surfaces/todos/all_todos/main/main.tsx +68 -0
  104. package/templates/apps/react-router/src/surfaces/todos/all_todos/main/new_todo_sheet/create.tsx +54 -0
  105. package/templates/apps/react-router/src/surfaces/todos/all_todos/main/new_todo_sheet/new_todo_sheet.tsx +97 -0
  106. package/templates/apps/react-router/src/surfaces/todos/all_todos/main/new_todo_sheet/schema.ts +11 -0
  107. package/templates/apps/react-router/src/surfaces/todos/single_todo/bootstrap.ts +36 -0
  108. package/templates/apps/react-router/src/surfaces/todos/single_todo/header/create.tsx +32 -0
  109. package/templates/apps/react-router/src/surfaces/todos/single_todo/header/header.tsx +25 -0
  110. package/templates/apps/react-router/src/surfaces/todos/single_todo/install.tsx +27 -0
  111. package/templates/apps/react-router/src/surfaces/todos/single_todo/layout.tsx +45 -0
  112. package/templates/apps/react-router/src/surfaces/todos/single_todo/main/create.tsx +35 -0
  113. package/templates/apps/react-router/src/surfaces/todos/single_todo/main/main.tsx +47 -0
  114. package/templates/apps/react-router/src/surfaces/todos/single_todo/single_todo.tsx +27 -0
  115. package/templates/apps/react-router/src/surfaces/todos/single_todo/single_todo_controller.ts +16 -0
  116. package/templates/{react-router → apps/react-router}/vite.config.ts +27 -3
  117. package/templates/{_base/biome.json → biome.json} +7 -0
  118. package/templates/bun.lock +3187 -0
  119. package/templates/{_base/emails → emails}/project.json +1 -1
  120. package/templates/{_base/nx.json → nx.json} +11 -0
  121. package/templates/package.json +92 -0
  122. package/templates/{_base/tsconfig.base.json → tsconfig.base.json} +4 -1
  123. package/templates/_base/.cursor/rules/frontend_rules.mdc +0 -268
  124. package/templates/_base/.env.convex.example +0 -3
  125. package/templates/_base/_gitignore +0 -58
  126. package/templates/_base/package.json +0 -73
  127. package/templates/nextjs/.env.example +0 -8
  128. package/templates/nextjs/src/app/(dashboard)/layout.tsx +0 -27
  129. package/templates/nextjs/src/app/(dashboard)/page.tsx +0 -5
  130. package/templates/nextjs/src/app/(dashboard)/todos/page.tsx +0 -16
  131. package/templates/nextjs/src/middleware.ts +0 -18
  132. package/templates/nextjs/src/surfaces/home_surface.tsx +0 -22
  133. package/templates/nextjs/src/surfaces/todos/all_todos_surface.tsx +0 -97
  134. package/templates/nextjs/src/surfaces/todos/create_todo_sheet.tsx +0 -107
  135. package/templates/nextjs/src/surfaces/todos/single_todo_surface.tsx +0 -90
  136. package/templates/nextjs/src/ui/sidebar/sidebar.tsx +0 -125
  137. package/templates/react-router/.env.example +0 -8
  138. package/templates/react-router/src/app.css +0 -3
  139. package/templates/react-router/src/layouts/sidebar/sidebar_aside/sidebar_aside.tsx +0 -76
  140. package/templates/react-router/src/layouts/sidebar/sidebar_layout.tsx +0 -22
  141. package/templates/react-router/src/routes/index.tsx +0 -9
  142. package/templates/react-router/src/routes/layout.tsx +0 -26
  143. package/templates/react-router/src/routes/todos/[id].tsx +0 -22
  144. package/templates/react-router/src/routes/todos/index.tsx +0 -13
  145. package/templates/react-router/src/routes.ts +0 -12
  146. package/templates/react-router/src/surfaces/home_surface.tsx +0 -20
  147. package/templates/react-router/src/surfaces/todos/all_todos_surface.tsx +0 -87
  148. package/templates/react-router/src/surfaces/todos/create_todo_sheet.tsx +0 -102
  149. package/templates/react-router/src/surfaces/todos/single_todo_surface.tsx +0 -81
  150. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/SKILL.md +0 -0
  151. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-backend-api/SKILL.md +0 -0
  152. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-backend-api/scripts/api-specs-context.sh +0 -0
  153. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-backend-api/scripts/execute-request.sh +0 -0
  154. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-backend-api/scripts/extract-endpoint-detail.sh +0 -0
  155. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-backend-api/scripts/extract-tag-endpoints.sh +0 -0
  156. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-backend-api/scripts/extract-tags.js +0 -0
  157. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-custom-ui/SKILL.md +0 -0
  158. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-custom-ui/core-2/custom-sign-in.md +0 -0
  159. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-custom-ui/core-2/custom-sign-up.md +0 -0
  160. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-custom-ui/core-3/custom-sign-in.md +0 -0
  161. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-custom-ui/core-3/custom-sign-up.md +0 -0
  162. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-custom-ui/core-3/show-component.md +0 -0
  163. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-nextjs-patterns/SKILL.md +0 -0
  164. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-nextjs-patterns/references/api-routes.md +0 -0
  165. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-nextjs-patterns/references/caching-auth.md +0 -0
  166. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-nextjs-patterns/references/middleware-strategies.md +0 -0
  167. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-nextjs-patterns/references/server-actions.md +0 -0
  168. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-nextjs-patterns/references/server-vs-client.md +0 -0
  169. /package/templates/{_base/.cursor → .cursor}/agents/skills/clerk/clerk-webhooks/SKILL.md +0 -0
  170. /package/templates/{_base/.cursor → .cursor}/agents/skills/shadcn/SKILL.md +0 -0
  171. /package/templates/{_base/.cursor → .cursor}/agents/skills/shadcn/agents/openai.yml +0 -0
  172. /package/templates/{_base/.cursor → .cursor}/agents/skills/shadcn/assets/shadcn-small.png +0 -0
  173. /package/templates/{_base/.cursor → .cursor}/agents/skills/shadcn/assets/shadcn.png +0 -0
  174. /package/templates/{_base/.cursor → .cursor}/agents/skills/shadcn/cli.md +0 -0
  175. /package/templates/{_base/.cursor → .cursor}/agents/skills/shadcn/customization.md +0 -0
  176. /package/templates/{_base/.cursor → .cursor}/agents/skills/shadcn/evals/evals.json +0 -0
  177. /package/templates/{_base/.cursor → .cursor}/agents/skills/shadcn/mcp.md +0 -0
  178. /package/templates/{_base/.cursor → .cursor}/agents/skills/shadcn/rules/base-vs-radix.md +0 -0
  179. /package/templates/{_base/.cursor → .cursor}/agents/skills/shadcn/rules/composition.md +0 -0
  180. /package/templates/{_base/.cursor → .cursor}/agents/skills/shadcn/rules/forms.md +0 -0
  181. /package/templates/{_base/.cursor → .cursor}/agents/skills/shadcn/rules/icons.md +0 -0
  182. /package/templates/{_base/.cursor → .cursor}/agents/skills/shadcn/rules/styling.md +0 -0
  183. /package/templates/{_base/.cursor → .cursor}/commands/builder.md +0 -0
  184. /package/templates/{_base/.cursor → .cursor}/commands/pr.md +0 -0
  185. /package/templates/{_base/.github → .github}/workflows/ci.yml +0 -0
  186. /package/templates/{_base/.nvmrc → .nvmrc} +0 -0
  187. /package/templates/{_base/.vscode → .vscode}/settings.json +0 -0
  188. /package/templates/{_base/apps → apps}/api/auth.config.ts +0 -0
  189. /package/templates/{_base/apps → apps}/api/functions.ts +0 -0
  190. /package/templates/{_base/apps → apps}/api/project.json +0 -0
  191. /package/templates/{_base/apps → apps}/api/schema.ts +0 -0
  192. /package/templates/{_base/apps → apps}/api/todos/crud.ts +0 -0
  193. /package/templates/{_base/apps → apps}/api/todos/schema.ts +0 -0
  194. /package/templates/{_base/apps → apps}/api/todos/types.ts +0 -0
  195. /package/templates/{_base/apps → apps}/api/tsconfig.json +0 -0
  196. /package/templates/{_base/apps → apps}/api/types.ts +0 -0
  197. /package/templates/{nextjs → apps/nextjs}/index.d.ts +0 -0
  198. /package/templates/{nextjs → apps/nextjs}/next-env.d.ts +0 -0
  199. /package/templates/{nextjs → apps/nextjs}/next.config.js +0 -0
  200. /package/templates/{nextjs → apps/nextjs}/postcss.config.js +0 -0
  201. /package/templates/{nextjs → apps/nextjs}/src/app/(auth)/layout.tsx +0 -0
  202. /package/templates/{nextjs → apps/nextjs}/src/app/(auth)/sign-in/[[...sign-in]]/page.tsx +0 -0
  203. /package/templates/{nextjs → apps/nextjs}/src/app/app.css +0 -0
  204. /package/templates/{nextjs → apps/nextjs}/src/app/layout.tsx +0 -0
  205. /package/templates/{nextjs → apps/nextjs}/src/providers/convex_provider.tsx +0 -0
  206. /package/templates/{nextjs/src → apps/nextjs/src/utils}/convex.ts +0 -0
  207. /package/templates/{nextjs → apps/nextjs}/src/utils/font.ts +0 -0
  208. /package/templates/{nextjs → apps/nextjs}/tsconfig.json +0 -0
  209. /package/templates/{react-router → apps/react-router}/postcss.config.js +0 -0
  210. /package/templates/{react-router → apps/react-router}/public/favicon.ico +0 -0
  211. /package/templates/{react-router → apps/react-router}/react-router.config.ts +0 -0
  212. /package/templates/{react-router → apps/react-router}/src/root.tsx +0 -0
  213. /package/templates/{react-router/src/routes/auth/sign-in.tsx → apps/react-router/src/routes/(auth)/sign-in/index.tsx} +0 -0
  214. /package/templates/{react-router → apps/react-router}/tsconfig.json +0 -0
  215. /package/templates/{_base/convex.json → convex.json} +0 -0
  216. /package/templates/{_base/emails → emails}/tsconfig.json +0 -0
  217. /package/templates/{_base/emails → emails}/welcome_email.tsx +0 -0
  218. /package/templates/{_base/scripts → scripts}/sync_convex_env.ts +0 -0
  219. /package/templates/{_base/shared → shared}/assets/image.d.ts +0 -0
  220. /package/templates/{_base/shared → shared}/assets/src/styles/global.css +0 -0
  221. /package/templates/{_base/shared → shared}/assets/tsconfig.json +0 -0
  222. /package/templates/{_base/shared → shared}/ui/src/base/alert_dialog.tsx +0 -0
  223. /package/templates/{_base/shared → shared}/ui/src/base/badge.tsx +0 -0
  224. /package/templates/{_base/shared → shared}/ui/src/base/basic_data_table.tsx +0 -0
  225. /package/templates/{_base/shared → shared}/ui/src/base/button.tsx +0 -0
  226. /package/templates/{_base/shared → shared}/ui/src/base/button_group.tsx +0 -0
  227. /package/templates/{_base/shared → shared}/ui/src/base/card.tsx +0 -0
  228. /package/templates/{_base/shared → shared}/ui/src/base/checkbox.tsx +0 -0
  229. /package/templates/{_base/shared → shared}/ui/src/base/command.tsx +0 -0
  230. /package/templates/{_base/shared → shared}/ui/src/base/dialog.tsx +0 -0
  231. /package/templates/{_base/shared → shared}/ui/src/base/dropdown_menu.tsx +0 -0
  232. /package/templates/{_base/shared → shared}/ui/src/base/form.tsx +0 -0
  233. /package/templates/{_base/shared → shared}/ui/src/base/input.tsx +0 -0
  234. /package/templates/{_base/shared → shared}/ui/src/base/label.tsx +0 -0
  235. /package/templates/{_base/shared → shared}/ui/src/base/popover.tsx +0 -0
  236. /package/templates/{_base/shared → shared}/ui/src/base/radio_group.tsx +0 -0
  237. /package/templates/{_base/shared → shared}/ui/src/base/resizable.tsx +0 -0
  238. /package/templates/{_base/shared → shared}/ui/src/base/scroll_area.tsx +0 -0
  239. /package/templates/{_base/shared → shared}/ui/src/base/select.tsx +0 -0
  240. /package/templates/{_base/shared → shared}/ui/src/base/separator.tsx +0 -0
  241. /package/templates/{_base/shared → shared}/ui/src/base/sheet.tsx +0 -0
  242. /package/templates/{_base/shared → shared}/ui/src/base/side_bar.tsx +0 -0
  243. /package/templates/{_base/shared → shared}/ui/src/base/skeleton.tsx +0 -0
  244. /package/templates/{_base/shared → shared}/ui/src/base/spinner.tsx +0 -0
  245. /package/templates/{_base/shared → shared}/ui/src/base/switch.tsx +0 -0
  246. /package/templates/{_base/shared → shared}/ui/src/base/table.tsx +0 -0
  247. /package/templates/{_base/shared → shared}/ui/src/base/text_area.tsx +0 -0
  248. /package/templates/{_base/shared → shared}/ui/src/base/tooltip.tsx +0 -0
  249. /package/templates/{_base/shared → shared}/ui/src/base/utils.ts +0 -0
  250. /package/templates/{_base/shared → shared}/ui/src/hooks/use_keyboard_press.tsx +0 -0
  251. /package/templates/{_base/shared → shared}/ui/src/hooks/use_keyboard_release.tsx +0 -0
  252. /package/templates/{_base/shared → shared}/ui/src/hooks/use_mobile.tsx +0 -0
  253. /package/templates/{_base/shared → shared}/ui/src/hooks/use_mouse_click.tsx +0 -0
  254. /package/templates/{_base/shared → shared}/ui/src/hooks/use_mouse_location.tsx +0 -0
  255. /package/templates/{_base/shared → shared}/ui/src/hooks/use_outside_click.tsx +0 -0
  256. /package/templates/{_base/shared → shared}/ui/src/hooks/use_query_params.tsx +0 -0
  257. /package/templates/{_base/shared → shared}/ui/tsconfig.json +0 -0
  258. /package/templates/{_base/shared → shared}/utils/src/convex.ts +0 -0
  259. /package/templates/{_base/shared → shared}/utils/src/time.ts +0 -0
  260. /package/templates/{_base/shared → shared}/utils/tsconfig.json +0 -0
  261. /package/templates/{_base/skills-lock.json → skills-lock.json} +0 -0
@@ -0,0 +1,99 @@
1
+ /*
2
+ * Copyright (c) Aron Weston 2026.
3
+ */
4
+
5
+ "use client";
6
+
7
+ import { PlusIcon } from "lucide-react";
8
+ import { useFormContext } from "react-hook-form";
9
+
10
+ import { Button } from "@/ui/base/button";
11
+ import { DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/ui/base/dialog";
12
+ import { FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/ui/base/form";
13
+ import { Input } from "@/ui/base/input";
14
+ import { Sheet, SheetContent, SheetTrigger } from "@/ui/base/sheet";
15
+ import { TextArea } from "@/ui/base/text_area";
16
+ import type { NewTodoSchema } from "@/web/surfaces/todos/all_todos/main/new_todo_sheet/schema";
17
+
18
+ type NewTodoSheetProps = {
19
+ isPending: boolean;
20
+ onSubmit: () => void;
21
+ open: boolean;
22
+ onOpenChange: (open: boolean) => void;
23
+ };
24
+
25
+ export const NewTodoSheet = ({
26
+ isPending,
27
+ onSubmit,
28
+ open,
29
+ onOpenChange,
30
+ }: NewTodoSheetProps) => {
31
+ const form = useFormContext<NewTodoSchema>();
32
+
33
+ return (
34
+ <Sheet open={open} onOpenChange={onOpenChange}>
35
+ <SheetTrigger asChild>
36
+ <Button type="button">
37
+ <PlusIcon className="mr-2 size-4" />
38
+ New Todo
39
+ </Button>
40
+ </SheetTrigger>
41
+ <SheetContent className="sm:max-w-[440px]">
42
+ <DialogHeader>
43
+ <DialogTitle>Create Todo</DialogTitle>
44
+ <DialogDescription>Add a new item to your todo list.</DialogDescription>
45
+ </DialogHeader>
46
+ <form
47
+ onSubmit={(e) => {
48
+ e.preventDefault();
49
+ onSubmit();
50
+ }}
51
+ className="flex flex-col gap-4 pt-4"
52
+ onKeyDown={(e) => {
53
+ if (e.key === "Enter") {
54
+ e.preventDefault();
55
+ onSubmit();
56
+ }
57
+ }}
58
+ >
59
+ <FormField
60
+ control={form.control}
61
+ name="title"
62
+ render={({ field }) => (
63
+ <FormItem>
64
+ <FormLabel>Title</FormLabel>
65
+ <FormControl>
66
+ <Input placeholder="Buy groceries..." {...field} />
67
+ </FormControl>
68
+ <FormMessage />
69
+ </FormItem>
70
+ )}
71
+ />
72
+ <FormField
73
+ control={form.control}
74
+ name="description"
75
+ render={({ field }) => (
76
+ <FormItem>
77
+ <FormLabel>Description</FormLabel>
78
+ <FormControl>
79
+ <TextArea
80
+ placeholder="Optional details..."
81
+ className="resize-none"
82
+ rows={3}
83
+ {...field}
84
+ />
85
+ </FormControl>
86
+ <FormMessage />
87
+ </FormItem>
88
+ )}
89
+ />
90
+ <DialogFooter>
91
+ <Button type="submit" disabled={isPending}>
92
+ {isPending ? "Creating..." : "Create Todo"}
93
+ </Button>
94
+ </DialogFooter>
95
+ </form>
96
+ </SheetContent>
97
+ </Sheet>
98
+ );
99
+ };
@@ -0,0 +1,11 @@
1
+ /*
2
+ * Copyright (c) Aron Weston 2026.
3
+ */
4
+
5
+ import { z } from "zod";
6
+
7
+ export type NewTodoSchema = z.infer<typeof newTodoSchema>;
8
+ export const newTodoSchema = z.object({
9
+ title: z.string().min(1, "Title is required"),
10
+ description: z.string().optional(),
11
+ });
@@ -0,0 +1,32 @@
1
+ /*
2
+ * Copyright (c) Aron Weston 2026.
3
+ */
4
+
5
+ import { fetchQuery } from "convex/nextjs";
6
+ import { redirect } from "next/navigation";
7
+
8
+ import { api } from "@/api/_generated/api";
9
+ import type { Todo, TodoId } from "@/api/todos/types";
10
+ import { getAuthToken } from "@/web/utils/auth";
11
+
12
+ export type SingleTodoBootstrapArgs = {
13
+ todoId: TodoId;
14
+ };
15
+
16
+ export type SingleTodoBootstrap = {
17
+ todoId: TodoId;
18
+ todo: Todo;
19
+ };
20
+
21
+ export const bootstrapSingleTodo = async ({
22
+ todoId,
23
+ }: SingleTodoBootstrapArgs): Promise<SingleTodoBootstrap> => {
24
+ try {
25
+ const token = await getAuthToken();
26
+ const todo = await fetchQuery(api.todos.crud.getTodo, { todoId }, { token });
27
+ return { todoId, todo };
28
+ } catch {
29
+ redirect("/todos");
30
+ throw new Error("Unreachable");
31
+ }
32
+ };
@@ -0,0 +1,26 @@
1
+ /*
2
+ * Copyright (c) Aron Weston 2026.
3
+ */
4
+
5
+ "use client";
6
+
7
+ import { observer } from "mobx-react-lite";
8
+ import type { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
9
+
10
+ import { Header } from "@/web/surfaces/todos/single_todo/header/header";
11
+
12
+ export type CreateHeaderOpts = {
13
+ router: AppRouterInstance;
14
+ };
15
+
16
+ export const createHeader = ({ router }: CreateHeaderOpts) => {
17
+ return observer(() => {
18
+ return (
19
+ <Header
20
+ onBack={() => {
21
+ router.push("/todos");
22
+ }}
23
+ />
24
+ );
25
+ });
26
+ };
@@ -0,0 +1,22 @@
1
+ /*
2
+ * Copyright (c) Aron Weston 2026.
3
+ */
4
+
5
+ "use client";
6
+
7
+ import { ArrowLeft } from "lucide-react";
8
+
9
+ import { Button } from "@/ui/base/button";
10
+
11
+ type HeaderProps = {
12
+ onBack: () => void;
13
+ };
14
+
15
+ export const Header = ({ onBack }: HeaderProps) => {
16
+ return (
17
+ <Button variant="ghost" className="-ml-2 w-fit text-muted-foreground" type="button" onClick={onBack}>
18
+ <ArrowLeft className="mr-2 size-4" />
19
+ Back
20
+ </Button>
21
+ );
22
+ };
@@ -0,0 +1,27 @@
1
+ /*
2
+ * Copyright (c) Aron Weston 2026.
3
+ */
4
+
5
+ import type { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
6
+
7
+ import type { SingleTodoBootstrap } from "@/web/surfaces/todos/single_todo/bootstrap";
8
+ import type { SingleTodoLayoutController } from "@/web/surfaces/todos/single_todo/layout";
9
+ import { SingleTodoController } from "@/web/surfaces/todos/single_todo/single_todo_controller";
10
+
11
+ export type InstallSingleTodoOpts = {
12
+ layout: SingleTodoLayoutController;
13
+ bootstrap: SingleTodoBootstrap;
14
+ router: AppRouterInstance;
15
+ };
16
+
17
+ export const installSingleTodo = ({ layout, bootstrap, router }: InstallSingleTodoOpts) => {
18
+ const controller = new SingleTodoController();
19
+
20
+ import("@/web/surfaces/todos/single_todo/header/create").then(({ createHeader }) => {
21
+ layout.setHeader(createHeader({ router }));
22
+ });
23
+
24
+ import("@/web/surfaces/todos/single_todo/main/create").then(({ createMain }) => {
25
+ layout.setMain(createMain({ controller, bootstrap }));
26
+ });
27
+ };
@@ -0,0 +1,55 @@
1
+ /*
2
+ * Copyright (c) Aron Weston 2026.
3
+ */
4
+
5
+ "use client";
6
+
7
+ import { makeObservable, observable, action, runInAction } from "mobx";
8
+ import { observer } from "mobx-react-lite";
9
+ import type { ComponentType } from "react";
10
+
11
+ import { Skeleton } from "@/ui/base/skeleton";
12
+
13
+ export class SingleTodoLayoutController {
14
+ Header: ComponentType | undefined = undefined;
15
+ Main: ComponentType | undefined = undefined;
16
+
17
+ constructor() {
18
+ makeObservable(this, {
19
+ Header: observable.ref,
20
+ Main: observable.ref,
21
+ setHeader: action,
22
+ setMain: action,
23
+ });
24
+ }
25
+
26
+ setHeader(Header: ComponentType) {
27
+ runInAction(() => {
28
+ this.Header = Header;
29
+ });
30
+ }
31
+
32
+ setMain(Main: ComponentType) {
33
+ runInAction(() => {
34
+ this.Main = Main;
35
+ });
36
+ }
37
+ }
38
+
39
+ export const createLayout = () => {
40
+ const layout = new SingleTodoLayoutController();
41
+ return {
42
+ layout,
43
+ Layout: observer(() => {
44
+ const Header = layout.Header;
45
+ const Main = layout.Main;
46
+
47
+ return (
48
+ <div className="flex w-full flex-1 flex-col gap-4">
49
+ {Header ? <Header /> : <Skeleton className="h-10 w-48 rounded-md" />}
50
+ {Main ? <Main /> : <Skeleton className="h-64 w-full max-w-2xl rounded-md" />}
51
+ </div>
52
+ );
53
+ }),
54
+ };
55
+ };
@@ -0,0 +1,38 @@
1
+ /*
2
+ * Copyright (c) Aron Weston 2026.
3
+ */
4
+
5
+ "use client";
6
+
7
+ import { convexQuery } from "@convex-dev/react-query";
8
+ import { useQuery } from "@tanstack/react-query";
9
+ import { observer } from "mobx-react-lite";
10
+
11
+ import { api } from "@/api/_generated/api";
12
+
13
+ import type { SingleTodoBootstrap } from "@/web/surfaces/todos/single_todo/bootstrap";
14
+ import type { SingleTodoController } from "@/web/surfaces/todos/single_todo/single_todo_controller";
15
+ import { Main } from "@/web/surfaces/todos/single_todo/main/main";
16
+
17
+ export type CreateMainOpts = {
18
+ controller: SingleTodoController;
19
+ bootstrap: SingleTodoBootstrap;
20
+ };
21
+
22
+ export const createMain = ({ controller, bootstrap }: CreateMainOpts) => {
23
+ return observer(() => {
24
+ const { data: todo } = useQuery({
25
+ ...convexQuery(api.todos.crud.getTodo, { todoId: bootstrap.todoId }),
26
+ initialData: bootstrap.todo as never,
27
+ });
28
+
29
+ return (
30
+ <Main
31
+ todo={todo}
32
+ onToggle={(todoId, isCompleted) => {
33
+ void controller.updateTodo({ todoId, isCompleted });
34
+ }}
35
+ />
36
+ );
37
+ });
38
+ };
@@ -0,0 +1,49 @@
1
+ /*
2
+ * Copyright (c) Aron Weston 2026.
3
+ */
4
+
5
+ "use client";
6
+
7
+ import type { Todo, TodoId } from "@/api/todos/types";
8
+ import { Badge } from "@/ui/base/badge";
9
+ import { Checkbox } from "@/ui/base/checkbox";
10
+
11
+ type MainProps = {
12
+ todo: Todo | undefined;
13
+ onToggle: (todoId: TodoId, isCompleted: boolean) => void;
14
+ };
15
+
16
+ export const Main = ({ todo, onToggle }: MainProps) => {
17
+ if (!todo) {
18
+ return null;
19
+ }
20
+
21
+ return (
22
+ <main className="flex max-w-2xl flex-1 flex-col gap-6 overflow-auto p-6">
23
+ <div className="flex items-start gap-3">
24
+ <Checkbox
25
+ className="mt-1"
26
+ checked={todo.isCompleted}
27
+ onCheckedChange={(checked) =>
28
+ onToggle(todo._id, !!checked)
29
+ }
30
+ />
31
+ <div className="flex flex-col gap-2">
32
+ <h1
33
+ className="text-2xl font-semibold"
34
+ style={{
35
+ textDecoration: todo.isCompleted ? "line-through" : undefined,
36
+ }}
37
+ >
38
+ {todo.title}
39
+ </h1>
40
+ <Badge variant={todo.isCompleted ? "secondary" : "default"}>
41
+ {todo.isCompleted ? "Completed" : "In progress"}
42
+ </Badge>
43
+ </div>
44
+ </div>
45
+
46
+ {todo.description ? <p className="text-muted-foreground">{todo.description}</p> : null}
47
+ </main>
48
+ );
49
+ };
@@ -0,0 +1,29 @@
1
+ /*
2
+ * Copyright (c) Aron Weston 2026.
3
+ */
4
+
5
+ "use client";
6
+
7
+ import { useRouter } from "next/navigation";
8
+ import { useMemo, useRef } from "react";
9
+
10
+ import type { SingleTodoBootstrap } from "@/web/surfaces/todos/single_todo/bootstrap";
11
+ import { installSingleTodo } from "@/web/surfaces/todos/single_todo/install";
12
+ import { createLayout } from "@/web/surfaces/todos/single_todo/layout";
13
+
14
+ export type SingleTodoProps = {
15
+ bootstrap: SingleTodoBootstrap;
16
+ };
17
+
18
+ export const SingleTodo = ({ bootstrap }: SingleTodoProps) => {
19
+ const router = useRouter();
20
+ const { layout, Layout } = useMemo(() => createLayout(), []);
21
+ const installed = useRef(false);
22
+
23
+ if (!installed.current) {
24
+ installed.current = true;
25
+ installSingleTodo({ layout, bootstrap, router });
26
+ }
27
+
28
+ return <Layout />;
29
+ };
@@ -0,0 +1,13 @@
1
+ /*
2
+ * Copyright (c) Aron Weston 2026.
3
+ */
4
+
5
+ import { api } from "@/api/_generated/api";
6
+ import type { TodoId } from "@/api/todos/types";
7
+ import { convex } from "@/web/utils/convex";
8
+
9
+ export class SingleTodoController {
10
+ async updateTodo(args: { todoId: TodoId; isCompleted: boolean }) {
11
+ await convex.mutation(api.todos.crud.updateTodo, args);
12
+ }
13
+ }
@@ -0,0 +1,18 @@
1
+ /*
2
+ * Copyright (c) Aron Weston 2026.
3
+ */
4
+
5
+ // "use server";
6
+
7
+ import { auth } from "@clerk/nextjs/server";
8
+ import { redirect } from "next/navigation";
9
+
10
+ export const getAuthToken = async () => {
11
+ const token = await (await auth()).getToken({ template: "convex" });
12
+
13
+ if (!token) {
14
+ return redirect("/sign-in");
15
+ }
16
+
17
+ return token;
18
+ };
@@ -0,0 +1,10 @@
1
+ # Backend
2
+ CONVEX_DEPLOYMENT=
3
+ CLERK_SECRET_KEY=
4
+ CONVEX_SITE_URL= # HTTPS URL
5
+ CLERK_JWT_ISSUER_DOMAIN=
6
+ RESEND_API_KEY=
7
+
8
+ # Frontend
9
+ VITE_CONVEX_URL=
10
+ VITE_CLERK_PUBLISHABLE_KEY=
@@ -0,0 +1,9 @@
1
+ // Generated by React Router
2
+
3
+ import "react-router";
4
+
5
+ declare module "react-router" {
6
+ interface Future {
7
+ v8_middleware: true
8
+ }
9
+ }
@@ -0,0 +1,71 @@
1
+ // Generated by React Router
2
+
3
+ import "react-router"
4
+
5
+ declare module "react-router" {
6
+ interface Register {
7
+ pages: Pages
8
+ routeFiles: RouteFiles
9
+ routeModules: RouteModules
10
+ }
11
+ }
12
+
13
+ type Pages = {
14
+ "/": {
15
+ params: {};
16
+ };
17
+ "/sign-in/*": {
18
+ params: {
19
+ "*": string;
20
+ };
21
+ };
22
+ "/todos": {
23
+ params: {};
24
+ };
25
+ "/todos/:id": {
26
+ params: {
27
+ "id": string;
28
+ };
29
+ };
30
+ };
31
+
32
+ type RouteFiles = {
33
+ "root.tsx": {
34
+ id: "root";
35
+ page: "/" | "/sign-in/*" | "/todos" | "/todos/:id";
36
+ };
37
+ "./routes/(auth)/layout.tsx": {
38
+ id: "routes/(auth)/layout";
39
+ page: "/sign-in/*";
40
+ };
41
+ "./routes/(auth)/sign-in/index.tsx": {
42
+ id: "routes/(auth)/sign-in/index";
43
+ page: "/sign-in/*";
44
+ };
45
+ "./routes/(dashboard)/layout.tsx": {
46
+ id: "routes/(dashboard)/layout";
47
+ page: "/" | "/todos" | "/todos/:id";
48
+ };
49
+ "./routes/(dashboard)/index.tsx": {
50
+ id: "routes/(dashboard)/index";
51
+ page: "/";
52
+ };
53
+ "./routes/(dashboard)/todos/index.tsx": {
54
+ id: "routes/(dashboard)/todos/index";
55
+ page: "/todos";
56
+ };
57
+ "./routes/(dashboard)/todos/[id].tsx": {
58
+ id: "routes/(dashboard)/todos/[id]";
59
+ page: "/todos/:id";
60
+ };
61
+ };
62
+
63
+ type RouteModules = {
64
+ "root": typeof import("./src/root.tsx");
65
+ "routes/(auth)/layout": typeof import("./src/./routes/(auth)/layout.tsx");
66
+ "routes/(auth)/sign-in/index": typeof import("./src/./routes/(auth)/sign-in/index.tsx");
67
+ "routes/(dashboard)/layout": typeof import("./src/./routes/(dashboard)/layout.tsx");
68
+ "routes/(dashboard)/index": typeof import("./src/./routes/(dashboard)/index.tsx");
69
+ "routes/(dashboard)/todos/index": typeof import("./src/./routes/(dashboard)/todos/index.tsx");
70
+ "routes/(dashboard)/todos/[id]": typeof import("./src/./routes/(dashboard)/todos/[id].tsx");
71
+ };
@@ -0,0 +1,18 @@
1
+ // Generated by React Router
2
+
3
+ declare module "virtual:react-router/server-build" {
4
+ import { ServerBuild } from "react-router";
5
+ export const assets: ServerBuild["assets"];
6
+ export const assetsBuildDirectory: ServerBuild["assetsBuildDirectory"];
7
+ export const basename: ServerBuild["basename"];
8
+ export const entry: ServerBuild["entry"];
9
+ export const future: ServerBuild["future"];
10
+ export const isSpaMode: ServerBuild["isSpaMode"];
11
+ export const prerender: ServerBuild["prerender"];
12
+ export const publicPath: ServerBuild["publicPath"];
13
+ export const routeDiscovery: ServerBuild["routeDiscovery"];
14
+ export const routes: ServerBuild["routes"];
15
+ export const ssr: ServerBuild["ssr"];
16
+ export const allowedActionOrigins: ServerBuild["allowedActionOrigins"];
17
+ export const unstable_getCriticalCss: ServerBuild["unstable_getCriticalCss"];
18
+ }
@@ -0,0 +1,59 @@
1
+ // Generated by React Router
2
+
3
+ import type { GetInfo, GetAnnotations } from "react-router/internal";
4
+
5
+ type Module = typeof import("../root.js")
6
+
7
+ type Info = GetInfo<{
8
+ file: "root.tsx",
9
+ module: Module
10
+ }>
11
+
12
+ type Matches = [{
13
+ id: "root";
14
+ module: typeof import("../root.js");
15
+ }];
16
+
17
+ type Annotations = GetAnnotations<Info & { module: Module, matches: Matches }, false>;
18
+
19
+ export namespace Route {
20
+ // links
21
+ export type LinkDescriptors = Annotations["LinkDescriptors"];
22
+ export type LinksFunction = Annotations["LinksFunction"];
23
+
24
+ // meta
25
+ export type MetaArgs = Annotations["MetaArgs"];
26
+ export type MetaDescriptors = Annotations["MetaDescriptors"];
27
+ export type MetaFunction = Annotations["MetaFunction"];
28
+
29
+ // headers
30
+ export type HeadersArgs = Annotations["HeadersArgs"];
31
+ export type HeadersFunction = Annotations["HeadersFunction"];
32
+
33
+ // middleware
34
+ export type MiddlewareFunction = Annotations["MiddlewareFunction"];
35
+
36
+ // clientMiddleware
37
+ export type ClientMiddlewareFunction = Annotations["ClientMiddlewareFunction"];
38
+
39
+ // loader
40
+ export type LoaderArgs = Annotations["LoaderArgs"];
41
+
42
+ // clientLoader
43
+ export type ClientLoaderArgs = Annotations["ClientLoaderArgs"];
44
+
45
+ // action
46
+ export type ActionArgs = Annotations["ActionArgs"];
47
+
48
+ // clientAction
49
+ export type ClientActionArgs = Annotations["ClientActionArgs"];
50
+
51
+ // HydrateFallback
52
+ export type HydrateFallbackProps = Annotations["HydrateFallbackProps"];
53
+
54
+ // Component
55
+ export type ComponentProps = Annotations["ComponentProps"];
56
+
57
+ // ErrorBoundary
58
+ export type ErrorBoundaryProps = Annotations["ErrorBoundaryProps"];
59
+ }
@@ -0,0 +1,62 @@
1
+ // Generated by React Router
2
+
3
+ import type { GetInfo, GetAnnotations } from "react-router/internal";
4
+
5
+ type Module = typeof import("../layout.js")
6
+
7
+ type Info = GetInfo<{
8
+ file: "./routes/(auth)/layout.tsx",
9
+ module: Module
10
+ }>
11
+
12
+ type Matches = [{
13
+ id: "root";
14
+ module: typeof import("../../../root.js");
15
+ }, {
16
+ id: "routes/(auth)/layout";
17
+ module: typeof import("../layout.js");
18
+ }];
19
+
20
+ type Annotations = GetAnnotations<Info & { module: Module, matches: Matches }, false>;
21
+
22
+ export namespace Route {
23
+ // links
24
+ export type LinkDescriptors = Annotations["LinkDescriptors"];
25
+ export type LinksFunction = Annotations["LinksFunction"];
26
+
27
+ // meta
28
+ export type MetaArgs = Annotations["MetaArgs"];
29
+ export type MetaDescriptors = Annotations["MetaDescriptors"];
30
+ export type MetaFunction = Annotations["MetaFunction"];
31
+
32
+ // headers
33
+ export type HeadersArgs = Annotations["HeadersArgs"];
34
+ export type HeadersFunction = Annotations["HeadersFunction"];
35
+
36
+ // middleware
37
+ export type MiddlewareFunction = Annotations["MiddlewareFunction"];
38
+
39
+ // clientMiddleware
40
+ export type ClientMiddlewareFunction = Annotations["ClientMiddlewareFunction"];
41
+
42
+ // loader
43
+ export type LoaderArgs = Annotations["LoaderArgs"];
44
+
45
+ // clientLoader
46
+ export type ClientLoaderArgs = Annotations["ClientLoaderArgs"];
47
+
48
+ // action
49
+ export type ActionArgs = Annotations["ActionArgs"];
50
+
51
+ // clientAction
52
+ export type ClientActionArgs = Annotations["ClientActionArgs"];
53
+
54
+ // HydrateFallback
55
+ export type HydrateFallbackProps = Annotations["HydrateFallbackProps"];
56
+
57
+ // Component
58
+ export type ComponentProps = Annotations["ComponentProps"];
59
+
60
+ // ErrorBoundary
61
+ export type ErrorBoundaryProps = Annotations["ErrorBoundaryProps"];
62
+ }