@helloleo/plugins 0.2.20 → 0.2.22

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 (340) hide show
  1. package/dist/index.js +61 -36
  2. package/package.json +3 -4
  3. package/dist/templates/tanstack-router-2026-06-15/components.json +0 -22
  4. package/dist/templates/tanstack-router-2026-06-15/index.html +0 -20
  5. package/dist/templates/tanstack-router-2026-06-15/package.json +0 -90
  6. package/dist/templates/tanstack-router-2026-06-15/src/components/error-component.tsx +0 -50
  7. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/accordion.tsx +0 -51
  8. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/alert-dialog.tsx +0 -115
  9. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/alert.tsx +0 -49
  10. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/aspect-ratio.tsx +0 -5
  11. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/avatar.tsx +0 -47
  12. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/badge.tsx +0 -32
  13. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/breadcrumb.tsx +0 -101
  14. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/button.tsx +0 -49
  15. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/calendar.tsx +0 -177
  16. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/card.tsx +0 -55
  17. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/carousel.tsx +0 -240
  18. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/chart.tsx +0 -331
  19. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/checkbox.tsx +0 -26
  20. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/collapsible.tsx +0 -11
  21. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/command.tsx +0 -143
  22. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/context-menu.tsx +0 -187
  23. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/dialog.tsx +0 -104
  24. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/drawer.tsx +0 -98
  25. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/dropdown-menu.tsx +0 -188
  26. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/form.tsx +0 -171
  27. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/hover-card.tsx +0 -27
  28. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/input-otp.tsx +0 -69
  29. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/input.tsx +0 -22
  30. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/label.tsx +0 -21
  31. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/menubar.tsx +0 -229
  32. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/navigation-menu.tsx +0 -120
  33. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/pagination.tsx +0 -98
  34. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/popover.tsx +0 -31
  35. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/progress.tsx +0 -25
  36. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/radio-group.tsx +0 -36
  37. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/resizable.tsx +0 -37
  38. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/scroll-area.tsx +0 -44
  39. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/select.tsx +0 -152
  40. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/separator.tsx +0 -24
  41. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/sheet.tsx +0 -122
  42. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/sidebar.tsx +0 -744
  43. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/skeleton.tsx +0 -7
  44. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/slider.tsx +0 -23
  45. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/sonner.tsx +0 -23
  46. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/switch.tsx +0 -27
  47. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/table.tsx +0 -94
  48. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/tabs.tsx +0 -53
  49. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/textarea.tsx +0 -21
  50. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/toggle-group.tsx +0 -57
  51. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/toggle.tsx +0 -42
  52. package/dist/templates/tanstack-router-2026-06-15/src/components/ui/tooltip.tsx +0 -32
  53. package/dist/templates/tanstack-router-2026-06-15/src/hooks/use-mobile.tsx +0 -19
  54. package/dist/templates/tanstack-router-2026-06-15/src/lib/proxy.ts +0 -123
  55. package/dist/templates/tanstack-router-2026-06-15/src/lib/utils.ts +0 -6
  56. package/dist/templates/tanstack-router-2026-06-15/src/main.tsx +0 -37
  57. package/dist/templates/tanstack-router-2026-06-15/src/routeTree.gen.ts +0 -59
  58. package/dist/templates/tanstack-router-2026-06-15/src/routes/README.md +0 -85
  59. package/dist/templates/tanstack-router-2026-06-15/src/routes/__root.tsx +0 -18
  60. package/dist/templates/tanstack-router-2026-06-15/src/routes/index.tsx +0 -18
  61. package/dist/templates/tanstack-router-2026-06-15/src/styles.css +0 -214
  62. package/dist/templates/tanstack-router-2026-06-15/tsconfig.json +0 -27
  63. package/dist/templates/tanstack-router-2026-06-15/vite.config.ts +0 -23
  64. package/dist/templates/tanstack-start-2026-06-18/components.json +0 -22
  65. package/dist/templates/tanstack-start-2026-06-18/drizzle.config.ts +0 -15
  66. package/dist/templates/tanstack-start-2026-06-18/package.json +0 -104
  67. package/dist/templates/tanstack-start-2026-06-18/src/components/error-component.tsx +0 -50
  68. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/accordion.tsx +0 -51
  69. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/alert-dialog.tsx +0 -115
  70. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/alert.tsx +0 -49
  71. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/aspect-ratio.tsx +0 -5
  72. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/avatar.tsx +0 -47
  73. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/badge.tsx +0 -32
  74. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/breadcrumb.tsx +0 -101
  75. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/button.tsx +0 -49
  76. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/calendar.tsx +0 -177
  77. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/card.tsx +0 -55
  78. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/carousel.tsx +0 -240
  79. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/chart.tsx +0 -371
  80. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/checkbox.tsx +0 -26
  81. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/collapsible.tsx +0 -11
  82. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/command.tsx +0 -143
  83. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/context-menu.tsx +0 -187
  84. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/dialog.tsx +0 -104
  85. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/drawer.tsx +0 -98
  86. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/dropdown-menu.tsx +0 -188
  87. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/form.tsx +0 -171
  88. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/hover-card.tsx +0 -27
  89. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/input-otp.tsx +0 -69
  90. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/input.tsx +0 -22
  91. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/label.tsx +0 -21
  92. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/menubar.tsx +0 -229
  93. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/navigation-menu.tsx +0 -120
  94. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/pagination.tsx +0 -98
  95. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/popover.tsx +0 -31
  96. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/progress.tsx +0 -25
  97. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/radio-group.tsx +0 -36
  98. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/resizable.tsx +0 -37
  99. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/scroll-area.tsx +0 -44
  100. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/select.tsx +0 -152
  101. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/separator.tsx +0 -24
  102. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/sheet.tsx +0 -122
  103. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/sidebar.tsx +0 -744
  104. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/skeleton.tsx +0 -7
  105. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/slider.tsx +0 -23
  106. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/sonner.tsx +0 -23
  107. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/switch.tsx +0 -27
  108. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/table.tsx +0 -94
  109. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/tabs.tsx +0 -53
  110. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/textarea.tsx +0 -21
  111. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/toggle-group.tsx +0 -57
  112. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/toggle.tsx +0 -42
  113. package/dist/templates/tanstack-start-2026-06-18/src/components/ui/tooltip.tsx +0 -32
  114. package/dist/templates/tanstack-start-2026-06-18/src/db/index.ts +0 -9
  115. package/dist/templates/tanstack-start-2026-06-18/src/db/schema.ts +0 -18
  116. package/dist/templates/tanstack-start-2026-06-18/src/global.d.ts +0 -3
  117. package/dist/templates/tanstack-start-2026-06-18/src/hooks/use-mobile.tsx +0 -19
  118. package/dist/templates/tanstack-start-2026-06-18/src/lib/proxy.ts +0 -119
  119. package/dist/templates/tanstack-start-2026-06-18/src/lib/utils.ts +0 -6
  120. package/dist/templates/tanstack-start-2026-06-18/src/routeTree.gen.ts +0 -86
  121. package/dist/templates/tanstack-start-2026-06-18/src/router.tsx +0 -37
  122. package/dist/templates/tanstack-start-2026-06-18/src/routes/README.md +0 -94
  123. package/dist/templates/tanstack-start-2026-06-18/src/routes/__root.tsx +0 -65
  124. package/dist/templates/tanstack-start-2026-06-18/src/routes/api/health.ts +0 -81
  125. package/dist/templates/tanstack-start-2026-06-18/src/routes/index.tsx +0 -33
  126. package/dist/templates/tanstack-start-2026-06-18/src/server.ts +0 -32
  127. package/dist/templates/tanstack-start-2026-06-18/src/styles.css +0 -214
  128. package/dist/templates/tanstack-start-2026-06-18/tsconfig.json +0 -27
  129. package/dist/templates/tanstack-start-2026-06-18/vite.config.ts +0 -17
  130. package/src/index.ts +0 -8
  131. package/src/template-render.ts +0 -53
  132. package/src/templates/tanstack-router-2026-06-15/components.json +0 -22
  133. package/src/templates/tanstack-router-2026-06-15/index.html +0 -20
  134. package/src/templates/tanstack-router-2026-06-15/package.json +0 -90
  135. package/src/templates/tanstack-router-2026-06-15/src/components/error-component.tsx +0 -50
  136. package/src/templates/tanstack-router-2026-06-15/src/components/ui/accordion.tsx +0 -51
  137. package/src/templates/tanstack-router-2026-06-15/src/components/ui/alert-dialog.tsx +0 -115
  138. package/src/templates/tanstack-router-2026-06-15/src/components/ui/alert.tsx +0 -49
  139. package/src/templates/tanstack-router-2026-06-15/src/components/ui/aspect-ratio.tsx +0 -5
  140. package/src/templates/tanstack-router-2026-06-15/src/components/ui/avatar.tsx +0 -47
  141. package/src/templates/tanstack-router-2026-06-15/src/components/ui/badge.tsx +0 -32
  142. package/src/templates/tanstack-router-2026-06-15/src/components/ui/breadcrumb.tsx +0 -101
  143. package/src/templates/tanstack-router-2026-06-15/src/components/ui/button.tsx +0 -49
  144. package/src/templates/tanstack-router-2026-06-15/src/components/ui/calendar.tsx +0 -177
  145. package/src/templates/tanstack-router-2026-06-15/src/components/ui/card.tsx +0 -55
  146. package/src/templates/tanstack-router-2026-06-15/src/components/ui/carousel.tsx +0 -240
  147. package/src/templates/tanstack-router-2026-06-15/src/components/ui/chart.tsx +0 -331
  148. package/src/templates/tanstack-router-2026-06-15/src/components/ui/checkbox.tsx +0 -26
  149. package/src/templates/tanstack-router-2026-06-15/src/components/ui/collapsible.tsx +0 -11
  150. package/src/templates/tanstack-router-2026-06-15/src/components/ui/command.tsx +0 -143
  151. package/src/templates/tanstack-router-2026-06-15/src/components/ui/context-menu.tsx +0 -187
  152. package/src/templates/tanstack-router-2026-06-15/src/components/ui/dialog.tsx +0 -104
  153. package/src/templates/tanstack-router-2026-06-15/src/components/ui/drawer.tsx +0 -98
  154. package/src/templates/tanstack-router-2026-06-15/src/components/ui/dropdown-menu.tsx +0 -188
  155. package/src/templates/tanstack-router-2026-06-15/src/components/ui/form.tsx +0 -171
  156. package/src/templates/tanstack-router-2026-06-15/src/components/ui/hover-card.tsx +0 -27
  157. package/src/templates/tanstack-router-2026-06-15/src/components/ui/input-otp.tsx +0 -69
  158. package/src/templates/tanstack-router-2026-06-15/src/components/ui/input.tsx +0 -22
  159. package/src/templates/tanstack-router-2026-06-15/src/components/ui/label.tsx +0 -21
  160. package/src/templates/tanstack-router-2026-06-15/src/components/ui/menubar.tsx +0 -229
  161. package/src/templates/tanstack-router-2026-06-15/src/components/ui/navigation-menu.tsx +0 -120
  162. package/src/templates/tanstack-router-2026-06-15/src/components/ui/pagination.tsx +0 -98
  163. package/src/templates/tanstack-router-2026-06-15/src/components/ui/popover.tsx +0 -31
  164. package/src/templates/tanstack-router-2026-06-15/src/components/ui/progress.tsx +0 -25
  165. package/src/templates/tanstack-router-2026-06-15/src/components/ui/radio-group.tsx +0 -36
  166. package/src/templates/tanstack-router-2026-06-15/src/components/ui/resizable.tsx +0 -37
  167. package/src/templates/tanstack-router-2026-06-15/src/components/ui/scroll-area.tsx +0 -44
  168. package/src/templates/tanstack-router-2026-06-15/src/components/ui/select.tsx +0 -152
  169. package/src/templates/tanstack-router-2026-06-15/src/components/ui/separator.tsx +0 -24
  170. package/src/templates/tanstack-router-2026-06-15/src/components/ui/sheet.tsx +0 -122
  171. package/src/templates/tanstack-router-2026-06-15/src/components/ui/sidebar.tsx +0 -744
  172. package/src/templates/tanstack-router-2026-06-15/src/components/ui/skeleton.tsx +0 -7
  173. package/src/templates/tanstack-router-2026-06-15/src/components/ui/slider.tsx +0 -23
  174. package/src/templates/tanstack-router-2026-06-15/src/components/ui/sonner.tsx +0 -23
  175. package/src/templates/tanstack-router-2026-06-15/src/components/ui/switch.tsx +0 -27
  176. package/src/templates/tanstack-router-2026-06-15/src/components/ui/table.tsx +0 -94
  177. package/src/templates/tanstack-router-2026-06-15/src/components/ui/tabs.tsx +0 -53
  178. package/src/templates/tanstack-router-2026-06-15/src/components/ui/textarea.tsx +0 -21
  179. package/src/templates/tanstack-router-2026-06-15/src/components/ui/toggle-group.tsx +0 -57
  180. package/src/templates/tanstack-router-2026-06-15/src/components/ui/toggle.tsx +0 -42
  181. package/src/templates/tanstack-router-2026-06-15/src/components/ui/tooltip.tsx +0 -32
  182. package/src/templates/tanstack-router-2026-06-15/src/hooks/use-mobile.tsx +0 -19
  183. package/src/templates/tanstack-router-2026-06-15/src/lib/proxy.ts +0 -123
  184. package/src/templates/tanstack-router-2026-06-15/src/lib/utils.ts +0 -6
  185. package/src/templates/tanstack-router-2026-06-15/src/main.tsx +0 -37
  186. package/src/templates/tanstack-router-2026-06-15/src/routeTree.gen.ts +0 -59
  187. package/src/templates/tanstack-router-2026-06-15/src/routes/README.md +0 -85
  188. package/src/templates/tanstack-router-2026-06-15/src/routes/__root.tsx +0 -18
  189. package/src/templates/tanstack-router-2026-06-15/src/routes/index.tsx +0 -18
  190. package/src/templates/tanstack-router-2026-06-15/src/styles.css +0 -214
  191. package/src/templates/tanstack-router-2026-06-15/tsconfig.json +0 -27
  192. package/src/templates/tanstack-router-2026-06-15/vite.config.ts +0 -23
  193. package/src/templates/tanstack-start-2026-06-18/components.json +0 -22
  194. package/src/templates/tanstack-start-2026-06-18/drizzle.config.ts +0 -15
  195. package/src/templates/tanstack-start-2026-06-18/package.json +0 -104
  196. package/src/templates/tanstack-start-2026-06-18/src/components/error-component.tsx +0 -50
  197. package/src/templates/tanstack-start-2026-06-18/src/components/ui/accordion.tsx +0 -51
  198. package/src/templates/tanstack-start-2026-06-18/src/components/ui/alert-dialog.tsx +0 -115
  199. package/src/templates/tanstack-start-2026-06-18/src/components/ui/alert.tsx +0 -49
  200. package/src/templates/tanstack-start-2026-06-18/src/components/ui/aspect-ratio.tsx +0 -5
  201. package/src/templates/tanstack-start-2026-06-18/src/components/ui/avatar.tsx +0 -47
  202. package/src/templates/tanstack-start-2026-06-18/src/components/ui/badge.tsx +0 -32
  203. package/src/templates/tanstack-start-2026-06-18/src/components/ui/breadcrumb.tsx +0 -101
  204. package/src/templates/tanstack-start-2026-06-18/src/components/ui/button.tsx +0 -49
  205. package/src/templates/tanstack-start-2026-06-18/src/components/ui/calendar.tsx +0 -177
  206. package/src/templates/tanstack-start-2026-06-18/src/components/ui/card.tsx +0 -55
  207. package/src/templates/tanstack-start-2026-06-18/src/components/ui/carousel.tsx +0 -240
  208. package/src/templates/tanstack-start-2026-06-18/src/components/ui/chart.tsx +0 -371
  209. package/src/templates/tanstack-start-2026-06-18/src/components/ui/checkbox.tsx +0 -26
  210. package/src/templates/tanstack-start-2026-06-18/src/components/ui/collapsible.tsx +0 -11
  211. package/src/templates/tanstack-start-2026-06-18/src/components/ui/command.tsx +0 -143
  212. package/src/templates/tanstack-start-2026-06-18/src/components/ui/context-menu.tsx +0 -187
  213. package/src/templates/tanstack-start-2026-06-18/src/components/ui/dialog.tsx +0 -104
  214. package/src/templates/tanstack-start-2026-06-18/src/components/ui/drawer.tsx +0 -98
  215. package/src/templates/tanstack-start-2026-06-18/src/components/ui/dropdown-menu.tsx +0 -188
  216. package/src/templates/tanstack-start-2026-06-18/src/components/ui/form.tsx +0 -171
  217. package/src/templates/tanstack-start-2026-06-18/src/components/ui/hover-card.tsx +0 -27
  218. package/src/templates/tanstack-start-2026-06-18/src/components/ui/input-otp.tsx +0 -69
  219. package/src/templates/tanstack-start-2026-06-18/src/components/ui/input.tsx +0 -22
  220. package/src/templates/tanstack-start-2026-06-18/src/components/ui/label.tsx +0 -21
  221. package/src/templates/tanstack-start-2026-06-18/src/components/ui/menubar.tsx +0 -229
  222. package/src/templates/tanstack-start-2026-06-18/src/components/ui/navigation-menu.tsx +0 -120
  223. package/src/templates/tanstack-start-2026-06-18/src/components/ui/pagination.tsx +0 -98
  224. package/src/templates/tanstack-start-2026-06-18/src/components/ui/popover.tsx +0 -31
  225. package/src/templates/tanstack-start-2026-06-18/src/components/ui/progress.tsx +0 -25
  226. package/src/templates/tanstack-start-2026-06-18/src/components/ui/radio-group.tsx +0 -36
  227. package/src/templates/tanstack-start-2026-06-18/src/components/ui/resizable.tsx +0 -37
  228. package/src/templates/tanstack-start-2026-06-18/src/components/ui/scroll-area.tsx +0 -44
  229. package/src/templates/tanstack-start-2026-06-18/src/components/ui/select.tsx +0 -152
  230. package/src/templates/tanstack-start-2026-06-18/src/components/ui/separator.tsx +0 -24
  231. package/src/templates/tanstack-start-2026-06-18/src/components/ui/sheet.tsx +0 -122
  232. package/src/templates/tanstack-start-2026-06-18/src/components/ui/sidebar.tsx +0 -744
  233. package/src/templates/tanstack-start-2026-06-18/src/components/ui/skeleton.tsx +0 -7
  234. package/src/templates/tanstack-start-2026-06-18/src/components/ui/slider.tsx +0 -23
  235. package/src/templates/tanstack-start-2026-06-18/src/components/ui/sonner.tsx +0 -23
  236. package/src/templates/tanstack-start-2026-06-18/src/components/ui/switch.tsx +0 -27
  237. package/src/templates/tanstack-start-2026-06-18/src/components/ui/table.tsx +0 -94
  238. package/src/templates/tanstack-start-2026-06-18/src/components/ui/tabs.tsx +0 -53
  239. package/src/templates/tanstack-start-2026-06-18/src/components/ui/textarea.tsx +0 -21
  240. package/src/templates/tanstack-start-2026-06-18/src/components/ui/toggle-group.tsx +0 -57
  241. package/src/templates/tanstack-start-2026-06-18/src/components/ui/toggle.tsx +0 -42
  242. package/src/templates/tanstack-start-2026-06-18/src/components/ui/tooltip.tsx +0 -32
  243. package/src/templates/tanstack-start-2026-06-18/src/db/index.ts +0 -9
  244. package/src/templates/tanstack-start-2026-06-18/src/db/schema.ts +0 -18
  245. package/src/templates/tanstack-start-2026-06-18/src/global.d.ts +0 -3
  246. package/src/templates/tanstack-start-2026-06-18/src/hooks/use-mobile.tsx +0 -19
  247. package/src/templates/tanstack-start-2026-06-18/src/lib/proxy.ts +0 -119
  248. package/src/templates/tanstack-start-2026-06-18/src/lib/utils.ts +0 -6
  249. package/src/templates/tanstack-start-2026-06-18/src/routeTree.gen.ts +0 -86
  250. package/src/templates/tanstack-start-2026-06-18/src/router.tsx +0 -37
  251. package/src/templates/tanstack-start-2026-06-18/src/routes/README.md +0 -94
  252. package/src/templates/tanstack-start-2026-06-18/src/routes/__root.tsx +0 -65
  253. package/src/templates/tanstack-start-2026-06-18/src/routes/api/health.ts +0 -81
  254. package/src/templates/tanstack-start-2026-06-18/src/routes/index.tsx +0 -33
  255. package/src/templates/tanstack-start-2026-06-18/src/server.ts +0 -32
  256. package/src/templates/tanstack-start-2026-06-18/src/styles.css +0 -214
  257. package/src/templates/tanstack-start-2026-06-18/tsconfig.json +0 -27
  258. package/src/templates/tanstack-start-2026-06-18/vite.config.ts +0 -17
  259. package/src/templates/tanstack-start-2026-07-30/components.json +0 -22
  260. package/src/templates/tanstack-start-2026-07-30/drizzle/meta/_journal.json +0 -1
  261. package/src/templates/tanstack-start-2026-07-30/drizzle.config.ts +0 -18
  262. package/src/templates/tanstack-start-2026-07-30/package.json +0 -103
  263. package/src/templates/tanstack-start-2026-07-30/src/components/error-component.tsx +0 -50
  264. package/src/templates/tanstack-start-2026-07-30/src/components/ui/accordion.tsx +0 -51
  265. package/src/templates/tanstack-start-2026-07-30/src/components/ui/alert-dialog.tsx +0 -115
  266. package/src/templates/tanstack-start-2026-07-30/src/components/ui/alert.tsx +0 -49
  267. package/src/templates/tanstack-start-2026-07-30/src/components/ui/aspect-ratio.tsx +0 -5
  268. package/src/templates/tanstack-start-2026-07-30/src/components/ui/avatar.tsx +0 -47
  269. package/src/templates/tanstack-start-2026-07-30/src/components/ui/badge.tsx +0 -32
  270. package/src/templates/tanstack-start-2026-07-30/src/components/ui/breadcrumb.tsx +0 -101
  271. package/src/templates/tanstack-start-2026-07-30/src/components/ui/button.tsx +0 -49
  272. package/src/templates/tanstack-start-2026-07-30/src/components/ui/calendar.tsx +0 -177
  273. package/src/templates/tanstack-start-2026-07-30/src/components/ui/card.tsx +0 -55
  274. package/src/templates/tanstack-start-2026-07-30/src/components/ui/carousel.tsx +0 -240
  275. package/src/templates/tanstack-start-2026-07-30/src/components/ui/chart.tsx +0 -371
  276. package/src/templates/tanstack-start-2026-07-30/src/components/ui/checkbox.tsx +0 -26
  277. package/src/templates/tanstack-start-2026-07-30/src/components/ui/collapsible.tsx +0 -11
  278. package/src/templates/tanstack-start-2026-07-30/src/components/ui/command.tsx +0 -143
  279. package/src/templates/tanstack-start-2026-07-30/src/components/ui/context-menu.tsx +0 -187
  280. package/src/templates/tanstack-start-2026-07-30/src/components/ui/dialog.tsx +0 -104
  281. package/src/templates/tanstack-start-2026-07-30/src/components/ui/drawer.tsx +0 -98
  282. package/src/templates/tanstack-start-2026-07-30/src/components/ui/dropdown-menu.tsx +0 -188
  283. package/src/templates/tanstack-start-2026-07-30/src/components/ui/form.tsx +0 -171
  284. package/src/templates/tanstack-start-2026-07-30/src/components/ui/hover-card.tsx +0 -27
  285. package/src/templates/tanstack-start-2026-07-30/src/components/ui/input-otp.tsx +0 -69
  286. package/src/templates/tanstack-start-2026-07-30/src/components/ui/input.tsx +0 -22
  287. package/src/templates/tanstack-start-2026-07-30/src/components/ui/label.tsx +0 -21
  288. package/src/templates/tanstack-start-2026-07-30/src/components/ui/menubar.tsx +0 -229
  289. package/src/templates/tanstack-start-2026-07-30/src/components/ui/navigation-menu.tsx +0 -120
  290. package/src/templates/tanstack-start-2026-07-30/src/components/ui/pagination.tsx +0 -98
  291. package/src/templates/tanstack-start-2026-07-30/src/components/ui/popover.tsx +0 -31
  292. package/src/templates/tanstack-start-2026-07-30/src/components/ui/progress.tsx +0 -25
  293. package/src/templates/tanstack-start-2026-07-30/src/components/ui/radio-group.tsx +0 -36
  294. package/src/templates/tanstack-start-2026-07-30/src/components/ui/resizable.tsx +0 -37
  295. package/src/templates/tanstack-start-2026-07-30/src/components/ui/scroll-area.tsx +0 -44
  296. package/src/templates/tanstack-start-2026-07-30/src/components/ui/select.tsx +0 -152
  297. package/src/templates/tanstack-start-2026-07-30/src/components/ui/separator.tsx +0 -24
  298. package/src/templates/tanstack-start-2026-07-30/src/components/ui/sheet.tsx +0 -122
  299. package/src/templates/tanstack-start-2026-07-30/src/components/ui/sidebar.tsx +0 -744
  300. package/src/templates/tanstack-start-2026-07-30/src/components/ui/skeleton.tsx +0 -7
  301. package/src/templates/tanstack-start-2026-07-30/src/components/ui/slider.tsx +0 -23
  302. package/src/templates/tanstack-start-2026-07-30/src/components/ui/sonner.tsx +0 -23
  303. package/src/templates/tanstack-start-2026-07-30/src/components/ui/switch.tsx +0 -27
  304. package/src/templates/tanstack-start-2026-07-30/src/components/ui/table.tsx +0 -94
  305. package/src/templates/tanstack-start-2026-07-30/src/components/ui/tabs.tsx +0 -53
  306. package/src/templates/tanstack-start-2026-07-30/src/components/ui/textarea.tsx +0 -21
  307. package/src/templates/tanstack-start-2026-07-30/src/components/ui/toggle-group.tsx +0 -57
  308. package/src/templates/tanstack-start-2026-07-30/src/components/ui/toggle.tsx +0 -42
  309. package/src/templates/tanstack-start-2026-07-30/src/components/ui/tooltip.tsx +0 -32
  310. package/src/templates/tanstack-start-2026-07-30/src/db/index.ts +0 -9
  311. package/src/templates/tanstack-start-2026-07-30/src/db/schema.ts +0 -34
  312. package/src/templates/tanstack-start-2026-07-30/src/global.d.ts +0 -3
  313. package/src/templates/tanstack-start-2026-07-30/src/hooks/use-mobile.tsx +0 -19
  314. package/src/templates/tanstack-start-2026-07-30/src/lib/kv.ts +0 -37
  315. package/src/templates/tanstack-start-2026-07-30/src/lib/proxy.ts +0 -111
  316. package/src/templates/tanstack-start-2026-07-30/src/lib/storage.ts +0 -45
  317. package/src/templates/tanstack-start-2026-07-30/src/lib/utils.ts +0 -6
  318. package/src/templates/tanstack-start-2026-07-30/src/routeTree.gen.ts +0 -86
  319. package/src/templates/tanstack-start-2026-07-30/src/router.tsx +0 -37
  320. package/src/templates/tanstack-start-2026-07-30/src/routes/README.md +0 -94
  321. package/src/templates/tanstack-start-2026-07-30/src/routes/__root.tsx +0 -65
  322. package/src/templates/tanstack-start-2026-07-30/src/routes/api/health.ts +0 -83
  323. package/src/templates/tanstack-start-2026-07-30/src/routes/index.tsx +0 -33
  324. package/src/templates/tanstack-start-2026-07-30/src/server.ts +0 -32
  325. package/src/templates/tanstack-start-2026-07-30/src/styles.css +0 -214
  326. package/src/templates/tanstack-start-2026-07-30/tsconfig.json +0 -27
  327. package/src/templates/tanstack-start-2026-07-30/vite.config.ts +0 -17
  328. package/src/tools/create-plan.ts +0 -61
  329. package/src/tools/inspect-http.ts +0 -276
  330. package/src/tools/list-plans.ts +0 -85
  331. package/src/tools/modify-plan.ts +0 -79
  332. package/src/tools/remove.ts +0 -53
  333. package/src/tools/scaffold.ts +0 -213
  334. package/src/tools/setup-authentication/auth-files.ts +0 -144
  335. package/src/tools/setup-authentication/constants.ts +0 -19
  336. package/src/tools/setup-authentication/db-schema.ts +0 -96
  337. package/src/tools/setup-authentication/index.ts +0 -148
  338. package/src/tools/setup-authentication/package-json.ts +0 -17
  339. package/src/tools/setup-authentication/pages.ts +0 -241
  340. package/src/tools/setup-netsuite.ts +0 -1357
package/dist/index.js CHANGED
@@ -24900,23 +24900,9 @@ async function renderTemplate(templateId, vars, destDir) {
24900
24900
  }
24901
24901
 
24902
24902
  // src/tools/scaffold.ts
24903
- var SCAFFOLD_TEMPLATES = {
24904
- "tanstack-start": "tanstack-start-2026-07-30",
24905
- "tanstack-router": "tanstack-router-2026-06-15"
24906
- };
24907
- var LEGACY_TEMPLATES = ["tanstack-start-2026-06-18"];
24908
- var SCAFFOLD_VERSION = SCAFFOLD_TEMPLATES["tanstack-start"];
24909
- function resolveTemplateId(type) {
24910
- const version3 = process.env.PLUGINS_SCAFFOLD_VERSION;
24911
- const known = [
24912
- ...Object.values(SCAFFOLD_TEMPLATES),
24913
- ...LEGACY_TEMPLATES
24914
- ];
24915
- const pinned = version3 && known.includes(version3) ? version3 : undefined;
24916
- if (type) {
24917
- return pinned?.startsWith(type) ? pinned : SCAFFOLD_TEMPLATES[type];
24918
- }
24919
- return pinned ?? SCAFFOLD_TEMPLATES["tanstack-router"];
24903
+ var SCAFFOLD_VERSION = "tanstack-start-2026-07-30";
24904
+ function resolveTemplateId() {
24905
+ return SCAFFOLD_VERSION;
24920
24906
  }
24921
24907
  function projectUuidFromDir(dir) {
24922
24908
  return path3.basename(dir);
@@ -24927,14 +24913,13 @@ function integrationProxyUrl(projectUuid) {
24927
24913
  }
24928
24914
  var scaffoldOptionsSchema = exports_external2.object({
24929
24915
  name: exports_external2.string().describe("Human-readable name for SEO, e.g. 'Shipping Platform'"),
24930
- description: exports_external2.string().describe("One sentence describing the app. Used as the meta description."),
24931
- type: exports_external2.enum(["tanstack-start", "tanstack-router"]).optional().describe("Project type. 'tanstack-start': SSR app with API routes and a " + "database, KV and bucket \u2014 use it whenever the app needs to " + "persist data or run server-side code, and always for " + "setup_authentication (it needs server routes). " + "'tanstack-router': client-only SPA with no server and no database " + "\u2014 use it only for pure frontends that talk to external APIs. " + "Omit to use the deployment's default.")
24916
+ description: exports_external2.string().describe("One sentence describing the app. Used as the meta description.")
24932
24917
  });
24933
24918
  function slugify(name) {
24934
24919
  return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "leo-project";
24935
24920
  }
24936
- async function writeBaseScaffold({ name, description, type }, dir) {
24937
- const templateId = resolveTemplateId(type);
24921
+ async function writeBaseScaffold({ name, description }, dir) {
24922
+ const templateId = resolveTemplateId();
24938
24923
  const projectUuid = projectUuidFromDir(dir);
24939
24924
  const created = await renderTemplate(templateId, {
24940
24925
  LEO_NAME: name,
@@ -24949,33 +24934,26 @@ async function writeBaseScaffold({ name, description, type }, dir) {
24949
24934
  return [...created, leoPath];
24950
24935
  }
24951
24936
  var scaffold = tool({
24952
- description: "Scaffold a new project with React 19, file-based routing (TanStack), " + "Tailwind v4, shadcn/ui, and react-query. Two types: 'tanstack-start' " + "(SSR, API routes, and a database, KV and bucket via @helloleo/runtime) " + "or 'tanstack-router' (client-only SPA, no server, no database). Call " + "this first for any new project, before writing routes or components.",
24937
+ description: "Scaffold a new project with React 19, file-based routing (TanStack), " + "Tailwind v4, shadcn/ui, and react-query. Projects are TanStack Start: " + "SSR with API routes and a database, KV and bucket via @helloleo/runtime. " + "Call this first for any new project, before writing routes or components.",
24953
24938
  args: {
24954
24939
  name: scaffoldOptionsSchema.shape.name,
24955
- description: scaffoldOptionsSchema.shape.description,
24956
- type: scaffoldOptionsSchema.shape.type
24940
+ description: scaffoldOptionsSchema.shape.description
24957
24941
  },
24958
24942
  async execute(args, context) {
24959
- const isStart = resolveTemplateId(args.type).startsWith("tanstack-start");
24960
24943
  const created = await writeBaseScaffold(args, context.directory);
24961
24944
  const uiComponents = created.filter((f) => f.startsWith("src/components/ui/"));
24962
24945
  const rest = created.filter((f) => !f.startsWith("src/components/ui/"));
24963
- const typeNotes = isStart ? [
24946
+ const typeNotes = [
24964
24947
  "- This is a TanStack Start project. The server entry is src/server.ts. There is no index.html or client entrypoint.",
24965
24948
  "- For JSON/CRUD APIs, add server routes under src/routes/api/. Read src/routes/api/health.ts first, add routes as needed.",
24966
24949
  "- The database schema lives in src/db/schema.ts and is the single source of truth. Migration files under drizzle/ are generated and applied automatically. Never create, edit or delete them.",
24967
24950
  "- Never rename existing tables or columns in schema.ts. Renames cannot be auto-migrated: no migration file is generated, the database keeps the old name, and every query against the new name fails at runtime with a 500. To reshape data, add a new column or table, write to it, and migrate old values in app code (e.g. fall back to the old column on read).",
24968
24951
  "- Persistence goes through @helloleo/runtime exclusively: database via #/db (see src/db/index.ts), key-value store via #/lib/kv (see src/lib/kv.ts), file storage via #/lib/storage (see src/lib/storage.ts -- uploads/downloads flow through your API routes; presigned URLs are NOT available), env/secrets via env from @helloleo/runtime. Read those files before server-side data work. Never install another DB/storage client, never import from cloudflare:workers, all of it is server-side only."
24969
- ] : [
24970
- "- This is a TanStack Router SPA. The client entry is index.html -> src/main.tsx. There is no server: no API routes, no server functions, no database.",
24971
- "- Fetch data from external APIs only. If the app needs its own persistence or server-side code, it should have been scaffolded as tanstack-start."
24972
24952
  ];
24973
- const nextSteps = isStart ? [
24953
+ const nextSteps = [
24974
24954
  "Next: read src/routes/index.tsx and continue with the user's request.",
24975
24955
  "For authentication (password and/or OAuth), call setup_authentication.",
24976
24956
  "For NetSuite projects, call setup_netsuite."
24977
- ] : [
24978
- "Next: read src/routes/index.tsx and continue with the user's request."
24979
24957
  ];
24980
24958
  return [
24981
24959
  `Scaffolded ${created.length} files:`,
@@ -25613,7 +25591,9 @@ function netsuiteServerTs() {
25613
25591
  * Config is read from the Cloudflare env binding via @helloleo/runtime.
25614
25592
  * Set NETSUITE_ACCOUNT_ID / _CLIENT_ID / _CLIENT_SECRET (secret optional for a
25615
25593
  * PKCE public client) and optional PUBLIC_APP_URL as HelloLeo Cloud secrets
25616
- * (prod) or dev vars (preview). They never reach the browser.
25594
+ * (prod) or dev vars (preview). NETSUITE_BROKER_CALLBACK (written by the
25595
+ * HelloLeo wizard) switches the redirect URI to the shared OAuth broker so
25596
+ * one URI serves every app/environment. They never reach the browser.
25617
25597
  */
25618
25598
  import { eq } from 'drizzle-orm'
25619
25599
  import { env as runtimeEnv } from '@helloleo/runtime'
@@ -25624,6 +25604,7 @@ interface NsEnv {
25624
25604
  NETSUITE_ACCOUNT_ID?: string
25625
25605
  NETSUITE_CLIENT_ID?: string
25626
25606
  NETSUITE_CLIENT_SECRET?: string
25607
+ NETSUITE_BROKER_CALLBACK?: string
25627
25608
  PUBLIC_APP_URL?: string
25628
25609
  HELLOLEO_URL?: string
25629
25610
  }
@@ -25684,8 +25665,47 @@ export function appOrigin(request: Request) {
25684
25665
  url.host
25685
25666
  return \`\${proto}://\${hostHeader}\`
25686
25667
  }
25668
+ /**
25669
+ * HelloLeo's shared OAuth broker (integration-proxy Worker). When
25670
+ * NETSUITE_BROKER_CALLBACK is set (the platform writes it to the project env),
25671
+ * customers register that ONE stable URI on their Integration Record instead
25672
+ * of one URI per app/environment: the authorize redirect goes to the broker,
25673
+ * the broker 302s the callback back to THIS app (looked up by the state
25674
+ * nonce), and the token exchange passes the same broker URI. Unset (self-host
25675
+ * / standalone), the app falls back to its own origin's callback.
25676
+ */
25677
+ export function brokerCallback(): string | null {
25678
+ const raw = nsEnv.NETSUITE_BROKER_CALLBACK
25679
+ if (!raw) return null
25680
+ try {
25681
+ const u = new URL(raw)
25682
+ return u.protocol === 'https:' ? u.toString() : null
25683
+ } catch {
25684
+ return null
25685
+ }
25686
+ }
25687
+
25687
25688
  export function redirectUri(request: Request) {
25688
- return \`\${appOrigin(request)}/auth/netsuite/callback\`
25689
+ return brokerCallback() ?? \`\${appOrigin(request)}/auth/netsuite/callback\`
25690
+ }
25691
+
25692
+ /**
25693
+ * Tell the broker where to send this flow's callback: nonce -> this app's
25694
+ * origin. MUST succeed before redirecting to NetSuite, otherwise the callback
25695
+ * dead-ends at the broker. No-op when the broker isn't configured.
25696
+ */
25697
+ export async function registerWithBroker(request: Request, flowId: string): Promise<void> {
25698
+ const callback = brokerCallback()
25699
+ if (!callback) return
25700
+ const registerUrl = new URL('/auth/netsuite/register', callback)
25701
+ const res = await fetch(registerUrl.toString(), {
25702
+ method: 'POST',
25703
+ headers: { 'Content-Type': 'application/json' },
25704
+ body: JSON.stringify({ nonce: flowId, target: appOrigin(request) }),
25705
+ })
25706
+ if (!res.ok) {
25707
+ throw new Error(\`NetSuite broker registration failed (HTTP \${res.status}) -- cannot start sign-in\`)
25708
+ }
25689
25709
  }
25690
25710
 
25691
25711
  // Coerce ?return_to= to our OWN origin. The callback appends the session bearer
@@ -25849,6 +25869,7 @@ import {
25849
25869
  authorizeUrl,
25850
25870
  pkce,
25851
25871
  redirectUri,
25872
+ registerWithBroker,
25852
25873
  requireConfig,
25853
25874
  safeReturnTo,
25854
25875
  SCOPE,
@@ -25866,6 +25887,10 @@ export const Route = createFileRoute('/auth/netsuite/start')({
25866
25887
 
25867
25888
  const { verifier, challenge } = await pkce()
25868
25889
  const flowId = crypto.randomUUID()
25890
+ // With the shared broker, NetSuite redirects to the broker's fixed
25891
+ // callback and the broker forwards here -- it must know this flow's
25892
+ // target before the user leaves for NetSuite.
25893
+ await registerWithBroker(request, flowId)
25869
25894
  await db.insert(netsuiteFlows).values({ flowId, codeVerifier: verifier, returnTo })
25870
25895
 
25871
25896
  const authorize = new URL(authorizeUrl(accountId))
@@ -26728,8 +26753,8 @@ import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'
26728
26753
  "CONFIG -- NETSUITE_ACCOUNT_ID, NETSUITE_CLIENT_ID, NETSUITE_CLIENT_SECRET (secret optional for PKCE public clients). Never hardcode; never put in code. Same var names in every environment, different SOURCE:",
26729
26754
  "- DEV (Fly preview): read from the project .env. HelloLeo writes them there (the setup wizard, or the env tooling). In dev the app uses .env -- do NOT tell the user to use HelloLeo Cloud here.",
26730
26755
  "- PROD (published Worker): the SAME names live as HelloLeo Cloud secrets; the publish step promotes them from .env onto the Worker automatically. Same code path (@helloleo/runtime env), just a different source per environment.",
26731
- "- PUBLIC_APP_URL / HELLOLEO_URL are set by the platform per environment; don't hardcode them.",
26732
- "- REDIRECT URI -- never guess or hardcode it. It is derived server-side and auto-corrects behind the preview proxy. Read the exact value from GET /auth/netsuite/config (or getNetSuiteRedirectUri() on the client) and tell the user to register THAT on Integration Record #2 (scope: rest_webservices). ONE redirect URI per record: register exactly the value /auth/netsuite/config returns for the environment the user signs into. If login must work in BOTH the preview and the published app, use a separate Integration Record per environment (same env var names, different NETSUITE_CLIENT_ID/_SECRET values per environment) -- do not stack URLs on one record.",
26756
+ "- PUBLIC_APP_URL / HELLOLEO_URL / NETSUITE_BROKER_CALLBACK are set by the platform per environment; don't hardcode them.",
26757
+ "- REDIRECT URI -- never guess or hardcode it. When NETSUITE_BROKER_CALLBACK is set (the HelloLeo wizard writes it), the redirect URI is HelloLeo's shared OAuth broker: ONE stable URI the user registers ONCE on Integration Record #2 (scope: rest_webservices), valid for both the preview and the published app -- the broker routes each callback back to this app. Without it, the app falls back to its own origin's callback. Either way, read the exact value from GET /auth/netsuite/config (or getNetSuiteRedirectUri() on the client) and tell the user to register THAT.",
26733
26758
  "- Never replace <AuthLayout> with a password gate. Real OAuth is the only supported login."
26734
26759
  ].join(`
26735
26760
  `);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@helloleo/plugins",
3
- "version": "0.2.20",
3
+ "version": "0.2.22",
4
4
  "description": "OpenCode plugins for HelloLeo",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -9,14 +9,13 @@
9
9
  ".": "./dist/index.js"
10
10
  },
11
11
  "files": [
12
- "dist",
13
- "src"
12
+ "dist"
14
13
  ],
15
14
  "publishConfig": {
16
15
  "access": "public"
17
16
  },
18
17
  "scripts": {
19
- "build": "rm -rf dist && bun build src/index.ts --outdir dist --target bun --format esm && cp -R src/templates dist/templates",
18
+ "build": "rm -rf dist && bun build src/index.ts --outdir dist --target bun --format esm && bun run scripts/copy-templates.ts",
20
19
  "format": "bunx --bun @biomejs/biome format --write src",
21
20
  "lint": "bunx --bun @biomejs/biome lint --write src",
22
21
  "check": "bunx --bun @biomejs/biome check --write src",
@@ -1,22 +0,0 @@
1
- {
2
- "$schema": "https://ui.shadcn.com/schema.json",
3
- "style": "new-york",
4
- "rsc": false,
5
- "tsx": true,
6
- "tailwind": {
7
- "css": "src/styles.css",
8
- "baseColor": "slate",
9
- "cssVariables": true,
10
- "prefix": ""
11
- },
12
- "iconLibrary": "lucide",
13
- "rtl": false,
14
- "aliases": {
15
- "components": "@/components",
16
- "utils": "@/lib/utils",
17
- "ui": "@/components/ui",
18
- "lib": "@/lib",
19
- "hooks": "@/hooks"
20
- },
21
- "registries": {}
22
- }
@@ -1,20 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
- <head>
5
- <meta charset="UTF-8" />
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
- <title>{{LEO_NAME}}</title>
8
- <meta name="description" content="{{LEO_DESCRIPTION}}" />
9
- <meta property="og:title" content="{{LEO_NAME}}" />
10
- <meta property="og:description" content="{{LEO_DESCRIPTION}}" />
11
- <meta property="og:type" content="website" />
12
- <link rel="preconnect" href="https://fonts.googleapis.com">
13
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
14
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@400;500;600;700&display=swap" rel="stylesheet">
15
- </head>
16
- <body>
17
- <div id="app"></div>
18
- <script type="module" src="/src/main.tsx"></script>
19
- </body>
20
- </html>
@@ -1,90 +0,0 @@
1
- {
2
- "name": "{{LEO_SLUG}}",
3
- "private": true,
4
- "type": "module",
5
- "imports": {
6
- "#/*": "./src/*"
7
- },
8
- "scripts": {
9
- "dev": "vite dev",
10
- "generate-routes": "tsr generate",
11
- "build": "oxlint --fix && vite build",
12
- "preview": "vite preview",
13
- "lint": "oxlint --fix",
14
- "test": "vitest run"
15
- },
16
- "dependencies": {
17
- "@hookform/resolvers": "^5.2.2",
18
- "@radix-ui/react-accordion": "^1.2.12",
19
- "@radix-ui/react-alert-dialog": "^1.1.15",
20
- "@radix-ui/react-aspect-ratio": "^1.1.8",
21
- "@radix-ui/react-avatar": "^1.1.11",
22
- "@radix-ui/react-checkbox": "^1.3.3",
23
- "@radix-ui/react-collapsible": "^1.1.12",
24
- "@radix-ui/react-context-menu": "^2.2.16",
25
- "@radix-ui/react-dialog": "^1.1.15",
26
- "@radix-ui/react-dropdown-menu": "^2.1.16",
27
- "@radix-ui/react-hover-card": "^1.1.15",
28
- "@radix-ui/react-label": "^2.1.8",
29
- "@radix-ui/react-menubar": "^1.1.16",
30
- "@radix-ui/react-navigation-menu": "^1.2.14",
31
- "@radix-ui/react-popover": "^1.1.15",
32
- "@radix-ui/react-progress": "^1.1.8",
33
- "@radix-ui/react-radio-group": "^1.3.8",
34
- "@radix-ui/react-scroll-area": "^1.2.10",
35
- "@radix-ui/react-select": "^2.2.6",
36
- "@radix-ui/react-separator": "^1.1.8",
37
- "@radix-ui/react-slider": "^1.3.6",
38
- "@radix-ui/react-slot": "^1.2.4",
39
- "@radix-ui/react-switch": "^1.2.6",
40
- "@radix-ui/react-tabs": "^1.1.13",
41
- "@radix-ui/react-toggle": "^1.1.10",
42
- "@radix-ui/react-toggle-group": "^1.1.11",
43
- "@radix-ui/react-tooltip": "^1.2.8",
44
- "@tailwindcss/vite": "^4.1.18",
45
- "@tanstack/react-query": "^5.90.0",
46
- "@tanstack/react-router": "latest",
47
- "@tanstack/router-plugin": "^1.132.0",
48
- "class-variance-authority": "^0.7.1",
49
- "clsx": "^2.1.1",
50
- "cmdk": "^1.1.1",
51
- "date-fns": "^4.1.0",
52
- "embla-carousel-react": "^8.6.0",
53
- "input-otp": "^1.4.2",
54
- "lucide-react": "^0.575.0",
55
- "react": "^19.2.0",
56
- "react-day-picker": "^9.14.0",
57
- "react-dom": "^19.2.0",
58
- "react-hook-form": "^7.71.2",
59
- "react-resizable-panels": "^4.6.5",
60
- "recharts": "^2.15.4",
61
- "sonner": "^2.0.7",
62
- "tailwind-merge": "^3.5.0",
63
- "tailwindcss": "^4.1.18",
64
- "tw-animate-css": "^1.3.4",
65
- "vaul": "^1.1.2",
66
- "zod": "^3.24.2"
67
- },
68
- "devDependencies": {
69
- "@tailwindcss/typography": "^0.5.16",
70
- "@tanstack/router-cli": "^1.132.0",
71
- "@tanstack/router-plugin": "latest",
72
- "@testing-library/dom": "^10.4.1",
73
- "@testing-library/react": "^16.3.0",
74
- "@types/node": "^22.10.2",
75
- "@types/react": "^19.2.0",
76
- "@types/react-dom": "^19.2.0",
77
- "@vitejs/plugin-react": "^6.0.1",
78
- "jsdom": "^28.1.0",
79
- "oxlint": "^1.69.0",
80
- "typescript": "^6.0.2",
81
- "vite": "^8.0.0",
82
- "vitest": "^4.1.5"
83
- },
84
- "pnpm": {
85
- "onlyBuiltDependencies": [
86
- "esbuild",
87
- "lightningcss"
88
- ]
89
- }
90
- }
@@ -1,50 +0,0 @@
1
- import { useState } from 'react'
2
- import { useRouterState } from '@tanstack/react-router'
3
-
4
- // Rendered by the router's defaultErrorComponent for any uncaught render or
5
- // loader error. Per-route `errorComponent` options override it. Keep this
6
- // component free of app dependencies (toasts, auth, ui components, etc).
7
- export function DefaultErrorComponent({ error }: { error: Error }) {
8
- const pathname = useRouterState({ select: (s) => s.location.pathname })
9
- const [copied, setCopied] = useState(false)
10
-
11
- async function copyForLeo() {
12
- // Blank lines + fenced stack so the report keeps its structure when
13
- // pasted into a markdown-rendering chat.
14
- const report = [
15
- 'My app threw an error, please fix it:',
16
- `Page: ${pathname}`,
17
- `Error: ${error.message}`,
18
- ['Stack:', '```', error.stack ?? '(no stack trace)', '```'].join('\n'),
19
- ].join('\n\n')
20
-
21
- await navigator.clipboard.writeText(report)
22
- setCopied(true)
23
- setTimeout(() => setCopied(false), 2000)
24
- }
25
-
26
- return (
27
- <div className="min-h-screen flex items-center justify-center bg-white p-4">
28
- <div className="w-full max-w-lg rounded-xl border border-neutral-200 bg-white p-6 shadow-sm">
29
- <h2 className="text-base font-semibold text-neutral-900">
30
- Something went wrong
31
- </h2>
32
- <div className="mt-4 space-y-4">
33
- <pre className="text-sm text-red-600 whitespace-pre-wrap break-words rounded-md bg-neutral-100 p-3">
34
- {error.message}
35
- </pre>
36
- <button
37
- type="button"
38
- onClick={copyForLeo}
39
- className="inline-flex items-center rounded-md bg-neutral-900 px-4 py-2 text-sm font-medium text-neutral-50"
40
- >
41
- {copied ? 'Copied!' : 'Copy error'}
42
- </button>
43
- <p className="text-sm text-neutral-500">
44
- Paste the copied error to Leo and it will help you fix it.
45
- </p>
46
- </div>
47
- </div>
48
- </div>
49
- )
50
- }
@@ -1,51 +0,0 @@
1
- import * as React from "react";
2
- import * as AccordionPrimitive from "@radix-ui/react-accordion";
3
- import { ChevronDown } from "lucide-react";
4
-
5
- import { cn } from "@/lib/utils";
6
-
7
- const Accordion = AccordionPrimitive.Root;
8
-
9
- const AccordionItem = React.forwardRef<
10
- React.ElementRef<typeof AccordionPrimitive.Item>,
11
- React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>
12
- >(({ className, ...props }, ref) => (
13
- <AccordionPrimitive.Item ref={ref} className={cn("border-b", className)} {...props} />
14
- ));
15
- AccordionItem.displayName = "AccordionItem";
16
-
17
- const AccordionTrigger = React.forwardRef<
18
- React.ElementRef<typeof AccordionPrimitive.Trigger>,
19
- React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>
20
- >(({ className, children, ...props }, ref) => (
21
- <AccordionPrimitive.Header className="flex">
22
- <AccordionPrimitive.Trigger
23
- ref={ref}
24
- className={cn(
25
- "flex flex-1 items-center justify-between py-4 text-sm font-medium cursor-pointer transition-all hover:underline text-left [&[data-state=open]>svg]:rotate-180",
26
- className,
27
- )}
28
- {...props}
29
- >
30
- {children}
31
- <ChevronDown className="h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200" />
32
- </AccordionPrimitive.Trigger>
33
- </AccordionPrimitive.Header>
34
- ));
35
- AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
36
-
37
- const AccordionContent = React.forwardRef<
38
- React.ElementRef<typeof AccordionPrimitive.Content>,
39
- React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>
40
- >(({ className, children, ...props }, ref) => (
41
- <AccordionPrimitive.Content
42
- ref={ref}
43
- className="overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
44
- {...props}
45
- >
46
- <div className={cn("pb-4 pt-0", className)}>{children}</div>
47
- </AccordionPrimitive.Content>
48
- ));
49
- AccordionContent.displayName = AccordionPrimitive.Content.displayName;
50
-
51
- export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
@@ -1,115 +0,0 @@
1
- import * as React from "react";
2
- import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
3
-
4
- import { cn } from "@/lib/utils";
5
- import { buttonVariants } from "@/components/ui/button";
6
-
7
- const AlertDialog = AlertDialogPrimitive.Root;
8
-
9
- const AlertDialogTrigger = AlertDialogPrimitive.Trigger;
10
-
11
- const AlertDialogPortal = AlertDialogPrimitive.Portal;
12
-
13
- const AlertDialogOverlay = React.forwardRef<
14
- React.ElementRef<typeof AlertDialogPrimitive.Overlay>,
15
- React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>
16
- >(({ className, ...props }, ref) => (
17
- <AlertDialogPrimitive.Overlay
18
- className={cn(
19
- "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
20
- className,
21
- )}
22
- {...props}
23
- ref={ref}
24
- />
25
- ));
26
- AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
27
-
28
- const AlertDialogContent = React.forwardRef<
29
- React.ElementRef<typeof AlertDialogPrimitive.Content>,
30
- React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>
31
- >(({ className, ...props }, ref) => (
32
- <AlertDialogPortal>
33
- <AlertDialogOverlay />
34
- <AlertDialogPrimitive.Content
35
- ref={ref}
36
- className={cn(
37
- "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:rounded-lg",
38
- className,
39
- )}
40
- {...props}
41
- />
42
- </AlertDialogPortal>
43
- ));
44
- AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
45
-
46
- const AlertDialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
47
- <div className={cn("flex flex-col space-y-2 text-center sm:text-left", className)} {...props} />
48
- );
49
- AlertDialogHeader.displayName = "AlertDialogHeader";
50
-
51
- const AlertDialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
52
- <div
53
- className={cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className)}
54
- {...props}
55
- />
56
- );
57
- AlertDialogFooter.displayName = "AlertDialogFooter";
58
-
59
- const AlertDialogTitle = React.forwardRef<
60
- React.ElementRef<typeof AlertDialogPrimitive.Title>,
61
- React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>
62
- >(({ className, ...props }, ref) => (
63
- <AlertDialogPrimitive.Title
64
- ref={ref}
65
- className={cn("text-lg font-semibold", className)}
66
- {...props}
67
- />
68
- ));
69
- AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
70
-
71
- const AlertDialogDescription = React.forwardRef<
72
- React.ElementRef<typeof AlertDialogPrimitive.Description>,
73
- React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>
74
- >(({ className, ...props }, ref) => (
75
- <AlertDialogPrimitive.Description
76
- ref={ref}
77
- className={cn("text-sm text-muted-foreground", className)}
78
- {...props}
79
- />
80
- ));
81
- AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
82
-
83
- const AlertDialogAction = React.forwardRef<
84
- React.ElementRef<typeof AlertDialogPrimitive.Action>,
85
- React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>
86
- >(({ className, ...props }, ref) => (
87
- <AlertDialogPrimitive.Action ref={ref} className={cn(buttonVariants(), className)} {...props} />
88
- ));
89
- AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
90
-
91
- const AlertDialogCancel = React.forwardRef<
92
- React.ElementRef<typeof AlertDialogPrimitive.Cancel>,
93
- React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>
94
- >(({ className, ...props }, ref) => (
95
- <AlertDialogPrimitive.Cancel
96
- ref={ref}
97
- className={cn(buttonVariants({ variant: "outline" }), "mt-2 sm:mt-0", className)}
98
- {...props}
99
- />
100
- ));
101
- AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;
102
-
103
- export {
104
- AlertDialog,
105
- AlertDialogPortal,
106
- AlertDialogOverlay,
107
- AlertDialogTrigger,
108
- AlertDialogContent,
109
- AlertDialogHeader,
110
- AlertDialogFooter,
111
- AlertDialogTitle,
112
- AlertDialogDescription,
113
- AlertDialogAction,
114
- AlertDialogCancel,
115
- };
@@ -1,49 +0,0 @@
1
- import * as React from "react";
2
- import { cva, type VariantProps } from "class-variance-authority";
3
-
4
- import { cn } from "@/lib/utils";
5
-
6
- const alertVariants = cva(
7
- "relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7",
8
- {
9
- variants: {
10
- variant: {
11
- default: "bg-background text-foreground",
12
- destructive:
13
- "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
14
- },
15
- },
16
- defaultVariants: {
17
- variant: "default",
18
- },
19
- },
20
- );
21
-
22
- const Alert = React.forwardRef<
23
- HTMLDivElement,
24
- React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>
25
- >(({ className, variant, ...props }, ref) => (
26
- <div ref={ref} role="alert" className={cn(alertVariants({ variant }), className)} {...props} />
27
- ));
28
- Alert.displayName = "Alert";
29
-
30
- const AlertTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(
31
- ({ className, ...props }, ref) => (
32
- <h5
33
- ref={ref}
34
- className={cn("mb-1 font-medium leading-none tracking-tight", className)}
35
- {...props}
36
- />
37
- ),
38
- );
39
- AlertTitle.displayName = "AlertTitle";
40
-
41
- const AlertDescription = React.forwardRef<
42
- HTMLParagraphElement,
43
- React.HTMLAttributes<HTMLParagraphElement>
44
- >(({ className, ...props }, ref) => (
45
- <div ref={ref} className={cn("text-sm [&_p]:leading-relaxed", className)} {...props} />
46
- ));
47
- AlertDescription.displayName = "AlertDescription";
48
-
49
- export { Alert, AlertTitle, AlertDescription };
@@ -1,5 +0,0 @@
1
- import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio";
2
-
3
- const AspectRatio = AspectRatioPrimitive.Root;
4
-
5
- export { AspectRatio };