kofi-stack-template-generator 2.1.36 → 2.1.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/.turbo/turbo-build.log +6 -6
  2. package/dist/index.js +8059 -441
  3. package/package.json +1 -1
  4. package/src/templates.generated.ts +250 -95
  5. package/templates/integrations/posthog/src/components/providers/posthog-provider.tsx.hbs +4 -1
  6. package/templates/marketing/payload/package.json.hbs +41 -26
  7. package/templates/marketing/payload/src/Footer/Component.client.tsx +288 -0
  8. package/templates/marketing/payload/src/Footer/Component.tsx +11 -0
  9. package/templates/marketing/payload/src/Footer/RowLabel.tsx +15 -0
  10. package/templates/marketing/payload/src/Footer/config.ts +178 -0
  11. package/templates/marketing/payload/src/Footer/hooks/{revalidateFooter.ts.hbs → revalidateFooter.ts} +5 -5
  12. package/templates/marketing/payload/src/Header/Component.client.tsx +94 -0
  13. package/templates/marketing/payload/src/Header/Component.tsx +10 -0
  14. package/templates/marketing/payload/src/Header/MegaMenu/index.tsx +197 -0
  15. package/templates/marketing/payload/src/Header/MobileMenu/HamburgerIcon.tsx +48 -0
  16. package/templates/marketing/payload/src/Header/MobileMenu/index.tsx +299 -0
  17. package/templates/marketing/payload/src/Header/Nav/index.tsx +76 -0
  18. package/templates/marketing/payload/src/Header/RowLabel.tsx +21 -0
  19. package/templates/marketing/payload/src/Header/config.ts +208 -0
  20. package/templates/marketing/payload/src/Header/hooks/{revalidateHeader.ts.hbs → revalidateHeader.ts} +5 -5
  21. package/templates/marketing/payload/src/access/{authenticated.ts.hbs → authenticated.ts} +1 -1
  22. package/templates/marketing/payload/src/access/{authenticatedOrPublished.ts.hbs → authenticatedOrPublished.ts} +8 -8
  23. package/templates/marketing/payload/src/app/(docs)/docs/[[...slug]]/page.tsx +117 -0
  24. package/templates/marketing/payload/src/app/(docs)/docs/layout.tsx +39 -0
  25. package/templates/marketing/payload/src/app/(docs)/layout.tsx +44 -0
  26. package/templates/marketing/payload/src/app/(frontend)/(sitemaps)/pages-sitemap.xml/route.ts +68 -0
  27. package/templates/marketing/payload/src/app/(frontend)/(sitemaps)/posts-sitemap.xml/route.ts +55 -0
  28. package/templates/marketing/payload/src/app/(frontend)/[slug]/page.client.tsx +15 -0
  29. package/templates/marketing/payload/src/app/(frontend)/[slug]/page.tsx +114 -0
  30. package/templates/marketing/payload/src/app/(frontend)/api/docs-search/route.ts +67 -0
  31. package/templates/marketing/payload/src/app/(frontend)/api/newsletter/route.ts +260 -0
  32. package/templates/marketing/payload/src/app/(frontend)/api/pricing/route.ts +266 -0
  33. package/templates/marketing/payload/src/app/(frontend)/globals.css +1019 -0
  34. package/templates/marketing/payload/src/app/(frontend)/layout.tsx +114 -0
  35. package/templates/marketing/payload/src/app/(frontend)/next/exit-preview/route.ts +7 -0
  36. package/templates/marketing/payload/src/app/(frontend)/next/preview/route.ts +56 -0
  37. package/templates/marketing/payload/src/app/(frontend)/next/seed/route.ts +31 -0
  38. package/templates/marketing/payload/src/app/(frontend)/not-found.tsx +17 -0
  39. package/templates/marketing/payload/src/app/(frontend)/page.tsx +5 -0
  40. package/templates/marketing/payload/src/app/(frontend)/posts/BlogPageClient.tsx +190 -0
  41. package/templates/marketing/payload/src/app/(frontend)/posts/[slug]/BlogPostContent.tsx +67 -0
  42. package/templates/marketing/payload/src/app/(frontend)/posts/[slug]/page.client.tsx +15 -0
  43. package/templates/marketing/payload/src/app/(frontend)/posts/[slug]/page.tsx +118 -0
  44. package/templates/marketing/payload/src/app/(frontend)/posts/page/[pageNumber]/page.client.tsx +15 -0
  45. package/templates/marketing/payload/src/app/(frontend)/posts/page/[pageNumber]/page.tsx +87 -0
  46. package/templates/marketing/payload/src/app/(frontend)/posts/page.tsx +49 -0
  47. package/templates/marketing/payload/src/app/(frontend)/search/page.client.tsx +15 -0
  48. package/templates/marketing/payload/src/app/(frontend)/search/page.tsx +87 -0
  49. package/templates/marketing/payload/src/app/(payload)/admin/[[...segments]]/not-found.tsx +24 -0
  50. package/templates/marketing/payload/src/app/(payload)/admin/[[...segments]]/page.tsx +24 -0
  51. package/templates/marketing/payload/src/app/(payload)/admin/importMap.js +83 -0
  52. package/templates/marketing/payload/src/app/(payload)/api/[...slug]/{route.ts.hbs → route.ts} +13 -9
  53. package/templates/marketing/payload/src/app/(payload)/api/graphql/{route.ts.hbs → route.ts} +2 -2
  54. package/templates/marketing/payload/src/app/(payload)/api/graphql-playground/{route.ts.hbs → route.ts} +3 -3
  55. package/templates/marketing/payload/src/app/(payload)/custom.scss +0 -0
  56. package/templates/marketing/payload/src/app/(payload)/layout.tsx +31 -0
  57. package/templates/marketing/payload/src/blocks/ArchiveBlock/Component.tsx +65 -0
  58. package/templates/marketing/payload/src/blocks/ArchiveBlock/config.ts +120 -0
  59. package/templates/marketing/payload/src/blocks/Banner/Component.tsx +26 -0
  60. package/templates/marketing/payload/src/blocks/Banner/config.ts +67 -0
  61. package/templates/marketing/payload/src/blocks/BentoFeatures/Component.tsx +243 -0
  62. package/templates/marketing/payload/src/blocks/BentoFeatures/config.ts +147 -0
  63. package/templates/marketing/payload/src/blocks/CallToAction/Component.tsx +31 -0
  64. package/templates/marketing/payload/src/blocks/CallToAction/config.ts +68 -0
  65. package/templates/marketing/payload/src/blocks/Code/Component.client.tsx +33 -0
  66. package/templates/marketing/payload/src/blocks/Code/Component.tsx +21 -0
  67. package/templates/marketing/payload/src/blocks/Code/CopyButton.tsx +33 -0
  68. package/templates/marketing/payload/src/blocks/Code/config.ts +33 -0
  69. package/templates/marketing/payload/src/blocks/Content/Component.tsx +41 -0
  70. package/templates/marketing/payload/src/blocks/Content/config.ts +105 -0
  71. package/templates/marketing/payload/src/blocks/FAQAccordion/Component.tsx +90 -0
  72. package/templates/marketing/payload/src/blocks/FAQAccordion/config.ts +75 -0
  73. package/templates/marketing/payload/src/blocks/FeatureGrid/Component.tsx +108 -0
  74. package/templates/marketing/payload/src/blocks/FeatureGrid/config.ts +109 -0
  75. package/templates/marketing/payload/src/blocks/FeatureShowcase/Component.tsx +107 -0
  76. package/templates/marketing/payload/src/blocks/FeatureShowcase/config.ts +111 -0
  77. package/templates/marketing/payload/src/blocks/FinalCTA/Component.tsx +117 -0
  78. package/templates/marketing/payload/src/blocks/FinalCTA/config.ts +50 -0
  79. package/templates/marketing/payload/src/blocks/Form/Checkbox/index.tsx +45 -0
  80. package/templates/marketing/payload/src/blocks/Form/Component.tsx +170 -0
  81. package/templates/marketing/payload/src/blocks/Form/Country/index.tsx +65 -0
  82. package/templates/marketing/payload/src/blocks/Form/Country/options.ts +982 -0
  83. package/templates/marketing/payload/src/blocks/Form/Email/index.tsx +38 -0
  84. package/templates/marketing/payload/src/blocks/Form/Error/index.tsx +13 -0
  85. package/templates/marketing/payload/src/blocks/Form/Message/index.tsx +13 -0
  86. package/templates/marketing/payload/src/blocks/Form/Number/index.tsx +36 -0
  87. package/templates/marketing/payload/src/blocks/Form/Select/index.tsx +63 -0
  88. package/templates/marketing/payload/src/blocks/Form/State/index.tsx +64 -0
  89. package/templates/marketing/payload/src/blocks/Form/State/options.ts +52 -0
  90. package/templates/marketing/payload/src/blocks/Form/Text/index.tsx +32 -0
  91. package/templates/marketing/payload/src/blocks/Form/Textarea/index.tsx +40 -0
  92. package/templates/marketing/payload/src/blocks/Form/Width/index.tsx +13 -0
  93. package/templates/marketing/payload/src/blocks/Form/config.ts +77 -0
  94. package/templates/marketing/payload/src/blocks/Form/fields.tsx +21 -0
  95. package/templates/marketing/payload/src/blocks/HowItWorks/Component.tsx +59 -0
  96. package/templates/marketing/payload/src/blocks/HowItWorks/config.ts +88 -0
  97. package/templates/marketing/payload/src/blocks/IndustryTabs/Component.tsx +132 -0
  98. package/templates/marketing/payload/src/blocks/IndustryTabs/config.ts +77 -0
  99. package/templates/marketing/payload/src/blocks/LogoBanner/Component.tsx +95 -0
  100. package/templates/marketing/payload/src/blocks/LogoBanner/config.ts +48 -0
  101. package/templates/marketing/payload/src/blocks/MediaBlock/Component.tsx +67 -0
  102. package/templates/marketing/payload/src/blocks/MediaBlock/config.ts +14 -0
  103. package/templates/marketing/payload/src/blocks/Personas/Component.tsx +69 -0
  104. package/templates/marketing/payload/src/blocks/Personas/config.ts +96 -0
  105. package/templates/marketing/payload/src/blocks/PricingTable/ComparisonTable.tsx +250 -0
  106. package/templates/marketing/payload/src/blocks/PricingTable/Component.tsx +443 -0
  107. package/templates/marketing/payload/src/blocks/PricingTable/config.ts +142 -0
  108. package/templates/marketing/payload/src/blocks/ProofBanner/Component.tsx +65 -0
  109. package/templates/marketing/payload/src/blocks/ProofBanner/config.ts +42 -0
  110. package/templates/marketing/payload/src/blocks/RelatedPosts/Component.tsx +32 -0
  111. package/templates/marketing/payload/src/blocks/RenderBlocks.tsx +92 -0
  112. package/templates/marketing/payload/src/blocks/TestimonialsGrid/Component.tsx +107 -0
  113. package/templates/marketing/payload/src/blocks/TestimonialsGrid/config.ts +76 -0
  114. package/templates/marketing/payload/src/blocks/TrustColumns/Component.tsx +83 -0
  115. package/templates/marketing/payload/src/blocks/TrustColumns/config.ts +70 -0
  116. package/templates/marketing/payload/src/collections/Categories.ts +28 -0
  117. package/templates/marketing/payload/src/collections/FAQs/index.ts +100 -0
  118. package/templates/marketing/payload/src/collections/Media.ts +160 -0
  119. package/templates/marketing/payload/src/collections/Pages/hooks/revalidatePage.ts +43 -0
  120. package/templates/marketing/payload/src/collections/Pages/index.ts +168 -0
  121. package/templates/marketing/payload/src/collections/Posts/hooks/populateAuthors.ts +41 -0
  122. package/templates/marketing/payload/src/collections/Posts/hooks/revalidatePost.ts +44 -0
  123. package/templates/marketing/payload/src/collections/Posts/index.ts +259 -0
  124. package/templates/marketing/payload/src/collections/Users/index.ts +26 -0
  125. package/templates/marketing/payload/src/components/AdminBar/index.scss +7 -0
  126. package/templates/marketing/payload/src/components/AdminBar/index.tsx +89 -0
  127. package/templates/marketing/payload/src/components/Analytics/CTATracker.tsx +33 -0
  128. package/templates/marketing/payload/src/components/Analytics/FeatureSectionTracker.tsx +47 -0
  129. package/templates/marketing/payload/src/components/Analytics/PricingViewTracker.tsx +46 -0
  130. package/templates/marketing/payload/src/components/Analytics/index.tsx +3 -0
  131. package/templates/marketing/payload/src/components/BeforeDashboard/SeedButton/index.tsx +89 -0
  132. package/templates/marketing/payload/src/components/BeforeDashboard/index.tsx +69 -0
  133. package/templates/marketing/payload/src/components/BeforeLogin/index.tsx +14 -0
  134. package/templates/marketing/payload/src/components/BlogCTA/index.tsx +77 -0
  135. package/templates/marketing/payload/src/components/Card/index.tsx +85 -0
  136. package/templates/marketing/payload/src/components/CollectionArchive/index.tsx +32 -0
  137. package/templates/marketing/payload/src/components/JsonLd/index.tsx +138 -0
  138. package/templates/marketing/payload/src/components/Link/index.tsx +66 -0
  139. package/templates/marketing/payload/src/components/LivePreviewListener/index.tsx +10 -0
  140. package/templates/marketing/payload/src/components/Logo/Logo.tsx +46 -0
  141. package/templates/marketing/payload/src/components/Media/ImageMedia/index.tsx +80 -0
  142. package/templates/marketing/payload/src/components/Media/VideoMedia/index.tsx +47 -0
  143. package/templates/marketing/payload/src/components/Media/index.tsx +26 -0
  144. package/templates/marketing/payload/src/components/Media/types.ts +22 -0
  145. package/templates/marketing/payload/src/components/PageRange/index.tsx +57 -0
  146. package/templates/marketing/payload/src/components/Pagination/index.tsx +101 -0
  147. package/templates/marketing/payload/src/components/PayloadRedirects/index.tsx +48 -0
  148. package/templates/marketing/payload/src/components/RichText/index.tsx +152 -0
  149. package/templates/marketing/payload/src/components/TableOfContents/index.tsx +128 -0
  150. package/templates/marketing/payload/src/components/ui/accordion.tsx +64 -0
  151. package/templates/marketing/payload/src/components/ui/button.tsx +52 -0
  152. package/templates/marketing/payload/src/components/ui/card.tsx +48 -0
  153. package/templates/marketing/payload/src/components/ui/checkbox.tsx +27 -0
  154. package/templates/marketing/payload/src/components/ui/input.tsx +22 -0
  155. package/templates/marketing/payload/src/components/ui/label.tsx +19 -0
  156. package/templates/marketing/payload/src/components/ui/pagination.tsx +92 -0
  157. package/templates/marketing/payload/src/components/ui/select.tsx +144 -0
  158. package/templates/marketing/payload/src/components/ui/textarea.tsx +21 -0
  159. package/templates/marketing/payload/src/endpoints/seed/contact-form.ts +111 -0
  160. package/templates/marketing/payload/src/endpoints/seed/contact-page.ts +56 -0
  161. package/templates/marketing/payload/src/endpoints/seed/directoryhub/about.ts +281 -0
  162. package/templates/marketing/payload/src/endpoints/seed/directoryhub/faqs.ts +224 -0
  163. package/templates/marketing/payload/src/endpoints/seed/directoryhub/features/automation.ts +229 -0
  164. package/templates/marketing/payload/src/endpoints/seed/directoryhub/features/custom-fields.ts +229 -0
  165. package/templates/marketing/payload/src/endpoints/seed/directoryhub/features/dashboard.ts +228 -0
  166. package/templates/marketing/payload/src/endpoints/seed/directoryhub/features/index.ts +6 -0
  167. package/templates/marketing/payload/src/endpoints/seed/directoryhub/features/monetization.ts +230 -0
  168. package/templates/marketing/payload/src/endpoints/seed/directoryhub/features/seo.ts +229 -0
  169. package/templates/marketing/payload/src/endpoints/seed/directoryhub/features/templates.ts +218 -0
  170. package/templates/marketing/payload/src/endpoints/seed/directoryhub/home.ts +555 -0
  171. package/templates/marketing/payload/src/endpoints/seed/directoryhub/index.ts +767 -0
  172. package/templates/marketing/payload/src/endpoints/seed/directoryhub/posts.ts +623 -0
  173. package/templates/marketing/payload/src/endpoints/seed/directoryhub/pricing.ts +251 -0
  174. package/templates/marketing/payload/src/endpoints/seed/directoryhub/privacy.ts +457 -0
  175. package/templates/marketing/payload/src/endpoints/seed/directoryhub/richtext-helper.ts +88 -0
  176. package/templates/marketing/payload/src/endpoints/seed/directoryhub/terms.ts +478 -0
  177. package/templates/marketing/payload/src/endpoints/seed/directoryhub/use-cases/b2b-vendor-hubs.ts +229 -0
  178. package/templates/marketing/payload/src/endpoints/seed/directoryhub/use-cases/communities.ts +230 -0
  179. package/templates/marketing/payload/src/endpoints/seed/directoryhub/use-cases/index.ts +4 -0
  180. package/templates/marketing/payload/src/endpoints/seed/directoryhub/use-cases/local-services.ts +230 -0
  181. package/templates/marketing/payload/src/endpoints/seed/directoryhub/use-cases/marketplaces.ts +230 -0
  182. package/templates/marketing/payload/src/endpoints/seed/home-static.ts +691 -0
  183. package/templates/marketing/payload/src/endpoints/seed/home.ts +675 -0
  184. package/templates/marketing/payload/src/endpoints/seed/image-1.ts +67 -0
  185. package/templates/marketing/payload/src/endpoints/seed/image-2.ts +67 -0
  186. package/templates/marketing/payload/src/endpoints/seed/image-3.ts +67 -0
  187. package/templates/marketing/payload/src/endpoints/seed/image-hero-1.ts +5 -0
  188. package/templates/marketing/payload/src/endpoints/seed/image-hero1.webp +0 -0
  189. package/templates/marketing/payload/src/endpoints/seed/image-post1.webp +0 -0
  190. package/templates/marketing/payload/src/endpoints/seed/image-post2.webp +0 -0
  191. package/templates/marketing/payload/src/endpoints/seed/image-post3.webp +0 -0
  192. package/templates/marketing/payload/src/endpoints/seed/index.ts +335 -0
  193. package/templates/marketing/payload/src/endpoints/seed/post-1.ts +315 -0
  194. package/templates/marketing/payload/src/endpoints/seed/post-2.ts +232 -0
  195. package/templates/marketing/payload/src/endpoints/seed/post-3.ts +268 -0
  196. package/templates/marketing/payload/src/fields/defaultLexical.ts +73 -0
  197. package/templates/marketing/payload/src/fields/link.ts +139 -0
  198. package/templates/marketing/payload/src/fields/linkGroup.ts +28 -0
  199. package/templates/marketing/payload/src/heros/HighImpact/index.tsx +56 -0
  200. package/templates/marketing/payload/src/heros/LowImpact/index.tsx +48 -0
  201. package/templates/marketing/payload/src/heros/MediumImpact/index.tsx +50 -0
  202. package/templates/marketing/payload/src/heros/PostHero/index.tsx +73 -0
  203. package/templates/marketing/payload/src/heros/ProductShowcase/AnimatedMockup.tsx +241 -0
  204. package/templates/marketing/payload/src/heros/ProductShowcase/index.tsx +108 -0
  205. package/templates/marketing/payload/src/heros/{RenderHero.tsx.hbs → RenderHero.tsx} +9 -9
  206. package/templates/marketing/payload/src/heros/config.ts +121 -0
  207. package/templates/marketing/payload/src/hooks/populatePublishedAt.ts +15 -0
  208. package/templates/marketing/payload/src/hooks/{revalidateRedirects.ts.hbs → revalidateRedirects.ts} +3 -3
  209. package/templates/marketing/payload/src/lib/convex.ts +13 -0
  210. package/templates/marketing/payload/src/lib/docs-source.ts +138 -0
  211. package/templates/marketing/payload/src/lib/mdx.tsx +191 -0
  212. package/templates/marketing/payload/src/payload.config.ts.hbs +95 -145
  213. package/templates/marketing/payload/src/plugins/index.ts +107 -0
  214. package/templates/marketing/payload/src/providers/HeaderTheme/index.tsx +34 -0
  215. package/templates/marketing/payload/src/providers/PostHogProvider.tsx +33 -0
  216. package/templates/marketing/payload/src/providers/Theme/InitTheme/{index.tsx.hbs → index.tsx} +11 -10
  217. package/templates/marketing/payload/src/providers/Theme/ThemeSelector/index.tsx +133 -0
  218. package/templates/marketing/payload/src/providers/Theme/ThemeSelector/types.ts +7 -0
  219. package/templates/marketing/payload/src/providers/Theme/index.tsx +60 -0
  220. package/templates/marketing/payload/src/providers/Theme/shared.ts +17 -0
  221. package/templates/marketing/payload/src/providers/Theme/{types.ts.hbs → types.ts} +3 -3
  222. package/templates/marketing/payload/src/providers/index.tsx +17 -0
  223. package/templates/marketing/payload/src/search/Component.tsx +42 -0
  224. package/templates/marketing/payload/src/search/beforeSync.ts +56 -0
  225. package/templates/marketing/payload/src/search/fieldOverrides.ts +61 -0
  226. package/templates/marketing/payload/src/utilities/deepMerge.ts +35 -0
  227. package/templates/marketing/payload/src/utilities/extractHeadings.ts +78 -0
  228. package/templates/marketing/payload/src/utilities/formatAuthors.ts +24 -0
  229. package/templates/marketing/payload/src/utilities/formatDateTime.ts +20 -0
  230. package/templates/marketing/payload/src/utilities/generateMeta.ts +93 -0
  231. package/templates/marketing/payload/src/utilities/generatePreviewPath.ts +33 -0
  232. package/templates/marketing/payload/src/utilities/getDocument.ts +32 -0
  233. package/templates/marketing/payload/src/utilities/getGlobals.ts +26 -0
  234. package/templates/marketing/payload/src/utilities/getMeUser.ts +43 -0
  235. package/templates/marketing/payload/src/utilities/getMediaUrl.ts +24 -0
  236. package/templates/marketing/payload/src/utilities/getRedirects.ts +26 -0
  237. package/templates/marketing/payload/src/utilities/getURL.ts +26 -0
  238. package/templates/marketing/payload/src/utilities/mergeOpenGraph.ts +26 -0
  239. package/templates/marketing/payload/src/utilities/toKebabCase.ts +5 -0
  240. package/templates/marketing/payload/src/utilities/ui.ts +12 -0
  241. package/templates/marketing/payload/src/utilities/useClickableCard.ts +108 -0
  242. package/templates/marketing/payload/src/utilities/useDebounce.ts +17 -0
  243. package/templates/packages/ui/package.json.hbs +4 -0
  244. package/templates/packages/ui/src/components/button.tsx.hbs +53 -0
  245. package/templates/packages/ui/src/components/card.tsx.hbs +76 -0
  246. package/templates/packages/ui/src/components/separator.tsx.hbs +26 -0
  247. package/templates/{marketing/payload/src/app/globals.css.hbs → packages/ui/src/styles.css.hbs} +39 -1
  248. package/templates/marketing/payload/src/Footer/config.ts.hbs +0 -178
  249. package/templates/marketing/payload/src/Footer/index.ts.hbs +0 -1
  250. package/templates/marketing/payload/src/Header/RowLabel.tsx.hbs +0 -21
  251. package/templates/marketing/payload/src/Header/config.ts.hbs +0 -208
  252. package/templates/marketing/payload/src/Header/index.ts.hbs +0 -1
  253. package/templates/marketing/payload/src/access/index.ts.hbs +0 -3
  254. package/templates/marketing/payload/src/app/(frontend)/layout.tsx.hbs +0 -19
  255. package/templates/marketing/payload/src/app/(frontend)/next/seed/route.ts.hbs +0 -31
  256. package/templates/marketing/payload/src/app/(frontend)/page.tsx.hbs +0 -83
  257. package/templates/marketing/payload/src/app/(payload)/admin/[[...segments]]/not-found.tsx.hbs +0 -24
  258. package/templates/marketing/payload/src/app/(payload)/admin/[[...segments]]/page.tsx.hbs +0 -24
  259. package/templates/marketing/payload/src/app/(payload)/admin/importMap.js.hbs +0 -1
  260. package/templates/marketing/payload/src/app/(payload)/custom.scss.hbs +0 -1
  261. package/templates/marketing/payload/src/app/(payload)/layout.tsx.hbs +0 -31
  262. package/templates/marketing/payload/src/app/layout.tsx.hbs +0 -10
  263. package/templates/marketing/payload/src/blocks/Benefits.ts.hbs +0 -34
  264. package/templates/marketing/payload/src/blocks/CTA.ts.hbs +0 -39
  265. package/templates/marketing/payload/src/blocks/Content.ts.hbs +0 -9
  266. package/templates/marketing/payload/src/blocks/FAQ.ts.hbs +0 -18
  267. package/templates/marketing/payload/src/blocks/Features.ts.hbs +0 -32
  268. package/templates/marketing/payload/src/blocks/Hero.ts.hbs +0 -40
  269. package/templates/marketing/payload/src/blocks/LogoBanner.ts.hbs +0 -17
  270. package/templates/marketing/payload/src/blocks/Pricing.ts.hbs +0 -37
  271. package/templates/marketing/payload/src/blocks/Testimonials.ts.hbs +0 -21
  272. package/templates/marketing/payload/src/blocks/index.ts.hbs +0 -9
  273. package/templates/marketing/payload/src/collections/Categories/index.ts.hbs +0 -28
  274. package/templates/marketing/payload/src/collections/FAQs/index.ts.hbs +0 -100
  275. package/templates/marketing/payload/src/collections/Media.ts.hbs +0 -164
  276. package/templates/marketing/payload/src/collections/Pages/hooks/revalidatePage.ts.hbs +0 -43
  277. package/templates/marketing/payload/src/collections/Pages/index.ts.hbs +0 -142
  278. package/templates/marketing/payload/src/collections/Posts/hooks/populateAuthors.ts.hbs +0 -41
  279. package/templates/marketing/payload/src/collections/Posts/hooks/revalidatePost.ts.hbs +0 -44
  280. package/templates/marketing/payload/src/collections/Posts/index.ts.hbs +0 -244
  281. package/templates/marketing/payload/src/collections/Users/index.ts.hbs +0 -26
  282. package/templates/marketing/payload/src/collections/index.ts.hbs +0 -6
  283. package/templates/marketing/payload/src/components/BeforeDashboard/SeedButton/index.tsx.hbs +0 -89
  284. package/templates/marketing/payload/src/components/BeforeDashboard/index.tsx.hbs +0 -69
  285. package/templates/marketing/payload/src/components/BeforeLogin/index.tsx.hbs +0 -14
  286. package/templates/marketing/payload/src/components/Link/index.tsx.hbs +0 -79
  287. package/templates/marketing/payload/src/components/Media/index.tsx.hbs +0 -67
  288. package/templates/marketing/payload/src/components/RichText/index.tsx.hbs +0 -44
  289. package/templates/marketing/payload/src/endpoints/seed/home.ts.hbs +0 -76
  290. package/templates/marketing/payload/src/endpoints/seed/image-1.ts.hbs +0 -5
  291. package/templates/marketing/payload/src/endpoints/seed/image-2.ts.hbs +0 -5
  292. package/templates/marketing/payload/src/endpoints/seed/image-hero.ts.hbs +0 -5
  293. package/templates/marketing/payload/src/endpoints/seed/index.ts.hbs +0 -235
  294. package/templates/marketing/payload/src/endpoints/seed/post-1.ts.hbs +0 -252
  295. package/templates/marketing/payload/src/fields/defaultLexical.ts.hbs +0 -73
  296. package/templates/marketing/payload/src/fields/link.ts.hbs +0 -139
  297. package/templates/marketing/payload/src/fields/linkGroup.ts.hbs +0 -28
  298. package/templates/marketing/payload/src/globals/index.ts.hbs +0 -2
  299. package/templates/marketing/payload/src/heros/HighImpact/index.tsx.hbs +0 -53
  300. package/templates/marketing/payload/src/heros/LowImpact/index.tsx.hbs +0 -48
  301. package/templates/marketing/payload/src/heros/MediumImpact/index.tsx.hbs +0 -46
  302. package/templates/marketing/payload/src/heros/PostHero/index.tsx.hbs +0 -68
  303. package/templates/marketing/payload/src/heros/ProductShowcase/index.tsx.hbs +0 -88
  304. package/templates/marketing/payload/src/heros/config.ts.hbs +0 -112
  305. package/templates/marketing/payload/src/heros/index.ts.hbs +0 -7
  306. package/templates/marketing/payload/src/hooks/index.ts.hbs +0 -2
  307. package/templates/marketing/payload/src/hooks/populatePublishedAt.ts.hbs +0 -15
  308. package/templates/marketing/payload/src/providers/HeaderTheme/index.tsx.hbs +0 -34
  309. package/templates/marketing/payload/src/providers/Theme/index.tsx.hbs +0 -60
  310. package/templates/marketing/payload/src/providers/Theme/shared.ts.hbs +0 -17
  311. package/templates/marketing/payload/src/providers/index.tsx.hbs +0 -18
  312. package/templates/marketing/payload/src/utilities/deepMerge.ts.hbs +0 -35
  313. package/templates/marketing/payload/src/utilities/formatAuthors.ts.hbs +0 -24
  314. package/templates/marketing/payload/src/utilities/formatDateTime.ts.hbs +0 -13
  315. package/templates/marketing/payload/src/utilities/generateMeta.ts.hbs +0 -87
  316. package/templates/marketing/payload/src/utilities/generatePreviewPath.ts.hbs +0 -33
  317. package/templates/marketing/payload/src/utilities/getURL.ts.hbs +0 -26
  318. package/templates/marketing/payload/src/utilities/index.ts.hbs +0 -8
  319. package/templates/marketing/payload/src/utilities/mergeOpenGraph.ts.hbs +0 -26
  320. /package/templates/marketing/payload/src/access/{anyone.ts.hbs → anyone.ts} +0 -0
  321. /package/templates/marketing/payload/src/components/BeforeDashboard/SeedButton/{index.scss.hbs → index.scss} +0 -0
  322. /package/templates/marketing/payload/src/components/BeforeDashboard/{index.scss.hbs → index.scss} +0 -0
  323. /package/templates/marketing/payload/src/fields/{index.ts.hbs → index.ts} +0 -0
  324. /package/templates/marketing/payload/src/utilities/{canUseDOM.ts.hbs → canUseDOM.ts} +0 -0
@@ -0,0 +1,268 @@
1
+ import type { RequiredDataFromCollectionSlug } from "payload"
2
+ import type { PostArgs } from "./post-1"
3
+
4
+ export const post3: (args: PostArgs) => RequiredDataFromCollectionSlug<"posts"> = ({
5
+ heroImage,
6
+ blockImage,
7
+ author,
8
+ }) => {
9
+ return {
10
+ slug: "dollar-and-sense-the-financial-forecast",
11
+ _status: "published",
12
+ authors: [author],
13
+ content: {
14
+ root: {
15
+ type: "root",
16
+ children: [
17
+ {
18
+ type: "block",
19
+ fields: {
20
+ blockName: "Disclaimer",
21
+ blockType: "banner",
22
+ content: {
23
+ root: {
24
+ type: "root",
25
+ children: [
26
+ {
27
+ type: "paragraph",
28
+ children: [
29
+ {
30
+ type: "text",
31
+ detail: 0,
32
+ format: 1,
33
+ mode: "normal",
34
+ style: "",
35
+ text: "Disclaimer: ",
36
+ version: 1,
37
+ },
38
+ {
39
+ type: "text",
40
+ detail: 0,
41
+ format: 0,
42
+ mode: "normal",
43
+ style: "",
44
+ text: "This content is fabricated and for demonstration purposes only. To edit this post, ",
45
+ version: 1,
46
+ },
47
+ {
48
+ type: "link",
49
+ children: [
50
+ {
51
+ type: "text",
52
+ detail: 0,
53
+ format: 0,
54
+ mode: "normal",
55
+ style: "",
56
+ text: "navigate to the admin dashboard.",
57
+ version: 1,
58
+ },
59
+ ],
60
+ direction: "ltr",
61
+ fields: {
62
+ linkType: "custom",
63
+ newTab: true,
64
+ url: "/admin",
65
+ },
66
+ format: "",
67
+ indent: 0,
68
+ version: 3,
69
+ },
70
+ ],
71
+ direction: "ltr",
72
+ format: "",
73
+ indent: 0,
74
+ textFormat: 1,
75
+ version: 1,
76
+ },
77
+ ],
78
+ direction: "ltr",
79
+ format: "",
80
+ indent: 0,
81
+ version: 1,
82
+ },
83
+ },
84
+ style: "info",
85
+ },
86
+ format: "",
87
+ version: 2,
88
+ },
89
+ {
90
+ type: "heading",
91
+ children: [
92
+ {
93
+ type: "text",
94
+ detail: 0,
95
+ format: 0,
96
+ mode: "normal",
97
+ style: "",
98
+ text: "Money isn't just currency; ",
99
+ version: 1,
100
+ },
101
+ {
102
+ type: "text",
103
+ detail: 0,
104
+ format: 2,
105
+ mode: "normal",
106
+ style: "",
107
+ text: "it's a language. ",
108
+ version: 1,
109
+ },
110
+ {
111
+ type: "text",
112
+ detail: 0,
113
+ format: 0,
114
+ mode: "normal",
115
+ style: "",
116
+ text: "Dive deep into its nuances, where strategy meets intuition in the vast sea of finance.",
117
+ version: 1,
118
+ },
119
+ ],
120
+ direction: "ltr",
121
+ format: "",
122
+ indent: 0,
123
+ tag: "h2",
124
+ version: 1,
125
+ },
126
+ {
127
+ type: "paragraph",
128
+ children: [
129
+ {
130
+ type: "text",
131
+ detail: 0,
132
+ format: 0,
133
+ mode: "normal",
134
+ style: "",
135
+ text: "Money, in its essence, transcends the mere concept of coins and paper notes; it becomes a profound language that speaks of value, trust, and societal structures. Like any language, it possesses intricate nuances and subtleties that require a discerning understanding. It's in these depths where the calculated world of financial strategy collides with the raw, instinctive nature of human intuition. Just as a seasoned linguist might dissect the syntax and semantics of a sentence, a financial expert navigates the vast and tumultuous ocean of finance, guided not only by logic and data but also by gut feelings and foresight. Every transaction, investment, and financial decision becomes a dialogue in this expansive lexicon of commerce and value.",
136
+ version: 1,
137
+ },
138
+ ],
139
+ direction: "ltr",
140
+ format: "",
141
+ indent: 0,
142
+ textFormat: 0,
143
+ version: 1,
144
+ },
145
+ {
146
+ type: "block",
147
+ fields: {
148
+ blockName: "",
149
+ blockType: "mediaBlock",
150
+ media: blockImage.id,
151
+ },
152
+ format: "",
153
+ version: 2,
154
+ },
155
+ {
156
+ type: "heading",
157
+ children: [
158
+ {
159
+ type: "text",
160
+ detail: 0,
161
+ format: 0,
162
+ mode: "normal",
163
+ style: "",
164
+ text: "Stock Market Dynamics: Bulls, Bears, and the Uncertain Middle",
165
+ version: 1,
166
+ },
167
+ ],
168
+ direction: "ltr",
169
+ format: "",
170
+ indent: 0,
171
+ tag: "h2",
172
+ version: 1,
173
+ },
174
+ {
175
+ type: "paragraph",
176
+ children: [
177
+ {
178
+ type: "text",
179
+ detail: 0,
180
+ format: 0,
181
+ mode: "normal",
182
+ style: "",
183
+ text: "The stock market is a realm of vast opportunity but also poses risks. Discover the forces that drive market trends and the strategies employed by top traders to navigate this complex ecosystem. From market analysis to understanding investor psychology, get a comprehensive insight into the world of stocks.",
184
+ version: 1,
185
+ },
186
+ ],
187
+ direction: "ltr",
188
+ format: "",
189
+ indent: 0,
190
+ textFormat: 0,
191
+ version: 1,
192
+ },
193
+ {
194
+ type: "paragraph",
195
+ children: [
196
+ {
197
+ type: "text",
198
+ detail: 0,
199
+ format: 0,
200
+ mode: "normal",
201
+ style: "",
202
+ text: "The stock market, often visualized as a bustling arena of numbers and ticker tapes, is as much about human behavior as it is about economics. It's a place where optimism, represented by the bullish rally, meets the caution of bearish downturns, with each vying to dictate the market's direction. But between these two extremes lies an uncertain middle ground, a zone populated by traders and investors who constantly weigh hope against fear. Successful navigation requires more than just financial acumen; it demands an understanding of collective sentiments and the ability to predict not just market movements, but also the reactions of other market participants. In this intricate dance of numbers and nerves, the most astute players are those who master both the hard data and the soft nuances of human behavior.",
203
+ version: 1,
204
+ },
205
+ ],
206
+ direction: "ltr",
207
+ format: "",
208
+ indent: 0,
209
+ textFormat: 0,
210
+ version: 1,
211
+ },
212
+ {
213
+ type: "block",
214
+ fields: {
215
+ blockName: "Dynamic components",
216
+ blockType: "banner",
217
+ content: {
218
+ root: {
219
+ type: "root",
220
+ children: [
221
+ {
222
+ type: "paragraph",
223
+ children: [
224
+ {
225
+ type: "text",
226
+ detail: 0,
227
+ format: 0,
228
+ mode: "normal",
229
+ style: "",
230
+ text: "This content above is completely dynamic using custom layout building blocks configured in the CMS. This can be anything you'd like from rich text and images, to highly designed, complex components.",
231
+ version: 1,
232
+ },
233
+ ],
234
+ direction: "ltr",
235
+ format: "",
236
+ indent: 0,
237
+ textFormat: 0,
238
+ version: 1,
239
+ },
240
+ ],
241
+ direction: "ltr",
242
+ format: "",
243
+ indent: 0,
244
+ version: 1,
245
+ },
246
+ },
247
+ style: "info",
248
+ },
249
+ format: "",
250
+ version: 2,
251
+ },
252
+ ],
253
+ direction: "ltr",
254
+ format: "",
255
+ indent: 0,
256
+ version: 1,
257
+ },
258
+ },
259
+ heroImage: heroImage.id,
260
+ meta: {
261
+ description: `Money isn't just currency; it's a language. Dive deep into its nuances, where strategy meets intuition in the vast sea of finance.`,
262
+ image: heroImage.id,
263
+ title: "Dollar and Sense: The Financial Forecast",
264
+ },
265
+ relatedPosts: [], // this is populated by the seed script
266
+ title: "Dollar and Sense: The Financial Forecast",
267
+ }
268
+ }
@@ -0,0 +1,73 @@
1
+ import {
2
+ AlignFeature,
3
+ BlockquoteFeature,
4
+ BoldFeature,
5
+ ChecklistFeature,
6
+ EXPERIMENTAL_TableFeature,
7
+ IndentFeature,
8
+ InlineCodeFeature,
9
+ ItalicFeature,
10
+ LinkFeature,
11
+ type LinkFields,
12
+ OrderedListFeature,
13
+ ParagraphFeature,
14
+ RelationshipFeature,
15
+ StrikethroughFeature,
16
+ SubscriptFeature,
17
+ SuperscriptFeature,
18
+ UnderlineFeature,
19
+ UnorderedListFeature,
20
+ UploadFeature,
21
+ lexicalEditor,
22
+ } from "@payloadcms/richtext-lexical"
23
+ import type { TextFieldSingleValidation } from "payload"
24
+
25
+ export const defaultLexical = lexicalEditor({
26
+ features: [
27
+ ParagraphFeature(),
28
+ UnderlineFeature(),
29
+ BoldFeature(),
30
+ ItalicFeature(),
31
+ StrikethroughFeature(),
32
+ SubscriptFeature(),
33
+ SuperscriptFeature(),
34
+ InlineCodeFeature(),
35
+ BlockquoteFeature(),
36
+ UnorderedListFeature(),
37
+ OrderedListFeature(),
38
+ ChecklistFeature(),
39
+ AlignFeature(),
40
+ IndentFeature(),
41
+ RelationshipFeature(),
42
+ UploadFeature(),
43
+ EXPERIMENTAL_TableFeature(),
44
+ LinkFeature({
45
+ enabledCollections: ["pages", "posts"],
46
+ fields: ({ defaultFields }) => {
47
+ const defaultFieldsWithoutUrl = defaultFields.filter((field) => {
48
+ if ("name" in field && field.name === "url") return false
49
+ return true
50
+ })
51
+
52
+ return [
53
+ ...defaultFieldsWithoutUrl,
54
+ {
55
+ name: "url",
56
+ type: "text",
57
+ admin: {
58
+ condition: (_data, siblingData) => siblingData?.linkType !== "internal",
59
+ },
60
+ label: ({ t }) => t("fields:enterURL"),
61
+ required: true,
62
+ validate: ((value, options) => {
63
+ if ((options?.siblingData as LinkFields)?.linkType === "internal") {
64
+ return true // no validation needed, as no url should exist for internal links
65
+ }
66
+ return value ? true : "URL is required"
67
+ }) as TextFieldSingleValidation,
68
+ },
69
+ ]
70
+ },
71
+ }),
72
+ ],
73
+ })
@@ -0,0 +1,139 @@
1
+ import type { Field, GroupField } from "payload"
2
+
3
+ import deepMerge from "@/utilities/deepMerge"
4
+
5
+ export type LinkAppearances = "default" | "outline"
6
+
7
+ export const appearanceOptions: Record<LinkAppearances, { label: string; value: string }> = {
8
+ default: {
9
+ label: "Default",
10
+ value: "default",
11
+ },
12
+ outline: {
13
+ label: "Outline",
14
+ value: "outline",
15
+ },
16
+ }
17
+
18
+ type LinkType = (options?: {
19
+ appearances?: LinkAppearances[] | false
20
+ disableLabel?: boolean
21
+ overrides?: Partial<GroupField>
22
+ }) => Field
23
+
24
+ export const link: LinkType = ({ appearances, disableLabel = false, overrides = {} } = {}) => {
25
+ const linkResult: GroupField = {
26
+ name: "link",
27
+ type: "group",
28
+ admin: {
29
+ hideGutter: true,
30
+ },
31
+ fields: [
32
+ {
33
+ type: "row",
34
+ fields: [
35
+ {
36
+ name: "type",
37
+ type: "radio",
38
+ admin: {
39
+ layout: "horizontal",
40
+ width: "50%",
41
+ },
42
+ defaultValue: "reference",
43
+ options: [
44
+ {
45
+ label: "Internal link",
46
+ value: "reference",
47
+ },
48
+ {
49
+ label: "Custom URL",
50
+ value: "custom",
51
+ },
52
+ ],
53
+ },
54
+ {
55
+ name: "newTab",
56
+ type: "checkbox",
57
+ admin: {
58
+ style: {
59
+ alignSelf: "flex-end",
60
+ },
61
+ width: "50%",
62
+ },
63
+ label: "Open in new tab",
64
+ },
65
+ ],
66
+ },
67
+ ],
68
+ }
69
+
70
+ const linkTypes: Field[] = [
71
+ {
72
+ name: "reference",
73
+ type: "relationship",
74
+ admin: {
75
+ condition: (_, siblingData) => siblingData?.type === "reference",
76
+ },
77
+ label: "Document to link to",
78
+ relationTo: ["pages", "posts"],
79
+ required: true,
80
+ },
81
+ {
82
+ name: "url",
83
+ type: "text",
84
+ admin: {
85
+ condition: (_, siblingData) => siblingData?.type === "custom",
86
+ },
87
+ label: "Custom URL",
88
+ required: true,
89
+ },
90
+ ]
91
+
92
+ if (!disableLabel) {
93
+ linkTypes.map((linkType) => ({
94
+ ...linkType,
95
+ admin: {
96
+ ...linkType.admin,
97
+ width: "50%",
98
+ },
99
+ }))
100
+
101
+ linkResult.fields.push({
102
+ type: "row",
103
+ fields: [
104
+ ...linkTypes,
105
+ {
106
+ name: "label",
107
+ type: "text",
108
+ admin: {
109
+ width: "50%",
110
+ },
111
+ label: "Label",
112
+ required: true,
113
+ },
114
+ ],
115
+ })
116
+ } else {
117
+ linkResult.fields = [...linkResult.fields, ...linkTypes]
118
+ }
119
+
120
+ if (appearances !== false) {
121
+ let appearanceOptionsToUse = [appearanceOptions.default, appearanceOptions.outline]
122
+
123
+ if (appearances) {
124
+ appearanceOptionsToUse = appearances.map((appearance) => appearanceOptions[appearance])
125
+ }
126
+
127
+ linkResult.fields.push({
128
+ name: "appearance",
129
+ type: "select",
130
+ admin: {
131
+ description: "Choose how the link should be rendered.",
132
+ },
133
+ defaultValue: "default",
134
+ options: appearanceOptionsToUse,
135
+ })
136
+ }
137
+
138
+ return deepMerge(linkResult, overrides)
139
+ }
@@ -0,0 +1,28 @@
1
+ import type { ArrayField, Field } from "payload"
2
+
3
+ import type { LinkAppearances } from "./link"
4
+
5
+ import deepMerge from "@/utilities/deepMerge"
6
+ import { link } from "./link"
7
+
8
+ type LinkGroupType = (options?: {
9
+ appearances?: LinkAppearances[] | false
10
+ overrides?: Partial<ArrayField>
11
+ }) => Field
12
+
13
+ export const linkGroup: LinkGroupType = ({ appearances, overrides = {} } = {}) => {
14
+ const generatedLinkGroup: Field = {
15
+ name: "links",
16
+ type: "array",
17
+ fields: [
18
+ link({
19
+ appearances,
20
+ }),
21
+ ],
22
+ admin: {
23
+ initCollapsed: true,
24
+ },
25
+ }
26
+
27
+ return deepMerge(generatedLinkGroup, overrides)
28
+ }
@@ -0,0 +1,56 @@
1
+ "use client"
2
+ import { useHeaderTheme } from "@/providers/HeaderTheme"
3
+ import type React from "react"
4
+ import { useEffect } from "react"
5
+
6
+ import type { Page } from "@/payload-types"
7
+
8
+ import { CTATracker } from "@/components/Analytics"
9
+ import { CMSLink } from "@/components/Link"
10
+ import { Media } from "@/components/Media"
11
+ import RichText from "@/components/RichText"
12
+
13
+ export const HighImpactHero: React.FC<Page["hero"]> = ({ links, media, richText }) => {
14
+ const { setHeaderTheme } = useHeaderTheme()
15
+
16
+ useEffect(() => {
17
+ setHeaderTheme("dark")
18
+ })
19
+
20
+ return (
21
+ <div
22
+ className="relative -mt-[10.4rem] flex items-center justify-center text-white"
23
+ data-theme="dark"
24
+ >
25
+ <div className="container mx-auto px-4 z-10 relative flex items-center justify-center py-32 md:py-40">
26
+ <div className="max-w-4xl text-center hero-content hero-content--dark">
27
+ {richText && (
28
+ <RichText className="mb-8" data={richText} enableGutter={false} enableProse={false} />
29
+ )}
30
+ {Array.isArray(links) && links.length > 0 && (
31
+ <ul className="flex flex-wrap justify-center gap-4">
32
+ {links.map(({ link }, i) => {
33
+ return (
34
+ // biome-ignore lint/suspicious/noArrayIndexKey: CMS links don't have stable IDs
35
+ <li key={i}>
36
+ <CTATracker location="hero_high_impact" variant={link?.label || `cta_${i}`}>
37
+ <CMSLink {...link} size="lg" />
38
+ </CTATracker>
39
+ </li>
40
+ )
41
+ })}
42
+ </ul>
43
+ )}
44
+ </div>
45
+ </div>
46
+ <div className="absolute inset-0 min-h-[80vh] select-none">
47
+ {media && typeof media === "object" && (
48
+ <>
49
+ <Media fill imgClassName="object-cover" priority resource={media} size="100vw" />
50
+ <div className="absolute inset-0 bg-black/60" />
51
+ </>
52
+ )}
53
+ </div>
54
+ </div>
55
+ )
56
+ }
@@ -0,0 +1,48 @@
1
+ import type React from "react"
2
+
3
+ import type { Page } from "@/payload-types"
4
+
5
+ import { CMSLink } from "@/components/Link"
6
+ import RichText from "@/components/RichText"
7
+
8
+ type LowImpactHeroType =
9
+ | {
10
+ children?: React.ReactNode
11
+ richText?: never
12
+ links?: never
13
+ }
14
+ | (Omit<Page["hero"], "richText"> & {
15
+ children?: never
16
+ richText?: Page["hero"]["richText"]
17
+ })
18
+
19
+ export const LowImpactHero: React.FC<LowImpactHeroType> = ({ children, richText, links }) => {
20
+ return (
21
+ <div className="py-20 md:py-32">
22
+ <div className="container mx-auto px-4">
23
+ <div className="text-center max-w-4xl mx-auto">
24
+ {children ||
25
+ (richText && (
26
+ <RichText
27
+ className="mb-8 hero-content"
28
+ data={richText}
29
+ enableGutter={false}
30
+ enableProse={false}
31
+ />
32
+ ))}
33
+ {Array.isArray(links) && links.length > 0 && (
34
+ <ul className="flex flex-wrap justify-center gap-4">
35
+ {links.map(({ link }, i) => {
36
+ return (
37
+ <li key={i}>
38
+ <CMSLink {...link} size="lg" />
39
+ </li>
40
+ )
41
+ })}
42
+ </ul>
43
+ )}
44
+ </div>
45
+ </div>
46
+ </div>
47
+ )
48
+ }
@@ -0,0 +1,50 @@
1
+ "use client"
2
+
3
+ import type React from "react"
4
+
5
+ import type { Page } from "@/payload-types"
6
+
7
+ import { CTATracker } from "@/components/Analytics"
8
+ import { CMSLink } from "@/components/Link"
9
+ import { Media } from "@/components/Media"
10
+ import RichText from "@/components/RichText"
11
+
12
+ export const MediumImpactHero: React.FC<Page["hero"]> = ({ links, media, richText }) => {
13
+ return (
14
+ <div className="py-20 md:py-28">
15
+ <div className="container mx-auto px-4">
16
+ <div className="text-center max-w-4xl mx-auto mb-12 hero-content">
17
+ {richText && (
18
+ <RichText className="mb-8" data={richText} enableGutter={false} enableProse={false} />
19
+ )}
20
+
21
+ {Array.isArray(links) && links.length > 0 && (
22
+ <ul className="flex flex-wrap justify-center gap-4">
23
+ {links.map(({ link }, i) => {
24
+ return (
25
+ // biome-ignore lint/suspicious/noArrayIndexKey: CMS links don't have stable IDs
26
+ <li key={i}>
27
+ <CTATracker location="hero_medium_impact" variant={link?.label || `cta_${i}`}>
28
+ <CMSLink {...link} size="lg" />
29
+ </CTATracker>
30
+ </li>
31
+ )
32
+ })}
33
+ </ul>
34
+ )}
35
+ </div>
36
+
37
+ {media && typeof media === "object" && (
38
+ <div className="rounded-xl overflow-hidden border border-border shadow-2xl">
39
+ <Media imgClassName="w-full" priority resource={media} />
40
+ {media?.caption && (
41
+ <div className="mt-3 text-center">
42
+ <RichText data={media.caption} enableGutter={false} />
43
+ </div>
44
+ )}
45
+ </div>
46
+ )}
47
+ </div>
48
+ </div>
49
+ )
50
+ }