kofi-stack-template-generator 2.1.44 → 2.1.45

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.
@@ -1,9 +1,9 @@
1
1
 
2
- > kofi-stack-template-generator@2.1.44 build /Users/theodenanyoh/Documents/Krumalabs/create-kofi-stack-v2/packages/template-generator
2
+ > kofi-stack-template-generator@2.1.45 build /Users/theodenanyoh/Documents/Krumalabs/create-kofi-stack-v2/packages/template-generator
3
3
  > pnpm run prebuild && tsup src/index.ts --format esm --dts
4
4
 
5
5
 
6
- > kofi-stack-template-generator@2.1.44 prebuild /Users/theodenanyoh/Documents/Krumalabs/create-kofi-stack-v2/packages/template-generator
6
+ > kofi-stack-template-generator@2.1.45 prebuild /Users/theodenanyoh/Documents/Krumalabs/create-kofi-stack-v2/packages/template-generator
7
7
  > node scripts/generate-templates.js
8
8
 
9
9
  Generating templates.generated.ts...
@@ -14,7 +14,7 @@ CLI tsup v8.5.1
14
14
  CLI Target: es2022
15
15
  ESM Build start
16
16
  ESM dist/index.js 2.28 MB
17
- ESM ⚡️ Build success in 67ms
17
+ ESM ⚡️ Build success in 65ms
18
18
  DTS Build start
19
- DTS ⚡️ Build success in 554ms
19
+ DTS ⚡️ Build success in 501ms
20
20
  DTS dist/index.d.ts 2.96 KB
package/dist/index.js CHANGED
@@ -5119,7 +5119,7 @@ export const seoPage = (): Partial<Page> => {
5119
5119
  `,
5120
5120
  "marketing/payload/src/endpoints/seed/directoryhub/features/templates.ts": 'import type { Page } from "@/payload-types"\nimport { createParagraph } from "../richtext-helper"\n\nexport const templatesPage = (): Partial<Page> => {\n return {\n slug: "features/templates",\n _status: "published",\n title: "Directory Templates",\n hero: {\n type: "lowImpact",\n richText: {\n root: {\n type: "root",\n children: [\n {\n type: "heading",\n children: [\n {\n type: "text",\n detail: 0,\n format: 0,\n mode: "normal",\n style: "",\n text: "Launch your directory in days, not months",\n version: 1,\n },\n ],\n direction: "ltr" as const,\n format: "" as const,\n indent: 0,\n tag: "h1",\n version: 1,\n },\n {\n type: "paragraph",\n children: [\n {\n type: "text",\n detail: 0,\n format: 0,\n mode: "normal",\n style: "",\n text: "Choose from professionally designed directory templates, customize to match your brand, and go live instantly. No coding required.",\n version: 1,\n },\n ],\n direction: "ltr" as const,\n format: "" as const,\n indent: 0,\n textFormat: 0,\n version: 1,\n },\n ],\n direction: "ltr" as const,\n format: "" as const,\n indent: 0,\n version: 1,\n },\n },\n links: [\n {\n link: {\n type: "custom",\n appearance: "default",\n label: "Get started free",\n url: "/sign-up",\n },\n },\n {\n link: {\n type: "custom",\n appearance: "outline",\n label: "View all templates",\n url: "/templates",\n },\n },\n ],\n },\n layout: [\n // Feature showcase blocks\n {\n blockType: "featureShowcase",\n blockName: "Template Gallery",\n label: "Ready-Made Templates",\n headline: "Pick a template, customize, launch",\n description: createParagraph(\n "Our template library covers every niche from local services to B2B vendor directories. Each template is designed for conversions with optimized layouts, smart filtering, and mobile-first responsive design.",\n ),\n link: {\n type: "custom",\n label: "Browse templates",\n url: "/templates",\n appearance: "default",\n },\n imagePosition: "right",\n features: [\n { text: "10+ professionally designed templates" },\n { text: "Niche-specific layouts and fields" },\n { text: "Mobile-first responsive design" },\n { text: "One-click preview and deploy" },\n ],\n },\n {\n blockType: "featureShowcase",\n blockName: "Customization",\n label: "Brand Customization",\n headline: "Make it yours in minutes",\n description: createParagraph(\n "Every template is fully customizable. Change colors, fonts, layouts, and content without touching a line of code. Our visual editor makes it simple to match your brand identity perfectly.",\n ),\n link: {\n type: "custom",\n label: "See customization options",\n url: "/features",\n appearance: "default",\n },\n imagePosition: "left",\n features: [\n { text: "Visual drag-and-drop editor" },\n { text: "Custom color schemes and fonts" },\n { text: "Logo and branding integration" },\n { text: "Custom domain support" },\n ],\n },\n // Bento features for specific capabilities\n {\n blockType: "bentoFeatures",\n blockName: "Template Features",\n heading: "Built for every directory type",\n subheading:\n "Templates designed for specific use cases with pre-configured schemas and optimized layouts",\n features: [\n {\n size: "small",\n style: "gradient",\n icon: "layout",\n title: "Local Services",\n description: createParagraph(\n "Plumbers, photographers, restaurants with map integration.",\n ),\n },\n {\n size: "small",\n style: "accent",\n icon: "building",\n title: "B2B Directories",\n description: createParagraph(\n "Software vendors, agencies, consultants with comparison views.",\n ),\n },\n {\n size: "small",\n style: "default",\n icon: "users",\n title: "Community Directories",\n description: createParagraph(\n "Member directories, alumni networks, professional groups.",\n ),\n },\n {\n size: "small",\n style: "primary",\n icon: "building",\n title: "Marketplaces",\n description: createParagraph(\n "Multi-vendor platforms with seller profiles and products.",\n ),\n },\n {\n size: "small",\n style: "default",\n icon: "globe",\n title: "Global Ready",\n description: createParagraph("Multi-language support and localization built-in."),\n },\n {\n size: "small",\n style: "default",\n icon: "zap",\n title: "Fast Loading",\n description: createParagraph("Optimized for speed with edge caching."),\n },\n ],\n },\n // Proof banner\n {\n blockType: "proofBanner",\n blockName: "CTA Section",\n style: "centered",\n headline: "Ready to launch your directory?",\n subtext: "Pick a template and go live today. Free to start, upgrade as you grow.",\n links: [\n {\n link: {\n type: "custom",\n appearance: "default",\n label: "Start for free",\n url: "/sign-up",\n },\n },\n {\n link: {\n type: "custom",\n appearance: "outline",\n label: "Book a demo",\n url: "/contact",\n },\n },\n ],\n },\n ],\n meta: {\n description:\n "Launch your directory website in days with professionally designed templates. Customize colors, layouts, and content without coding. Start free today.",\n title: "Directory Templates \u2014 Launch Fast with DirectoryHub",\n },\n }\n}\n',
5121
5121
  "marketing/payload/src/endpoints/seed/directoryhub/home.ts": 'import type { Media, Page } from "@/payload-types"\nimport { createParagraph } from "./richtext-helper"\n\ninterface HomePageParams {\n heroImage?: Media | null\n testimonialImages?: (Media | null)[]\n}\n\nexport const directoryHubHome = ({\n heroImage,\n testimonialImages = [],\n}: HomePageParams = {}): Partial<Page> => {\n return {\n slug: "home",\n _status: "published",\n hero: {\n type: "productShowcase",\n // Include media reference if heroImage was uploaded\n ...(heroImage && { media: heroImage.id }),\n richText: {\n root: {\n type: "root",\n children: [\n {\n type: "heading",\n children: [\n {\n type: "text",\n detail: 0,\n format: 0,\n mode: "normal",\n style: "",\n text: "Launch, monetize, and scale directories fast",\n version: 1,\n },\n ],\n direction: "ltr",\n format: "",\n indent: 0,\n tag: "h1",\n version: 1,\n },\n {\n type: "paragraph",\n children: [\n {\n type: "text",\n detail: 0,\n format: 0,\n mode: "normal",\n style: "",\n text: "The platform that accelerates directory launches, automates operations, and grows revenue.",\n version: 1,\n },\n ],\n direction: "ltr",\n format: "",\n indent: 0,\n textFormat: 0,\n version: 1,\n },\n ],\n direction: "ltr",\n format: "",\n indent: 0,\n version: 1,\n },\n },\n links: [\n {\n link: {\n type: "custom",\n appearance: "default",\n label: "Get started",\n url: "/sign-up",\n },\n },\n {\n link: {\n type: "custom",\n appearance: "outline",\n label: "View templates",\n url: "/templates",\n },\n },\n ],\n },\n layout: [\n // 1. Logo Banner - Social proof strip (KEEP)\n {\n blockType: "logoBanner",\n blockName: "Trusted By",\n heading: "Built for businesses where directories matter",\n style: "scroll",\n logos: [\n { name: "Northwind Market" },\n { name: "Acme Listings" },\n { name: "Evergreen HQ" },\n { name: "Atlas Network" },\n { name: "Beacon Partners" },\n { name: "Cascade Labs" },\n ],\n },\n\n // 2. Value Proposition - Bird-style headline section\n {\n blockType: "proofBanner",\n blockName: "Value Proposition",\n style: "centered",\n headline: "Turn your niche expertise into a revenue-generating directory",\n subtext:\n "Every interaction feeds into a powerful platform that powers personalized experiences, targeted discovery, and intelligent automation across every touchpoint.",\n links: [\n {\n link: {\n type: "custom",\n appearance: "default",\n label: "Start for free",\n url: "/sign-up",\n },\n },\n {\n link: {\n type: "custom",\n appearance: "outline",\n label: "Book a demo",\n url: "/contact",\n },\n },\n ],\n },\n\n // 3. Bento Features - Asymmetric bento grid with 8 cards\n {\n blockType: "bentoFeatures",\n blockName: "Get to know DirectoryHub",\n heading: "Get to know DirectoryHub",\n subheading: "Everything you need to launch and monetize directories",\n features: [\n // Position 1: Small (1x1) - top left\n {\n size: "small",\n style: "gradient",\n icon: "zap",\n stat: "5x",\n title: "Faster launches",\n description: createParagraph("Launch your directory in days, not months."),\n },\n // Position 2: Small (1x1) - top middle\n {\n size: "small",\n style: "accent",\n icon: "rocket",\n title: "Go live quickly",\n description: createParagraph("Pick a template, customize your brand, and publish."),\n },\n // Position 3: Small (1x1) - top right\n {\n size: "small",\n style: "default",\n icon: "dollarSign",\n title: "Monetize instantly",\n description: createParagraph("Stripe payments and subscription tiers built-in."),\n },\n // Position 4: Tall (1x2) - left side spanning 2 rows\n {\n size: "tall",\n style: "primary",\n icon: "shield",\n title: "Enterprise security",\n description: createParagraph(\n "Per-tenant isolation, encrypted data, and complete audit trails for peace of mind.",\n ),\n },\n // Position 5: Small (1x1) - row 2, middle\n {\n size: "small",\n style: "default",\n icon: "search",\n stat: "100%",\n title: "SEO ready",\n description: createParagraph("Schema markup and sitemaps generated automatically."),\n },\n // Position 6: Small (1x1) - row 2, right\n {\n size: "small",\n style: "default",\n icon: "globe",\n title: "Global scale",\n description: createParagraph("Multi-tenant with custom domains."),\n },\n // Position 7: Small (1x1) - row 3, middle\n {\n size: "small",\n style: "default",\n icon: "settings",\n title: "Smart automation",\n description: createParagraph("Automated workflows and moderation."),\n },\n // Position 8: Small (1x1) - row 3, right\n {\n size: "small",\n style: "default",\n icon: "layers",\n title: "Custom fields",\n description: createParagraph("Flexible schemas for any directory type."),\n },\n ],\n },\n\n // 4. Feature Showcase: Templates (image right)\n {\n blockType: "featureShowcase",\n blockName: "Feature: Templates",\n label: "Directory Templates",\n headline: "Go from idea to live directory in a weekend",\n description: createParagraph(\n "High-converting directory templates designed for every niche. Benefit from schema pre-fills, dynamic UI, smart search, and intelligent optimizations that drive engagement.",\n ),\n link: {\n type: "custom",\n label: "Explore templates",\n url: "/templates",\n appearance: "default",\n },\n imagePosition: "right",\n features: [\n { text: "10+ ready-to-use templates" },\n { text: "Custom domain in minutes" },\n { text: "Mobile-first responsive design" },\n { text: "Deep localization support" },\n ],\n },\n\n // 5. Feature Showcase: Monetization (image left)\n {\n blockType: "featureShowcase",\n blockName: "Feature: Monetization",\n label: "Revenue Engine",\n headline: "Drive revenue with built-in monetization",\n description: createParagraph(\n "Stop leaving money on the table. Charge for listings, offer premium placements, and run subscription tiers without writing a line of payment code. Automated invoicing and tax handling included.",\n ),\n link: {\n type: "custom",\n label: "Learn about monetization",\n url: "/pricing",\n appearance: "default",\n },\n imagePosition: "left",\n features: [\n { text: "Subscription tiers" },\n { text: "Featured placements" },\n { text: "Pay-per-listing options" },\n { text: "Automated payouts" },\n ],\n },\n\n // 6. Feature Showcase: SEO (image right)\n {\n blockType: "featureShowcase",\n blockName: "Feature: SEO",\n label: "Search Optimization",\n headline: "Rank on page one without the technical overhead",\n description: createParagraph(\n "Every directory comes with enterprise-grade SEO built-in. Structured data, dynamic sitemaps, and optimized meta tags ensure your listings get discovered by the right audience.",\n ),\n link: {\n type: "custom",\n label: "See SEO features",\n url: "/features",\n appearance: "default",\n },\n imagePosition: "right",\n features: [\n { text: "Automatic schema markup" },\n { text: "Dynamic XML sitemaps" },\n { text: "SEO-friendly URLs" },\n { text: "Social sharing optimization" },\n ],\n },\n\n // 7. Feature Showcase: Management (image left)\n {\n blockType: "featureShowcase",\n blockName: "Feature: Management",\n label: "Admin Dashboard",\n headline: "Manage everything from one powerful dashboard",\n description: createParagraph(\n "Review submissions, moderate content, track analytics, and manage payments all in one place. Built-in tools help you maintain quality while scaling your directory business.",\n ),\n link: {\n type: "custom",\n label: "Explore dashboard",\n url: "/features",\n appearance: "default",\n },\n imagePosition: "left",\n features: [\n { text: "Submission review queues" },\n { text: "Bulk moderation tools" },\n { text: "Real-time analytics" },\n { text: "User management" },\n ],\n },\n\n // 8. Industry Tabs - Bird-style tabbed use cases\n {\n blockType: "industryTabs",\n blockName: "Use Cases",\n heading: "Directories that turn data into intelligent experiences",\n subheading:\n "Whether you are building for local services or global marketplaces, DirectoryHub adapts to your model.",\n tabs: [\n {\n name: "Local Services",\n stat: "340%",\n statLabel: "Higher conversion with location-based discovery",\n description:\n "Plumbers, photographers, restaurants. Card grids with reviews, maps, and geo-filtering that help customers find exactly what they need.",\n link: {\n type: "custom",\n label: "Local directory solutions",\n url: "/templates",\n appearance: "default",\n },\n },\n {\n name: "B2B Vendor Hubs",\n stat: "94%",\n statLabel: "Faster vendor onboarding with smart filters",\n description:\n "SaaS tools, agencies, consultants. Advanced filters, comparison views, and lead capture that convert browsers into buyers.",\n link: {\n type: "custom",\n label: "B2B directory solutions",\n url: "/templates",\n appearance: "default",\n },\n },\n {\n name: "Communities",\n stat: "+12K",\n statLabel: "Members connected through curated networks",\n description:\n "Member directories, alumni networks, professional associations with gated access and rich member profiles.",\n link: {\n type: "custom",\n label: "Community solutions",\n url: "/templates",\n appearance: "default",\n },\n },\n {\n name: "Marketplaces",\n stat: "$2M+",\n statLabel: "Revenue processed through integrated payments",\n description:\n "Multi-vendor search, featured slots, automated payouts to sellers. Everything you need to run a thriving marketplace.",\n link: {\n type: "custom",\n label: "Marketplace solutions",\n url: "/templates",\n appearance: "default",\n },\n },\n ],\n },\n\n // 9. Testimonials Grid - Bird-style stats with photos\n {\n blockType: "testimonialsGrid",\n blockName: "Customer Stories",\n heading: "Trusted by founders who depend on their directories",\n subheading:\n "See how leading directory builders use DirectoryHub to drive intelligent growth.",\n testimonials: [\n {\n ...(testimonialImages[0] && { image: testimonialImages[0].id }),\n stat: "94%",\n statLabel: "Faster launch time",\n quote:\n "We went from idea to collecting payments in 3 days. The templates and Stripe integration saved us months of development time.",\n author: "Sarah Chen",\n company: "Northwind Market",\n },\n {\n ...(testimonialImages[1] && { image: testimonialImages[1].id }),\n stat: "+300%",\n statLabel: "Traffic growth",\n quote:\n "Our niche directory started ranking on page 1 within weeks. The structured data and sitemaps are handled automatically.",\n author: "Marcus Rivera",\n company: "Beacon Partners",\n },\n {\n ...(testimonialImages[2] && { image: testimonialImages[2].id }),\n stat: "161%",\n statLabel: "Revenue increase",\n quote:\n "Featured placements and premium tiers covered our costs in the first month. The monetization tools just work.",\n author: "David Kim",\n company: "Cascade Labs",\n },\n ],\n },\n\n // 10. Trust Columns - Bird-style two-column section\n {\n blockType: "trustColumns",\n blockName: "Trust & Security",\n columns: [\n {\n label: "Integrations",\n heading: "Connect anywhere",\n description:\n "Plug in and get started immediately with pre-built connectors for every major platform.",\n items: [\n { icon: "zap", text: "Go live in minutes" },\n { icon: "plug", text: "Pre-built connectors" },\n { icon: "database", text: "Complete data sync" },\n { icon: "cloud", text: "Cloud-native infrastructure" },\n ],\n },\n {\n label: "Security & Compliance",\n heading: "Enterprise-level security",\n description:\n "Keep your data private with encryption, granular access control, and compliance-ready infrastructure.",\n items: [\n { icon: "shield", text: "SOC 2-minded controls" },\n { icon: "lock", text: "Per-tenant data isolation" },\n { icon: "award", text: "Complete audit trails" },\n { icon: "globe", text: "GDPR-ready infrastructure" },\n ],\n },\n ],\n },\n\n // 11. Integrations Banner (KEEP)\n {\n blockType: "logoBanner",\n blockName: "Integrations",\n heading: "Powered by industry-leading technology",\n style: "grid",\n logos: [\n { name: "Stripe" },\n { name: "Vercel" },\n { name: "AWS" },\n { name: "Google Analytics" },\n { name: "Zapier" },\n { name: "Convex" },\n ],\n },\n\n // 12. Pricing (KEEP)\n {\n blockType: "pricingTable",\n blockName: "Pricing",\n heading: "Simple, transparent pricing",\n subheading: "Start free, upgrade as you grow. No hidden fees.",\n showComparisonTable: false,\n showViewAllLink: true,\n maxFeaturesOnCard: 4,\n plans: [\n {\n name: "Free",\n price: "$0/mo",\n description: "Perfect for getting started.",\n features: [\n { feature: "1 directory site", included: true },\n { feature: "Basic customization", included: true },\n { feature: "Community support", included: true },\n ],\n link: {\n type: "custom",\n label: "Get started free",\n url: "/sign-up",\n appearance: "outline",\n },\n },\n {\n name: "Pro",\n price: "$29/mo",\n description: "For growing businesses.",\n featured: true,\n features: [\n { feature: "5 directory sites", included: true },\n { feature: "Advanced customization", included: true },\n { feature: "Custom domains", included: true },\n { feature: "Priority support", included: true },\n ],\n link: {\n type: "custom",\n label: "Get Pro",\n url: "/sign-up",\n appearance: "default",\n },\n },\n {\n name: "Business",\n price: "$99/mo",\n description: "For teams and agencies.",\n features: [\n { feature: "Unlimited directory sites", included: true },\n { feature: "White-label branding", included: true },\n { feature: "API access", included: true },\n { feature: "Dedicated support", included: true },\n ],\n link: {\n type: "custom",\n label: "Get Business",\n url: "/sign-up",\n appearance: "outline",\n },\n },\n ],\n },\n\n // 13. Final CTA - Bird-style full-width with background\n {\n blockType: "finalCta",\n blockName: "Final CTA",\n headline: "The complete platform that scales with your directory business",\n subheading:\n "Join hundreds of founders who chose the faster path to a profitable directory business. Start free, upgrade as you grow.",\n style: "dark",\n links: [\n {\n link: {\n type: "custom",\n appearance: "outline",\n label: "Get started",\n url: "/sign-up",\n },\n },\n {\n link: {\n type: "custom",\n appearance: "default",\n label: "Book a demo",\n url: "/contact",\n },\n },\n ],\n },\n ],\n meta: {\n description:\n "Launch a profitable directory business in minutes with built-in payments, SEO, and automation. Free to start.",\n title: "DirectoryHub \u2014 Launch revenue-first directories fast",\n },\n title: "Home",\n }\n}\n',
5122
- "marketing/payload/src/endpoints/seed/directoryhub/index.ts": 'import * as fs from "node:fs"\nimport * as path from "node:path"\nimport type { CollectionSlug, File, Payload, PayloadRequest } from "payload"\n\nimport { directoryHubAbout } from "./about"\nimport { faqData } from "./faqs"\nimport {\n automationPage,\n customFieldsPage,\n dashboardPage,\n monetizationPage,\n seoPage,\n templatesPage,\n} from "./features"\nimport { directoryHubHome } from "./home"\nimport { blogPosts } from "./posts"\nimport { directoryHubPricing } from "./pricing"\nimport { directoryHubPrivacy } from "./privacy"\nimport { directoryHubTerms } from "./terms"\nimport {\n b2bVendorHubsPage,\n communitiesPage,\n localServicesPage,\n marketplacesPage,\n} from "./use-cases"\n\nconst collections: CollectionSlug[] = [\n "categories",\n "media",\n "pages",\n "posts",\n "forms",\n "form-submissions",\n "search",\n "faqs",\n]\n\nconst categories = [\n { title: "Business", slug: "business" },\n { title: "Technology", slug: "technology" },\n { title: "News", slug: "news" },\n { title: "Guides", slug: "guides" },\n]\n\n// Contact form configuration for DirectoryHub\nconst contactFormData = {\n title: "Contact Form",\n confirmationMessage: {\n root: {\n type: "root",\n children: [\n {\n type: "paragraph",\n children: [\n {\n type: "text",\n detail: 0,\n format: 0,\n mode: "normal",\n style: "",\n text: "Thanks for reaching out! We\'ll get back to you within 24 hours.",\n version: 1,\n },\n ],\n direction: "ltr" as const,\n format: "" as const,\n indent: 0,\n textFormat: 0,\n version: 1,\n },\n ],\n direction: "ltr" as const,\n format: "" as const,\n indent: 0,\n version: 1,\n },\n },\n confirmationType: "message" as const,\n fields: [\n {\n name: "name",\n label: "Name",\n required: true,\n blockType: "text" as const,\n },\n {\n name: "email",\n label: "Email",\n required: true,\n blockType: "email" as const,\n },\n {\n name: "subject",\n label: "Subject",\n required: false,\n blockType: "text" as const,\n },\n {\n name: "message",\n label: "Message",\n required: true,\n blockType: "textarea" as const,\n },\n ],\n submitButtonLabel: "Send Message",\n}\n\nexport const seedDirectoryHub = async ({\n payload,\n req,\n}: {\n payload: Payload\n req: PayloadRequest\n}): Promise<void> => {\n payload.logger.info("Seeding DirectoryHub database...")\n\n // Clear collections and globals\n payload.logger.info("\u2014 Clearing collections and globals...")\n\n // Clear header\n await payload.updateGlobal({\n slug: "header",\n data: {\n navItems: [],\n },\n depth: 0,\n context: {\n disableRevalidate: true,\n },\n })\n\n // Clear footer with new structure\n await payload.updateGlobal({\n slug: "footer",\n data: {\n columns: [],\n socialLinks: {},\n newsletter: { enabled: false },\n copyrightText: "",\n bottomLinks: [],\n },\n depth: 0,\n context: {\n disableRevalidate: true,\n },\n })\n\n // Delete collections sequentially to avoid database deadlocks\n for (const collection of collections) {\n if (payload.collections[collection]) {\n try {\n await payload.db.deleteMany({ collection, req, where: {} })\n } catch (error) {\n payload.logger.warn(`Warning: Could not clear ${collection}: ${error}`)\n }\n }\n }\n\n // Delete versions sequentially\n for (const collection of collections) {\n if (payload.collections[collection]?.config?.versions) {\n try {\n await payload.db.deleteVersions({ collection, req, where: {} })\n } catch (error) {\n payload.logger.warn(`Warning: Could not clear ${collection} versions: ${error}`)\n }\n }\n }\n\n payload.logger.info("\u2014 Seeding demo author...")\n\n await payload.delete({\n collection: "users",\n depth: 0,\n where: {\n email: {\n equals: "demo-author@example.com",\n },\n },\n })\n\n const _demoAuthor = await payload.create({\n collection: "users",\n data: {\n name: "DirectoryHub Team",\n email: "demo-author@example.com",\n password: "password",\n },\n })\n\n // Seed categories\n payload.logger.info("\u2014 Seeding categories...")\n\n const categoryDocs = await Promise.all(\n categories.map((category) =>\n payload.create({\n collection: "categories",\n data: {\n title: category.title,\n slug: category.slug,\n },\n }),\n ),\n )\n\n // Seed FAQs\n payload.logger.info("\u2014 Seeding FAQs...")\n\n const faqDocs = await Promise.all(\n faqData.map((faq) =>\n payload.create({\n collection: "faqs",\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: faq as any,\n }),\n ),\n )\n\n payload.logger.info(`\u2014 Seeded ${faqDocs.length} FAQs`)\n\n // Upload hero dashboard image\n payload.logger.info("\u2014 Uploading hero media...")\n\n let heroImageDoc = null\n try {\n const heroImagePath = path.join(process.cwd(), "public/media/hero-dashboard.png")\n if (fs.existsSync(heroImagePath)) {\n const heroImageBuffer = fs.readFileSync(heroImagePath)\n const heroImageFile: File = {\n name: "hero-dashboard.png",\n data: heroImageBuffer,\n mimetype: "image/png",\n size: heroImageBuffer.byteLength,\n }\n heroImageDoc = await payload.create({\n collection: "media",\n data: {\n alt: "DirectoryHub Dashboard - Manage directories, track usage, and configure settings",\n },\n file: heroImageFile,\n })\n payload.logger.info("\u2014 Hero image uploaded successfully")\n } else {\n payload.logger.info("\u2014 Hero image not found, using animated mockup fallback")\n }\n } catch (_error) {\n payload.logger.info("\u2014 Error uploading hero image, using animated mockup fallback")\n }\n\n // Upload testimonial images\n payload.logger.info("\u2014 Uploading testimonial images...")\n\n const testimonialImages: (typeof heroImageDoc)[] = []\n const testimonialImageFiles = [\n { name: "testimonial-1.jpg", alt: "Professional woman entrepreneur" },\n { name: "testimonial-2.jpg", alt: "Business professional reviewing analytics" },\n { name: "testimonial-3.jpg", alt: "Team collaboration meeting" },\n ]\n\n for (const imgData of testimonialImageFiles) {\n try {\n const imagePath = path.join(process.cwd(), `public/media/${imgData.name}`)\n if (fs.existsSync(imagePath)) {\n const imageBuffer = fs.readFileSync(imagePath)\n const imageFile: File = {\n name: imgData.name,\n data: imageBuffer,\n mimetype: "image/jpeg",\n size: imageBuffer.byteLength,\n }\n const imageDoc = await payload.create({\n collection: "media",\n data: {\n alt: imgData.alt,\n },\n file: imageFile,\n })\n testimonialImages.push(imageDoc)\n }\n } catch (_error) {\n payload.logger.info(`\u2014 Error uploading ${imgData.name}`)\n }\n }\n payload.logger.info(`\u2014 Uploaded ${testimonialImages.length} testimonial images`)\n\n payload.logger.info("\u2014 Seeding contact form...")\n\n const contactForm = await payload.create({\n collection: "forms",\n depth: 0,\n data: contactFormData,\n })\n\n payload.logger.info("\u2014 Seeding pages...")\n\n // Seed main pages\n const [homePage, pricingPage, aboutPage, privacyPage, termsPage] = await Promise.all([\n payload.create({\n collection: "pages",\n depth: 0,\n context: {\n disableRevalidate: true,\n },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: directoryHubHome({ heroImage: heroImageDoc, testimonialImages }) as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: {\n disableRevalidate: true,\n },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: directoryHubPricing() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: {\n disableRevalidate: true,\n },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: directoryHubAbout({ contactForm }) as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: {\n disableRevalidate: true,\n },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: directoryHubPrivacy() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: {\n disableRevalidate: true,\n },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: directoryHubTerms() as any,\n }),\n ])\n\n // Seed feature pages\n payload.logger.info("\u2014 Seeding feature pages...")\n\n const featurePages = await Promise.all([\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: templatesPage() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: monetizationPage() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: seoPage() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: dashboardPage() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: automationPage() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: customFieldsPage() as any,\n }),\n ])\n\n payload.logger.info(`\u2014 Seeded ${featurePages.length} feature pages`)\n\n // Seed use case pages\n payload.logger.info("\u2014 Seeding use case pages...")\n\n const useCasePages = await Promise.all([\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: localServicesPage() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: b2bVendorHubsPage() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: communitiesPage() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: marketplacesPage() as any,\n }),\n ])\n\n payload.logger.info(`\u2014 Seeded ${useCasePages.length} use case pages`)\n\n // Seed blog posts\n payload.logger.info("\u2014 Seeding blog posts...")\n\n const posts = blogPosts(categoryDocs)\n const createdPosts = await Promise.all(\n posts.map((post) =>\n payload.create({\n collection: "posts",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: post as any,\n }),\n ),\n )\n\n payload.logger.info(`\u2014 Seeded ${createdPosts.length} blog posts`)\n\n payload.logger.info("\u2014 Seeding globals...")\n\n await Promise.all([\n payload.updateGlobal({\n slug: "header",\n data: {\n navItems: [\n {\n type: "megaMenu",\n label: "Product",\n megaMenuColumns: [\n {\n columnLabel: "Features",\n items: [\n {\n label: "Templates",\n description: "Beautiful, ready-to-use directory templates",\n icon: "layout",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: featurePages[0].id,\n },\n },\n },\n {\n label: "Monetization",\n description: "Built-in payments and subscriptions",\n icon: "dollarSign",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: featurePages[1].id,\n },\n },\n },\n {\n label: "SEO",\n description: "Schema markup and optimizations",\n icon: "search",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: featurePages[2].id,\n },\n },\n },\n ],\n },\n {\n columnLabel: "Tools",\n items: [\n {\n label: "Dashboard",\n description: "Powerful admin and analytics",\n icon: "barChart",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: featurePages[3].id,\n },\n },\n },\n {\n label: "Automation",\n description: "Smart workflows and actions",\n icon: "zap",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: featurePages[4].id,\n },\n },\n },\n {\n label: "Custom Fields",\n description: "Flexible schemas for any niche",\n icon: "layers",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: featurePages[5].id,\n },\n },\n },\n ],\n },\n ],\n },\n {\n type: "megaMenu",\n label: "Use Cases",\n megaMenuColumns: [\n {\n columnLabel: "Directory Types",\n items: [\n {\n label: "Local Services",\n description: "Plumbers, restaurants, photographers",\n icon: "globe",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: useCasePages[0].id,\n },\n },\n },\n {\n label: "B2B Vendor Hubs",\n description: "SaaS tools, agencies, consultants",\n icon: "building",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: useCasePages[1].id,\n },\n },\n },\n {\n label: "Communities",\n description: "Member directories, alumni networks",\n icon: "users",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: useCasePages[2].id,\n },\n },\n },\n {\n label: "Marketplaces",\n description: "Multi-vendor platforms",\n icon: "store",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: useCasePages[3].id,\n },\n },\n },\n ],\n },\n ],\n },\n {\n type: "link",\n label: "Pricing",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: pricingPage.id,\n },\n },\n },\n {\n type: "link",\n label: "Blog",\n link: {\n type: "custom",\n url: "/posts",\n },\n },\n {\n type: "link",\n label: "Sign In",\n link: {\n type: "custom",\n url: "/sign-in",\n },\n },\n {\n type: "link",\n label: "Get Started",\n link: {\n type: "custom",\n url: "/sign-up",\n },\n },\n ],\n },\n }),\n payload.updateGlobal({\n slug: "footer",\n data: {\n columns: [\n {\n title: "Product",\n links: [\n {\n link: {\n type: "reference",\n label: "Home",\n reference: {\n relationTo: "pages",\n value: homePage.id,\n },\n },\n },\n {\n link: {\n type: "reference",\n label: "Pricing",\n reference: {\n relationTo: "pages",\n value: pricingPage.id,\n },\n },\n },\n {\n link: {\n type: "reference",\n label: "Templates",\n reference: {\n relationTo: "pages",\n value: featurePages[0].id,\n },\n },\n },\n ],\n },\n {\n title: "Resources",\n links: [\n {\n link: {\n type: "custom",\n label: "Blog",\n url: "/posts",\n },\n },\n {\n link: {\n type: "custom",\n label: "Documentation",\n url: "/docs",\n },\n },\n ],\n },\n {\n title: "Company",\n links: [\n {\n link: {\n type: "reference",\n label: "About",\n reference: {\n relationTo: "pages",\n value: aboutPage.id,\n },\n },\n },\n ],\n },\n {\n title: "Legal",\n links: [\n {\n link: {\n type: "reference",\n label: "Privacy",\n reference: {\n relationTo: "pages",\n value: privacyPage.id,\n },\n },\n },\n {\n link: {\n type: "reference",\n label: "Terms",\n reference: {\n relationTo: "pages",\n value: termsPage.id,\n },\n },\n },\n ],\n },\n ],\n socialLinks: {\n twitter: "https://x.com/directoryhub",\n linkedin: "https://linkedin.com/company/directoryhub",\n github: "https://github.com/directoryhub",\n },\n newsletter: {\n enabled: true,\n title: "Newsletter",\n description: "Stay up to date with DirectoryHub through weekly updates to your inbox.",\n buttonText: "Subscribe",\n placeholder: "Enter your email",\n },\n copyrightText: "DirectoryHub",\n bottomLinks: [\n {\n link: {\n type: "custom",\n label: "Contact Support",\n url: "/support",\n },\n },\n ],\n },\n }),\n ])\n\n payload.logger.info("DirectoryHub database seeded successfully!")\n}\n',
5122
+ "marketing/payload/src/endpoints/seed/directoryhub/index.ts": 'import * as fs from "node:fs"\nimport * as path from "node:path"\nimport type { CollectionSlug, File, Payload, PayloadRequest } from "payload"\n\nimport { directoryHubAbout } from "./about"\nimport { faqData } from "./faqs"\nimport {\n automationPage,\n customFieldsPage,\n dashboardPage,\n monetizationPage,\n seoPage,\n templatesPage,\n} from "./features"\nimport { directoryHubHome } from "./home"\nimport { blogPosts } from "./posts"\nimport { directoryHubPricing } from "./pricing"\nimport { directoryHubPrivacy } from "./privacy"\nimport { directoryHubTerms } from "./terms"\nimport {\n b2bVendorHubsPage,\n communitiesPage,\n localServicesPage,\n marketplacesPage,\n} from "./use-cases"\n\nconst collections: CollectionSlug[] = [\n "categories",\n "media",\n "pages",\n "posts",\n "forms",\n "form-submissions",\n "search",\n "faqs",\n]\n\nconst categories = [\n { title: "Business", slug: "business" },\n { title: "Technology", slug: "technology" },\n { title: "News", slug: "news" },\n { title: "Guides", slug: "guides" },\n]\n\n// Contact form configuration for DirectoryHub\nconst contactFormData = {\n title: "Contact Form",\n confirmationMessage: {\n root: {\n type: "root",\n children: [\n {\n type: "paragraph",\n children: [\n {\n type: "text",\n detail: 0,\n format: 0,\n mode: "normal",\n style: "",\n text: "Thanks for reaching out! We\'ll get back to you within 24 hours.",\n version: 1,\n },\n ],\n direction: "ltr" as const,\n format: "" as const,\n indent: 0,\n textFormat: 0,\n version: 1,\n },\n ],\n direction: "ltr" as const,\n format: "" as const,\n indent: 0,\n version: 1,\n },\n },\n confirmationType: "message" as const,\n fields: [\n {\n name: "name",\n label: "Name",\n required: true,\n blockType: "text" as const,\n },\n {\n name: "email",\n label: "Email",\n required: true,\n blockType: "email" as const,\n },\n {\n name: "subject",\n label: "Subject",\n required: false,\n blockType: "text" as const,\n },\n {\n name: "message",\n label: "Message",\n required: true,\n blockType: "textarea" as const,\n },\n ],\n submitButtonLabel: "Send Message",\n}\n\nexport const seedDirectoryHub = async ({\n payload,\n req,\n}: {\n payload: Payload\n req: PayloadRequest\n}): Promise<void> => {\n payload.logger.info("Seeding DirectoryHub database...")\n\n // Clear collections and globals\n payload.logger.info("\u2014 Clearing collections and globals...")\n\n // Clear header\n await payload.updateGlobal({\n slug: "header",\n data: {\n navItems: [],\n },\n depth: 0,\n context: {\n disableRevalidate: true,\n },\n })\n\n // Clear footer with new structure\n await payload.updateGlobal({\n slug: "footer",\n data: {\n columns: [],\n socialLinks: {},\n newsletter: { enabled: false },\n copyrightText: "",\n bottomLinks: [],\n },\n depth: 0,\n context: {\n disableRevalidate: true,\n },\n })\n\n // Delete collections sequentially to avoid database deadlocks\n for (const collection of collections) {\n if (payload.collections[collection]) {\n try {\n await payload.db.deleteMany({ collection, req, where: {} })\n } catch (error) {\n payload.logger.warn(`Warning: Could not clear ${collection}: ${error}`)\n }\n }\n }\n\n // Delete versions sequentially\n for (const collection of collections) {\n if (payload.collections[collection]?.config?.versions) {\n try {\n await payload.db.deleteVersions({ collection, req, where: {} })\n } catch (error) {\n payload.logger.warn(`Warning: Could not clear ${collection} versions: ${error}`)\n }\n }\n }\n\n payload.logger.info("\u2014 Seeding demo author...")\n\n await payload.delete({\n collection: "users",\n depth: 0,\n where: {\n email: {\n equals: "demo-author@example.com",\n },\n },\n })\n\n const _demoAuthor = await payload.create({\n collection: "users",\n data: {\n name: "DirectoryHub Team",\n email: "demo-author@example.com",\n password: "password",\n },\n })\n\n // Seed categories\n payload.logger.info("\u2014 Seeding categories...")\n\n const categoryDocs = await Promise.all(\n categories.map((category) =>\n payload.create({\n collection: "categories",\n data: {\n title: category.title,\n slug: category.slug,\n },\n }),\n ),\n )\n\n // Seed FAQs\n payload.logger.info("\u2014 Seeding FAQs...")\n\n const faqDocs = await Promise.all(\n faqData.map((faq) =>\n payload.create({\n collection: "faqs",\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: faq as any,\n }),\n ),\n )\n\n payload.logger.info(`\u2014 Seeded ${faqDocs.length} FAQs`)\n\n // Upload hero dashboard image\n payload.logger.info("\u2014 Uploading hero media...")\n\n let heroImageDoc = null\n try {\n const heroImagePath = path.join(process.cwd(), "public/media/hero-dashboard.png")\n if (fs.existsSync(heroImagePath)) {\n const heroImageBuffer = fs.readFileSync(heroImagePath)\n const heroImageFile: File = {\n name: "hero-dashboard.png",\n data: heroImageBuffer,\n mimetype: "image/png",\n size: heroImageBuffer.byteLength,\n }\n heroImageDoc = await payload.create({\n collection: "media",\n data: {\n alt: "DirectoryHub Dashboard - Manage directories, track usage, and configure settings",\n },\n file: heroImageFile,\n })\n payload.logger.info("\u2014 Hero image uploaded successfully")\n } else {\n payload.logger.info("\u2014 Hero image not found, using animated mockup fallback")\n }\n } catch (_error) {\n payload.logger.info("\u2014 Error uploading hero image, using animated mockup fallback")\n }\n\n // Upload testimonial images\n payload.logger.info("\u2014 Uploading testimonial images...")\n\n const testimonialImages: (typeof heroImageDoc)[] = []\n const testimonialImageFiles = [\n { name: "testimonial-1.jpg", alt: "Professional woman entrepreneur" },\n { name: "testimonial-2.jpg", alt: "Business professional reviewing analytics" },\n { name: "testimonial-3.jpg", alt: "Team collaboration meeting" },\n ]\n\n for (const imgData of testimonialImageFiles) {\n try {\n const imagePath = path.join(process.cwd(), `public/media/${imgData.name}`)\n if (fs.existsSync(imagePath)) {\n const imageBuffer = fs.readFileSync(imagePath)\n const imageFile: File = {\n name: imgData.name,\n data: imageBuffer,\n mimetype: "image/jpeg",\n size: imageBuffer.byteLength,\n }\n const imageDoc = await payload.create({\n collection: "media",\n data: {\n alt: imgData.alt,\n },\n file: imageFile,\n })\n testimonialImages.push(imageDoc)\n }\n } catch (_error) {\n payload.logger.info(`\u2014 Error uploading ${imgData.name}`)\n }\n }\n payload.logger.info(`\u2014 Uploaded ${testimonialImages.length} testimonial images`)\n\n payload.logger.info("\u2014 Seeding contact form...")\n\n const contactForm = await payload.create({\n collection: "forms",\n depth: 0,\n data: contactFormData,\n })\n\n payload.logger.info("\u2014 Seeding pages...")\n\n // Seed main pages\n const [homePage, pricingPage, aboutPage, privacyPage, termsPage] = await Promise.all([\n payload.create({\n collection: "pages",\n depth: 0,\n context: {\n disableRevalidate: true,\n },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: directoryHubHome({ heroImage: heroImageDoc, testimonialImages }) as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: {\n disableRevalidate: true,\n },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: directoryHubPricing() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: {\n disableRevalidate: true,\n },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: directoryHubAbout({ contactForm }) as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: {\n disableRevalidate: true,\n },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: directoryHubPrivacy() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: {\n disableRevalidate: true,\n },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: directoryHubTerms() as any,\n }),\n ])\n\n // Seed feature pages\n payload.logger.info("\u2014 Seeding feature pages...")\n\n const featurePages = await Promise.all([\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: templatesPage() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: monetizationPage() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: seoPage() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: dashboardPage() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: automationPage() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: customFieldsPage() as any,\n }),\n ])\n\n payload.logger.info(`\u2014 Seeded ${featurePages.length} feature pages`)\n\n // Seed use case pages\n payload.logger.info("\u2014 Seeding use case pages...")\n\n const useCasePages = await Promise.all([\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: localServicesPage() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: b2bVendorHubsPage() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: communitiesPage() as any,\n }),\n payload.create({\n collection: "pages",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: marketplacesPage() as any,\n }),\n ])\n\n payload.logger.info(`\u2014 Seeded ${useCasePages.length} use case pages`)\n\n // Seed blog posts\n payload.logger.info("\u2014 Seeding blog posts...")\n\n const posts = blogPosts(categoryDocs)\n const createdPosts = await Promise.all(\n posts.map((post) =>\n payload.create({\n collection: "posts",\n depth: 0,\n context: { disableRevalidate: true },\n // biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n data: post as any,\n }),\n ),\n )\n\n payload.logger.info(`\u2014 Seeded ${createdPosts.length} blog posts`)\n\n payload.logger.info("\u2014 Seeding globals...")\n\n await Promise.all([\n payload.updateGlobal({\n slug: "header",\n context: {\n disableRevalidate: true,\n },\n data: {\n navItems: [\n {\n type: "megaMenu",\n label: "Product",\n megaMenuColumns: [\n {\n columnLabel: "Features",\n items: [\n {\n label: "Templates",\n description: "Beautiful, ready-to-use directory templates",\n icon: "layout",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: featurePages[0].id,\n },\n },\n },\n {\n label: "Monetization",\n description: "Built-in payments and subscriptions",\n icon: "dollarSign",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: featurePages[1].id,\n },\n },\n },\n {\n label: "SEO",\n description: "Schema markup and optimizations",\n icon: "search",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: featurePages[2].id,\n },\n },\n },\n ],\n },\n {\n columnLabel: "Tools",\n items: [\n {\n label: "Dashboard",\n description: "Powerful admin and analytics",\n icon: "barChart",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: featurePages[3].id,\n },\n },\n },\n {\n label: "Automation",\n description: "Smart workflows and actions",\n icon: "zap",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: featurePages[4].id,\n },\n },\n },\n {\n label: "Custom Fields",\n description: "Flexible schemas for any niche",\n icon: "layers",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: featurePages[5].id,\n },\n },\n },\n ],\n },\n ],\n },\n {\n type: "megaMenu",\n label: "Use Cases",\n megaMenuColumns: [\n {\n columnLabel: "Directory Types",\n items: [\n {\n label: "Local Services",\n description: "Plumbers, restaurants, photographers",\n icon: "globe",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: useCasePages[0].id,\n },\n },\n },\n {\n label: "B2B Vendor Hubs",\n description: "SaaS tools, agencies, consultants",\n icon: "building",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: useCasePages[1].id,\n },\n },\n },\n {\n label: "Communities",\n description: "Member directories, alumni networks",\n icon: "users",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: useCasePages[2].id,\n },\n },\n },\n {\n label: "Marketplaces",\n description: "Multi-vendor platforms",\n icon: "store",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: useCasePages[3].id,\n },\n },\n },\n ],\n },\n ],\n },\n {\n type: "link",\n label: "Pricing",\n link: {\n type: "reference",\n reference: {\n relationTo: "pages",\n value: pricingPage.id,\n },\n },\n },\n {\n type: "link",\n label: "Blog",\n link: {\n type: "custom",\n url: "/posts",\n },\n },\n {\n type: "link",\n label: "Sign In",\n link: {\n type: "custom",\n url: "/sign-in",\n },\n },\n {\n type: "link",\n label: "Get Started",\n link: {\n type: "custom",\n url: "/sign-up",\n },\n },\n ],\n },\n }),\n payload.updateGlobal({\n slug: "footer",\n context: {\n disableRevalidate: true,\n },\n data: {\n columns: [\n {\n title: "Product",\n links: [\n {\n link: {\n type: "reference",\n label: "Home",\n reference: {\n relationTo: "pages",\n value: homePage.id,\n },\n },\n },\n {\n link: {\n type: "reference",\n label: "Pricing",\n reference: {\n relationTo: "pages",\n value: pricingPage.id,\n },\n },\n },\n {\n link: {\n type: "reference",\n label: "Templates",\n reference: {\n relationTo: "pages",\n value: featurePages[0].id,\n },\n },\n },\n ],\n },\n {\n title: "Resources",\n links: [\n {\n link: {\n type: "custom",\n label: "Blog",\n url: "/posts",\n },\n },\n {\n link: {\n type: "custom",\n label: "Documentation",\n url: "/docs",\n },\n },\n ],\n },\n {\n title: "Company",\n links: [\n {\n link: {\n type: "reference",\n label: "About",\n reference: {\n relationTo: "pages",\n value: aboutPage.id,\n },\n },\n },\n ],\n },\n {\n title: "Legal",\n links: [\n {\n link: {\n type: "reference",\n label: "Privacy",\n reference: {\n relationTo: "pages",\n value: privacyPage.id,\n },\n },\n },\n {\n link: {\n type: "reference",\n label: "Terms",\n reference: {\n relationTo: "pages",\n value: termsPage.id,\n },\n },\n },\n ],\n },\n ],\n socialLinks: {\n twitter: "https://x.com/directoryhub",\n linkedin: "https://linkedin.com/company/directoryhub",\n github: "https://github.com/directoryhub",\n },\n newsletter: {\n enabled: true,\n title: "Newsletter",\n description: "Stay up to date with DirectoryHub through weekly updates to your inbox.",\n buttonText: "Subscribe",\n placeholder: "Enter your email",\n },\n copyrightText: "DirectoryHub",\n bottomLinks: [\n {\n link: {\n type: "custom",\n label: "Contact Support",\n url: "/support",\n },\n },\n ],\n },\n }),\n ])\n\n payload.logger.info("DirectoryHub database seeded successfully!")\n}\n',
5123
5123
  "marketing/payload/src/endpoints/seed/directoryhub/posts.ts": `import type { Category, Post } from "@/payload-types"
5124
5124
  import { createRichText } from "./richtext-helper"
5125
5125
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kofi-stack-template-generator",
3
- "version": "2.1.44",
3
+ "version": "2.1.45",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -17,7 +17,7 @@
17
17
  "typecheck": "tsc --noEmit"
18
18
  },
19
19
  "dependencies": {
20
- "kofi-stack-types": "^2.1.44",
20
+ "kofi-stack-types": "^2.1.45",
21
21
  "handlebars": "^4.7.8",
22
22
  "memfs": "^4.9.0"
23
23
  },
@@ -1,6 +1,6 @@
1
1
  // Auto-generated file. Do not edit manually.
2
2
  // Run 'pnpm prebuild' to regenerate.
3
- // Generated: 2026-01-19T03:06:07.098Z
3
+ // Generated: 2026-01-19T03:17:05.993Z
4
4
  // Template count: 339
5
5
 
6
6
  export const EMBEDDED_TEMPLATES: Record<string, string> = {
@@ -221,7 +221,7 @@ export const EMBEDDED_TEMPLATES: Record<string, string> = {
221
221
  "marketing/payload/src/endpoints/seed/directoryhub/features/seo.ts": "import type { Page } from \"@/payload-types\"\nimport { createParagraph } from \"../richtext-helper\"\n\nexport const seoPage = (): Partial<Page> => {\n\treturn {\n\t\tslug: \"features/seo\",\n\t\t_status: \"published\",\n\t\ttitle: \"SEO Optimization\",\n\t\thero: {\n\t\t\ttype: \"lowImpact\",\n\t\t\trichText: {\n\t\t\t\troot: {\n\t\t\t\t\ttype: \"root\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"heading\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\ttext: \"Rank on page one without the technical overhead\",\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\ttag: \"h1\",\n\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\ttext: \"Enterprise-grade SEO built into every directory. Structured data, dynamic sitemaps, and optimized meta tags work automatically so your listings get discovered.\",\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\tindent: 0,\n\t\t\t\t\tversion: 1,\n\t\t\t\t},\n\t\t\t},\n\t\t\tlinks: [\n\t\t\t\t{\n\t\t\t\t\tlink: {\n\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\tappearance: \"default\",\n\t\t\t\t\t\tlabel: \"Start ranking\",\n\t\t\t\t\t\turl: \"/sign-up\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlink: {\n\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\tappearance: \"outline\",\n\t\t\t\t\t\tlabel: \"See SEO features\",\n\t\t\t\t\t\turl: \"/features\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tlayout: [\n\t\t\t{\n\t\t\t\tblockType: \"featureShowcase\",\n\t\t\t\tblockName: \"Structured Data\",\n\t\t\t\tlabel: \"Schema Markup\",\n\t\t\t\theadline: \"Automatic schema markup for rich results\",\n\t\t\t\tdescription: createParagraph(\n\t\t\t\t\t\"Every listing gets proper schema.org markup automatically. Local businesses, organizations, products, and services are all structured for Google's rich results and knowledge panels.\",\n\t\t\t\t),\n\t\t\t\tlink: {\n\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\tlabel: \"Learn about structured data\",\n\t\t\t\t\turl: \"/features\",\n\t\t\t\t\tappearance: \"default\",\n\t\t\t\t},\n\t\t\t\timagePosition: \"right\",\n\t\t\t\tfeatures: [\n\t\t\t\t\t{ text: \"LocalBusiness schema for local directories\" },\n\t\t\t\t\t{ text: \"Organization schema for B2B\" },\n\t\t\t\t\t{ text: \"Product schema for marketplaces\" },\n\t\t\t\t\t{ text: \"Rich snippets in search results\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tblockType: \"featureShowcase\",\n\t\t\t\tblockName: \"Sitemaps\",\n\t\t\t\tlabel: \"Dynamic Sitemaps\",\n\t\t\t\theadline: \"Sitemaps that update automatically\",\n\t\t\t\tdescription: createParagraph(\n\t\t\t\t\t\"XML sitemaps are generated and updated automatically as listings are added or changed. Google and other search engines always know about your latest content.\",\n\t\t\t\t),\n\t\t\t\tlink: {\n\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\tlabel: \"Explore sitemap features\",\n\t\t\t\t\turl: \"/features\",\n\t\t\t\t\tappearance: \"default\",\n\t\t\t\t},\n\t\t\t\timagePosition: \"left\",\n\t\t\t\tfeatures: [\n\t\t\t\t\t{ text: \"Auto-generated XML sitemaps\" },\n\t\t\t\t\t{ text: \"Real-time updates\" },\n\t\t\t\t\t{ text: \"Priority and frequency hints\" },\n\t\t\t\t\t{ text: \"Automatic search engine ping\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tblockType: \"featureShowcase\",\n\t\t\t\tblockName: \"Meta Tags\",\n\t\t\t\tlabel: \"Meta Optimization\",\n\t\t\t\theadline: \"Optimized meta tags for every page\",\n\t\t\t\tdescription: createParagraph(\n\t\t\t\t\t\"Custom meta titles, descriptions, and Open Graph tags for every listing and category. Social sharing previews look great and drive more clicks from search and social.\",\n\t\t\t\t),\n\t\t\t\tlink: {\n\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\tlabel: \"See meta features\",\n\t\t\t\t\turl: \"/features\",\n\t\t\t\t\tappearance: \"default\",\n\t\t\t\t},\n\t\t\t\timagePosition: \"right\",\n\t\t\t\tfeatures: [\n\t\t\t\t\t{ text: \"Custom meta titles and descriptions\" },\n\t\t\t\t\t{ text: \"Open Graph tags for social sharing\" },\n\t\t\t\t\t{ text: \"Twitter Card support\" },\n\t\t\t\t\t{ text: \"Canonical URLs to prevent duplicates\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tblockType: \"bentoFeatures\",\n\t\t\t\tblockName: \"SEO Features\",\n\t\t\t\theading: \"Built-in SEO that works\",\n\t\t\t\tsubheading: \"Technical SEO handled automatically so you can focus on content\",\n\t\t\t\tfeatures: [\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"gradient\",\n\t\t\t\t\t\ticon: \"search\",\n\t\t\t\t\t\tstat: \"100%\",\n\t\t\t\t\t\ttitle: \"SEO Coverage\",\n\t\t\t\t\t\tdescription: createParagraph(\"Every page optimized automatically.\"),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"accent\",\n\t\t\t\t\t\ticon: \"zap\",\n\t\t\t\t\t\ttitle: \"Fast Loading\",\n\t\t\t\t\t\tdescription: createParagraph(\"Core Web Vitals optimized out of the box.\"),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"globe\",\n\t\t\t\t\t\ttitle: \"Clean URLs\",\n\t\t\t\t\t\tdescription: createParagraph(\"SEO-friendly URL structure.\"),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"primary\",\n\t\t\t\t\t\ticon: \"layout\",\n\t\t\t\t\t\ttitle: \"Mobile First\",\n\t\t\t\t\t\tdescription: createParagraph(\"Mobile-optimized for Google's mobile-first indexing.\"),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"database\",\n\t\t\t\t\t\ttitle: \"Crawl Efficient\",\n\t\t\t\t\t\tdescription: createParagraph(\"Optimized for search engine crawlers.\"),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"barChart\",\n\t\t\t\t\t\ttitle: \"Analytics Ready\",\n\t\t\t\t\t\tdescription: createParagraph(\"Track rankings and organic traffic.\"),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tblockType: \"proofBanner\",\n\t\t\t\tblockName: \"CTA Section\",\n\t\t\t\tstyle: \"centered\",\n\t\t\t\theadline: \"Get discovered by the right audience\",\n\t\t\t\tsubtext: \"Every directory comes with enterprise-grade SEO. No plugins, no configuration.\",\n\t\t\t\tlinks: [\n\t\t\t\t\t{\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tappearance: \"default\",\n\t\t\t\t\t\t\tlabel: \"Start for free\",\n\t\t\t\t\t\t\turl: \"/sign-up\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tappearance: \"outline\",\n\t\t\t\t\t\t\tlabel: \"See all features\",\n\t\t\t\t\t\t\turl: \"/features\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t\tmeta: {\n\t\t\tdescription:\n\t\t\t\t\"Built-in SEO features including automatic schema markup, dynamic sitemaps, and optimized meta tags. Get your directory listings ranking on Google.\",\n\t\t\ttitle: \"SEO Features — DirectoryHub Search Optimization\",\n\t\t},\n\t}\n}\n",
222
222
  "marketing/payload/src/endpoints/seed/directoryhub/features/templates.ts": "import type { Page } from \"@/payload-types\"\nimport { createParagraph } from \"../richtext-helper\"\n\nexport const templatesPage = (): Partial<Page> => {\n\treturn {\n\t\tslug: \"features/templates\",\n\t\t_status: \"published\",\n\t\ttitle: \"Directory Templates\",\n\t\thero: {\n\t\t\ttype: \"lowImpact\",\n\t\t\trichText: {\n\t\t\t\troot: {\n\t\t\t\t\ttype: \"root\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"heading\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\ttext: \"Launch your directory in days, not months\",\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\ttag: \"h1\",\n\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\ttext: \"Choose from professionally designed directory templates, customize to match your brand, and go live instantly. No coding required.\",\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\tindent: 0,\n\t\t\t\t\tversion: 1,\n\t\t\t\t},\n\t\t\t},\n\t\t\tlinks: [\n\t\t\t\t{\n\t\t\t\t\tlink: {\n\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\tappearance: \"default\",\n\t\t\t\t\t\tlabel: \"Get started free\",\n\t\t\t\t\t\turl: \"/sign-up\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlink: {\n\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\tappearance: \"outline\",\n\t\t\t\t\t\tlabel: \"View all templates\",\n\t\t\t\t\t\turl: \"/templates\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tlayout: [\n\t\t\t// Feature showcase blocks\n\t\t\t{\n\t\t\t\tblockType: \"featureShowcase\",\n\t\t\t\tblockName: \"Template Gallery\",\n\t\t\t\tlabel: \"Ready-Made Templates\",\n\t\t\t\theadline: \"Pick a template, customize, launch\",\n\t\t\t\tdescription: createParagraph(\n\t\t\t\t\t\"Our template library covers every niche from local services to B2B vendor directories. Each template is designed for conversions with optimized layouts, smart filtering, and mobile-first responsive design.\",\n\t\t\t\t),\n\t\t\t\tlink: {\n\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\tlabel: \"Browse templates\",\n\t\t\t\t\turl: \"/templates\",\n\t\t\t\t\tappearance: \"default\",\n\t\t\t\t},\n\t\t\t\timagePosition: \"right\",\n\t\t\t\tfeatures: [\n\t\t\t\t\t{ text: \"10+ professionally designed templates\" },\n\t\t\t\t\t{ text: \"Niche-specific layouts and fields\" },\n\t\t\t\t\t{ text: \"Mobile-first responsive design\" },\n\t\t\t\t\t{ text: \"One-click preview and deploy\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tblockType: \"featureShowcase\",\n\t\t\t\tblockName: \"Customization\",\n\t\t\t\tlabel: \"Brand Customization\",\n\t\t\t\theadline: \"Make it yours in minutes\",\n\t\t\t\tdescription: createParagraph(\n\t\t\t\t\t\"Every template is fully customizable. Change colors, fonts, layouts, and content without touching a line of code. Our visual editor makes it simple to match your brand identity perfectly.\",\n\t\t\t\t),\n\t\t\t\tlink: {\n\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\tlabel: \"See customization options\",\n\t\t\t\t\turl: \"/features\",\n\t\t\t\t\tappearance: \"default\",\n\t\t\t\t},\n\t\t\t\timagePosition: \"left\",\n\t\t\t\tfeatures: [\n\t\t\t\t\t{ text: \"Visual drag-and-drop editor\" },\n\t\t\t\t\t{ text: \"Custom color schemes and fonts\" },\n\t\t\t\t\t{ text: \"Logo and branding integration\" },\n\t\t\t\t\t{ text: \"Custom domain support\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t// Bento features for specific capabilities\n\t\t\t{\n\t\t\t\tblockType: \"bentoFeatures\",\n\t\t\t\tblockName: \"Template Features\",\n\t\t\t\theading: \"Built for every directory type\",\n\t\t\t\tsubheading:\n\t\t\t\t\t\"Templates designed for specific use cases with pre-configured schemas and optimized layouts\",\n\t\t\t\tfeatures: [\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"gradient\",\n\t\t\t\t\t\ticon: \"layout\",\n\t\t\t\t\t\ttitle: \"Local Services\",\n\t\t\t\t\t\tdescription: createParagraph(\n\t\t\t\t\t\t\t\"Plumbers, photographers, restaurants with map integration.\",\n\t\t\t\t\t\t),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"accent\",\n\t\t\t\t\t\ticon: \"building\",\n\t\t\t\t\t\ttitle: \"B2B Directories\",\n\t\t\t\t\t\tdescription: createParagraph(\n\t\t\t\t\t\t\t\"Software vendors, agencies, consultants with comparison views.\",\n\t\t\t\t\t\t),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"users\",\n\t\t\t\t\t\ttitle: \"Community Directories\",\n\t\t\t\t\t\tdescription: createParagraph(\n\t\t\t\t\t\t\t\"Member directories, alumni networks, professional groups.\",\n\t\t\t\t\t\t),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"primary\",\n\t\t\t\t\t\ticon: \"building\",\n\t\t\t\t\t\ttitle: \"Marketplaces\",\n\t\t\t\t\t\tdescription: createParagraph(\n\t\t\t\t\t\t\t\"Multi-vendor platforms with seller profiles and products.\",\n\t\t\t\t\t\t),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"globe\",\n\t\t\t\t\t\ttitle: \"Global Ready\",\n\t\t\t\t\t\tdescription: createParagraph(\"Multi-language support and localization built-in.\"),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"zap\",\n\t\t\t\t\t\ttitle: \"Fast Loading\",\n\t\t\t\t\t\tdescription: createParagraph(\"Optimized for speed with edge caching.\"),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t// Proof banner\n\t\t\t{\n\t\t\t\tblockType: \"proofBanner\",\n\t\t\t\tblockName: \"CTA Section\",\n\t\t\t\tstyle: \"centered\",\n\t\t\t\theadline: \"Ready to launch your directory?\",\n\t\t\t\tsubtext: \"Pick a template and go live today. Free to start, upgrade as you grow.\",\n\t\t\t\tlinks: [\n\t\t\t\t\t{\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tappearance: \"default\",\n\t\t\t\t\t\t\tlabel: \"Start for free\",\n\t\t\t\t\t\t\turl: \"/sign-up\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tappearance: \"outline\",\n\t\t\t\t\t\t\tlabel: \"Book a demo\",\n\t\t\t\t\t\t\turl: \"/contact\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t\tmeta: {\n\t\t\tdescription:\n\t\t\t\t\"Launch your directory website in days with professionally designed templates. Customize colors, layouts, and content without coding. Start free today.\",\n\t\t\ttitle: \"Directory Templates — Launch Fast with DirectoryHub\",\n\t\t},\n\t}\n}\n",
223
223
  "marketing/payload/src/endpoints/seed/directoryhub/home.ts": "import type { Media, Page } from \"@/payload-types\"\nimport { createParagraph } from \"./richtext-helper\"\n\ninterface HomePageParams {\n\theroImage?: Media | null\n\ttestimonialImages?: (Media | null)[]\n}\n\nexport const directoryHubHome = ({\n\theroImage,\n\ttestimonialImages = [],\n}: HomePageParams = {}): Partial<Page> => {\n\treturn {\n\t\tslug: \"home\",\n\t\t_status: \"published\",\n\t\thero: {\n\t\t\ttype: \"productShowcase\",\n\t\t\t// Include media reference if heroImage was uploaded\n\t\t\t...(heroImage && { media: heroImage.id }),\n\t\t\trichText: {\n\t\t\t\troot: {\n\t\t\t\t\ttype: \"root\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"heading\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\ttext: \"Launch, monetize, and scale directories fast\",\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdirection: \"ltr\",\n\t\t\t\t\t\t\tformat: \"\",\n\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\ttag: \"h1\",\n\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\ttext: \"The platform that accelerates directory launches, automates operations, and grows revenue.\",\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdirection: \"ltr\",\n\t\t\t\t\t\t\tformat: \"\",\n\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdirection: \"ltr\",\n\t\t\t\t\tformat: \"\",\n\t\t\t\t\tindent: 0,\n\t\t\t\t\tversion: 1,\n\t\t\t\t},\n\t\t\t},\n\t\t\tlinks: [\n\t\t\t\t{\n\t\t\t\t\tlink: {\n\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\tappearance: \"default\",\n\t\t\t\t\t\tlabel: \"Get started\",\n\t\t\t\t\t\turl: \"/sign-up\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlink: {\n\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\tappearance: \"outline\",\n\t\t\t\t\t\tlabel: \"View templates\",\n\t\t\t\t\t\turl: \"/templates\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tlayout: [\n\t\t\t// 1. Logo Banner - Social proof strip (KEEP)\n\t\t\t{\n\t\t\t\tblockType: \"logoBanner\",\n\t\t\t\tblockName: \"Trusted By\",\n\t\t\t\theading: \"Built for businesses where directories matter\",\n\t\t\t\tstyle: \"scroll\",\n\t\t\t\tlogos: [\n\t\t\t\t\t{ name: \"Northwind Market\" },\n\t\t\t\t\t{ name: \"Acme Listings\" },\n\t\t\t\t\t{ name: \"Evergreen HQ\" },\n\t\t\t\t\t{ name: \"Atlas Network\" },\n\t\t\t\t\t{ name: \"Beacon Partners\" },\n\t\t\t\t\t{ name: \"Cascade Labs\" },\n\t\t\t\t],\n\t\t\t},\n\n\t\t\t// 2. Value Proposition - Bird-style headline section\n\t\t\t{\n\t\t\t\tblockType: \"proofBanner\",\n\t\t\t\tblockName: \"Value Proposition\",\n\t\t\t\tstyle: \"centered\",\n\t\t\t\theadline: \"Turn your niche expertise into a revenue-generating directory\",\n\t\t\t\tsubtext:\n\t\t\t\t\t\"Every interaction feeds into a powerful platform that powers personalized experiences, targeted discovery, and intelligent automation across every touchpoint.\",\n\t\t\t\tlinks: [\n\t\t\t\t\t{\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tappearance: \"default\",\n\t\t\t\t\t\t\tlabel: \"Start for free\",\n\t\t\t\t\t\t\turl: \"/sign-up\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tappearance: \"outline\",\n\t\t\t\t\t\t\tlabel: \"Book a demo\",\n\t\t\t\t\t\t\turl: \"/contact\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\n\t\t\t// 3. Bento Features - Asymmetric bento grid with 8 cards\n\t\t\t{\n\t\t\t\tblockType: \"bentoFeatures\",\n\t\t\t\tblockName: \"Get to know DirectoryHub\",\n\t\t\t\theading: \"Get to know DirectoryHub\",\n\t\t\t\tsubheading: \"Everything you need to launch and monetize directories\",\n\t\t\t\tfeatures: [\n\t\t\t\t\t// Position 1: Small (1x1) - top left\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"gradient\",\n\t\t\t\t\t\ticon: \"zap\",\n\t\t\t\t\t\tstat: \"5x\",\n\t\t\t\t\t\ttitle: \"Faster launches\",\n\t\t\t\t\t\tdescription: createParagraph(\"Launch your directory in days, not months.\"),\n\t\t\t\t\t},\n\t\t\t\t\t// Position 2: Small (1x1) - top middle\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"accent\",\n\t\t\t\t\t\ticon: \"rocket\",\n\t\t\t\t\t\ttitle: \"Go live quickly\",\n\t\t\t\t\t\tdescription: createParagraph(\"Pick a template, customize your brand, and publish.\"),\n\t\t\t\t\t},\n\t\t\t\t\t// Position 3: Small (1x1) - top right\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"dollarSign\",\n\t\t\t\t\t\ttitle: \"Monetize instantly\",\n\t\t\t\t\t\tdescription: createParagraph(\"Stripe payments and subscription tiers built-in.\"),\n\t\t\t\t\t},\n\t\t\t\t\t// Position 4: Tall (1x2) - left side spanning 2 rows\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"tall\",\n\t\t\t\t\t\tstyle: \"primary\",\n\t\t\t\t\t\ticon: \"shield\",\n\t\t\t\t\t\ttitle: \"Enterprise security\",\n\t\t\t\t\t\tdescription: createParagraph(\n\t\t\t\t\t\t\t\"Per-tenant isolation, encrypted data, and complete audit trails for peace of mind.\",\n\t\t\t\t\t\t),\n\t\t\t\t\t},\n\t\t\t\t\t// Position 5: Small (1x1) - row 2, middle\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"search\",\n\t\t\t\t\t\tstat: \"100%\",\n\t\t\t\t\t\ttitle: \"SEO ready\",\n\t\t\t\t\t\tdescription: createParagraph(\"Schema markup and sitemaps generated automatically.\"),\n\t\t\t\t\t},\n\t\t\t\t\t// Position 6: Small (1x1) - row 2, right\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"globe\",\n\t\t\t\t\t\ttitle: \"Global scale\",\n\t\t\t\t\t\tdescription: createParagraph(\"Multi-tenant with custom domains.\"),\n\t\t\t\t\t},\n\t\t\t\t\t// Position 7: Small (1x1) - row 3, middle\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"settings\",\n\t\t\t\t\t\ttitle: \"Smart automation\",\n\t\t\t\t\t\tdescription: createParagraph(\"Automated workflows and moderation.\"),\n\t\t\t\t\t},\n\t\t\t\t\t// Position 8: Small (1x1) - row 3, right\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"layers\",\n\t\t\t\t\t\ttitle: \"Custom fields\",\n\t\t\t\t\t\tdescription: createParagraph(\"Flexible schemas for any directory type.\"),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\n\t\t\t// 4. Feature Showcase: Templates (image right)\n\t\t\t{\n\t\t\t\tblockType: \"featureShowcase\",\n\t\t\t\tblockName: \"Feature: Templates\",\n\t\t\t\tlabel: \"Directory Templates\",\n\t\t\t\theadline: \"Go from idea to live directory in a weekend\",\n\t\t\t\tdescription: createParagraph(\n\t\t\t\t\t\"High-converting directory templates designed for every niche. Benefit from schema pre-fills, dynamic UI, smart search, and intelligent optimizations that drive engagement.\",\n\t\t\t\t),\n\t\t\t\tlink: {\n\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\tlabel: \"Explore templates\",\n\t\t\t\t\turl: \"/templates\",\n\t\t\t\t\tappearance: \"default\",\n\t\t\t\t},\n\t\t\t\timagePosition: \"right\",\n\t\t\t\tfeatures: [\n\t\t\t\t\t{ text: \"10+ ready-to-use templates\" },\n\t\t\t\t\t{ text: \"Custom domain in minutes\" },\n\t\t\t\t\t{ text: \"Mobile-first responsive design\" },\n\t\t\t\t\t{ text: \"Deep localization support\" },\n\t\t\t\t],\n\t\t\t},\n\n\t\t\t// 5. Feature Showcase: Monetization (image left)\n\t\t\t{\n\t\t\t\tblockType: \"featureShowcase\",\n\t\t\t\tblockName: \"Feature: Monetization\",\n\t\t\t\tlabel: \"Revenue Engine\",\n\t\t\t\theadline: \"Drive revenue with built-in monetization\",\n\t\t\t\tdescription: createParagraph(\n\t\t\t\t\t\"Stop leaving money on the table. Charge for listings, offer premium placements, and run subscription tiers without writing a line of payment code. Automated invoicing and tax handling included.\",\n\t\t\t\t),\n\t\t\t\tlink: {\n\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\tlabel: \"Learn about monetization\",\n\t\t\t\t\turl: \"/pricing\",\n\t\t\t\t\tappearance: \"default\",\n\t\t\t\t},\n\t\t\t\timagePosition: \"left\",\n\t\t\t\tfeatures: [\n\t\t\t\t\t{ text: \"Subscription tiers\" },\n\t\t\t\t\t{ text: \"Featured placements\" },\n\t\t\t\t\t{ text: \"Pay-per-listing options\" },\n\t\t\t\t\t{ text: \"Automated payouts\" },\n\t\t\t\t],\n\t\t\t},\n\n\t\t\t// 6. Feature Showcase: SEO (image right)\n\t\t\t{\n\t\t\t\tblockType: \"featureShowcase\",\n\t\t\t\tblockName: \"Feature: SEO\",\n\t\t\t\tlabel: \"Search Optimization\",\n\t\t\t\theadline: \"Rank on page one without the technical overhead\",\n\t\t\t\tdescription: createParagraph(\n\t\t\t\t\t\"Every directory comes with enterprise-grade SEO built-in. Structured data, dynamic sitemaps, and optimized meta tags ensure your listings get discovered by the right audience.\",\n\t\t\t\t),\n\t\t\t\tlink: {\n\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\tlabel: \"See SEO features\",\n\t\t\t\t\turl: \"/features\",\n\t\t\t\t\tappearance: \"default\",\n\t\t\t\t},\n\t\t\t\timagePosition: \"right\",\n\t\t\t\tfeatures: [\n\t\t\t\t\t{ text: \"Automatic schema markup\" },\n\t\t\t\t\t{ text: \"Dynamic XML sitemaps\" },\n\t\t\t\t\t{ text: \"SEO-friendly URLs\" },\n\t\t\t\t\t{ text: \"Social sharing optimization\" },\n\t\t\t\t],\n\t\t\t},\n\n\t\t\t// 7. Feature Showcase: Management (image left)\n\t\t\t{\n\t\t\t\tblockType: \"featureShowcase\",\n\t\t\t\tblockName: \"Feature: Management\",\n\t\t\t\tlabel: \"Admin Dashboard\",\n\t\t\t\theadline: \"Manage everything from one powerful dashboard\",\n\t\t\t\tdescription: createParagraph(\n\t\t\t\t\t\"Review submissions, moderate content, track analytics, and manage payments all in one place. Built-in tools help you maintain quality while scaling your directory business.\",\n\t\t\t\t),\n\t\t\t\tlink: {\n\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\tlabel: \"Explore dashboard\",\n\t\t\t\t\turl: \"/features\",\n\t\t\t\t\tappearance: \"default\",\n\t\t\t\t},\n\t\t\t\timagePosition: \"left\",\n\t\t\t\tfeatures: [\n\t\t\t\t\t{ text: \"Submission review queues\" },\n\t\t\t\t\t{ text: \"Bulk moderation tools\" },\n\t\t\t\t\t{ text: \"Real-time analytics\" },\n\t\t\t\t\t{ text: \"User management\" },\n\t\t\t\t],\n\t\t\t},\n\n\t\t\t// 8. Industry Tabs - Bird-style tabbed use cases\n\t\t\t{\n\t\t\t\tblockType: \"industryTabs\",\n\t\t\t\tblockName: \"Use Cases\",\n\t\t\t\theading: \"Directories that turn data into intelligent experiences\",\n\t\t\t\tsubheading:\n\t\t\t\t\t\"Whether you are building for local services or global marketplaces, DirectoryHub adapts to your model.\",\n\t\t\t\ttabs: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"Local Services\",\n\t\t\t\t\t\tstat: \"340%\",\n\t\t\t\t\t\tstatLabel: \"Higher conversion with location-based discovery\",\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"Plumbers, photographers, restaurants. Card grids with reviews, maps, and geo-filtering that help customers find exactly what they need.\",\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tlabel: \"Local directory solutions\",\n\t\t\t\t\t\t\turl: \"/templates\",\n\t\t\t\t\t\t\tappearance: \"default\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"B2B Vendor Hubs\",\n\t\t\t\t\t\tstat: \"94%\",\n\t\t\t\t\t\tstatLabel: \"Faster vendor onboarding with smart filters\",\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"SaaS tools, agencies, consultants. Advanced filters, comparison views, and lead capture that convert browsers into buyers.\",\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tlabel: \"B2B directory solutions\",\n\t\t\t\t\t\t\turl: \"/templates\",\n\t\t\t\t\t\t\tappearance: \"default\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"Communities\",\n\t\t\t\t\t\tstat: \"+12K\",\n\t\t\t\t\t\tstatLabel: \"Members connected through curated networks\",\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"Member directories, alumni networks, professional associations with gated access and rich member profiles.\",\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tlabel: \"Community solutions\",\n\t\t\t\t\t\t\turl: \"/templates\",\n\t\t\t\t\t\t\tappearance: \"default\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"Marketplaces\",\n\t\t\t\t\t\tstat: \"$2M+\",\n\t\t\t\t\t\tstatLabel: \"Revenue processed through integrated payments\",\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"Multi-vendor search, featured slots, automated payouts to sellers. Everything you need to run a thriving marketplace.\",\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tlabel: \"Marketplace solutions\",\n\t\t\t\t\t\t\turl: \"/templates\",\n\t\t\t\t\t\t\tappearance: \"default\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\n\t\t\t// 9. Testimonials Grid - Bird-style stats with photos\n\t\t\t{\n\t\t\t\tblockType: \"testimonialsGrid\",\n\t\t\t\tblockName: \"Customer Stories\",\n\t\t\t\theading: \"Trusted by founders who depend on their directories\",\n\t\t\t\tsubheading:\n\t\t\t\t\t\"See how leading directory builders use DirectoryHub to drive intelligent growth.\",\n\t\t\t\ttestimonials: [\n\t\t\t\t\t{\n\t\t\t\t\t\t...(testimonialImages[0] && { image: testimonialImages[0].id }),\n\t\t\t\t\t\tstat: \"94%\",\n\t\t\t\t\t\tstatLabel: \"Faster launch time\",\n\t\t\t\t\t\tquote:\n\t\t\t\t\t\t\t\"We went from idea to collecting payments in 3 days. The templates and Stripe integration saved us months of development time.\",\n\t\t\t\t\t\tauthor: \"Sarah Chen\",\n\t\t\t\t\t\tcompany: \"Northwind Market\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t...(testimonialImages[1] && { image: testimonialImages[1].id }),\n\t\t\t\t\t\tstat: \"+300%\",\n\t\t\t\t\t\tstatLabel: \"Traffic growth\",\n\t\t\t\t\t\tquote:\n\t\t\t\t\t\t\t\"Our niche directory started ranking on page 1 within weeks. The structured data and sitemaps are handled automatically.\",\n\t\t\t\t\t\tauthor: \"Marcus Rivera\",\n\t\t\t\t\t\tcompany: \"Beacon Partners\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t...(testimonialImages[2] && { image: testimonialImages[2].id }),\n\t\t\t\t\t\tstat: \"161%\",\n\t\t\t\t\t\tstatLabel: \"Revenue increase\",\n\t\t\t\t\t\tquote:\n\t\t\t\t\t\t\t\"Featured placements and premium tiers covered our costs in the first month. The monetization tools just work.\",\n\t\t\t\t\t\tauthor: \"David Kim\",\n\t\t\t\t\t\tcompany: \"Cascade Labs\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\n\t\t\t// 10. Trust Columns - Bird-style two-column section\n\t\t\t{\n\t\t\t\tblockType: \"trustColumns\",\n\t\t\t\tblockName: \"Trust & Security\",\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: \"Integrations\",\n\t\t\t\t\t\theading: \"Connect anywhere\",\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"Plug in and get started immediately with pre-built connectors for every major platform.\",\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{ icon: \"zap\", text: \"Go live in minutes\" },\n\t\t\t\t\t\t\t{ icon: \"plug\", text: \"Pre-built connectors\" },\n\t\t\t\t\t\t\t{ icon: \"database\", text: \"Complete data sync\" },\n\t\t\t\t\t\t\t{ icon: \"cloud\", text: \"Cloud-native infrastructure\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: \"Security & Compliance\",\n\t\t\t\t\t\theading: \"Enterprise-level security\",\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"Keep your data private with encryption, granular access control, and compliance-ready infrastructure.\",\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{ icon: \"shield\", text: \"SOC 2-minded controls\" },\n\t\t\t\t\t\t\t{ icon: \"lock\", text: \"Per-tenant data isolation\" },\n\t\t\t\t\t\t\t{ icon: \"award\", text: \"Complete audit trails\" },\n\t\t\t\t\t\t\t{ icon: \"globe\", text: \"GDPR-ready infrastructure\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\n\t\t\t// 11. Integrations Banner (KEEP)\n\t\t\t{\n\t\t\t\tblockType: \"logoBanner\",\n\t\t\t\tblockName: \"Integrations\",\n\t\t\t\theading: \"Powered by industry-leading technology\",\n\t\t\t\tstyle: \"grid\",\n\t\t\t\tlogos: [\n\t\t\t\t\t{ name: \"Stripe\" },\n\t\t\t\t\t{ name: \"Vercel\" },\n\t\t\t\t\t{ name: \"AWS\" },\n\t\t\t\t\t{ name: \"Google Analytics\" },\n\t\t\t\t\t{ name: \"Zapier\" },\n\t\t\t\t\t{ name: \"Convex\" },\n\t\t\t\t],\n\t\t\t},\n\n\t\t\t// 12. Pricing (KEEP)\n\t\t\t{\n\t\t\t\tblockType: \"pricingTable\",\n\t\t\t\tblockName: \"Pricing\",\n\t\t\t\theading: \"Simple, transparent pricing\",\n\t\t\t\tsubheading: \"Start free, upgrade as you grow. No hidden fees.\",\n\t\t\t\tshowComparisonTable: false,\n\t\t\t\tshowViewAllLink: true,\n\t\t\t\tmaxFeaturesOnCard: 4,\n\t\t\t\tplans: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"Free\",\n\t\t\t\t\t\tprice: \"$0/mo\",\n\t\t\t\t\t\tdescription: \"Perfect for getting started.\",\n\t\t\t\t\t\tfeatures: [\n\t\t\t\t\t\t\t{ feature: \"1 directory site\", included: true },\n\t\t\t\t\t\t\t{ feature: \"Basic customization\", included: true },\n\t\t\t\t\t\t\t{ feature: \"Community support\", included: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tlabel: \"Get started free\",\n\t\t\t\t\t\t\turl: \"/sign-up\",\n\t\t\t\t\t\t\tappearance: \"outline\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"Pro\",\n\t\t\t\t\t\tprice: \"$29/mo\",\n\t\t\t\t\t\tdescription: \"For growing businesses.\",\n\t\t\t\t\t\tfeatured: true,\n\t\t\t\t\t\tfeatures: [\n\t\t\t\t\t\t\t{ feature: \"5 directory sites\", included: true },\n\t\t\t\t\t\t\t{ feature: \"Advanced customization\", included: true },\n\t\t\t\t\t\t\t{ feature: \"Custom domains\", included: true },\n\t\t\t\t\t\t\t{ feature: \"Priority support\", included: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tlabel: \"Get Pro\",\n\t\t\t\t\t\t\turl: \"/sign-up\",\n\t\t\t\t\t\t\tappearance: \"default\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"Business\",\n\t\t\t\t\t\tprice: \"$99/mo\",\n\t\t\t\t\t\tdescription: \"For teams and agencies.\",\n\t\t\t\t\t\tfeatures: [\n\t\t\t\t\t\t\t{ feature: \"Unlimited directory sites\", included: true },\n\t\t\t\t\t\t\t{ feature: \"White-label branding\", included: true },\n\t\t\t\t\t\t\t{ feature: \"API access\", included: true },\n\t\t\t\t\t\t\t{ feature: \"Dedicated support\", included: true },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tlabel: \"Get Business\",\n\t\t\t\t\t\t\turl: \"/sign-up\",\n\t\t\t\t\t\t\tappearance: \"outline\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\n\t\t\t// 13. Final CTA - Bird-style full-width with background\n\t\t\t{\n\t\t\t\tblockType: \"finalCta\",\n\t\t\t\tblockName: \"Final CTA\",\n\t\t\t\theadline: \"The complete platform that scales with your directory business\",\n\t\t\t\tsubheading:\n\t\t\t\t\t\"Join hundreds of founders who chose the faster path to a profitable directory business. Start free, upgrade as you grow.\",\n\t\t\t\tstyle: \"dark\",\n\t\t\t\tlinks: [\n\t\t\t\t\t{\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tappearance: \"outline\",\n\t\t\t\t\t\t\tlabel: \"Get started\",\n\t\t\t\t\t\t\turl: \"/sign-up\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tappearance: \"default\",\n\t\t\t\t\t\t\tlabel: \"Book a demo\",\n\t\t\t\t\t\t\turl: \"/contact\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t\tmeta: {\n\t\t\tdescription:\n\t\t\t\t\"Launch a profitable directory business in minutes with built-in payments, SEO, and automation. Free to start.\",\n\t\t\ttitle: \"DirectoryHub — Launch revenue-first directories fast\",\n\t\t},\n\t\ttitle: \"Home\",\n\t}\n}\n",
224
- "marketing/payload/src/endpoints/seed/directoryhub/index.ts": "import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport type { CollectionSlug, File, Payload, PayloadRequest } from \"payload\"\n\nimport { directoryHubAbout } from \"./about\"\nimport { faqData } from \"./faqs\"\nimport {\n\tautomationPage,\n\tcustomFieldsPage,\n\tdashboardPage,\n\tmonetizationPage,\n\tseoPage,\n\ttemplatesPage,\n} from \"./features\"\nimport { directoryHubHome } from \"./home\"\nimport { blogPosts } from \"./posts\"\nimport { directoryHubPricing } from \"./pricing\"\nimport { directoryHubPrivacy } from \"./privacy\"\nimport { directoryHubTerms } from \"./terms\"\nimport {\n\tb2bVendorHubsPage,\n\tcommunitiesPage,\n\tlocalServicesPage,\n\tmarketplacesPage,\n} from \"./use-cases\"\n\nconst collections: CollectionSlug[] = [\n\t\"categories\",\n\t\"media\",\n\t\"pages\",\n\t\"posts\",\n\t\"forms\",\n\t\"form-submissions\",\n\t\"search\",\n\t\"faqs\",\n]\n\nconst categories = [\n\t{ title: \"Business\", slug: \"business\" },\n\t{ title: \"Technology\", slug: \"technology\" },\n\t{ title: \"News\", slug: \"news\" },\n\t{ title: \"Guides\", slug: \"guides\" },\n]\n\n// Contact form configuration for DirectoryHub\nconst contactFormData = {\n\ttitle: \"Contact Form\",\n\tconfirmationMessage: {\n\t\troot: {\n\t\t\ttype: \"root\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\ttext: \"Thanks for reaching out! We'll get back to you within 24 hours.\",\n\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\tindent: 0,\n\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\tversion: 1,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdirection: \"ltr\" as const,\n\t\t\tformat: \"\" as const,\n\t\t\tindent: 0,\n\t\t\tversion: 1,\n\t\t},\n\t},\n\tconfirmationType: \"message\" as const,\n\tfields: [\n\t\t{\n\t\t\tname: \"name\",\n\t\t\tlabel: \"Name\",\n\t\t\trequired: true,\n\t\t\tblockType: \"text\" as const,\n\t\t},\n\t\t{\n\t\t\tname: \"email\",\n\t\t\tlabel: \"Email\",\n\t\t\trequired: true,\n\t\t\tblockType: \"email\" as const,\n\t\t},\n\t\t{\n\t\t\tname: \"subject\",\n\t\t\tlabel: \"Subject\",\n\t\t\trequired: false,\n\t\t\tblockType: \"text\" as const,\n\t\t},\n\t\t{\n\t\t\tname: \"message\",\n\t\t\tlabel: \"Message\",\n\t\t\trequired: true,\n\t\t\tblockType: \"textarea\" as const,\n\t\t},\n\t],\n\tsubmitButtonLabel: \"Send Message\",\n}\n\nexport const seedDirectoryHub = async ({\n\tpayload,\n\treq,\n}: {\n\tpayload: Payload\n\treq: PayloadRequest\n}): Promise<void> => {\n\tpayload.logger.info(\"Seeding DirectoryHub database...\")\n\n\t// Clear collections and globals\n\tpayload.logger.info(\"— Clearing collections and globals...\")\n\n\t// Clear header\n\tawait payload.updateGlobal({\n\t\tslug: \"header\",\n\t\tdata: {\n\t\t\tnavItems: [],\n\t\t},\n\t\tdepth: 0,\n\t\tcontext: {\n\t\t\tdisableRevalidate: true,\n\t\t},\n\t})\n\n\t// Clear footer with new structure\n\tawait payload.updateGlobal({\n\t\tslug: \"footer\",\n\t\tdata: {\n\t\t\tcolumns: [],\n\t\t\tsocialLinks: {},\n\t\t\tnewsletter: { enabled: false },\n\t\t\tcopyrightText: \"\",\n\t\t\tbottomLinks: [],\n\t\t},\n\t\tdepth: 0,\n\t\tcontext: {\n\t\t\tdisableRevalidate: true,\n\t\t},\n\t})\n\n\t// Delete collections sequentially to avoid database deadlocks\n\tfor (const collection of collections) {\n\t\tif (payload.collections[collection]) {\n\t\t\ttry {\n\t\t\t\tawait payload.db.deleteMany({ collection, req, where: {} })\n\t\t\t} catch (error) {\n\t\t\t\tpayload.logger.warn(`Warning: Could not clear ${collection}: ${error}`)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Delete versions sequentially\n\tfor (const collection of collections) {\n\t\tif (payload.collections[collection]?.config?.versions) {\n\t\t\ttry {\n\t\t\t\tawait payload.db.deleteVersions({ collection, req, where: {} })\n\t\t\t} catch (error) {\n\t\t\t\tpayload.logger.warn(`Warning: Could not clear ${collection} versions: ${error}`)\n\t\t\t}\n\t\t}\n\t}\n\n\tpayload.logger.info(\"— Seeding demo author...\")\n\n\tawait payload.delete({\n\t\tcollection: \"users\",\n\t\tdepth: 0,\n\t\twhere: {\n\t\t\temail: {\n\t\t\t\tequals: \"demo-author@example.com\",\n\t\t\t},\n\t\t},\n\t})\n\n\tconst _demoAuthor = await payload.create({\n\t\tcollection: \"users\",\n\t\tdata: {\n\t\t\tname: \"DirectoryHub Team\",\n\t\t\temail: \"demo-author@example.com\",\n\t\t\tpassword: \"password\",\n\t\t},\n\t})\n\n\t// Seed categories\n\tpayload.logger.info(\"— Seeding categories...\")\n\n\tconst categoryDocs = await Promise.all(\n\t\tcategories.map((category) =>\n\t\t\tpayload.create({\n\t\t\t\tcollection: \"categories\",\n\t\t\t\tdata: {\n\t\t\t\t\ttitle: category.title,\n\t\t\t\t\tslug: category.slug,\n\t\t\t\t},\n\t\t\t}),\n\t\t),\n\t)\n\n\t// Seed FAQs\n\tpayload.logger.info(\"— Seeding FAQs...\")\n\n\tconst faqDocs = await Promise.all(\n\t\tfaqData.map((faq) =>\n\t\t\tpayload.create({\n\t\t\t\tcollection: \"faqs\",\n\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\t\tdata: faq as any,\n\t\t\t}),\n\t\t),\n\t)\n\n\tpayload.logger.info(`— Seeded ${faqDocs.length} FAQs`)\n\n\t// Upload hero dashboard image\n\tpayload.logger.info(\"— Uploading hero media...\")\n\n\tlet heroImageDoc = null\n\ttry {\n\t\tconst heroImagePath = path.join(process.cwd(), \"public/media/hero-dashboard.png\")\n\t\tif (fs.existsSync(heroImagePath)) {\n\t\t\tconst heroImageBuffer = fs.readFileSync(heroImagePath)\n\t\t\tconst heroImageFile: File = {\n\t\t\t\tname: \"hero-dashboard.png\",\n\t\t\t\tdata: heroImageBuffer,\n\t\t\t\tmimetype: \"image/png\",\n\t\t\t\tsize: heroImageBuffer.byteLength,\n\t\t\t}\n\t\t\theroImageDoc = await payload.create({\n\t\t\t\tcollection: \"media\",\n\t\t\t\tdata: {\n\t\t\t\t\talt: \"DirectoryHub Dashboard - Manage directories, track usage, and configure settings\",\n\t\t\t\t},\n\t\t\t\tfile: heroImageFile,\n\t\t\t})\n\t\t\tpayload.logger.info(\"— Hero image uploaded successfully\")\n\t\t} else {\n\t\t\tpayload.logger.info(\"— Hero image not found, using animated mockup fallback\")\n\t\t}\n\t} catch (_error) {\n\t\tpayload.logger.info(\"— Error uploading hero image, using animated mockup fallback\")\n\t}\n\n\t// Upload testimonial images\n\tpayload.logger.info(\"— Uploading testimonial images...\")\n\n\tconst testimonialImages: (typeof heroImageDoc)[] = []\n\tconst testimonialImageFiles = [\n\t\t{ name: \"testimonial-1.jpg\", alt: \"Professional woman entrepreneur\" },\n\t\t{ name: \"testimonial-2.jpg\", alt: \"Business professional reviewing analytics\" },\n\t\t{ name: \"testimonial-3.jpg\", alt: \"Team collaboration meeting\" },\n\t]\n\n\tfor (const imgData of testimonialImageFiles) {\n\t\ttry {\n\t\t\tconst imagePath = path.join(process.cwd(), `public/media/${imgData.name}`)\n\t\t\tif (fs.existsSync(imagePath)) {\n\t\t\t\tconst imageBuffer = fs.readFileSync(imagePath)\n\t\t\t\tconst imageFile: File = {\n\t\t\t\t\tname: imgData.name,\n\t\t\t\t\tdata: imageBuffer,\n\t\t\t\t\tmimetype: \"image/jpeg\",\n\t\t\t\t\tsize: imageBuffer.byteLength,\n\t\t\t\t}\n\t\t\t\tconst imageDoc = await payload.create({\n\t\t\t\t\tcollection: \"media\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\talt: imgData.alt,\n\t\t\t\t\t},\n\t\t\t\t\tfile: imageFile,\n\t\t\t\t})\n\t\t\t\ttestimonialImages.push(imageDoc)\n\t\t\t}\n\t\t} catch (_error) {\n\t\t\tpayload.logger.info(`— Error uploading ${imgData.name}`)\n\t\t}\n\t}\n\tpayload.logger.info(`— Uploaded ${testimonialImages.length} testimonial images`)\n\n\tpayload.logger.info(\"— Seeding contact form...\")\n\n\tconst contactForm = await payload.create({\n\t\tcollection: \"forms\",\n\t\tdepth: 0,\n\t\tdata: contactFormData,\n\t})\n\n\tpayload.logger.info(\"— Seeding pages...\")\n\n\t// Seed main pages\n\tconst [homePage, pricingPage, aboutPage, privacyPage, termsPage] = await Promise.all([\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: {\n\t\t\t\tdisableRevalidate: true,\n\t\t\t},\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: directoryHubHome({ heroImage: heroImageDoc, testimonialImages }) as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: {\n\t\t\t\tdisableRevalidate: true,\n\t\t\t},\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: directoryHubPricing() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: {\n\t\t\t\tdisableRevalidate: true,\n\t\t\t},\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: directoryHubAbout({ contactForm }) as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: {\n\t\t\t\tdisableRevalidate: true,\n\t\t\t},\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: directoryHubPrivacy() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: {\n\t\t\t\tdisableRevalidate: true,\n\t\t\t},\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: directoryHubTerms() as any,\n\t\t}),\n\t])\n\n\t// Seed feature pages\n\tpayload.logger.info(\"— Seeding feature pages...\")\n\n\tconst featurePages = await Promise.all([\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: templatesPage() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: monetizationPage() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: seoPage() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: dashboardPage() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: automationPage() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: customFieldsPage() as any,\n\t\t}),\n\t])\n\n\tpayload.logger.info(`— Seeded ${featurePages.length} feature pages`)\n\n\t// Seed use case pages\n\tpayload.logger.info(\"— Seeding use case pages...\")\n\n\tconst useCasePages = await Promise.all([\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: localServicesPage() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: b2bVendorHubsPage() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: communitiesPage() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: marketplacesPage() as any,\n\t\t}),\n\t])\n\n\tpayload.logger.info(`— Seeded ${useCasePages.length} use case pages`)\n\n\t// Seed blog posts\n\tpayload.logger.info(\"— Seeding blog posts...\")\n\n\tconst posts = blogPosts(categoryDocs)\n\tconst createdPosts = await Promise.all(\n\t\tposts.map((post) =>\n\t\t\tpayload.create({\n\t\t\t\tcollection: \"posts\",\n\t\t\t\tdepth: 0,\n\t\t\t\tcontext: { disableRevalidate: true },\n\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\t\tdata: post as any,\n\t\t\t}),\n\t\t),\n\t)\n\n\tpayload.logger.info(`— Seeded ${createdPosts.length} blog posts`)\n\n\tpayload.logger.info(\"— Seeding globals...\")\n\n\tawait Promise.all([\n\t\tpayload.updateGlobal({\n\t\t\tslug: \"header\",\n\t\t\tdata: {\n\t\t\t\tnavItems: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"megaMenu\",\n\t\t\t\t\t\tlabel: \"Product\",\n\t\t\t\t\t\tmegaMenuColumns: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcolumnLabel: \"Features\",\n\t\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Templates\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Beautiful, ready-to-use directory templates\",\n\t\t\t\t\t\t\t\t\t\ticon: \"layout\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: featurePages[0].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Monetization\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Built-in payments and subscriptions\",\n\t\t\t\t\t\t\t\t\t\ticon: \"dollarSign\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: featurePages[1].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"SEO\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Schema markup and optimizations\",\n\t\t\t\t\t\t\t\t\t\ticon: \"search\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: featurePages[2].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcolumnLabel: \"Tools\",\n\t\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Dashboard\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Powerful admin and analytics\",\n\t\t\t\t\t\t\t\t\t\ticon: \"barChart\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: featurePages[3].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Automation\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Smart workflows and actions\",\n\t\t\t\t\t\t\t\t\t\ticon: \"zap\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: featurePages[4].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Custom Fields\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Flexible schemas for any niche\",\n\t\t\t\t\t\t\t\t\t\ticon: \"layers\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: featurePages[5].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"megaMenu\",\n\t\t\t\t\t\tlabel: \"Use Cases\",\n\t\t\t\t\t\tmegaMenuColumns: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcolumnLabel: \"Directory Types\",\n\t\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Local Services\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Plumbers, restaurants, photographers\",\n\t\t\t\t\t\t\t\t\t\ticon: \"globe\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: useCasePages[0].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"B2B Vendor Hubs\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"SaaS tools, agencies, consultants\",\n\t\t\t\t\t\t\t\t\t\ticon: \"building\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: useCasePages[1].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Communities\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Member directories, alumni networks\",\n\t\t\t\t\t\t\t\t\t\ticon: \"users\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: useCasePages[2].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Marketplaces\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Multi-vendor platforms\",\n\t\t\t\t\t\t\t\t\t\ticon: \"store\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: useCasePages[3].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"link\",\n\t\t\t\t\t\tlabel: \"Pricing\",\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\tvalue: pricingPage.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"link\",\n\t\t\t\t\t\tlabel: \"Blog\",\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\turl: \"/posts\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"link\",\n\t\t\t\t\t\tlabel: \"Sign In\",\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\turl: \"/sign-in\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"link\",\n\t\t\t\t\t\tlabel: \"Get Started\",\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\turl: \"/sign-up\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t}),\n\t\tpayload.updateGlobal({\n\t\t\tslug: \"footer\",\n\t\t\tdata: {\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: \"Product\",\n\t\t\t\t\t\tlinks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\tlabel: \"Home\",\n\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\tvalue: homePage.id,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\tlabel: \"Pricing\",\n\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\tvalue: pricingPage.id,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\tlabel: \"Templates\",\n\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\tvalue: featurePages[0].id,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: \"Resources\",\n\t\t\t\t\t\tlinks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\t\t\tlabel: \"Blog\",\n\t\t\t\t\t\t\t\t\turl: \"/posts\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\t\t\tlabel: \"Documentation\",\n\t\t\t\t\t\t\t\t\turl: \"/docs\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: \"Company\",\n\t\t\t\t\t\tlinks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\tlabel: \"About\",\n\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\tvalue: aboutPage.id,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: \"Legal\",\n\t\t\t\t\t\tlinks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\tlabel: \"Privacy\",\n\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\tvalue: privacyPage.id,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\tlabel: \"Terms\",\n\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\tvalue: termsPage.id,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tsocialLinks: {\n\t\t\t\t\ttwitter: \"https://x.com/directoryhub\",\n\t\t\t\t\tlinkedin: \"https://linkedin.com/company/directoryhub\",\n\t\t\t\t\tgithub: \"https://github.com/directoryhub\",\n\t\t\t\t},\n\t\t\t\tnewsletter: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\ttitle: \"Newsletter\",\n\t\t\t\t\tdescription: \"Stay up to date with DirectoryHub through weekly updates to your inbox.\",\n\t\t\t\t\tbuttonText: \"Subscribe\",\n\t\t\t\t\tplaceholder: \"Enter your email\",\n\t\t\t\t},\n\t\t\t\tcopyrightText: \"DirectoryHub\",\n\t\t\t\tbottomLinks: [\n\t\t\t\t\t{\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tlabel: \"Contact Support\",\n\t\t\t\t\t\t\turl: \"/support\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t}),\n\t])\n\n\tpayload.logger.info(\"DirectoryHub database seeded successfully!\")\n}\n",
224
+ "marketing/payload/src/endpoints/seed/directoryhub/index.ts": "import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport type { CollectionSlug, File, Payload, PayloadRequest } from \"payload\"\n\nimport { directoryHubAbout } from \"./about\"\nimport { faqData } from \"./faqs\"\nimport {\n\tautomationPage,\n\tcustomFieldsPage,\n\tdashboardPage,\n\tmonetizationPage,\n\tseoPage,\n\ttemplatesPage,\n} from \"./features\"\nimport { directoryHubHome } from \"./home\"\nimport { blogPosts } from \"./posts\"\nimport { directoryHubPricing } from \"./pricing\"\nimport { directoryHubPrivacy } from \"./privacy\"\nimport { directoryHubTerms } from \"./terms\"\nimport {\n\tb2bVendorHubsPage,\n\tcommunitiesPage,\n\tlocalServicesPage,\n\tmarketplacesPage,\n} from \"./use-cases\"\n\nconst collections: CollectionSlug[] = [\n\t\"categories\",\n\t\"media\",\n\t\"pages\",\n\t\"posts\",\n\t\"forms\",\n\t\"form-submissions\",\n\t\"search\",\n\t\"faqs\",\n]\n\nconst categories = [\n\t{ title: \"Business\", slug: \"business\" },\n\t{ title: \"Technology\", slug: \"technology\" },\n\t{ title: \"News\", slug: \"news\" },\n\t{ title: \"Guides\", slug: \"guides\" },\n]\n\n// Contact form configuration for DirectoryHub\nconst contactFormData = {\n\ttitle: \"Contact Form\",\n\tconfirmationMessage: {\n\t\troot: {\n\t\t\ttype: \"root\",\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\ttext: \"Thanks for reaching out! We'll get back to you within 24 hours.\",\n\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\tindent: 0,\n\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\tversion: 1,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdirection: \"ltr\" as const,\n\t\t\tformat: \"\" as const,\n\t\t\tindent: 0,\n\t\t\tversion: 1,\n\t\t},\n\t},\n\tconfirmationType: \"message\" as const,\n\tfields: [\n\t\t{\n\t\t\tname: \"name\",\n\t\t\tlabel: \"Name\",\n\t\t\trequired: true,\n\t\t\tblockType: \"text\" as const,\n\t\t},\n\t\t{\n\t\t\tname: \"email\",\n\t\t\tlabel: \"Email\",\n\t\t\trequired: true,\n\t\t\tblockType: \"email\" as const,\n\t\t},\n\t\t{\n\t\t\tname: \"subject\",\n\t\t\tlabel: \"Subject\",\n\t\t\trequired: false,\n\t\t\tblockType: \"text\" as const,\n\t\t},\n\t\t{\n\t\t\tname: \"message\",\n\t\t\tlabel: \"Message\",\n\t\t\trequired: true,\n\t\t\tblockType: \"textarea\" as const,\n\t\t},\n\t],\n\tsubmitButtonLabel: \"Send Message\",\n}\n\nexport const seedDirectoryHub = async ({\n\tpayload,\n\treq,\n}: {\n\tpayload: Payload\n\treq: PayloadRequest\n}): Promise<void> => {\n\tpayload.logger.info(\"Seeding DirectoryHub database...\")\n\n\t// Clear collections and globals\n\tpayload.logger.info(\"— Clearing collections and globals...\")\n\n\t// Clear header\n\tawait payload.updateGlobal({\n\t\tslug: \"header\",\n\t\tdata: {\n\t\t\tnavItems: [],\n\t\t},\n\t\tdepth: 0,\n\t\tcontext: {\n\t\t\tdisableRevalidate: true,\n\t\t},\n\t})\n\n\t// Clear footer with new structure\n\tawait payload.updateGlobal({\n\t\tslug: \"footer\",\n\t\tdata: {\n\t\t\tcolumns: [],\n\t\t\tsocialLinks: {},\n\t\t\tnewsletter: { enabled: false },\n\t\t\tcopyrightText: \"\",\n\t\t\tbottomLinks: [],\n\t\t},\n\t\tdepth: 0,\n\t\tcontext: {\n\t\t\tdisableRevalidate: true,\n\t\t},\n\t})\n\n\t// Delete collections sequentially to avoid database deadlocks\n\tfor (const collection of collections) {\n\t\tif (payload.collections[collection]) {\n\t\t\ttry {\n\t\t\t\tawait payload.db.deleteMany({ collection, req, where: {} })\n\t\t\t} catch (error) {\n\t\t\t\tpayload.logger.warn(`Warning: Could not clear ${collection}: ${error}`)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Delete versions sequentially\n\tfor (const collection of collections) {\n\t\tif (payload.collections[collection]?.config?.versions) {\n\t\t\ttry {\n\t\t\t\tawait payload.db.deleteVersions({ collection, req, where: {} })\n\t\t\t} catch (error) {\n\t\t\t\tpayload.logger.warn(`Warning: Could not clear ${collection} versions: ${error}`)\n\t\t\t}\n\t\t}\n\t}\n\n\tpayload.logger.info(\"— Seeding demo author...\")\n\n\tawait payload.delete({\n\t\tcollection: \"users\",\n\t\tdepth: 0,\n\t\twhere: {\n\t\t\temail: {\n\t\t\t\tequals: \"demo-author@example.com\",\n\t\t\t},\n\t\t},\n\t})\n\n\tconst _demoAuthor = await payload.create({\n\t\tcollection: \"users\",\n\t\tdata: {\n\t\t\tname: \"DirectoryHub Team\",\n\t\t\temail: \"demo-author@example.com\",\n\t\t\tpassword: \"password\",\n\t\t},\n\t})\n\n\t// Seed categories\n\tpayload.logger.info(\"— Seeding categories...\")\n\n\tconst categoryDocs = await Promise.all(\n\t\tcategories.map((category) =>\n\t\t\tpayload.create({\n\t\t\t\tcollection: \"categories\",\n\t\t\t\tdata: {\n\t\t\t\t\ttitle: category.title,\n\t\t\t\t\tslug: category.slug,\n\t\t\t\t},\n\t\t\t}),\n\t\t),\n\t)\n\n\t// Seed FAQs\n\tpayload.logger.info(\"— Seeding FAQs...\")\n\n\tconst faqDocs = await Promise.all(\n\t\tfaqData.map((faq) =>\n\t\t\tpayload.create({\n\t\t\t\tcollection: \"faqs\",\n\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\t\tdata: faq as any,\n\t\t\t}),\n\t\t),\n\t)\n\n\tpayload.logger.info(`— Seeded ${faqDocs.length} FAQs`)\n\n\t// Upload hero dashboard image\n\tpayload.logger.info(\"— Uploading hero media...\")\n\n\tlet heroImageDoc = null\n\ttry {\n\t\tconst heroImagePath = path.join(process.cwd(), \"public/media/hero-dashboard.png\")\n\t\tif (fs.existsSync(heroImagePath)) {\n\t\t\tconst heroImageBuffer = fs.readFileSync(heroImagePath)\n\t\t\tconst heroImageFile: File = {\n\t\t\t\tname: \"hero-dashboard.png\",\n\t\t\t\tdata: heroImageBuffer,\n\t\t\t\tmimetype: \"image/png\",\n\t\t\t\tsize: heroImageBuffer.byteLength,\n\t\t\t}\n\t\t\theroImageDoc = await payload.create({\n\t\t\t\tcollection: \"media\",\n\t\t\t\tdata: {\n\t\t\t\t\talt: \"DirectoryHub Dashboard - Manage directories, track usage, and configure settings\",\n\t\t\t\t},\n\t\t\t\tfile: heroImageFile,\n\t\t\t})\n\t\t\tpayload.logger.info(\"— Hero image uploaded successfully\")\n\t\t} else {\n\t\t\tpayload.logger.info(\"— Hero image not found, using animated mockup fallback\")\n\t\t}\n\t} catch (_error) {\n\t\tpayload.logger.info(\"— Error uploading hero image, using animated mockup fallback\")\n\t}\n\n\t// Upload testimonial images\n\tpayload.logger.info(\"— Uploading testimonial images...\")\n\n\tconst testimonialImages: (typeof heroImageDoc)[] = []\n\tconst testimonialImageFiles = [\n\t\t{ name: \"testimonial-1.jpg\", alt: \"Professional woman entrepreneur\" },\n\t\t{ name: \"testimonial-2.jpg\", alt: \"Business professional reviewing analytics\" },\n\t\t{ name: \"testimonial-3.jpg\", alt: \"Team collaboration meeting\" },\n\t]\n\n\tfor (const imgData of testimonialImageFiles) {\n\t\ttry {\n\t\t\tconst imagePath = path.join(process.cwd(), `public/media/${imgData.name}`)\n\t\t\tif (fs.existsSync(imagePath)) {\n\t\t\t\tconst imageBuffer = fs.readFileSync(imagePath)\n\t\t\t\tconst imageFile: File = {\n\t\t\t\t\tname: imgData.name,\n\t\t\t\t\tdata: imageBuffer,\n\t\t\t\t\tmimetype: \"image/jpeg\",\n\t\t\t\t\tsize: imageBuffer.byteLength,\n\t\t\t\t}\n\t\t\t\tconst imageDoc = await payload.create({\n\t\t\t\t\tcollection: \"media\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\talt: imgData.alt,\n\t\t\t\t\t},\n\t\t\t\t\tfile: imageFile,\n\t\t\t\t})\n\t\t\t\ttestimonialImages.push(imageDoc)\n\t\t\t}\n\t\t} catch (_error) {\n\t\t\tpayload.logger.info(`— Error uploading ${imgData.name}`)\n\t\t}\n\t}\n\tpayload.logger.info(`— Uploaded ${testimonialImages.length} testimonial images`)\n\n\tpayload.logger.info(\"— Seeding contact form...\")\n\n\tconst contactForm = await payload.create({\n\t\tcollection: \"forms\",\n\t\tdepth: 0,\n\t\tdata: contactFormData,\n\t})\n\n\tpayload.logger.info(\"— Seeding pages...\")\n\n\t// Seed main pages\n\tconst [homePage, pricingPage, aboutPage, privacyPage, termsPage] = await Promise.all([\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: {\n\t\t\t\tdisableRevalidate: true,\n\t\t\t},\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: directoryHubHome({ heroImage: heroImageDoc, testimonialImages }) as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: {\n\t\t\t\tdisableRevalidate: true,\n\t\t\t},\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: directoryHubPricing() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: {\n\t\t\t\tdisableRevalidate: true,\n\t\t\t},\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: directoryHubAbout({ contactForm }) as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: {\n\t\t\t\tdisableRevalidate: true,\n\t\t\t},\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: directoryHubPrivacy() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: {\n\t\t\t\tdisableRevalidate: true,\n\t\t\t},\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: directoryHubTerms() as any,\n\t\t}),\n\t])\n\n\t// Seed feature pages\n\tpayload.logger.info(\"— Seeding feature pages...\")\n\n\tconst featurePages = await Promise.all([\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: templatesPage() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: monetizationPage() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: seoPage() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: dashboardPage() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: automationPage() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: customFieldsPage() as any,\n\t\t}),\n\t])\n\n\tpayload.logger.info(`— Seeded ${featurePages.length} feature pages`)\n\n\t// Seed use case pages\n\tpayload.logger.info(\"— Seeding use case pages...\")\n\n\tconst useCasePages = await Promise.all([\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: localServicesPage() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: b2bVendorHubsPage() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: communitiesPage() as any,\n\t\t}),\n\t\tpayload.create({\n\t\t\tcollection: \"pages\",\n\t\t\tdepth: 0,\n\t\t\tcontext: { disableRevalidate: true },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\tdata: marketplacesPage() as any,\n\t\t}),\n\t])\n\n\tpayload.logger.info(`— Seeded ${useCasePages.length} use case pages`)\n\n\t// Seed blog posts\n\tpayload.logger.info(\"— Seeding blog posts...\")\n\n\tconst posts = blogPosts(categoryDocs)\n\tconst createdPosts = await Promise.all(\n\t\tposts.map((post) =>\n\t\t\tpayload.create({\n\t\t\t\tcollection: \"posts\",\n\t\t\t\tdepth: 0,\n\t\t\t\tcontext: { disableRevalidate: true },\n\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: Payload seed data type mismatch\n\t\t\t\tdata: post as any,\n\t\t\t}),\n\t\t),\n\t)\n\n\tpayload.logger.info(`— Seeded ${createdPosts.length} blog posts`)\n\n\tpayload.logger.info(\"— Seeding globals...\")\n\n\tawait Promise.all([\n\t\tpayload.updateGlobal({\n\t\t\tslug: \"header\",\n\t\t\tcontext: {\n\t\t\t\tdisableRevalidate: true,\n\t\t\t},\n\t\t\tdata: {\n\t\t\t\tnavItems: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"megaMenu\",\n\t\t\t\t\t\tlabel: \"Product\",\n\t\t\t\t\t\tmegaMenuColumns: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcolumnLabel: \"Features\",\n\t\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Templates\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Beautiful, ready-to-use directory templates\",\n\t\t\t\t\t\t\t\t\t\ticon: \"layout\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: featurePages[0].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Monetization\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Built-in payments and subscriptions\",\n\t\t\t\t\t\t\t\t\t\ticon: \"dollarSign\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: featurePages[1].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"SEO\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Schema markup and optimizations\",\n\t\t\t\t\t\t\t\t\t\ticon: \"search\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: featurePages[2].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcolumnLabel: \"Tools\",\n\t\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Dashboard\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Powerful admin and analytics\",\n\t\t\t\t\t\t\t\t\t\ticon: \"barChart\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: featurePages[3].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Automation\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Smart workflows and actions\",\n\t\t\t\t\t\t\t\t\t\ticon: \"zap\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: featurePages[4].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Custom Fields\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Flexible schemas for any niche\",\n\t\t\t\t\t\t\t\t\t\ticon: \"layers\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: featurePages[5].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"megaMenu\",\n\t\t\t\t\t\tlabel: \"Use Cases\",\n\t\t\t\t\t\tmegaMenuColumns: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcolumnLabel: \"Directory Types\",\n\t\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Local Services\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Plumbers, restaurants, photographers\",\n\t\t\t\t\t\t\t\t\t\ticon: \"globe\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: useCasePages[0].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"B2B Vendor Hubs\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"SaaS tools, agencies, consultants\",\n\t\t\t\t\t\t\t\t\t\ticon: \"building\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: useCasePages[1].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Communities\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Member directories, alumni networks\",\n\t\t\t\t\t\t\t\t\t\ticon: \"users\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: useCasePages[2].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: \"Marketplaces\",\n\t\t\t\t\t\t\t\t\t\tdescription: \"Multi-vendor platforms\",\n\t\t\t\t\t\t\t\t\t\ticon: \"store\",\n\t\t\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: useCasePages[3].id,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"link\",\n\t\t\t\t\t\tlabel: \"Pricing\",\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\tvalue: pricingPage.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"link\",\n\t\t\t\t\t\tlabel: \"Blog\",\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\turl: \"/posts\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"link\",\n\t\t\t\t\t\tlabel: \"Sign In\",\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\turl: \"/sign-in\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"link\",\n\t\t\t\t\t\tlabel: \"Get Started\",\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\turl: \"/sign-up\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t}),\n\t\tpayload.updateGlobal({\n\t\t\tslug: \"footer\",\n\t\t\tcontext: {\n\t\t\t\tdisableRevalidate: true,\n\t\t\t},\n\t\t\tdata: {\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: \"Product\",\n\t\t\t\t\t\tlinks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\tlabel: \"Home\",\n\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\tvalue: homePage.id,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\tlabel: \"Pricing\",\n\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\tvalue: pricingPage.id,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\tlabel: \"Templates\",\n\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\tvalue: featurePages[0].id,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: \"Resources\",\n\t\t\t\t\t\tlinks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\t\t\tlabel: \"Blog\",\n\t\t\t\t\t\t\t\t\turl: \"/posts\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\t\t\tlabel: \"Documentation\",\n\t\t\t\t\t\t\t\t\turl: \"/docs\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: \"Company\",\n\t\t\t\t\t\tlinks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\tlabel: \"About\",\n\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\tvalue: aboutPage.id,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: \"Legal\",\n\t\t\t\t\t\tlinks: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\tlabel: \"Privacy\",\n\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\tvalue: privacyPage.id,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\t\t\ttype: \"reference\",\n\t\t\t\t\t\t\t\t\tlabel: \"Terms\",\n\t\t\t\t\t\t\t\t\treference: {\n\t\t\t\t\t\t\t\t\t\trelationTo: \"pages\",\n\t\t\t\t\t\t\t\t\t\tvalue: termsPage.id,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tsocialLinks: {\n\t\t\t\t\ttwitter: \"https://x.com/directoryhub\",\n\t\t\t\t\tlinkedin: \"https://linkedin.com/company/directoryhub\",\n\t\t\t\t\tgithub: \"https://github.com/directoryhub\",\n\t\t\t\t},\n\t\t\t\tnewsletter: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\ttitle: \"Newsletter\",\n\t\t\t\t\tdescription: \"Stay up to date with DirectoryHub through weekly updates to your inbox.\",\n\t\t\t\t\tbuttonText: \"Subscribe\",\n\t\t\t\t\tplaceholder: \"Enter your email\",\n\t\t\t\t},\n\t\t\t\tcopyrightText: \"DirectoryHub\",\n\t\t\t\tbottomLinks: [\n\t\t\t\t\t{\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tlabel: \"Contact Support\",\n\t\t\t\t\t\t\turl: \"/support\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t}),\n\t])\n\n\tpayload.logger.info(\"DirectoryHub database seeded successfully!\")\n}\n",
225
225
  "marketing/payload/src/endpoints/seed/directoryhub/posts.ts": "import type { Category, Post } from \"@/payload-types\"\nimport { createRichText } from \"./richtext-helper\"\n\n// Helper to generate post content\nconst generatePostContent = (sections: Array<{ heading: string; content: string }>) => {\n\tconst elements: Array<\n\t\t{ type: \"heading\"; tag: \"h2\" | \"h3\"; text: string } | { type: \"paragraph\"; text: string }\n\t> = []\n\n\tfor (const section of sections) {\n\t\telements.push({ type: \"heading\", tag: \"h2\", text: section.heading })\n\t\telements.push({ type: \"paragraph\", text: section.content })\n\t}\n\n\treturn createRichText(elements)\n}\n\nexport const blogPosts = (categories: Category[]): Partial<Post>[] => {\n\t// Find or use default categories\n\tconst findCategory = (slug: string) => categories.find((c) => c.slug === slug)?.id\n\n\tconst posts: Partial<Post>[] = [\n\t\t// Directory Business Strategies (5 posts)\n\t\t{\n\t\t\ttitle: \"How to Launch a Profitable Directory Website in 2024\",\n\t\t\tslug: \"how-to-launch-profitable-directory-website-2024\",\n\t\t\t_status: \"published\",\n\t\t\tpublishedAt: new Date(\"2024-01-15\").toISOString(),\n\t\t\tcategories: findCategory(\"business\") ? [findCategory(\"business\")!] : [],\n\t\t\tcontent: generatePostContent([\n\t\t\t\t{\n\t\t\t\t\theading: \"The Directory Business Opportunity\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Choosing Your Niche\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Building Your MVP\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Acquiring Your First Listings\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Monetization Strategies\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t]),\n\t\t\tmeta: {\n\t\t\t\ttitle: \"How to Launch a Profitable Directory Website in 2024\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Complete guide to starting a directory business. Learn niche selection, MVP building, listing acquisition, and monetization strategies.\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttitle: \"10 Directory Business Models That Actually Make Money\",\n\t\t\tslug: \"10-directory-business-models-that-make-money\",\n\t\t\t_status: \"published\",\n\t\t\tpublishedAt: new Date(\"2024-01-22\").toISOString(),\n\t\t\tcategories: findCategory(\"business\") ? [findCategory(\"business\")!] : [],\n\t\t\tcontent: generatePostContent([\n\t\t\t\t{\n\t\t\t\t\theading: \"Introduction to Directory Monetization\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"1. Local Service Directories\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"2. B2B Software Directories\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"3. Professional Service Directories\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"4. Wedding Vendor Directories\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"The wedding industry spends heavily on advertising. Directories connecting couples with photographers, venues, and caterers can charge $200-2000/year for premium vendor listings.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"5. Real Estate Directories\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"Agent directories, property listings, and real estate service directories generate revenue through subscriptions and featured placements. High commission values support premium pricing.\",\n\t\t\t\t},\n\t\t\t]),\n\t\t\tmeta: {\n\t\t\t\ttitle: \"10 Directory Business Models That Actually Make Money\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Discover the most profitable directory niches and business models. From local services to B2B software, learn which directories generate real revenue.\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttitle: \"The Complete Guide to Niche Directory Market Research\",\n\t\t\tslug: \"complete-guide-niche-directory-market-research\",\n\t\t\t_status: \"published\",\n\t\t\tpublishedAt: new Date(\"2024-02-01\").toISOString(),\n\t\t\tcategories: findCategory(\"business\") ? [findCategory(\"business\")!] : [],\n\t\t\tcontent: generatePostContent([\n\t\t\t\t{\n\t\t\t\t\theading: \"Why Market Research Matters\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Evaluating Market Demand\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t'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.',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Analyzing Competition\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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).\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Validating Willingness to Pay\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Sizing Your Market\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t]),\n\t\t\tmeta: {\n\t\t\t\ttitle: \"The Complete Guide to Niche Directory Market Research\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Learn how to research and validate directory niches before building. Evaluate demand, competition, and monetization potential.\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttitle: \"Building a Directory Website Without Code: Tools and Platforms\",\n\t\t\tslug: \"building-directory-website-without-code\",\n\t\t\t_status: \"published\",\n\t\t\tpublishedAt: new Date(\"2024-02-10\").toISOString(),\n\t\t\tcategories: findCategory(\"technology\") ? [findCategory(\"technology\")!] : [],\n\t\t\tcontent: generatePostContent([\n\t\t\t\t{\n\t\t\t\t\theading: \"The No-Code Directory Revolution\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Key Features to Look For\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Dedicated Directory Platforms\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"WordPress with Directory Plugins\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Making Your Decision\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t]),\n\t\t\tmeta: {\n\t\t\t\ttitle: \"Building a Directory Website Without Code: Tools and Platforms\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Compare no-code directory platforms and tools. Launch your directory website in days without writing a single line of code.\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttitle: \"How to Price Directory Listings for Maximum Revenue\",\n\t\t\tslug: \"how-to-price-directory-listings-maximum-revenue\",\n\t\t\t_status: \"published\",\n\t\t\tpublishedAt: new Date(\"2024-02-18\").toISOString(),\n\t\t\tcategories: findCategory(\"business\") ? [findCategory(\"business\")!] : [],\n\t\t\tcontent: generatePostContent([\n\t\t\t\t{\n\t\t\t\t\theading: \"The Psychology of Directory Pricing\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Understanding Business Value\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Creating Pricing Tiers\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Annual vs Monthly Billing\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Testing and Optimization\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t]),\n\t\t\tmeta: {\n\t\t\t\ttitle: \"How to Price Directory Listings for Maximum Revenue\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Learn directory pricing strategies that maximize revenue. Create pricing tiers, understand business value, and optimize conversions.\",\n\t\t\t},\n\t\t},\n\n\t\t// Monetization Guides (4 posts)\n\t\t{\n\t\t\ttitle: \"Stripe Integration for Directory Payments: Complete Guide\",\n\t\t\tslug: \"stripe-integration-directory-payments-guide\",\n\t\t\t_status: \"published\",\n\t\t\tpublishedAt: new Date(\"2024-02-25\").toISOString(),\n\t\t\tcategories: findCategory(\"technology\") ? [findCategory(\"technology\")!] : [],\n\t\t\tcontent: generatePostContent([\n\t\t\t\t{\n\t\t\t\t\theading: \"Why Stripe for Directories\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Setting Up Stripe Connect\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Subscription Management\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"Use Stripe Billing to manage directory subscriptions. Create products for each tier, configure billing cycles, and let Stripe handle upgrades, downgrades, and cancellations automatically.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Handling Failed Payments\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Reporting and Analytics\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t]),\n\t\t\tmeta: {\n\t\t\t\ttitle: \"Stripe Integration for Directory Payments: Complete Guide\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Learn how to integrate Stripe with your directory for subscriptions, one-time payments, and marketplace payouts.\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttitle: \"Premium Listing Features That Businesses Will Pay For\",\n\t\t\tslug: \"premium-listing-features-businesses-will-pay-for\",\n\t\t\t_status: \"published\",\n\t\t\tpublishedAt: new Date(\"2024-03-05\").toISOString(),\n\t\t\tcategories: findCategory(\"business\") ? [findCategory(\"business\")!] : [],\n\t\t\tcontent: generatePostContent([\n\t\t\t\t{\n\t\t\t\t\theading: \"What Makes Premium Worth It\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Featured Placement\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Enhanced Profiles\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"Allow premium listings to add more photos, videos, service details, and portfolio examples. Rich profiles convert browsers into customers at higher rates.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Lead Capture Tools\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Verification Badges\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"Verified, licensed, or certified badges build trust. Offer verification as a premium feature or require premium subscriptions to display existing credentials prominently.\",\n\t\t\t\t},\n\t\t\t]),\n\t\t\tmeta: {\n\t\t\t\ttitle: \"Premium Listing Features That Businesses Will Pay For\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Discover which premium directory features generate the most revenue. Featured placements, enhanced profiles, lead capture, and more.\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttitle: \"Lead Generation Revenue: How Directories Charge Per Lead\",\n\t\t\tslug: \"lead-generation-revenue-directories-charge-per-lead\",\n\t\t\t_status: \"published\",\n\t\t\tpublishedAt: new Date(\"2024-03-12\").toISOString(),\n\t\t\tcategories: findCategory(\"business\") ? [findCategory(\"business\")!] : [],\n\t\t\tcontent: generatePostContent([\n\t\t\t\t{\n\t\t\t\t\theading: \"The Lead Gen Model\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Pricing Your Leads\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Qualifying Leads\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Distributing Leads\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Tracking and Reporting\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"Provide businesses with lead dashboards showing volume, sources, and conversion tracking. Transparency builds trust and helps businesses see the value of your directory.\",\n\t\t\t\t},\n\t\t\t]),\n\t\t\tmeta: {\n\t\t\t\ttitle: \"Lead Generation Revenue: How Directories Charge Per Lead\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Learn the lead generation business model for directories. Price leads, qualify inquiries, and build sustainable revenue.\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttitle: \"Affiliate Revenue Strategies for Directory Websites\",\n\t\t\tslug: \"affiliate-revenue-strategies-directory-websites\",\n\t\t\t_status: \"published\",\n\t\t\tpublishedAt: new Date(\"2024-03-20\").toISOString(),\n\t\t\tcategories: findCategory(\"business\") ? [findCategory(\"business\")!] : [],\n\t\t\tcontent: generatePostContent([\n\t\t\t\t{\n\t\t\t\t\theading: \"Directories and Affiliate Marketing\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Choosing Affiliate Programs\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Integration Strategies\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t'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.',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Disclosure and Trust\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"Always disclose affiliate relationships clearly. Trust is your most valuable asset. Transparent disclosure maintains credibility while still generating affiliate revenue.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Measuring Performance\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"Track clicks, conversions, and revenue by placement. A/B test different affiliate partners and placements. Focus efforts on high-converting, high-commission opportunities.\",\n\t\t\t\t},\n\t\t\t]),\n\t\t\tmeta: {\n\t\t\t\ttitle: \"Affiliate Revenue Strategies for Directory Websites\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Add affiliate revenue to your directory without charging businesses more. Learn integration strategies and program selection.\",\n\t\t\t},\n\t\t},\n\n\t\t// SEO Optimization (3 posts)\n\t\t{\n\t\t\ttitle: \"Directory SEO: Ranking Your Listings on Google\",\n\t\t\tslug: \"directory-seo-ranking-listings-google\",\n\t\t\t_status: \"published\",\n\t\t\tpublishedAt: new Date(\"2024-03-28\").toISOString(),\n\t\t\tcategories: findCategory(\"technology\") ? [findCategory(\"technology\")!] : [],\n\t\t\tcontent: generatePostContent([\n\t\t\t\t{\n\t\t\t\t\theading: \"Why SEO Matters for Directories\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t'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.',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Unique Listing Content\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Category Page Optimization\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Technical SEO Essentials\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"Ensure fast load times, mobile responsiveness, and clean URL structures. Implement proper canonical tags to handle pagination and filtering without creating duplicate content issues.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Building Directory Authority\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t]),\n\t\t\tmeta: {\n\t\t\t\ttitle: \"Directory SEO: Ranking Your Listings on Google\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Complete guide to directory SEO. Optimize listings, category pages, and technical elements to rank on Google.\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttitle: \"Schema Markup for Directory Websites Explained\",\n\t\t\tslug: \"schema-markup-directory-websites-explained\",\n\t\t\t_status: \"published\",\n\t\t\tpublishedAt: new Date(\"2024-04-05\").toISOString(),\n\t\t\tcategories: findCategory(\"technology\") ? [findCategory(\"technology\")!] : [],\n\t\t\tcontent: generatePostContent([\n\t\t\t\t{\n\t\t\t\t\theading: \"What is Schema Markup\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"LocalBusiness Schema\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Product and Service Schema\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"For directories listing products or services, use appropriate Product or Service schema. Include pricing, availability, and reviews to enable rich snippets in search results.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"AggregateRating Schema\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"If your directory includes reviews, implement AggregateRating schema. This can display star ratings in search results, significantly improving click-through rates.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Testing Your Schema\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t]),\n\t\t\tmeta: {\n\t\t\t\ttitle: \"Schema Markup for Directory Websites Explained\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Learn how to implement schema markup for directory websites. LocalBusiness, Product, and review schema for rich snippets.\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttitle: \"Creating SEO-Optimized Category Pages for Directories\",\n\t\t\tslug: \"seo-optimized-category-pages-directories\",\n\t\t\t_status: \"published\",\n\t\t\tpublishedAt: new Date(\"2024-04-12\").toISOString(),\n\t\t\tcategories: findCategory(\"technology\") ? [findCategory(\"technology\")!] : [],\n\t\t\tcontent: generatePostContent([\n\t\t\t\t{\n\t\t\t\t\theading: \"The Power of Category Pages\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Category Page Structure\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Internal Linking Strategy\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Faceted Navigation SEO\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"User Experience Signals\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t]),\n\t\t\tmeta: {\n\t\t\t\ttitle: \"Creating SEO-Optimized Category Pages for Directories\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Optimize directory category pages for search engines. Structure, content, internal linking, and faceted navigation best practices.\",\n\t\t\t},\n\t\t},\n\n\t\t// Success Stories/Case Studies (3 posts)\n\t\t{\n\t\t\ttitle: \"From Side Project to $50K MRR: A Directory Success Story\",\n\t\t\tslug: \"side-project-to-50k-mrr-directory-success-story\",\n\t\t\t_status: \"published\",\n\t\t\tpublishedAt: new Date(\"2024-04-20\").toISOString(),\n\t\t\tcategories: findCategory(\"news\") ? [findCategory(\"news\")!] : [],\n\t\t\tcontent: generatePostContent([\n\t\t\t\t{\n\t\t\t\t\theading: \"The Beginning\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Finding the Niche\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"The MVP Launch\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Growth Strategies That Worked\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Lessons Learned\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t]),\n\t\t\tmeta: {\n\t\t\t\ttitle: \"From Side Project to $50K MRR: A Directory Success Story\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"How one entrepreneur built a niche directory from weekend project to $50K monthly recurring revenue. Strategies and lessons learned.\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttitle: \"How Local Directories Compete with Google and Win\",\n\t\t\tslug: \"local-directories-compete-with-google-and-win\",\n\t\t\t_status: \"published\",\n\t\t\tpublishedAt: new Date(\"2024-04-28\").toISOString(),\n\t\t\tcategories: findCategory(\"news\") ? [findCategory(\"news\")!] : [],\n\t\t\tcontent: generatePostContent([\n\t\t\t\t{\n\t\t\t\t\theading: \"The Google Challenge\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Niche Expertise Wins\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Community Building\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"Successful local directories build communities around their niches. User reviews, Q&A forums, and resource content create engagement that generic platforms can't match.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Better Lead Quality\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"The Trust Factor\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t]),\n\t\t\tmeta: {\n\t\t\t\ttitle: \"How Local Directories Compete with Google and Win\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Why specialized local directories still thrive despite Google. Niche expertise, curation, and community building strategies.\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\ttitle: \"5 Directory Founders Share Their Biggest Mistakes\",\n\t\t\tslug: \"5-directory-founders-share-biggest-mistakes\",\n\t\t\t_status: \"published\",\n\t\t\tpublishedAt: new Date(\"2024-05-05\").toISOString(),\n\t\t\tcategories: findCategory(\"news\") ? [findCategory(\"news\")!] : [],\n\t\t\tcontent: generatePostContent([\n\t\t\t\t{\n\t\t\t\t\theading: \"Learning from Failure\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"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.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Mistake 1: Building Too Much Before Launching\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t'\"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.',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Mistake 2: Ignoring SEO Until Too Late\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t'\"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.',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Mistake 3: Pricing Too Low\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t'\"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.',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theading: \"Mistake 4: Trying to Serve Everyone\",\n\t\t\t\t\tcontent:\n\t\t\t\t\t\t\"\\\"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.\",\n\t\t\t\t},\n\t\t\t]),\n\t\t\tmeta: {\n\t\t\t\ttitle: \"5 Directory Founders Share Their Biggest Mistakes\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Learn from directory founders who share their costliest mistakes. Building too much, ignoring SEO, underpricing, and more.\",\n\t\t\t},\n\t\t},\n\t]\n\n\treturn posts\n}\n",
226
226
  "marketing/payload/src/endpoints/seed/directoryhub/pricing.ts": "import type { Page } from \"@/payload-types\"\nimport { createParagraph } from \"./richtext-helper\"\n\nexport const directoryHubPricing = (): Partial<Page> => {\n\treturn {\n\t\tslug: \"pricing\",\n\t\t_status: \"published\",\n\t\thero: {\n\t\t\ttype: \"lowImpact\",\n\t\t\trichText: {\n\t\t\t\troot: {\n\t\t\t\t\ttype: \"root\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"heading\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\ttext: \"Simple, Transparent Pricing\",\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\ttag: \"h1\",\n\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\ttext: \"Start free, scale as you grow. No hidden fees, no surprises.\",\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\tindent: 0,\n\t\t\t\t\tversion: 1,\n\t\t\t\t},\n\t\t\t},\n\t\t\tlinks: [],\n\t\t},\n\t\tlayout: [\n\t\t\t// Pricing Table - Fetches pricing and features dynamically from Stripe\n\t\t\t{\n\t\t\t\tblockType: \"pricingTable\",\n\t\t\t\tblockName: \"Pricing Plans\",\n\t\t\t\theading: \"Choose Your Plan\",\n\t\t\t\tsubheading: \"Save 20% with annual billing.\",\n\t\t\t\tshowComparisonTable: true,\n\t\t\t\tshowViewAllLink: false,\n\t\t\t\tmaxFeaturesOnCard: 4,\n\t\t\t\t// CTA link mapping for dynamic pricing (plan names must match Stripe product names)\n\t\t\t\tplans: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"Free\",\n\t\t\t\t\t\tprice: \"$0/mo\", // Fallback only\n\t\t\t\t\t\tdescription: \"Perfect for testing your directory idea\",\n\t\t\t\t\t\tfeatured: false,\n\t\t\t\t\t\tfeatures: [], // Features come from Stripe Entitlements\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tlabel: \"Get Started Free\",\n\t\t\t\t\t\t\turl: \"/sign-up\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"Pro\",\n\t\t\t\t\t\tprice: \"$29/mo\", // Fallback only\n\t\t\t\t\t\tdescription: \"For launching your first directory\",\n\t\t\t\t\t\tfeatured: false,\n\t\t\t\t\t\tfeatures: [], // Features come from Stripe Entitlements\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tlabel: \"Get Pro\",\n\t\t\t\t\t\t\turl: \"/sign-up\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"Business\",\n\t\t\t\t\t\tprice: \"$79/mo\", // Fallback only\n\t\t\t\t\t\tdescription: \"For growing directory businesses\",\n\t\t\t\t\t\tfeatured: true,\n\t\t\t\t\t\tfeatures: [], // Features come from Stripe Entitlements\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tlabel: \"Get Business\",\n\t\t\t\t\t\t\turl: \"/sign-up\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t// Trust Banner\n\t\t\t{\n\t\t\t\tblockType: \"proofBanner\",\n\t\t\t\tblockName: \"Trust Section\",\n\t\t\t\tstyle: \"withBackground\",\n\t\t\t\theadline: \"Trusted by 500+ directory builders worldwide\",\n\t\t\t\tsubtext:\n\t\t\t\t\t\"Join thousands of entrepreneurs building successful directories with DirectoryHub\",\n\t\t\t},\n\t\t\t// Features Comparison\n\t\t\t{\n\t\t\t\tblockType: \"bentoFeatures\",\n\t\t\t\tblockName: \"All Plans Include\",\n\t\t\t\theading: \"Everything you need to succeed\",\n\t\t\t\tsubheading: \"Core features included in every plan\",\n\t\t\t\tfeatures: [\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"layout\",\n\t\t\t\t\t\ttitle: \"Beautiful Templates\",\n\t\t\t\t\t\tdescription: createParagraph(\"Professionally designed, mobile-first templates.\"),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"search\",\n\t\t\t\t\t\ttitle: \"SEO Optimization\",\n\t\t\t\t\t\tdescription: createParagraph(\"Schema markup, sitemaps, and meta tags.\"),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"shield\",\n\t\t\t\t\t\ttitle: \"SSL Security\",\n\t\t\t\t\t\tdescription: createParagraph(\"Free SSL certificates for all directories.\"),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"zap\",\n\t\t\t\t\t\ttitle: \"Fast Performance\",\n\t\t\t\t\t\tdescription: createParagraph(\"CDN-powered for global speed.\"),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"globe\",\n\t\t\t\t\t\ttitle: \"Reliable Hosting\",\n\t\t\t\t\t\tdescription: createParagraph(\"99.9% uptime with automatic scaling.\"),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"small\",\n\t\t\t\t\t\tstyle: \"default\",\n\t\t\t\t\t\ticon: \"layers\",\n\t\t\t\t\t\ttitle: \"Easy Management\",\n\t\t\t\t\t\tdescription: createParagraph(\"Intuitive dashboard for all your directories.\"),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t// Final CTA\n\t\t\t{\n\t\t\t\tblockType: \"cta\",\n\t\t\t\tblockName: \"Pricing CTA\",\n\t\t\t\tlinks: [\n\t\t\t\t\t{\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tappearance: \"default\",\n\t\t\t\t\t\t\tlabel: \"Start Building Free\",\n\t\t\t\t\t\t\turl: \"/sign-up\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlink: {\n\t\t\t\t\t\t\ttype: \"custom\",\n\t\t\t\t\t\t\tappearance: \"outline\",\n\t\t\t\t\t\t\tlabel: \"Talk to Sales\",\n\t\t\t\t\t\t\turl: \"/contact\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\trichText: {\n\t\t\t\t\troot: {\n\t\t\t\t\t\ttype: \"root\",\n\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"heading\",\n\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\ttext: \"Ready to build your directory?\",\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\ttag: \"h3\",\n\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\ttext: \"Start free today. No credit card required. Upgrade when you're ready to scale.\",\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tmeta: {\n\t\t\tdescription:\n\t\t\t\t\"Simple, transparent pricing for DirectoryHub. Start free, scale as you grow. Plans from $0 to enterprise.\",\n\t\t\ttitle: \"Pricing — DirectoryHub Directory Builder\",\n\t\t},\n\t\ttitle: \"Pricing\",\n\t}\n}\n",
227
227
  "marketing/payload/src/endpoints/seed/directoryhub/privacy.ts": "import type { Page } from \"@/payload-types\"\n\nexport const directoryHubPrivacy = (): Partial<Page> => {\n\treturn {\n\t\tslug: \"privacy\",\n\t\t_status: \"published\",\n\t\thero: {\n\t\t\ttype: \"lowImpact\",\n\t\t\trichText: {\n\t\t\t\troot: {\n\t\t\t\t\ttype: \"root\",\n\t\t\t\t\tchildren: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"heading\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\ttext: \"Privacy Policy\",\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\ttag: \"h1\",\n\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\ttext: \"Last updated: December 2024\",\n\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\tindent: 0,\n\t\t\t\t\tversion: 1,\n\t\t\t\t},\n\t\t\t},\n\t\t\tlinks: [],\n\t\t},\n\t\tlayout: [\n\t\t\t{\n\t\t\t\tblockType: \"content\",\n\t\t\t\tcolumns: [\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: \"full\",\n\t\t\t\t\t\trichText: {\n\t\t\t\t\t\t\troot: {\n\t\t\t\t\t\t\t\ttype: \"root\",\n\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t// Introduction\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"heading\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"1. Introduction\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttag: \"h2\",\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: 'DirectoryHub (\"we\", \"our\", or \"us\") is committed to protecting your privacy. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you use our platform and services.',\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t// Information We Collect\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"heading\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"2. Information We Collect\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttag: \"h2\",\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"heading\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"Personal Information\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttag: \"h3\",\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"We may collect personal information that you voluntarily provide when you register for an account, subscribe to our services, or contact us. This may include: name, email address, billing information, company name, and other contact details.\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"heading\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"Automatically Collected Information\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttag: \"h3\",\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"When you access our platform, we automatically collect certain information including: IP address, browser type, operating system, referring URLs, pages viewed, and access times.\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t// How We Use Your Information\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"heading\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"3. How We Use Your Information\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttag: \"h2\",\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"We use the information we collect to: provide and maintain our services, process transactions and send related information, send promotional communications (with your consent), respond to your inquiries and provide customer support, monitor and analyze usage patterns, and improve our platform.\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t// Cookies and Tracking\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"heading\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"4. Cookies and Tracking Technologies\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttag: \"h2\",\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"We use cookies and similar tracking technologies to track activity on our platform and hold certain information. Cookies are files with a small amount of data that may include an anonymous unique identifier. You can instruct your browser to refuse all cookies or to indicate when a cookie is being sent.\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t// Third-Party Services\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"heading\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"5. Third-Party Services\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttag: \"h2\",\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"We may employ third-party companies and individuals to facilitate our service, provide service-related services, or assist us in analyzing how our service is used. These third parties have access to your personal information only to perform these tasks on our behalf and are obligated not to disclose or use it for any other purpose.\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t// Data Security\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"heading\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"6. Data Security\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttag: \"h2\",\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"We implement appropriate technical and organizational security measures to protect your personal information. However, no method of transmission over the Internet or electronic storage is 100% secure, and we cannot guarantee absolute security.\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t// Your Rights\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"heading\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"7. Your Rights\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttag: \"h2\",\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"Depending on your location, you may have certain rights regarding your personal information, including: the right to access your personal data, the right to correct inaccurate data, the right to delete your data, the right to restrict processing, the right to data portability, and the right to object to processing.\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t// Contact Us\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"heading\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"8. Contact Us\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttag: \"h2\",\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\t\t\t\tdetail: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tformat: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tmode: \"normal\",\n\t\t\t\t\t\t\t\t\t\t\t\tstyle: \"\",\n\t\t\t\t\t\t\t\t\t\t\t\ttext: \"If you have any questions about this Privacy Policy, please contact us at privacy@directoryhub.com.\",\n\t\t\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\t\t\ttextFormat: 0,\n\t\t\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tdirection: \"ltr\" as const,\n\t\t\t\t\t\t\t\tformat: \"\" as const,\n\t\t\t\t\t\t\t\tindent: 0,\n\t\t\t\t\t\t\t\tversion: 1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t\tmeta: {\n\t\t\tdescription:\n\t\t\t\t\"Read DirectoryHub's Privacy Policy to understand how we collect, use, and protect your personal information.\",\n\t\t\ttitle: \"Privacy Policy\",\n\t\t},\n\t\ttitle: \"Privacy Policy\",\n\t}\n}\n",
@@ -451,6 +451,9 @@ export const seedDirectoryHub = async ({
451
451
  await Promise.all([
452
452
  payload.updateGlobal({
453
453
  slug: "header",
454
+ context: {
455
+ disableRevalidate: true,
456
+ },
454
457
  data: {
455
458
  navItems: [
456
459
  {
@@ -640,6 +643,9 @@ export const seedDirectoryHub = async ({
640
643
  }),
641
644
  payload.updateGlobal({
642
645
  slug: "footer",
646
+ context: {
647
+ disableRevalidate: true,
648
+ },
643
649
  data: {
644
650
  columns: [
645
651
  {