kofi-stack-template-generator 2.1.37 → 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 (323) hide show
  1. package/.turbo/turbo-build.log +6 -6
  2. package/dist/index.js +8057 -440
  3. package/package.json +1 -1
  4. package/src/templates.generated.ts +248 -94
  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/src/components/button.tsx.hbs +53 -0
  244. package/templates/packages/ui/src/components/card.tsx.hbs +76 -0
  245. package/templates/packages/ui/src/components/separator.tsx.hbs +26 -0
  246. package/templates/marketing/payload/src/Footer/config.ts.hbs +0 -178
  247. package/templates/marketing/payload/src/Footer/index.ts.hbs +0 -1
  248. package/templates/marketing/payload/src/Header/RowLabel.tsx.hbs +0 -21
  249. package/templates/marketing/payload/src/Header/config.ts.hbs +0 -208
  250. package/templates/marketing/payload/src/Header/index.ts.hbs +0 -1
  251. package/templates/marketing/payload/src/access/index.ts.hbs +0 -3
  252. package/templates/marketing/payload/src/app/(frontend)/layout.tsx.hbs +0 -19
  253. package/templates/marketing/payload/src/app/(frontend)/next/seed/route.ts.hbs +0 -31
  254. package/templates/marketing/payload/src/app/(frontend)/page.tsx.hbs +0 -83
  255. package/templates/marketing/payload/src/app/(payload)/admin/[[...segments]]/not-found.tsx.hbs +0 -24
  256. package/templates/marketing/payload/src/app/(payload)/admin/[[...segments]]/page.tsx.hbs +0 -24
  257. package/templates/marketing/payload/src/app/(payload)/admin/importMap.js.hbs +0 -1
  258. package/templates/marketing/payload/src/app/(payload)/custom.scss.hbs +0 -1
  259. package/templates/marketing/payload/src/app/(payload)/layout.tsx.hbs +0 -31
  260. package/templates/marketing/payload/src/app/globals.css.hbs +0 -83
  261. package/templates/marketing/payload/src/app/layout.tsx.hbs +0 -10
  262. package/templates/marketing/payload/src/blocks/Benefits.ts.hbs +0 -34
  263. package/templates/marketing/payload/src/blocks/CTA.ts.hbs +0 -39
  264. package/templates/marketing/payload/src/blocks/Content.ts.hbs +0 -9
  265. package/templates/marketing/payload/src/blocks/FAQ.ts.hbs +0 -18
  266. package/templates/marketing/payload/src/blocks/Features.ts.hbs +0 -34
  267. package/templates/marketing/payload/src/blocks/Hero.ts.hbs +0 -40
  268. package/templates/marketing/payload/src/blocks/LogoBanner.ts.hbs +0 -17
  269. package/templates/marketing/payload/src/blocks/Pricing.ts.hbs +0 -37
  270. package/templates/marketing/payload/src/blocks/Testimonials.ts.hbs +0 -21
  271. package/templates/marketing/payload/src/blocks/index.ts.hbs +0 -9
  272. package/templates/marketing/payload/src/collections/Categories/index.ts.hbs +0 -28
  273. package/templates/marketing/payload/src/collections/FAQs/index.ts.hbs +0 -100
  274. package/templates/marketing/payload/src/collections/Media.ts.hbs +0 -164
  275. package/templates/marketing/payload/src/collections/Pages/hooks/revalidatePage.ts.hbs +0 -43
  276. package/templates/marketing/payload/src/collections/Pages/index.ts.hbs +0 -142
  277. package/templates/marketing/payload/src/collections/Posts/hooks/populateAuthors.ts.hbs +0 -41
  278. package/templates/marketing/payload/src/collections/Posts/hooks/revalidatePost.ts.hbs +0 -44
  279. package/templates/marketing/payload/src/collections/Posts/index.ts.hbs +0 -244
  280. package/templates/marketing/payload/src/collections/Users/index.ts.hbs +0 -26
  281. package/templates/marketing/payload/src/collections/index.ts.hbs +0 -6
  282. package/templates/marketing/payload/src/components/BeforeDashboard/SeedButton/index.tsx.hbs +0 -89
  283. package/templates/marketing/payload/src/components/BeforeDashboard/index.tsx.hbs +0 -69
  284. package/templates/marketing/payload/src/components/BeforeLogin/index.tsx.hbs +0 -14
  285. package/templates/marketing/payload/src/components/Link/index.tsx.hbs +0 -79
  286. package/templates/marketing/payload/src/components/Media/index.tsx.hbs +0 -67
  287. package/templates/marketing/payload/src/components/RichText/index.tsx.hbs +0 -44
  288. package/templates/marketing/payload/src/endpoints/seed/home.ts.hbs +0 -76
  289. package/templates/marketing/payload/src/endpoints/seed/image-1.ts.hbs +0 -5
  290. package/templates/marketing/payload/src/endpoints/seed/image-2.ts.hbs +0 -5
  291. package/templates/marketing/payload/src/endpoints/seed/image-hero.ts.hbs +0 -5
  292. package/templates/marketing/payload/src/endpoints/seed/index.ts.hbs +0 -235
  293. package/templates/marketing/payload/src/endpoints/seed/post-1.ts.hbs +0 -252
  294. package/templates/marketing/payload/src/fields/defaultLexical.ts.hbs +0 -73
  295. package/templates/marketing/payload/src/fields/link.ts.hbs +0 -139
  296. package/templates/marketing/payload/src/fields/linkGroup.ts.hbs +0 -28
  297. package/templates/marketing/payload/src/globals/index.ts.hbs +0 -2
  298. package/templates/marketing/payload/src/heros/HighImpact/index.tsx.hbs +0 -53
  299. package/templates/marketing/payload/src/heros/LowImpact/index.tsx.hbs +0 -48
  300. package/templates/marketing/payload/src/heros/MediumImpact/index.tsx.hbs +0 -46
  301. package/templates/marketing/payload/src/heros/PostHero/index.tsx.hbs +0 -68
  302. package/templates/marketing/payload/src/heros/ProductShowcase/index.tsx.hbs +0 -88
  303. package/templates/marketing/payload/src/heros/config.ts.hbs +0 -112
  304. package/templates/marketing/payload/src/heros/index.ts.hbs +0 -7
  305. package/templates/marketing/payload/src/hooks/index.ts.hbs +0 -2
  306. package/templates/marketing/payload/src/hooks/populatePublishedAt.ts.hbs +0 -15
  307. package/templates/marketing/payload/src/providers/HeaderTheme/index.tsx.hbs +0 -34
  308. package/templates/marketing/payload/src/providers/Theme/index.tsx.hbs +0 -60
  309. package/templates/marketing/payload/src/providers/Theme/shared.ts.hbs +0 -17
  310. package/templates/marketing/payload/src/providers/index.tsx.hbs +0 -18
  311. package/templates/marketing/payload/src/utilities/deepMerge.ts.hbs +0 -35
  312. package/templates/marketing/payload/src/utilities/formatAuthors.ts.hbs +0 -24
  313. package/templates/marketing/payload/src/utilities/formatDateTime.ts.hbs +0 -13
  314. package/templates/marketing/payload/src/utilities/generateMeta.ts.hbs +0 -87
  315. package/templates/marketing/payload/src/utilities/generatePreviewPath.ts.hbs +0 -33
  316. package/templates/marketing/payload/src/utilities/getURL.ts.hbs +0 -26
  317. package/templates/marketing/payload/src/utilities/index.ts.hbs +0 -8
  318. package/templates/marketing/payload/src/utilities/mergeOpenGraph.ts.hbs +0 -26
  319. /package/templates/marketing/payload/src/access/{anyone.ts.hbs → anyone.ts} +0 -0
  320. /package/templates/marketing/payload/src/components/BeforeDashboard/SeedButton/{index.scss.hbs → index.scss} +0 -0
  321. /package/templates/marketing/payload/src/components/BeforeDashboard/{index.scss.hbs → index.scss} +0 -0
  322. /package/templates/marketing/payload/src/fields/{index.ts.hbs → index.ts} +0 -0
  323. /package/templates/marketing/payload/src/utilities/{canUseDOM.ts.hbs → canUseDOM.ts} +0 -0
@@ -0,0 +1,623 @@
1
+ import type { Category, Post } from "@/payload-types"
2
+ import { createRichText } from "./richtext-helper"
3
+
4
+ // Helper to generate post content
5
+ const generatePostContent = (sections: Array<{ heading: string; content: string }>) => {
6
+ const elements: Array<
7
+ { type: "heading"; tag: "h2" | "h3"; text: string } | { type: "paragraph"; text: string }
8
+ > = []
9
+
10
+ for (const section of sections) {
11
+ elements.push({ type: "heading", tag: "h2", text: section.heading })
12
+ elements.push({ type: "paragraph", text: section.content })
13
+ }
14
+
15
+ return createRichText(elements)
16
+ }
17
+
18
+ export const blogPosts = (categories: Category[]): Partial<Post>[] => {
19
+ // Find or use default categories
20
+ const findCategory = (slug: string) => categories.find((c) => c.slug === slug)?.id
21
+
22
+ const posts: Partial<Post>[] = [
23
+ // Directory Business Strategies (5 posts)
24
+ {
25
+ title: "How to Launch a Profitable Directory Website in 2024",
26
+ slug: "how-to-launch-profitable-directory-website-2024",
27
+ _status: "published",
28
+ publishedAt: new Date("2024-01-15").toISOString(),
29
+ categories: findCategory("business") ? [findCategory("business")!] : [],
30
+ content: generatePostContent([
31
+ {
32
+ heading: "The Directory Business Opportunity",
33
+ content:
34
+ "Directory websites remain one of the most viable online business models in 2024. Unlike content sites that require constant updates, directories generate recurring revenue through listings and subscriptions. This guide walks you through everything you need to know to launch your first directory successfully.",
35
+ },
36
+ {
37
+ heading: "Choosing Your Niche",
38
+ content:
39
+ "The key to a successful directory is finding a niche with demand but limited competition. Look for industries where businesses actively seek customers online but generic directories like Yelp or Google Maps don't serve well. Professional services, B2B vendors, and specialized local services are excellent starting points.",
40
+ },
41
+ {
42
+ heading: "Building Your MVP",
43
+ content:
44
+ "Don't spend months building the perfect directory. Launch with a minimum viable product featuring 50-100 quality listings, basic search and filtering, and a simple submission form. You can always add features later based on user feedback.",
45
+ },
46
+ {
47
+ heading: "Acquiring Your First Listings",
48
+ content:
49
+ "Start by manually adding listings from public sources like business registrations and industry associations. Then reach out to businesses directly with free listings to build your initial database. Quality matters more than quantity in the early stages.",
50
+ },
51
+ {
52
+ heading: "Monetization Strategies",
53
+ content:
54
+ "The most successful directories use multiple revenue streams: premium listings, featured placements, subscription tiers, and lead generation fees. Start with one model and expand as you understand what your audience and listed businesses value most.",
55
+ },
56
+ ]),
57
+ meta: {
58
+ title: "How to Launch a Profitable Directory Website in 2024",
59
+ description:
60
+ "Complete guide to starting a directory business. Learn niche selection, MVP building, listing acquisition, and monetization strategies.",
61
+ },
62
+ },
63
+ {
64
+ title: "10 Directory Business Models That Actually Make Money",
65
+ slug: "10-directory-business-models-that-make-money",
66
+ _status: "published",
67
+ publishedAt: new Date("2024-01-22").toISOString(),
68
+ categories: findCategory("business") ? [findCategory("business")!] : [],
69
+ content: generatePostContent([
70
+ {
71
+ heading: "Introduction to Directory Monetization",
72
+ content:
73
+ "Not all directories are created equal when it comes to making money. Some niches and business models consistently outperform others. Here are 10 proven directory business models that generate real revenue.",
74
+ },
75
+ {
76
+ heading: "1. Local Service Directories",
77
+ content:
78
+ "Directories connecting homeowners with plumbers, electricians, and contractors generate revenue through lead fees and featured placements. HomeAdvisor built a billion-dollar business on this model.",
79
+ },
80
+ {
81
+ heading: "2. B2B Software Directories",
82
+ content:
83
+ "Think G2 or Capterra. These directories charge software vendors for premium profiles, lead capture, and verified reviews. High ticket items mean high willingness to pay for visibility.",
84
+ },
85
+ {
86
+ heading: "3. Professional Service Directories",
87
+ content:
88
+ "Lawyers, accountants, and consultants pay premium prices for qualified leads. Directories in these niches can charge $50-500 per lead depending on the practice area.",
89
+ },
90
+ {
91
+ heading: "4. Wedding Vendor Directories",
92
+ content:
93
+ "The wedding industry spends heavily on advertising. Directories connecting couples with photographers, venues, and caterers can charge $200-2000/year for premium vendor listings.",
94
+ },
95
+ {
96
+ heading: "5. Real Estate Directories",
97
+ content:
98
+ "Agent directories, property listings, and real estate service directories generate revenue through subscriptions and featured placements. High commission values support premium pricing.",
99
+ },
100
+ ]),
101
+ meta: {
102
+ title: "10 Directory Business Models That Actually Make Money",
103
+ description:
104
+ "Discover the most profitable directory niches and business models. From local services to B2B software, learn which directories generate real revenue.",
105
+ },
106
+ },
107
+ {
108
+ title: "The Complete Guide to Niche Directory Market Research",
109
+ slug: "complete-guide-niche-directory-market-research",
110
+ _status: "published",
111
+ publishedAt: new Date("2024-02-01").toISOString(),
112
+ categories: findCategory("business") ? [findCategory("business")!] : [],
113
+ content: generatePostContent([
114
+ {
115
+ heading: "Why Market Research Matters",
116
+ content:
117
+ "The difference between a successful directory and a failed one often comes down to niche selection. Proper market research helps you find opportunities with real demand, identify your competition, and understand what businesses will pay for visibility.",
118
+ },
119
+ {
120
+ heading: "Evaluating Market Demand",
121
+ content:
122
+ 'Use Google Keyword Planner to find search volume for terms like "[industry] directory" or "find [service] near me". Look for niches with at least 1,000 monthly searches for relevant terms. Also check if businesses in the space are actively advertising on Google.',
123
+ },
124
+ {
125
+ heading: "Analyzing Competition",
126
+ content:
127
+ "Search for existing directories in your target niche. Analyze their listings count, monetization model, and user experience. A niche with 2-3 mediocre competitors is often better than one with no competition (which might mean no demand).",
128
+ },
129
+ {
130
+ heading: "Validating Willingness to Pay",
131
+ content:
132
+ "Before building, reach out to 20-30 businesses in your target niche. Ask if they'd pay $50-200/month for premium visibility in a directory. If you can't get at least 5 \"yes\" responses, reconsider your niche.",
133
+ },
134
+ {
135
+ heading: "Sizing Your Market",
136
+ content:
137
+ "Estimate the total number of businesses that could list in your directory and realistic conversion rates. A niche with 10,000 potential listings and 5% premium conversion at $100/month is a $500K annual opportunity.",
138
+ },
139
+ ]),
140
+ meta: {
141
+ title: "The Complete Guide to Niche Directory Market Research",
142
+ description:
143
+ "Learn how to research and validate directory niches before building. Evaluate demand, competition, and monetization potential.",
144
+ },
145
+ },
146
+ {
147
+ title: "Building a Directory Website Without Code: Tools and Platforms",
148
+ slug: "building-directory-website-without-code",
149
+ _status: "published",
150
+ publishedAt: new Date("2024-02-10").toISOString(),
151
+ categories: findCategory("technology") ? [findCategory("technology")!] : [],
152
+ content: generatePostContent([
153
+ {
154
+ heading: "The No-Code Directory Revolution",
155
+ content:
156
+ "Building a directory website no longer requires months of development or a technical background. Modern platforms let you launch professional directories in days. Here's how to choose the right tool for your needs.",
157
+ },
158
+ {
159
+ heading: "Key Features to Look For",
160
+ content:
161
+ "Any directory platform should offer: customizable listing fields, search and filtering, user submissions, payment processing, and SEO optimization. Bonus features include reviews, maps integration, and email notifications.",
162
+ },
163
+ {
164
+ heading: "Dedicated Directory Platforms",
165
+ content:
166
+ "Platforms like DirectoryHub, Jetkicks, and Publishizer are purpose-built for directories. They offer the fastest path to launch with pre-built features specifically for directory use cases.",
167
+ },
168
+ {
169
+ heading: "WordPress with Directory Plugins",
170
+ content:
171
+ "WordPress plugins like GeoDirectory and Business Directory Plugin offer flexibility but require more setup. Best for those comfortable with WordPress who want full customization control.",
172
+ },
173
+ {
174
+ heading: "Making Your Decision",
175
+ content:
176
+ "For most people starting out, a dedicated directory platform is the best choice. You'll launch faster, avoid technical headaches, and can focus on growing your directory instead of managing code.",
177
+ },
178
+ ]),
179
+ meta: {
180
+ title: "Building a Directory Website Without Code: Tools and Platforms",
181
+ description:
182
+ "Compare no-code directory platforms and tools. Launch your directory website in days without writing a single line of code.",
183
+ },
184
+ },
185
+ {
186
+ title: "How to Price Directory Listings for Maximum Revenue",
187
+ slug: "how-to-price-directory-listings-maximum-revenue",
188
+ _status: "published",
189
+ publishedAt: new Date("2024-02-18").toISOString(),
190
+ categories: findCategory("business") ? [findCategory("business")!] : [],
191
+ content: generatePostContent([
192
+ {
193
+ heading: "The Psychology of Directory Pricing",
194
+ content:
195
+ "Pricing directory listings is both art and science. Price too low and you leave money on the table. Price too high and no one signs up. Here's how to find the sweet spot that maximizes revenue.",
196
+ },
197
+ {
198
+ heading: "Understanding Business Value",
199
+ content:
200
+ "The right price depends on the value your directory delivers. A lead worth $500 justifies higher listing fees than a lead worth $50. Start by understanding the lifetime value of customers your listings generate.",
201
+ },
202
+ {
203
+ heading: "Creating Pricing Tiers",
204
+ content:
205
+ "Offer 3-4 tiers: Free (basic visibility), Starter ($29-49/mo), Professional ($99-149/mo), and Premium ($249-499/mo). Each tier should add clear value through better placement, more features, or enhanced visibility.",
206
+ },
207
+ {
208
+ heading: "Annual vs Monthly Billing",
209
+ content:
210
+ "Offer 20-30% discounts for annual billing to improve cash flow and reduce churn. Most businesses that commit annually stay for multiple years, dramatically increasing lifetime value.",
211
+ },
212
+ {
213
+ heading: "Testing and Optimization",
214
+ content:
215
+ "Start with prices in the middle of your estimated range and adjust based on conversion rates. If everyone is buying, you're priced too low. If no one is buying, you're priced too high or not communicating value effectively.",
216
+ },
217
+ ]),
218
+ meta: {
219
+ title: "How to Price Directory Listings for Maximum Revenue",
220
+ description:
221
+ "Learn directory pricing strategies that maximize revenue. Create pricing tiers, understand business value, and optimize conversions.",
222
+ },
223
+ },
224
+
225
+ // Monetization Guides (4 posts)
226
+ {
227
+ title: "Stripe Integration for Directory Payments: Complete Guide",
228
+ slug: "stripe-integration-directory-payments-guide",
229
+ _status: "published",
230
+ publishedAt: new Date("2024-02-25").toISOString(),
231
+ categories: findCategory("technology") ? [findCategory("technology")!] : [],
232
+ content: generatePostContent([
233
+ {
234
+ heading: "Why Stripe for Directories",
235
+ content:
236
+ "Stripe is the gold standard for directory payments. It handles subscriptions, one-time payments, invoicing, and even marketplace-style payouts. This guide covers everything you need to know to integrate Stripe with your directory.",
237
+ },
238
+ {
239
+ heading: "Setting Up Stripe Connect",
240
+ content:
241
+ "For directories that pay out to listed businesses (like marketplaces), Stripe Connect handles split payments automatically. Connect your Stripe account, configure payout schedules, and let Stripe handle tax reporting.",
242
+ },
243
+ {
244
+ heading: "Subscription Management",
245
+ content:
246
+ "Use Stripe Billing to manage directory subscriptions. Create products for each tier, configure billing cycles, and let Stripe handle upgrades, downgrades, and cancellations automatically.",
247
+ },
248
+ {
249
+ heading: "Handling Failed Payments",
250
+ content:
251
+ "Stripe's Smart Retries automatically attempt to collect failed payments at optimal times. Configure dunning emails to notify customers and give them a chance to update payment methods before cancellation.",
252
+ },
253
+ {
254
+ heading: "Reporting and Analytics",
255
+ content:
256
+ "Stripe Dashboard provides comprehensive revenue reporting. Track MRR, churn, ARPU, and customer lifetime value. Export data for deeper analysis or integrate with business intelligence tools.",
257
+ },
258
+ ]),
259
+ meta: {
260
+ title: "Stripe Integration for Directory Payments: Complete Guide",
261
+ description:
262
+ "Learn how to integrate Stripe with your directory for subscriptions, one-time payments, and marketplace payouts.",
263
+ },
264
+ },
265
+ {
266
+ title: "Premium Listing Features That Businesses Will Pay For",
267
+ slug: "premium-listing-features-businesses-will-pay-for",
268
+ _status: "published",
269
+ publishedAt: new Date("2024-03-05").toISOString(),
270
+ categories: findCategory("business") ? [findCategory("business")!] : [],
271
+ content: generatePostContent([
272
+ {
273
+ heading: "What Makes Premium Worth It",
274
+ content:
275
+ "The key to selling premium listings is offering features that directly impact business results. Vanity features don't sell. Features that generate leads, build credibility, and drive traffic do.",
276
+ },
277
+ {
278
+ heading: "Featured Placement",
279
+ content:
280
+ "The most valuable premium feature is visibility. Featured spots on the homepage, category pages, and search results generate significantly more views and clicks. This alone can justify $100-500/month premium pricing.",
281
+ },
282
+ {
283
+ heading: "Enhanced Profiles",
284
+ content:
285
+ "Allow premium listings to add more photos, videos, service details, and portfolio examples. Rich profiles convert browsers into customers at higher rates.",
286
+ },
287
+ {
288
+ heading: "Lead Capture Tools",
289
+ content:
290
+ "Give premium listings direct lead capture with contact forms, click-to-call buttons, and quote request features. Track leads in a dashboard so businesses can see the ROI of their listing.",
291
+ },
292
+ {
293
+ heading: "Verification Badges",
294
+ content:
295
+ "Verified, licensed, or certified badges build trust. Offer verification as a premium feature or require premium subscriptions to display existing credentials prominently.",
296
+ },
297
+ ]),
298
+ meta: {
299
+ title: "Premium Listing Features That Businesses Will Pay For",
300
+ description:
301
+ "Discover which premium directory features generate the most revenue. Featured placements, enhanced profiles, lead capture, and more.",
302
+ },
303
+ },
304
+ {
305
+ title: "Lead Generation Revenue: How Directories Charge Per Lead",
306
+ slug: "lead-generation-revenue-directories-charge-per-lead",
307
+ _status: "published",
308
+ publishedAt: new Date("2024-03-12").toISOString(),
309
+ categories: findCategory("business") ? [findCategory("business")!] : [],
310
+ content: generatePostContent([
311
+ {
312
+ heading: "The Lead Gen Model",
313
+ content:
314
+ "Instead of subscription fees, some directories charge businesses for each lead they receive. This model works especially well in high-value service industries where a single customer is worth hundreds or thousands of dollars.",
315
+ },
316
+ {
317
+ heading: "Pricing Your Leads",
318
+ content:
319
+ "Lead pricing depends on industry and lead quality. Home service leads typically sell for $15-75, legal leads for $50-500, and B2B software leads for $100-1000. Price based on the value of closed deals.",
320
+ },
321
+ {
322
+ heading: "Qualifying Leads",
323
+ content:
324
+ "Not all leads are created equal. Use qualification forms to capture budget, timeline, and specific needs. Better qualified leads command higher prices and lead to happier customers.",
325
+ },
326
+ {
327
+ heading: "Distributing Leads",
328
+ content:
329
+ "Exclusive leads go to one business and command premium prices. Shared leads go to 3-5 businesses at lower prices. Match your model to industry norms and business preferences.",
330
+ },
331
+ {
332
+ heading: "Tracking and Reporting",
333
+ content:
334
+ "Provide businesses with lead dashboards showing volume, sources, and conversion tracking. Transparency builds trust and helps businesses see the value of your directory.",
335
+ },
336
+ ]),
337
+ meta: {
338
+ title: "Lead Generation Revenue: How Directories Charge Per Lead",
339
+ description:
340
+ "Learn the lead generation business model for directories. Price leads, qualify inquiries, and build sustainable revenue.",
341
+ },
342
+ },
343
+ {
344
+ title: "Affiliate Revenue Strategies for Directory Websites",
345
+ slug: "affiliate-revenue-strategies-directory-websites",
346
+ _status: "published",
347
+ publishedAt: new Date("2024-03-20").toISOString(),
348
+ categories: findCategory("business") ? [findCategory("business")!] : [],
349
+ content: generatePostContent([
350
+ {
351
+ heading: "Directories and Affiliate Marketing",
352
+ content:
353
+ "Directories are natural fits for affiliate revenue. You're already connecting buyers with sellers. Adding affiliate links to relevant products and services creates an additional revenue stream without charging listed businesses more.",
354
+ },
355
+ {
356
+ heading: "Choosing Affiliate Programs",
357
+ content:
358
+ "Select programs relevant to your directory's audience. A B2B software directory might partner with SaaS tools. A local service directory might partner with insurance or financing companies.",
359
+ },
360
+ {
361
+ heading: "Integration Strategies",
362
+ content:
363
+ 'Add affiliate recommendations to comparison pages, resource sections, and even listing profiles (with permission). Create "tools we recommend" sections that add value while generating commissions.',
364
+ },
365
+ {
366
+ heading: "Disclosure and Trust",
367
+ content:
368
+ "Always disclose affiliate relationships clearly. Trust is your most valuable asset. Transparent disclosure maintains credibility while still generating affiliate revenue.",
369
+ },
370
+ {
371
+ heading: "Measuring Performance",
372
+ content:
373
+ "Track clicks, conversions, and revenue by placement. A/B test different affiliate partners and placements. Focus efforts on high-converting, high-commission opportunities.",
374
+ },
375
+ ]),
376
+ meta: {
377
+ title: "Affiliate Revenue Strategies for Directory Websites",
378
+ description:
379
+ "Add affiliate revenue to your directory without charging businesses more. Learn integration strategies and program selection.",
380
+ },
381
+ },
382
+
383
+ // SEO Optimization (3 posts)
384
+ {
385
+ title: "Directory SEO: Ranking Your Listings on Google",
386
+ slug: "directory-seo-ranking-listings-google",
387
+ _status: "published",
388
+ publishedAt: new Date("2024-03-28").toISOString(),
389
+ categories: findCategory("technology") ? [findCategory("technology")!] : [],
390
+ content: generatePostContent([
391
+ {
392
+ heading: "Why SEO Matters for Directories",
393
+ content:
394
+ 'Organic search drives the majority of traffic to successful directories. Ranking for "[industry] + [location]" and similar queries brings highly qualified visitors ready to find what you list. Here\'s how to optimize your directory for search engines.',
395
+ },
396
+ {
397
+ heading: "Unique Listing Content",
398
+ content:
399
+ "The biggest SEO challenge for directories is thin or duplicate content. Encourage listed businesses to write unique descriptions. Add schema markup, categories, and attributes to make each listing page substantive and unique.",
400
+ },
401
+ {
402
+ heading: "Category Page Optimization",
403
+ content:
404
+ "Category pages often rank better than individual listings. Optimize category titles, descriptions, and URLs. Add introductory content explaining what users will find in each category.",
405
+ },
406
+ {
407
+ heading: "Technical SEO Essentials",
408
+ content:
409
+ "Ensure fast load times, mobile responsiveness, and clean URL structures. Implement proper canonical tags to handle pagination and filtering without creating duplicate content issues.",
410
+ },
411
+ {
412
+ heading: "Building Directory Authority",
413
+ content:
414
+ "Earn backlinks through guest posts, industry partnerships, and creating linkable resources. As your domain authority grows, individual listing pages will rank better for long-tail queries.",
415
+ },
416
+ ]),
417
+ meta: {
418
+ title: "Directory SEO: Ranking Your Listings on Google",
419
+ description:
420
+ "Complete guide to directory SEO. Optimize listings, category pages, and technical elements to rank on Google.",
421
+ },
422
+ },
423
+ {
424
+ title: "Schema Markup for Directory Websites Explained",
425
+ slug: "schema-markup-directory-websites-explained",
426
+ _status: "published",
427
+ publishedAt: new Date("2024-04-05").toISOString(),
428
+ categories: findCategory("technology") ? [findCategory("technology")!] : [],
429
+ content: generatePostContent([
430
+ {
431
+ heading: "What is Schema Markup",
432
+ content:
433
+ "Schema markup is structured data that helps search engines understand your content. For directories, proper schema markup can result in rich snippets showing ratings, prices, and other details directly in search results.",
434
+ },
435
+ {
436
+ heading: "LocalBusiness Schema",
437
+ content:
438
+ "For local service directories, LocalBusiness schema is essential. Include name, address, phone, hours, and aggregate ratings. Google uses this data for local pack results and knowledge panels.",
439
+ },
440
+ {
441
+ heading: "Product and Service Schema",
442
+ content:
443
+ "For directories listing products or services, use appropriate Product or Service schema. Include pricing, availability, and reviews to enable rich snippets in search results.",
444
+ },
445
+ {
446
+ heading: "AggregateRating Schema",
447
+ content:
448
+ "If your directory includes reviews, implement AggregateRating schema. This can display star ratings in search results, significantly improving click-through rates.",
449
+ },
450
+ {
451
+ heading: "Testing Your Schema",
452
+ content:
453
+ "Use Google's Rich Results Test and Schema Validator to verify your implementation. Monitor Search Console for schema errors and fix them promptly to maintain rich result eligibility.",
454
+ },
455
+ ]),
456
+ meta: {
457
+ title: "Schema Markup for Directory Websites Explained",
458
+ description:
459
+ "Learn how to implement schema markup for directory websites. LocalBusiness, Product, and review schema for rich snippets.",
460
+ },
461
+ },
462
+ {
463
+ title: "Creating SEO-Optimized Category Pages for Directories",
464
+ slug: "seo-optimized-category-pages-directories",
465
+ _status: "published",
466
+ publishedAt: new Date("2024-04-12").toISOString(),
467
+ categories: findCategory("technology") ? [findCategory("technology")!] : [],
468
+ content: generatePostContent([
469
+ {
470
+ heading: "The Power of Category Pages",
471
+ content:
472
+ "Category pages are often the highest-traffic pages on directory websites. They rank for broad industry terms and serve as hubs that pass authority to individual listings. Optimizing these pages is critical for directory SEO success.",
473
+ },
474
+ {
475
+ heading: "Category Page Structure",
476
+ content:
477
+ "Each category page needs a unique title, meta description, and H1 tag. Include 200-500 words of introductory content explaining what the category contains and why visitors should browse it.",
478
+ },
479
+ {
480
+ heading: "Internal Linking Strategy",
481
+ content:
482
+ "Link to category pages from your homepage, navigation, and footer. Cross-link related categories. This internal link structure helps search engines understand your site hierarchy and passes authority effectively.",
483
+ },
484
+ {
485
+ heading: "Faceted Navigation SEO",
486
+ content:
487
+ "Filters and facets create multiple URL variations that can cause duplicate content issues. Use canonical tags, parameter handling in Search Console, or AJAX filtering to maintain clean indexation.",
488
+ },
489
+ {
490
+ heading: "User Experience Signals",
491
+ content:
492
+ "Google considers user experience signals like bounce rate and time on page. Make category pages genuinely useful with good filtering, sorting, and preview information to keep users engaged.",
493
+ },
494
+ ]),
495
+ meta: {
496
+ title: "Creating SEO-Optimized Category Pages for Directories",
497
+ description:
498
+ "Optimize directory category pages for search engines. Structure, content, internal linking, and faceted navigation best practices.",
499
+ },
500
+ },
501
+
502
+ // Success Stories/Case Studies (3 posts)
503
+ {
504
+ title: "From Side Project to $50K MRR: A Directory Success Story",
505
+ slug: "side-project-to-50k-mrr-directory-success-story",
506
+ _status: "published",
507
+ publishedAt: new Date("2024-04-20").toISOString(),
508
+ categories: findCategory("news") ? [findCategory("news")!] : [],
509
+ content: generatePostContent([
510
+ {
511
+ heading: "The Beginning",
512
+ content:
513
+ "What started as a weekend project to solve a personal problem turned into a six-figure business. This is the story of how one entrepreneur built a niche directory from zero to $50,000 in monthly recurring revenue.",
514
+ },
515
+ {
516
+ heading: "Finding the Niche",
517
+ content:
518
+ "The founder noticed that finding specialized contractors in their industry was frustrating. Generic directories didn't have the specific information buyers needed. That gap became the opportunity.",
519
+ },
520
+ {
521
+ heading: "The MVP Launch",
522
+ content:
523
+ "Instead of building perfect technology, the founder launched with a simple WordPress site and 100 manually-researched listings. The focus was on quality data and user experience, not fancy features.",
524
+ },
525
+ {
526
+ heading: "Growth Strategies That Worked",
527
+ content:
528
+ "SEO was the primary growth driver. By creating comprehensive category pages and optimizing for long-tail keywords, organic traffic grew steadily. Paid acquisition was tested but proved less efficient than SEO.",
529
+ },
530
+ {
531
+ heading: "Lessons Learned",
532
+ content:
533
+ "The founder's biggest lessons: start smaller than you think, focus on a specific niche, prioritize SEO from day one, and don't underestimate the power of quality over quantity.",
534
+ },
535
+ ]),
536
+ meta: {
537
+ title: "From Side Project to $50K MRR: A Directory Success Story",
538
+ description:
539
+ "How one entrepreneur built a niche directory from weekend project to $50K monthly recurring revenue. Strategies and lessons learned.",
540
+ },
541
+ },
542
+ {
543
+ title: "How Local Directories Compete with Google and Win",
544
+ slug: "local-directories-compete-with-google-and-win",
545
+ _status: "published",
546
+ publishedAt: new Date("2024-04-28").toISOString(),
547
+ categories: findCategory("news") ? [findCategory("news")!] : [],
548
+ content: generatePostContent([
549
+ {
550
+ heading: "The Google Challenge",
551
+ content:
552
+ "Many assume Google has won local search. But specialized local directories continue to thrive by offering what Google can't: deep niche expertise, curated quality, and features tailored to specific industries.",
553
+ },
554
+ {
555
+ heading: "Niche Expertise Wins",
556
+ content:
557
+ "Google treats all businesses the same. A specialized directory can require industry-specific information, verify credentials, and ensure listings meet quality standards. This curation creates genuine value.",
558
+ },
559
+ {
560
+ heading: "Community Building",
561
+ content:
562
+ "Successful local directories build communities around their niches. User reviews, Q&A forums, and resource content create engagement that generic platforms can't match.",
563
+ },
564
+ {
565
+ heading: "Better Lead Quality",
566
+ content:
567
+ "Businesses report that leads from niche directories convert better than generic sources. Users who find businesses through specialized directories are further along in their buying journey.",
568
+ },
569
+ {
570
+ heading: "The Trust Factor",
571
+ content:
572
+ "A curated, specialized directory builds trust that an algorithm can't. When a directory stakes its reputation on listing quality, users trust those recommendations more than generic search results.",
573
+ },
574
+ ]),
575
+ meta: {
576
+ title: "How Local Directories Compete with Google and Win",
577
+ description:
578
+ "Why specialized local directories still thrive despite Google. Niche expertise, curation, and community building strategies.",
579
+ },
580
+ },
581
+ {
582
+ title: "5 Directory Founders Share Their Biggest Mistakes",
583
+ slug: "5-directory-founders-share-biggest-mistakes",
584
+ _status: "published",
585
+ publishedAt: new Date("2024-05-05").toISOString(),
586
+ categories: findCategory("news") ? [findCategory("news")!] : [],
587
+ content: generatePostContent([
588
+ {
589
+ heading: "Learning from Failure",
590
+ content:
591
+ "Success leaves clues, but so does failure. We talked to five directory founders about the mistakes that cost them time, money, and momentum. Here's what they wish they'd known from the start.",
592
+ },
593
+ {
594
+ heading: "Mistake 1: Building Too Much Before Launching",
595
+ content:
596
+ '"I spent 6 months building features no one asked for. By the time I launched, a competitor had already captured the market." - Founder of a defunct legal directory. Launch early, iterate based on feedback.',
597
+ },
598
+ {
599
+ heading: "Mistake 2: Ignoring SEO Until Too Late",
600
+ content:
601
+ '"I thought paid advertising would be enough. When I finally focused on SEO, I was 18 months behind competitors." - Founder of a home services directory. SEO is a long game; start day one.',
602
+ },
603
+ {
604
+ heading: "Mistake 3: Pricing Too Low",
605
+ content:
606
+ '"I was afraid to charge what the listings were worth. It took two years to raise prices, and I left hundreds of thousands on the table." - Founder of a B2B directory. Know your value and charge accordingly.',
607
+ },
608
+ {
609
+ heading: "Mistake 4: Trying to Serve Everyone",
610
+ content:
611
+ "\"My directory covered too many industries. I couldn't go deep on any of them and couldn't compete with specialists.\" - Founder of a general business directory. Niche down ruthlessly.",
612
+ },
613
+ ]),
614
+ meta: {
615
+ title: "5 Directory Founders Share Their Biggest Mistakes",
616
+ description:
617
+ "Learn from directory founders who share their costliest mistakes. Building too much, ignoring SEO, underpricing, and more.",
618
+ },
619
+ },
620
+ ]
621
+
622
+ return posts
623
+ }