@barkajs/barka 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. package/CLAUDE.md +64 -0
  2. package/INVARIANTS.json +43 -0
  3. package/LICENSE +19 -0
  4. package/README.md +566 -0
  5. package/dist/app.d.ts +22 -0
  6. package/dist/app.d.ts.map +1 -0
  7. package/dist/app.js +464 -0
  8. package/dist/app.js.map +1 -0
  9. package/dist/built-in-theme/components/cta/cta.d.ts +5 -0
  10. package/dist/built-in-theme/components/cta/cta.d.ts.map +1 -0
  11. package/dist/built-in-theme/components/cta/cta.js +6 -0
  12. package/dist/built-in-theme/components/cta/cta.js.map +1 -0
  13. package/dist/built-in-theme/components/features/features.d.ts +5 -0
  14. package/dist/built-in-theme/components/features/features.d.ts.map +1 -0
  15. package/dist/built-in-theme/components/features/features.js +7 -0
  16. package/dist/built-in-theme/components/features/features.js.map +1 -0
  17. package/dist/built-in-theme/components/hero/hero.d.ts +5 -0
  18. package/dist/built-in-theme/components/hero/hero.d.ts.map +1 -0
  19. package/dist/built-in-theme/components/hero/hero.js +6 -0
  20. package/dist/built-in-theme/components/hero/hero.js.map +1 -0
  21. package/dist/built-in-theme/components/text/text.d.ts +4 -0
  22. package/dist/built-in-theme/components/text/text.d.ts.map +1 -0
  23. package/dist/built-in-theme/components/text/text.js +7 -0
  24. package/dist/built-in-theme/components/text/text.js.map +1 -0
  25. package/dist/built-in-theme/layouts/article.d.ts +4 -0
  26. package/dist/built-in-theme/layouts/article.d.ts.map +1 -0
  27. package/dist/built-in-theme/layouts/article.js +11 -0
  28. package/dist/built-in-theme/layouts/article.js.map +1 -0
  29. package/dist/built-in-theme/layouts/base.d.ts +7 -0
  30. package/dist/built-in-theme/layouts/base.d.ts.map +1 -0
  31. package/dist/built-in-theme/layouts/base.js +21 -0
  32. package/dist/built-in-theme/layouts/base.js.map +1 -0
  33. package/dist/built-in-theme/layouts/landing-page.d.ts +6 -0
  34. package/dist/built-in-theme/layouts/landing-page.d.ts.map +1 -0
  35. package/dist/built-in-theme/layouts/landing-page.js +6 -0
  36. package/dist/built-in-theme/layouts/landing-page.js.map +1 -0
  37. package/dist/built-in-theme/layouts/page.d.ts +4 -0
  38. package/dist/built-in-theme/layouts/page.d.ts.map +1 -0
  39. package/dist/built-in-theme/layouts/page.js +7 -0
  40. package/dist/built-in-theme/layouts/page.js.map +1 -0
  41. package/dist/cli/build.d.ts +11 -0
  42. package/dist/cli/build.d.ts.map +1 -0
  43. package/dist/cli/build.js +271 -0
  44. package/dist/cli/build.js.map +1 -0
  45. package/dist/cli/create-app.d.ts +4 -0
  46. package/dist/cli/create-app.d.ts.map +1 -0
  47. package/dist/cli/create-app.js +179 -0
  48. package/dist/cli/create-app.js.map +1 -0
  49. package/dist/cli/db-init.d.ts +6 -0
  50. package/dist/cli/db-init.d.ts.map +1 -0
  51. package/dist/cli/db-init.js +28 -0
  52. package/dist/cli/db-init.js.map +1 -0
  53. package/dist/cli/dev.d.ts +10 -0
  54. package/dist/cli/dev.d.ts.map +1 -0
  55. package/dist/cli/dev.js +68 -0
  56. package/dist/cli/dev.js.map +1 -0
  57. package/dist/cli/export-cmd.d.ts +6 -0
  58. package/dist/cli/export-cmd.d.ts.map +1 -0
  59. package/dist/cli/export-cmd.js +12 -0
  60. package/dist/cli/export-cmd.js.map +1 -0
  61. package/dist/cli/import-cmd.d.ts +6 -0
  62. package/dist/cli/import-cmd.d.ts.map +1 -0
  63. package/dist/cli/import-cmd.js +11 -0
  64. package/dist/cli/import-cmd.js.map +1 -0
  65. package/dist/cli/index.d.ts +3 -0
  66. package/dist/cli/index.d.ts.map +1 -0
  67. package/dist/cli/index.js +163 -0
  68. package/dist/cli/index.js.map +1 -0
  69. package/dist/cli/init-cmd.d.ts +20 -0
  70. package/dist/cli/init-cmd.d.ts.map +1 -0
  71. package/dist/cli/init-cmd.js +116 -0
  72. package/dist/cli/init-cmd.js.map +1 -0
  73. package/dist/cli/sync-cmd.d.ts +5 -0
  74. package/dist/cli/sync-cmd.d.ts.map +1 -0
  75. package/dist/cli/sync-cmd.js +17 -0
  76. package/dist/cli/sync-cmd.js.map +1 -0
  77. package/dist/content-engine.d.ts +50 -0
  78. package/dist/content-engine.d.ts.map +1 -0
  79. package/dist/content-engine.js +240 -0
  80. package/dist/content-engine.js.map +1 -0
  81. package/dist/db/connection.d.ts +9 -0
  82. package/dist/db/connection.d.ts.map +1 -0
  83. package/dist/db/connection.js +121 -0
  84. package/dist/db/connection.js.map +1 -0
  85. package/dist/db/schema.d.ts +1178 -0
  86. package/dist/db/schema.d.ts.map +1 -0
  87. package/dist/db/schema.js +79 -0
  88. package/dist/db/schema.js.map +1 -0
  89. package/dist/index.d.ts +12 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +8 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/lib/auth.d.ts +14 -0
  94. package/dist/lib/auth.d.ts.map +1 -0
  95. package/dist/lib/auth.js +40 -0
  96. package/dist/lib/auth.js.map +1 -0
  97. package/dist/lib/config-files.d.ts +8 -0
  98. package/dist/lib/config-files.d.ts.map +1 -0
  99. package/dist/lib/config-files.js +72 -0
  100. package/dist/lib/config-files.js.map +1 -0
  101. package/dist/lib/content-files.d.ts +5 -0
  102. package/dist/lib/content-files.d.ts.map +1 -0
  103. package/dist/lib/content-files.js +156 -0
  104. package/dist/lib/content-files.js.map +1 -0
  105. package/dist/lib/i18n.d.ts +33 -0
  106. package/dist/lib/i18n.d.ts.map +1 -0
  107. package/dist/lib/i18n.js +247 -0
  108. package/dist/lib/i18n.js.map +1 -0
  109. package/dist/lib/multisite.d.ts +23 -0
  110. package/dist/lib/multisite.d.ts.map +1 -0
  111. package/dist/lib/multisite.js +73 -0
  112. package/dist/lib/multisite.js.map +1 -0
  113. package/dist/lib/paths.d.ts +6 -0
  114. package/dist/lib/paths.d.ts.map +1 -0
  115. package/dist/lib/paths.js +25 -0
  116. package/dist/lib/paths.js.map +1 -0
  117. package/dist/lib/schema-loader.d.ts +25 -0
  118. package/dist/lib/schema-loader.d.ts.map +1 -0
  119. package/dist/lib/schema-loader.js +45 -0
  120. package/dist/lib/schema-loader.js.map +1 -0
  121. package/dist/lib/seo.d.ts +18 -0
  122. package/dist/lib/seo.d.ts.map +1 -0
  123. package/dist/lib/seo.js +212 -0
  124. package/dist/lib/seo.js.map +1 -0
  125. package/dist/lib/sync.d.ts +33 -0
  126. package/dist/lib/sync.d.ts.map +1 -0
  127. package/dist/lib/sync.js +308 -0
  128. package/dist/lib/sync.js.map +1 -0
  129. package/dist/lib/taxonomy.d.ts +29 -0
  130. package/dist/lib/taxonomy.d.ts.map +1 -0
  131. package/dist/lib/taxonomy.js +170 -0
  132. package/dist/lib/taxonomy.js.map +1 -0
  133. package/dist/lib/template-renderer.d.ts +6 -0
  134. package/dist/lib/template-renderer.d.ts.map +1 -0
  135. package/dist/lib/template-renderer.js +80 -0
  136. package/dist/lib/template-renderer.js.map +1 -0
  137. package/dist/lib/theme-loader.d.ts +5 -0
  138. package/dist/lib/theme-loader.d.ts.map +1 -0
  139. package/dist/lib/theme-loader.js +199 -0
  140. package/dist/lib/theme-loader.js.map +1 -0
  141. package/dist/lib/theme-types.d.ts +39 -0
  142. package/dist/lib/theme-types.d.ts.map +1 -0
  143. package/dist/lib/theme-types.js +2 -0
  144. package/dist/lib/theme-types.js.map +1 -0
  145. package/dist/lib/types.d.ts +91 -0
  146. package/dist/lib/types.d.ts.map +1 -0
  147. package/dist/lib/types.js +2 -0
  148. package/dist/lib/types.js.map +1 -0
  149. package/dist/routes/admin/content-edit.d.ts +10 -0
  150. package/dist/routes/admin/content-edit.d.ts.map +1 -0
  151. package/dist/routes/admin/content-edit.js +325 -0
  152. package/dist/routes/admin/content-edit.js.map +1 -0
  153. package/dist/routes/admin/content-list.d.ts +10 -0
  154. package/dist/routes/admin/content-list.d.ts.map +1 -0
  155. package/dist/routes/admin/content-list.js +162 -0
  156. package/dist/routes/admin/content-list.js.map +1 -0
  157. package/dist/routes/admin/content.d.ts +3 -0
  158. package/dist/routes/admin/content.d.ts.map +1 -0
  159. package/dist/routes/admin/content.js +12 -0
  160. package/dist/routes/admin/content.js.map +1 -0
  161. package/dist/routes/admin/dashboard.d.ts +4 -0
  162. package/dist/routes/admin/dashboard.d.ts.map +1 -0
  163. package/dist/routes/admin/dashboard.js +121 -0
  164. package/dist/routes/admin/dashboard.js.map +1 -0
  165. package/dist/routes/admin/export-route.d.ts +10 -0
  166. package/dist/routes/admin/export-route.d.ts.map +1 -0
  167. package/dist/routes/admin/export-route.js +19 -0
  168. package/dist/routes/admin/export-route.js.map +1 -0
  169. package/dist/routes/admin/index.d.ts +9 -0
  170. package/dist/routes/admin/index.d.ts.map +1 -0
  171. package/dist/routes/admin/index.js +27 -0
  172. package/dist/routes/admin/index.js.map +1 -0
  173. package/dist/routes/admin/layout.d.ts +17 -0
  174. package/dist/routes/admin/layout.d.ts.map +1 -0
  175. package/dist/routes/admin/layout.js +110 -0
  176. package/dist/routes/admin/layout.js.map +1 -0
  177. package/dist/routes/admin/login.d.ts +5 -0
  178. package/dist/routes/admin/login.d.ts.map +1 -0
  179. package/dist/routes/admin/login.js +113 -0
  180. package/dist/routes/admin/login.js.map +1 -0
  181. package/dist/routes/admin/media.d.ts +10 -0
  182. package/dist/routes/admin/media.d.ts.map +1 -0
  183. package/dist/routes/admin/media.js +192 -0
  184. package/dist/routes/admin/media.js.map +1 -0
  185. package/dist/routes/admin/middleware.d.ts +8 -0
  186. package/dist/routes/admin/middleware.d.ts.map +1 -0
  187. package/dist/routes/admin/middleware.js +29 -0
  188. package/dist/routes/admin/middleware.js.map +1 -0
  189. package/dist/routes/admin/section-builder.d.ts +10 -0
  190. package/dist/routes/admin/section-builder.d.ts.map +1 -0
  191. package/dist/routes/admin/section-builder.js +487 -0
  192. package/dist/routes/admin/section-builder.js.map +1 -0
  193. package/dist/routes/admin/settings.d.ts +10 -0
  194. package/dist/routes/admin/settings.d.ts.map +1 -0
  195. package/dist/routes/admin/settings.js +209 -0
  196. package/dist/routes/admin/settings.js.map +1 -0
  197. package/dist/routes/admin/site-switcher.d.ts +3 -0
  198. package/dist/routes/admin/site-switcher.d.ts.map +1 -0
  199. package/dist/routes/admin/site-switcher.js +36 -0
  200. package/dist/routes/admin/site-switcher.js.map +1 -0
  201. package/dist/routes/admin/taxonomy.d.ts +10 -0
  202. package/dist/routes/admin/taxonomy.d.ts.map +1 -0
  203. package/dist/routes/admin/taxonomy.js +297 -0
  204. package/dist/routes/admin/taxonomy.js.map +1 -0
  205. package/dist/routes/admin/users.d.ts +10 -0
  206. package/dist/routes/admin/users.d.ts.map +1 -0
  207. package/dist/routes/admin/users.js +227 -0
  208. package/dist/routes/admin/users.js.map +1 -0
  209. package/package.json +75 -0
  210. package/src/built-in-theme/components/cta/cta.tsx +18 -0
  211. package/src/built-in-theme/components/cta/schema.yaml +17 -0
  212. package/src/built-in-theme/components/features/features.tsx +18 -0
  213. package/src/built-in-theme/components/features/schema.yaml +22 -0
  214. package/src/built-in-theme/components/hero/hero.tsx +18 -0
  215. package/src/built-in-theme/components/hero/schema.yaml +17 -0
  216. package/src/built-in-theme/components/text/schema.yaml +12 -0
  217. package/src/built-in-theme/components/text/text.tsx +11 -0
  218. package/src/built-in-theme/layouts/article.tsx +20 -0
  219. package/src/built-in-theme/layouts/base.tsx +50 -0
  220. package/src/built-in-theme/layouts/landing-page.tsx +15 -0
  221. package/src/built-in-theme/layouts/page.tsx +11 -0
  222. package/src/built-in-theme/theme.yaml +4 -0
  223. package/starters/blank/config/content-types.yaml +47 -0
  224. package/starters/blank/config/section-types.yaml +115 -0
  225. package/starters/blank/config/settings.yaml +12 -0
  226. package/starters/blank/content/landing-pages/homepage.yaml +55 -0
  227. package/starters/blank/content/pages/about.md +27 -0
  228. package/starters/blank/starter.yaml +14 -0
  229. package/starters/blank/themes/starter/_types.ts +93 -0
  230. package/starters/blank/themes/starter/components/blog-listing/blog-listing.tsx +102 -0
  231. package/starters/blank/themes/starter/components/blog-listing/schema.yaml +21 -0
  232. package/starters/blank/themes/starter/components/columns/columns.tsx +101 -0
  233. package/starters/blank/themes/starter/components/columns/schema.yaml +23 -0
  234. package/starters/blank/themes/starter/components/counters/counters.css +13 -0
  235. package/starters/blank/themes/starter/components/counters/counters.tsx +81 -0
  236. package/starters/blank/themes/starter/components/counters/schema.yaml +23 -0
  237. package/starters/blank/themes/starter/components/cta/cta.tsx +57 -0
  238. package/starters/blank/themes/starter/components/cta/schema.yaml +30 -0
  239. package/starters/blank/themes/starter/components/faq/faq.tsx +77 -0
  240. package/starters/blank/themes/starter/components/faq/schema.yaml +20 -0
  241. package/starters/blank/themes/starter/components/features/features.tsx +82 -0
  242. package/starters/blank/themes/starter/components/features/schema.yaml +19 -0
  243. package/starters/blank/themes/starter/components/form/form.tsx +126 -0
  244. package/starters/blank/themes/starter/components/form/schema.yaml +18 -0
  245. package/starters/blank/themes/starter/components/gallery/gallery.tsx +85 -0
  246. package/starters/blank/themes/starter/components/gallery/schema.yaml +27 -0
  247. package/starters/blank/themes/starter/components/hero/hero.tsx +77 -0
  248. package/starters/blank/themes/starter/components/hero/schema.yaml +26 -0
  249. package/starters/blank/themes/starter/components/logo-slider/logo-slider.css +21 -0
  250. package/starters/blank/themes/starter/components/logo-slider/logo-slider.tsx +81 -0
  251. package/starters/blank/themes/starter/components/logo-slider/schema.yaml +23 -0
  252. package/starters/blank/themes/starter/components/pricing/pricing.tsx +141 -0
  253. package/starters/blank/themes/starter/components/pricing/schema.yaml +44 -0
  254. package/starters/blank/themes/starter/components/testimonials/schema.yaml +26 -0
  255. package/starters/blank/themes/starter/components/testimonials/testimonials.tsx +100 -0
  256. package/starters/blank/themes/starter/components/text/schema.yaml +12 -0
  257. package/starters/blank/themes/starter/components/text/text.tsx +62 -0
  258. package/starters/blank/themes/starter/components/text-with-image/schema.yaml +30 -0
  259. package/starters/blank/themes/starter/components/text-with-image/text-with-image.tsx +86 -0
  260. package/starters/blank/themes/starter/components/video/schema.yaml +19 -0
  261. package/starters/blank/themes/starter/components/video/video.tsx +98 -0
  262. package/starters/blank/themes/starter/layouts/article.tsx +42 -0
  263. package/starters/blank/themes/starter/layouts/base.tsx +92 -0
  264. package/starters/blank/themes/starter/layouts/landing-page.tsx +14 -0
  265. package/starters/blank/themes/starter/layouts/page.tsx +29 -0
  266. package/starters/blank/themes/starter/partials/footer.tsx +22 -0
  267. package/starters/blank/themes/starter/partials/header.tsx +32 -0
  268. package/starters/blank/themes/starter/static/style.css +125 -0
  269. package/starters/blank/themes/starter/theme.yaml +16 -0
  270. package/starters/kadoservices/config/content-types.yaml +239 -0
  271. package/starters/kadoservices/config/languages.yaml +12 -0
  272. package/starters/kadoservices/config/section-types.yaml +379 -0
  273. package/starters/kadoservices/config/settings.yaml +15 -0
  274. package/starters/kadoservices/config/sites.yaml +14 -0
  275. package/starters/kadoservices/config/taxonomies.yaml +61 -0
  276. package/starters/kadoservices/config/translations/de.yaml +120 -0
  277. package/starters/kadoservices/config/translations/en.yaml +120 -0
  278. package/starters/kadoservices/config/translations/pl.yaml +120 -0
  279. package/starters/kadoservices/content/articles/employer-branding-strategies.md +61 -0
  280. package/starters/kadoservices/content/articles/hiring-trends-2026.md +61 -0
  281. package/starters/kadoservices/content/articles/hiring-trends-2026.pl.md +61 -0
  282. package/starters/kadoservices/content/articles/labor-law-changes.md +78 -0
  283. package/starters/kadoservices/content/articles/temporary-staffing-guide.md +76 -0
  284. package/starters/kadoservices/content/articles/temporary-staffing-guide.pl.md +76 -0
  285. package/starters/kadoservices/content/case-studies/finance-rpo-program.md +68 -0
  286. package/starters/kadoservices/content/case-studies/manufacturing-mass-recruitment.md +65 -0
  287. package/starters/kadoservices/content/case-studies/manufacturing-mass-recruitment.pl.md +65 -0
  288. package/starters/kadoservices/content/case-studies/retail-seasonal-staffing.md +69 -0
  289. package/starters/kadoservices/content/industries/finance-shared-services.md +59 -0
  290. package/starters/kadoservices/content/industries/healthcare.md +64 -0
  291. package/starters/kadoservices/content/industries/it-technology.md +61 -0
  292. package/starters/kadoservices/content/industries/logistics.md +54 -0
  293. package/starters/kadoservices/content/industries/manufacturing.md +61 -0
  294. package/starters/kadoservices/content/industries/retail.md +56 -0
  295. package/starters/kadoservices/content/landing-pages/homepage.pl.yaml +198 -0
  296. package/starters/kadoservices/content/landing-pages/homepage.yaml +198 -0
  297. package/starters/kadoservices/content/locations/gdansk.md +32 -0
  298. package/starters/kadoservices/content/locations/krakow.md +30 -0
  299. package/starters/kadoservices/content/locations/warsaw.md +30 -0
  300. package/starters/kadoservices/content/locations/wroclaw.md +32 -0
  301. package/starters/kadoservices/content/pages/about.md +58 -0
  302. package/starters/kadoservices/content/pages/about.pl.md +58 -0
  303. package/starters/kadoservices/content/pages/careers.md +55 -0
  304. package/starters/kadoservices/content/pages/clients.md +65 -0
  305. package/starters/kadoservices/content/pages/contact.md +74 -0
  306. package/starters/kadoservices/content/pages/contact.pl.md +74 -0
  307. package/starters/kadoservices/content/pages/faq.md +76 -0
  308. package/starters/kadoservices/content/services/employer-branding.md +70 -0
  309. package/starters/kadoservices/content/services/hr-consulting.md +64 -0
  310. package/starters/kadoservices/content/services/outsourcing-rpo.md +78 -0
  311. package/starters/kadoservices/content/services/outsourcing-rpo.pl.md +67 -0
  312. package/starters/kadoservices/content/services/payroll-hr-admin.md +66 -0
  313. package/starters/kadoservices/content/services/permanent-recruitment.md +78 -0
  314. package/starters/kadoservices/content/services/permanent-recruitment.pl.md +78 -0
  315. package/starters/kadoservices/content/services/temporary-staffing.md +78 -0
  316. package/starters/kadoservices/content/team/anna-kowalska.md +26 -0
  317. package/starters/kadoservices/content/team/jan-lewandowski.md +26 -0
  318. package/starters/kadoservices/content/team/katarzyna-zielinska.md +26 -0
  319. package/starters/kadoservices/content/team/maria-wisniewska.md +28 -0
  320. package/starters/kadoservices/content/team/tomasz-nowak.md +26 -0
  321. package/starters/kadoservices/starter.yaml +15 -0
  322. package/starters/kadoservices/themes/kadoservices/_types.ts +93 -0
  323. package/starters/kadoservices/themes/kadoservices/components/blog-listing/blog-listing.tsx +197 -0
  324. package/starters/kadoservices/themes/kadoservices/components/blog-listing/schema.yaml +21 -0
  325. package/starters/kadoservices/themes/kadoservices/components/columns/columns.tsx +104 -0
  326. package/starters/kadoservices/themes/kadoservices/components/columns/schema.yaml +23 -0
  327. package/starters/kadoservices/themes/kadoservices/components/counters/counters.css +13 -0
  328. package/starters/kadoservices/themes/kadoservices/components/counters/counters.tsx +103 -0
  329. package/starters/kadoservices/themes/kadoservices/components/counters/schema.yaml +23 -0
  330. package/starters/kadoservices/themes/kadoservices/components/cta/cta.tsx +100 -0
  331. package/starters/kadoservices/themes/kadoservices/components/cta/schema.yaml +30 -0
  332. package/starters/kadoservices/themes/kadoservices/components/faq/faq.tsx +77 -0
  333. package/starters/kadoservices/themes/kadoservices/components/faq/schema.yaml +20 -0
  334. package/starters/kadoservices/themes/kadoservices/components/features/features.tsx +151 -0
  335. package/starters/kadoservices/themes/kadoservices/components/features/schema.yaml +19 -0
  336. package/starters/kadoservices/themes/kadoservices/components/form/form.tsx +135 -0
  337. package/starters/kadoservices/themes/kadoservices/components/form/schema.yaml +18 -0
  338. package/starters/kadoservices/themes/kadoservices/components/gallery/gallery.tsx +90 -0
  339. package/starters/kadoservices/themes/kadoservices/components/gallery/schema.yaml +27 -0
  340. package/starters/kadoservices/themes/kadoservices/components/hero/hero.tsx +175 -0
  341. package/starters/kadoservices/themes/kadoservices/components/hero/schema.yaml +26 -0
  342. package/starters/kadoservices/themes/kadoservices/components/logo-slider/logo-slider.css +21 -0
  343. package/starters/kadoservices/themes/kadoservices/components/logo-slider/logo-slider.tsx +83 -0
  344. package/starters/kadoservices/themes/kadoservices/components/logo-slider/schema.yaml +23 -0
  345. package/starters/kadoservices/themes/kadoservices/components/pricing/pricing.tsx +161 -0
  346. package/starters/kadoservices/themes/kadoservices/components/pricing/schema.yaml +44 -0
  347. package/starters/kadoservices/themes/kadoservices/components/testimonials/schema.yaml +26 -0
  348. package/starters/kadoservices/themes/kadoservices/components/testimonials/testimonials.css +13 -0
  349. package/starters/kadoservices/themes/kadoservices/components/testimonials/testimonials.tsx +150 -0
  350. package/starters/kadoservices/themes/kadoservices/components/text/schema.yaml +12 -0
  351. package/starters/kadoservices/themes/kadoservices/components/text/text.tsx +67 -0
  352. package/starters/kadoservices/themes/kadoservices/components/text-with-image/schema.yaml +30 -0
  353. package/starters/kadoservices/themes/kadoservices/components/text-with-image/text-with-image.tsx +92 -0
  354. package/starters/kadoservices/themes/kadoservices/components/video/schema.yaml +19 -0
  355. package/starters/kadoservices/themes/kadoservices/components/video/video.tsx +103 -0
  356. package/starters/kadoservices/themes/kadoservices/layouts/404.tsx +96 -0
  357. package/starters/kadoservices/themes/kadoservices/layouts/article.tsx +140 -0
  358. package/starters/kadoservices/themes/kadoservices/layouts/base.tsx +669 -0
  359. package/starters/kadoservices/themes/kadoservices/layouts/case-study.tsx +240 -0
  360. package/starters/kadoservices/themes/kadoservices/layouts/index--articles.tsx +250 -0
  361. package/starters/kadoservices/themes/kadoservices/layouts/index--case-studies.tsx +232 -0
  362. package/starters/kadoservices/themes/kadoservices/layouts/index--services.tsx +237 -0
  363. package/starters/kadoservices/themes/kadoservices/layouts/index.tsx +96 -0
  364. package/starters/kadoservices/themes/kadoservices/layouts/industry.tsx +121 -0
  365. package/starters/kadoservices/themes/kadoservices/layouts/landing-page.tsx +14 -0
  366. package/starters/kadoservices/themes/kadoservices/layouts/page--about.tsx +158 -0
  367. package/starters/kadoservices/themes/kadoservices/layouts/page--careers.tsx +214 -0
  368. package/starters/kadoservices/themes/kadoservices/layouts/page--contact.tsx +218 -0
  369. package/starters/kadoservices/themes/kadoservices/layouts/page.tsx +45 -0
  370. package/starters/kadoservices/themes/kadoservices/layouts/service.tsx +235 -0
  371. package/starters/kadoservices/themes/kadoservices/partials/footer.tsx +109 -0
  372. package/starters/kadoservices/themes/kadoservices/partials/header.tsx +53 -0
  373. package/starters/kadoservices/themes/kadoservices/static/images/article-platform-engineering.jpg +0 -0
  374. package/starters/kadoservices/themes/kadoservices/static/images/barka-logo.png +0 -0
  375. package/starters/kadoservices/themes/kadoservices/static/images/case-study-banking-dashboard.jpg +0 -0
  376. package/starters/kadoservices/themes/kadoservices/static/images/case-study-banking.png +0 -0
  377. package/starters/kadoservices/themes/kadoservices/static/images/case-study-ecommerce-dashboard.jpg +0 -0
  378. package/starters/kadoservices/themes/kadoservices/static/images/case-study-healthcare-dashboard.jpg +0 -0
  379. package/starters/kadoservices/themes/kadoservices/static/images/case-study-healthcare.png +0 -0
  380. package/starters/kadoservices/themes/kadoservices/static/images/case-study-retail.png +0 -0
  381. package/starters/kadoservices/themes/kadoservices/static/images/handshake.jpg +0 -0
  382. package/starters/kadoservices/themes/kadoservices/static/images/hero-bg.jpg +0 -0
  383. package/starters/kadoservices/themes/kadoservices/static/images/hero-bg.png +0 -0
  384. package/starters/kadoservices/themes/kadoservices/static/images/lokatech-logo.png +0 -0
  385. package/starters/kadoservices/themes/kadoservices/static/images/office-warsaw.png +0 -0
  386. package/starters/kadoservices/themes/kadoservices/static/images/office.jpg +0 -0
  387. package/starters/kadoservices/themes/kadoservices/static/images/team-anna-kowalska.png +0 -0
  388. package/starters/kadoservices/themes/kadoservices/static/images/team-collaboration.jpg +0 -0
  389. package/starters/kadoservices/themes/kadoservices/static/images/team-jan-nowak.png +0 -0
  390. package/starters/kadoservices/themes/kadoservices/static/images/team-katarzyna-kaminska.png +0 -0
  391. package/starters/kadoservices/themes/kadoservices/static/images/team-maria-wisniewska.png +0 -0
  392. package/starters/kadoservices/themes/kadoservices/static/images/team-meeting.jpg +0 -0
  393. package/starters/kadoservices/themes/kadoservices/static/images/team-strategy-session.jpg +0 -0
  394. package/starters/kadoservices/themes/kadoservices/static/images/team-tomasz-lewandowski.png +0 -0
  395. package/starters/kadoservices/themes/kadoservices/static/style.css +542 -0
  396. package/starters/kadoservices/themes/kadoservices/theme.yaml +21 -0
  397. package/starters/kadoservices/themes/starter/_types.ts +93 -0
  398. package/starters/kadoservices/themes/starter/components/blog-listing/blog-listing.tsx +102 -0
  399. package/starters/kadoservices/themes/starter/components/blog-listing/schema.yaml +21 -0
  400. package/starters/kadoservices/themes/starter/components/columns/columns.tsx +101 -0
  401. package/starters/kadoservices/themes/starter/components/columns/schema.yaml +23 -0
  402. package/starters/kadoservices/themes/starter/components/counters/counters.css +13 -0
  403. package/starters/kadoservices/themes/starter/components/counters/counters.tsx +81 -0
  404. package/starters/kadoservices/themes/starter/components/counters/schema.yaml +23 -0
  405. package/starters/kadoservices/themes/starter/components/cta/cta.tsx +57 -0
  406. package/starters/kadoservices/themes/starter/components/cta/schema.yaml +30 -0
  407. package/starters/kadoservices/themes/starter/components/faq/faq.tsx +77 -0
  408. package/starters/kadoservices/themes/starter/components/faq/schema.yaml +20 -0
  409. package/starters/kadoservices/themes/starter/components/features/features.tsx +82 -0
  410. package/starters/kadoservices/themes/starter/components/features/schema.yaml +19 -0
  411. package/starters/kadoservices/themes/starter/components/form/form.tsx +126 -0
  412. package/starters/kadoservices/themes/starter/components/form/schema.yaml +18 -0
  413. package/starters/kadoservices/themes/starter/components/gallery/gallery.tsx +85 -0
  414. package/starters/kadoservices/themes/starter/components/gallery/schema.yaml +27 -0
  415. package/starters/kadoservices/themes/starter/components/hero/hero.tsx +77 -0
  416. package/starters/kadoservices/themes/starter/components/hero/schema.yaml +26 -0
  417. package/starters/kadoservices/themes/starter/components/logo-slider/logo-slider.css +21 -0
  418. package/starters/kadoservices/themes/starter/components/logo-slider/logo-slider.tsx +81 -0
  419. package/starters/kadoservices/themes/starter/components/logo-slider/schema.yaml +23 -0
  420. package/starters/kadoservices/themes/starter/components/pricing/pricing.tsx +141 -0
  421. package/starters/kadoservices/themes/starter/components/pricing/schema.yaml +44 -0
  422. package/starters/kadoservices/themes/starter/components/testimonials/schema.yaml +26 -0
  423. package/starters/kadoservices/themes/starter/components/testimonials/testimonials.tsx +100 -0
  424. package/starters/kadoservices/themes/starter/components/text/schema.yaml +12 -0
  425. package/starters/kadoservices/themes/starter/components/text/text.tsx +62 -0
  426. package/starters/kadoservices/themes/starter/components/text-with-image/schema.yaml +30 -0
  427. package/starters/kadoservices/themes/starter/components/text-with-image/text-with-image.tsx +86 -0
  428. package/starters/kadoservices/themes/starter/components/video/schema.yaml +19 -0
  429. package/starters/kadoservices/themes/starter/components/video/video.tsx +98 -0
  430. package/starters/kadoservices/themes/starter/layouts/article.tsx +42 -0
  431. package/starters/kadoservices/themes/starter/layouts/base.tsx +92 -0
  432. package/starters/kadoservices/themes/starter/layouts/landing-page.tsx +14 -0
  433. package/starters/kadoservices/themes/starter/layouts/page.tsx +29 -0
  434. package/starters/kadoservices/themes/starter/partials/footer.tsx +22 -0
  435. package/starters/kadoservices/themes/starter/partials/header.tsx +32 -0
  436. package/starters/kadoservices/themes/starter/static/style.css +125 -0
  437. package/starters/kadoservices/themes/starter/theme.yaml +16 -0
  438. package/starters/lokatech/config/content-types.yaml +226 -0
  439. package/starters/lokatech/config/languages.yaml +12 -0
  440. package/starters/lokatech/config/section-types.yaml +379 -0
  441. package/starters/lokatech/config/settings.yaml +15 -0
  442. package/starters/lokatech/config/sites.yaml +21 -0
  443. package/starters/lokatech/config/taxonomies.yaml +65 -0
  444. package/starters/lokatech/config/translations/de.yaml +108 -0
  445. package/starters/lokatech/config/translations/en.yaml +108 -0
  446. package/starters/lokatech/config/translations/pl.yaml +108 -0
  447. package/starters/lokatech/content/articles/ai-in-enterprise.md +51 -0
  448. package/starters/lokatech/content/articles/api-gateway-patterns-enterprise.md +35 -0
  449. package/starters/lokatech/content/articles/design-system-enterprise-scale.md +35 -0
  450. package/starters/lokatech/content/articles/domain-driven-design-bounded-contexts.md +35 -0
  451. package/starters/lokatech/content/articles/engineering-team-scaling-50-to-200.md +33 -0
  452. package/starters/lokatech/content/articles/event-driven-architecture-microservices.md +35 -0
  453. package/starters/lokatech/content/articles/future-of-cloud-native.md +47 -0
  454. package/starters/lokatech/content/articles/getting-started.md +83 -0
  455. package/starters/lokatech/content/articles/headless-cms-composable-architecture.md +35 -0
  456. package/starters/lokatech/content/articles/kubernetes-cost-optimization-finops.md +33 -0
  457. package/starters/lokatech/content/articles/legacy-modernization-strangler-fig.md +35 -0
  458. package/starters/lokatech/content/articles/llm-fine-tuning-enterprise-data.md +33 -0
  459. package/starters/lokatech/content/articles/observability-opentelemetry-stack.md +35 -0
  460. package/starters/lokatech/content/articles/platform-engineering-internal-developer-portals.md +33 -0
  461. package/starters/lokatech/content/articles/platform-engineering-internal-developer-portals.pl.md +33 -0
  462. package/starters/lokatech/content/articles/rag-retrieval-augmented-generation-production.md +35 -0
  463. package/starters/lokatech/content/articles/remote-engineering-culture-distributed-teams.md +35 -0
  464. package/starters/lokatech/content/articles/supply-chain-security-sbom.md +35 -0
  465. package/starters/lokatech/content/articles/welcome.md +42 -0
  466. package/starters/lokatech/content/articles/welcome.pl.md +39 -0
  467. package/starters/lokatech/content/articles/zero-trust-network-architecture.md +35 -0
  468. package/starters/lokatech/content/articles/zero-trust-security.md +55 -0
  469. package/starters/lokatech/content/case-studies/banking-platform-modernization.md +67 -0
  470. package/starters/lokatech/content/case-studies/ecommerce-platform-rewrite.md +64 -0
  471. package/starters/lokatech/content/case-studies/govtech-citizen-portal.md +59 -0
  472. package/starters/lokatech/content/case-studies/healthcare-data-pipeline.md +67 -0
  473. package/starters/lokatech/content/case-studies/healthcare-data-pipeline.pl.md +60 -0
  474. package/starters/lokatech/content/case-studies/insurance-claims-automation.md +58 -0
  475. package/starters/lokatech/content/case-studies/manufacturing-iot-digital-twin.md +58 -0
  476. package/starters/lokatech/content/case-studies/retail-cloud-migration.md +49 -0
  477. package/starters/lokatech/content/case-studies/telecom-5g-platform.md +57 -0
  478. package/starters/lokatech/content/industries/energy-utilities.md +35 -0
  479. package/starters/lokatech/content/industries/financial-services.md +35 -0
  480. package/starters/lokatech/content/industries/healthcare.md +35 -0
  481. package/starters/lokatech/content/industries/manufacturing.md +35 -0
  482. package/starters/lokatech/content/industries/retail-ecommerce.md +35 -0
  483. package/starters/lokatech/content/industries/telecom-media.md +35 -0
  484. package/starters/lokatech/content/landing-pages/homepage.pl.yaml +182 -0
  485. package/starters/lokatech/content/landing-pages/homepage.yaml +236 -0
  486. package/starters/lokatech/content/locations/berlin.md +22 -0
  487. package/starters/lokatech/content/locations/krakow.md +22 -0
  488. package/starters/lokatech/content/locations/london.md +22 -0
  489. package/starters/lokatech/content/locations/warsaw.md +22 -0
  490. package/starters/lokatech/content/locations/wroclaw.md +22 -0
  491. package/starters/lokatech/content/pages/about.md +55 -0
  492. package/starters/lokatech/content/pages/about.pl.md +36 -0
  493. package/starters/lokatech/content/pages/careers.md +50 -0
  494. package/starters/lokatech/content/pages/contact.md +51 -0
  495. package/starters/lokatech/content/pages/contact.pl.md +51 -0
  496. package/starters/lokatech/content/pages/security-compliance.md +66 -0
  497. package/starters/lokatech/content/services/cloud-infrastructure.md +73 -0
  498. package/starters/lokatech/content/services/custom-software-development.md +74 -0
  499. package/starters/lokatech/content/services/custom-software-development.pl.md +80 -0
  500. package/starters/lokatech/content/services/cybersecurity.md +72 -0
  501. package/starters/lokatech/content/services/data-ai.md +74 -0
  502. package/starters/lokatech/content/services/digital-transformation.md +70 -0
  503. package/starters/lokatech/content/services/it-outsourcing.md +72 -0
  504. package/starters/lokatech/content/team/anna-kowalska.md +21 -0
  505. package/starters/lokatech/content/team/jan-nowak.md +21 -0
  506. package/starters/lokatech/content/team/katarzyna-kaminska.md +20 -0
  507. package/starters/lokatech/content/team/maria-wisniewska.md +20 -0
  508. package/starters/lokatech/content/team/tomasz-lewandowski.md +20 -0
  509. package/starters/lokatech/starter.yaml +15 -0
  510. package/starters/lokatech/themes/lokatech/_types.ts +93 -0
  511. package/starters/lokatech/themes/lokatech/components/blog-listing/blog-listing.tsx +197 -0
  512. package/starters/lokatech/themes/lokatech/components/blog-listing/schema.yaml +21 -0
  513. package/starters/lokatech/themes/lokatech/components/columns/columns.tsx +104 -0
  514. package/starters/lokatech/themes/lokatech/components/columns/schema.yaml +23 -0
  515. package/starters/lokatech/themes/lokatech/components/counters/counters.css +13 -0
  516. package/starters/lokatech/themes/lokatech/components/counters/counters.tsx +103 -0
  517. package/starters/lokatech/themes/lokatech/components/counters/schema.yaml +23 -0
  518. package/starters/lokatech/themes/lokatech/components/cta/cta.tsx +100 -0
  519. package/starters/lokatech/themes/lokatech/components/cta/schema.yaml +30 -0
  520. package/starters/lokatech/themes/lokatech/components/faq/faq.tsx +77 -0
  521. package/starters/lokatech/themes/lokatech/components/faq/schema.yaml +20 -0
  522. package/starters/lokatech/themes/lokatech/components/features/features.tsx +149 -0
  523. package/starters/lokatech/themes/lokatech/components/features/schema.yaml +19 -0
  524. package/starters/lokatech/themes/lokatech/components/form/form.tsx +135 -0
  525. package/starters/lokatech/themes/lokatech/components/form/schema.yaml +18 -0
  526. package/starters/lokatech/themes/lokatech/components/gallery/gallery.tsx +90 -0
  527. package/starters/lokatech/themes/lokatech/components/gallery/schema.yaml +27 -0
  528. package/starters/lokatech/themes/lokatech/components/hero/hero.tsx +167 -0
  529. package/starters/lokatech/themes/lokatech/components/hero/schema.yaml +26 -0
  530. package/starters/lokatech/themes/lokatech/components/logo-slider/logo-slider.css +21 -0
  531. package/starters/lokatech/themes/lokatech/components/logo-slider/logo-slider.tsx +83 -0
  532. package/starters/lokatech/themes/lokatech/components/logo-slider/schema.yaml +23 -0
  533. package/starters/lokatech/themes/lokatech/components/pricing/pricing.tsx +161 -0
  534. package/starters/lokatech/themes/lokatech/components/pricing/schema.yaml +44 -0
  535. package/starters/lokatech/themes/lokatech/components/testimonials/schema.yaml +26 -0
  536. package/starters/lokatech/themes/lokatech/components/testimonials/testimonials.css +13 -0
  537. package/starters/lokatech/themes/lokatech/components/testimonials/testimonials.tsx +150 -0
  538. package/starters/lokatech/themes/lokatech/components/text/schema.yaml +12 -0
  539. package/starters/lokatech/themes/lokatech/components/text/text.tsx +67 -0
  540. package/starters/lokatech/themes/lokatech/components/text-with-image/schema.yaml +30 -0
  541. package/starters/lokatech/themes/lokatech/components/text-with-image/text-with-image.tsx +92 -0
  542. package/starters/lokatech/themes/lokatech/components/video/schema.yaml +19 -0
  543. package/starters/lokatech/themes/lokatech/components/video/video.tsx +103 -0
  544. package/starters/lokatech/themes/lokatech/layouts/404.tsx +96 -0
  545. package/starters/lokatech/themes/lokatech/layouts/article.tsx +140 -0
  546. package/starters/lokatech/themes/lokatech/layouts/base.tsx +672 -0
  547. package/starters/lokatech/themes/lokatech/layouts/case-study.tsx +233 -0
  548. package/starters/lokatech/themes/lokatech/layouts/index--articles.tsx +246 -0
  549. package/starters/lokatech/themes/lokatech/layouts/index--case-studies.tsx +230 -0
  550. package/starters/lokatech/themes/lokatech/layouts/index--services.tsx +237 -0
  551. package/starters/lokatech/themes/lokatech/layouts/index.tsx +96 -0
  552. package/starters/lokatech/themes/lokatech/layouts/industry.tsx +121 -0
  553. package/starters/lokatech/themes/lokatech/layouts/landing-page.tsx +14 -0
  554. package/starters/lokatech/themes/lokatech/layouts/page--about.tsx +158 -0
  555. package/starters/lokatech/themes/lokatech/layouts/page--careers.tsx +125 -0
  556. package/starters/lokatech/themes/lokatech/layouts/page--contact.tsx +235 -0
  557. package/starters/lokatech/themes/lokatech/layouts/page.tsx +45 -0
  558. package/starters/lokatech/themes/lokatech/layouts/service.tsx +235 -0
  559. package/starters/lokatech/themes/lokatech/partials/footer.tsx +109 -0
  560. package/starters/lokatech/themes/lokatech/partials/header.tsx +53 -0
  561. package/starters/lokatech/themes/lokatech/static/images/article-platform-engineering.jpg +0 -0
  562. package/starters/lokatech/themes/lokatech/static/images/barka-logo.png +0 -0
  563. package/starters/lokatech/themes/lokatech/static/images/case-study-banking-dashboard.jpg +0 -0
  564. package/starters/lokatech/themes/lokatech/static/images/case-study-banking.png +0 -0
  565. package/starters/lokatech/themes/lokatech/static/images/case-study-ecommerce-dashboard.jpg +0 -0
  566. package/starters/lokatech/themes/lokatech/static/images/case-study-healthcare-dashboard.jpg +0 -0
  567. package/starters/lokatech/themes/lokatech/static/images/case-study-healthcare.png +0 -0
  568. package/starters/lokatech/themes/lokatech/static/images/case-study-retail.png +0 -0
  569. package/starters/lokatech/themes/lokatech/static/images/hero-bg.png +0 -0
  570. package/starters/lokatech/themes/lokatech/static/images/lokatech-logo.png +0 -0
  571. package/starters/lokatech/themes/lokatech/static/images/office-warsaw.png +0 -0
  572. package/starters/lokatech/themes/lokatech/static/images/team-anna-kowalska.png +0 -0
  573. package/starters/lokatech/themes/lokatech/static/images/team-collaboration.jpg +0 -0
  574. package/starters/lokatech/themes/lokatech/static/images/team-jan-nowak.png +0 -0
  575. package/starters/lokatech/themes/lokatech/static/images/team-katarzyna-kaminska.png +0 -0
  576. package/starters/lokatech/themes/lokatech/static/images/team-maria-wisniewska.png +0 -0
  577. package/starters/lokatech/themes/lokatech/static/images/team-strategy-session.jpg +0 -0
  578. package/starters/lokatech/themes/lokatech/static/images/team-tomasz-lewandowski.png +0 -0
  579. package/starters/lokatech/themes/lokatech/static/style.css +495 -0
  580. package/starters/lokatech/themes/lokatech/theme.yaml +21 -0
  581. package/starters/lokatech/themes/starter/_types.ts +93 -0
  582. package/starters/lokatech/themes/starter/components/blog-listing/blog-listing.tsx +102 -0
  583. package/starters/lokatech/themes/starter/components/blog-listing/schema.yaml +21 -0
  584. package/starters/lokatech/themes/starter/components/columns/columns.tsx +101 -0
  585. package/starters/lokatech/themes/starter/components/columns/schema.yaml +23 -0
  586. package/starters/lokatech/themes/starter/components/counters/counters.css +13 -0
  587. package/starters/lokatech/themes/starter/components/counters/counters.tsx +81 -0
  588. package/starters/lokatech/themes/starter/components/counters/schema.yaml +23 -0
  589. package/starters/lokatech/themes/starter/components/cta/cta.tsx +57 -0
  590. package/starters/lokatech/themes/starter/components/cta/schema.yaml +30 -0
  591. package/starters/lokatech/themes/starter/components/faq/faq.tsx +77 -0
  592. package/starters/lokatech/themes/starter/components/faq/schema.yaml +20 -0
  593. package/starters/lokatech/themes/starter/components/features/features.tsx +82 -0
  594. package/starters/lokatech/themes/starter/components/features/schema.yaml +19 -0
  595. package/starters/lokatech/themes/starter/components/form/form.tsx +126 -0
  596. package/starters/lokatech/themes/starter/components/form/schema.yaml +18 -0
  597. package/starters/lokatech/themes/starter/components/gallery/gallery.tsx +85 -0
  598. package/starters/lokatech/themes/starter/components/gallery/schema.yaml +27 -0
  599. package/starters/lokatech/themes/starter/components/hero/hero.tsx +77 -0
  600. package/starters/lokatech/themes/starter/components/hero/schema.yaml +26 -0
  601. package/starters/lokatech/themes/starter/components/logo-slider/logo-slider.css +21 -0
  602. package/starters/lokatech/themes/starter/components/logo-slider/logo-slider.tsx +81 -0
  603. package/starters/lokatech/themes/starter/components/logo-slider/schema.yaml +23 -0
  604. package/starters/lokatech/themes/starter/components/pricing/pricing.tsx +141 -0
  605. package/starters/lokatech/themes/starter/components/pricing/schema.yaml +44 -0
  606. package/starters/lokatech/themes/starter/components/testimonials/schema.yaml +26 -0
  607. package/starters/lokatech/themes/starter/components/testimonials/testimonials.tsx +100 -0
  608. package/starters/lokatech/themes/starter/components/text/schema.yaml +12 -0
  609. package/starters/lokatech/themes/starter/components/text/text.tsx +62 -0
  610. package/starters/lokatech/themes/starter/components/text-with-image/schema.yaml +30 -0
  611. package/starters/lokatech/themes/starter/components/text-with-image/text-with-image.tsx +86 -0
  612. package/starters/lokatech/themes/starter/components/video/schema.yaml +19 -0
  613. package/starters/lokatech/themes/starter/components/video/video.tsx +98 -0
  614. package/starters/lokatech/themes/starter/layouts/article.tsx +42 -0
  615. package/starters/lokatech/themes/starter/layouts/base.tsx +92 -0
  616. package/starters/lokatech/themes/starter/layouts/landing-page.tsx +14 -0
  617. package/starters/lokatech/themes/starter/layouts/page.tsx +29 -0
  618. package/starters/lokatech/themes/starter/partials/footer.tsx +22 -0
  619. package/starters/lokatech/themes/starter/partials/header.tsx +32 -0
  620. package/starters/lokatech/themes/starter/static/style.css +125 -0
  621. package/starters/lokatech/themes/starter/theme.yaml +16 -0
@@ -0,0 +1,230 @@
1
+ /** @jsxImportSource hono/jsx */
2
+ import type { FC } from 'hono/jsx';
3
+ import type { LayoutProps, Content } from '../_types.js';
4
+ import Base from './base.js';
5
+
6
+ const CaseStudies: FC<LayoutProps> = (props) => {
7
+ const { content, themeSettings } = props;
8
+ const primaryColor = themeSettings.primary_color ?? '#10B981';
9
+ const navColor = themeSettings.nav_color ?? '#0B1222';
10
+ const items: Content[] = (content.fields.items ?? []).sort(
11
+ (a: Content, b: Content) => (b.publishedAt?.getTime?.() ?? 0) - (a.publishedAt?.getTime?.() ?? 0),
12
+ );
13
+
14
+ const featured = items[0];
15
+ const rest = items.slice(1);
16
+
17
+ const industryColors: Record<string, string> = {
18
+ banking: '#3b82f6',
19
+ 'financial-services': '#8b5cf6',
20
+ healthcare: '#ef4444',
21
+ manufacturing: '#f59e0b',
22
+ retail: '#ec4899',
23
+ telecom: '#06b6d4',
24
+ 'public-sector': '#10b981',
25
+ };
26
+
27
+ return (
28
+ <Base {...props}>
29
+ {/* Hero */}
30
+ <section class="relative overflow-hidden py-24 text-white" style={{ backgroundColor: navColor }}>
31
+ <div class="grid-pattern pointer-events-none absolute inset-0" />
32
+ <div class="blob blob-lg" style={{ top: '-15%', right: '-5%', background: `${primaryColor}10` }} />
33
+ <div class="pointer-events-none absolute inset-0" style={{ background: `radial-gradient(ellipse at 30% 60%, ${primaryColor}10 0%, transparent 50%)` }} />
34
+ <div class="relative mx-auto max-w-7xl px-6">
35
+ <p class="reveal-sub mb-4 text-xs font-semibold uppercase tracking-[0.25em] text-gray-400">Our Work</p>
36
+ <h1 class="reveal-heading max-w-3xl text-4xl font-extrabold tracking-[-0.04em] leading-[1.05] sm:text-5xl lg:text-6xl">
37
+ {content.title}
38
+ </h1>
39
+ {content.fields?.subtitle && (
40
+ <p class="reveal-sub mt-6 max-w-xl text-lg text-gray-300/80" style={{ animationDelay: '0.3s' }}>
41
+ {content.fields.subtitle}
42
+ </p>
43
+ )}
44
+ {/* Quick stats bar */}
45
+ <div class="reveal-sub mt-12 flex flex-wrap gap-12" style={{ animationDelay: '0.4s' }}>
46
+ <div>
47
+ <div class="text-3xl font-extrabold">{items.length}</div>
48
+ <div class="mt-1 text-xs uppercase tracking-widest text-gray-400">Case Studies</div>
49
+ </div>
50
+ <div>
51
+ <div class="text-3xl font-extrabold">6</div>
52
+ <div class="mt-1 text-xs uppercase tracking-widest text-gray-400">Industries</div>
53
+ </div>
54
+ <div>
55
+ <div class="text-3xl font-extrabold">200+</div>
56
+ <div class="mt-1 text-xs uppercase tracking-widest text-gray-400">Projects Delivered</div>
57
+ </div>
58
+ </div>
59
+ </div>
60
+ </section>
61
+
62
+ {/* Featured case study — full-width asymmetric */}
63
+ {featured && (
64
+ <section class="py-20">
65
+ <div class="mx-auto max-w-7xl px-6">
66
+ <p class="reveal-sub mb-8 text-xs font-semibold uppercase tracking-[0.2em] text-slate-400">Featured Project</p>
67
+ <a
68
+ href={(featured as any).url ?? `/case-studies/${featured.slug}`}
69
+ class="testimonial-featured group grid overflow-hidden rounded-2xl border border-gray-100 bg-white transition-all duration-400 hover:shadow-2xl hover:shadow-slate-200/60 hover:no-underline lg:grid-cols-5"
70
+ >
71
+ {/* Image — takes 3 cols */}
72
+ <div class="overflow-hidden lg:col-span-3">
73
+ {(featured.fields.featured_image || featured.fields.image) && (
74
+ <img
75
+ src={featured.fields.featured_image ?? featured.fields.image}
76
+ alt={featured.title}
77
+ class="h-full min-h-[300px] w-full object-cover transition-transform duration-700 group-hover:scale-105"
78
+ loading="lazy"
79
+ />
80
+ )}
81
+ </div>
82
+ {/* Content — takes 2 cols */}
83
+ <div class="flex flex-col justify-center p-10 lg:col-span-2">
84
+ {featured.fields.industry && (
85
+ <span
86
+ class="mb-4 inline-block w-fit rounded-full px-3 py-1 text-xs font-semibold text-white"
87
+ style={{ backgroundColor: industryColors[featured.fields.industry] ?? primaryColor }}
88
+ >
89
+ {String(featured.fields.industry).replace(/-/g, ' ').replace(/\b\w/g, (c: string) => c.toUpperCase())}
90
+ </span>
91
+ )}
92
+ <h2 class="text-2xl font-bold tracking-[-0.02em] text-slate-900 lg:text-3xl">
93
+ {featured.title}
94
+ </h2>
95
+ {featured.fields.short_description && (
96
+ <p class="mt-4 text-sm leading-relaxed text-slate-500">{featured.fields.short_description}</p>
97
+ )}
98
+ {/* Metrics row */}
99
+ {featured.fields.metrics && (
100
+ <div class="mt-6 flex flex-wrap gap-6">
101
+ {(featured.fields.metrics as Array<{ value: string; label: string }>).slice(0, 3).map((m) => (
102
+ <div>
103
+ <div class="text-xl font-extrabold" style={{ color: primaryColor }}>{m.value}</div>
104
+ <div class="text-xs text-slate-400">{m.label}</div>
105
+ </div>
106
+ ))}
107
+ </div>
108
+ )}
109
+ <div class="mt-6 flex items-center gap-1 text-sm font-semibold" style={{ color: primaryColor }}>
110
+ View case study
111
+ <span class="transition-transform duration-200 group-hover:translate-x-2">&rarr;</span>
112
+ </div>
113
+ </div>
114
+ </a>
115
+ </div>
116
+ </section>
117
+ )}
118
+
119
+ {/* Grid — asymmetric bento */}
120
+ {rest.length > 0 && (
121
+ <section class="border-t border-gray-100 bg-slate-50 py-20">
122
+ <div class="mx-auto max-w-7xl px-6">
123
+ <div class="stagger-grid grid gap-6 md:grid-cols-2 xl:grid-cols-3">
124
+ {rest.map((item, idx) => {
125
+ const isLarge = idx === 0 || idx === 3;
126
+ return (
127
+ <a
128
+ href={(item as any).url ?? `/case-studies/${item.slug}`}
129
+ class={`group relative overflow-hidden rounded-2xl border border-gray-100 bg-white transition-all duration-400 hover:shadow-xl hover:shadow-slate-200/50 hover:no-underline ${
130
+ isLarge ? 'md:col-span-2 xl:col-span-2' : ''
131
+ }`}
132
+ >
133
+ <div class={`${isLarge ? 'grid md:grid-cols-2' : ''}`}>
134
+ {(item.fields.featured_image || item.fields.image) && (
135
+ <div class="overflow-hidden">
136
+ <img
137
+ src={item.fields.featured_image ?? item.fields.image}
138
+ alt={item.title}
139
+ class={`w-full object-cover transition-transform duration-700 group-hover:scale-105 ${isLarge ? 'h-full min-h-[240px]' : 'aspect-video'}`}
140
+ loading="lazy"
141
+ />
142
+ </div>
143
+ )}
144
+ <div class="p-7">
145
+ <div class="mb-3 flex flex-wrap items-center gap-2">
146
+ {item.fields.industry && (
147
+ <span
148
+ class="rounded-full px-2.5 py-0.5 text-[10px] font-semibold text-white"
149
+ style={{ backgroundColor: industryColors[item.fields.industry] ?? primaryColor }}
150
+ >
151
+ {String(item.fields.industry).replace(/-/g, ' ').replace(/\b\w/g, (c: string) => c.toUpperCase())}
152
+ </span>
153
+ )}
154
+ {item.fields.duration && (
155
+ <span class="text-[10px] font-medium text-slate-400">{item.fields.duration}</span>
156
+ )}
157
+ </div>
158
+ <h3 class={`font-bold tracking-[-0.02em] text-slate-900 ${isLarge ? 'text-xl lg:text-2xl' : 'text-lg'}`}>
159
+ {item.title}
160
+ </h3>
161
+ {item.fields.short_description && (
162
+ <p class="mt-3 text-sm leading-relaxed text-slate-500 line-clamp-3">
163
+ {item.fields.short_description}
164
+ </p>
165
+ )}
166
+ {/* Metrics for large cards */}
167
+ {isLarge && item.fields.metrics && (
168
+ <div class="mt-5 flex flex-wrap gap-5">
169
+ {(item.fields.metrics as Array<{ value: string; label: string }>).slice(0, 3).map((m) => (
170
+ <div>
171
+ <div class="text-lg font-extrabold" style={{ color: primaryColor }}>{m.value}</div>
172
+ <div class="text-[10px] uppercase tracking-wider text-slate-400">{m.label}</div>
173
+ </div>
174
+ ))}
175
+ </div>
176
+ )}
177
+ <div class="mt-4 flex items-center gap-1 text-xs font-semibold opacity-0 transition-all duration-300 group-hover:opacity-100" style={{ color: primaryColor }}>
178
+ Read case study <span class="transition-transform duration-200 group-hover:translate-x-1">&rarr;</span>
179
+ </div>
180
+ </div>
181
+ </div>
182
+ {/* Accent line */}
183
+ <div class="absolute bottom-0 left-0 h-0.5 w-0 transition-all duration-500 group-hover:w-full" style={{ backgroundColor: primaryColor }} />
184
+ </a>
185
+ );
186
+ })}
187
+ </div>
188
+ </div>
189
+ </section>
190
+ )}
191
+
192
+ {/* CTA */}
193
+ <section class="relative overflow-hidden py-24 text-white" style={{ backgroundColor: navColor }}>
194
+ <div class="grid-pattern pointer-events-none absolute inset-0" />
195
+ <div class="blob blob-sm" style={{ bottom: '-10%', right: '10%', background: `${primaryColor}10`, animationDelay: '-4s' }} />
196
+ <div class="pointer-events-none absolute inset-0" style={{ background: `radial-gradient(ellipse at 50% 50%, ${primaryColor}10 0%, transparent 60%)` }} />
197
+ <div class="relative mx-auto max-w-7xl px-6">
198
+ <div class="grid items-center gap-10 lg:grid-cols-5">
199
+ <div class="lg:col-span-3">
200
+ <h2 class="reveal-heading text-3xl font-bold tracking-[-0.03em] sm:text-4xl">
201
+ Have a similar challenge?
202
+ </h2>
203
+ <p class="reveal-sub mt-4 max-w-lg text-lg text-gray-300/90" style={{ animationDelay: '0.2s' }}>
204
+ Our solution architects will review your requirements and propose a tailored approach within 48 hours.
205
+ </p>
206
+ </div>
207
+ <div class="reveal-sub flex flex-col gap-4 lg:col-span-2" style={{ animationDelay: '0.35s' }}>
208
+ <a
209
+ href="/contact"
210
+ class="inline-block rounded-lg px-8 py-4 text-center text-sm font-semibold text-white shadow-lg transition-all duration-300 hover:shadow-xl hover:brightness-110 hover:no-underline"
211
+ style={{ backgroundColor: primaryColor }}
212
+ >
213
+ Discuss Your Project
214
+ </a>
215
+ <a
216
+ href="/services"
217
+ class="inline-block rounded-lg border border-white/20 px-8 py-4 text-center text-sm font-semibold text-white/90 transition-all duration-300 hover:border-white/40 hover:text-white hover:no-underline"
218
+ >
219
+ Explore Services
220
+ </a>
221
+ </div>
222
+ </div>
223
+ </div>
224
+ <div class="glow-line absolute top-0 left-0 right-0" />
225
+ </section>
226
+ </Base>
227
+ );
228
+ };
229
+
230
+ export default CaseStudies;
@@ -0,0 +1,237 @@
1
+ /** @jsxImportSource hono/jsx */
2
+ import type { FC } from 'hono/jsx';
3
+ import type { LayoutProps, Content } from '../_types.js';
4
+ import Base from './base.js';
5
+
6
+ const iconSvgs: Record<string, string> = {
7
+ code: `<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="m17.25 6.75 4.5 5.25-4.5 5.25m-10.5 0L2.25 12l4.5-5.25m7.5-3-4.5 16.5"/></svg>`,
8
+ cloud: `<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M2.25 15a4.5 4.5 0 0 0 4.5 4.5H18a3.75 3.75 0 0 0 .75-7.425 4.5 4.5 0 0 0-8.78-2.34A4.5 4.5 0 0 0 2.25 15Z"/></svg>`,
9
+ shield: `<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12.75 11.25 15 15 9.75m-3-7.036A11.959 11.959 0 0 1 3.598 6 11.99 11.99 0 0 0 3 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285Z"/></svg>`,
10
+ brain: `<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M9.813 15.904 9 18.75l-.813-2.846a4.5 4.5 0 0 0-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 0 0 3.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 0 0 3.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 0 0-3.09 3.09ZM18.259 8.715 18 9.75l-.259-1.035a3.375 3.375 0 0 0-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 0 0 2.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 0 0 2.456 2.456L21.75 6l-1.035.259a3.375 3.375 0 0 0-2.456 2.456ZM16.894 20.567 16.5 21.75l-.394-1.183a2.25 2.25 0 0 0-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 0 0 1.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 0 0 1.423 1.423l1.183.394-1.183.394a2.25 2.25 0 0 0-1.423 1.423Z"/></svg>`,
11
+ rocket: `<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M15.59 14.37a6 6 0 0 1-5.84 7.38v-4.8m5.84-2.58a14.98 14.98 0 0 0 6.16-12.12A14.98 14.98 0 0 0 9.631 8.41m5.96 5.96a14.926 14.926 0 0 1-5.841 2.58m-.119-8.54a6 6 0 0 0-7.381 5.84h4.8m2.581-5.84a14.927 14.927 0 0 0-2.58 5.84m2.699 2.7c-.103.021-.207.041-.311.06a15.09 15.09 0 0 1-2.448-2.448 14.9 14.9 0 0 1 .06-.312m-2.24 2.39a4.493 4.493 0 0 0-1.757 4.306 4.493 4.493 0 0 0 4.306-1.758M16.5 9a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0Z"/></svg>`,
12
+ users: `<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path stroke-linecap="round" stroke-linejoin="round" d="M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.477m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z"/></svg>`,
13
+ };
14
+
15
+ const Services: FC<LayoutProps> = (props) => {
16
+ const { content, themeSettings } = props;
17
+ const primaryColor = themeSettings.primary_color ?? '#10B981';
18
+ const navColor = themeSettings.nav_color ?? '#0B1222';
19
+ const items: Content[] = content.fields.items ?? [];
20
+ const t = themeSettings._t ?? ((key: string) => key);
21
+
22
+ const featured = items[0];
23
+ const rest = items.slice(1);
24
+
25
+ return (
26
+ <Base {...props}>
27
+ {/* Hero — strong first impression (halo effect) */}
28
+ <section class="relative overflow-hidden py-28 text-white" style={{ backgroundColor: navColor }}>
29
+ <div class="grid-pattern pointer-events-none absolute inset-0" />
30
+ <div class="blob blob-lg" style={{ top: '-20%', right: '-5%', background: `${primaryColor}12` }} />
31
+ <div class="pointer-events-none absolute inset-0" style={{ background: `radial-gradient(ellipse at 30% 70%, ${primaryColor}12 0%, transparent 50%)` }} />
32
+ <div class="relative mx-auto max-w-7xl px-6">
33
+ <p class="reveal-sub mb-5 text-xs font-semibold uppercase tracking-[0.25em] text-gray-400">{t('services.hero_label')}</p>
34
+ <h1 class="reveal-heading max-w-4xl text-4xl font-extrabold tracking-[-0.04em] leading-[1.05] sm:text-5xl lg:text-6xl">
35
+ End-to-end{' '}
36
+ <em class="not-italic" style={{ background: `linear-gradient(135deg, ${primaryColor}, #60a5fa)`, WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent' }}>engineering</em>{' '}
37
+ services
38
+ </h1>
39
+ <p class="reveal-sub mt-6 max-w-2xl text-lg leading-relaxed text-gray-300/80" style={{ animationDelay: '0.3s' }}>
40
+ From strategy to production — one partner for your entire technology stack. 800+ engineers, 200+ projects, 15+ years of enterprise delivery.
41
+ </p>
42
+ <div class="reveal-sub mt-14 flex flex-wrap gap-12" style={{ animationDelay: '0.45s' }}>
43
+ <div>
44
+ <div class="text-3xl font-extrabold">{items.length}</div>
45
+ <div class="mt-1 text-xs uppercase tracking-widest text-gray-400">{t('services.stats_areas')}</div>
46
+ </div>
47
+ <div>
48
+ <div class="text-3xl font-extrabold">800+</div>
49
+ <div class="mt-1 text-xs uppercase tracking-widest text-gray-400">{t('services.stats_engineers')}</div>
50
+ </div>
51
+ <div>
52
+ <div class="text-3xl font-extrabold">200+</div>
53
+ <div class="mt-1 text-xs uppercase tracking-widest text-gray-400">{t('services.stats_delivered')}</div>
54
+ </div>
55
+ <div>
56
+ <div class="text-3xl font-extrabold">6</div>
57
+ <div class="mt-1 text-xs uppercase tracking-widest text-gray-400">{t('services.stats_offices')}</div>
58
+ </div>
59
+ </div>
60
+ </div>
61
+ </section>
62
+
63
+ {/* Featured service — full-width asymmetric card */}
64
+ {featured && (
65
+ <section class="py-24">
66
+ <div class="mx-auto max-w-7xl px-6">
67
+ <p class="reveal-sub mb-8 text-xs font-semibold uppercase tracking-[0.2em] text-slate-400">{t('services.core_capability')}</p>
68
+ <a
69
+ href={(featured as any).url ?? `/services/${featured.slug}`}
70
+ class="group relative grid overflow-hidden rounded-3xl border border-gray-100 bg-white transition-all duration-500 hover:shadow-2xl hover:shadow-slate-200/60 hover:no-underline lg:grid-cols-2"
71
+ >
72
+ <div class="relative flex flex-col justify-center p-10 lg:p-14">
73
+ <div
74
+ class="mb-6 flex h-14 w-14 items-center justify-center rounded-2xl"
75
+ style={{ backgroundColor: `${primaryColor}12`, color: primaryColor }}
76
+ dangerouslySetInnerHTML={{ __html: iconSvgs[featured.fields?.icon] ?? iconSvgs.code }}
77
+ />
78
+ <h2 class="text-2xl font-bold tracking-[-0.03em] text-slate-900 lg:text-3xl">
79
+ {featured.title}
80
+ </h2>
81
+ <p class="mt-4 text-base leading-relaxed text-slate-500">
82
+ {featured.fields.short_description ?? featured.fields.description}
83
+ </p>
84
+ {featured.fields.hero_stats && (
85
+ <div class="mt-8 grid grid-cols-3 gap-6 border-t border-gray-100 pt-8">
86
+ {(featured.fields.hero_stats as Array<{ value: string; label: string }>).map((stat) => (
87
+ <div>
88
+ <div class="text-xl font-extrabold" style={{ color: primaryColor }}>{stat.value}</div>
89
+ <div class="mt-0.5 text-xs text-slate-400">{stat.label}</div>
90
+ </div>
91
+ ))}
92
+ </div>
93
+ )}
94
+ <div class="mt-8 flex items-center gap-2 text-sm font-semibold" style={{ color: primaryColor }}>
95
+ Explore service
96
+ <span class="transition-transform duration-300 group-hover:translate-x-2">&rarr;</span>
97
+ </div>
98
+ </div>
99
+ <div class="relative hidden overflow-hidden lg:block" style={{ backgroundColor: `${navColor}08` }}>
100
+ <div class="absolute inset-0 grid-pattern opacity-40" />
101
+ <div class="absolute inset-0" style={{ background: `radial-gradient(circle at 50% 50%, ${primaryColor}15 0%, transparent 70%)` }} />
102
+ <div class="flex h-full items-center justify-center">
103
+ <div class="text-slate-200/20" style={{ transform: 'scale(6)' }} dangerouslySetInnerHTML={{ __html: iconSvgs[featured.fields?.icon] ?? iconSvgs.code }} />
104
+ </div>
105
+ </div>
106
+ <div class="absolute bottom-0 left-0 h-1 w-0 transition-all duration-700 group-hover:w-full" style={{ backgroundColor: primaryColor }} />
107
+ </a>
108
+ </div>
109
+ </section>
110
+ )}
111
+
112
+ {/* Services grid — clean hierarchy (cognitive fluency) */}
113
+ {rest.length > 0 && (
114
+ <section class="border-t border-gray-100 bg-slate-50/50 py-24">
115
+ <div class="mx-auto max-w-7xl px-6">
116
+ <div class="mb-14 max-w-2xl">
117
+ <div class="mb-4 flex items-center gap-3">
118
+ <div class="h-1 w-8 rounded" style={{ backgroundColor: primaryColor }} />
119
+ <span class="text-xs font-semibold uppercase tracking-[0.15em] text-slate-400">{t('services.all_services')}</span>
120
+ </div>
121
+ <h2 class="text-3xl font-bold tracking-[-0.03em] text-slate-900">
122
+ Every capability you need, <em class="not-italic" style={{ color: primaryColor }}>under one roof</em>
123
+ </h2>
124
+ </div>
125
+
126
+ <div class="stagger-grid grid gap-6 md:grid-cols-2 xl:grid-cols-3">
127
+ {rest.map((item) => (
128
+ <a
129
+ href={(item as any).url ?? `/services/${item.slug}`}
130
+ class="group relative flex flex-col overflow-hidden rounded-2xl border border-gray-100 bg-white p-8 transition-all duration-400 hover:shadow-xl hover:shadow-slate-200/50 hover:no-underline"
131
+ >
132
+ <div
133
+ class="mb-5 flex h-12 w-12 items-center justify-center rounded-xl transition-all duration-300 group-hover:scale-110"
134
+ style={{ backgroundColor: `${primaryColor}10`, color: primaryColor }}
135
+ dangerouslySetInnerHTML={{ __html: iconSvgs[item.fields?.icon] ?? iconSvgs.code }}
136
+ />
137
+ <h3 class="text-lg font-bold tracking-[-0.02em] text-slate-900">
138
+ {item.title}
139
+ </h3>
140
+ <p class="mt-3 flex-1 text-sm leading-relaxed text-slate-500">
141
+ {item.fields.short_description ?? item.fields.description}
142
+ </p>
143
+ {item.fields.hero_stats && (
144
+ <div class="mt-6 flex gap-6 border-t border-gray-50 pt-5">
145
+ {(item.fields.hero_stats as Array<{ value: string; label: string }>).slice(0, 2).map((stat) => (
146
+ <div>
147
+ <div class="text-sm font-extrabold" style={{ color: primaryColor }}>{stat.value}</div>
148
+ <div class="text-[10px] text-slate-400">{stat.label}</div>
149
+ </div>
150
+ ))}
151
+ </div>
152
+ )}
153
+ <div class="mt-5 flex items-center gap-1 text-xs font-semibold opacity-0 transition-all duration-300 group-hover:opacity-100" style={{ color: primaryColor }}>
154
+ Learn more <span class="transition-transform duration-200 group-hover:translate-x-1">&rarr;</span>
155
+ </div>
156
+ <div class="absolute bottom-0 left-0 h-0.5 w-0 transition-all duration-500 group-hover:w-full" style={{ backgroundColor: primaryColor }} />
157
+ </a>
158
+ ))}
159
+ </div>
160
+ </div>
161
+ </section>
162
+ )}
163
+
164
+ {/* Process section — cognitive fluency through numbered steps */}
165
+ <section class="py-24">
166
+ <div class="mx-auto max-w-7xl px-6">
167
+ <div class="mb-16 text-center">
168
+ <p class="mb-3 text-xs font-semibold uppercase tracking-[0.2em] text-slate-400">{t('services.how_we_work')}</p>
169
+ <h2 class="text-3xl font-bold tracking-[-0.03em] text-slate-900 sm:text-4xl">
170
+ From first call to <em class="not-italic" style={{ color: primaryColor }}>production</em>
171
+ </h2>
172
+ <p class="mx-auto mt-4 max-w-xl text-base text-slate-500">
173
+ Every engagement follows a proven methodology refined across 200+ enterprise projects.
174
+ </p>
175
+ </div>
176
+ <div class="grid gap-px overflow-hidden rounded-2xl border border-gray-100 bg-gray-100 md:grid-cols-2 lg:grid-cols-4">
177
+ {[
178
+ { step: '01', title: 'Discovery', desc: 'Deep-dive workshops to understand your business, map challenges, and define success metrics.' },
179
+ { step: '02', title: 'Architecture', desc: 'Solution design reviewed by certified architects. Technology choices justified by your constraints.' },
180
+ { step: '03', title: 'Delivery', desc: 'Agile sprints with continuous demos. Working software every two weeks. Zero surprises.' },
181
+ { step: '04', title: 'Scale', desc: '24/7 monitoring, optimization, and continuous improvement. Your systems grow as you grow.' },
182
+ ].map((phase) => (
183
+ <div class="group relative bg-white p-8 transition-all duration-300 hover:bg-slate-50">
184
+ <div class="mb-4 text-3xl font-extrabold tracking-tighter" style={{ color: `${primaryColor}30` }}>
185
+ {phase.step}
186
+ </div>
187
+ <h3 class="text-base font-bold text-slate-900">{phase.title}</h3>
188
+ <p class="mt-2 text-sm leading-relaxed text-slate-500">{phase.desc}</p>
189
+ <div class="absolute top-0 left-0 h-1 w-0 transition-all duration-500 group-hover:w-full" style={{ backgroundColor: primaryColor }} />
190
+ </div>
191
+ ))}
192
+ </div>
193
+ </div>
194
+ </section>
195
+
196
+ {/* CTA — strong ending (peak-end rule) */}
197
+ <section class="relative overflow-hidden py-28 text-white" style={{ backgroundColor: navColor }}>
198
+ <div class="grid-pattern pointer-events-none absolute inset-0" />
199
+ <div class="blob blob-sm" style={{ bottom: '-10%', right: '10%', background: `${primaryColor}10`, animationDelay: '-4s' }} />
200
+ <div class="pointer-events-none absolute inset-0" style={{ background: `radial-gradient(ellipse at 50% 50%, ${primaryColor}10 0%, transparent 60%)` }} />
201
+ <div class="relative mx-auto max-w-7xl px-6">
202
+ <div class="grid items-center gap-12 lg:grid-cols-5">
203
+ <div class="lg:col-span-3">
204
+ <p class="reveal-sub mb-4 text-xs font-semibold uppercase tracking-[0.25em] text-gray-400">{t('services.lets_talk')}</p>
205
+ <h2 class="reveal-heading text-3xl font-bold tracking-[-0.03em] sm:text-4xl lg:text-5xl">
206
+ Ready to{' '}
207
+ <em class="not-italic" style={{ background: `linear-gradient(135deg, ${primaryColor}, #60a5fa)`, WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent' }}>transform</em>{' '}
208
+ your technology?
209
+ </h2>
210
+ <p class="reveal-sub mt-5 max-w-lg text-lg text-gray-300/90" style={{ animationDelay: '0.2s' }}>
211
+ Our solution architects will review your requirements and propose a tailored approach within 48 hours.
212
+ </p>
213
+ </div>
214
+ <div class="reveal-sub flex flex-col gap-4 lg:col-span-2" style={{ animationDelay: '0.35s' }}>
215
+ <a
216
+ href="/contact"
217
+ class="inline-block rounded-xl px-8 py-4 text-center text-sm font-semibold text-white shadow-lg transition-all duration-300 hover:shadow-xl hover:brightness-110 hover:no-underline"
218
+ style={{ backgroundColor: primaryColor }}
219
+ >
220
+ Start a Conversation
221
+ </a>
222
+ <a
223
+ href="/case-studies"
224
+ class="inline-block rounded-xl border border-white/20 px-8 py-4 text-center text-sm font-semibold text-white/90 transition-all duration-300 hover:border-white/40 hover:text-white hover:no-underline"
225
+ >
226
+ View Case Studies
227
+ </a>
228
+ </div>
229
+ </div>
230
+ </div>
231
+ <div class="glow-line absolute top-0 left-0 right-0" />
232
+ </section>
233
+ </Base>
234
+ );
235
+ };
236
+
237
+ export default Services;
@@ -0,0 +1,96 @@
1
+ /** @jsxImportSource hono/jsx */
2
+ import type { FC } from 'hono/jsx';
3
+ import type { LayoutProps, Content } from '../_types.js';
4
+ import Base from './base.js';
5
+
6
+ const Index: FC<LayoutProps> = (props) => {
7
+ const { content, themeSettings } = props;
8
+ const primaryColor = themeSettings.primary_color ?? '#10B981';
9
+ const navColor = themeSettings.nav_color ?? '#0B1222';
10
+ const items: Content[] = content.fields.items ?? [];
11
+
12
+ return (
13
+ <Base {...props}>
14
+ {/* Hero */}
15
+ <section class="relative overflow-hidden py-20 text-white" style={{ backgroundColor: navColor }}>
16
+ <div class="pointer-events-none absolute inset-0" style={{ background: `radial-gradient(ellipse at 50% 50%, ${primaryColor}08 0%, transparent 50%)` }} />
17
+ <div class="relative mx-auto max-w-4xl px-6 text-center">
18
+ <h1 class="text-4xl font-extrabold tracking-[-0.03em] leading-[1.1] sm:text-5xl">
19
+ {content.title}
20
+ </h1>
21
+ {content.fields?.subtitle && (
22
+ <p class="mx-auto mt-6 max-w-xl text-lg text-gray-300/90">
23
+ {content.fields.subtitle}
24
+ </p>
25
+ )}
26
+ </div>
27
+ </section>
28
+
29
+ {/* Content grid */}
30
+ <section class="py-20">
31
+ <div class="mx-auto max-w-6xl px-6">
32
+ {items.length > 0 ? (
33
+ <div class="grid gap-8 sm:grid-cols-2 lg:grid-cols-3">
34
+ {items.map((item) => (
35
+ <a
36
+ href={(item as any).url ?? `/${item.slug}`}
37
+ class="group overflow-hidden rounded-2xl border border-gray-100 bg-white transition-all duration-300 hover:shadow-xl hover:shadow-slate-200/50 hover:no-underline"
38
+ >
39
+ {item.fields.image && (
40
+ <div class="overflow-hidden">
41
+ <img
42
+ src={item.fields.image}
43
+ alt={item.title}
44
+ class="aspect-video w-full object-cover transition-transform duration-500 group-hover:scale-105"
45
+ loading="lazy"
46
+ />
47
+ </div>
48
+ )}
49
+ {item.fields.featured_image && !item.fields.image && (
50
+ <div class="overflow-hidden">
51
+ <img
52
+ src={item.fields.featured_image}
53
+ alt={item.title}
54
+ class="aspect-video w-full object-cover transition-transform duration-500 group-hover:scale-105"
55
+ loading="lazy"
56
+ />
57
+ </div>
58
+ )}
59
+ <div class="p-6">
60
+ {item.type === 'article' && item.publishedAt && (
61
+ <time class="text-xs font-medium text-slate-400">
62
+ {item.publishedAt.toLocaleDateString('en-US', {
63
+ year: 'numeric',
64
+ month: 'short',
65
+ day: 'numeric',
66
+ })}
67
+ </time>
68
+ )}
69
+ <h2 class="mt-2 text-lg font-semibold tracking-[-0.01em] text-slate-900">
70
+ {item.title}
71
+ </h2>
72
+ {(item.fields.description || item.fields.short_description) && (
73
+ <p class="mt-3 text-sm leading-relaxed text-slate-500">
74
+ {item.fields.description ?? item.fields.short_description}
75
+ </p>
76
+ )}
77
+ <span class="mt-4 inline-flex items-center gap-1 text-sm font-medium transition-colors duration-200" style={{ color: primaryColor }}>
78
+ Read more
79
+ <span class="transition-transform duration-200 group-hover:translate-x-1">&rarr;</span>
80
+ </span>
81
+ </div>
82
+ </a>
83
+ ))}
84
+ </div>
85
+ ) : (
86
+ <p class="text-center text-slate-400">No content available yet.</p>
87
+ )}
88
+ </div>
89
+ </section>
90
+
91
+ {props.children}
92
+ </Base>
93
+ );
94
+ };
95
+
96
+ export default Index;