virastack 0.0.1 → 1.0.1

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 (447) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +94 -18
  3. package/bin/virastack.js +7 -0
  4. package/package.json +43 -9
  5. package/src/commands/add.js +64 -0
  6. package/src/commands/init.js +286 -0
  7. package/src/i18n.js +231 -0
  8. package/src/index.js +64 -0
  9. package/src/utils/args.js +60 -0
  10. package/src/utils/copy-template.js +81 -0
  11. package/src/utils/exec.js +29 -0
  12. package/src/utils/git.js +38 -0
  13. package/src/utils/is-online.js +14 -0
  14. package/src/utils/package-info.js +12 -0
  15. package/src/utils/package-manager.js +33 -0
  16. package/src/utils/setup-env.js +25 -0
  17. package/src/utils/telemetry.js +86 -0
  18. package/src/utils/tools.js +48 -0
  19. package/src/utils/update-package-json.js +44 -0
  20. package/src/utils/update-readme.js +25 -0
  21. package/src/utils/validate-project-name.js +26 -0
  22. package/templates/nextjs/.changeset/README.md +8 -0
  23. package/templates/nextjs/.changeset/config.json +11 -0
  24. package/templates/nextjs/.env.example +6 -0
  25. package/templates/nextjs/.env.local +6 -0
  26. package/templates/nextjs/.eslintcache +1 -0
  27. package/templates/nextjs/.github/workflows/ci.yml +41 -0
  28. package/templates/nextjs/.husky/commit-msg +1 -0
  29. package/templates/nextjs/.husky/pre-commit +1 -0
  30. package/templates/nextjs/.husky/pre-push +1 -0
  31. package/templates/nextjs/.prettierignore +6 -0
  32. package/templates/nextjs/.prettierrc +42 -0
  33. package/templates/nextjs/.vscode/extensions.json +7 -0
  34. package/templates/nextjs/.vscode/settings.json +20 -0
  35. package/templates/nextjs/LICENSE +21 -0
  36. package/templates/nextjs/README.md +202 -0
  37. package/templates/nextjs/_gitignore +45 -0
  38. package/templates/nextjs/commitlint.config.js +6 -0
  39. package/templates/nextjs/eslint.config.mjs +27 -0
  40. package/templates/nextjs/knip.config.js +25 -0
  41. package/templates/nextjs/next-env.d.ts +6 -0
  42. package/templates/nextjs/next.config.ts +39 -0
  43. package/templates/nextjs/package.json +115 -0
  44. package/templates/nextjs/pnpm-lock.yaml +6467 -0
  45. package/templates/nextjs/pnpm-workspace.yaml +3 -0
  46. package/templates/nextjs/postcss.config.mjs +7 -0
  47. package/templates/nextjs/public/favicon.ico +0 -0
  48. package/templates/nextjs/public/llms.txt +96 -0
  49. package/templates/nextjs/public/logo.png +0 -0
  50. package/templates/nextjs/public/logo.webp +0 -0
  51. package/templates/nextjs/public/og.png +0 -0
  52. package/templates/nextjs/src/app/error.tsx +34 -0
  53. package/templates/nextjs/src/app/favicon.ico +0 -0
  54. package/templates/nextjs/src/app/global-error.tsx +32 -0
  55. package/templates/nextjs/src/app/layout.tsx +37 -0
  56. package/templates/nextjs/src/app/loading.tsx +12 -0
  57. package/templates/nextjs/src/app/manifest.ts +22 -0
  58. package/templates/nextjs/src/app/not-found.tsx +18 -0
  59. package/templates/nextjs/src/app/page.tsx +5 -0
  60. package/templates/nextjs/src/app/robots.ts +13 -0
  61. package/templates/nextjs/src/app/sitemap.ts +14 -0
  62. package/templates/nextjs/src/components/shared/ThemeToggle.tsx +30 -0
  63. package/templates/nextjs/src/components/ui/avatar.tsx +54 -0
  64. package/templates/nextjs/src/components/ui/button.tsx +46 -0
  65. package/templates/nextjs/src/components/ui/dialog.tsx +107 -0
  66. package/templates/nextjs/src/components/ui/field.tsx +24 -0
  67. package/templates/nextjs/src/components/ui/index.ts +27 -0
  68. package/templates/nextjs/src/components/ui/input.tsx +23 -0
  69. package/templates/nextjs/src/components/ui/label.tsx +17 -0
  70. package/templates/nextjs/src/components/ui/skeleton.tsx +13 -0
  71. package/templates/nextjs/src/components/ui/table.tsx +94 -0
  72. package/templates/nextjs/src/components/ui/tabs.tsx +46 -0
  73. package/templates/nextjs/src/config/seo.config.ts +37 -0
  74. package/templates/nextjs/src/config/site.config.ts +15 -0
  75. package/templates/nextjs/src/constants/index.ts +5 -0
  76. package/templates/nextjs/src/env.ts +41 -0
  77. package/templates/nextjs/src/features/landing/api/get-users.api.ts +7 -0
  78. package/templates/nextjs/src/features/landing/api/index.ts +2 -0
  79. package/templates/nextjs/src/features/landing/api/query-keys.ts +7 -0
  80. package/templates/nextjs/src/features/landing/components/CartDemo.tsx +66 -0
  81. package/templates/nextjs/src/features/landing/components/Features.tsx +39 -0
  82. package/templates/nextjs/src/features/landing/components/Hero.tsx +65 -0
  83. package/templates/nextjs/src/features/landing/components/LandingPage.tsx +17 -0
  84. package/templates/nextjs/src/features/landing/components/ProjectFormDemo.tsx +62 -0
  85. package/templates/nextjs/src/features/landing/components/Reveal.tsx +83 -0
  86. package/templates/nextjs/src/features/landing/components/Showcase.tsx +66 -0
  87. package/templates/nextjs/src/features/landing/components/UsersDemo.tsx +188 -0
  88. package/templates/nextjs/src/features/landing/data/features.data.tsx +47 -0
  89. package/templates/nextjs/src/features/landing/data/index.ts +1 -0
  90. package/templates/nextjs/src/features/landing/helpers/get-initials.ts +15 -0
  91. package/templates/nextjs/src/features/landing/helpers/index.ts +7 -0
  92. package/templates/nextjs/src/features/landing/helpers/motion.ts +21 -0
  93. package/templates/nextjs/src/features/landing/hooks/index.ts +1 -0
  94. package/templates/nextjs/src/features/landing/hooks/use-users.ts +16 -0
  95. package/templates/nextjs/src/features/landing/icons/index.ts +6 -0
  96. package/templates/nextjs/src/features/landing/icons/nextjs.tsx +68 -0
  97. package/templates/nextjs/src/features/landing/icons/react-hook-form.tsx +18 -0
  98. package/templates/nextjs/src/features/landing/icons/react.tsx +20 -0
  99. package/templates/nextjs/src/features/landing/icons/tailwind.tsx +14 -0
  100. package/templates/nextjs/src/features/landing/icons/tanstack.tsx +321 -0
  101. package/templates/nextjs/src/features/landing/icons/typescript.tsx +16 -0
  102. package/templates/nextjs/src/features/landing/index.ts +1 -0
  103. package/templates/nextjs/src/features/landing/schemas/index.ts +1 -0
  104. package/templates/nextjs/src/features/landing/schemas/project.schema.ts +7 -0
  105. package/templates/nextjs/src/features/landing/stores/counter.store.ts +18 -0
  106. package/templates/nextjs/src/features/landing/stores/index.ts +1 -0
  107. package/templates/nextjs/src/features/landing/types/index.ts +1 -0
  108. package/templates/nextjs/src/features/landing/types/user.types.ts +9 -0
  109. package/templates/nextjs/src/helpers/format-date.ts +13 -0
  110. package/templates/nextjs/src/helpers/index.ts +1 -0
  111. package/templates/nextjs/src/hooks/index.ts +5 -0
  112. package/templates/nextjs/src/lib/api.ts +97 -0
  113. package/templates/nextjs/src/lib/query-client.ts +18 -0
  114. package/templates/nextjs/src/lib/utils.ts +12 -0
  115. package/templates/nextjs/src/providers/Providers.tsx +15 -0
  116. package/templates/nextjs/src/providers/QueryProvider.tsx +19 -0
  117. package/templates/nextjs/src/providers/ThemeProvider.tsx +9 -0
  118. package/templates/nextjs/src/providers/index.ts +1 -0
  119. package/templates/nextjs/src/proxy.ts +6 -0
  120. package/templates/nextjs/src/schemas/index.ts +5 -0
  121. package/templates/nextjs/src/stores/index.ts +5 -0
  122. package/templates/nextjs/src/styles/tailwind.css +122 -0
  123. package/templates/nextjs/src/types/site-config.types.ts +10 -0
  124. package/templates/nextjs/tsconfig.json +45 -0
  125. package/templates/nextjs/tsconfig.tsbuildinfo +1 -0
  126. package/templates/tanstack/.changeset/README.md +8 -0
  127. package/templates/tanstack/.changeset/config.json +11 -0
  128. package/templates/tanstack/.env.example +6 -0
  129. package/templates/tanstack/.env.local +6 -0
  130. package/templates/tanstack/.eslintcache +1 -0
  131. package/templates/tanstack/.github/workflows/ci.yml +41 -0
  132. package/templates/tanstack/.husky/commit-msg +1 -0
  133. package/templates/tanstack/.husky/pre-commit +1 -0
  134. package/templates/tanstack/.husky/pre-push +1 -0
  135. package/templates/tanstack/.prettierignore +7 -0
  136. package/templates/tanstack/.prettierrc +41 -0
  137. package/templates/tanstack/.vscode/extensions.json +7 -0
  138. package/templates/tanstack/.vscode/settings.json +22 -0
  139. package/templates/tanstack/LICENSE +21 -0
  140. package/templates/tanstack/README.md +204 -0
  141. package/templates/tanstack/_gitignore +52 -0
  142. package/templates/tanstack/commitlint.config.js +6 -0
  143. package/templates/tanstack/eslint.config.js +28 -0
  144. package/templates/tanstack/knip.config.js +22 -0
  145. package/templates/tanstack/package.json +130 -0
  146. package/templates/tanstack/pnpm-lock.yaml +5835 -0
  147. package/templates/tanstack/pnpm-workspace.yaml +3 -0
  148. package/templates/tanstack/public/favicon.ico +0 -0
  149. package/templates/tanstack/public/llms.txt +86 -0
  150. package/templates/tanstack/public/logo.png +0 -0
  151. package/templates/tanstack/public/logo.webp +0 -0
  152. package/templates/tanstack/public/og.png +0 -0
  153. package/templates/tanstack/src/components/shared/DefaultCatchBoundary.tsx +36 -0
  154. package/templates/tanstack/src/components/shared/NotFound.tsx +18 -0
  155. package/templates/tanstack/src/components/shared/Pending.tsx +13 -0
  156. package/templates/tanstack/src/components/shared/ThemeToggle.tsx +31 -0
  157. package/templates/tanstack/src/components/ui/avatar.tsx +52 -0
  158. package/templates/tanstack/src/components/ui/button.tsx +47 -0
  159. package/templates/tanstack/src/components/ui/dialog.tsx +107 -0
  160. package/templates/tanstack/src/components/ui/field.tsx +24 -0
  161. package/templates/tanstack/src/components/ui/index.ts +27 -0
  162. package/templates/tanstack/src/components/ui/input.tsx +23 -0
  163. package/templates/tanstack/src/components/ui/label.tsx +17 -0
  164. package/templates/tanstack/src/components/ui/skeleton.tsx +13 -0
  165. package/templates/tanstack/src/components/ui/table.tsx +94 -0
  166. package/templates/tanstack/src/components/ui/tabs.tsx +46 -0
  167. package/templates/tanstack/src/config/seo.config.ts +52 -0
  168. package/templates/tanstack/src/config/site.config.ts +15 -0
  169. package/templates/tanstack/src/constants/index.ts +5 -0
  170. package/templates/tanstack/src/env.ts +47 -0
  171. package/templates/tanstack/src/features/landing/api/get-users.api.ts +7 -0
  172. package/templates/tanstack/src/features/landing/api/index.ts +2 -0
  173. package/templates/tanstack/src/features/landing/api/query-keys.ts +7 -0
  174. package/templates/tanstack/src/features/landing/components/CartDemo.tsx +66 -0
  175. package/templates/tanstack/src/features/landing/components/Features.tsx +39 -0
  176. package/templates/tanstack/src/features/landing/components/Hero.tsx +63 -0
  177. package/templates/tanstack/src/features/landing/components/LandingPage.tsx +17 -0
  178. package/templates/tanstack/src/features/landing/components/ProjectFormDemo.tsx +63 -0
  179. package/templates/tanstack/src/features/landing/components/Reveal.tsx +83 -0
  180. package/templates/tanstack/src/features/landing/components/Showcase.tsx +66 -0
  181. package/templates/tanstack/src/features/landing/components/UsersDemo.tsx +191 -0
  182. package/templates/tanstack/src/features/landing/data/features.data.tsx +45 -0
  183. package/templates/tanstack/src/features/landing/data/index.ts +1 -0
  184. package/templates/tanstack/src/features/landing/helpers/get-initials.ts +15 -0
  185. package/templates/tanstack/src/features/landing/helpers/index.ts +7 -0
  186. package/templates/tanstack/src/features/landing/helpers/motion.ts +21 -0
  187. package/templates/tanstack/src/features/landing/hooks/index.ts +1 -0
  188. package/templates/tanstack/src/features/landing/hooks/use-users.ts +19 -0
  189. package/templates/tanstack/src/features/landing/icons/index.ts +5 -0
  190. package/templates/tanstack/src/features/landing/icons/react-hook-form.tsx +18 -0
  191. package/templates/tanstack/src/features/landing/icons/react.tsx +20 -0
  192. package/templates/tanstack/src/features/landing/icons/tailwind.tsx +14 -0
  193. package/templates/tanstack/src/features/landing/icons/tanstack.tsx +321 -0
  194. package/templates/tanstack/src/features/landing/icons/typescript.tsx +16 -0
  195. package/templates/tanstack/src/features/landing/index.ts +1 -0
  196. package/templates/tanstack/src/features/landing/schemas/index.ts +1 -0
  197. package/templates/tanstack/src/features/landing/schemas/project.schema.ts +7 -0
  198. package/templates/tanstack/src/features/landing/stores/counter.store.ts +18 -0
  199. package/templates/tanstack/src/features/landing/stores/index.ts +1 -0
  200. package/templates/tanstack/src/features/landing/types/index.ts +1 -0
  201. package/templates/tanstack/src/features/landing/types/user.types.ts +9 -0
  202. package/templates/tanstack/src/helpers/format-date.ts +13 -0
  203. package/templates/tanstack/src/helpers/index.ts +1 -0
  204. package/templates/tanstack/src/hooks/index.ts +5 -0
  205. package/templates/tanstack/src/lib/api.ts +97 -0
  206. package/templates/tanstack/src/lib/query-client.ts +18 -0
  207. package/templates/tanstack/src/lib/utils.ts +13 -0
  208. package/templates/tanstack/src/providers/Providers.tsx +12 -0
  209. package/templates/tanstack/src/providers/ThemeProvider.tsx +98 -0
  210. package/templates/tanstack/src/providers/devtools.tsx +6 -0
  211. package/templates/tanstack/src/providers/index.ts +1 -0
  212. package/templates/tanstack/src/providers/root-provider.ts +9 -0
  213. package/templates/tanstack/src/routeTree.gen.ts +123 -0
  214. package/templates/tanstack/src/router.tsx +27 -0
  215. package/templates/tanstack/src/routes/__root.tsx +78 -0
  216. package/templates/tanstack/src/routes/index.tsx +13 -0
  217. package/templates/tanstack/src/routes/robots[.]txt.ts +21 -0
  218. package/templates/tanstack/src/routes/site[.]webmanifest.ts +32 -0
  219. package/templates/tanstack/src/routes/sitemap[.]xml.ts +27 -0
  220. package/templates/tanstack/src/schemas/index.ts +5 -0
  221. package/templates/tanstack/src/start.ts +20 -0
  222. package/templates/tanstack/src/stores/index.ts +5 -0
  223. package/templates/tanstack/src/styles/tailwind.css +123 -0
  224. package/templates/tanstack/src/types/site-config.types.ts +10 -0
  225. package/templates/tanstack/tsconfig.json +25 -0
  226. package/templates/tanstack/tsr.config.json +3 -0
  227. package/templates/tanstack/vite.config.ts +12 -0
  228. package/templates-i18n/nextjs/.changeset/README.md +8 -0
  229. package/templates-i18n/nextjs/.changeset/config.json +11 -0
  230. package/templates-i18n/nextjs/.env.example +6 -0
  231. package/templates-i18n/nextjs/.eslintcache +1 -0
  232. package/templates-i18n/nextjs/.github/workflows/ci.yml +41 -0
  233. package/templates-i18n/nextjs/.husky/commit-msg +1 -0
  234. package/templates-i18n/nextjs/.husky/pre-commit +1 -0
  235. package/templates-i18n/nextjs/.husky/pre-push +1 -0
  236. package/templates-i18n/nextjs/.prettierignore +6 -0
  237. package/templates-i18n/nextjs/.prettierrc +42 -0
  238. package/templates-i18n/nextjs/.vscode/extensions.json +7 -0
  239. package/templates-i18n/nextjs/.vscode/settings.json +20 -0
  240. package/templates-i18n/nextjs/LICENSE +21 -0
  241. package/templates-i18n/nextjs/README.md +202 -0
  242. package/templates-i18n/nextjs/_gitignore +45 -0
  243. package/templates-i18n/nextjs/commitlint.config.js +6 -0
  244. package/templates-i18n/nextjs/eslint.config.mjs +27 -0
  245. package/templates-i18n/nextjs/knip.config.js +29 -0
  246. package/templates-i18n/nextjs/next-env.d.ts +6 -0
  247. package/templates-i18n/nextjs/next.config.ts +42 -0
  248. package/templates-i18n/nextjs/package.json +117 -0
  249. package/templates-i18n/nextjs/pnpm-lock.yaml +6854 -0
  250. package/templates-i18n/nextjs/pnpm-workspace.yaml +3 -0
  251. package/templates-i18n/nextjs/postcss.config.mjs +7 -0
  252. package/templates-i18n/nextjs/public/favicon.ico +0 -0
  253. package/templates-i18n/nextjs/public/llms.txt +96 -0
  254. package/templates-i18n/nextjs/public/logo.png +0 -0
  255. package/templates-i18n/nextjs/public/logo.webp +0 -0
  256. package/templates-i18n/nextjs/public/og.png +0 -0
  257. package/templates-i18n/nextjs/src/app/[locale]/error.tsx +34 -0
  258. package/templates-i18n/nextjs/src/app/[locale]/layout.tsx +60 -0
  259. package/templates-i18n/nextjs/src/app/[locale]/loading.tsx +12 -0
  260. package/templates-i18n/nextjs/src/app/[locale]/not-found.tsx +18 -0
  261. package/templates-i18n/nextjs/src/app/[locale]/page.tsx +10 -0
  262. package/templates-i18n/nextjs/src/app/favicon.ico +0 -0
  263. package/templates-i18n/nextjs/src/app/global-error.tsx +32 -0
  264. package/templates-i18n/nextjs/src/app/manifest.ts +22 -0
  265. package/templates-i18n/nextjs/src/app/robots.ts +13 -0
  266. package/templates-i18n/nextjs/src/app/sitemap.ts +14 -0
  267. package/templates-i18n/nextjs/src/components/shared/LanguageSwitcher.tsx +48 -0
  268. package/templates-i18n/nextjs/src/components/shared/ThemeToggle.tsx +30 -0
  269. package/templates-i18n/nextjs/src/components/ui/avatar.tsx +54 -0
  270. package/templates-i18n/nextjs/src/components/ui/button.tsx +46 -0
  271. package/templates-i18n/nextjs/src/components/ui/dialog.tsx +107 -0
  272. package/templates-i18n/nextjs/src/components/ui/field.tsx +24 -0
  273. package/templates-i18n/nextjs/src/components/ui/index.ts +27 -0
  274. package/templates-i18n/nextjs/src/components/ui/input.tsx +23 -0
  275. package/templates-i18n/nextjs/src/components/ui/label.tsx +17 -0
  276. package/templates-i18n/nextjs/src/components/ui/skeleton.tsx +13 -0
  277. package/templates-i18n/nextjs/src/components/ui/table.tsx +94 -0
  278. package/templates-i18n/nextjs/src/components/ui/tabs.tsx +46 -0
  279. package/templates-i18n/nextjs/src/config/seo.config.ts +37 -0
  280. package/templates-i18n/nextjs/src/config/site.config.ts +15 -0
  281. package/templates-i18n/nextjs/src/constants/index.ts +5 -0
  282. package/templates-i18n/nextjs/src/env.ts +41 -0
  283. package/templates-i18n/nextjs/src/features/landing/api/get-users.api.ts +7 -0
  284. package/templates-i18n/nextjs/src/features/landing/api/index.ts +2 -0
  285. package/templates-i18n/nextjs/src/features/landing/api/query-keys.ts +7 -0
  286. package/templates-i18n/nextjs/src/features/landing/components/CartDemo.tsx +68 -0
  287. package/templates-i18n/nextjs/src/features/landing/components/Features.tsx +84 -0
  288. package/templates-i18n/nextjs/src/features/landing/components/Hero.tsx +76 -0
  289. package/templates-i18n/nextjs/src/features/landing/components/LandingPage.tsx +17 -0
  290. package/templates-i18n/nextjs/src/features/landing/components/ProjectFormDemo.tsx +64 -0
  291. package/templates-i18n/nextjs/src/features/landing/components/Reveal.tsx +83 -0
  292. package/templates-i18n/nextjs/src/features/landing/components/Showcase.tsx +83 -0
  293. package/templates-i18n/nextjs/src/features/landing/components/UsersDemo.tsx +191 -0
  294. package/templates-i18n/nextjs/src/features/landing/data/features.data.tsx +47 -0
  295. package/templates-i18n/nextjs/src/features/landing/data/index.ts +1 -0
  296. package/templates-i18n/nextjs/src/features/landing/helpers/get-initials.ts +15 -0
  297. package/templates-i18n/nextjs/src/features/landing/helpers/index.ts +7 -0
  298. package/templates-i18n/nextjs/src/features/landing/helpers/motion.ts +21 -0
  299. package/templates-i18n/nextjs/src/features/landing/hooks/index.ts +1 -0
  300. package/templates-i18n/nextjs/src/features/landing/hooks/use-users.ts +16 -0
  301. package/templates-i18n/nextjs/src/features/landing/icons/index.ts +6 -0
  302. package/templates-i18n/nextjs/src/features/landing/icons/nextjs.tsx +68 -0
  303. package/templates-i18n/nextjs/src/features/landing/icons/react-hook-form.tsx +18 -0
  304. package/templates-i18n/nextjs/src/features/landing/icons/react.tsx +20 -0
  305. package/templates-i18n/nextjs/src/features/landing/icons/tailwind.tsx +14 -0
  306. package/templates-i18n/nextjs/src/features/landing/icons/tanstack.tsx +321 -0
  307. package/templates-i18n/nextjs/src/features/landing/icons/typescript.tsx +16 -0
  308. package/templates-i18n/nextjs/src/features/landing/index.ts +1 -0
  309. package/templates-i18n/nextjs/src/features/landing/schemas/index.ts +1 -0
  310. package/templates-i18n/nextjs/src/features/landing/schemas/project.schema.ts +9 -0
  311. package/templates-i18n/nextjs/src/features/landing/stores/counter.store.ts +18 -0
  312. package/templates-i18n/nextjs/src/features/landing/stores/index.ts +1 -0
  313. package/templates-i18n/nextjs/src/features/landing/types/index.ts +1 -0
  314. package/templates-i18n/nextjs/src/features/landing/types/user.types.ts +9 -0
  315. package/templates-i18n/nextjs/src/helpers/format-date.ts +13 -0
  316. package/templates-i18n/nextjs/src/helpers/index.ts +1 -0
  317. package/templates-i18n/nextjs/src/hooks/index.ts +5 -0
  318. package/templates-i18n/nextjs/src/i18n/request.ts +16 -0
  319. package/templates-i18n/nextjs/src/i18n/routing.ts +11 -0
  320. package/templates-i18n/nextjs/src/lib/api.ts +97 -0
  321. package/templates-i18n/nextjs/src/lib/query-client.ts +18 -0
  322. package/templates-i18n/nextjs/src/lib/utils.ts +12 -0
  323. package/templates-i18n/nextjs/src/messages/en.json +55 -0
  324. package/templates-i18n/nextjs/src/messages/tr.json +55 -0
  325. package/templates-i18n/nextjs/src/providers/Providers.tsx +15 -0
  326. package/templates-i18n/nextjs/src/providers/QueryProvider.tsx +19 -0
  327. package/templates-i18n/nextjs/src/providers/ThemeProvider.tsx +9 -0
  328. package/templates-i18n/nextjs/src/providers/index.ts +1 -0
  329. package/templates-i18n/nextjs/src/proxy.ts +16 -0
  330. package/templates-i18n/nextjs/src/schemas/index.ts +5 -0
  331. package/templates-i18n/nextjs/src/stores/index.ts +5 -0
  332. package/templates-i18n/nextjs/src/styles/tailwind.css +122 -0
  333. package/templates-i18n/nextjs/src/types/site-config.types.ts +10 -0
  334. package/templates-i18n/nextjs/tsconfig.json +45 -0
  335. package/templates-i18n/nextjs/tsconfig.tsbuildinfo +1 -0
  336. package/templates-i18n/tanstack/.changeset/README.md +8 -0
  337. package/templates-i18n/tanstack/.changeset/config.json +11 -0
  338. package/templates-i18n/tanstack/.env.example +6 -0
  339. package/templates-i18n/tanstack/.eslintcache +1 -0
  340. package/templates-i18n/tanstack/.github/workflows/ci.yml +41 -0
  341. package/templates-i18n/tanstack/.husky/commit-msg +1 -0
  342. package/templates-i18n/tanstack/.husky/pre-commit +1 -0
  343. package/templates-i18n/tanstack/.husky/pre-push +1 -0
  344. package/templates-i18n/tanstack/.prettierignore +7 -0
  345. package/templates-i18n/tanstack/.prettierrc +41 -0
  346. package/templates-i18n/tanstack/.vscode/extensions.json +7 -0
  347. package/templates-i18n/tanstack/.vscode/settings.json +22 -0
  348. package/templates-i18n/tanstack/LICENSE +21 -0
  349. package/templates-i18n/tanstack/README.md +204 -0
  350. package/templates-i18n/tanstack/_gitignore +52 -0
  351. package/templates-i18n/tanstack/commitlint.config.js +6 -0
  352. package/templates-i18n/tanstack/eslint.config.js +29 -0
  353. package/templates-i18n/tanstack/knip.config.js +26 -0
  354. package/templates-i18n/tanstack/messages/en.json +65 -0
  355. package/templates-i18n/tanstack/messages/tr.json +65 -0
  356. package/templates-i18n/tanstack/package.json +132 -0
  357. package/templates-i18n/tanstack/pnpm-lock.yaml +5998 -0
  358. package/templates-i18n/tanstack/pnpm-workspace.yaml +3 -0
  359. package/templates-i18n/tanstack/project.inlang/README.md +157 -0
  360. package/templates-i18n/tanstack/project.inlang/settings.json +9 -0
  361. package/templates-i18n/tanstack/public/favicon.ico +0 -0
  362. package/templates-i18n/tanstack/public/llms.txt +86 -0
  363. package/templates-i18n/tanstack/public/logo.png +0 -0
  364. package/templates-i18n/tanstack/public/logo.webp +0 -0
  365. package/templates-i18n/tanstack/public/og.png +0 -0
  366. package/templates-i18n/tanstack/src/components/shared/DefaultCatchBoundary.tsx +36 -0
  367. package/templates-i18n/tanstack/src/components/shared/LanguageSwitcher.tsx +57 -0
  368. package/templates-i18n/tanstack/src/components/shared/NotFound.tsx +18 -0
  369. package/templates-i18n/tanstack/src/components/shared/Pending.tsx +13 -0
  370. package/templates-i18n/tanstack/src/components/shared/ThemeToggle.tsx +31 -0
  371. package/templates-i18n/tanstack/src/components/ui/avatar.tsx +52 -0
  372. package/templates-i18n/tanstack/src/components/ui/button.tsx +47 -0
  373. package/templates-i18n/tanstack/src/components/ui/dialog.tsx +107 -0
  374. package/templates-i18n/tanstack/src/components/ui/field.tsx +24 -0
  375. package/templates-i18n/tanstack/src/components/ui/index.ts +27 -0
  376. package/templates-i18n/tanstack/src/components/ui/input.tsx +23 -0
  377. package/templates-i18n/tanstack/src/components/ui/label.tsx +17 -0
  378. package/templates-i18n/tanstack/src/components/ui/skeleton.tsx +13 -0
  379. package/templates-i18n/tanstack/src/components/ui/table.tsx +94 -0
  380. package/templates-i18n/tanstack/src/components/ui/tabs.tsx +46 -0
  381. package/templates-i18n/tanstack/src/config/seo.config.ts +52 -0
  382. package/templates-i18n/tanstack/src/config/site.config.ts +15 -0
  383. package/templates-i18n/tanstack/src/constants/index.ts +5 -0
  384. package/templates-i18n/tanstack/src/env.ts +47 -0
  385. package/templates-i18n/tanstack/src/features/landing/api/get-users.api.ts +7 -0
  386. package/templates-i18n/tanstack/src/features/landing/api/index.ts +2 -0
  387. package/templates-i18n/tanstack/src/features/landing/api/query-keys.ts +7 -0
  388. package/templates-i18n/tanstack/src/features/landing/components/CartDemo.tsx +67 -0
  389. package/templates-i18n/tanstack/src/features/landing/components/Features.tsx +79 -0
  390. package/templates-i18n/tanstack/src/features/landing/components/Hero.tsx +68 -0
  391. package/templates-i18n/tanstack/src/features/landing/components/LandingPage.tsx +17 -0
  392. package/templates-i18n/tanstack/src/features/landing/components/ProjectFormDemo.tsx +64 -0
  393. package/templates-i18n/tanstack/src/features/landing/components/Reveal.tsx +83 -0
  394. package/templates-i18n/tanstack/src/features/landing/components/Showcase.tsx +81 -0
  395. package/templates-i18n/tanstack/src/features/landing/components/UsersDemo.tsx +191 -0
  396. package/templates-i18n/tanstack/src/features/landing/data/features.data.tsx +45 -0
  397. package/templates-i18n/tanstack/src/features/landing/data/index.ts +1 -0
  398. package/templates-i18n/tanstack/src/features/landing/helpers/get-initials.ts +15 -0
  399. package/templates-i18n/tanstack/src/features/landing/helpers/index.ts +7 -0
  400. package/templates-i18n/tanstack/src/features/landing/helpers/motion.ts +21 -0
  401. package/templates-i18n/tanstack/src/features/landing/hooks/index.ts +1 -0
  402. package/templates-i18n/tanstack/src/features/landing/hooks/use-users.ts +19 -0
  403. package/templates-i18n/tanstack/src/features/landing/icons/index.ts +5 -0
  404. package/templates-i18n/tanstack/src/features/landing/icons/react-hook-form.tsx +18 -0
  405. package/templates-i18n/tanstack/src/features/landing/icons/react.tsx +20 -0
  406. package/templates-i18n/tanstack/src/features/landing/icons/tailwind.tsx +14 -0
  407. package/templates-i18n/tanstack/src/features/landing/icons/tanstack.tsx +321 -0
  408. package/templates-i18n/tanstack/src/features/landing/icons/typescript.tsx +16 -0
  409. package/templates-i18n/tanstack/src/features/landing/index.ts +1 -0
  410. package/templates-i18n/tanstack/src/features/landing/schemas/index.ts +1 -0
  411. package/templates-i18n/tanstack/src/features/landing/schemas/project.schema.ts +10 -0
  412. package/templates-i18n/tanstack/src/features/landing/stores/counter.store.ts +18 -0
  413. package/templates-i18n/tanstack/src/features/landing/stores/index.ts +1 -0
  414. package/templates-i18n/tanstack/src/features/landing/types/index.ts +1 -0
  415. package/templates-i18n/tanstack/src/features/landing/types/user.types.ts +9 -0
  416. package/templates-i18n/tanstack/src/helpers/format-date.ts +13 -0
  417. package/templates-i18n/tanstack/src/helpers/index.ts +1 -0
  418. package/templates-i18n/tanstack/src/hooks/index.ts +5 -0
  419. package/templates-i18n/tanstack/src/lib/api.ts +97 -0
  420. package/templates-i18n/tanstack/src/lib/query-client.ts +18 -0
  421. package/templates-i18n/tanstack/src/lib/utils.ts +13 -0
  422. package/templates-i18n/tanstack/src/paraglide/README.md +162 -0
  423. package/templates-i18n/tanstack/src/providers/Providers.tsx +12 -0
  424. package/templates-i18n/tanstack/src/providers/ThemeProvider.tsx +98 -0
  425. package/templates-i18n/tanstack/src/providers/devtools.tsx +6 -0
  426. package/templates-i18n/tanstack/src/providers/index.ts +1 -0
  427. package/templates-i18n/tanstack/src/providers/root-provider.ts +9 -0
  428. package/templates-i18n/tanstack/src/routeTree.gen.ts +179 -0
  429. package/templates-i18n/tanstack/src/router.tsx +27 -0
  430. package/templates-i18n/tanstack/src/routes/$lang/index.tsx +13 -0
  431. package/templates-i18n/tanstack/src/routes/$lang.tsx +22 -0
  432. package/templates-i18n/tanstack/src/routes/__root.tsx +80 -0
  433. package/templates-i18n/tanstack/src/routes/index.tsx +13 -0
  434. package/templates-i18n/tanstack/src/routes/robots[.]txt.ts +21 -0
  435. package/templates-i18n/tanstack/src/routes/site[.]webmanifest.ts +32 -0
  436. package/templates-i18n/tanstack/src/routes/sitemap[.]xml.ts +27 -0
  437. package/templates-i18n/tanstack/src/schemas/index.ts +5 -0
  438. package/templates-i18n/tanstack/src/server.ts +10 -0
  439. package/templates-i18n/tanstack/src/start.ts +20 -0
  440. package/templates-i18n/tanstack/src/stores/index.ts +5 -0
  441. package/templates-i18n/tanstack/src/styles/tailwind.css +123 -0
  442. package/templates-i18n/tanstack/src/types/site-config.types.ts +10 -0
  443. package/templates-i18n/tanstack/tsconfig.json +26 -0
  444. package/templates-i18n/tanstack/tsr.config.json +3 -0
  445. package/templates-i18n/tanstack/vite.config.ts +31 -0
  446. package/index.js +0 -3
  447. package/public/start.jpg +0 -0
@@ -0,0 +1,321 @@
1
+ import type { ComponentProps } from "react";
2
+
3
+ export function TanstackIcon(props: ComponentProps<"svg">) {
4
+ return (
5
+ <svg xmlnsXlink="http://www.w3.org/1999/xlink" viewBox="0 0 633 633" {...props}>
6
+ <defs>
7
+ <linearGradient id="tanstack__b" x1="50%" x2="50%" y1="0%" y2="71.65%">
8
+ <stop offset="0%" stopColor="#6BDAFF" />
9
+ <stop offset="31.922%" stopColor="#F9FFB5" />
10
+ <stop offset="70.627%" stopColor="#FFA770" />
11
+ <stop offset="100%" stopColor="#FF7373" />
12
+ </linearGradient>
13
+ <linearGradient id="tanstack__d" x1="43.996%" x2="53.441%" y1="8.54%" y2="93.872%">
14
+ <stop offset="0%" stopColor="#673800" />
15
+ <stop offset="100%" stopColor="#B65E00" />
16
+ </linearGradient>
17
+ <linearGradient id="tanstack__e" x1="50%" x2="50%" y1="0%" y2="100%">
18
+ <stop offset="0%" stopColor="#2F8A00" />
19
+ <stop offset="100%" stopColor="#90FF57" />
20
+ </linearGradient>
21
+ <linearGradient id="tanstack__f" x1="50%" x2="50%" y1="0%" y2="100%">
22
+ <stop offset="0%" stopColor="#2F8A00" />
23
+ <stop offset="100%" stopColor="#90FF57" />
24
+ </linearGradient>
25
+ <linearGradient id="tanstack__g" x1="50%" x2="50%" y1="0%" y2="100%">
26
+ <stop offset="0%" stopColor="#2F8A00" />
27
+ <stop offset="100%" stopColor="#90FF57" />
28
+ </linearGradient>
29
+ <linearGradient id="tanstack__h" x1="50%" x2="50%" y1="0%" y2="100%">
30
+ <stop offset="0%" stopColor="#2F8A00" />
31
+ <stop offset="100%" stopColor="#90FF57" />
32
+ </linearGradient>
33
+ <linearGradient id="tanstack__i" x1="50%" x2="50%" y1="0%" y2="100%">
34
+ <stop offset="0%" stopColor="#2F8A00" />
35
+ <stop offset="100%" stopColor="#90FF57" />
36
+ </linearGradient>
37
+ <linearGradient id="tanstack__j" x1="50%" x2="50%" y1="0%" y2="100%">
38
+ <stop offset="0%" stopColor="#2F8A00" />
39
+ <stop offset="100%" stopColor="#90FF57" />
40
+ </linearGradient>
41
+ <linearGradient id="tanstack__k" x1="92.9%" x2="8.641%" y1="45.768%" y2="54.892%">
42
+ <stop offset="0%" stopColor="#EE2700" />
43
+ <stop offset="100%" stopColor="#FF008E" />
44
+ </linearGradient>
45
+ <linearGradient id="tanstack__l" x1="61.109%" x2="43.717%" y1="3.633%" y2="43.072%">
46
+ <stop offset="0%" stopColor="#FFF400" />
47
+ <stop offset="100%" stopColor="#3C8700" />
48
+ </linearGradient>
49
+ <linearGradient id="tanstack__m" x1="50%" x2="50%" y1="0%" y2="100%">
50
+ <stop offset="0%" stopColor="#FFDF00" />
51
+ <stop offset="100%" stopColor="#FF9D00" />
52
+ </linearGradient>
53
+ <linearGradient id="tanstack__n" x1="127.279%" x2="0%" y1="49.778%" y2="50.222%">
54
+ <stop offset="0%" stopColor="#FFA400" />
55
+ <stop offset="100%" stopColor="#FF5E00" />
56
+ </linearGradient>
57
+ <linearGradient id="tanstack__o" x1="127.279%" x2="0%" y1="47.531%" y2="52.469%">
58
+ <stop offset="0%" stopColor="#FFA400" />
59
+ <stop offset="100%" stopColor="#FF5E00" />
60
+ </linearGradient>
61
+ <linearGradient id="tanstack__p" x1="127.279%" x2="0%" y1="46.195%" y2="53.805%">
62
+ <stop offset="0%" stopColor="#FFA400" />
63
+ <stop offset="100%" stopColor="#FF5E00" />
64
+ </linearGradient>
65
+ <linearGradient id="tanstack__q" x1="127.279%" x2="0%" y1="35.33%" y2="64.67%">
66
+ <stop offset="0%" stopColor="#FFA400" />
67
+ <stop offset="100%" stopColor="#FF5E00" />
68
+ </linearGradient>
69
+ <linearGradient id="tanstack__r" x1="127.279%" x2="0%" y1="4.875%" y2="95.125%">
70
+ <stop offset="0%" stopColor="#FFA400" />
71
+ <stop offset="100%" stopColor="#FF5E00" />
72
+ </linearGradient>
73
+ <linearGradient id="tanstack__s" x1="78.334%" x2="31.668%" y1="0%" y2="100%">
74
+ <stop offset="0%" stopColor="#FFA400" />
75
+ <stop offset="100%" stopColor="#FF5E00" />
76
+ </linearGradient>
77
+ <linearGradient id="tanstack__t" x1="57.913%" x2="44.88%" y1="0%" y2="100%">
78
+ <stop offset="0%" stopColor="#FFA400" />
79
+ <stop offset="100%" stopColor="#FF5E00" />
80
+ </linearGradient>
81
+ <linearGradient id="tanstack__u" x1="50.495%" x2="49.68%" y1="0%" y2="100%">
82
+ <stop offset="0%" stopColor="#FFA400" />
83
+ <stop offset="100%" stopColor="#FF5E00" />
84
+ </linearGradient>
85
+ <circle id="tanstack__a" cx="308.5" cy="308.5" r="308.5" />
86
+ <circle id="tanstack__v" cx="307.5" cy="308.5" r="316.5" />
87
+ </defs>
88
+ <g fill="none" fillRule="evenodd" transform="translate(9 8)">
89
+ <mask id="tanstack__c" fill="#fff">
90
+ <use xlinkHref="#tanstack__a" />
91
+ </mask>
92
+ <use xlinkHref="#tanstack__a" fill="url(#tanstack__b)" />
93
+ <ellipse
94
+ cx="81.5"
95
+ cy="602.5"
96
+ fill="#015064"
97
+ stroke="#00CFE2"
98
+ strokeWidth="25"
99
+ mask="url(#tanstack__c)"
100
+ rx="214.5"
101
+ ry="185.968"
102
+ />
103
+ <ellipse
104
+ cx="535.5"
105
+ cy="602.5"
106
+ fill="#015064"
107
+ stroke="#00CFE2"
108
+ strokeWidth="25"
109
+ mask="url(#tanstack__c)"
110
+ rx="214.5"
111
+ ry="185.968"
112
+ />
113
+ <ellipse
114
+ cx="81.5"
115
+ cy="640.5"
116
+ fill="#015064"
117
+ stroke="#00A8B8"
118
+ strokeWidth="25"
119
+ mask="url(#tanstack__c)"
120
+ rx="214.5"
121
+ ry="185.968"
122
+ />
123
+ <ellipse
124
+ cx="535.5"
125
+ cy="640.5"
126
+ fill="#015064"
127
+ stroke="#00A8B8"
128
+ strokeWidth="25"
129
+ mask="url(#tanstack__c)"
130
+ rx="214.5"
131
+ ry="185.968"
132
+ />
133
+ <ellipse
134
+ cx="81.5"
135
+ cy="676.5"
136
+ fill="#015064"
137
+ stroke="#007782"
138
+ strokeWidth="25"
139
+ mask="url(#tanstack__c)"
140
+ rx="214.5"
141
+ ry="185.968"
142
+ />
143
+ <ellipse
144
+ cx="535.5"
145
+ cy="676.5"
146
+ fill="#015064"
147
+ stroke="#007782"
148
+ strokeWidth="25"
149
+ mask="url(#tanstack__c)"
150
+ rx="214.5"
151
+ ry="185.968"
152
+ />
153
+ <g mask="url(#tanstack__c)">
154
+ <path
155
+ fill="url(#tanstack__d)"
156
+ stroke="#6E3A00"
157
+ strokeWidth="6.088"
158
+ d="M98.318 88.007c7.691 37.104 16.643 72.442 26.856 106.013 10.212 33.571 25.57 68.934 46.07 106.088l-51.903 11.67c-10.057-60.01-17.232-99.172-21.525-117.487-4.293-18.315-10.989-51.434-20.089-99.357l20.591-6.927"
159
+ transform="scale(-1 1) rotate(25 -300.37 -553.013)"
160
+ />
161
+ <g stroke="#2F8A00">
162
+ <path
163
+ fill="url(#tanstack__e)"
164
+ strokeWidth="9.343"
165
+ d="M108.544 66.538s-13.54-21.305-37.417-27.785c-15.917-4.321-33.933.31-54.048 13.892C33.464 65.975 47.24 73.52 58.405 75.28c16.749 2.64 50.14-8.74 50.14-8.74Z"
166
+ transform="rotate(1 -6061.691 5926.397)"
167
+ />
168
+ <path
169
+ fill="url(#tanstack__f)"
170
+ strokeWidth="9.343"
171
+ d="M108.544 67.138s-47.187-5.997-81.077 19.936C4.873 104.362-3.782 137.794 1.502 187.369c28.42-29.22 48.758-50.836 61.016-64.846 18.387-21.016 46.026-55.385 46.026-55.385Z"
172
+ transform="rotate(1 -6061.691 5926.397)"
173
+ />
174
+ <path
175
+ fill="url(#tanstack__g)"
176
+ strokeWidth="9.343"
177
+ d="M108.544 66.538c-1.96-21.705 3.98-38.018 17.82-48.94C140.203 6.674 154.85.808 170.303 0c-4.865 21.527-12.373 36.314-22.524 44.361-10.151 8.048-23.23 15.44-39.236 22.177Z"
178
+ transform="rotate(1 -6061.691 5926.397)"
179
+ />
180
+ <path
181
+ fill="url(#tanstack__h)"
182
+ strokeWidth="9.343"
183
+ d="M108.544 67.138c29.838-31.486 61.061-42.776 93.669-33.869C234.82 42.176 253.749 60.785 259 89.096c-34.898-3.657-59.974-6.343-75.228-8.058-15.254-1.716-40.33-6.349-75.228-13.9Z"
184
+ transform="rotate(1 -6061.691 5926.397)"
185
+ />
186
+ <path
187
+ fill="url(#tanstack__i)"
188
+ strokeWidth="9.343"
189
+ d="M108.544 67.138c34.868-9.381 64.503-3.658 88.905 17.17 24.402 20.829 39.656 46.686 45.762 77.571-39.626-7.574-68.4-20.115-86.322-37.624a395.051 395.051 0 0 1-48.345-57.117Z"
190
+ transform="rotate(1 -6061.691 5926.397)"
191
+ />
192
+ <path
193
+ fill="url(#tanstack__j)"
194
+ strokeWidth="9.343"
195
+ d="M108.544 67.138C76.206 82.6 57.608 105.366 52.75 135.436c-4.858 30.07-.292 62.89 13.698 98.462 24.873-41.418 38.905-71.368 42.096-89.849 3.191-18.48 3.191-44.118 0-76.91Z"
196
+ transform="rotate(1 -6061.691 5926.397)"
197
+ />
198
+ <path
199
+ strokeLinecap="round"
200
+ strokeWidth="5.91"
201
+ d="M211.284 173.477c-13.851 21.992-23.291 42.022-28.32 60.093-5.03 18.071-8.175 33.143-9.436 45.216"
202
+ />
203
+ <path
204
+ strokeLinecap="round"
205
+ strokeWidth="5.91"
206
+ d="M209.814 176.884c-23.982 2.565-42.792 10.469-56.428 23.714-13.639 13.245-23.483 26.136-29.536 38.674M219.045 167.299c29.028-7.723 50.972-10.173 65.831-7.352 14.859 2.822 26.807 7.659 35.842 14.51M211.31 172.618c20.29 9.106 38.353 19.052 54.186 29.837 15.833 10.786 27.714 20.99 35.643 30.617"
207
+ />
208
+ </g>
209
+ <path
210
+ stroke="#830305"
211
+ strokeLinecap="round"
212
+ strokeLinejoin="bevel"
213
+ strokeWidth="6.937"
214
+ d="m409.379 398.157-23.176 18.556M328.04 375.516l-22.313 28.398M312.904 353.698l53.18 59.816"
215
+ />
216
+ <path
217
+ fill="url(#tanstack__k)"
218
+ d="M67.585 27.463H5.68C1.893 28.148 0 30.38 0 34.16c0 3.78 1.893 6.211 5.68 7.293h67.17l41.751-30.356c2.488-2.646 2.794-5.315.92-8.006s-4.6-3.626-8.177-2.803l-39.76 27.174Z"
219
+ transform="scale(-1 1) rotate(-9 2092.128 2856.854)"
220
+ />
221
+ <path
222
+ fill="#D8D8D8"
223
+ stroke="#FFF"
224
+ strokeLinecap="round"
225
+ strokeLinejoin="bevel"
226
+ strokeWidth="4.414"
227
+ d="m402.861 391.51.471-4.088M382.21 388.752l.472-4.087M361.546 385.404l.485-3.845M337.59 371.883l2.56-2.498M324.276 359.567l2.56-2.497"
228
+ />
229
+ </g>
230
+ <ellipse
231
+ cx="308.5"
232
+ cy="720.5"
233
+ fill="url(#tanstack__l)"
234
+ mask="url(#tanstack__c)"
235
+ rx="266"
236
+ ry="316.5"
237
+ />
238
+ <ellipse
239
+ cx="308.5"
240
+ cy="720.5"
241
+ stroke="#6DA300"
242
+ strokeOpacity=".502"
243
+ strokeWidth="26"
244
+ mask="url(#tanstack__c)"
245
+ rx="253"
246
+ ry="303.5"
247
+ />
248
+ <g mask="url(#tanstack__c)">
249
+ <g transform="translate(389 -32)">
250
+ <circle cx="168.5" cy="113.5" r="113.5" fill="url(#tanstack__m)" />
251
+ <circle
252
+ cx="168.5"
253
+ cy="113.5"
254
+ r="106"
255
+ stroke="#FFC900"
256
+ strokeOpacity=".529"
257
+ strokeWidth="15"
258
+ />
259
+ <path
260
+ stroke="url(#tanstack__n)"
261
+ strokeLinecap="round"
262
+ strokeLinejoin="bevel"
263
+ strokeWidth="12"
264
+ d="M30 113H0"
265
+ />
266
+ <path
267
+ stroke="url(#tanstack__o)"
268
+ strokeLinecap="round"
269
+ strokeLinejoin="bevel"
270
+ strokeWidth="12"
271
+ d="M33.5 79.5 7 74"
272
+ />
273
+ <path
274
+ stroke="url(#tanstack__p)"
275
+ strokeLinecap="round"
276
+ strokeLinejoin="bevel"
277
+ strokeWidth="12"
278
+ d="m34 146-29 8"
279
+ />
280
+ <path
281
+ stroke="url(#tanstack__q)"
282
+ strokeLinecap="round"
283
+ strokeLinejoin="bevel"
284
+ strokeWidth="12"
285
+ d="m45 177-24 13"
286
+ />
287
+ <path
288
+ stroke="url(#tanstack__r)"
289
+ strokeLinecap="round"
290
+ strokeLinejoin="bevel"
291
+ strokeWidth="12"
292
+ d="m67 204-20 19"
293
+ />
294
+ <path
295
+ stroke="url(#tanstack__s)"
296
+ strokeLinecap="round"
297
+ strokeLinejoin="bevel"
298
+ strokeWidth="12"
299
+ d="m94.373 227-13.834 22.847"
300
+ />
301
+ <path
302
+ stroke="url(#tanstack__t)"
303
+ strokeLinecap="round"
304
+ strokeLinejoin="bevel"
305
+ strokeWidth="12"
306
+ d="M127.5 243.5 120 268"
307
+ />
308
+ <path
309
+ stroke="url(#tanstack__u)"
310
+ strokeLinecap="round"
311
+ strokeLinejoin="bevel"
312
+ strokeWidth="12"
313
+ d="m167.5 252.5.5 24.5"
314
+ />
315
+ </g>
316
+ </g>
317
+ <circle cx="307.5" cy="308.5" r="304" stroke="#000" strokeWidth="25" />
318
+ </g>
319
+ </svg>
320
+ );
321
+ }
@@ -0,0 +1,16 @@
1
+ import type { ComponentProps } from "react";
2
+
3
+ export function TypescriptIcon(props: ComponentProps<"svg">) {
4
+ return (
5
+ <svg viewBox="0 0 256 256" preserveAspectRatio="xMidYMid" {...props}>
6
+ <path
7
+ d="M20 0h216c11.046 0 20 8.954 20 20v216c0 11.046-8.954 20-20 20H20c-11.046 0-20-8.954-20-20V20C0 8.954 8.954 0 20 0Z"
8
+ fill="#3178C6"
9
+ />
10
+ <path
11
+ d="M150.518 200.475v27.62c4.492 2.302 9.805 4.028 15.938 5.179 6.133 1.151 12.597 1.726 19.393 1.726 6.622 0 12.914-.633 18.874-1.899 5.96-1.266 11.187-3.352 15.678-6.257 4.492-2.906 8.048-6.704 10.669-11.394 2.62-4.689 3.93-10.486 3.93-17.391 0-5.006-.749-9.394-2.246-13.163a30.748 30.748 0 0 0-6.479-10.055c-2.821-2.935-6.205-5.567-10.149-7.898-3.945-2.33-8.394-4.531-13.347-6.602-3.628-1.497-6.881-2.949-9.761-4.359-2.879-1.41-5.327-2.848-7.342-4.316-2.016-1.467-3.571-3.021-4.665-4.661-1.094-1.64-1.641-3.495-1.641-5.567 0-1.899.489-3.61 1.468-5.135s2.362-2.834 4.147-3.927c1.785-1.094 3.973-1.942 6.565-2.547 2.591-.604 5.471-.906 8.638-.906 2.304 0 4.737.173 7.299.518 2.563.345 5.14.877 7.732 1.597a53.669 53.669 0 0 1 7.558 2.719 41.7 41.7 0 0 1 6.781 3.797v-25.807c-4.204-1.611-8.797-2.805-13.778-3.582-4.981-.777-10.697-1.165-17.147-1.165-6.565 0-12.784.705-18.658 2.115-5.874 1.409-11.043 3.61-15.506 6.602-4.463 2.993-7.99 6.805-10.582 11.437-2.591 4.632-3.887 10.17-3.887 16.615 0 8.228 2.375 15.248 7.127 21.06 4.751 5.811 11.963 10.731 21.638 14.759a291.458 291.458 0 0 1 10.625 4.575c3.283 1.496 6.119 3.049 8.509 4.66 2.39 1.611 4.276 3.366 5.658 5.265 1.382 1.899 2.073 4.057 2.073 6.474a9.901 9.901 0 0 1-1.296 4.963c-.863 1.524-2.174 2.848-3.93 3.97-1.756 1.122-3.945 1.999-6.565 2.632-2.62.633-5.687.95-9.2.95-5.989 0-11.92-1.05-17.794-3.151-5.875-2.1-11.317-5.25-16.327-9.451Zm-46.036-68.733H140V109H41v22.742h35.345V233h28.137V131.742Z"
12
+ fill="#FFF"
13
+ />
14
+ </svg>
15
+ );
16
+ }
@@ -0,0 +1 @@
1
+ export { LandingPage } from "@/features/landing/components/LandingPage";
@@ -0,0 +1 @@
1
+ export { projectSchema, type ProjectInput } from "@/features/landing/schemas/project.schema";
@@ -0,0 +1,7 @@
1
+ import { z } from "zod";
2
+
3
+ export const projectSchema = z.object({
4
+ name: z.string().min(3, "Project name must be at least 3 characters").max(50),
5
+ });
6
+
7
+ export type ProjectInput = z.infer<typeof projectSchema>;
@@ -0,0 +1,18 @@
1
+ import { create } from "zustand";
2
+
3
+ type CounterState = {
4
+ count: number;
5
+ increment: () => void;
6
+ decrement: () => void;
7
+ reset: () => void;
8
+ };
9
+
10
+ /**
11
+ * Example Zustand store. Delete once you have real client state to manage.
12
+ */
13
+ export const useCounterStore = create<CounterState>((set) => ({
14
+ count: 0,
15
+ increment: () => set((state) => ({ count: state.count + 1 })),
16
+ decrement: () => set((state) => ({ count: state.count - 1 })),
17
+ reset: () => set({ count: 0 }),
18
+ }));
@@ -0,0 +1 @@
1
+ export { useCounterStore } from "@/features/landing/stores/counter.store";
@@ -0,0 +1 @@
1
+ export type { User } from "@/features/landing/types/user.types";
@@ -0,0 +1,9 @@
1
+ export type User = {
2
+ id: number;
3
+ name: string;
4
+ username: string;
5
+ email: string;
6
+ address: {
7
+ city: string;
8
+ };
9
+ };
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Formats a date using `Intl.DateTimeFormat`. Kept dependency-free on purpose —
3
+ * add `date-fns` only if you need heavier date arithmetic.
4
+ */
5
+ export function formatDate(date: Date | string, locale = "en-US") {
6
+ const value = typeof date === "string" ? new Date(date) : date;
7
+
8
+ return new Intl.DateTimeFormat(locale, {
9
+ year: "numeric",
10
+ month: "long",
11
+ day: "numeric",
12
+ }).format(value);
13
+ }
@@ -0,0 +1 @@
1
+ export { formatDate } from "@/helpers/format-date";
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shared hooks promoted out of features (Rule of Three).
3
+ * Feature-scoped hooks live under `src/features/[feature]/hooks`.
4
+ */
5
+ export {};
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Lightweight native `fetch` wrapper.
3
+ *
4
+ * Zero external HTTP dependencies (no axios/ofetch) so it stays 100%
5
+ * compatible with Next.js `fetch` caching/revalidation (`cache`, `next.revalidate`, `next.tags`).
6
+ */
7
+
8
+ export class ApiError extends Error {
9
+ readonly status: number;
10
+ readonly data: unknown;
11
+
12
+ constructor(message: string, status: number, data: unknown) {
13
+ super(message);
14
+ this.name = "ApiError";
15
+ this.status = status;
16
+ this.data = data;
17
+ }
18
+ }
19
+
20
+ type RequestOptions = Omit<RequestInit, "body"> & {
21
+ body?: unknown;
22
+ retry?: number;
23
+ retryDelayMs?: number;
24
+ };
25
+
26
+ const DEFAULT_RETRY = 0;
27
+ const DEFAULT_RETRY_DELAY_MS = 300;
28
+
29
+ function buildHeaders(init?: HeadersInit): Headers {
30
+ const headers = new Headers(init);
31
+
32
+ if (!headers.has("Content-Type")) {
33
+ headers.set("Content-Type", "application/json");
34
+ }
35
+
36
+ // FIXME: attach auth token once an auth solution is chosen, e.g.:
37
+ // const token = await getAuthToken();
38
+ // if (token) headers.set("Authorization", `Bearer ${token}`);
39
+
40
+ return headers;
41
+ }
42
+
43
+ async function parseResponse<T>(response: Response): Promise<T> {
44
+ const contentType = response.headers.get("content-type") ?? "";
45
+ const isJson = contentType.includes("application/json");
46
+ const payload = isJson ? await response.json() : await response.text();
47
+
48
+ if (!response.ok) {
49
+ throw new ApiError(`Request failed with status ${response.status}`, response.status, payload);
50
+ }
51
+
52
+ return payload as T;
53
+ }
54
+
55
+ async function sleep(ms: number) {
56
+ await new Promise((resolve) => setTimeout(resolve, ms));
57
+ }
58
+
59
+ async function request<T>(url: string, options: RequestOptions = {}): Promise<T> {
60
+ const { body, retry = DEFAULT_RETRY, retryDelayMs = DEFAULT_RETRY_DELAY_MS, ...rest } = options;
61
+
62
+ let attempt = 0;
63
+
64
+ while (true) {
65
+ try {
66
+ const response = await fetch(url, {
67
+ ...rest,
68
+ headers: buildHeaders(rest.headers),
69
+ body: body !== undefined ? JSON.stringify(body) : undefined,
70
+ });
71
+
72
+ return await parseResponse<T>(response);
73
+ } catch (error) {
74
+ const isLastAttempt = attempt >= retry;
75
+ const isServerOrNetworkError = !(error instanceof ApiError) || error.status >= 500;
76
+
77
+ if (isLastAttempt || !isServerOrNetworkError) {
78
+ throw error;
79
+ }
80
+
81
+ attempt += 1;
82
+ await sleep(retryDelayMs * attempt);
83
+ }
84
+ }
85
+ }
86
+
87
+ export const api = {
88
+ get: <T>(url: string, options?: RequestOptions) => request<T>(url, { ...options, method: "GET" }),
89
+ post: <T>(url: string, body?: unknown, options?: RequestOptions) =>
90
+ request<T>(url, { ...options, method: "POST", body }),
91
+ put: <T>(url: string, body?: unknown, options?: RequestOptions) =>
92
+ request<T>(url, { ...options, method: "PUT", body }),
93
+ patch: <T>(url: string, body?: unknown, options?: RequestOptions) =>
94
+ request<T>(url, { ...options, method: "PATCH", body }),
95
+ delete: <T>(url: string, options?: RequestOptions) =>
96
+ request<T>(url, { ...options, method: "DELETE" }),
97
+ };
@@ -0,0 +1,18 @@
1
+ import { QueryClient } from "@tanstack/react-query";
2
+
3
+ /**
4
+ * Creates a new QueryClient with sane defaults.
5
+ * A factory (instead of a singleton) avoids sharing cache across requests
6
+ * in server contexts and across users in a serverless environment.
7
+ */
8
+ export function makeQueryClient() {
9
+ return new QueryClient({
10
+ defaultOptions: {
11
+ queries: {
12
+ staleTime: 60 * 1000,
13
+ refetchOnWindowFocus: false,
14
+ retry: 1,
15
+ },
16
+ },
17
+ });
18
+ }
@@ -0,0 +1,12 @@
1
+ import { clsx, type ClassValue } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+
4
+ /**
5
+ * Merges Tailwind class names safely, resolving conflicting utility classes.
6
+ *
7
+ * @example
8
+ * cn("px-2 py-1", condition && "bg-primary", "px-4") // => "py-1 bg-primary px-4"
9
+ */
10
+ export function cn(...inputs: ClassValue[]) {
11
+ return twMerge(clsx(inputs));
12
+ }
@@ -0,0 +1,15 @@
1
+ import { Toaster } from "sonner";
2
+
3
+ import { QueryProvider } from "@/providers/QueryProvider";
4
+ import { ThemeProvider } from "@/providers/ThemeProvider";
5
+
6
+ export function Providers({ children }: { children: React.ReactNode }) {
7
+ return (
8
+ <ThemeProvider attribute="class" defaultTheme="system" enableSystem disableTransitionOnChange>
9
+ <QueryProvider>
10
+ {children}
11
+ <Toaster richColors position="bottom-right" closeButton />
12
+ </QueryProvider>
13
+ </ThemeProvider>
14
+ );
15
+ }
@@ -0,0 +1,19 @@
1
+ "use client";
2
+
3
+ import { useState } from "react";
4
+
5
+ import { QueryClientProvider } from "@tanstack/react-query";
6
+ import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
7
+
8
+ import { makeQueryClient } from "@/lib/query-client";
9
+
10
+ export function QueryProvider({ children }: { children: React.ReactNode }) {
11
+ const [queryClient] = useState(() => makeQueryClient());
12
+
13
+ return (
14
+ <QueryClientProvider client={queryClient}>
15
+ {children}
16
+ <ReactQueryDevtools initialIsOpen={false} />
17
+ </QueryClientProvider>
18
+ );
19
+ }
@@ -0,0 +1,9 @@
1
+ "use client";
2
+
3
+ import type { ComponentProps } from "react";
4
+
5
+ import { ThemeProvider as NextThemesProvider } from "next-themes";
6
+
7
+ export function ThemeProvider({ children, ...props }: ComponentProps<typeof NextThemesProvider>) {
8
+ return <NextThemesProvider {...props}>{children}</NextThemesProvider>;
9
+ }
@@ -0,0 +1 @@
1
+ export { Providers } from "@/providers/Providers";
@@ -0,0 +1,6 @@
1
+ import type { NextRequest } from "next/server";
2
+ import { NextResponse } from "next/server";
3
+
4
+ export function proxy(_request: NextRequest) {
5
+ return NextResponse.next();
6
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shared Zod schemas promoted out of features (Rule of Three).
3
+ * Feature-scoped schemas live under `src/features/[feature]/schemas`.
4
+ */
5
+ export {};
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shared client stores promoted out of features (Rule of Three).
3
+ * Feature-scoped stores live under `src/features/[feature]/stores`.
4
+ */
5
+ export {};