@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,218 @@
1
+ /** @jsxImportSource hono/jsx */
2
+ import type { FC } from 'hono/jsx';
3
+ import type { LayoutProps } from '../_types.js';
4
+ import Base from './base.js';
5
+
6
+ const contactChannels = [
7
+ {
8
+ label: 'Employers',
9
+ description: 'Hiring managers & HR teams',
10
+ email: 'employers@kadoservices.com',
11
+ phone: '+48 22 123 4567',
12
+ icon: '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="7" width="20" height="14" rx="2" ry="2"/><path d="M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"/></svg>',
13
+ },
14
+ {
15
+ label: 'Candidates',
16
+ description: 'Job seekers & career support',
17
+ email: 'careers@kadoservices.com',
18
+ phone: '+48 22 123 4568',
19
+ icon: '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>',
20
+ },
21
+ {
22
+ label: 'General',
23
+ description: 'Partnerships & media inquiries',
24
+ email: 'hello@kadoservices.com',
25
+ phone: '+48 22 123 4569',
26
+ icon: '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/><polyline points="22,6 12,13 2,6"/></svg>',
27
+ },
28
+ ];
29
+
30
+ const offices = [
31
+ { city: 'Warsaw', label: 'Headquarters', address: 'ul. Marszalkowska 100, 00-026 Warsaw', hours: 'Mon-Fri 9:00-18:00' },
32
+ { city: 'Krakow', label: 'Southern Hub', address: 'ul. Pawia 5, 31-154 Krakow', hours: 'Mon-Fri 9:00-18:00' },
33
+ { city: 'Wroclaw', label: 'Western Office', address: 'ul. Swidnicka 40, 50-024 Wroclaw', hours: 'Mon-Fri 9:00-17:00' },
34
+ { city: 'Gdansk', label: 'Northern Office', address: 'ul. Dluga 45, 80-827 Gdansk', hours: 'Mon-Fri 9:00-17:00' },
35
+ ];
36
+
37
+ const PageContact: FC<LayoutProps> = (props) => {
38
+ const { content, themeSettings } = props;
39
+ const primaryColor = themeSettings.primary_color ?? '#F59E0B';
40
+ const navColor = themeSettings.nav_color ?? '#14101E';
41
+
42
+ return (
43
+ <Base {...props}>
44
+ {/* Hero — clean amber-50 background */}
45
+ <section class="py-20" style={{ backgroundColor: '#FFFBEB' }}>
46
+ <div class="mx-auto max-w-7xl px-6 text-center">
47
+ <h1 class="text-4xl font-extrabold tracking-[-0.03em] text-slate-900 sm:text-5xl">
48
+ Let's Talk
49
+ </h1>
50
+ <p class="mx-auto mt-4 max-w-xl text-lg text-slate-500">
51
+ {content.fields?.subtitle ?? 'Whether you need talent or are looking for your next role, we are here to help.'}
52
+ </p>
53
+ </div>
54
+ </section>
55
+
56
+ {/* Contact channel cards — row of 3 */}
57
+ <section class="py-16">
58
+ <div class="mx-auto max-w-5xl px-6">
59
+ <div class="grid gap-6 sm:grid-cols-3">
60
+ {contactChannels.map((ch) => (
61
+ <div class="rounded-2xl border border-gray-100 bg-white p-6 transition-all duration-300 hover:shadow-lg hover:shadow-slate-200/50" style={{ borderTop: `3px solid ${primaryColor}` }}>
62
+ <div
63
+ class="mb-4 flex h-12 w-12 items-center justify-center rounded-xl text-white"
64
+ style={{ backgroundColor: primaryColor }}
65
+ dangerouslySetInnerHTML={{ __html: ch.icon }}
66
+ />
67
+ <h3 class="text-lg font-bold text-slate-900">{ch.label}</h3>
68
+ <p class="mt-1 text-xs text-slate-400">{ch.description}</p>
69
+ <div class="mt-4 space-y-2">
70
+ <a href={`mailto:${ch.email}`} class="flex items-center gap-2 text-sm hover:no-underline" style={{ color: primaryColor }}>
71
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/><polyline points="22,6 12,13 2,6"/></svg>
72
+ {ch.email}
73
+ </a>
74
+ <a href={`tel:${ch.phone.replace(/\s/g, '')}`} class="flex items-center gap-2 text-sm text-slate-500 hover:text-slate-900 hover:no-underline">
75
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/></svg>
76
+ {ch.phone}
77
+ </a>
78
+ </div>
79
+ </div>
80
+ ))}
81
+ </div>
82
+ </div>
83
+ </section>
84
+
85
+ {/* Contact form — full width bordered card */}
86
+ <section class="pb-16">
87
+ <div class="mx-auto max-w-3xl px-6">
88
+ <div class="rounded-2xl border border-gray-100 bg-white p-8 shadow-sm sm:p-10">
89
+ <h2 class="text-2xl font-bold tracking-[-0.02em] text-slate-900">Send us a message</h2>
90
+ <p class="mt-2 text-sm text-slate-500">Fill out the form and our team will get back to you within 24 hours.</p>
91
+
92
+ <form class="mt-8 space-y-6" action="#" method="post">
93
+ <div class="grid gap-6 sm:grid-cols-2">
94
+ <div>
95
+ <label class="mb-1.5 block text-sm font-medium text-slate-700" for="first_name">First name</label>
96
+ <input
97
+ type="text" id="first_name" name="first_name" autocomplete="given-name"
98
+ class="block w-full rounded-lg border border-gray-200 bg-white px-4 py-3 text-sm text-slate-900 placeholder-slate-400 transition-all duration-200 focus:border-amber-500 focus:outline-none focus:ring-2 focus:ring-amber-500/20"
99
+ placeholder="Jane"
100
+ />
101
+ </div>
102
+ <div>
103
+ <label class="mb-1.5 block text-sm font-medium text-slate-700" for="last_name">Last name</label>
104
+ <input
105
+ type="text" id="last_name" name="last_name" autocomplete="family-name"
106
+ class="block w-full rounded-lg border border-gray-200 bg-white px-4 py-3 text-sm text-slate-900 placeholder-slate-400 transition-all duration-200 focus:border-amber-500 focus:outline-none focus:ring-2 focus:ring-amber-500/20"
107
+ placeholder="Smith"
108
+ />
109
+ </div>
110
+ </div>
111
+
112
+ <div>
113
+ <label class="mb-1.5 block text-sm font-medium text-slate-700" for="email">Work email</label>
114
+ <input
115
+ type="email" id="email" name="email" autocomplete="email"
116
+ class="block w-full rounded-lg border border-gray-200 bg-white px-4 py-3 text-sm text-slate-900 placeholder-slate-400 transition-all duration-200 focus:border-amber-500 focus:outline-none focus:ring-2 focus:ring-amber-500/20"
117
+ placeholder="jane@company.com"
118
+ />
119
+ </div>
120
+
121
+ <div>
122
+ <label class="mb-1.5 block text-sm font-medium text-slate-700" for="company">Company</label>
123
+ <input
124
+ type="text" id="company" name="company" autocomplete="organization"
125
+ class="block w-full rounded-lg border border-gray-200 bg-white px-4 py-3 text-sm text-slate-900 placeholder-slate-400 transition-all duration-200 focus:border-amber-500 focus:outline-none focus:ring-2 focus:ring-amber-500/20"
126
+ placeholder="Company Ltd."
127
+ />
128
+ </div>
129
+
130
+ <div>
131
+ <label class="mb-1.5 block text-sm font-medium text-slate-700" for="interest">I'm interested in</label>
132
+ <select
133
+ id="interest" name="interest"
134
+ class="block w-full rounded-lg border border-gray-200 bg-white px-4 py-3 text-sm text-slate-900 transition-all duration-200 focus:border-amber-500 focus:outline-none focus:ring-2 focus:ring-amber-500/20"
135
+ >
136
+ <option value="">Select a topic</option>
137
+ <option value="temporary-staffing">Temporary Staffing</option>
138
+ <option value="permanent-recruitment">Permanent Recruitment</option>
139
+ <option value="executive-search">Executive Search</option>
140
+ <option value="outsourcing">HR Outsourcing & Payroll</option>
141
+ <option value="workforce-planning">Workforce Planning</option>
142
+ <option value="candidate">I'm a Candidate Looking for Work</option>
143
+ <option value="partnership">Partnership Inquiry</option>
144
+ <option value="other">Other</option>
145
+ </select>
146
+ </div>
147
+
148
+ <div>
149
+ <label class="mb-1.5 block text-sm font-medium text-slate-700" for="message">Message</label>
150
+ <textarea
151
+ id="message" name="message" rows={5}
152
+ class="block w-full rounded-lg border border-gray-200 bg-white px-4 py-3 text-sm text-slate-900 placeholder-slate-400 transition-all duration-200 focus:border-amber-500 focus:outline-none focus:ring-2 focus:ring-amber-500/20 resize-none"
153
+ placeholder="Tell us about your hiring needs, timeline, and goals..."
154
+ />
155
+ </div>
156
+
157
+ <button
158
+ type="submit"
159
+ class="w-full rounded-lg px-8 py-3.5 text-sm font-semibold text-white transition-all duration-200 hover:shadow-lg"
160
+ style={{ backgroundColor: primaryColor }}
161
+ >
162
+ Send Message
163
+ </button>
164
+ </form>
165
+ </div>
166
+ </div>
167
+ </section>
168
+
169
+ {/* Office locations — 2x2 compact grid */}
170
+ <section class="py-16 border-t border-gray-100" style={{ backgroundColor: '#FAFAFA' }}>
171
+ <div class="mx-auto max-w-4xl px-6">
172
+ <h2 class="mb-2 text-center text-2xl font-bold tracking-[-0.02em] text-slate-900">Our Offices</h2>
173
+ <p class="mx-auto mb-10 max-w-md text-center text-sm text-slate-500">
174
+ Visit us at any of our locations across Poland.
175
+ </p>
176
+
177
+ <div class="grid gap-4 sm:grid-cols-2">
178
+ {offices.map((office) => (
179
+ <div class="flex gap-4 rounded-xl border border-gray-100 bg-white p-5 transition-all duration-300 hover:shadow-md">
180
+ <div class="flex h-10 w-10 shrink-0 items-center justify-center rounded-lg text-sm font-bold text-white" style={{ backgroundColor: navColor }}>
181
+ {office.city.slice(0, 2).toUpperCase()}
182
+ </div>
183
+ <div class="min-w-0">
184
+ <h3 class="text-sm font-semibold text-slate-900">{office.city}</h3>
185
+ <div class="text-xs font-medium" style={{ color: primaryColor }}>{office.label}</div>
186
+ <p class="mt-1 text-xs text-slate-400 leading-relaxed">{office.address}</p>
187
+ <p class="mt-0.5 text-xs text-slate-400">{office.hours}</p>
188
+ </div>
189
+ </div>
190
+ ))}
191
+ </div>
192
+ </div>
193
+ </section>
194
+
195
+ {/* CTA */}
196
+ <section class="relative overflow-hidden py-20 text-white" style={{ backgroundColor: navColor }}>
197
+ <div class="pointer-events-none absolute inset-0" style={{ background: `radial-gradient(ellipse at 50% 50%, ${primaryColor}12 0%, transparent 60%)` }} />
198
+ <div class="relative mx-auto max-w-3xl px-6 text-center">
199
+ <h2 class="text-3xl font-bold tracking-[-0.02em] sm:text-4xl">
200
+ Prefer a scheduled call?
201
+ </h2>
202
+ <p class="mt-4 text-lg text-gray-300/90">
203
+ Book a 30-minute discovery call with one of our staffing consultants.
204
+ </p>
205
+ <a
206
+ href="#"
207
+ class="mt-8 inline-block rounded-lg px-8 py-3.5 text-sm font-semibold text-white transition-all duration-200 hover:shadow-xl hover:no-underline"
208
+ style={{ backgroundColor: primaryColor }}
209
+ >
210
+ Book a Discovery Call
211
+ </a>
212
+ </div>
213
+ </section>
214
+ </Base>
215
+ );
216
+ };
217
+
218
+ export default PageContact;
@@ -0,0 +1,45 @@
1
+ /** @jsxImportSource hono/jsx */
2
+ import type { FC } from 'hono/jsx';
3
+ import type { LayoutProps } from '../_types.js';
4
+ import Base from './base.js';
5
+
6
+ const Page: FC<LayoutProps> = (props) => {
7
+ const { content, themeSettings } = props;
8
+ const primaryColor = themeSettings.primary_color ?? '#F59E0B';
9
+ const navColor = themeSettings.nav_color ?? '#14101E';
10
+
11
+ return (
12
+ <Base {...props}>
13
+ {/* Hero */}
14
+ <section class="relative overflow-hidden py-20 text-white" style={{ backgroundColor: navColor }}>
15
+ <div class="pointer-events-none absolute inset-0" style={{ background: `radial-gradient(ellipse at 50% 50%, ${primaryColor}08 0%, transparent 50%)` }} />
16
+ <div class="relative mx-auto max-w-4xl px-6 text-center">
17
+ <h1 class="text-4xl font-extrabold tracking-[-0.03em] leading-[1.1] sm:text-5xl">
18
+ {content.title}
19
+ </h1>
20
+ {content.fields?.subtitle && (
21
+ <p class="mx-auto mt-6 max-w-xl text-lg text-gray-300/90">
22
+ {content.fields.subtitle}
23
+ </p>
24
+ )}
25
+ </div>
26
+ </section>
27
+
28
+ {/* Body */}
29
+ {content.bodyHtml && (
30
+ <section class="py-20">
31
+ <div class="mx-auto max-w-3xl px-6">
32
+ <div
33
+ class="prose prose-lg prose-slate max-w-none"
34
+ dangerouslySetInnerHTML={{ __html: content.bodyHtml }}
35
+ />
36
+ </div>
37
+ </section>
38
+ )}
39
+
40
+ {props.children}
41
+ </Base>
42
+ );
43
+ };
44
+
45
+ export default Page;
@@ -0,0 +1,235 @@
1
+ /** @jsxImportSource hono/jsx */
2
+ import type { FC } from 'hono/jsx';
3
+ import type { LayoutProps } from '../_types.js';
4
+ import Base from './base.js';
5
+
6
+ const Service: FC<LayoutProps> = (props) => {
7
+ const { content, themeSettings } = props;
8
+ const primaryColor = themeSettings.primary_color ?? '#F59E0B';
9
+ const navColor = themeSettings.nav_color ?? '#14101E';
10
+ const fields = content.fields;
11
+
12
+ return (
13
+ <Base {...props}>
14
+ {/* ═══ Hero — with grid, blobs, stats bar ═══ */}
15
+ <section class="relative overflow-hidden py-28 text-white" style={{ backgroundColor: navColor }}>
16
+ <div class="grid-pattern pointer-events-none absolute inset-0" />
17
+ <div class="blob blob-lg" style={{ top: '-15%', right: '-10%', background: `${primaryColor}12` }} />
18
+ <div class="blob blob-sm" style={{ bottom: '10%', left: '5%', background: `#F9731608`, animationDelay: '-4s' }} />
19
+ <div class="pointer-events-none absolute inset-0" style={{ background: `radial-gradient(ellipse at 70% 30%, ${primaryColor}12 0%, transparent 50%)` }} />
20
+
21
+ <div class="relative mx-auto max-w-7xl px-6">
22
+ <div class="max-w-3xl">
23
+ <p class="reveal-sub mb-4 text-xs font-semibold uppercase tracking-[0.25em] text-gray-400">Our Staffing Solutions</p>
24
+ <h1 class="reveal-heading text-4xl font-extrabold tracking-[-0.04em] leading-[1.05] sm:text-5xl lg:text-6xl">
25
+ {content.title}
26
+ </h1>
27
+ {fields.short_description && (
28
+ <p class="reveal-sub mt-8 max-w-2xl text-lg leading-relaxed text-gray-300/80" style={{ animationDelay: '0.25s' }}>
29
+ {fields.short_description}
30
+ </p>
31
+ )}
32
+ <div class="reveal-sub mt-10 flex flex-wrap gap-4" style={{ animationDelay: '0.4s' }}>
33
+ <a href="/contact" class="inline-block rounded-lg px-8 py-4 text-sm font-semibold text-white shadow-lg transition-all duration-300 hover:shadow-xl hover:brightness-110 hover:no-underline" style={{ backgroundColor: primaryColor }}>
34
+ Request Staffing Consultation
35
+ </a>
36
+ <a href="/case-studies" class="inline-block rounded-lg border border-white/20 px-8 py-4 text-sm font-semibold text-white/90 transition-all duration-300 hover:border-white/40 hover:text-white hover:no-underline">
37
+ See Success Stories
38
+ </a>
39
+ </div>
40
+ </div>
41
+
42
+ {/* Stats bar */}
43
+ {fields.hero_stats && Array.isArray(fields.hero_stats) && (
44
+ <div class="reveal-sub mt-16 flex flex-wrap gap-12 border-t border-white/10 pt-10" style={{ animationDelay: '0.5s' }}>
45
+ {fields.hero_stats.map((stat: { value: string; label: string }) => (
46
+ <div class="counter-item">
47
+ <div class="text-3xl font-extrabold tracking-[-0.03em] lg:text-4xl">{stat.value}</div>
48
+ <div class="mt-1 text-xs font-medium uppercase tracking-[0.12em] text-gray-400">{stat.label}</div>
49
+ </div>
50
+ ))}
51
+ </div>
52
+ )}
53
+ </div>
54
+ <div class="glow-line absolute bottom-0 left-0 right-0" />
55
+ </section>
56
+
57
+ {/* ═══ Challenges — left heading + staggered grid ═══ */}
58
+ {fields.challenges && Array.isArray(fields.challenges) && fields.challenges.length > 0 && (
59
+ <section class="relative overflow-hidden py-24">
60
+ <div class="blob blob-sm" style={{ top: '20%', right: '-3%', background: `${primaryColor}06` }} />
61
+ <div class="mx-auto max-w-7xl px-6">
62
+ <div class="mb-16 max-w-2xl">
63
+ <h2 class="reveal-heading text-3xl font-bold tracking-[-0.03em] sm:text-4xl lg:text-5xl">
64
+ The challenges <em class="not-italic" style={{ background: `linear-gradient(135deg,${primaryColor},${primaryColor}99,#EF4444)`, WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent', backgroundClip: 'text' }}>we solve</em>
65
+ </h2>
66
+ <p class="reveal-sub mt-4 text-lg text-slate-500">Workforce challenges companies face every day — and the reason they call us.</p>
67
+ </div>
68
+ <div class="stagger-grid grid gap-5 sm:grid-cols-2 lg:grid-cols-3">
69
+ {fields.challenges.map((challenge: string, idx: number) => (
70
+ <div class={`group flex items-start gap-4 rounded-2xl border border-gray-100 bg-white p-6 transition-all duration-400 hover:border-amber-200 hover:shadow-xl hover:shadow-amber-500/5 ${idx % 3 === 1 ? 'lg:translate-y-3' : ''}`}>
71
+ <div class="mt-1 flex h-7 w-7 shrink-0 items-center justify-center rounded-lg transition-all duration-300 group-hover:scale-110" style={{ backgroundColor: `${primaryColor}15` }}>
72
+ <div class="h-2 w-2 rounded-full" style={{ backgroundColor: primaryColor }} />
73
+ </div>
74
+ <p class="text-sm leading-relaxed text-slate-600">{challenge}</p>
75
+ </div>
76
+ ))}
77
+ </div>
78
+ </div>
79
+ </section>
80
+ )}
81
+
82
+ {/* ═══ Process — asymmetric timeline ═══ */}
83
+ {fields.process && Array.isArray(fields.process) && fields.process.length > 0 && (
84
+ <section class="relative overflow-hidden border-t border-gray-100 bg-slate-50 py-24">
85
+ <div class="mx-auto max-w-7xl px-6">
86
+ <div class="grid gap-16 lg:grid-cols-5">
87
+ {/* Left heading — sticky */}
88
+ <div class="lg:col-span-2">
89
+ <div class="lg:sticky lg:top-32">
90
+ <h2 class="reveal-heading text-3xl font-bold tracking-[-0.03em] sm:text-4xl">Our proven <em class="not-italic" style={{ background: `linear-gradient(135deg,${primaryColor},${primaryColor}99,#EF4444)`, WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent', backgroundClip: 'text' }}>approach</em></h2>
91
+ <p class="reveal-sub mt-4 text-base text-slate-500">A methodology refined across thousands of placements, from Fortune 500 to high-growth scaleups.</p>
92
+ <div class="reveal-sub mt-8 hidden h-1 w-16 rounded lg:block" style={{ backgroundColor: primaryColor, animationDelay: '0.35s' }} />
93
+ </div>
94
+ </div>
95
+
96
+ {/* Right steps — staggered */}
97
+ <div class="stagger-grid space-y-8 lg:col-span-3">
98
+ {fields.process.map((step: { title: string; description: string }, i: number) => (
99
+ <div class="group flex gap-6 rounded-2xl border border-gray-100 bg-white p-7 transition-all duration-400 hover:shadow-lg hover:shadow-slate-200/50">
100
+ <div class="flex h-12 w-12 shrink-0 items-center justify-center rounded-2xl text-base font-bold text-white transition-transform duration-300 group-hover:scale-110 group-hover:rotate-3" style={{ backgroundColor: primaryColor }}>
101
+ {String(i + 1).padStart(2, '0')}
102
+ </div>
103
+ <div>
104
+ <h3 class="text-lg font-semibold tracking-[-0.01em] text-slate-900">{step.title}</h3>
105
+ <p class="mt-2 text-sm leading-relaxed text-slate-500">{step.description}</p>
106
+ </div>
107
+ </div>
108
+ ))}
109
+ </div>
110
+ </div>
111
+ </div>
112
+ </section>
113
+ )}
114
+
115
+ {/* ═══ Capabilities — staggered bento ═══ */}
116
+ {fields.capabilities && Array.isArray(fields.capabilities) && fields.capabilities.length > 0 && (
117
+ <section class="relative overflow-hidden py-24">
118
+ <div class="mx-auto max-w-7xl px-6">
119
+ <div class="mb-16 max-w-2xl">
120
+ <h2 class="reveal-heading text-3xl font-bold tracking-[-0.03em] sm:text-4xl">What we <em class="not-italic" style={{ background: `linear-gradient(135deg,${primaryColor},${primaryColor}99,#EF4444)`, WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent', backgroundClip: 'text' }}>deliver</em></h2>
121
+ </div>
122
+ <div class="stagger-grid grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
123
+ {fields.capabilities.map((cap: string, idx: number) => {
124
+ const [title, ...rest] = cap.split(' — ');
125
+ const desc = rest.join(' — ');
126
+ return (
127
+ <div class={`group rounded-2xl border border-gray-100 bg-white p-7 transition-all duration-400 hover:border-amber-200 hover:shadow-xl hover:shadow-amber-500/5 ${idx === 0 || idx === 6 ? 'sm:col-span-2 lg:col-span-1' : ''}`}>
128
+ <div class="mb-4 h-1 w-8 rounded transition-all duration-400 group-hover:w-16" style={{ backgroundColor: primaryColor }} />
129
+ <h3 class="text-base font-semibold text-slate-900">{title}</h3>
130
+ {desc && <p class="mt-2 text-sm leading-relaxed text-slate-500">{desc}</p>}
131
+ </div>
132
+ );
133
+ })}
134
+ </div>
135
+ </div>
136
+ </section>
137
+ )}
138
+
139
+ {/* ═══ Technologies — pills with hover ═══ */}
140
+ {fields.technologies && Array.isArray(fields.technologies) && fields.technologies.length > 0 && (
141
+ <section class="relative overflow-hidden border-t border-gray-100 bg-slate-50 py-24">
142
+ <div class="mx-auto max-w-7xl px-6">
143
+ <div class="grid items-start gap-12 lg:grid-cols-5">
144
+ <div class="lg:col-span-2">
145
+ <h2 class="reveal-heading text-3xl font-bold tracking-[-0.03em] sm:text-4xl">Recruitment <em class="not-italic" style={{ background: `linear-gradient(135deg,${primaryColor},${primaryColor}99,#EF4444)`, WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent', backgroundClip: 'text' }}>tools</em></h2>
146
+ <p class="reveal-sub mt-4 text-base text-slate-500">Proven platforms and systems our recruiters use daily.</p>
147
+ </div>
148
+ <div class="flex flex-wrap gap-3 lg:col-span-3">
149
+ {fields.technologies.map((tech: { name: string; logo?: string }, idx: number) => (
150
+ <div
151
+ class="stagger-grid flex items-center gap-2.5 rounded-xl border border-gray-100 bg-white px-5 py-3.5 transition-all duration-300 hover:border-amber-200 hover:shadow-lg hover:shadow-amber-500/5"
152
+ style={{ animationDelay: `${0.05 * idx}s` }}
153
+ >
154
+ {tech.logo && (
155
+ <img src={tech.logo} alt={tech.name} class="h-6 w-6 object-contain" loading="lazy" />
156
+ )}
157
+ <span class="text-sm font-semibold text-slate-700">{tech.name}</span>
158
+ </div>
159
+ ))}
160
+ </div>
161
+ </div>
162
+ </div>
163
+ </section>
164
+ )}
165
+
166
+ {/* ═══ Related Case Studies ═══ */}
167
+ {fields.case_studies && Array.isArray(fields.case_studies) && fields.case_studies.length > 0 && (
168
+ <section class="py-24">
169
+ <div class="mx-auto max-w-7xl px-6">
170
+ <div class="mb-16 flex items-end justify-between">
171
+ <div class="max-w-2xl">
172
+ <h2 class="reveal-heading text-3xl font-bold tracking-[-0.03em] sm:text-4xl">Proven <em class="not-italic" style={{ background: `linear-gradient(135deg,${primaryColor},${primaryColor}99,#EF4444)`, WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent', backgroundClip: 'text' }}>results</em></h2>
173
+ <p class="reveal-sub mt-4 text-base text-slate-500">See how our staffing expertise translates to measurable hiring outcomes.</p>
174
+ </div>
175
+ <a href="/case-studies" class="reveal-sub hidden items-center gap-1 text-sm font-semibold transition-colors duration-200 hover:no-underline sm:flex" style={{ color: primaryColor }}>
176
+ All success stories <span>&rarr;</span>
177
+ </a>
178
+ </div>
179
+ <div class="stagger-grid grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
180
+ {fields.case_studies.map((cs: { title: string; result: string; url: string }) => (
181
+ <a href={cs.url} class="group 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">
182
+ <div class="mb-4 text-xs font-semibold uppercase tracking-widest text-slate-400">Success Story</div>
183
+ <h3 class="text-lg font-bold text-slate-900">{cs.title}</h3>
184
+ <div class="mt-3 text-2xl font-extrabold" style={{ color: primaryColor }}>{cs.result}</div>
185
+ <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 }}>
186
+ Read success story <span class="transition-transform duration-200 group-hover:translate-x-1">&rarr;</span>
187
+ </div>
188
+ </a>
189
+ ))}
190
+ </div>
191
+ </div>
192
+ </section>
193
+ )}
194
+
195
+ {/* ═══ Body (markdown) ═══ */}
196
+ {content.bodyHtml && (
197
+ <section class="py-20">
198
+ <div class="mx-auto max-w-3xl px-6">
199
+ <div class="prose prose-lg prose-slate max-w-none" dangerouslySetInnerHTML={{ __html: content.bodyHtml }} />
200
+ </div>
201
+ </section>
202
+ )}
203
+
204
+ {/* ═══ CTA — asymmetric ═══ */}
205
+ <section class="relative overflow-hidden py-24 text-white" style={{ backgroundColor: navColor }}>
206
+ <div class="grid-pattern pointer-events-none absolute inset-0" />
207
+ <div class="blob blob-sm" style={{ bottom: '-10%', right: '10%', background: `${primaryColor}10`, animationDelay: '-5s' }} />
208
+ <div class="pointer-events-none absolute inset-0" style={{ background: `radial-gradient(ellipse at 50% 50%, ${primaryColor}10 0%, transparent 60%)` }} />
209
+ <div class="relative mx-auto max-w-7xl px-6">
210
+ <div class="grid items-center gap-10 lg:grid-cols-5">
211
+ <div class="lg:col-span-3">
212
+ <h2 class="reveal-heading text-3xl font-bold tracking-[-0.03em] sm:text-4xl">Ready to build your team?</h2>
213
+ <p class="reveal-sub mt-4 max-w-lg text-lg text-gray-300/90" style={{ animationDelay: '0.2s' }}>
214
+ Get a free consultation. Our staffing specialists will map the optimal hiring strategy for your needs in a 30-minute call.
215
+ </p>
216
+ </div>
217
+ <div class="reveal-sub flex flex-col gap-4 lg:col-span-2" style={{ animationDelay: '0.35s' }}>
218
+ <a href="/contact" 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" style={{ backgroundColor: primaryColor }}>
219
+ Request Staffing Consultation
220
+ </a>
221
+ <a href="/case-studies" 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">
222
+ See Success Stories
223
+ </a>
224
+ </div>
225
+ </div>
226
+ </div>
227
+ <div class="glow-line absolute top-0 left-0 right-0" />
228
+ </section>
229
+
230
+ {props.children}
231
+ </Base>
232
+ );
233
+ };
234
+
235
+ export default Service;
@@ -0,0 +1,109 @@
1
+ /** @jsxImportSource hono/jsx */
2
+ import type { FC } from 'hono/jsx';
3
+ import type { SiteConfig, ThemeConfig } from '../_types.js';
4
+
5
+ interface FooterProps {
6
+ site: SiteConfig;
7
+ theme: ThemeConfig;
8
+ themeSettings: Record<string, any>;
9
+ }
10
+
11
+ const footerServices = [
12
+ { label: 'Cloud Infrastructure', href: '/services/cloud-infrastructure' },
13
+ { label: 'Data Engineering', href: '/services/data-engineering' },
14
+ { label: 'Custom Software', href: '/services/custom-software' },
15
+ { label: 'DevOps & SRE', href: '/services/devops-sre' },
16
+ { label: 'AI & Machine Learning', href: '/services/ai-ml' },
17
+ ];
18
+
19
+ const footerCompany = [
20
+ { label: 'About Us', href: '/about' },
21
+ { label: 'Leadership', href: '/about/leadership' },
22
+ { label: 'Careers', href: '/careers' },
23
+ { label: 'Partners', href: '/partners' },
24
+ { label: 'Contact', href: '/contact' },
25
+ ];
26
+
27
+ const footerResources = [
28
+ { label: 'Blog', href: '/articles' },
29
+ { label: 'Case Studies', href: '/case-studies' },
30
+ { label: 'Whitepapers', href: '/resources/whitepapers' },
31
+ { label: 'Documentation', href: '/docs' },
32
+ { label: 'Status Page', href: '/status' },
33
+ ];
34
+
35
+ const Footer: FC<FooterProps> = ({ site, themeSettings }) => {
36
+ const primaryColor = themeSettings.primary_color ?? '#F59E0B';
37
+ const navColor = themeSettings.nav_color ?? '#14101E';
38
+
39
+ return (
40
+ <footer style={{ backgroundColor: navColor }}>
41
+ <div class="h-1" style={{ backgroundColor: primaryColor }} />
42
+ <div class="mx-auto max-w-7xl px-6 py-16">
43
+ <div class="grid gap-12 sm:grid-cols-2 lg:grid-cols-4">
44
+ {/* Company info */}
45
+ <div>
46
+ <div class="mb-4 text-lg font-bold text-white">{site.site_name}</div>
47
+ <p class="mb-6 text-sm leading-relaxed text-gray-400">
48
+ {themeSettings.footer_text ?? 'Engineering technology that moves enterprises forward.'}
49
+ </p>
50
+ <div class="flex gap-4 text-sm text-gray-400">
51
+ <a href="#" class="transition-colors hover:text-white hover:no-underline">LinkedIn</a>
52
+ <a href="#" class="transition-colors hover:text-white hover:no-underline">X</a>
53
+ <a href="#" class="transition-colors hover:text-white hover:no-underline">GitHub</a>
54
+ </div>
55
+ </div>
56
+
57
+ {/* Services */}
58
+ <div>
59
+ <h4 class="mb-4 text-sm font-semibold uppercase tracking-wider text-white">Services</h4>
60
+ <ul class="space-y-3">
61
+ {footerServices.map((link) => (
62
+ <li>
63
+ <a href={link.href} class="text-sm text-gray-400 transition-colors hover:text-white hover:no-underline">
64
+ {link.label}
65
+ </a>
66
+ </li>
67
+ ))}
68
+ </ul>
69
+ </div>
70
+
71
+ {/* Company */}
72
+ <div>
73
+ <h4 class="mb-4 text-sm font-semibold uppercase tracking-wider text-white">Company</h4>
74
+ <ul class="space-y-3">
75
+ {footerCompany.map((link) => (
76
+ <li>
77
+ <a href={link.href} class="text-sm text-gray-400 transition-colors hover:text-white hover:no-underline">
78
+ {link.label}
79
+ </a>
80
+ </li>
81
+ ))}
82
+ </ul>
83
+ </div>
84
+
85
+ {/* Resources */}
86
+ <div>
87
+ <h4 class="mb-4 text-sm font-semibold uppercase tracking-wider text-white">Resources</h4>
88
+ <ul class="space-y-3">
89
+ {footerResources.map((link) => (
90
+ <li>
91
+ <a href={link.href} class="text-sm text-gray-400 transition-colors hover:text-white hover:no-underline">
92
+ {link.label}
93
+ </a>
94
+ </li>
95
+ ))}
96
+ </ul>
97
+ </div>
98
+ </div>
99
+
100
+ {/* Bottom bar */}
101
+ <div class="mt-12 border-t border-gray-800 pt-8 text-center text-xs text-gray-500">
102
+ <p>&copy; {new Date().getFullYear()} {site.site_name}. All rights reserved.</p>
103
+ </div>
104
+ </div>
105
+ </footer>
106
+ );
107
+ };
108
+
109
+ export default Footer;