@beknurakhmed/webforge-cli 0.1.1 → 0.1.2

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 (324) hide show
  1. package/README.md +226 -226
  2. package/package.json +63 -63
  3. package/templates/extras/typescript/deps.json +6 -0
  4. package/templates/extras/typescript/react/tsconfig.json +21 -0
  5. package/templates/extras/typescript/vanilla/tsconfig.json +19 -0
  6. package/templates/extras/typescript/vue/tsconfig.json +20 -0
  7. package/templates/overlays/blog/angular/src/app/app.component.ts +100 -0
  8. package/templates/overlays/blog/angular/src/app/app.routes.ts +12 -0
  9. package/templates/overlays/blog/angular/src/app/components/blog-sidebar.component.ts +115 -0
  10. package/templates/overlays/blog/angular/src/app/components/post-card.component.ts +94 -0
  11. package/templates/overlays/blog/angular/src/app/pages/about.component.ts +114 -0
  12. package/templates/overlays/blog/angular/src/app/pages/category.component.ts +141 -0
  13. package/templates/overlays/blog/angular/src/app/pages/home.component.ts +143 -0
  14. package/templates/overlays/blog/angular/src/app/pages/post-detail.component.ts +196 -0
  15. package/templates/overlays/blog/angular/src/main.ts +10 -0
  16. package/templates/overlays/blog/nextjs/src/app/about/page.tsx +55 -0
  17. package/templates/overlays/blog/nextjs/src/app/category/[slug]/page.tsx +52 -0
  18. package/templates/overlays/blog/nextjs/src/app/components/BlogFooter.tsx +46 -0
  19. package/templates/overlays/blog/nextjs/src/app/components/BlogHeader.tsx +37 -0
  20. package/templates/overlays/blog/nextjs/src/app/components/BlogSidebar.tsx +56 -0
  21. package/templates/overlays/blog/nextjs/src/app/components/PostCard.tsx +42 -0
  22. package/templates/overlays/blog/nextjs/src/app/globals.css +158 -0
  23. package/templates/overlays/blog/nextjs/src/app/layout.tsx +20 -0
  24. package/templates/overlays/blog/nextjs/src/app/page.tsx +36 -0
  25. package/templates/overlays/blog/nextjs/src/app/post/[id]/page.tsx +78 -0
  26. package/templates/overlays/blog/nuxt/app.vue +27 -0
  27. package/templates/overlays/blog/nuxt/components/BlogFooter.vue +48 -0
  28. package/templates/overlays/blog/nuxt/components/BlogHeader.vue +55 -0
  29. package/templates/overlays/blog/nuxt/components/BlogSidebar.vue +144 -0
  30. package/templates/overlays/blog/nuxt/components/PostCard.vue +125 -0
  31. package/templates/overlays/blog/nuxt/layouts/default.vue +25 -0
  32. package/templates/overlays/blog/nuxt/pages/about.vue +161 -0
  33. package/templates/overlays/blog/nuxt/pages/category/[slug].vue +80 -0
  34. package/templates/overlays/blog/nuxt/pages/index.vue +54 -0
  35. package/templates/overlays/blog/nuxt/pages/post/[id].vue +158 -0
  36. package/templates/overlays/blog/react/src/App.css +58 -18
  37. package/templates/overlays/blog/react/src/App.tsx +16 -31
  38. package/templates/overlays/blog/react/src/components/BlogFooter.tsx +4 -2
  39. package/templates/overlays/blog/react/src/components/BlogHeader.tsx +12 -6
  40. package/templates/overlays/blog/react/src/components/BlogSidebar.tsx +9 -8
  41. package/templates/overlays/blog/react/src/components/Layout.tsx +17 -0
  42. package/templates/overlays/blog/react/src/components/PostCard.tsx +30 -0
  43. package/templates/overlays/blog/react/src/data/posts.ts +22 -0
  44. package/templates/overlays/blog/react/src/pages/About.tsx +33 -0
  45. package/templates/overlays/blog/react/src/pages/Category.tsx +29 -0
  46. package/templates/overlays/blog/react/src/pages/Home.tsx +18 -0
  47. package/templates/overlays/blog/react/src/pages/PostDetail.tsx +38 -0
  48. package/templates/overlays/blog/vanilla/src/main.ts +112 -0
  49. package/templates/overlays/blog/vanilla/src/pages/about.ts +106 -0
  50. package/templates/overlays/blog/vanilla/src/pages/category.ts +86 -0
  51. package/templates/overlays/blog/vanilla/src/pages/home.ts +103 -0
  52. package/templates/overlays/blog/vanilla/src/pages/post-detail.ts +108 -0
  53. package/templates/overlays/blog/vanilla/src/router.ts +33 -0
  54. package/templates/overlays/blog/vanilla/src/style.css +677 -0
  55. package/templates/overlays/blog/vue/src/App.vue +29 -0
  56. package/templates/overlays/blog/vue/src/components/BlogFooter.vue +8 -0
  57. package/templates/overlays/blog/vue/src/components/BlogHeader.vue +14 -0
  58. package/templates/overlays/blog/vue/src/components/BlogSidebar.vue +31 -0
  59. package/templates/overlays/blog/vue/src/components/PostCard.vue +17 -0
  60. package/templates/overlays/blog/vue/src/data.ts +82 -0
  61. package/templates/overlays/blog/vue/src/main.ts +6 -0
  62. package/templates/overlays/blog/vue/src/pages/About.vue +17 -0
  63. package/templates/overlays/blog/vue/src/pages/Category.vue +32 -0
  64. package/templates/overlays/blog/vue/src/pages/Home.vue +14 -0
  65. package/templates/overlays/blog/vue/src/pages/PostDetail.vue +22 -0
  66. package/templates/overlays/blog/vue/src/router.ts +19 -0
  67. package/templates/overlays/blog/vue/src/style.css +288 -0
  68. package/templates/overlays/crm/angular/src/app/app.component.ts +110 -0
  69. package/templates/overlays/crm/angular/src/app/app.routes.ts +12 -0
  70. package/templates/overlays/crm/angular/src/app/components/contacts-table.component.ts +98 -0
  71. package/templates/overlays/crm/angular/src/app/components/stats-cards.component.ts +63 -0
  72. package/templates/overlays/crm/angular/src/app/pages/contacts.component.ts +70 -0
  73. package/templates/overlays/crm/angular/src/app/pages/dashboard-home.component.ts +38 -0
  74. package/templates/overlays/crm/angular/src/app/pages/deals.component.ts +145 -0
  75. package/templates/overlays/crm/angular/src/app/pages/settings.component.ts +103 -0
  76. package/templates/overlays/crm/angular/src/main.ts +8 -0
  77. package/templates/overlays/crm/nextjs/src/app/components/ContactsTable.tsx +69 -0
  78. package/templates/overlays/crm/nextjs/src/app/components/Sidebar.tsx +45 -0
  79. package/templates/overlays/crm/nextjs/src/app/components/StatsCards.tsx +31 -0
  80. package/templates/overlays/crm/nextjs/src/app/contacts/page.tsx +111 -0
  81. package/templates/overlays/crm/nextjs/src/app/deals/page.tsx +111 -0
  82. package/templates/overlays/crm/nextjs/src/app/globals.css +165 -0
  83. package/templates/overlays/crm/nextjs/src/app/layout.tsx +20 -0
  84. package/templates/overlays/crm/nextjs/src/app/page.tsx +43 -0
  85. package/templates/overlays/crm/nextjs/src/app/settings/page.tsx +91 -0
  86. package/templates/overlays/crm/nuxt/app.vue +27 -0
  87. package/templates/overlays/crm/nuxt/components/ContactsTable.vue +140 -0
  88. package/templates/overlays/crm/nuxt/components/CrmSidebar.vue +97 -0
  89. package/templates/overlays/crm/nuxt/components/StatsCards.vue +63 -0
  90. package/templates/overlays/crm/nuxt/layouts/default.vue +21 -0
  91. package/templates/overlays/crm/nuxt/pages/contacts.vue +79 -0
  92. package/templates/overlays/crm/nuxt/pages/deals.vue +229 -0
  93. package/templates/overlays/crm/nuxt/pages/index.vue +186 -0
  94. package/templates/overlays/crm/nuxt/pages/settings.vue +233 -0
  95. package/templates/overlays/crm/react/src/App.css +49 -20
  96. package/templates/overlays/crm/react/src/App.tsx +16 -41
  97. package/templates/overlays/crm/react/src/components/ContactsTable.tsx +8 -8
  98. package/templates/overlays/crm/react/src/components/Layout.tsx +15 -0
  99. package/templates/overlays/crm/react/src/components/Sidebar.tsx +20 -14
  100. package/templates/overlays/crm/react/src/components/StatsCards.tsx +10 -12
  101. package/templates/overlays/crm/react/src/data/contacts.ts +19 -0
  102. package/templates/overlays/crm/react/src/pages/Contacts.tsx +32 -0
  103. package/templates/overlays/crm/react/src/pages/DashboardHome.tsx +44 -0
  104. package/templates/overlays/crm/react/src/pages/Deals.tsx +48 -0
  105. package/templates/overlays/crm/react/src/pages/Settings.tsx +35 -0
  106. package/templates/overlays/crm/vanilla/src/main.ts +95 -0
  107. package/templates/overlays/crm/vanilla/src/pages/contacts.ts +87 -0
  108. package/templates/overlays/crm/vanilla/src/pages/dashboard-home.ts +121 -0
  109. package/templates/overlays/crm/vanilla/src/pages/deals.ts +116 -0
  110. package/templates/overlays/crm/vanilla/src/pages/settings.ts +129 -0
  111. package/templates/overlays/crm/vanilla/src/router.ts +33 -0
  112. package/templates/overlays/crm/vanilla/src/style.css +766 -0
  113. package/templates/overlays/crm/vue/src/App.vue +25 -0
  114. package/templates/overlays/crm/vue/src/components/ContactsTable.vue +30 -0
  115. package/templates/overlays/crm/vue/src/components/CrmSidebar.vue +14 -0
  116. package/templates/overlays/crm/vue/src/components/StatsCards.vue +23 -0
  117. package/templates/overlays/crm/vue/src/data.ts +38 -0
  118. package/templates/overlays/crm/vue/src/main.ts +6 -0
  119. package/templates/overlays/crm/vue/src/pages/Contacts.vue +25 -0
  120. package/templates/overlays/crm/vue/src/pages/DashboardHome.vue +19 -0
  121. package/templates/overlays/crm/vue/src/pages/Deals.vue +34 -0
  122. package/templates/overlays/crm/vue/src/pages/Settings.vue +33 -0
  123. package/templates/overlays/crm/vue/src/router.ts +19 -0
  124. package/templates/overlays/crm/vue/src/style.css +272 -0
  125. package/templates/overlays/dashboard/angular/src/app/app.component.ts +135 -0
  126. package/templates/overlays/dashboard/angular/src/app/app.routes.ts +24 -0
  127. package/templates/overlays/dashboard/angular/src/app/components/chart-placeholder.component.ts +86 -0
  128. package/templates/overlays/dashboard/angular/src/app/components/data-table.component.ts +140 -0
  129. package/templates/overlays/dashboard/angular/src/app/components/kpi-cards.component.ts +120 -0
  130. package/templates/overlays/dashboard/angular/src/app/pages/analytics.component.ts +138 -0
  131. package/templates/overlays/dashboard/angular/src/app/pages/overview.component.ts +58 -0
  132. package/templates/overlays/dashboard/angular/src/app/pages/settings.component.ts +128 -0
  133. package/templates/overlays/dashboard/angular/src/app/pages/users.component.ts +153 -0
  134. package/templates/overlays/dashboard/angular/src/main.ts +10 -0
  135. package/templates/overlays/dashboard/nextjs/src/app/analytics/page.tsx +76 -0
  136. package/templates/overlays/dashboard/nextjs/src/app/components/ChartPlaceholder.tsx +58 -0
  137. package/templates/overlays/dashboard/nextjs/src/app/components/DataTable.tsx +60 -0
  138. package/templates/overlays/dashboard/nextjs/src/app/components/KPICards.tsx +31 -0
  139. package/templates/overlays/dashboard/nextjs/src/app/components/Sidebar.tsx +45 -0
  140. package/templates/overlays/dashboard/nextjs/src/app/globals.css +150 -0
  141. package/templates/overlays/dashboard/nextjs/src/app/layout.tsx +20 -0
  142. package/templates/overlays/dashboard/nextjs/src/app/page.tsx +20 -0
  143. package/templates/overlays/dashboard/nextjs/src/app/settings/page.tsx +118 -0
  144. package/templates/overlays/dashboard/nextjs/src/app/users/page.tsx +99 -0
  145. package/templates/overlays/dashboard/nuxt/app.vue +27 -0
  146. package/templates/overlays/dashboard/nuxt/components/ChartPlaceholder.vue +73 -0
  147. package/templates/overlays/dashboard/nuxt/components/DashSidebar.vue +97 -0
  148. package/templates/overlays/dashboard/nuxt/components/DataTable.vue +126 -0
  149. package/templates/overlays/dashboard/nuxt/components/KPICards.vue +76 -0
  150. package/templates/overlays/dashboard/nuxt/layouts/default.vue +21 -0
  151. package/templates/overlays/dashboard/nuxt/pages/analytics.vue +94 -0
  152. package/templates/overlays/dashboard/nuxt/pages/index.vue +49 -0
  153. package/templates/overlays/dashboard/nuxt/pages/settings.vue +239 -0
  154. package/templates/overlays/dashboard/nuxt/pages/users.vue +227 -0
  155. package/templates/overlays/dashboard/react/src/App.css +50 -24
  156. package/templates/overlays/dashboard/react/src/App.tsx +16 -22
  157. package/templates/overlays/dashboard/react/src/components/ChartPlaceholder.tsx +5 -2
  158. package/templates/overlays/dashboard/react/src/components/DataTable.tsx +9 -1
  159. package/templates/overlays/dashboard/react/src/components/KPICards.tsx +4 -4
  160. package/templates/overlays/dashboard/react/src/components/Layout.tsx +13 -0
  161. package/templates/overlays/dashboard/react/src/components/Sidebar.tsx +15 -10
  162. package/templates/overlays/dashboard/react/src/pages/Analytics.tsx +33 -0
  163. package/templates/overlays/dashboard/react/src/pages/Overview.tsx +23 -0
  164. package/templates/overlays/dashboard/react/src/pages/Settings.tsx +41 -0
  165. package/templates/overlays/dashboard/react/src/pages/Users.tsx +57 -0
  166. package/templates/overlays/dashboard/vanilla/src/main.ts +101 -0
  167. package/templates/overlays/dashboard/vanilla/src/pages/analytics.ts +99 -0
  168. package/templates/overlays/dashboard/vanilla/src/pages/overview.ts +60 -0
  169. package/templates/overlays/dashboard/vanilla/src/pages/settings.ts +118 -0
  170. package/templates/overlays/dashboard/vanilla/src/pages/users.ts +80 -0
  171. package/templates/overlays/dashboard/vanilla/src/router.ts +33 -0
  172. package/templates/overlays/dashboard/vanilla/src/style.css +654 -0
  173. package/templates/overlays/dashboard/vue/src/App.vue +12 -0
  174. package/templates/overlays/dashboard/vue/src/components/ChartPlaceholder.vue +34 -0
  175. package/templates/overlays/dashboard/vue/src/components/DashSidebar.vue +19 -0
  176. package/templates/overlays/dashboard/vue/src/components/DataTable.vue +34 -0
  177. package/templates/overlays/dashboard/vue/src/components/KPICards.vue +18 -0
  178. package/templates/overlays/dashboard/vue/src/main.ts +6 -0
  179. package/templates/overlays/dashboard/vue/src/pages/Analytics.vue +32 -0
  180. package/templates/overlays/dashboard/vue/src/pages/Overview.vue +17 -0
  181. package/templates/overlays/dashboard/vue/src/pages/Settings.vue +65 -0
  182. package/templates/overlays/dashboard/vue/src/pages/Users.vue +44 -0
  183. package/templates/overlays/dashboard/vue/src/router.ts +15 -0
  184. package/templates/overlays/dashboard/vue/src/style.css +447 -0
  185. package/templates/overlays/ecommerce/angular/src/app/app.component.ts +147 -0
  186. package/templates/overlays/ecommerce/angular/src/app/app.routes.ts +10 -0
  187. package/templates/overlays/ecommerce/angular/src/app/components/product-card.component.ts +94 -0
  188. package/templates/overlays/ecommerce/angular/src/app/data/products.ts +75 -0
  189. package/templates/overlays/ecommerce/angular/src/app/pages/cart.component.ts +169 -0
  190. package/templates/overlays/ecommerce/angular/src/app/pages/home.component.ts +96 -0
  191. package/templates/overlays/ecommerce/angular/src/app/pages/product-detail.component.ts +124 -0
  192. package/templates/overlays/ecommerce/angular/src/main.ts +10 -0
  193. package/templates/overlays/ecommerce/nextjs/src/app/cart/page.tsx +74 -0
  194. package/templates/overlays/ecommerce/nextjs/src/app/components/CartProvider.tsx +80 -0
  195. package/templates/overlays/ecommerce/nextjs/src/app/components/Footer.tsx +44 -0
  196. package/templates/overlays/ecommerce/nextjs/src/app/components/Header.tsx +27 -0
  197. package/templates/overlays/ecommerce/nextjs/src/app/components/ProductCard.tsx +23 -0
  198. package/templates/overlays/ecommerce/nextjs/src/app/globals.css +144 -0
  199. package/templates/overlays/ecommerce/nextjs/src/app/layout.tsx +23 -0
  200. package/templates/overlays/ecommerce/nextjs/src/app/page.tsx +73 -0
  201. package/templates/overlays/ecommerce/nextjs/src/app/product/[id]/page.tsx +63 -0
  202. package/templates/overlays/ecommerce/nuxt/app.vue +27 -0
  203. package/templates/overlays/ecommerce/nuxt/components/ProductCard.vue +77 -0
  204. package/templates/overlays/ecommerce/nuxt/components/StoreFooter.vue +47 -0
  205. package/templates/overlays/ecommerce/nuxt/components/StoreHeader.vue +91 -0
  206. package/templates/overlays/ecommerce/nuxt/layouts/default.vue +43 -0
  207. package/templates/overlays/ecommerce/nuxt/pages/cart.vue +268 -0
  208. package/templates/overlays/ecommerce/nuxt/pages/index.vue +154 -0
  209. package/templates/overlays/ecommerce/nuxt/pages/product/[id].vue +211 -0
  210. package/templates/overlays/ecommerce/react/src/App.css +71 -59
  211. package/templates/overlays/ecommerce/react/src/App.tsx +18 -44
  212. package/templates/overlays/ecommerce/react/src/components/Footer.tsx +2 -2
  213. package/templates/overlays/ecommerce/react/src/components/Header.tsx +15 -14
  214. package/templates/overlays/ecommerce/react/src/components/Layout.tsx +20 -0
  215. package/templates/overlays/ecommerce/react/src/components/ProductCard.tsx +28 -0
  216. package/templates/overlays/ecommerce/react/src/data/products.ts +23 -0
  217. package/templates/overlays/ecommerce/react/src/pages/Cart.tsx +51 -0
  218. package/templates/overlays/ecommerce/react/src/pages/Home.tsx +37 -0
  219. package/templates/overlays/ecommerce/react/src/pages/ProductDetail.tsx +38 -0
  220. package/templates/overlays/ecommerce/vanilla/src/main.ts +73 -0
  221. package/templates/overlays/ecommerce/vanilla/src/pages/cart.ts +73 -0
  222. package/templates/overlays/ecommerce/vanilla/src/pages/home.ts +71 -0
  223. package/templates/overlays/ecommerce/vanilla/src/pages/product-detail.ts +81 -0
  224. package/templates/overlays/ecommerce/vanilla/src/router.ts +33 -0
  225. package/templates/overlays/ecommerce/vanilla/src/style.css +522 -0
  226. package/templates/overlays/ecommerce/vue/src/App.vue +17 -32
  227. package/templates/overlays/ecommerce/vue/src/components/ProductCard.vue +25 -0
  228. package/templates/overlays/ecommerce/vue/src/components/StoreFooter.vue +6 -12
  229. package/templates/overlays/ecommerce/vue/src/components/StoreHeader.vue +5 -23
  230. package/templates/overlays/ecommerce/vue/src/data.ts +23 -0
  231. package/templates/overlays/ecommerce/vue/src/main.ts +6 -0
  232. package/templates/overlays/ecommerce/vue/src/pages/Cart.vue +34 -0
  233. package/templates/overlays/ecommerce/vue/src/pages/Home.vue +27 -0
  234. package/templates/overlays/ecommerce/vue/src/pages/ProductDetail.vue +27 -0
  235. package/templates/overlays/ecommerce/vue/src/router.ts +13 -0
  236. package/templates/overlays/ecommerce/vue/src/style.css +359 -0
  237. package/templates/overlays/portfolio/angular/src/app/app.component.ts +102 -0
  238. package/templates/overlays/portfolio/angular/src/app/app.routes.ts +12 -0
  239. package/templates/overlays/portfolio/angular/src/app/components/project-card.component.ts +86 -0
  240. package/templates/overlays/portfolio/angular/src/app/components/skills-grid.component.ts +88 -0
  241. package/templates/overlays/portfolio/angular/src/app/pages/about.component.ts +122 -0
  242. package/templates/overlays/portfolio/angular/src/app/pages/contact.component.ts +131 -0
  243. package/templates/overlays/portfolio/angular/src/app/pages/home.component.ts +207 -0
  244. package/templates/overlays/portfolio/angular/src/app/pages/projects.component.ts +150 -0
  245. package/templates/overlays/portfolio/angular/src/main.ts +10 -0
  246. package/templates/overlays/portfolio/nextjs/src/app/about/page.tsx +70 -0
  247. package/templates/overlays/portfolio/nextjs/src/app/components/Footer.tsx +37 -0
  248. package/templates/overlays/portfolio/nextjs/src/app/components/Navbar.tsx +37 -0
  249. package/templates/overlays/portfolio/nextjs/src/app/components/ProjectCard.tsx +35 -0
  250. package/templates/overlays/portfolio/nextjs/src/app/components/SkillsGrid.tsx +45 -0
  251. package/templates/overlays/portfolio/nextjs/src/app/contact/page.tsx +138 -0
  252. package/templates/overlays/portfolio/nextjs/src/app/globals.css +197 -0
  253. package/templates/overlays/portfolio/nextjs/src/app/layout.tsx +20 -0
  254. package/templates/overlays/portfolio/nextjs/src/app/page.tsx +60 -0
  255. package/templates/overlays/portfolio/nextjs/src/app/projects/page.tsx +56 -0
  256. package/templates/overlays/portfolio/nuxt/app.vue +27 -0
  257. package/templates/overlays/portfolio/nuxt/components/PortfolioFooter.vue +49 -0
  258. package/templates/overlays/portfolio/nuxt/components/PortfolioNav.vue +77 -0
  259. package/templates/overlays/portfolio/nuxt/components/ProjectCard.vue +102 -0
  260. package/templates/overlays/portfolio/nuxt/components/SkillsGrid.vue +89 -0
  261. package/templates/overlays/portfolio/nuxt/layouts/default.vue +21 -0
  262. package/templates/overlays/portfolio/nuxt/pages/about.vue +179 -0
  263. package/templates/overlays/portfolio/nuxt/pages/contact.vue +278 -0
  264. package/templates/overlays/portfolio/nuxt/pages/index.vue +160 -0
  265. package/templates/overlays/portfolio/nuxt/pages/projects.vue +116 -0
  266. package/templates/overlays/portfolio/react/src/App.css +54 -27
  267. package/templates/overlays/portfolio/react/src/App.tsx +16 -12
  268. package/templates/overlays/portfolio/react/src/components/Layout.tsx +17 -0
  269. package/templates/overlays/portfolio/react/src/components/Navbar.tsx +30 -0
  270. package/templates/overlays/portfolio/react/src/components/PortfolioFooter.tsx +5 -3
  271. package/templates/overlays/portfolio/react/src/components/ProjectCard.tsx +24 -0
  272. package/templates/overlays/portfolio/react/src/components/SkillsGrid.tsx +20 -0
  273. package/templates/overlays/portfolio/react/src/data/projects.ts +25 -0
  274. package/templates/overlays/portfolio/react/src/pages/About.tsx +43 -0
  275. package/templates/overlays/portfolio/react/src/pages/Contact.tsx +48 -0
  276. package/templates/overlays/portfolio/react/src/pages/Home.tsx +44 -0
  277. package/templates/overlays/portfolio/react/src/pages/Projects.tsx +36 -0
  278. package/templates/overlays/portfolio/vanilla/src/main.ts +58 -0
  279. package/templates/overlays/portfolio/vanilla/src/pages/about.ts +146 -0
  280. package/templates/overlays/portfolio/vanilla/src/pages/contact.ts +159 -0
  281. package/templates/overlays/portfolio/vanilla/src/pages/home.ts +123 -0
  282. package/templates/overlays/portfolio/vanilla/src/pages/projects.ts +89 -0
  283. package/templates/overlays/portfolio/vanilla/src/router.ts +33 -0
  284. package/templates/overlays/portfolio/vanilla/src/style.css +909 -0
  285. package/templates/overlays/portfolio/vue/src/App.vue +25 -0
  286. package/templates/overlays/portfolio/vue/src/components/PortfolioFooter.vue +14 -0
  287. package/templates/overlays/portfolio/vue/src/components/PortfolioNav.vue +16 -0
  288. package/templates/overlays/portfolio/vue/src/components/ProjectCard.vue +18 -0
  289. package/templates/overlays/portfolio/vue/src/components/SkillsGrid.vue +14 -0
  290. package/templates/overlays/portfolio/vue/src/data.ts +78 -0
  291. package/templates/overlays/portfolio/vue/src/main.ts +6 -0
  292. package/templates/overlays/portfolio/vue/src/pages/About.vue +30 -0
  293. package/templates/overlays/portfolio/vue/src/pages/Contact.vue +47 -0
  294. package/templates/overlays/portfolio/vue/src/pages/Home.vue +27 -0
  295. package/templates/overlays/portfolio/vue/src/pages/Projects.vue +33 -0
  296. package/templates/overlays/portfolio/vue/src/router.ts +19 -0
  297. package/templates/overlays/portfolio/vue/src/style.css +404 -0
  298. package/templates/react/package.json +23 -19
  299. package/templates/react/tsconfig.json +20 -0
  300. package/templates/styling/tailwind/deps.json +7 -6
  301. package/templates/styling/tailwind/nextjs/postcss.config.mjs +7 -0
  302. package/templates/styling/tailwind/nextjs/src/app/globals.css +1 -0
  303. package/templates/styling/tailwind/react/src/index.css +1 -0
  304. package/templates/styling/tailwind/react/vite.config.ts +7 -0
  305. package/templates/styling/tailwind/vanilla/src/style.css +1 -0
  306. package/templates/styling/tailwind/vanilla/vite.config.ts +6 -0
  307. package/templates/styling/tailwind/vue/src/style.css +1 -0
  308. package/templates/styling/tailwind/vue/vite.config.ts +7 -0
  309. package/templates/vanilla/package.json +15 -14
  310. package/templates/vanilla/tsconfig.json +19 -0
  311. package/templates/vue/package.json +21 -18
  312. package/templates/vue/tsconfig.json +20 -0
  313. package/templates/overlays/blog/react/src/components/PostList.tsx +0 -27
  314. package/templates/overlays/crm/react/src/components/Filters.tsx +0 -22
  315. package/templates/overlays/ecommerce/react/src/components/Cart.tsx +0 -47
  316. package/templates/overlays/ecommerce/react/src/components/ProductGrid.tsx +0 -32
  317. package/templates/overlays/ecommerce/vue/src/components/CartPanel.vue +0 -46
  318. package/templates/overlays/ecommerce/vue/src/components/ProductGrid.vue +0 -40
  319. package/templates/overlays/portfolio/react/src/components/ContactForm.tsx +0 -29
  320. package/templates/overlays/portfolio/react/src/components/HeroSection.tsx +0 -24
  321. package/templates/overlays/portfolio/react/src/components/Projects.tsx +0 -33
  322. package/templates/overlays/portfolio/react/src/components/Skills.tsx +0 -27
  323. package/templates/styling/tailwind/config/postcss.config.js +0 -5
  324. package/templates/styling/tailwind/config/tailwind.config.js +0 -11
@@ -0,0 +1,125 @@
1
+ <script setup lang="ts">
2
+ defineProps<{
3
+ post: {
4
+ id: number;
5
+ title: string;
6
+ excerpt: string;
7
+ date: string;
8
+ author: string;
9
+ category: string;
10
+ image: string;
11
+ readTime: string;
12
+ };
13
+ }>();
14
+ </script>
15
+
16
+ <template>
17
+ <NuxtLink :to="`/post/${post.id}`" class="post-card">
18
+ <div class="card-image">
19
+ <span class="emoji">{{ post.image }}</span>
20
+ </div>
21
+ <div class="card-body">
22
+ <div class="card-meta">
23
+ <NuxtLink :to="`/category/${post.category.toLowerCase()}`" class="card-category" @click.stop>
24
+ {{ post.category }}
25
+ </NuxtLink>
26
+ <span class="card-read-time">{{ post.readTime }}</span>
27
+ </div>
28
+ <h3 class="card-title">{{ post.title }}</h3>
29
+ <p class="card-excerpt">{{ post.excerpt }}</p>
30
+ <div class="card-footer">
31
+ <span class="card-author">{{ post.author }}</span>
32
+ <span class="card-date">{{ post.date }}</span>
33
+ </div>
34
+ </div>
35
+ </NuxtLink>
36
+ </template>
37
+
38
+ <style scoped>
39
+ .post-card {
40
+ background: white;
41
+ border-radius: 12px;
42
+ overflow: hidden;
43
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
44
+ transition: transform 0.2s, box-shadow 0.2s;
45
+ display: block;
46
+ }
47
+
48
+ .post-card:hover {
49
+ transform: translateY(-4px);
50
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
51
+ }
52
+
53
+ .card-image {
54
+ background: linear-gradient(135deg, #eef2ff, #e0e7ff);
55
+ display: flex;
56
+ align-items: center;
57
+ justify-content: center;
58
+ padding: 2rem;
59
+ }
60
+
61
+ .emoji {
62
+ font-size: 3.5rem;
63
+ }
64
+
65
+ .card-body {
66
+ padding: 1.25rem;
67
+ }
68
+
69
+ .card-meta {
70
+ display: flex;
71
+ justify-content: space-between;
72
+ align-items: center;
73
+ margin-bottom: 0.5rem;
74
+ }
75
+
76
+ .card-category {
77
+ font-size: 0.75rem;
78
+ color: #4f46e5;
79
+ font-weight: 600;
80
+ text-transform: uppercase;
81
+ letter-spacing: 0.05em;
82
+ font-family: 'Segoe UI', system-ui, sans-serif;
83
+ }
84
+
85
+ .card-category:hover {
86
+ text-decoration: underline;
87
+ }
88
+
89
+ .card-read-time {
90
+ font-size: 0.75rem;
91
+ color: #9ca3af;
92
+ font-family: 'Segoe UI', system-ui, sans-serif;
93
+ }
94
+
95
+ .card-title {
96
+ font-size: 1.15rem;
97
+ color: #111827;
98
+ margin-bottom: 0.5rem;
99
+ line-height: 1.4;
100
+ }
101
+
102
+ .card-excerpt {
103
+ font-size: 0.9rem;
104
+ color: #6b7280;
105
+ margin-bottom: 1rem;
106
+ line-height: 1.6;
107
+ display: -webkit-box;
108
+ -webkit-line-clamp: 2;
109
+ -webkit-box-orient: vertical;
110
+ overflow: hidden;
111
+ }
112
+
113
+ .card-footer {
114
+ display: flex;
115
+ justify-content: space-between;
116
+ font-size: 0.8rem;
117
+ color: #9ca3af;
118
+ font-family: 'Segoe UI', system-ui, sans-serif;
119
+ }
120
+
121
+ .card-author {
122
+ font-weight: 600;
123
+ color: #374151;
124
+ }
125
+ </style>
@@ -0,0 +1,25 @@
1
+ <template>
2
+ <div class="blog-layout">
3
+ <BlogHeader />
4
+ <main class="blog-main">
5
+ <slot />
6
+ </main>
7
+ <BlogFooter />
8
+ </div>
9
+ </template>
10
+
11
+ <style>
12
+ .blog-layout {
13
+ min-height: 100vh;
14
+ display: flex;
15
+ flex-direction: column;
16
+ }
17
+
18
+ .blog-main {
19
+ flex: 1;
20
+ max-width: 1100px;
21
+ width: 100%;
22
+ margin: 0 auto;
23
+ padding: 2rem 1rem;
24
+ }
25
+ </style>
@@ -0,0 +1,161 @@
1
+ <script setup lang="ts">
2
+ const authors = [
3
+ { name: 'Alex Rivera', role: 'Tech Lead & Writer', bio: 'Full-stack developer passionate about modern web technologies and teaching.', avatar: '👨‍💻' },
4
+ { name: 'Sarah Chen', role: 'Design Editor', bio: 'UI/UX designer exploring the intersection of aesthetics and usability.', avatar: '👩‍🎨' },
5
+ { name: 'Jordan Lee', role: 'Business & Lifestyle', bio: 'Entrepreneur and writer covering business strategy and digital wellness.', avatar: '🧑‍💼' },
6
+ ];
7
+ </script>
8
+
9
+ <template>
10
+ <div class="about-page">
11
+ <div class="about-hero">
12
+ <h1>About {{projectName}}</h1>
13
+ <p class="hero-desc">
14
+ We are a team of passionate writers and developers sharing insights about
15
+ technology, design, business, and modern living. Our mission is to provide
16
+ thoughtful, practical content that helps you grow professionally and personally.
17
+ </p>
18
+ </div>
19
+
20
+ <section class="authors-section">
21
+ <h2>Our Writers</h2>
22
+ <div class="authors-grid">
23
+ <div v-for="author in authors" :key="author.name" class="author-card">
24
+ <span class="author-avatar">{{ author.avatar }}</span>
25
+ <h3 class="author-name">{{ author.name }}</h3>
26
+ <p class="author-role">{{ author.role }}</p>
27
+ <p class="author-bio">{{ author.bio }}</p>
28
+ </div>
29
+ </div>
30
+ </section>
31
+
32
+ <section class="mission-section">
33
+ <h2>Our Mission</h2>
34
+ <div class="mission-grid">
35
+ <div class="mission-card">
36
+ <span class="mission-icon">📚</span>
37
+ <h3>Quality Content</h3>
38
+ <p>Well-researched, in-depth articles that provide real value to our readers.</p>
39
+ </div>
40
+ <div class="mission-card">
41
+ <span class="mission-icon">🌍</span>
42
+ <h3>Community</h3>
43
+ <p>Building a community of learners who share knowledge and support each other.</p>
44
+ </div>
45
+ <div class="mission-card">
46
+ <span class="mission-icon">💡</span>
47
+ <h3>Innovation</h3>
48
+ <p>Staying at the forefront of technology and sharing insights from the cutting edge.</p>
49
+ </div>
50
+ </div>
51
+ </section>
52
+ </div>
53
+ </template>
54
+
55
+ <style scoped>
56
+ .about-hero {
57
+ text-align: center;
58
+ padding: 2rem 0 3rem;
59
+ max-width: 700px;
60
+ margin: 0 auto;
61
+ }
62
+
63
+ .about-hero h1 {
64
+ font-size: 2.25rem;
65
+ color: #111827;
66
+ margin-bottom: 1rem;
67
+ }
68
+
69
+ .hero-desc {
70
+ font-size: 1.1rem;
71
+ color: #6b7280;
72
+ line-height: 1.8;
73
+ }
74
+
75
+ .authors-section,
76
+ .mission-section {
77
+ margin-bottom: 3rem;
78
+ }
79
+
80
+ .authors-section h2,
81
+ .mission-section h2 {
82
+ font-size: 1.5rem;
83
+ color: #111827;
84
+ margin-bottom: 1.5rem;
85
+ text-align: center;
86
+ }
87
+
88
+ .authors-grid {
89
+ display: grid;
90
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
91
+ gap: 1.5rem;
92
+ }
93
+
94
+ .author-card {
95
+ background: white;
96
+ border-radius: 12px;
97
+ padding: 2rem;
98
+ text-align: center;
99
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
100
+ }
101
+
102
+ .author-avatar {
103
+ font-size: 3.5rem;
104
+ display: block;
105
+ margin-bottom: 1rem;
106
+ }
107
+
108
+ .author-name {
109
+ font-size: 1.15rem;
110
+ color: #111827;
111
+ margin-bottom: 0.25rem;
112
+ font-family: 'Segoe UI', system-ui, sans-serif;
113
+ }
114
+
115
+ .author-role {
116
+ font-size: 0.85rem;
117
+ color: #4f46e5;
118
+ font-weight: 600;
119
+ margin-bottom: 0.75rem;
120
+ font-family: 'Segoe UI', system-ui, sans-serif;
121
+ }
122
+
123
+ .author-bio {
124
+ font-size: 0.9rem;
125
+ color: #6b7280;
126
+ line-height: 1.6;
127
+ }
128
+
129
+ .mission-grid {
130
+ display: grid;
131
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
132
+ gap: 1.5rem;
133
+ }
134
+
135
+ .mission-card {
136
+ background: white;
137
+ border-radius: 12px;
138
+ padding: 2rem;
139
+ text-align: center;
140
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
141
+ }
142
+
143
+ .mission-icon {
144
+ font-size: 2.5rem;
145
+ display: block;
146
+ margin-bottom: 1rem;
147
+ }
148
+
149
+ .mission-card h3 {
150
+ font-size: 1.1rem;
151
+ color: #111827;
152
+ margin-bottom: 0.5rem;
153
+ font-family: 'Segoe UI', system-ui, sans-serif;
154
+ }
155
+
156
+ .mission-card p {
157
+ font-size: 0.9rem;
158
+ color: #6b7280;
159
+ line-height: 1.6;
160
+ }
161
+ </style>
@@ -0,0 +1,80 @@
1
+ <script setup lang="ts">
2
+ const route = useRoute();
3
+ const slug = route.params.slug as string;
4
+
5
+ const posts = [
6
+ { id: 1, title: 'Getting Started with Vue 3 Composition API', excerpt: 'Learn the fundamentals of Vue 3 Composition API and how it transforms the way we build components.', date: 'Jan 15, 2024', author: 'Alex Rivera', category: 'Technology', image: '💻', readTime: '5 min read' },
7
+ { id: 2, title: 'Modern UI Design Principles', excerpt: 'Explore the key principles that make modern user interfaces intuitive, beautiful, and accessible.', date: 'Jan 12, 2024', author: 'Sarah Chen', category: 'Design', image: '🎨', readTime: '4 min read' },
8
+ { id: 3, title: 'Building Scalable Web Applications', excerpt: 'Best practices for building web applications that scale from hundreds to millions of users.', date: 'Jan 10, 2024', author: 'Alex Rivera', category: 'Technology', image: '🏗️', readTime: '7 min read' },
9
+ { id: 4, title: 'The Future of Remote Work', excerpt: 'How remote work is reshaping the business landscape and what it means for teams worldwide.', date: 'Jan 8, 2024', author: 'Jordan Lee', category: 'Business', image: '🏠', readTime: '6 min read' },
10
+ { id: 5, title: 'Color Theory for Developers', excerpt: 'A practical guide to using color effectively in your web projects without being a designer.', date: 'Jan 5, 2024', author: 'Sarah Chen', category: 'Design', image: '🌈', readTime: '5 min read' },
11
+ { id: 6, title: 'Startup Lessons Learned', excerpt: 'Key takeaways from building and growing a tech startup in a competitive market.', date: 'Jan 3, 2024', author: 'Jordan Lee', category: 'Business', image: '🚀', readTime: '8 min read' },
12
+ { id: 7, title: 'TypeScript Best Practices', excerpt: 'Write cleaner, safer code with these TypeScript patterns and conventions used by top teams.', date: 'Jan 1, 2024', author: 'Alex Rivera', category: 'Technology', image: '📘', readTime: '6 min read' },
13
+ { id: 8, title: 'Digital Minimalism', excerpt: 'How simplifying your digital life can boost productivity and improve well-being.', date: 'Dec 28, 2023', author: 'Jordan Lee', category: 'Lifestyle', image: '🧘', readTime: '4 min read' },
14
+ ];
15
+
16
+ const categoryName = computed(() => {
17
+ const s = slug.toString();
18
+ return s.charAt(0).toUpperCase() + s.slice(1);
19
+ });
20
+
21
+ const filteredPosts = computed(() =>
22
+ posts.filter(p => p.category.toLowerCase() === slug.toString().toLowerCase())
23
+ );
24
+ </script>
25
+
26
+ <template>
27
+ <div class="category-page">
28
+ <NuxtLink to="/" class="back-link">← All Posts</NuxtLink>
29
+
30
+ <h1 class="page-title">{{ categoryName }}</h1>
31
+ <p class="page-subtitle">{{ filteredPosts.length }} post{{ filteredPosts.length !== 1 ? 's' : '' }} in this category</p>
32
+
33
+ <div class="posts-grid">
34
+ <PostCard v-for="post in filteredPosts" :key="post.id" :post="post" />
35
+ </div>
36
+
37
+ <p v-if="filteredPosts.length === 0" class="no-results">
38
+ No posts found in this category.
39
+ </p>
40
+ </div>
41
+ </template>
42
+
43
+ <style scoped>
44
+ .back-link {
45
+ display: inline-block;
46
+ color: #4f46e5;
47
+ margin-bottom: 1.5rem;
48
+ font-weight: 500;
49
+ font-family: 'Segoe UI', system-ui, sans-serif;
50
+ }
51
+
52
+ .back-link:hover {
53
+ text-decoration: underline;
54
+ }
55
+
56
+ .page-title {
57
+ font-size: 2rem;
58
+ color: #111827;
59
+ margin-bottom: 0.25rem;
60
+ }
61
+
62
+ .page-subtitle {
63
+ color: #6b7280;
64
+ margin-bottom: 2rem;
65
+ font-family: 'Segoe UI', system-ui, sans-serif;
66
+ }
67
+
68
+ .posts-grid {
69
+ display: grid;
70
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
71
+ gap: 1.5rem;
72
+ }
73
+
74
+ .no-results {
75
+ text-align: center;
76
+ color: #6b7280;
77
+ padding: 3rem 0;
78
+ font-size: 1.1rem;
79
+ }
80
+ </style>
@@ -0,0 +1,54 @@
1
+ <script setup lang="ts">
2
+ const posts = [
3
+ { id: 1, title: 'Getting Started with Vue 3 Composition API', excerpt: 'Learn the fundamentals of Vue 3 Composition API and how it transforms the way we build components.', date: 'Jan 15, 2024', author: 'Alex Rivera', category: 'Technology', image: '💻', readTime: '5 min read' },
4
+ { id: 2, title: 'Modern UI Design Principles', excerpt: 'Explore the key principles that make modern user interfaces intuitive, beautiful, and accessible.', date: 'Jan 12, 2024', author: 'Sarah Chen', category: 'Design', image: '🎨', readTime: '4 min read' },
5
+ { id: 3, title: 'Building Scalable Web Applications', excerpt: 'Best practices for building web applications that scale from hundreds to millions of users.', date: 'Jan 10, 2024', author: 'Alex Rivera', category: 'Technology', image: '🏗️', readTime: '7 min read' },
6
+ { id: 4, title: 'The Future of Remote Work', excerpt: 'How remote work is reshaping the business landscape and what it means for teams worldwide.', date: 'Jan 8, 2024', author: 'Jordan Lee', category: 'Business', image: '🏠', readTime: '6 min read' },
7
+ { id: 5, title: 'Color Theory for Developers', excerpt: 'A practical guide to using color effectively in your web projects without being a designer.', date: 'Jan 5, 2024', author: 'Sarah Chen', category: 'Design', image: '🌈', readTime: '5 min read' },
8
+ { id: 6, title: 'Startup Lessons Learned', excerpt: 'Key takeaways from building and growing a tech startup in a competitive market.', date: 'Jan 3, 2024', author: 'Jordan Lee', category: 'Business', image: '🚀', readTime: '8 min read' },
9
+ { id: 7, title: 'TypeScript Best Practices', excerpt: 'Write cleaner, safer code with these TypeScript patterns and conventions used by top teams.', date: 'Jan 1, 2024', author: 'Alex Rivera', category: 'Technology', image: '📘', readTime: '6 min read' },
10
+ { id: 8, title: 'Digital Minimalism', excerpt: 'How simplifying your digital life can boost productivity and improve well-being.', date: 'Dec 28, 2023', author: 'Jordan Lee', category: 'Lifestyle', image: '🧘', readTime: '4 min read' },
11
+ ];
12
+ </script>
13
+
14
+ <template>
15
+ <div class="blog-home">
16
+ <div class="blog-content">
17
+ <div class="posts-section">
18
+ <h1 class="page-title">Latest Posts</h1>
19
+ <div class="posts-grid">
20
+ <PostCard v-for="post in posts" :key="post.id" :post="post" />
21
+ </div>
22
+ </div>
23
+
24
+ <BlogSidebar />
25
+ </div>
26
+ </div>
27
+ </template>
28
+
29
+ <style scoped>
30
+ .page-title {
31
+ font-size: 2rem;
32
+ color: #111827;
33
+ margin-bottom: 1.5rem;
34
+ }
35
+
36
+ .blog-content {
37
+ display: grid;
38
+ grid-template-columns: 1fr 320px;
39
+ gap: 2rem;
40
+ align-items: start;
41
+ }
42
+
43
+ .posts-grid {
44
+ display: grid;
45
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
46
+ gap: 1.5rem;
47
+ }
48
+
49
+ @media (max-width: 900px) {
50
+ .blog-content {
51
+ grid-template-columns: 1fr;
52
+ }
53
+ }
54
+ </style>
@@ -0,0 +1,158 @@
1
+ <script setup lang="ts">
2
+ const route = useRoute();
3
+ const postId = Number(route.params.id);
4
+
5
+ const posts = [
6
+ { id: 1, title: 'Getting Started with Vue 3 Composition API', excerpt: 'Learn the fundamentals of Vue 3 Composition API and how it transforms the way we build components.', date: 'Jan 15, 2024', author: 'Alex Rivera', category: 'Technology', image: '💻', readTime: '5 min read', content: 'The Vue 3 Composition API represents a significant evolution in how we structure Vue components. Unlike the Options API, which organizes code by option type (data, methods, computed), the Composition API lets you organize code by logical concern.\n\nThis means related code stays together, making components easier to understand and maintain. The setup function (or <script setup>) is the entry point where you define reactive state, computed properties, and functions.\n\nKey concepts include ref() for primitive reactive values, reactive() for objects, computed() for derived state, and watch/watchEffect for side effects. These composables can be extracted into reusable functions, promoting code reuse across components.\n\nThe Composition API also provides better TypeScript support, as the type inference works naturally with standard JavaScript/TypeScript patterns.' },
7
+ { id: 2, title: 'Modern UI Design Principles', excerpt: 'Explore the key principles that make modern user interfaces intuitive, beautiful, and accessible.', date: 'Jan 12, 2024', author: 'Sarah Chen', category: 'Design', image: '🎨', readTime: '4 min read', content: 'Great UI design is built on timeless principles that prioritize the user experience. Visual hierarchy guides users through content by establishing clear importance levels using size, color, and spacing.\n\nConsistency creates familiarity, reducing cognitive load and helping users predict how elements will behave. A consistent design system with reusable components ensures uniformity across your application.\n\nWhitespace is not empty space but a powerful design element. Proper use of whitespace improves readability, draws attention to key elements, and creates a sense of elegance.\n\nAccessibility should be woven into every design decision. This means sufficient color contrast, readable font sizes, clear focus indicators, and semantic markup that works with assistive technologies.' },
8
+ { id: 3, title: 'Building Scalable Web Applications', excerpt: 'Best practices for building web applications that scale from hundreds to millions of users.', date: 'Jan 10, 2024', author: 'Alex Rivera', category: 'Technology', image: '🏗️', readTime: '7 min read', content: 'Building scalable web applications requires thoughtful architecture decisions from the start. Start with a modular architecture that separates concerns and allows individual components to scale independently.\n\nPerformance optimization is crucial. Implement lazy loading, code splitting, and efficient caching strategies. Use CDNs for static assets and consider server-side rendering for improved initial load times.\n\nDatabase design matters immensely at scale. Choose the right database for your use case, implement proper indexing, and plan for horizontal scaling through sharding or read replicas.\n\nMonitoring and observability help you understand system behavior. Implement comprehensive logging, metrics collection, and distributed tracing to identify bottlenecks before they become critical issues.' },
9
+ { id: 4, title: 'The Future of Remote Work', excerpt: 'How remote work is reshaping the business landscape and what it means for teams worldwide.', date: 'Jan 8, 2024', author: 'Jordan Lee', category: 'Business', image: '🏠', readTime: '6 min read', content: 'Remote work has fundamentally changed how businesses operate and how employees structure their professional lives. The shift to distributed teams has proven that productivity is not tied to physical location.\n\nSuccessful remote teams prioritize asynchronous communication, allowing team members across time zones to contribute effectively. Written documentation becomes the backbone of organizational knowledge.\n\nCompany culture in remote settings requires intentional effort. Virtual team building, regular check-ins, and transparent communication help maintain connection and alignment.\n\nThe hybrid model is emerging as a popular middle ground, offering flexibility while maintaining in-person collaboration opportunities for creative work and team bonding.' },
10
+ { id: 5, title: 'Color Theory for Developers', excerpt: 'A practical guide to using color effectively in your web projects without being a designer.', date: 'Jan 5, 2024', author: 'Sarah Chen', category: 'Design', image: '🌈', readTime: '5 min read', content: 'Understanding color theory helps developers make better design decisions even without formal design training. Start with the color wheel and basic relationships: complementary, analogous, and triadic color schemes.\n\nIn web design, a focused color palette typically includes a primary color for brand identity, a secondary color for accents, and neutral colors for text and backgrounds. Limiting your palette creates visual coherence.\n\nColor psychology influences user perception. Blue conveys trust, green suggests growth, red creates urgency, and purple implies luxury. Choose colors that align with your brand message.\n\nAccessibility must guide color choices. Ensure text meets WCAG contrast ratios (4.5:1 for normal text, 3:1 for large text). Never rely on color alone to convey information.' },
11
+ { id: 6, title: 'Startup Lessons Learned', excerpt: 'Key takeaways from building and growing a tech startup in a competitive market.', date: 'Jan 3, 2024', author: 'Jordan Lee', category: 'Business', image: '🚀', readTime: '8 min read', content: 'Building a startup is a journey of constant learning and adaptation. The most important lesson is to validate your idea early with real users. Build a minimum viable product and iterate based on genuine feedback.\n\nHiring is both the most impactful and most challenging aspect of growing a startup. Look for adaptable people who share your vision and can wear multiple hats in the early stages.\n\nCash flow management can make or break a startup. Understand your burn rate, maintain a healthy runway, and be strategic about when and how to raise funding.\n\nBuilding in public and maintaining transparency with stakeholders creates trust and valuable feedback loops. Share your journey, celebrate wins, and be honest about challenges.' },
12
+ { id: 7, title: 'TypeScript Best Practices', excerpt: 'Write cleaner, safer code with these TypeScript patterns and conventions used by top teams.', date: 'Jan 1, 2024', author: 'Alex Rivera', category: 'Technology', image: '📘', readTime: '6 min read', content: 'TypeScript adds type safety to JavaScript, catching errors at compile time rather than runtime. To get the most from TypeScript, embrace strict mode and avoid using the any type as an escape hatch.\n\nUse interfaces for object shapes and types for unions and intersections. Generic types enable reusable, type-safe abstractions. Learn to leverage utility types like Partial, Pick, Omit, and Record.\n\nProper error handling with discriminated unions provides exhaustive type checking. Instead of throwing errors, consider returning typed result objects that force callers to handle both success and failure cases.\n\nOrganize types close to where they are used. Export only the types that are part of your public API. Use barrel files judiciously to avoid circular dependency issues.' },
13
+ { id: 8, title: 'Digital Minimalism', excerpt: 'How simplifying your digital life can boost productivity and improve well-being.', date: 'Dec 28, 2023', author: 'Jordan Lee', category: 'Lifestyle', image: '🧘', readTime: '4 min read', content: 'Digital minimalism is about being intentional with technology use. Rather than adopting every new tool, evaluate each one against your values and goals. Keep what adds genuine value; remove what merely adds noise.\n\nStart by auditing your digital habits. Track screen time, review app usage, and identify patterns of mindless consumption. This awareness is the first step toward meaningful change.\n\nCreate boundaries around technology use. Designate device-free times and spaces. Turn off non-essential notifications. Batch email and message checking rather than responding to every ping.\n\nReplace digital consumption with analog activities. Reading physical books, writing in a journal, and spending time outdoors provide the mental rest that constant connectivity prevents.' },
14
+ ];
15
+
16
+ const post = posts.find(p => p.id === postId);
17
+ </script>
18
+
19
+ <template>
20
+ <div v-if="post" class="post-detail">
21
+ <NuxtLink to="/" class="back-link">← Back to Posts</NuxtLink>
22
+
23
+ <article class="article">
24
+ <div class="article-hero">
25
+ <span class="article-emoji">{{ post.image }}</span>
26
+ </div>
27
+
28
+ <div class="article-meta">
29
+ <NuxtLink :to="`/category/${post.category.toLowerCase()}`" class="article-category">
30
+ {{ post.category }}
31
+ </NuxtLink>
32
+ <span class="meta-dot">&middot;</span>
33
+ <span>{{ post.readTime }}</span>
34
+ </div>
35
+
36
+ <h1 class="article-title">{{ post.title }}</h1>
37
+
38
+ <div class="article-author-line">
39
+ <span class="author-name">By {{ post.author }}</span>
40
+ <span class="article-date">{{ post.date }}</span>
41
+ </div>
42
+
43
+ <div class="article-content">
44
+ <p v-for="(paragraph, idx) in post.content.split('\n\n')" :key="idx">
45
+ {{ paragraph }}
46
+ </p>
47
+ </div>
48
+ </article>
49
+ </div>
50
+
51
+ <div v-else class="not-found">
52
+ <h2>Post not found</h2>
53
+ <NuxtLink to="/" class="back-link">← Back to Posts</NuxtLink>
54
+ </div>
55
+ </template>
56
+
57
+ <style scoped>
58
+ .back-link {
59
+ display: inline-block;
60
+ color: #4f46e5;
61
+ margin-bottom: 1.5rem;
62
+ font-weight: 500;
63
+ font-family: 'Segoe UI', system-ui, sans-serif;
64
+ }
65
+
66
+ .back-link:hover {
67
+ text-decoration: underline;
68
+ }
69
+
70
+ .article {
71
+ max-width: 740px;
72
+ margin: 0 auto;
73
+ }
74
+
75
+ .article-hero {
76
+ background: linear-gradient(135deg, #eef2ff, #e0e7ff);
77
+ border-radius: 12px;
78
+ display: flex;
79
+ align-items: center;
80
+ justify-content: center;
81
+ padding: 3rem;
82
+ margin-bottom: 2rem;
83
+ }
84
+
85
+ .article-emoji {
86
+ font-size: 6rem;
87
+ }
88
+
89
+ .article-meta {
90
+ display: flex;
91
+ align-items: center;
92
+ gap: 0.5rem;
93
+ margin-bottom: 0.75rem;
94
+ font-size: 0.875rem;
95
+ color: #6b7280;
96
+ font-family: 'Segoe UI', system-ui, sans-serif;
97
+ }
98
+
99
+ .article-category {
100
+ color: #4f46e5;
101
+ font-weight: 600;
102
+ text-transform: uppercase;
103
+ letter-spacing: 0.05em;
104
+ font-size: 0.8rem;
105
+ }
106
+
107
+ .article-category:hover {
108
+ text-decoration: underline;
109
+ }
110
+
111
+ .meta-dot {
112
+ color: #d1d5db;
113
+ }
114
+
115
+ .article-title {
116
+ font-size: 2.25rem;
117
+ color: #111827;
118
+ line-height: 1.3;
119
+ margin-bottom: 1rem;
120
+ }
121
+
122
+ .article-author-line {
123
+ display: flex;
124
+ justify-content: space-between;
125
+ align-items: center;
126
+ padding-bottom: 1.5rem;
127
+ margin-bottom: 2rem;
128
+ border-bottom: 1px solid #e5e7eb;
129
+ font-family: 'Segoe UI', system-ui, sans-serif;
130
+ font-size: 0.9rem;
131
+ }
132
+
133
+ .author-name {
134
+ font-weight: 600;
135
+ color: #374151;
136
+ }
137
+
138
+ .article-date {
139
+ color: #9ca3af;
140
+ }
141
+
142
+ .article-content p {
143
+ margin-bottom: 1.5rem;
144
+ font-size: 1.1rem;
145
+ line-height: 1.9;
146
+ color: #374151;
147
+ }
148
+
149
+ .not-found {
150
+ text-align: center;
151
+ padding: 4rem 0;
152
+ }
153
+
154
+ .not-found h2 {
155
+ color: #111827;
156
+ margin-bottom: 1rem;
157
+ }
158
+ </style>