@pylonsync/create-pylon 0.19.1 → 0.20.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 (675) hide show
  1. package/bin/create-pylon.js +30 -7
  2. package/package.json +1 -1
  3. package/templates/agency/.env.example +7 -0
  4. package/templates/agency/README.md +28 -3
  5. package/templates/agency/app/(marketing)/contact-form.tsx +20 -18
  6. package/templates/agency/app/(marketing)/page.tsx +3 -3
  7. package/templates/agency/app/(marketing)/work/page.tsx +3 -3
  8. package/templates/agency/app/auth-form.tsx +4 -4
  9. package/templates/agency/app/dashboard/dashboard-client.tsx +110 -64
  10. package/templates/agency/app/dashboard/page.tsx +14 -16
  11. package/templates/agency/app/icon.svg +3 -0
  12. package/templates/agency/app/login/page.tsx +12 -14
  13. package/templates/agency/components/marketing.tsx +12 -5
  14. package/templates/agency/functions/seedStudioBackoffice.ts +42 -11
  15. package/templates/agency/lib/agency.ts +22 -0
  16. package/templates/agency/lib/demo.ts +118 -0
  17. package/templates/agency/lib/site.config.ts +19 -13
  18. package/templates/agency/public/favicon.ico +0 -0
  19. package/templates/agency/tests/agency.test.ts +57 -0
  20. package/templates/ai-chat/.env.example +13 -27
  21. package/templates/ai-chat/README.md +53 -60
  22. package/templates/ai-chat/app/(chat)/c/[id]/page.tsx +19 -0
  23. package/templates/ai-chat/app/(chat)/chat-client.tsx +657 -622
  24. package/templates/ai-chat/app/(chat)/layout.tsx +6 -43
  25. package/templates/ai-chat/app/(chat)/not-found.tsx +6 -10
  26. package/templates/ai-chat/app/(chat)/page.tsx +7 -11
  27. package/templates/ai-chat/app/auth-form.tsx +45 -38
  28. package/templates/ai-chat/app/error.tsx +9 -12
  29. package/templates/ai-chat/app/globals.css +464 -102
  30. package/templates/ai-chat/app/layout.tsx +11 -19
  31. package/templates/ai-chat/app/login/page.tsx +39 -24
  32. package/templates/ai-chat/app.ts +118 -43
  33. package/templates/ai-chat/components/chat/composer.tsx +193 -0
  34. package/templates/ai-chat/components/chat/empty-state.tsx +65 -0
  35. package/templates/ai-chat/components/chat/icons.tsx +198 -0
  36. package/templates/ai-chat/components/chat/markdown.tsx +164 -0
  37. package/templates/ai-chat/components/chat/message.tsx +183 -0
  38. package/templates/ai-chat/components/chat/setup.tsx +71 -0
  39. package/templates/ai-chat/components/chat/sidebar.tsx +288 -0
  40. package/templates/ai-chat/functions/_beginTurn.ts +145 -0
  41. package/templates/ai-chat/functions/_finishTurn.ts +55 -0
  42. package/templates/ai-chat/functions/assistantStatus.ts +13 -0
  43. package/templates/ai-chat/functions/claimGuestHistory.ts +39 -0
  44. package/templates/ai-chat/functions/createConversation.ts +28 -0
  45. package/templates/ai-chat/functions/deleteConversation.ts +15 -20
  46. package/templates/ai-chat/functions/prepareGuestClaim.ts +32 -0
  47. package/templates/ai-chat/functions/renameConversation.ts +19 -0
  48. package/templates/ai-chat/functions/respond.ts +88 -0
  49. package/templates/ai-chat/functions/seedExamples.ts +46 -0
  50. package/templates/ai-chat/functions/stopResponse.ts +30 -0
  51. package/templates/ai-chat/lib/brand-icon.ts +7 -0
  52. package/templates/ai-chat/lib/chat.ts +277 -0
  53. package/templates/ai-chat/lib/claim.ts +15 -0
  54. package/templates/ai-chat/lib/examples.ts +179 -0
  55. package/templates/ai-chat/lib/highlight.ts +107 -0
  56. package/templates/ai-chat/lib/markdown.ts +317 -0
  57. package/templates/ai-chat/lib/provider.ts +38 -0
  58. package/templates/ai-chat/lib/site.config.ts +55 -39
  59. package/templates/ai-chat/tests/chat.test.ts +174 -0
  60. package/templates/ai-chat/tests/components.test.tsx +57 -0
  61. package/templates/ai-chat/tests/markdown.test.ts +88 -0
  62. package/templates/ai-chat/tests/provider.test.ts +32 -0
  63. package/templates/backend/consumer/apps/api/app/layout.tsx +33 -0
  64. package/templates/backend/consumer/apps/api/app/page.tsx +54 -0
  65. package/templates/backend/consumer/apps/api/app.ts +166 -0
  66. package/templates/backend/consumer/apps/api/functions/addComment.ts +24 -0
  67. package/templates/backend/consumer/apps/api/functions/createPost.ts +19 -36
  68. package/templates/backend/consumer/apps/api/functions/deletePost.ts +15 -13
  69. package/templates/backend/consumer/apps/api/functions/myProfile.ts +5 -8
  70. package/templates/backend/consumer/apps/api/functions/seedDemo.ts +95 -0
  71. package/templates/backend/consumer/apps/api/functions/setFollow.ts +36 -0
  72. package/templates/backend/consumer/apps/api/functions/setLike.ts +36 -0
  73. package/templates/backend/consumer/apps/api/functions/upsertProfile.ts +43 -37
  74. package/templates/backend/consumer/apps/api/lib/seed.ts +89 -0
  75. package/templates/backend/consumer/apps/api/lib/social.ts +50 -0
  76. package/templates/backend/consumer/apps/api/package.json +8 -2
  77. package/templates/backend/consumer/apps/api/public/images/posts/arch.jpg +0 -0
  78. package/templates/backend/consumer/apps/api/public/images/posts/coffee.jpg +0 -0
  79. package/templates/backend/consumer/apps/api/public/images/posts/dog.jpg +0 -0
  80. package/templates/backend/consumer/apps/api/public/images/posts/lisbon.jpg +0 -0
  81. package/templates/backend/consumer/apps/api/public/images/posts/ramen.jpg +0 -0
  82. package/templates/backend/consumer/apps/api/public/images/posts/run.jpg +0 -0
  83. package/templates/backend/consumer/apps/api/public/images/posts/sunset.jpg +0 -0
  84. package/templates/backend/consumer/apps/api/tsconfig.json +12 -2
  85. package/templates/chat/README.md +43 -21
  86. package/templates/chat/app/chat-client.tsx +495 -85
  87. package/templates/chat/app/error.tsx +1 -1
  88. package/templates/chat/app/globals.css +170 -54
  89. package/templates/chat/app/layout.tsx +12 -9
  90. package/templates/chat/app/not-found.tsx +4 -2
  91. package/templates/chat/app/page.tsx +9 -19
  92. package/templates/chat/app.ts +96 -17
  93. package/templates/chat/components/chat/avatar.tsx +45 -0
  94. package/templates/chat/components/chat/composer.tsx +110 -0
  95. package/templates/chat/components/chat/message-list.tsx +285 -0
  96. package/templates/chat/components/chat/sidebar.tsx +190 -0
  97. package/templates/chat/functions/joinChat.ts +83 -0
  98. package/templates/chat/functions/renameMember.ts +25 -0
  99. package/templates/chat/lib/chat.ts +188 -0
  100. package/templates/chat/lib/seed.ts +78 -0
  101. package/templates/chat/tests/chat.test.ts +159 -0
  102. package/templates/chat/tests/composer.test.tsx +54 -0
  103. package/templates/consumer/README.md +3 -3
  104. package/templates/consumer/app/globals.css +10 -3
  105. package/templates/consumer/app/icon.svg +1 -0
  106. package/templates/consumer/components/social/avatar.tsx +25 -11
  107. package/templates/consumer/functions/seedFeed.ts +3 -3
  108. package/templates/consumer/lib/seed.ts +43 -85
  109. package/templates/consumer/public/favicon.ico +0 -0
  110. package/templates/consumer/public/images/posts/arch.jpg +0 -0
  111. package/templates/consumer/public/images/posts/coffee.jpg +0 -0
  112. package/templates/consumer/public/images/posts/dog.jpg +0 -0
  113. package/templates/consumer/public/images/posts/lisbon.jpg +0 -0
  114. package/templates/consumer/public/images/posts/ramen.jpg +0 -0
  115. package/templates/consumer/public/images/posts/run.jpg +0 -0
  116. package/templates/consumer/public/images/posts/sunset.jpg +0 -0
  117. package/templates/consumer/tests/seed.test.ts +39 -0
  118. package/templates/creator/.env.example +7 -0
  119. package/templates/creator/README.md +24 -5
  120. package/templates/creator/app/(marketing)/newsletter-signup.tsx +33 -12
  121. package/templates/creator/app/auth-form.tsx +7 -7
  122. package/templates/creator/app/dashboard/dashboard-client.tsx +137 -100
  123. package/templates/creator/app/dashboard/page.tsx +18 -18
  124. package/templates/creator/app/icon.svg +2 -0
  125. package/templates/creator/app/login/page.tsx +14 -14
  126. package/templates/creator/app.ts +4 -4
  127. package/templates/creator/functions/seedDemo.ts +32 -0
  128. package/templates/creator/functions/subscribe.ts +4 -15
  129. package/templates/creator/lib/demo.ts +94 -0
  130. package/templates/creator/lib/site.config.ts +15 -10
  131. package/templates/creator/lib/stats.ts +35 -0
  132. package/templates/creator/public/favicon.ico +0 -0
  133. package/templates/creator/tests/counter.test.ts +92 -0
  134. package/templates/creator/tests/live-count.test.tsx +45 -0
  135. package/templates/crm/README.md +22 -1
  136. package/templates/crm/app/apple-icon.png +0 -0
  137. package/templates/crm/app/companies/companies-view.tsx +32 -14
  138. package/templates/crm/app/companies/page.tsx +2 -1
  139. package/templates/crm/app/contacts/contacts-view.tsx +34 -10
  140. package/templates/crm/app/contacts/page.tsx +2 -1
  141. package/templates/crm/app/deals/[id]/deal-view.tsx +137 -98
  142. package/templates/crm/app/deals/[id]/page.tsx +2 -1
  143. package/templates/crm/app/globals.css +29 -14
  144. package/templates/crm/app/icon.svg +1 -0
  145. package/templates/crm/app/layout.tsx +7 -5
  146. package/templates/crm/app/page.tsx +2 -1
  147. package/templates/crm/app/pipeline-view.tsx +5 -5
  148. package/templates/crm/app/workspace.tsx +29 -17
  149. package/templates/crm/app.ts +5 -5
  150. package/templates/crm/components/activity-timeline.tsx +14 -4
  151. package/templates/crm/components/app-shell.tsx +94 -0
  152. package/templates/crm/components/auth-form.tsx +35 -5
  153. package/templates/crm/components/avatar.tsx +5 -1
  154. package/templates/crm/components/board-skeleton.tsx +5 -5
  155. package/templates/crm/components/brand-mark.tsx +25 -0
  156. package/templates/crm/components/command-palette.tsx +17 -17
  157. package/templates/crm/components/data-table.tsx +97 -36
  158. package/templates/crm/components/deal-card.tsx +23 -27
  159. package/templates/crm/components/filter-tabs.tsx +101 -0
  160. package/templates/crm/components/metrics-bar.tsx +6 -6
  161. package/templates/crm/components/nav.tsx +15 -0
  162. package/templates/crm/components/page-header.tsx +43 -7
  163. package/templates/crm/components/pipeline-board.tsx +16 -10
  164. package/templates/crm/components/require-auth.tsx +24 -26
  165. package/templates/crm/components/sidebar.tsx +54 -49
  166. package/templates/crm/components/stage-badge.tsx +4 -2
  167. package/templates/crm/components/ui/button.tsx +5 -4
  168. package/templates/crm/components/ui/dialog.tsx +1 -1
  169. package/templates/crm/components/ui/input.tsx +1 -1
  170. package/templates/crm/components/ui/select.tsx +1 -1
  171. package/templates/crm/components/ui/textarea.tsx +1 -1
  172. package/templates/crm/functions/seedWorkspace.ts +32 -17
  173. package/templates/crm/lib/brand.ts +9 -0
  174. package/templates/crm/lib/demo-team.ts +51 -0
  175. package/templates/crm/lib/pipeline.ts +37 -0
  176. package/templates/crm/lib/search.ts +4 -3
  177. package/templates/crm/lib/seed.ts +53 -8
  178. package/templates/crm/public/favicon.ico +0 -0
  179. package/templates/crm/tests/components.test.tsx +5 -5
  180. package/templates/crm/tests/demo-team.test.ts +18 -0
  181. package/templates/crm/tests/pipeline.test.ts +59 -3
  182. package/templates/directory/.env.example +7 -0
  183. package/templates/directory/README.md +22 -3
  184. package/templates/directory/app/(marketing)/directory-browse.tsx +30 -12
  185. package/templates/directory/app/(marketing)/page.tsx +6 -4
  186. package/templates/directory/app/auth-form.tsx +4 -4
  187. package/templates/directory/app/dashboard/dashboard-client.tsx +177 -90
  188. package/templates/directory/app/dashboard/page.tsx +16 -14
  189. package/templates/directory/app/icon.svg +4 -0
  190. package/templates/directory/app/login/page.tsx +16 -15
  191. package/templates/directory/functions/seedDemo.ts +43 -0
  192. package/templates/directory/lib/demo.ts +145 -0
  193. package/templates/directory/lib/directory.ts +27 -0
  194. package/templates/directory/lib/site.config.ts +21 -16
  195. package/templates/directory/public/favicon.ico +0 -0
  196. package/templates/directory/tests/directory.test.ts +46 -0
  197. package/templates/expo/consumer/apps/expo/App.tsx +360 -288
  198. package/templates/expo/consumer/apps/expo/app.json +9 -1
  199. package/templates/expo/consumer/apps/expo/package.json +2 -1
  200. package/templates/helpdesk/README.md +21 -0
  201. package/templates/helpdesk/app/apple-icon.png +0 -0
  202. package/templates/helpdesk/app/customers/customers-view.tsx +23 -7
  203. package/templates/helpdesk/app/customers/page.tsx +2 -1
  204. package/templates/helpdesk/app/globals.css +29 -14
  205. package/templates/helpdesk/app/icon.svg +1 -0
  206. package/templates/helpdesk/app/inbox-view.tsx +66 -47
  207. package/templates/helpdesk/app/layout.tsx +7 -5
  208. package/templates/helpdesk/app/page.tsx +4 -7
  209. package/templates/helpdesk/app/tickets/[id]/page.tsx +2 -1
  210. package/templates/helpdesk/app/tickets/[id]/ticket-view.tsx +134 -97
  211. package/templates/helpdesk/app/workspace.tsx +33 -22
  212. package/templates/helpdesk/app.ts +2 -2
  213. package/templates/helpdesk/components/app-shell.tsx +94 -0
  214. package/templates/helpdesk/components/auth-form.tsx +35 -5
  215. package/templates/helpdesk/components/avatar.tsx +5 -1
  216. package/templates/helpdesk/components/brand-mark.tsx +28 -0
  217. package/templates/helpdesk/components/command-palette.tsx +17 -17
  218. package/templates/helpdesk/components/data-table.tsx +97 -36
  219. package/templates/helpdesk/components/filter-tabs.tsx +101 -0
  220. package/templates/helpdesk/components/nav.tsx +14 -0
  221. package/templates/helpdesk/components/page-header.tsx +43 -7
  222. package/templates/helpdesk/components/priority-badge.tsx +49 -6
  223. package/templates/helpdesk/components/require-auth.tsx +24 -26
  224. package/templates/helpdesk/components/sidebar.tsx +54 -48
  225. package/templates/helpdesk/components/sla-indicator.tsx +5 -8
  226. package/templates/helpdesk/components/thread.tsx +7 -7
  227. package/templates/helpdesk/components/ticket-list.tsx +79 -19
  228. package/templates/helpdesk/components/ui/button.tsx +5 -4
  229. package/templates/helpdesk/components/ui/dialog.tsx +1 -1
  230. package/templates/helpdesk/components/ui/input.tsx +1 -1
  231. package/templates/helpdesk/components/ui/select.tsx +1 -1
  232. package/templates/helpdesk/components/ui/textarea.tsx +1 -1
  233. package/templates/helpdesk/functions/seedWorkspace.ts +25 -15
  234. package/templates/helpdesk/lib/brand.ts +9 -0
  235. package/templates/helpdesk/lib/demo-team.ts +51 -0
  236. package/templates/helpdesk/lib/search.ts +4 -3
  237. package/templates/helpdesk/lib/seed.ts +43 -2
  238. package/templates/helpdesk/lib/tickets.ts +68 -20
  239. package/templates/helpdesk/public/favicon.ico +0 -0
  240. package/templates/helpdesk/tests/components.test.tsx +10 -0
  241. package/templates/helpdesk/tests/demo-team.test.ts +18 -0
  242. package/templates/helpdesk/tests/tickets.test.ts +70 -0
  243. package/templates/imessage/.env.example +49 -0
  244. package/templates/imessage/AGENTS.md +153 -0
  245. package/templates/imessage/CLAUDE.md +7 -0
  246. package/templates/imessage/README.md +187 -0
  247. package/templates/imessage/app/console.tsx +382 -0
  248. package/templates/imessage/app/contacts/page.tsx +13 -0
  249. package/templates/imessage/app/error.tsx +16 -0
  250. package/templates/imessage/app/gate.tsx +31 -0
  251. package/templates/imessage/app/globals.css +183 -0
  252. package/templates/imessage/app/layout.tsx +17 -0
  253. package/templates/imessage/app/login/login-form.tsx +115 -0
  254. package/templates/imessage/app/login/page.tsx +30 -0
  255. package/templates/imessage/app/not-found.tsx +13 -0
  256. package/templates/imessage/app/page.tsx +14 -0
  257. package/templates/imessage/app/robots.ts +6 -0
  258. package/templates/imessage/app/setup/page.tsx +13 -0
  259. package/templates/imessage/app/sign-out.tsx +20 -0
  260. package/templates/imessage/app.ts +299 -0
  261. package/templates/imessage/bunfig +4 -0
  262. package/templates/imessage/components/avatar.tsx +46 -0
  263. package/templates/imessage/components/contact-panel.tsx +263 -0
  264. package/templates/imessage/components/contacts-view.tsx +172 -0
  265. package/templates/imessage/components/conversation-list.tsx +129 -0
  266. package/templates/imessage/components/nav-rail.tsx +67 -0
  267. package/templates/imessage/components/setup-view.tsx +408 -0
  268. package/templates/imessage/components/thread.tsx +229 -0
  269. package/templates/imessage/components/ui/badge.tsx +37 -0
  270. package/templates/imessage/components/ui/button.tsx +56 -0
  271. package/templates/imessage/components/ui/card.tsx +90 -0
  272. package/templates/imessage/components/ui/dialog.tsx +110 -0
  273. package/templates/imessage/components/ui/input.tsx +30 -0
  274. package/templates/imessage/components/ui/label.tsx +21 -0
  275. package/templates/imessage/components/ui/select.tsx +39 -0
  276. package/templates/imessage/components/ui/table.tsx +124 -0
  277. package/templates/imessage/components/ui/textarea.tsx +24 -0
  278. package/templates/imessage/components.json +20 -0
  279. package/templates/imessage/functions/answerNow.ts +34 -0
  280. package/templates/imessage/functions/assistant.ts +96 -0
  281. package/templates/imessage/functions/beginTurn.ts +101 -0
  282. package/templates/imessage/functions/cancelReminder.ts +13 -0
  283. package/templates/imessage/functions/claimOutbound.ts +44 -0
  284. package/templates/imessage/functions/clearDemo.ts +18 -0
  285. package/templates/imessage/functions/deleteNote.ts +11 -0
  286. package/templates/imessage/functions/deliverOutbound.ts +55 -0
  287. package/templates/imessage/functions/finishTurn.ts +84 -0
  288. package/templates/imessage/functions/fireReminder.ts +42 -0
  289. package/templates/imessage/functions/ingestInbound.ts +22 -0
  290. package/templates/imessage/functions/ownerAccount.ts +13 -0
  291. package/templates/imessage/functions/processTurn.ts +74 -0
  292. package/templates/imessage/functions/relayApply.ts +102 -0
  293. package/templates/imessage/functions/relaySync.ts +63 -0
  294. package/templates/imessage/functions/releaseOutbound.ts +18 -0
  295. package/templates/imessage/functions/resolveTurn.ts +25 -0
  296. package/templates/imessage/functions/saveContact.ts +27 -0
  297. package/templates/imessage/functions/seedDemo.ts +70 -0
  298. package/templates/imessage/functions/sendOwnerMessage.ts +28 -0
  299. package/templates/imessage/functions/sendblueWebhook.ts +49 -0
  300. package/templates/imessage/functions/setContactStatus.ts +17 -0
  301. package/templates/imessage/functions/settleOutbound.ts +35 -0
  302. package/templates/imessage/functions/setupStatus.ts +33 -0
  303. package/templates/imessage/functions/sweep.ts +58 -0
  304. package/templates/imessage/functions/toolCancelReminder.ts +17 -0
  305. package/templates/imessage/functions/toolForgetNote.ts +15 -0
  306. package/templates/imessage/functions/toolListNotes.ts +16 -0
  307. package/templates/imessage/functions/toolListReminders.ts +17 -0
  308. package/templates/imessage/functions/toolSaveNote.ts +22 -0
  309. package/templates/imessage/functions/toolSetReminder.ts +55 -0
  310. package/templates/imessage/functions/updateSettings.ts +48 -0
  311. package/templates/imessage/gitignore +11 -0
  312. package/templates/imessage/lib/agent-call.ts +251 -0
  313. package/templates/imessage/lib/assistant.ts +74 -0
  314. package/templates/imessage/lib/chunk.ts +135 -0
  315. package/templates/imessage/lib/demo.ts +68 -0
  316. package/templates/imessage/lib/format.ts +170 -0
  317. package/templates/imessage/lib/gate.ts +104 -0
  318. package/templates/imessage/lib/handles.ts +67 -0
  319. package/templates/imessage/lib/provider.ts +38 -0
  320. package/templates/imessage/lib/relay-protocol.ts +95 -0
  321. package/templates/imessage/lib/reminders.ts +41 -0
  322. package/templates/imessage/lib/secrets.ts +59 -0
  323. package/templates/imessage/lib/sendblue.ts +173 -0
  324. package/templates/imessage/lib/store.ts +407 -0
  325. package/templates/imessage/lib/transport.ts +135 -0
  326. package/templates/imessage/lib/utils.ts +10 -0
  327. package/templates/imessage/package.json +40 -0
  328. package/templates/imessage/relay/.env.example +14 -0
  329. package/templates/imessage/relay/applescript.ts +70 -0
  330. package/templates/imessage/relay/chatdb.ts +165 -0
  331. package/templates/imessage/relay/client.ts +41 -0
  332. package/templates/imessage/relay/main.ts +137 -0
  333. package/templates/imessage/relay/state.ts +35 -0
  334. package/templates/imessage/tests/agent-call.test.ts +112 -0
  335. package/templates/imessage/tests/applescript.test.ts +88 -0
  336. package/templates/imessage/tests/chatdb.test.ts +139 -0
  337. package/templates/imessage/tests/chunk.test.ts +61 -0
  338. package/templates/imessage/tests/fake-ctx.ts +88 -0
  339. package/templates/imessage/tests/ingest.test.ts +141 -0
  340. package/templates/imessage/tests/lib.test.ts +99 -0
  341. package/templates/imessage/tests/review-fixes.test.ts +138 -0
  342. package/templates/imessage/tests/secrets.test.ts +36 -0
  343. package/templates/imessage/tests/sendblue.test.ts +143 -0
  344. package/templates/imessage/tests/setup.ts +5 -0
  345. package/templates/imessage/tsconfig.json +18 -0
  346. package/templates/inventory/README.md +21 -0
  347. package/templates/inventory/app/apple-icon.png +0 -0
  348. package/templates/inventory/app/globals.css +29 -14
  349. package/templates/inventory/app/icon.svg +1 -0
  350. package/templates/inventory/app/layout.tsx +7 -5
  351. package/templates/inventory/app/movements/movements-view.tsx +32 -10
  352. package/templates/inventory/app/movements/page.tsx +2 -1
  353. package/templates/inventory/app/page.tsx +4 -6
  354. package/templates/inventory/app/products/[id]/page.tsx +2 -1
  355. package/templates/inventory/app/products/[id]/product-view.tsx +55 -25
  356. package/templates/inventory/app/products-view.tsx +74 -33
  357. package/templates/inventory/app/workspace.tsx +34 -16
  358. package/templates/inventory/app.ts +10 -2
  359. package/templates/inventory/components/app-shell.tsx +94 -0
  360. package/templates/inventory/components/auth-form.tsx +35 -5
  361. package/templates/inventory/components/avatar.tsx +5 -1
  362. package/templates/inventory/components/brand-mark.tsx +25 -0
  363. package/templates/inventory/components/category-tile.tsx +49 -0
  364. package/templates/inventory/components/command-palette.tsx +17 -17
  365. package/templates/inventory/components/data-table.tsx +97 -36
  366. package/templates/inventory/components/filter-tabs.tsx +101 -0
  367. package/templates/inventory/components/nav.tsx +14 -0
  368. package/templates/inventory/components/page-header.tsx +43 -7
  369. package/templates/inventory/components/require-auth.tsx +24 -26
  370. package/templates/inventory/components/sidebar.tsx +54 -48
  371. package/templates/inventory/components/stock-level.tsx +30 -14
  372. package/templates/inventory/components/summary-bar.tsx +8 -15
  373. package/templates/inventory/components/ui/button.tsx +5 -4
  374. package/templates/inventory/components/ui/dialog.tsx +1 -1
  375. package/templates/inventory/components/ui/input.tsx +1 -1
  376. package/templates/inventory/components/ui/select.tsx +1 -1
  377. package/templates/inventory/components/ui/textarea.tsx +1 -1
  378. package/templates/inventory/functions/seedWorkspace.ts +18 -8
  379. package/templates/inventory/lib/brand.ts +9 -0
  380. package/templates/inventory/lib/demo-team.ts +51 -0
  381. package/templates/inventory/lib/search.ts +4 -3
  382. package/templates/inventory/lib/seed.ts +29 -2
  383. package/templates/inventory/lib/stock.ts +32 -0
  384. package/templates/inventory/public/favicon.ico +0 -0
  385. package/templates/inventory/tests/demo-team.test.ts +18 -0
  386. package/templates/inventory/tests/stock.test.ts +29 -0
  387. package/templates/invoices/README.md +16 -0
  388. package/templates/invoices/app/apple-icon.png +0 -0
  389. package/templates/invoices/app/clients/clients-view.tsx +18 -6
  390. package/templates/invoices/app/clients/page.tsx +2 -1
  391. package/templates/invoices/app/globals.css +29 -14
  392. package/templates/invoices/app/icon.svg +1 -0
  393. package/templates/invoices/app/invoices/[id]/invoice-view.tsx +72 -48
  394. package/templates/invoices/app/invoices/[id]/page.tsx +2 -1
  395. package/templates/invoices/app/invoices-view.tsx +81 -32
  396. package/templates/invoices/app/layout.tsx +7 -5
  397. package/templates/invoices/app/page.tsx +4 -6
  398. package/templates/invoices/app/workspace.tsx +26 -16
  399. package/templates/invoices/app.ts +2 -2
  400. package/templates/invoices/components/app-shell.tsx +94 -0
  401. package/templates/invoices/components/auth-form.tsx +35 -5
  402. package/templates/invoices/components/avatar.tsx +5 -1
  403. package/templates/invoices/components/brand-mark.tsx +26 -0
  404. package/templates/invoices/components/command-palette.tsx +17 -17
  405. package/templates/invoices/components/data-table.tsx +97 -36
  406. package/templates/invoices/components/filter-tabs.tsx +101 -0
  407. package/templates/invoices/components/line-items.tsx +19 -14
  408. package/templates/invoices/components/nav.tsx +14 -0
  409. package/templates/invoices/components/page-header.tsx +43 -7
  410. package/templates/invoices/components/require-auth.tsx +24 -26
  411. package/templates/invoices/components/sidebar.tsx +54 -48
  412. package/templates/invoices/components/status-badge.tsx +7 -7
  413. package/templates/invoices/components/summary-bar.tsx +5 -5
  414. package/templates/invoices/components/ui/button.tsx +5 -4
  415. package/templates/invoices/components/ui/dialog.tsx +1 -1
  416. package/templates/invoices/components/ui/input.tsx +1 -1
  417. package/templates/invoices/components/ui/select.tsx +1 -1
  418. package/templates/invoices/components/ui/textarea.tsx +1 -1
  419. package/templates/invoices/functions/recordPayment.ts +3 -0
  420. package/templates/invoices/lib/billing.ts +40 -0
  421. package/templates/invoices/lib/brand.ts +9 -0
  422. package/templates/invoices/lib/search.ts +4 -3
  423. package/templates/invoices/public/favicon.ico +0 -0
  424. package/templates/invoices/tests/billing.test.ts +27 -0
  425. package/templates/ios/consumer/apps/ios/Package.swift +4 -3
  426. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/ActivityView.swift +107 -0
  427. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/AppModel.swift +171 -0
  428. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/AuthView.swift +182 -0
  429. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/CommentsView.swift +136 -0
  430. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/ComposeView.swift +152 -0
  431. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/ExploreView.swift +117 -0
  432. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/FeedView.swift +175 -159
  433. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/MainTabView.swift +54 -0
  434. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/Media.swift +271 -0
  435. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/Models.swift +101 -4
  436. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/PostCard.swift +245 -0
  437. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/ProfileEditorView.swift +208 -0
  438. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/ProfileView.swift +183 -0
  439. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/RootView.swift +25 -31
  440. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/SocialStore.swift +285 -0
  441. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/StoryViewer.swift +155 -0
  442. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/Theme.swift +82 -0
  443. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/__APP_NAME_PASCAL__App.swift +4 -47
  444. package/templates/ios/consumer/apps/ios/project.yml +13 -9
  445. package/templates/local-service/.env.example +7 -0
  446. package/templates/local-service/README.md +26 -2
  447. package/templates/local-service/app/(marketing)/booking-widget.tsx +48 -9
  448. package/templates/local-service/app/(marketing)/page.tsx +66 -42
  449. package/templates/local-service/app/auth-form.tsx +8 -8
  450. package/templates/local-service/app/dashboard/dashboard-client.tsx +119 -92
  451. package/templates/local-service/app/dashboard/page.tsx +14 -14
  452. package/templates/local-service/app/icon.svg +2 -0
  453. package/templates/local-service/app/login/page.tsx +15 -15
  454. package/templates/local-service/functions/seedDemo.ts +49 -0
  455. package/templates/local-service/lib/demo.ts +135 -0
  456. package/templates/local-service/lib/hours.ts +44 -0
  457. package/templates/local-service/lib/site.config.ts +8 -3
  458. package/templates/local-service/lib/slots.ts +3 -0
  459. package/templates/local-service/public/favicon.ico +0 -0
  460. package/templates/local-service/tests/booking.test.ts +104 -0
  461. package/templates/marketplace/README.md +23 -15
  462. package/templates/marketplace/app/globals.css +172 -114
  463. package/templates/marketplace/app/layout.tsx +75 -30
  464. package/templates/marketplace/app/listing/[id]/page.tsx +210 -123
  465. package/templates/marketplace/app/me/page.tsx +4 -4
  466. package/templates/marketplace/app/page.tsx +221 -298
  467. package/templates/marketplace/app/sell/page.tsx +8 -11
  468. package/templates/marketplace/app.ts +32 -7
  469. package/templates/marketplace/client/ActivityFeed.tsx +311 -0
  470. package/templates/marketplace/client/AuthNav.tsx +24 -16
  471. package/templates/marketplace/client/ListingCard.tsx +118 -0
  472. package/templates/marketplace/client/LiveGrid.tsx +92 -0
  473. package/templates/marketplace/client/LiveListingStatus.tsx +32 -24
  474. package/templates/marketplace/client/LoginCard.tsx +114 -136
  475. package/templates/marketplace/client/MarketProvider.tsx +3 -5
  476. package/templates/marketplace/client/MyMarket.tsx +371 -185
  477. package/templates/marketplace/client/OfferPanel.tsx +421 -287
  478. package/templates/marketplace/client/SellForm.tsx +271 -192
  479. package/templates/marketplace/client/ThemeToggle.tsx +1 -0
  480. package/templates/marketplace/client/WatchButton.tsx +16 -16
  481. package/templates/marketplace/client/market.ts +61 -14
  482. package/templates/marketplace/functions/seedMarket.ts +143 -36
  483. package/templates/marketplace/functions/seedOffers.ts +101 -0
  484. package/templates/marketplace/lib/catalog.ts +72 -1
  485. package/templates/marketplace/public/images/listings/ceramic-lamp-640.webp +0 -0
  486. package/templates/marketplace/public/images/listings/ceramic-lamp.webp +0 -0
  487. package/templates/marketplace/public/images/listings/duffel-640.webp +0 -0
  488. package/templates/marketplace/public/images/listings/duffel.webp +0 -0
  489. package/templates/marketplace/public/images/listings/film-camera-640.webp +0 -0
  490. package/templates/marketplace/public/images/listings/film-camera.webp +0 -0
  491. package/templates/marketplace/public/images/listings/lounge-chair-640.webp +0 -0
  492. package/templates/marketplace/public/images/listings/lounge-chair.webp +0 -0
  493. package/templates/marketplace/public/images/listings/road-bike-640.webp +0 -0
  494. package/templates/marketplace/public/images/listings/road-bike.webp +0 -0
  495. package/templates/marketplace/public/images/listings/slipper-chair-640.webp +0 -0
  496. package/templates/marketplace/public/images/listings/slipper-chair.webp +0 -0
  497. package/templates/marketplace/public/images/listings/turntable-640.webp +0 -0
  498. package/templates/marketplace/public/images/listings/turntable.webp +0 -0
  499. package/templates/marketplace/public/images/listings/wardrobe-640.webp +0 -0
  500. package/templates/marketplace/public/images/listings/wardrobe.webp +0 -0
  501. package/templates/marketplace/public/images/listings/watch-640.webp +0 -0
  502. package/templates/marketplace/public/images/listings/watch.webp +0 -0
  503. package/templates/marketplace/public/images/listings/weekender-bag-640.webp +0 -0
  504. package/templates/marketplace/public/images/listings/weekender-bag.webp +0 -0
  505. package/templates/marketplace/tests/example.test.ts +64 -2
  506. package/templates/marketplace/tests/listing-card.test.tsx +61 -0
  507. package/templates/projects/README.md +24 -3
  508. package/templates/projects/app/apple-icon.png +0 -0
  509. package/templates/projects/app/clients/clients-view.tsx +20 -6
  510. package/templates/projects/app/clients/page.tsx +2 -1
  511. package/templates/projects/app/globals.css +29 -14
  512. package/templates/projects/app/icon.svg +1 -0
  513. package/templates/projects/app/layout.tsx +7 -5
  514. package/templates/projects/app/page.tsx +3 -5
  515. package/templates/projects/app/projects/[id]/page.tsx +2 -1
  516. package/templates/projects/app/projects/[id]/project-view.tsx +45 -30
  517. package/templates/projects/app/projects-view.tsx +105 -52
  518. package/templates/projects/app/workspace.tsx +41 -20
  519. package/templates/projects/app.ts +2 -2
  520. package/templates/projects/components/app-shell.tsx +94 -0
  521. package/templates/projects/components/auth-form.tsx +35 -5
  522. package/templates/projects/components/avatar.tsx +5 -1
  523. package/templates/projects/components/board-skeleton.tsx +3 -3
  524. package/templates/projects/components/brand-mark.tsx +25 -0
  525. package/templates/projects/components/command-palette.tsx +17 -17
  526. package/templates/projects/components/data-table.tsx +97 -36
  527. package/templates/projects/components/filter-tabs.tsx +101 -0
  528. package/templates/projects/components/meter.tsx +48 -0
  529. package/templates/projects/components/nav.tsx +14 -0
  530. package/templates/projects/components/page-header.tsx +43 -7
  531. package/templates/projects/components/require-auth.tsx +24 -26
  532. package/templates/projects/components/sidebar.tsx +54 -48
  533. package/templates/projects/components/summary-bar.tsx +49 -0
  534. package/templates/projects/components/task-board.tsx +10 -9
  535. package/templates/projects/components/time-dialog.tsx +29 -5
  536. package/templates/projects/components/ui/button.tsx +5 -4
  537. package/templates/projects/components/ui/dialog.tsx +1 -1
  538. package/templates/projects/components/ui/input.tsx +1 -1
  539. package/templates/projects/components/ui/select.tsx +1 -1
  540. package/templates/projects/components/ui/textarea.tsx +1 -1
  541. package/templates/projects/functions/seedWorkspace.ts +26 -12
  542. package/templates/projects/lib/brand.ts +9 -0
  543. package/templates/projects/lib/demo-team.ts +51 -0
  544. package/templates/projects/lib/search.ts +4 -3
  545. package/templates/projects/lib/seed.ts +35 -1
  546. package/templates/projects/lib/work.ts +63 -0
  547. package/templates/projects/public/favicon.ico +0 -0
  548. package/templates/projects/tests/demo-team.test.ts +18 -0
  549. package/templates/projects/tests/work.test.ts +65 -0
  550. package/templates/restaurant/.env.example +7 -0
  551. package/templates/restaurant/README.md +29 -3
  552. package/templates/restaurant/app/(marketing)/layout.tsx +4 -2
  553. package/templates/restaurant/app/(marketing)/page.tsx +47 -23
  554. package/templates/restaurant/app/(marketing)/reservation-widget.tsx +37 -7
  555. package/templates/restaurant/app/auth-form.tsx +8 -8
  556. package/templates/restaurant/app/dashboard/dashboard-client.tsx +241 -109
  557. package/templates/restaurant/app/dashboard/page.tsx +14 -14
  558. package/templates/restaurant/app/icon.svg +4 -0
  559. package/templates/restaurant/app/login/page.tsx +15 -15
  560. package/templates/restaurant/functions/seedDemo.ts +44 -0
  561. package/templates/restaurant/lib/demo.ts +144 -0
  562. package/templates/restaurant/lib/hours.ts +45 -0
  563. package/templates/restaurant/lib/site.config.ts +3 -3
  564. package/templates/restaurant/public/favicon.ico +0 -0
  565. package/templates/restaurant/tests/reservations.test.ts +67 -0
  566. package/templates/saas/README.md +54 -35
  567. package/templates/saas/app/(auth)/auth-form.tsx +25 -23
  568. package/templates/saas/app/(auth)/forgot-password/page.tsx +1 -1
  569. package/templates/saas/app/(auth)/layout.tsx +27 -33
  570. package/templates/saas/app/(auth)/login/page.tsx +1 -1
  571. package/templates/saas/app/(auth)/reset-password/page.tsx +1 -1
  572. package/templates/saas/app/(auth)/signup/page.tsx +1 -1
  573. package/templates/saas/app/(marketing)/layout.tsx +127 -253
  574. package/templates/saas/app/(marketing)/page.tsx +133 -372
  575. package/templates/saas/app/(marketing)/pricing/page.tsx +21 -19
  576. package/templates/saas/app/(marketing)/products/[slug]/page.tsx +40 -95
  577. package/templates/saas/app/dashboard/board-client.tsx +416 -0
  578. package/templates/saas/app/dashboard/dashboard-client.tsx +30 -615
  579. package/templates/saas/app/dashboard/layout.tsx +27 -13
  580. package/templates/saas/app/dashboard/overview-client.tsx +332 -0
  581. package/templates/saas/app/dashboard/page.tsx +29 -35
  582. package/templates/saas/app/dashboard/projects/[id]/page.tsx +29 -0
  583. package/templates/saas/app/dashboard/projects/page.tsx +11 -7
  584. package/templates/saas/app/dashboard/projects-client.tsx +398 -0
  585. package/templates/saas/app/globals.css +5 -4
  586. package/templates/saas/app/icon.svg +1 -0
  587. package/templates/saas/app/onboarding/onboarding-client.tsx +93 -26
  588. package/templates/saas/app/onboarding/page.tsx +6 -2
  589. package/templates/saas/app.ts +68 -13
  590. package/templates/saas/components/dashboard-shell.tsx +212 -132
  591. package/templates/saas/components/marketing.tsx +137 -274
  592. package/templates/saas/components/pricing-table.tsx +12 -11
  593. package/templates/saas/components/setup-checklist.tsx +31 -29
  594. package/templates/saas/components/task-ui.tsx +199 -0
  595. package/templates/saas/functions/createProject.ts +7 -13
  596. package/templates/saas/functions/createTask.ts +67 -0
  597. package/templates/saas/functions/deleteProject.ts +17 -0
  598. package/templates/saas/functions/deleteTask.ts +14 -0
  599. package/templates/saas/functions/seedWorkspace.ts +46 -0
  600. package/templates/saas/functions/setProjectStatus.ts +41 -0
  601. package/templates/saas/functions/updateProfile.ts +13 -0
  602. package/templates/saas/functions/updateProject.ts +4 -5
  603. package/templates/saas/functions/updateTask.ts +88 -0
  604. package/templates/saas/lib/members.ts +53 -0
  605. package/templates/saas/lib/names.ts +53 -0
  606. package/templates/saas/lib/plans.ts +11 -0
  607. package/templates/saas/lib/sample-workspace.ts +117 -0
  608. package/templates/saas/lib/site.config.ts +200 -463
  609. package/templates/saas/lib/tasks.ts +101 -0
  610. package/templates/saas/lib/use-live.ts +25 -0
  611. package/templates/saas/public/favicon.ico +0 -0
  612. package/templates/saas/public/screenshots/board.png +0 -0
  613. package/templates/saas/public/screenshots/members.png +0 -0
  614. package/templates/saas/public/screenshots/overview.png +0 -0
  615. package/templates/saas/public/screenshots/projects.png +0 -0
  616. package/templates/saas/scripts/capture-screenshots.mjs +156 -0
  617. package/templates/saas/tests/names.test.ts +35 -0
  618. package/templates/saas/tests/plans.test.ts +12 -0
  619. package/templates/saas/tests/sample-workspace.test.ts +46 -0
  620. package/templates/saas/tests/tasks.test.ts +81 -0
  621. package/templates/shop/README.md +25 -13
  622. package/templates/shop/app/(marketing)/layout.tsx +94 -67
  623. package/templates/shop/app/(marketing)/not-found.tsx +13 -12
  624. package/templates/shop/app/(marketing)/page.tsx +120 -59
  625. package/templates/shop/app/(marketing)/shop-client.tsx +364 -237
  626. package/templates/shop/app/(marketing)/success/page.tsx +75 -22
  627. package/templates/shop/app/globals.css +94 -1
  628. package/templates/shop/app/layout.tsx +4 -4
  629. package/templates/shop/app/login/page.tsx +4 -4
  630. package/templates/shop/app.ts +18 -6
  631. package/templates/shop/components/cart-button.tsx +33 -0
  632. package/templates/shop/components/marketing.tsx +17 -87
  633. package/templates/shop/components/shelf-count.tsx +36 -0
  634. package/templates/shop/functions/checkout.ts +17 -1
  635. package/templates/shop/lib/cart-store.ts +57 -0
  636. package/templates/shop/lib/shelf-store.ts +35 -0
  637. package/templates/shop/lib/shop.ts +27 -0
  638. package/templates/shop/lib/site.config.ts +108 -98
  639. package/templates/shop/public/images/hero.jpg +0 -0
  640. package/templates/shop/public/images/products/cedar-smoke.jpg +0 -0
  641. package/templates/shop/public/images/products/fig-leaf.jpg +0 -0
  642. package/templates/shop/public/images/products/linen.jpg +0 -0
  643. package/templates/shop/public/images/products/sea-salt.jpg +0 -0
  644. package/templates/shop/public/images/products/tobacco-oak.jpg +0 -0
  645. package/templates/shop/tests/shop.test.ts +64 -0
  646. package/templates/waitlist/.env.example +7 -0
  647. package/templates/waitlist/README.md +29 -13
  648. package/templates/waitlist/app/(marketing)/page.tsx +9 -7
  649. package/templates/waitlist/app/(marketing)/waitlist-hero.tsx +64 -31
  650. package/templates/waitlist/app/auth-form.tsx +8 -8
  651. package/templates/waitlist/app/dashboard/dashboard-client.tsx +132 -95
  652. package/templates/waitlist/app/dashboard/page.tsx +17 -16
  653. package/templates/waitlist/app/icon.svg +2 -0
  654. package/templates/waitlist/app/login/page.tsx +14 -14
  655. package/templates/waitlist/app.ts +6 -6
  656. package/templates/waitlist/functions/joinWaitlist.ts +6 -18
  657. package/templates/waitlist/functions/seedDemo.ts +32 -0
  658. package/templates/waitlist/lib/demo.ts +94 -0
  659. package/templates/waitlist/lib/launch.ts +19 -0
  660. package/templates/waitlist/lib/site.config.ts +14 -9
  661. package/templates/waitlist/lib/stats.ts +35 -0
  662. package/templates/waitlist/public/favicon.ico +0 -0
  663. package/templates/waitlist/tests/counter.test.ts +107 -0
  664. package/templates/waitlist/tests/live-count.test.tsx +48 -0
  665. package/templates/ai-chat/tests/example.test.ts +0 -12
  666. package/templates/backend/consumer/apps/api/functions/feed.ts +0 -57
  667. package/templates/backend/consumer/apps/api/functions/profilePosts.ts +0 -17
  668. package/templates/backend/consumer/apps/api/functions/toggleLike.ts +0 -48
  669. package/templates/backend/consumer/apps/api/schema.ts +0 -143
  670. package/templates/chat/functions/_keep.ts +0 -13
  671. package/templates/chat/tests/example.test.ts +0 -12
  672. package/templates/ios/consumer/apps/ios/Sources/__APP_NAME_PASCAL__/ProfileSetupView.swift +0 -68
  673. package/templates/marketplace/client/LiveTicker.tsx +0 -116
  674. package/templates/marketplace/client/ScrollToListingsLink.tsx +0 -29
  675. package/templates/marketplace/public/images/marketplace-hero.webp +0 -0
@@ -1,420 +1,181 @@
1
1
  import React from "react";
2
2
  import { Link, type Metadata, type PageProps } from "@pylonsync/react";
3
+ import { ArrowRight } from "lucide-react";
3
4
  import {
4
5
  WRAP,
5
- Badge,
6
- Divider,
7
- Eyebrow,
8
- SectionHead,
9
- FeatureGrid,
6
+ FeatureList,
10
7
  PrimaryButton,
11
- GhostLink,
12
- Shot,
13
- Portrait,
14
- Terminal,
8
+ ProductShot,
9
+ SecondaryButton,
15
10
  } from "@/components/marketing";
16
- import { siteConfig, productBySlug, type Product } from "@/lib/site.config";
17
11
  import { PricingTable } from "@/components/pricing-table";
12
+ import { siteConfig } from "@/lib/site.config";
18
13
 
19
- // SEO metadata. Exported `metadata` is rendered into <head> on the server, so
20
- // this marketing page is fully indexable — view source and the copy is in the
21
- // HTML. All copy lives in lib/site.config.ts; edit it there.
14
+ // SEO metadata, rendered into <head> on the server. All copy lives in
15
+ // lib/site.config.ts; edit it there.
22
16
  export const metadata: Metadata = {
23
17
  title: siteConfig.seo.title,
24
18
  description: siteConfig.seo.description,
25
19
  };
26
20
 
27
- // The products the homepage features inline. Each links to its own
28
- // /products/[slug] page for the full story. (Defined once in lib/site.config.ts.)
29
- const projects = productBySlug("projects")!;
30
- const tasks = productBySlug("tasks")!;
31
- const docs = productBySlug("docs")!;
32
- const automations = productBySlug("automations")!;
33
-
34
- // `app/page.tsx` → `/`. A server-rendered marketing landing page. It reads
35
- // `auth` (resolved from the session cookie during the render) so the call to
36
- // action is right on the first byte — "Get started" for visitors, "Open
37
- // dashboard" once you're signed in. No client fetch, no flash. Every string is
38
- // sourced from `siteConfig` so the whole page rebrands from one file.
21
+ // `(marketing)/page.tsx` → `/`. The landing page: hero with a product shot,
22
+ // one section per product, a customer quote, pricing, FAQ, and a closing
23
+ // call to action. It reads `auth` during the server render, so the buttons
24
+ // say "Get started" to visitors and "Open dashboard" to signed-in people on
25
+ // the first byte. The screenshots are captures of this app's own dashboard
26
+ // (public/screenshots, made by scripts/capture-screenshots.mjs).
39
27
  export default function LandingPage({ auth }: PageProps) {
40
28
  const signedIn = Boolean(auth.user_id);
41
29
  const primaryHref = signedIn ? "/dashboard" : "/signup";
42
30
  const primaryLabel = signedIn ? "Open dashboard" : "Get started";
43
-
44
- const {
45
- hero,
46
- logoCloud,
47
- outcomes,
48
- featuredTestimonial,
49
- entryPoints,
50
- engagement,
51
- customers,
52
- gettingStarted,
53
- pricing,
54
- team,
55
- finalCta,
56
- faq,
57
- brand,
58
- } = siteConfig;
31
+ const { hero, products, quote, pricing, faq, finalCta } = siteConfig;
59
32
 
60
33
  return (
61
- <div className="bg-white text-zinc-900">
34
+ <div className="overflow-x-clip bg-white text-zinc-900">
62
35
  {/* ============================ HERO ============================ */}
63
- <section className={`${WRAP} pt-20 pb-16 sm:pt-28`}>
64
- <Badge>{hero.badge}</Badge>
65
- <h1 className="mt-6 max-w-2xl text-balance text-[2.75rem] font-semibold leading-[1.05] tracking-[-0.02em] sm:text-[3.5rem]">
66
- {hero.headline}
67
- </h1>
68
- <p className="mt-6 max-w-xl text-[17px] leading-relaxed text-zinc-500">
69
- {hero.subcopy}
70
- </p>
71
- <div className="mt-8 flex flex-wrap items-center gap-4">
72
- <PrimaryButton href={primaryHref}>{primaryLabel}</PrimaryButton>
73
- <GhostLink href="/#product">Take the tour →</GhostLink>
74
- </div>
75
-
76
- <div className="mt-16">
77
- <Shot url={`${brand.domain}/dashboard`} label={hero.mockupLabel} />
36
+ <section className="relative">
37
+ <div
38
+ aria-hidden
39
+ className="pointer-events-none absolute inset-x-0 top-0 h-[720px] bg-[radial-gradient(60%_55%_at_50%_0%,var(--brand-soft),transparent_70%)]"
40
+ />
41
+ <div
42
+ aria-hidden
43
+ className="pointer-events-none absolute inset-x-0 top-0 h-[720px] bg-[linear-gradient(to_right,rgba(24,24,27,0.045)_1px,transparent_1px),linear-gradient(to_bottom,rgba(24,24,27,0.045)_1px,transparent_1px)] bg-[size:56px_56px] [mask-image:radial-gradient(70%_60%_at_50%_0%,black,transparent_75%)]"
44
+ />
45
+ <div className={`${WRAP} relative pb-10 pt-14 sm:pt-20`}>
46
+ <div className="mx-auto max-w-4xl text-center">
47
+ <h1 className="text-balance text-[2.3rem] font-semibold leading-[1.04] tracking-[-0.04em] text-zinc-950 sm:text-[3.6rem]">
48
+ {hero.headline}
49
+ </h1>
50
+ <p className="mx-auto mt-5 max-w-xl text-balance text-[17px] leading-relaxed text-zinc-500 sm:text-[18px]">
51
+ {hero.subcopy}
52
+ </p>
53
+ <div className="mt-8 flex flex-wrap items-center justify-center gap-3">
54
+ <PrimaryButton href={primaryHref}>{primaryLabel}</PrimaryButton>
55
+ <SecondaryButton href="/pricing">See pricing</SecondaryButton>
56
+ </div>
57
+ <p className="mt-4 text-[13px] text-zinc-400">{hero.note}</p>
58
+ </div>
59
+ <div className="relative mx-auto mt-12 max-w-[1120px] sm:mt-14">
60
+ <ProductShot src={hero.screenshot} alt={hero.screenshotAlt} priority />
61
+ </div>
78
62
  </div>
79
63
  </section>
80
64
 
81
- {/* ========================= LOGO CLOUD ========================= */}
82
- <section className={`${WRAP} pb-16`}>
83
- <p className="font-mono text-[11px] uppercase tracking-[0.14em] text-zinc-400">
84
- {logoCloud.label}
85
- </p>
86
- <div className="mt-6 flex flex-wrap items-center gap-x-10 gap-y-4">
87
- {logoCloud.companies.map((name) => (
65
+ {/* ========================== PRODUCTS ========================== */}
66
+ <section id="features" className="scroll-mt-20">
67
+ {products.filter((p) => p.onLanding).map((p, i) => (
68
+ <div key={p.slug} className={`${WRAP} py-16 sm:py-20`}>
88
69
  <div
89
- key={name}
90
- className="flex items-center gap-2 text-zinc-400"
91
- title={name}
70
+ className={`grid items-center gap-10 lg:gap-14 ${
71
+ i % 2 === 1
72
+ ? "lg:grid-cols-[minmax(0,1.3fr)_minmax(0,0.9fr)]"
73
+ : "lg:grid-cols-[minmax(0,0.9fr)_minmax(0,1.3fr)]"
74
+ }`}
92
75
  >
93
- <span className="size-5 rounded bg-zinc-200" />
94
- <span className="text-[13px] font-semibold uppercase tracking-wide">
95
- {name}
96
- </span>
76
+ <div className={i % 2 === 1 ? "lg:order-2" : ""}>
77
+ <span className="flex size-9 items-center justify-center rounded-xl bg-white text-zinc-700 shadow-[0_0_0_1px_rgba(0,0,0,0.07),0_2px_4px_-1px_rgba(0,0,0,0.06)]">
78
+ <p.icon className="size-[18px]" strokeWidth={1.75} />
79
+ </span>
80
+ <h2 className="mt-5 text-balance text-[1.9rem] font-semibold leading-[1.1] tracking-[-0.03em] text-zinc-950 sm:text-[2.4rem]">
81
+ {p.headline}
82
+ </h2>
83
+ <p className="mt-4 max-w-md text-[15.5px] leading-relaxed text-zinc-500">{p.summary}</p>
84
+ <div className="mt-8">
85
+ <FeatureList items={p.features} />
86
+ </div>
87
+ <Link
88
+ href={`/products/${p.slug}`}
89
+ className="group mt-8 inline-flex items-center gap-1.5 text-[14px] font-medium text-zinc-900"
90
+ >
91
+ More about {p.title.toLowerCase()}
92
+ <ArrowRight className="size-4 transition-transform group-hover:translate-x-0.5" />
93
+ </Link>
94
+ </div>
95
+ <ProductShot
96
+ src={p.screenshot}
97
+ alt={p.screenshotAlt}
98
+ crop={p.crop}
99
+ className={i % 2 === 1 ? "lg:order-1" : ""}
100
+ />
97
101
  </div>
98
- ))}
99
- </div>
100
- </section>
101
-
102
- {/* ===================== OUTCOMES (2-col) ====================== */}
103
- <Divider />
104
- <section className={`${WRAP} py-20`}>
105
- <div className="grid gap-12 lg:grid-cols-[0.9fr_1.1fr]">
106
- <div>
107
- <Eyebrow>{outcomes.eyebrow}</Eyebrow>
108
- <h2 className="mt-4 text-balance text-3xl font-semibold leading-[1.1] tracking-[-0.02em] sm:text-[2.5rem]">
109
- {outcomes.headline}
110
- </h2>
111
- <p className="mt-5 max-w-md text-[15px] leading-relaxed text-zinc-500">
112
- {outcomes.body}
113
- </p>
114
102
  </div>
115
- <FeatureGrid columns={2} items={outcomes.items} />
116
- </div>
103
+ ))}
117
104
  </section>
118
105
 
119
- {/* ======================= TESTIMONIAL ========================= */}
120
- <Divider />
121
- <section className={`${WRAP} py-20`}>
122
- <div className="grid items-center gap-12 lg:grid-cols-[0.8fr_1.2fr]">
123
- <Portrait name={featuredTestimonial.name} />
124
- <figure>
125
- <div className="font-serif text-4xl leading-none text-brand">
126
- &ldquo;
127
- </div>
128
- <blockquote className="mt-4 text-balance text-2xl font-medium leading-[1.35] tracking-[-0.01em] sm:text-[1.75rem]">
129
- {featuredTestimonial.quote}
106
+ {/* ============================ QUOTE =========================== */}
107
+ {quote.quote ? (
108
+ <section className="border-y border-zinc-200/70 bg-zinc-50/70">
109
+ <figure className={`${WRAP} py-20 sm:py-28`}>
110
+ <blockquote className="mx-auto max-w-3xl text-balance text-center text-[1.6rem] font-medium leading-[1.3] tracking-[-0.02em] text-zinc-900 sm:text-[2.1rem]">
111
+ &ldquo;{quote.quote}&rdquo;
130
112
  </blockquote>
131
- <figcaption className="mt-8 border-t border-zinc-200/70 pt-6">
132
- <div className="text-sm font-semibold">
133
- {featuredTestimonial.name}
134
- </div>
135
- <div className="text-sm text-zinc-500">
136
- {featuredTestimonial.role}
137
- </div>
113
+ <figcaption className="mt-8 text-center text-[14px]">
114
+ <span className="font-semibold text-zinc-900">{quote.name}</span>
115
+ <span className="text-zinc-500"> · {quote.role}</span>
138
116
  </figcaption>
139
117
  </figure>
118
+ </section>
119
+ ) : null}
120
+
121
+ {/* =========================== PRICING ========================== */}
122
+ <section id="pricing" className={`${WRAP} scroll-mt-20 py-20 sm:py-28`}>
123
+ <div className="mx-auto max-w-2xl text-center">
124
+ <h2 className="text-[2rem] font-semibold tracking-[-0.03em] text-zinc-950 sm:text-[2.6rem]">
125
+ {pricing.headline}
126
+ </h2>
127
+ <p className="mt-4 text-[15.5px] leading-relaxed text-zinc-500">{pricing.body}</p>
140
128
  </div>
141
- </section>
142
-
143
- {/* =================== FEATURE: PROJECTS ======================= */}
144
- <Divider />
145
- <ProductSection id="product" product={projects} primaryHref={primaryHref} />
146
-
147
- {/* ===================== ENTRY POINTS ========================= */}
148
- <Divider />
149
- <section className={`${WRAP} py-20`}>
150
- <SectionHead
151
- eyebrow={entryPoints.eyebrow}
152
- title={entryPoints.title}
153
- body={entryPoints.body}
154
- />
155
- <div className="mt-12 grid gap-5 sm:grid-cols-2">
156
- {entryPoints.items.map((c, i) => (
157
- <div
158
- key={c.title}
159
- className="rounded-2xl border border-zinc-200 bg-paper p-7"
160
- >
161
- <div className="flex items-start justify-between">
162
- <span className="flex size-9 items-center justify-center rounded-lg bg-brand-soft text-brand">
163
- {c.icon}
164
- </span>
165
- <span className="font-mono text-[11px] text-zinc-300">
166
- 0{i + 1}
167
- </span>
168
- </div>
169
- <h3 className="mt-5 text-base font-semibold">{c.title}</h3>
170
- <p className="mt-2 text-[14px] leading-relaxed text-zinc-500">
171
- {c.body}
172
- </p>
173
- </div>
174
- ))}
129
+ <div className="mx-auto mt-12 max-w-4xl">
130
+ <PricingTable signedIn={signedIn} />
175
131
  </div>
176
132
  </section>
177
133
 
178
- {/* ====================== FEATURE: TASKS ===================== */}
179
- <Divider />
180
- <ProductSection product={tasks} primaryHref={primaryHref} />
181
-
182
- {/* ====================== FEATURE: DOCS ====================== */}
183
- <Divider />
184
- <ProductSection product={docs} primaryHref={primaryHref} />
185
-
186
- {/* ============== ENGAGEMENT (prose + numbered) ============== */}
187
- <Divider />
188
- <section className={`${WRAP} py-20`}>
189
- <Eyebrow>{engagement.eyebrow}</Eyebrow>
190
- <h2 className="mt-4 max-w-2xl text-balance text-3xl font-semibold leading-[1.1] tracking-[-0.02em] sm:text-[2.5rem]">
191
- {engagement.headline}
192
- </h2>
193
- <div className="mt-12 grid gap-12 lg:grid-cols-2">
194
- <div className="space-y-5 text-[15px] leading-relaxed text-zinc-500">
195
- {engagement.paragraphs.map((p) => (
196
- <p key={p}>{p}</p>
197
- ))}
198
- </div>
199
- <ol className="space-y-7">
200
- {engagement.items.map((e, i) => (
201
- <li key={e.title} className="flex gap-4">
202
- <span className="mt-0.5 font-mono text-[11px] text-zinc-300">
203
- 0{i + 1}
204
- </span>
205
- <div>
206
- <span className="text-[15px] font-medium text-brand">
207
- {e.title}.
208
- </span>{" "}
209
- <span className="text-[15px] leading-relaxed text-zinc-500">
210
- {e.body}
134
+ {/* ============================= FAQ ============================ */}
135
+ <section id="faq" className={`${WRAP} scroll-mt-20 pb-20 sm:pb-28`}>
136
+ <div className="grid gap-10 lg:grid-cols-[minmax(0,0.7fr)_minmax(0,1.3fr)]">
137
+ <h2 className="text-[2rem] font-semibold tracking-[-0.03em] text-zinc-950 sm:text-[2.6rem]">{faq.headline}</h2>
138
+ <div className="divide-y divide-zinc-200/80 border-y border-zinc-200/80">
139
+ {faq.items.map((f) => (
140
+ <details key={f.q} className="group py-5">
141
+ <summary className="flex cursor-pointer list-none items-center justify-between gap-6 text-[15.5px] font-medium text-zinc-900 marker:hidden [&::-webkit-details-marker]:hidden">
142
+ {f.q}
143
+ <span className="relative size-4 shrink-0 text-zinc-400" aria-hidden>
144
+ <span className="absolute left-0 top-1/2 h-px w-4 bg-current" />
145
+ <span className="absolute left-1/2 top-0 h-4 w-px bg-current transition-transform duration-300 ease-[cubic-bezier(0.32,0.72,0,1)] group-open:rotate-90" />
211
146
  </span>
212
- </div>
213
- </li>
147
+ </summary>
148
+ <p className="mt-3 max-w-2xl text-[14.5px] leading-relaxed text-zinc-500">{f.a}</p>
149
+ </details>
214
150
  ))}
215
- </ol>
216
- </div>
217
- </section>
218
-
219
- {/* ======================= AUTOMATIONS ======================= */}
220
- <Divider />
221
- <section className={`${WRAP} py-20`}>
222
- <SectionHead
223
- eyebrow={automations.eyebrow}
224
- arrow
225
- title={automations.headline}
226
- body={automations.summary}
227
- />
228
- <FeatureGrid className="mt-14" items={automations.features} />
229
- <div className="mt-8">
230
- <GhostLink href="/products/automations">
231
- Explore {automations.title} →
232
- </GhostLink>
233
- </div>
234
- <div className="mt-12">
235
- <Terminal />
236
- </div>
237
- </section>
238
-
239
- {/* =================== TESTIMONIAL CARDS ===================== */}
240
- <Divider />
241
- <section id="customers" className={`${WRAP} py-20`}>
242
- <SectionHead
243
- eyebrow={customers.eyebrow}
244
- title={customers.title}
245
- body={customers.body}
246
- />
247
- <div className="mt-12 grid gap-5 sm:grid-cols-3">
248
- {customers.quotes.map((q) => (
249
- <figure
250
- key={q.name + q.role}
251
- className="flex flex-col rounded-2xl border border-zinc-200 bg-paper p-6"
252
- >
253
- <blockquote className="text-[14px] leading-relaxed text-zinc-600">
254
- &ldquo;{q.quote}&rdquo;
255
- </blockquote>
256
- <figcaption className="mt-6 flex items-center gap-3">
257
- <span className="flex size-8 items-center justify-center rounded-full bg-zinc-200 text-[11px] font-semibold text-zinc-500">
258
- {initials(q.name)}
259
- </span>
260
- <div className="leading-tight">
261
- <div className="text-[13px] font-semibold">{q.name}</div>
262
- <div className="text-[12px] text-zinc-500">{q.role}</div>
263
- </div>
264
- </figcaption>
265
- </figure>
266
- ))}
267
- </div>
268
- </section>
269
-
270
- {/* ===================== GETTING STARTED ==================== */}
271
- <Divider />
272
- <section className={`${WRAP} py-20`}>
273
- <Eyebrow>{gettingStarted.eyebrow}</Eyebrow>
274
- <h2 className="mt-4 max-w-xl text-balance text-3xl font-semibold leading-[1.1] tracking-[-0.02em] sm:text-[2.5rem]">
275
- {gettingStarted.headline}
276
- </h2>
277
- <p className="mt-5 max-w-md text-[15px] leading-relaxed text-zinc-500">
278
- {gettingStarted.body}
279
- </p>
280
- <div className="mt-8">
281
- <PrimaryButton href={primaryHref}>{primaryLabel}</PrimaryButton>
282
- </div>
283
- <ol className="mt-14 max-w-xl space-y-8">
284
- {gettingStarted.steps.map((s, i) => (
285
- <li key={s.title} className="flex gap-5">
286
- <span className="flex size-7 shrink-0 items-center justify-center rounded-full bg-brand-soft font-mono text-[11px] text-brand">
287
- 0{i + 1}
288
- </span>
289
- <div>
290
- <h3 className="text-[15px] font-semibold">{s.title}</h3>
291
- <p className="mt-1.5 text-[14px] leading-relaxed text-zinc-500">
292
- {s.body}
293
- </p>
294
- </div>
295
- </li>
296
- ))}
297
- </ol>
298
- </section>
299
-
300
- {/* ========================= PRICING ======================== */}
301
- <Divider />
302
- <section id="pricing" className={`${WRAP} py-20`}>
303
- <Eyebrow>{pricing.eyebrow}</Eyebrow>
304
- <h2 className="mt-4 max-w-xl text-balance text-3xl font-semibold leading-[1.1] tracking-[-0.02em] sm:text-[2.5rem]">
305
- {pricing.headline}
306
- </h2>
307
- <p className="mt-5 max-w-md text-[15px] leading-relaxed text-zinc-500">
308
- {pricing.body}
309
- </p>
310
- <div className="mt-12">
311
- <PricingTable signedIn={signedIn} />
151
+ </div>
312
152
  </div>
313
153
  </section>
314
154
 
315
- {/* ====================== THE TEAM (2-col) ================== */}
316
- <Divider />
317
- <section className={`${WRAP} py-20`}>
318
- <div className="grid gap-12 lg:grid-cols-[0.9fr_1.1fr]">
319
- <div>
320
- <Eyebrow>{team.eyebrow}</Eyebrow>
321
- <h2 className="mt-4 text-balance text-3xl font-semibold leading-[1.1] tracking-[-0.02em] sm:text-[2.5rem]">
322
- {team.headline}
155
+ {/* ========================= FINAL CTA ========================== */}
156
+ <section className={`${WRAP} pb-20 sm:pb-28`}>
157
+ <div className="relative overflow-hidden rounded-[28px] bg-zinc-950 px-6 py-16 text-center sm:px-12 sm:py-20">
158
+ <div
159
+ aria-hidden
160
+ className="pointer-events-none absolute inset-0 bg-[radial-gradient(50%_80%_at_50%_0%,color-mix(in_srgb,var(--brand)_40%,transparent),transparent_70%)]"
161
+ />
162
+ <div className="relative">
163
+ <h2 className="text-balance text-[2rem] font-semibold tracking-[-0.03em] text-white sm:text-[2.6rem]">
164
+ {finalCta.headline}
323
165
  </h2>
324
- <p className="mt-5 max-w-md text-[15px] leading-relaxed text-zinc-500">
325
- {team.body}
326
- </p>
166
+ <p className="mx-auto mt-4 max-w-lg text-[15.5px] leading-relaxed text-zinc-400">{finalCta.body}</p>
167
+ <div className="mt-8 flex justify-center">
168
+ <Link
169
+ href={primaryHref}
170
+ className="group inline-flex h-10 items-center gap-2 rounded-full bg-white pl-5 pr-4 text-[14px] font-medium text-zinc-950 transition-[background-color,transform] duration-200 hover:bg-zinc-100 active:scale-[0.98]"
171
+ >
172
+ {signedIn ? "Open dashboard" : finalCta.cta}
173
+ <ArrowRight className="size-4 transition-transform group-hover:translate-x-0.5" />
174
+ </Link>
175
+ </div>
327
176
  </div>
328
- <FeatureGrid columns={2} items={team.items} />
329
- </div>
330
- </section>
331
-
332
- {/* ======================= FINAL CTA ======================== */}
333
- <Divider />
334
- <section className={`${WRAP} py-24`}>
335
- <Eyebrow>{finalCta.eyebrow}</Eyebrow>
336
- <h2 className="mt-4 max-w-xl text-balance text-[2.5rem] font-semibold leading-[1.05] tracking-[-0.02em] sm:text-[3rem]">
337
- {finalCta.headline}
338
- </h2>
339
- <p className="mt-6 max-w-lg text-[16px] leading-relaxed text-zinc-500">
340
- {finalCta.bodyLead}
341
- <span className="rounded bg-brand-soft px-1.5 py-0.5 font-medium text-brand">
342
- {finalCta.highlight}
343
- </span>
344
- {finalCta.bodyTail}
345
- </p>
346
- <div className="mt-8">
347
- <PrimaryButton href={primaryHref}>{finalCta.cta}</PrimaryButton>
348
- </div>
349
- <p className="mt-4 text-[12px] text-zinc-400">{finalCta.footnote}</p>
350
- </section>
351
-
352
- {/* ========================== FAQ =========================== */}
353
- <Divider />
354
- <section id="faq" className={`${WRAP} py-20`}>
355
- <Eyebrow>{faq.eyebrow}</Eyebrow>
356
- <h2 className="mt-4 text-balance text-3xl font-semibold leading-[1.1] tracking-[-0.02em] sm:text-[2.5rem]">
357
- {faq.headline}
358
- </h2>
359
- <div className="mt-10 divide-y divide-zinc-200/70 border-y border-zinc-200/70">
360
- {faq.items.map((f) => (
361
- <details key={f.q} className="group py-5">
362
- <summary className="flex cursor-pointer items-center justify-between text-[15px] font-medium text-zinc-900 marker:hidden [&::-webkit-details-marker]:hidden">
363
- {f.q}
364
- <span className="text-brand transition-transform group-open:rotate-45">
365
- +
366
- </span>
367
- </summary>
368
- <p className="mt-3 max-w-2xl text-[14px] leading-relaxed text-zinc-500">
369
- {f.a}
370
- </p>
371
- </details>
372
- ))}
373
177
  </div>
374
178
  </section>
375
179
  </div>
376
180
  );
377
181
  }
378
-
379
- // A homepage feature section for one product: eyebrow + headline + grid +
380
- // "Explore →" link to its /products/[slug] page + a product mockup.
381
- function ProductSection({
382
- product,
383
- primaryHref,
384
- id,
385
- }: {
386
- product: Product;
387
- primaryHref: string;
388
- id?: string;
389
- }) {
390
- return (
391
- <section id={id} className={`${WRAP} py-20`}>
392
- <SectionHead
393
- eyebrow={product.eyebrow}
394
- arrow
395
- title={product.headline}
396
- body={product.summary}
397
- />
398
- <FeatureGrid className="mt-14" items={product.features.slice(0, 6)} />
399
- <div className="mt-8">
400
- <GhostLink href={`/products/${product.slug}`}>
401
- Explore {product.title} →
402
- </GhostLink>
403
- </div>
404
- <div className="mt-12">
405
- <Shot url={product.mockupUrl} label={product.mockupLabel} />
406
- </div>
407
- </section>
408
- );
409
- }
410
-
411
- // Initials for the testimonial avatars, so the cards look finished without a
412
- // real photo. Drop in an <img> when you have one.
413
- function initials(name: string) {
414
- return name
415
- .split(/\s+/)
416
- .map((w) => w[0])
417
- .join("")
418
- .slice(0, 2)
419
- .toUpperCase();
420
- }
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  import { type Metadata, type PageProps } from "@pylonsync/react";
3
- import { WRAP, Eyebrow, Divider } from "@/components/marketing";
3
+ import { WRAP } from "@/components/marketing";
4
4
  import { PricingTable } from "@/components/pricing-table";
5
5
  import { siteConfig } from "@/lib/site.config";
6
6
  import { TRIAL_DAYS } from "@/lib/plans";
@@ -16,27 +16,29 @@ export default function PricingPage({ auth }: PageProps) {
16
16
  const { pricing, faq } = siteConfig;
17
17
  return (
18
18
  <div className="bg-white text-zinc-900">
19
- <section className={`${WRAP} pt-20 pb-16`}>
20
- <Eyebrow>{pricing.eyebrow}</Eyebrow>
21
- <h1 className="mt-4 max-w-xl text-balance text-4xl font-semibold leading-[1.1] tracking-[-0.02em] sm:text-5xl">
22
- {pricing.headline}
23
- </h1>
24
- <p className="mt-5 max-w-md text-[15px] leading-relaxed text-zinc-500">{pricing.body}</p>
25
- <div className="mt-12">
19
+ <section className={`${WRAP} pb-20 pt-16 sm:pt-24`}>
20
+ <div className="mx-auto max-w-2xl text-center">
21
+ <h1 className="text-[2.5rem] font-semibold tracking-[-0.035em] text-zinc-950 sm:text-[3.25rem]">
22
+ {pricing.headline}
23
+ </h1>
24
+ <p className="mt-4 text-[16px] leading-relaxed text-zinc-500">{pricing.body}</p>
25
+ </div>
26
+ <div className="mx-auto mt-12 max-w-4xl">
26
27
  <PricingTable signedIn={Boolean(auth.user_id)} />
27
28
  </div>
28
29
  </section>
29
- <Divider />
30
- <section className={`${WRAP} py-16`}>
31
- <h2 className="text-2xl font-semibold tracking-tight">Questions</h2>
32
- <dl className="mt-8 grid gap-8 md:grid-cols-2">
33
- {faq.items.map((f) => (
34
- <div key={f.q}>
35
- <dt className="text-sm font-semibold text-zinc-900">{f.q}</dt>
36
- <dd className="mt-1.5 text-sm leading-relaxed text-zinc-500">{f.a}</dd>
37
- </div>
38
- ))}
39
- </dl>
30
+ <section className="border-t border-zinc-200/70">
31
+ <div className={`${WRAP} py-16`}>
32
+ <h2 className="text-[1.5rem] font-semibold tracking-[-0.02em]">{faq.headline}</h2>
33
+ <dl className="mt-8 grid gap-x-12 gap-y-8 md:grid-cols-2">
34
+ {faq.items.map((f) => (
35
+ <div key={f.q}>
36
+ <dt className="text-[15px] font-medium text-zinc-900">{f.q}</dt>
37
+ <dd className="mt-1.5 text-[14px] leading-relaxed text-zinc-500">{f.a}</dd>
38
+ </div>
39
+ ))}
40
+ </dl>
41
+ </div>
40
42
  </section>
41
43
  </div>
42
44
  );