@linguanahq/cli 0.1.0

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 (412) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +43 -0
  3. package/dist/index.js +1543 -0
  4. package/dist/templates/blog/react/.env.example +15 -0
  5. package/dist/templates/blog/react/ASSETS.md +1 -0
  6. package/dist/templates/blog/react/DEPLOY.md +23 -0
  7. package/dist/templates/blog/react/LICENSE +21 -0
  8. package/dist/templates/blog/react/README.md +36 -0
  9. package/dist/templates/blog/react/_gitignore +11 -0
  10. package/dist/templates/blog/react/index.html +2 -0
  11. package/dist/templates/blog/react/linguana.json +10 -0
  12. package/dist/templates/blog/react/package.json +34 -0
  13. package/dist/templates/blog/react/public/assets/scene-1.svg +1 -0
  14. package/dist/templates/blog/react/public/assets/scene-2.svg +1 -0
  15. package/dist/templates/blog/react/public/assets/scene-3.svg +1 -0
  16. package/dist/templates/blog/react/public/assets/scene-4.svg +1 -0
  17. package/dist/templates/blog/react/public/assets/scene-5.svg +1 -0
  18. package/dist/templates/blog/react/public/assets/scene-6.svg +1 -0
  19. package/dist/templates/blog/react/src/App.tsx +465 -0
  20. package/dist/templates/blog/react/src/Copy.tsx +322 -0
  21. package/dist/templates/blog/react/src/demo-messages.ts +221 -0
  22. package/dist/templates/blog/react/src/i18n.ts +62 -0
  23. package/dist/templates/blog/react/src/main.tsx +11 -0
  24. package/dist/templates/blog/react/src/messages.ts +71 -0
  25. package/dist/templates/blog/react/src/model.ts +128 -0
  26. package/dist/templates/blog/react/src/styles.css +1159 -0
  27. package/dist/templates/blog/react/src/vite-env.d.ts +1 -0
  28. package/dist/templates/blog/react/tsconfig.json +23 -0
  29. package/dist/templates/blog/react/vite.config.ts +36 -0
  30. package/dist/templates/blog/react/wrangler.jsonc +8 -0
  31. package/dist/templates/blog/solidjs/.env.example +15 -0
  32. package/dist/templates/blog/solidjs/ASSETS.md +1 -0
  33. package/dist/templates/blog/solidjs/DEPLOY.md +23 -0
  34. package/dist/templates/blog/solidjs/LICENSE +21 -0
  35. package/dist/templates/blog/solidjs/README.md +36 -0
  36. package/dist/templates/blog/solidjs/_gitignore +11 -0
  37. package/dist/templates/blog/solidjs/index.html +2 -0
  38. package/dist/templates/blog/solidjs/linguana.json +10 -0
  39. package/dist/templates/blog/solidjs/package.json +31 -0
  40. package/dist/templates/blog/solidjs/public/assets/scene-1.svg +1 -0
  41. package/dist/templates/blog/solidjs/public/assets/scene-2.svg +1 -0
  42. package/dist/templates/blog/solidjs/public/assets/scene-3.svg +1 -0
  43. package/dist/templates/blog/solidjs/public/assets/scene-4.svg +1 -0
  44. package/dist/templates/blog/solidjs/public/assets/scene-5.svg +1 -0
  45. package/dist/templates/blog/solidjs/public/assets/scene-6.svg +1 -0
  46. package/dist/templates/blog/solidjs/src/App.tsx +457 -0
  47. package/dist/templates/blog/solidjs/src/Copy.tsx +322 -0
  48. package/dist/templates/blog/solidjs/src/demo-messages.ts +221 -0
  49. package/dist/templates/blog/solidjs/src/i18n.ts +62 -0
  50. package/dist/templates/blog/solidjs/src/main.tsx +14 -0
  51. package/dist/templates/blog/solidjs/src/messages.ts +71 -0
  52. package/dist/templates/blog/solidjs/src/model.ts +128 -0
  53. package/dist/templates/blog/solidjs/src/styles.css +1159 -0
  54. package/dist/templates/blog/solidjs/src/vite-env.d.ts +1 -0
  55. package/dist/templates/blog/solidjs/tsconfig.json +24 -0
  56. package/dist/templates/blog/solidjs/vite.config.ts +36 -0
  57. package/dist/templates/blog/solidjs/wrangler.jsonc +8 -0
  58. package/dist/templates/blog/svelte/.env.example +15 -0
  59. package/dist/templates/blog/svelte/ASSETS.md +1 -0
  60. package/dist/templates/blog/svelte/DEPLOY.md +23 -0
  61. package/dist/templates/blog/svelte/LICENSE +21 -0
  62. package/dist/templates/blog/svelte/README.md +36 -0
  63. package/dist/templates/blog/svelte/_gitignore +11 -0
  64. package/dist/templates/blog/svelte/index.html +2 -0
  65. package/dist/templates/blog/svelte/linguana.json +10 -0
  66. package/dist/templates/blog/svelte/package.json +32 -0
  67. package/dist/templates/blog/svelte/public/assets/scene-1.svg +1 -0
  68. package/dist/templates/blog/svelte/public/assets/scene-2.svg +1 -0
  69. package/dist/templates/blog/svelte/public/assets/scene-3.svg +1 -0
  70. package/dist/templates/blog/svelte/public/assets/scene-4.svg +1 -0
  71. package/dist/templates/blog/svelte/public/assets/scene-5.svg +1 -0
  72. package/dist/templates/blog/svelte/public/assets/scene-6.svg +1 -0
  73. package/dist/templates/blog/svelte/src/App.svelte +196 -0
  74. package/dist/templates/blog/svelte/src/Copy.svelte +60 -0
  75. package/dist/templates/blog/svelte/src/Root.svelte +11 -0
  76. package/dist/templates/blog/svelte/src/demo-messages.ts +221 -0
  77. package/dist/templates/blog/svelte/src/i18n.ts +62 -0
  78. package/dist/templates/blog/svelte/src/main.ts +5 -0
  79. package/dist/templates/blog/svelte/src/messages.ts +71 -0
  80. package/dist/templates/blog/svelte/src/model.ts +128 -0
  81. package/dist/templates/blog/svelte/src/styles.css +1159 -0
  82. package/dist/templates/blog/svelte/src/vite-env.d.ts +1 -0
  83. package/dist/templates/blog/svelte/svelte.config.js +2 -0
  84. package/dist/templates/blog/svelte/tsconfig.json +23 -0
  85. package/dist/templates/blog/svelte/vite.config.ts +36 -0
  86. package/dist/templates/blog/svelte/wrangler.jsonc +8 -0
  87. package/dist/templates/blog/tanstack-start/.env.example +15 -0
  88. package/dist/templates/blog/tanstack-start/ASSETS.md +1 -0
  89. package/dist/templates/blog/tanstack-start/DEPLOY.md +23 -0
  90. package/dist/templates/blog/tanstack-start/LICENSE +21 -0
  91. package/dist/templates/blog/tanstack-start/README.md +36 -0
  92. package/dist/templates/blog/tanstack-start/_gitignore +11 -0
  93. package/dist/templates/blog/tanstack-start/linguana.json +10 -0
  94. package/dist/templates/blog/tanstack-start/nitro.config.ts +2 -0
  95. package/dist/templates/blog/tanstack-start/package.json +42 -0
  96. package/dist/templates/blog/tanstack-start/public/assets/scene-1.svg +1 -0
  97. package/dist/templates/blog/tanstack-start/public/assets/scene-2.svg +1 -0
  98. package/dist/templates/blog/tanstack-start/public/assets/scene-3.svg +1 -0
  99. package/dist/templates/blog/tanstack-start/public/assets/scene-4.svg +1 -0
  100. package/dist/templates/blog/tanstack-start/public/assets/scene-5.svg +1 -0
  101. package/dist/templates/blog/tanstack-start/public/assets/scene-6.svg +1 -0
  102. package/dist/templates/blog/tanstack-start/src/App.tsx +450 -0
  103. package/dist/templates/blog/tanstack-start/src/Copy.tsx +322 -0
  104. package/dist/templates/blog/tanstack-start/src/demo-messages.ts +221 -0
  105. package/dist/templates/blog/tanstack-start/src/i18n.ts +62 -0
  106. package/dist/templates/blog/tanstack-start/src/locale-server.ts +54 -0
  107. package/dist/templates/blog/tanstack-start/src/messages.ts +71 -0
  108. package/dist/templates/blog/tanstack-start/src/model.ts +128 -0
  109. package/dist/templates/blog/tanstack-start/src/router.tsx +10 -0
  110. package/dist/templates/blog/tanstack-start/src/routes/$.tsx +7 -0
  111. package/dist/templates/blog/tanstack-start/src/routes/__root.tsx +50 -0
  112. package/dist/templates/blog/tanstack-start/src/routes/index.tsx +5 -0
  113. package/dist/templates/blog/tanstack-start/src/styles.css +1159 -0
  114. package/dist/templates/blog/tanstack-start/src/vite-env.d.ts +1 -0
  115. package/dist/templates/blog/tanstack-start/tsconfig.json +23 -0
  116. package/dist/templates/blog/tanstack-start/vite.config.ts +50 -0
  117. package/dist/templates/blog/tanstack-start/wrangler.jsonc +12 -0
  118. package/dist/templates/blog/vue/.env.example +15 -0
  119. package/dist/templates/blog/vue/ASSETS.md +1 -0
  120. package/dist/templates/blog/vue/DEPLOY.md +23 -0
  121. package/dist/templates/blog/vue/LICENSE +21 -0
  122. package/dist/templates/blog/vue/README.md +36 -0
  123. package/dist/templates/blog/vue/_gitignore +11 -0
  124. package/dist/templates/blog/vue/index.html +2 -0
  125. package/dist/templates/blog/vue/linguana.json +10 -0
  126. package/dist/templates/blog/vue/package.json +34 -0
  127. package/dist/templates/blog/vue/public/assets/scene-1.svg +1 -0
  128. package/dist/templates/blog/vue/public/assets/scene-2.svg +1 -0
  129. package/dist/templates/blog/vue/public/assets/scene-3.svg +1 -0
  130. package/dist/templates/blog/vue/public/assets/scene-4.svg +1 -0
  131. package/dist/templates/blog/vue/public/assets/scene-5.svg +1 -0
  132. package/dist/templates/blog/vue/public/assets/scene-6.svg +1 -0
  133. package/dist/templates/blog/vue/src/App.vue +188 -0
  134. package/dist/templates/blog/vue/src/Copy.vue +59 -0
  135. package/dist/templates/blog/vue/src/demo-messages.ts +221 -0
  136. package/dist/templates/blog/vue/src/i18n.ts +62 -0
  137. package/dist/templates/blog/vue/src/main.ts +7 -0
  138. package/dist/templates/blog/vue/src/messages.ts +71 -0
  139. package/dist/templates/blog/vue/src/model.ts +128 -0
  140. package/dist/templates/blog/vue/src/styles.css +1159 -0
  141. package/dist/templates/blog/vue/src/vite-env.d.ts +1 -0
  142. package/dist/templates/blog/vue/tsconfig.json +23 -0
  143. package/dist/templates/blog/vue/vite.config.ts +36 -0
  144. package/dist/templates/blog/vue/wrangler.jsonc +8 -0
  145. package/dist/templates/saas/react/.env.example +15 -0
  146. package/dist/templates/saas/react/ASSETS.md +1 -0
  147. package/dist/templates/saas/react/DEPLOY.md +23 -0
  148. package/dist/templates/saas/react/LICENSE +21 -0
  149. package/dist/templates/saas/react/README.md +36 -0
  150. package/dist/templates/saas/react/_gitignore +11 -0
  151. package/dist/templates/saas/react/index.html +2 -0
  152. package/dist/templates/saas/react/linguana.json +10 -0
  153. package/dist/templates/saas/react/package.json +34 -0
  154. package/dist/templates/saas/react/src/App.tsx +631 -0
  155. package/dist/templates/saas/react/src/Copy.tsx +380 -0
  156. package/dist/templates/saas/react/src/demo-messages.ts +228 -0
  157. package/dist/templates/saas/react/src/i18n.ts +62 -0
  158. package/dist/templates/saas/react/src/main.tsx +11 -0
  159. package/dist/templates/saas/react/src/messages.ts +77 -0
  160. package/dist/templates/saas/react/src/model.ts +73 -0
  161. package/dist/templates/saas/react/src/styles.css +1159 -0
  162. package/dist/templates/saas/react/src/vite-env.d.ts +1 -0
  163. package/dist/templates/saas/react/tsconfig.json +23 -0
  164. package/dist/templates/saas/react/vite.config.ts +36 -0
  165. package/dist/templates/saas/react/wrangler.jsonc +8 -0
  166. package/dist/templates/saas/solidjs/.env.example +15 -0
  167. package/dist/templates/saas/solidjs/ASSETS.md +1 -0
  168. package/dist/templates/saas/solidjs/DEPLOY.md +23 -0
  169. package/dist/templates/saas/solidjs/LICENSE +21 -0
  170. package/dist/templates/saas/solidjs/README.md +36 -0
  171. package/dist/templates/saas/solidjs/_gitignore +11 -0
  172. package/dist/templates/saas/solidjs/index.html +2 -0
  173. package/dist/templates/saas/solidjs/linguana.json +10 -0
  174. package/dist/templates/saas/solidjs/package.json +31 -0
  175. package/dist/templates/saas/solidjs/src/App.tsx +629 -0
  176. package/dist/templates/saas/solidjs/src/Copy.tsx +380 -0
  177. package/dist/templates/saas/solidjs/src/demo-messages.ts +228 -0
  178. package/dist/templates/saas/solidjs/src/i18n.ts +62 -0
  179. package/dist/templates/saas/solidjs/src/main.tsx +14 -0
  180. package/dist/templates/saas/solidjs/src/messages.ts +77 -0
  181. package/dist/templates/saas/solidjs/src/model.ts +73 -0
  182. package/dist/templates/saas/solidjs/src/styles.css +1159 -0
  183. package/dist/templates/saas/solidjs/src/vite-env.d.ts +1 -0
  184. package/dist/templates/saas/solidjs/tsconfig.json +24 -0
  185. package/dist/templates/saas/solidjs/vite.config.ts +36 -0
  186. package/dist/templates/saas/solidjs/wrangler.jsonc +8 -0
  187. package/dist/templates/saas/svelte/.env.example +15 -0
  188. package/dist/templates/saas/svelte/ASSETS.md +1 -0
  189. package/dist/templates/saas/svelte/DEPLOY.md +23 -0
  190. package/dist/templates/saas/svelte/LICENSE +21 -0
  191. package/dist/templates/saas/svelte/README.md +36 -0
  192. package/dist/templates/saas/svelte/_gitignore +11 -0
  193. package/dist/templates/saas/svelte/index.html +2 -0
  194. package/dist/templates/saas/svelte/linguana.json +10 -0
  195. package/dist/templates/saas/svelte/package.json +32 -0
  196. package/dist/templates/saas/svelte/src/App.svelte +252 -0
  197. package/dist/templates/saas/svelte/src/Copy.svelte +74 -0
  198. package/dist/templates/saas/svelte/src/Root.svelte +11 -0
  199. package/dist/templates/saas/svelte/src/demo-messages.ts +228 -0
  200. package/dist/templates/saas/svelte/src/i18n.ts +62 -0
  201. package/dist/templates/saas/svelte/src/main.ts +5 -0
  202. package/dist/templates/saas/svelte/src/messages.ts +77 -0
  203. package/dist/templates/saas/svelte/src/model.ts +73 -0
  204. package/dist/templates/saas/svelte/src/styles.css +1159 -0
  205. package/dist/templates/saas/svelte/src/vite-env.d.ts +1 -0
  206. package/dist/templates/saas/svelte/svelte.config.js +2 -0
  207. package/dist/templates/saas/svelte/tsconfig.json +23 -0
  208. package/dist/templates/saas/svelte/vite.config.ts +36 -0
  209. package/dist/templates/saas/svelte/wrangler.jsonc +8 -0
  210. package/dist/templates/saas/tanstack-start/.env.example +15 -0
  211. package/dist/templates/saas/tanstack-start/ASSETS.md +1 -0
  212. package/dist/templates/saas/tanstack-start/DEPLOY.md +23 -0
  213. package/dist/templates/saas/tanstack-start/LICENSE +21 -0
  214. package/dist/templates/saas/tanstack-start/README.md +36 -0
  215. package/dist/templates/saas/tanstack-start/_gitignore +11 -0
  216. package/dist/templates/saas/tanstack-start/linguana.json +10 -0
  217. package/dist/templates/saas/tanstack-start/nitro.config.ts +2 -0
  218. package/dist/templates/saas/tanstack-start/package.json +42 -0
  219. package/dist/templates/saas/tanstack-start/src/App.tsx +616 -0
  220. package/dist/templates/saas/tanstack-start/src/Copy.tsx +380 -0
  221. package/dist/templates/saas/tanstack-start/src/demo-messages.ts +228 -0
  222. package/dist/templates/saas/tanstack-start/src/i18n.ts +62 -0
  223. package/dist/templates/saas/tanstack-start/src/locale-server.ts +54 -0
  224. package/dist/templates/saas/tanstack-start/src/messages.ts +77 -0
  225. package/dist/templates/saas/tanstack-start/src/model.ts +73 -0
  226. package/dist/templates/saas/tanstack-start/src/router.tsx +10 -0
  227. package/dist/templates/saas/tanstack-start/src/routes/$.tsx +7 -0
  228. package/dist/templates/saas/tanstack-start/src/routes/__root.tsx +50 -0
  229. package/dist/templates/saas/tanstack-start/src/routes/index.tsx +5 -0
  230. package/dist/templates/saas/tanstack-start/src/styles.css +1159 -0
  231. package/dist/templates/saas/tanstack-start/src/vite-env.d.ts +1 -0
  232. package/dist/templates/saas/tanstack-start/tsconfig.json +23 -0
  233. package/dist/templates/saas/tanstack-start/vite.config.ts +50 -0
  234. package/dist/templates/saas/tanstack-start/wrangler.jsonc +12 -0
  235. package/dist/templates/saas/vue/.env.example +15 -0
  236. package/dist/templates/saas/vue/ASSETS.md +1 -0
  237. package/dist/templates/saas/vue/DEPLOY.md +23 -0
  238. package/dist/templates/saas/vue/LICENSE +21 -0
  239. package/dist/templates/saas/vue/README.md +36 -0
  240. package/dist/templates/saas/vue/_gitignore +11 -0
  241. package/dist/templates/saas/vue/index.html +2 -0
  242. package/dist/templates/saas/vue/linguana.json +10 -0
  243. package/dist/templates/saas/vue/package.json +34 -0
  244. package/dist/templates/saas/vue/src/App.vue +244 -0
  245. package/dist/templates/saas/vue/src/Copy.vue +73 -0
  246. package/dist/templates/saas/vue/src/demo-messages.ts +228 -0
  247. package/dist/templates/saas/vue/src/i18n.ts +62 -0
  248. package/dist/templates/saas/vue/src/main.ts +7 -0
  249. package/dist/templates/saas/vue/src/messages.ts +77 -0
  250. package/dist/templates/saas/vue/src/model.ts +73 -0
  251. package/dist/templates/saas/vue/src/styles.css +1159 -0
  252. package/dist/templates/saas/vue/src/vite-env.d.ts +1 -0
  253. package/dist/templates/saas/vue/tsconfig.json +23 -0
  254. package/dist/templates/saas/vue/vite.config.ts +36 -0
  255. package/dist/templates/saas/vue/wrangler.jsonc +8 -0
  256. package/dist/templates/storefront/react/.env.example +15 -0
  257. package/dist/templates/storefront/react/ASSETS.md +1 -0
  258. package/dist/templates/storefront/react/DEPLOY.md +23 -0
  259. package/dist/templates/storefront/react/LICENSE +21 -0
  260. package/dist/templates/storefront/react/README.md +36 -0
  261. package/dist/templates/storefront/react/_gitignore +11 -0
  262. package/dist/templates/storefront/react/index.html +2 -0
  263. package/dist/templates/storefront/react/linguana.json +10 -0
  264. package/dist/templates/storefront/react/package.json +34 -0
  265. package/dist/templates/storefront/react/public/assets/collection.svg +1 -0
  266. package/dist/templates/storefront/react/public/assets/product-1.svg +1 -0
  267. package/dist/templates/storefront/react/public/assets/product-2.svg +1 -0
  268. package/dist/templates/storefront/react/public/assets/product-3.svg +1 -0
  269. package/dist/templates/storefront/react/public/assets/product-4.svg +1 -0
  270. package/dist/templates/storefront/react/public/assets/product-5.svg +1 -0
  271. package/dist/templates/storefront/react/public/assets/product-6.svg +1 -0
  272. package/dist/templates/storefront/react/public/assets/product-7.svg +1 -0
  273. package/dist/templates/storefront/react/public/assets/product-8.svg +1 -0
  274. package/dist/templates/storefront/react/src/App.tsx +616 -0
  275. package/dist/templates/storefront/react/src/Copy.tsx +304 -0
  276. package/dist/templates/storefront/react/src/demo-messages.ts +205 -0
  277. package/dist/templates/storefront/react/src/i18n.ts +64 -0
  278. package/dist/templates/storefront/react/src/main.tsx +11 -0
  279. package/dist/templates/storefront/react/src/messages.ts +71 -0
  280. package/dist/templates/storefront/react/src/model.ts +146 -0
  281. package/dist/templates/storefront/react/src/styles.css +1159 -0
  282. package/dist/templates/storefront/react/src/vite-env.d.ts +1 -0
  283. package/dist/templates/storefront/react/tsconfig.json +23 -0
  284. package/dist/templates/storefront/react/vite.config.ts +36 -0
  285. package/dist/templates/storefront/react/wrangler.jsonc +8 -0
  286. package/dist/templates/storefront/solidjs/.env.example +15 -0
  287. package/dist/templates/storefront/solidjs/ASSETS.md +1 -0
  288. package/dist/templates/storefront/solidjs/DEPLOY.md +23 -0
  289. package/dist/templates/storefront/solidjs/LICENSE +21 -0
  290. package/dist/templates/storefront/solidjs/README.md +36 -0
  291. package/dist/templates/storefront/solidjs/_gitignore +11 -0
  292. package/dist/templates/storefront/solidjs/index.html +2 -0
  293. package/dist/templates/storefront/solidjs/linguana.json +10 -0
  294. package/dist/templates/storefront/solidjs/package.json +31 -0
  295. package/dist/templates/storefront/solidjs/public/assets/collection.svg +1 -0
  296. package/dist/templates/storefront/solidjs/public/assets/product-1.svg +1 -0
  297. package/dist/templates/storefront/solidjs/public/assets/product-2.svg +1 -0
  298. package/dist/templates/storefront/solidjs/public/assets/product-3.svg +1 -0
  299. package/dist/templates/storefront/solidjs/public/assets/product-4.svg +1 -0
  300. package/dist/templates/storefront/solidjs/public/assets/product-5.svg +1 -0
  301. package/dist/templates/storefront/solidjs/public/assets/product-6.svg +1 -0
  302. package/dist/templates/storefront/solidjs/public/assets/product-7.svg +1 -0
  303. package/dist/templates/storefront/solidjs/public/assets/product-8.svg +1 -0
  304. package/dist/templates/storefront/solidjs/src/App.tsx +612 -0
  305. package/dist/templates/storefront/solidjs/src/Copy.tsx +304 -0
  306. package/dist/templates/storefront/solidjs/src/demo-messages.ts +205 -0
  307. package/dist/templates/storefront/solidjs/src/i18n.ts +64 -0
  308. package/dist/templates/storefront/solidjs/src/main.tsx +14 -0
  309. package/dist/templates/storefront/solidjs/src/messages.ts +71 -0
  310. package/dist/templates/storefront/solidjs/src/model.ts +146 -0
  311. package/dist/templates/storefront/solidjs/src/styles.css +1159 -0
  312. package/dist/templates/storefront/solidjs/src/vite-env.d.ts +1 -0
  313. package/dist/templates/storefront/solidjs/tsconfig.json +24 -0
  314. package/dist/templates/storefront/solidjs/vite.config.ts +36 -0
  315. package/dist/templates/storefront/solidjs/wrangler.jsonc +8 -0
  316. package/dist/templates/storefront/svelte/.env.example +15 -0
  317. package/dist/templates/storefront/svelte/ASSETS.md +1 -0
  318. package/dist/templates/storefront/svelte/DEPLOY.md +23 -0
  319. package/dist/templates/storefront/svelte/LICENSE +21 -0
  320. package/dist/templates/storefront/svelte/README.md +36 -0
  321. package/dist/templates/storefront/svelte/_gitignore +11 -0
  322. package/dist/templates/storefront/svelte/index.html +2 -0
  323. package/dist/templates/storefront/svelte/linguana.json +10 -0
  324. package/dist/templates/storefront/svelte/package.json +32 -0
  325. package/dist/templates/storefront/svelte/public/assets/collection.svg +1 -0
  326. package/dist/templates/storefront/svelte/public/assets/product-1.svg +1 -0
  327. package/dist/templates/storefront/svelte/public/assets/product-2.svg +1 -0
  328. package/dist/templates/storefront/svelte/public/assets/product-3.svg +1 -0
  329. package/dist/templates/storefront/svelte/public/assets/product-4.svg +1 -0
  330. package/dist/templates/storefront/svelte/public/assets/product-5.svg +1 -0
  331. package/dist/templates/storefront/svelte/public/assets/product-6.svg +1 -0
  332. package/dist/templates/storefront/svelte/public/assets/product-7.svg +1 -0
  333. package/dist/templates/storefront/svelte/public/assets/product-8.svg +1 -0
  334. package/dist/templates/storefront/svelte/src/App.svelte +218 -0
  335. package/dist/templates/storefront/svelte/src/Copy.svelte +66 -0
  336. package/dist/templates/storefront/svelte/src/Root.svelte +11 -0
  337. package/dist/templates/storefront/svelte/src/demo-messages.ts +205 -0
  338. package/dist/templates/storefront/svelte/src/i18n.ts +64 -0
  339. package/dist/templates/storefront/svelte/src/main.ts +5 -0
  340. package/dist/templates/storefront/svelte/src/messages.ts +71 -0
  341. package/dist/templates/storefront/svelte/src/model.ts +146 -0
  342. package/dist/templates/storefront/svelte/src/styles.css +1159 -0
  343. package/dist/templates/storefront/svelte/src/vite-env.d.ts +1 -0
  344. package/dist/templates/storefront/svelte/svelte.config.js +2 -0
  345. package/dist/templates/storefront/svelte/tsconfig.json +23 -0
  346. package/dist/templates/storefront/svelte/vite.config.ts +36 -0
  347. package/dist/templates/storefront/svelte/wrangler.jsonc +8 -0
  348. package/dist/templates/storefront/tanstack-start/.env.example +15 -0
  349. package/dist/templates/storefront/tanstack-start/ASSETS.md +1 -0
  350. package/dist/templates/storefront/tanstack-start/DEPLOY.md +23 -0
  351. package/dist/templates/storefront/tanstack-start/LICENSE +21 -0
  352. package/dist/templates/storefront/tanstack-start/README.md +36 -0
  353. package/dist/templates/storefront/tanstack-start/_gitignore +11 -0
  354. package/dist/templates/storefront/tanstack-start/linguana.json +10 -0
  355. package/dist/templates/storefront/tanstack-start/nitro.config.ts +2 -0
  356. package/dist/templates/storefront/tanstack-start/package.json +42 -0
  357. package/dist/templates/storefront/tanstack-start/public/assets/collection.svg +1 -0
  358. package/dist/templates/storefront/tanstack-start/public/assets/product-1.svg +1 -0
  359. package/dist/templates/storefront/tanstack-start/public/assets/product-2.svg +1 -0
  360. package/dist/templates/storefront/tanstack-start/public/assets/product-3.svg +1 -0
  361. package/dist/templates/storefront/tanstack-start/public/assets/product-4.svg +1 -0
  362. package/dist/templates/storefront/tanstack-start/public/assets/product-5.svg +1 -0
  363. package/dist/templates/storefront/tanstack-start/public/assets/product-6.svg +1 -0
  364. package/dist/templates/storefront/tanstack-start/public/assets/product-7.svg +1 -0
  365. package/dist/templates/storefront/tanstack-start/public/assets/product-8.svg +1 -0
  366. package/dist/templates/storefront/tanstack-start/src/App.tsx +601 -0
  367. package/dist/templates/storefront/tanstack-start/src/Copy.tsx +304 -0
  368. package/dist/templates/storefront/tanstack-start/src/demo-messages.ts +205 -0
  369. package/dist/templates/storefront/tanstack-start/src/i18n.ts +64 -0
  370. package/dist/templates/storefront/tanstack-start/src/locale-server.ts +54 -0
  371. package/dist/templates/storefront/tanstack-start/src/messages.ts +71 -0
  372. package/dist/templates/storefront/tanstack-start/src/model.ts +146 -0
  373. package/dist/templates/storefront/tanstack-start/src/router.tsx +10 -0
  374. package/dist/templates/storefront/tanstack-start/src/routes/$.tsx +7 -0
  375. package/dist/templates/storefront/tanstack-start/src/routes/__root.tsx +50 -0
  376. package/dist/templates/storefront/tanstack-start/src/routes/index.tsx +5 -0
  377. package/dist/templates/storefront/tanstack-start/src/styles.css +1159 -0
  378. package/dist/templates/storefront/tanstack-start/src/vite-env.d.ts +1 -0
  379. package/dist/templates/storefront/tanstack-start/tsconfig.json +23 -0
  380. package/dist/templates/storefront/tanstack-start/vite.config.ts +50 -0
  381. package/dist/templates/storefront/tanstack-start/wrangler.jsonc +12 -0
  382. package/dist/templates/storefront/vue/.env.example +15 -0
  383. package/dist/templates/storefront/vue/ASSETS.md +1 -0
  384. package/dist/templates/storefront/vue/DEPLOY.md +23 -0
  385. package/dist/templates/storefront/vue/LICENSE +21 -0
  386. package/dist/templates/storefront/vue/README.md +36 -0
  387. package/dist/templates/storefront/vue/_gitignore +11 -0
  388. package/dist/templates/storefront/vue/index.html +2 -0
  389. package/dist/templates/storefront/vue/linguana.json +10 -0
  390. package/dist/templates/storefront/vue/package.json +34 -0
  391. package/dist/templates/storefront/vue/public/assets/collection.svg +1 -0
  392. package/dist/templates/storefront/vue/public/assets/product-1.svg +1 -0
  393. package/dist/templates/storefront/vue/public/assets/product-2.svg +1 -0
  394. package/dist/templates/storefront/vue/public/assets/product-3.svg +1 -0
  395. package/dist/templates/storefront/vue/public/assets/product-4.svg +1 -0
  396. package/dist/templates/storefront/vue/public/assets/product-5.svg +1 -0
  397. package/dist/templates/storefront/vue/public/assets/product-6.svg +1 -0
  398. package/dist/templates/storefront/vue/public/assets/product-7.svg +1 -0
  399. package/dist/templates/storefront/vue/public/assets/product-8.svg +1 -0
  400. package/dist/templates/storefront/vue/src/App.vue +210 -0
  401. package/dist/templates/storefront/vue/src/Copy.vue +65 -0
  402. package/dist/templates/storefront/vue/src/demo-messages.ts +205 -0
  403. package/dist/templates/storefront/vue/src/i18n.ts +64 -0
  404. package/dist/templates/storefront/vue/src/main.ts +7 -0
  405. package/dist/templates/storefront/vue/src/messages.ts +71 -0
  406. package/dist/templates/storefront/vue/src/model.ts +146 -0
  407. package/dist/templates/storefront/vue/src/styles.css +1159 -0
  408. package/dist/templates/storefront/vue/src/vite-env.d.ts +1 -0
  409. package/dist/templates/storefront/vue/tsconfig.json +23 -0
  410. package/dist/templates/storefront/vue/vite.config.ts +36 -0
  411. package/dist/templates/storefront/vue/wrangler.jsonc +8 -0
  412. package/package.json +38 -0
@@ -0,0 +1 @@
1
+ /// <reference types="vite/client" />
@@ -0,0 +1,23 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
6
+ "moduleResolution": "Bundler",
7
+ "strict": true,
8
+ "skipLibCheck": true,
9
+ "esModuleInterop": true,
10
+ "allowImportingTsExtensions": true,
11
+ "resolveJsonModule": true,
12
+ "noEmit": true,
13
+ "types": ["vite/client", "node"],
14
+ "jsx": "react-jsx"
15
+ },
16
+ "include": [
17
+ "src/**/*.ts",
18
+ "src/**/*.tsx",
19
+ "src/**/*.vue",
20
+ "src/**/*.svelte",
21
+ "vite.config.ts"
22
+ ]
23
+ }
@@ -0,0 +1,50 @@
1
+ import { fileURLToPath } from "node:url";
2
+ import { linguana } from "@linguanahq/vite";
3
+ import { react } from "@linguanahq/vite/react";
4
+ import { tanstackStart } from "@tanstack/react-start/plugin/vite";
5
+ import native from "@vitejs/plugin-react";
6
+ import { nitro } from "nitro/vite";
7
+ import { defineConfig, loadEnv } from "vite";
8
+ import config from "./linguana.json" with { type: "json" };
9
+ export default defineConfig(({ mode }) => {
10
+ const env = { ...loadEnv(mode, process.cwd(), ""), ...process.env };
11
+ const connected = config.mode === "connected";
12
+ if (
13
+ connected &&
14
+ (!env.LINGUANA_PROJECT_ID ||
15
+ !env.VITE_LINGUANA_PUBLISHABLE_KEY ||
16
+ env.LINGUANA_PROJECT_ID !== env.VITE_LINGUANA_PROJECT_ID ||
17
+ env.LINGUANA_ENVIRONMENT !== env.VITE_LINGUANA_ENVIRONMENT ||
18
+ env.LINGUANA_API_URL !== env.VITE_LINGUANA_API_URL)
19
+ )
20
+ throw new Error(
21
+ "Linguana environment is incomplete or inconsistent. Run linguana env pull for this build mode.",
22
+ );
23
+ return {
24
+ resolve: {
25
+ alias: [
26
+ {
27
+ find: "tslib",
28
+ replacement: fileURLToPath(
29
+ import.meta.resolve("tslib/tslib.es6.mjs"),
30
+ ),
31
+ },
32
+ ],
33
+ },
34
+ plugins: [
35
+ linguana({
36
+ adapter: react(),
37
+ projectId: connected ? env.LINGUANA_PROJECT_ID! : "demo-saas",
38
+ environment: connected ? env.LINGUANA_ENVIRONMENT : "development",
39
+ sourceLocale: config.sourceLocale,
40
+ apiUrl: connected ? env.LINGUANA_API_URL : undefined,
41
+ token: connected ? env.LINGUANA_PROJECT_TOKEN : undefined,
42
+ upload: connected && env.LINGUANA_UPLOAD === "true",
43
+ translation: false,
44
+ }),
45
+ tanstackStart(),
46
+ nitro(),
47
+ native(),
48
+ ],
49
+ };
50
+ });
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "linguana-demo-saas-tanstack-start",
3
+ "compatibility_date": "2026-10-01",
4
+ "main": ".output/server/index.mjs",
5
+ "compatibility_flags": [
6
+ "nodejs_compat"
7
+ ],
8
+ "assets": {
9
+ "directory": ".output/public",
10
+ "binding": "ASSETS"
11
+ }
12
+ }
@@ -0,0 +1,15 @@
1
+ # Demo mode works without credentials. Connect with npx @linguanahq/cli link.
2
+ # Copying this file alone does not enable connected mode; use linguana.json.
3
+ # Build/server only. NEVER prefix the project token with VITE_.
4
+ LINGUANA_PROJECT_ID=
5
+ LINGUANA_ENVIRONMENT=development
6
+ LINGUANA_API_URL=https://linguana-api.mohammedibrahim.dev
7
+ LINGUANA_PROJECT_TOKEN=
8
+ LINGUANA_UPLOAD=false
9
+ # Paid translation is disabled; this template does not enable it automatically.
10
+ LINGUANA_TRANSLATE=false
11
+ # Browser-safe values. A publishable key reads published catalogs only.
12
+ VITE_LINGUANA_PROJECT_ID=
13
+ VITE_LINGUANA_ENVIRONMENT=development
14
+ VITE_LINGUANA_API_URL=https://linguana-api.mohammedibrahim.dev
15
+ VITE_LINGUANA_PUBLISHABLE_KEY=
@@ -0,0 +1 @@
1
+ All illustrations in public/assets were drawn for these templates and are covered by LICENSE (MIT). Sample writing and translations are also MIT. No remote images, tracking pixels, or font services are used. Product images and prices describe fictional demonstration goods.
@@ -0,0 +1,23 @@
1
+ # Deploy Relay
2
+
3
+ Demo mode needs no Linguana account. Hosting authentication is separate from the Linguana CLI.
4
+
5
+ ## Cloudflare Workers
6
+
7
+ Install dependencies, choose a unique Worker name in wrangler.jsonc, then:
8
+
9
+ ```sh
10
+ npx wrangler login
11
+ npm run build
12
+ npx wrangler deploy
13
+ ```
14
+
15
+ Wrangler serves dist as static assets with single-page navigation fallback. Deep article/product links continue to work.
16
+
17
+ ## Any static host
18
+
19
+ Run `npm run build` and publish dist/. Configure unknown paths to serve /index.html with status 200 (SPA fallback). A static preview can be started with `npm run preview`. Do not publish the project root.
20
+
21
+ ## Connected deployments
22
+
23
+ Pull the intended environment with `linguana env pull --environment production`. Configure the variables from .env.example in the build host, including the matching public project/environment values. Build tokens are secrets used by the compiler only. Never upload .env files or the CLI account session. LINGUANA_TRANSLATE remains false. Catalog publication is an explicit dashboard action.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Linguana contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,36 @@
1
+ # Relay
2
+
3
+ A home for your next product. Interactive handovers, clear pricing, and a useful first impression.
4
+
5
+ A standalone vue app, generated from Linguana templates v0.1.0. Requires Node 22.12+ (or Bun).
6
+
7
+ ## Run
8
+
9
+ ```sh
10
+ npm install
11
+ npm run dev
12
+ ```
13
+
14
+ You can also use pnpm, Yarn, or Bun. English, French, Spanish, and Arabic catalogs are bundled in demo mode. No Linguana API requests are made. The language cookie persists between visits. Arabic switches the document to RTL.
15
+
16
+ ## Connect your own project
17
+
18
+ ```sh
19
+ npx @linguanahq/cli login
20
+ npx @linguanahq/cli link
21
+ npx @linguanahq/cli doctor
22
+ ```
23
+
24
+ Linking writes nonsecret `linguana.json` and ignored `.env.local`. The account session stays outside this project. Only the public project ID, environment, API URL, and publishable key reach the browser. Build tokens never belong in `VITE_*` variables.
25
+
26
+ Connected mode uses your published project catalogs and English source fallback. It does not load demo translations. Builds can upload the source manifest but do not start paid translations or publish catalogs. Review and publish translations in your dashboard. Existing project languages remain unchanged unless you pass `--locales`.
27
+
28
+ To target another environment, use `linguana env pull --environment staging`, then `npm run build -- --mode staging`. Production uses `.env.production.local` and Vite's default production build mode. Configure matching private and public values on your build host; see .env.example.
29
+
30
+ ## Customize
31
+
32
+ Edit native components in src/App.vue, literal messages in src/Copy.vue, source fallbacks in src/messages.ts, and bundled demo catalogs in src/demo-messages.ts. Keep explicit message IDs stable. Each Copy branch is an extractable literal message; structured items in src/model.ts hold identifiers, prices, dates, and media only. Build output includes .linguana/manifest.json for review.
33
+
34
+ The demo form validates locally. It never sends personal information or creates bookings.
35
+
36
+ Run `npm run check-types` and `npm run build` before deploying. Deployment instructions are in DEPLOY.md. Source and illustrations are MIT; see LICENSE and ASSETS.md.
@@ -0,0 +1,11 @@
1
+ node_modules/
2
+ dist/
3
+ .output/
4
+ .nitro/
5
+ .tanstack/
6
+ .wrangler/
7
+ .env
8
+ .env.local
9
+ .env.*.local
10
+ .linguana/
11
+ *.log
@@ -0,0 +1,2 @@
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="description" content="A home for your next product. Interactive handovers, clear pricing, and a useful first impression."><meta name="theme-color" content="#4458c5"><title>Relay</title></head><body><div id="app"></div><script type="module" src="/src/main.ts"></script></body></html>
@@ -0,0 +1,10 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "framework": "vue",
4
+ "template": "saas",
5
+ "templateVersion": "0.1.0",
6
+ "mode": "demo",
7
+ "apiUrl": "https://linguana-api.mohammedibrahim.dev",
8
+ "sourceLocale": "en",
9
+ "defaultEnvironment": "development"
10
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "saas-vue",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "engines": {
8
+ "node": ">=22.12.0"
9
+ },
10
+ "scripts": {
11
+ "dev": "vite --host 127.0.0.1",
12
+ "build": "vite build",
13
+ "preview": "vite preview",
14
+ "check-types": "vue-tsc --noEmit",
15
+ "deploy": "npm run build && wrangler deploy"
16
+ },
17
+ "dependencies": {
18
+ "@linguanahq/catalog": "0.1.1",
19
+ "@linguanahq/core": "0.1.1",
20
+ "@linguanahq/vue": "0.1.1",
21
+ "vue": "^3.5.24"
22
+ },
23
+ "devDependencies": {
24
+ "@linguanahq/vite": "0.1.1",
25
+ "typescript": "^6.0.0",
26
+ "vite": "^8.1.3",
27
+ "@types/node": "^24.0.0",
28
+ "wrangler": "^4.127.0",
29
+ "@vitejs/plugin-vue": "^6.0.2",
30
+ "@vue/compiler-dom": "^3.5.24",
31
+ "@vue/compiler-sfc": "^3.5.24",
32
+ "vue-tsc": "^3.1.0"
33
+ }
34
+ }
@@ -0,0 +1,244 @@
1
+ <script setup lang="ts">
2
+ import { useTranslation } from "@linguanahq/vue";
3
+ import { onMounted, onUnmounted, reactive, watchEffect } from "vue";
4
+ import Copy from "./Copy.vue";
5
+ import { demoLocales } from "./i18n";
6
+ import { messages } from "./messages";
7
+ import {
8
+ initialState,
9
+ items,
10
+ quantity,
11
+ readCart,
12
+ type State,
13
+ saveCart,
14
+ } from "./model";
15
+
16
+ const runtime = useTranslation();
17
+ const locale = () => runtime.locale.value;
18
+ const translate = runtime.translate;
19
+ const locales = () =>
20
+ runtime.availableLocales.value.length
21
+ ? runtime.availableLocales.value
22
+ : demoLocales.filter((item) => item.code === "en");
23
+ const changeLocale = (value: string) => void runtime.setLocale(value);
24
+ const state = reactive(initialState());
25
+ const set = <K extends keyof State>(key: K, value: State[K]) => {
26
+ state[key] = value;
27
+ };
28
+ const pop = () => set("path", window.location.pathname);
29
+ onMounted(() => {
30
+ set("cart", readCart());
31
+ window.addEventListener("popstate", pop);
32
+ });
33
+ onUnmounted(() => window.removeEventListener("popstate", pop));
34
+ watchEffect(() => {
35
+ document.documentElement.lang = locale();
36
+ document.documentElement.dir = locale().startsWith("ar") ? "rtl" : "ltr";
37
+ });
38
+ const msg = (id: string, values?: Record<string, string | number>) =>
39
+ String(translate(id, messages[id] ?? id, values));
40
+ const value = (event: Event | { currentTarget: EventTarget | null }) =>
41
+ (event.currentTarget as HTMLInputElement).value;
42
+ const money = (amount: number) =>
43
+ new Intl.NumberFormat(locale(), {
44
+ style: "currency",
45
+ currency: "USD",
46
+ maximumFractionDigits: 2,
47
+ }).format(amount);
48
+ const date = (input: string) =>
49
+ new Intl.DateTimeFormat(locale(), {
50
+ dateStyle: "medium",
51
+ timeZone: "UTC",
52
+ }).format(new Date(input));
53
+ const visible = () =>
54
+ items
55
+ .filter(
56
+ (item) =>
57
+ (state.category === "all" || item.category === state.category) &&
58
+ `${msg(`${item.id}Title`)} ${msg(`${item.id}Summary`)}`
59
+ .toLocaleLowerCase(locale())
60
+ .includes(state.query.toLocaleLowerCase(locale()).trim()),
61
+ )
62
+ .sort((a, b) =>
63
+ state.sort === "low"
64
+ ? a.price - b.price
65
+ : state.sort === "high"
66
+ ? b.price - a.price
67
+ : 0,
68
+ );
69
+ const detailHref = (id: string) =>
70
+ `/products/${items.find((item) => item.id === id)!.slug}`;
71
+ const detail = () => items.find((item) => detailHref(item.id) === state.path);
72
+ const notFound = () => state.path !== "/" && detail() === undefined;
73
+ const clearFilters = () => {
74
+ set("query", "");
75
+ set("category", "all");
76
+ };
77
+ const count = () =>
78
+ Object.values(state.cart).reduce((total, count) => total + count, 0);
79
+ const cartItems = () => items.filter((item) => (state.cart[item.id] ?? 0) > 0);
80
+ const total = () =>
81
+ cartItems().reduce(
82
+ (total, item) => total + item.price * state.cart[item.id]!,
83
+ 0,
84
+ );
85
+ const updateCart = (id: string, count: number) => {
86
+ const cart = { ...state.cart };
87
+ if (count <= 0) delete cart[id];
88
+ else cart[id] = quantity(count);
89
+ set("cart", cart);
90
+ saveCart(cart);
91
+ };
92
+ const add = (id: string, count: number) => {
93
+ updateCart(id, (state.cart[id] ?? 0) + count);
94
+ set("added", true);
95
+ set("checkout", false);
96
+ };
97
+ const checkout = () => {
98
+ set("cart", {});
99
+ saveCart({});
100
+ set("checkout", true);
101
+ set("added", false);
102
+ };
103
+ const submit = (event: { preventDefault(): void }) => {
104
+ event.preventDefault();
105
+ const valid = Boolean(
106
+ state.name.trim() && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(state.email),
107
+ );
108
+ set("error", !valid);
109
+ set("sent", valid);
110
+ };
111
+ const navigate = (event: {
112
+ currentTarget: EventTarget | null;
113
+ preventDefault(): void;
114
+ metaKey: boolean;
115
+ ctrlKey: boolean;
116
+ shiftKey: boolean;
117
+ altKey: boolean;
118
+ button: number;
119
+ }) => {
120
+ if (
121
+ event.metaKey ||
122
+ event.ctrlKey ||
123
+ event.shiftKey ||
124
+ event.altKey ||
125
+ event.button !== 0
126
+ )
127
+ return;
128
+ const target = new URL((event.currentTarget as HTMLAnchorElement).href);
129
+ if (target.origin !== window.location.origin) return;
130
+ event.preventDefault();
131
+ window.history.pushState({}, "", target.pathname);
132
+ set("path", target.pathname);
133
+ set("quantity", 1);
134
+ set("added", false);
135
+ window.scrollTo(0, 0);
136
+ };
137
+ </script>
138
+ <template>
139
+ <div class="site saas"><a href="#main" class="skip-link"><Copy name="skip"></Copy></a>
140
+ <header class="site-header"><a href="/" class="brand" @click="navigate($event)" :aria-label="'Relay — ' + msg('home')"><span class="brand-mark" aria-hidden="true">↗</span>
141
+ Relay</a>
142
+ <nav :aria-label="msg('home')"><a href="/#preview"><Copy name="product"></Copy></a>
143
+ <a href="/#pricing"><Copy name="pricing"></Copy></a>
144
+ <label class="locale-picker"><span class="sr-only"><Copy name="language"></Copy></span>
145
+ <select :value="locale()" :aria-label="msg('language')" @change="changeLocale(value($event))"><template v-for="language in locales()" :key="language.code"><option :value="language.code">{{ language.nativeName }}</option></template></select></label>
146
+ <a href="/#demo" class="button small"><Copy name="demoCta"></Copy></a></nav></header>
147
+ <main id="main"><template v-if="state.path === '/'"><section class="hero saas-hero"><div class="hero-copy"><p class="eyebrow"><Copy name="eyebrow"></Copy></p>
148
+ <h1 ><Copy name="headline"></Copy></h1>
149
+ <p class="intro"><Copy name="intro"></Copy></p>
150
+ <div class="hero-actions"><a href="#preview" class="button"><Copy name="try"></Copy>
151
+ ↗</a>
152
+ <a href="#pricing" class="text-link"><Copy name="pricing"></Copy></a></div></div>
153
+ <div class="handover-art" aria-hidden="true"><span class="orbit-label">01 → 02 → 03</span>
154
+ <div class="paper"><div class="avatar">A</div>
155
+ <strong ><Copy name="boardTitle"></Copy></strong>
156
+ <div class="paper-line"></div>
157
+ <div class="paper-line short"></div>
158
+ <div class="avatars"><span >JD</span>
159
+ <span >MK</span>
160
+ <span >AL</span></div></div>
161
+ <div class="art-stamp">↗</div></div></section>
162
+ <section class="section workflow" id="preview"><div ><p class="eyebrow"><Copy name="live"></Copy></p>
163
+ <h2 ><Copy name="preview"></Copy></h2>
164
+ <div class="workflow-steps"><button type="button" :class="state.step === 0 ? 'workflow-step selected' : 'workflow-step'" :aria-pressed="state.step === 0" @click="set('step', 0)"><span class="step-number">01</span>
165
+ <span ><strong ><Copy name="step0"></Copy></strong>
166
+ <span ><Copy name="step0Body"></Copy></span></span></button>
167
+ <button type="button" :class="state.step === 1 ? 'workflow-step selected' : 'workflow-step'" :aria-pressed="state.step === 1" @click="set('step', 1)"><span class="step-number">02</span>
168
+ <span ><strong ><Copy name="step1"></Copy></strong>
169
+ <span ><Copy name="step1Body"></Copy></span></span></button>
170
+ <button type="button" :class="state.step === 2 ? 'workflow-step selected' : 'workflow-step'" :aria-pressed="state.step === 2" @click="set('step', 2)"><span class="step-number">03</span>
171
+ <span ><strong ><Copy name="step2"></Copy></strong>
172
+ <span ><Copy name="step2Body"></Copy></span></span></button></div></div>
173
+ <div class="preview-board"><div class="board-header"><span class="dot"></span>
174
+ RELAY /
175
+ <Copy name="boardTitle"></Copy></div>
176
+ <div class="board-content"><p class="eyebrow"><Copy :name=" 'step' + state.step"></Copy></p>
177
+ <h3 ><Copy name="boardNote"></Copy></h3>
178
+ <template v-if="state.step >= 1"><p class="owner"><span class="avatar">A</span>
179
+ <Copy name="owner"></Copy></p></template>
180
+ <template v-if="state.step === 2"><button type="button" class="button" @click="set('acknowledged', true)"><Copy name="acknowledge"></Copy></button></template>
181
+ <template v-if="state.acknowledged"><p role="status" class="success"><Copy name="acknowledged"></Copy></p></template></div></div></section>
182
+ <section class="section features"><article ><span class="feature-icon" aria-hidden="true">↗</span>
183
+ <h2 ><Copy name="feature1"></Copy></h2>
184
+ <p ><Copy name="feature1Body"></Copy></p></article>
185
+ <article ><span class="feature-icon" aria-hidden="true">◎</span>
186
+ <h2 ><Copy name="feature2"></Copy></h2>
187
+ <p ><Copy name="feature2Body"></Copy></p></article></section>
188
+ <section class="section pricing" id="pricing"><p class="eyebrow"><Copy name="pricing"></Copy></p>
189
+ <h2 ><Copy name="priceHeading"></Copy></h2>
190
+ <fieldset class="billing-toggle" :aria-label="msg('pricing')"><button type="button" :aria-pressed="!state.annual" @click="set('annual', false)"><Copy name="monthly"></Copy></button>
191
+ <button type="button" :aria-pressed="state.annual" @click="set('annual', true)"><Copy name="yearly"></Copy></button></fieldset>
192
+ <div class="pricing-grid"><article class="plan "><h3 ><Copy name="starter"></Copy></h3>
193
+ <p ><Copy name="starterDesc"></Copy></p>
194
+ <p class="plan-price">{{ money(12 * (state.annual ? 0.8 : 1)) }}</p>
195
+ <p class="muted"><Copy name="perMonth"></Copy></p>
196
+ <p class="billing-note"><template v-if="state.annual"><Copy name="billed"></Copy></template></p>
197
+ <a href="#demo" class="button"><Copy name="select"></Copy></a>
198
+ <ul ><li ><Copy name="planFeature1"></Copy></li>
199
+ <li ><Copy name="planFeature2"></Copy></li></ul></article>
200
+ <article class="plan popular"><span class="plan-badge"><Copy name="popular"></Copy></span>
201
+ <h3 ><Copy name="team"></Copy></h3>
202
+ <p ><Copy name="teamDesc"></Copy></p>
203
+ <p class="plan-price">{{ money(24 * (state.annual ? 0.8 : 1)) }}</p>
204
+ <p class="muted"><Copy name="perMonth"></Copy></p>
205
+ <p class="billing-note"><template v-if="state.annual"><Copy name="billed"></Copy></template></p>
206
+ <a href="#demo" class="button"><Copy name="select"></Copy></a>
207
+ <ul ><li ><Copy name="planFeature1"></Copy></li>
208
+ <li ><Copy name="planFeature2"></Copy></li>
209
+ <li ><Copy name="planFeature3"></Copy></li></ul></article>
210
+ <article class="plan "><h3 ><Copy name="scale"></Copy></h3>
211
+ <p ><Copy name="scaleDesc"></Copy></p>
212
+ <p class="plan-price">{{ money(48 * (state.annual ? 0.8 : 1)) }}</p>
213
+ <p class="muted"><Copy name="perMonth"></Copy></p>
214
+ <p class="billing-note"><template v-if="state.annual"><Copy name="billed"></Copy></template></p>
215
+ <a href="#demo" class="button"><Copy name="select"></Copy></a>
216
+ <ul ><li ><Copy name="planFeature1"></Copy></li>
217
+ <li ><Copy name="planFeature2"></Copy></li>
218
+ <li ><Copy name="planFeature3"></Copy></li></ul></article></div></section>
219
+ <section class="section faq" id="faq"><h2 ><Copy name="faq"></Copy></h2>
220
+ <details ><summary ><Copy name="q1"></Copy></summary>
221
+ <p ><Copy name="a1"></Copy></p></details>
222
+ <details ><summary ><Copy name="q2"></Copy></summary>
223
+ <p ><Copy name="a2"></Copy></p></details>
224
+ <details ><summary ><Copy name="q3"></Copy></summary>
225
+ <p ><Copy name="a3"></Copy></p></details></section>
226
+ <section class="section contact" id="demo"><div ><p class="eyebrow"><Copy name="demoCta"></Copy></p>
227
+ <h2 ><Copy name="formTitle"></Copy></h2></div>
228
+ <form class="demo-form" @submit="submit($event)" novalidate><label ><Copy name="name"></Copy>
229
+ <input name="name" autocomplete="name" required maxlength="80" :value="state.name" @input="set('name', value($event))" /></label>
230
+ <label ><Copy name="email"></Copy>
231
+ <input type="email" name="email" autocomplete="email" required :value="state.email" @input="set('email', value($event))" /></label>
232
+ <button class="button" type="submit"><Copy name="demoCta"></Copy></button>
233
+ <p class="muted fine"><Copy name="simulated"></Copy></p>
234
+ <template v-if="state.error"><p role="alert"><Copy name="formError"></Copy></p></template>
235
+ <template v-if="state.sent"><p role="status" class="success"><Copy name="sent" :values="{ name: state.name }"></Copy></p></template></form></section></template>
236
+ <template v-if="notFound()"><section class="section empty"><p class="eyebrow">404</p>
237
+ <h1 ><Copy name="missing"></Copy></h1>
238
+ <p ><Copy name="missingHint"></Copy></p>
239
+ <a href="/" @click="navigate($event)"><Copy name="back"></Copy></a></section></template></main>
240
+ <footer class="site-footer"><div ><a href="/" class="brand" @click="navigate($event)">Relay</a>
241
+ <p ><Copy name="about"></Copy></p></div>
242
+ <p class="fine"><Copy name="demo"></Copy>
243
+ <a href="https://linguana.mohammedibrahim.dev" rel="noreferrer">Linguana ↗</a></p></footer></div>
244
+ </template>
@@ -0,0 +1,73 @@
1
+ <script setup lang="ts">
2
+ import { T } from "@linguanahq/vue";
3
+
4
+ defineProps<{ name: string; values?: Record<string, string | number> }>();
5
+ </script>
6
+ <template>
7
+ <T v-if="name === 'language'" id="language" defaultMessage="Language" :values="values" />
8
+ <T v-else-if="name === 'skip'" id="skip" defaultMessage="Skip to content" :values="values" />
9
+ <T v-else-if="name === 'home'" id="home" defaultMessage="Home" :values="values" />
10
+ <T v-else-if="name === 'search'" id="search" defaultMessage="Search" :values="values" />
11
+ <T v-else-if="name === 'all'" id="all" defaultMessage="All" :values="values" />
12
+ <T v-else-if="name === 'empty'" id="empty" defaultMessage="Nothing here yet." :values="values" />
13
+ <T v-else-if="name === 'emptyHint'" id="emptyHint" defaultMessage="Try another search or clear your filters." :values="values" />
14
+ <T v-else-if="name === 'clear'" id="clear" defaultMessage="Clear filters" :values="values" />
15
+ <T v-else-if="name === 'missing'" id="missing" defaultMessage="This page took a different path." :values="values" />
16
+ <T v-else-if="name === 'missingHint'" id="missingHint" defaultMessage="We could not find that page. There is plenty to discover back home." :values="values" />
17
+ <T v-else-if="name === 'back'" id="back" defaultMessage="Back to home" :values="values" />
18
+ <T v-else-if="name === 'demo'" id="demo" defaultMessage="A multilingual demo, made with Linguana." :values="values" />
19
+ <T v-else-if="name === 'email'" id="email" defaultMessage="Email address" :values="values" />
20
+ <T v-else-if="name === 'name'" id="name" defaultMessage="Your name" :values="values" />
21
+ <T v-else-if="name === 'simulated'" id="simulated" defaultMessage="Demo only. Your information stays in this browser." :values="values" />
22
+ <T v-else-if="name === 'sent'" id="sent" defaultMessage="Thank you, {name}! This was a demo; nothing was sent." :values="values" />
23
+ <T v-else-if="name === 'formError'" id="formError" defaultMessage="Please enter your name and a valid email address." :values="values" />
24
+ <T v-else-if="name === 'eyebrow'" id="eyebrow" defaultMessage="For teams that keep moving" :values="values" />
25
+ <T v-else-if="name === 'headline'" id="headline" defaultMessage="Great work deserves a better handover." :values="values" />
26
+ <T v-else-if="name === 'intro'" id="intro" defaultMessage="Give your next shift the context they need. One clear update, every decision, nothing lost between teams." :values="values" />
27
+ <T v-else-if="name === 'try'" id="try" defaultMessage="Try the handover" :values="values" />
28
+ <T v-else-if="name === 'pricing'" id="pricing" defaultMessage="Pricing" :values="values" />
29
+ <T v-else-if="name === 'product'" id="product" defaultMessage="How it works" :values="values" />
30
+ <T v-else-if="name === 'demoCta'" id="demoCta" defaultMessage="Book a demo" :values="values" />
31
+ <T v-else-if="name === 'preview'" id="preview" defaultMessage="Your next shift starts here" :values="values" />
32
+ <T v-else-if="name === 'live'" id="live" defaultMessage="Interactive preview" :values="values" />
33
+ <T v-else-if="name === 'step0'" id="step0" defaultMessage="Write the update" :values="values" />
34
+ <T v-else-if="name === 'step1'" id="step1" defaultMessage="Add the context" :values="values" />
35
+ <T v-else-if="name === 'step2'" id="step2" defaultMessage="Pass it on" :values="values" />
36
+ <T v-else-if="name === 'step0Body'" id="step0Body" defaultMessage="Capture what changed while it is still fresh. A short note is all it takes." :values="values" />
37
+ <T v-else-if="name === 'step1Body'" id="step1Body" defaultMessage="Attach decisions, owners, and next steps so nobody has to piece things together." :values="values" />
38
+ <T v-else-if="name === 'step2Body'" id="step2Body" defaultMessage="Your teammates arrive with a clear picture and can get straight to meaningful work." :values="values" />
39
+ <T v-else-if="name === 'boardTitle'" id="boardTitle" defaultMessage="Customer success · Morning shift" :values="values" />
40
+ <T v-else-if="name === 'boardNote'" id="boardNote" defaultMessage="The new onboarding guide is ready. Two accounts need a follow-up before noon." :values="values" />
41
+ <T v-else-if="name === 'owner'" id="owner" defaultMessage="Owner: Alex" :values="values" />
42
+ <T v-else-if="name === 'acknowledged'" id="acknowledged" defaultMessage="Handover acknowledged" :values="values" />
43
+ <T v-else-if="name === 'acknowledge'" id="acknowledge" defaultMessage="Acknowledge handover" :values="values" />
44
+ <T v-else-if="name === 'feature1'" id="feature1" defaultMessage="A little structure. A lot less chasing." :values="values" />
45
+ <T v-else-if="name === 'feature1Body'" id="feature1Body" defaultMessage="Keep the important details in one place. Every handover has a clear owner and a next step." :values="values" />
46
+ <T v-else-if="name === 'feature2'" id="feature2" defaultMessage="Made for the people doing the work." :values="values" />
47
+ <T v-else-if="name === 'feature2Body'" id="feature2Body" defaultMessage="A calm workspace across time zones and languages. Less catching up, more moving forward." :values="values" />
48
+ <T v-else-if="name === 'priceHeading'" id="priceHeading" defaultMessage="Simple plans. Room to grow." :values="values" />
49
+ <T v-else-if="name === 'monthly'" id="monthly" defaultMessage="Monthly" :values="values" />
50
+ <T v-else-if="name === 'yearly'" id="yearly" defaultMessage="Yearly · save 20%" :values="values" />
51
+ <T v-else-if="name === 'perMonth'" id="perMonth" defaultMessage="per seat / month" :values="values" />
52
+ <T v-else-if="name === 'billed'" id="billed" defaultMessage="Billed annually" :values="values" />
53
+ <T v-else-if="name === 'starter'" id="starter" defaultMessage="Starter" :values="values" />
54
+ <T v-else-if="name === 'team'" id="team" defaultMessage="Team" :values="values" />
55
+ <T v-else-if="name === 'scale'" id="scale" defaultMessage="Scale" :values="values" />
56
+ <T v-else-if="name === 'starterDesc'" id="starterDesc" defaultMessage="A thoughtful start for small teams." :values="values" />
57
+ <T v-else-if="name === 'teamDesc'" id="teamDesc" defaultMessage="Everything a growing team needs." :values="values" />
58
+ <T v-else-if="name === 'scaleDesc'" id="scaleDesc" defaultMessage="Coordination across your whole company." :values="values" />
59
+ <T v-else-if="name === 'planFeature1'" id="planFeature1" defaultMessage="Unlimited handovers" :values="values" />
60
+ <T v-else-if="name === 'planFeature2'" id="planFeature2" defaultMessage="Searchable team history" :values="values" />
61
+ <T v-else-if="name === 'planFeature3'" id="planFeature3" defaultMessage="Shared workflows and insights" :values="values" />
62
+ <T v-else-if="name === 'popular'" id="popular" defaultMessage="Most popular" :values="values" />
63
+ <T v-else-if="name === 'select'" id="select" defaultMessage="Explore this plan" :values="values" />
64
+ <T v-else-if="name === 'faq'" id="faq" defaultMessage="A few things you might be wondering" :values="values" />
65
+ <T v-else-if="name === 'q1'" id="q1" defaultMessage="Can I try Relay before committing?" :values="values" />
66
+ <T v-else-if="name === 'a1'" id="a1" defaultMessage="This is a fully interactive frontend demo. Explore the preview and pricing without an account or payment details." :values="values" />
67
+ <T v-else-if="name === 'q2'" id="q2" defaultMessage="Does this template include a backend?" :values="values" />
68
+ <T v-else-if="name === 'a2'" id="a2" defaultMessage="The template includes the complete landing page. Connect your own backend when you are ready; demo forms stay local." :values="values" />
69
+ <T v-else-if="name === 'q3'" id="q3" defaultMessage="Can our team work in different languages?" :values="values" />
70
+ <T v-else-if="name === 'a3'" id="a3" defaultMessage="Yes. Switch between English, French, Spanish, and Arabic in this demo. Connect Linguana to publish your own translations." :values="values" />
71
+ <T v-else-if="name === 'formTitle'" id="formTitle" defaultMessage="See what a calmer handover feels like." :values="values" />
72
+ <T v-else-if="name === 'about'" id="about" defaultMessage="A clear next step for every team." :values="values" />
73
+ </template>