kofi-stack-template-generator 2.1.38 → 2.1.40
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.
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
> kofi-stack-template-generator@2.1.
|
|
2
|
+
> kofi-stack-template-generator@2.1.40 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.
|
|
6
|
+
> kofi-stack-template-generator@2.1.40 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
|
|
17
|
+
ESM ⚡️ Build success in 54ms
|
|
18
18
|
DTS Build start
|
|
19
|
-
DTS ⚡️ Build success in
|
|
19
|
+
DTS ⚡️ Build success in 488ms
|
|
20
20
|
DTS dist/index.d.ts 2.96 KB
|
package/dist/index.js
CHANGED
|
@@ -1904,8 +1904,8 @@ export const BentoFeatures: Block = {
|
|
|
1904
1904
|
"marketing/payload/src/blocks/Content/config.ts": 'import type { Block, Field } from "payload"\n\nimport {\n AlignFeature,\n BlockquoteFeature,\n ChecklistFeature,\n EXPERIMENTAL_TableFeature,\n FixedToolbarFeature,\n HeadingFeature,\n IndentFeature,\n InlineCodeFeature,\n InlineToolbarFeature,\n OrderedListFeature,\n RelationshipFeature,\n StrikethroughFeature,\n SubscriptFeature,\n SuperscriptFeature,\n UnorderedListFeature,\n UploadFeature,\n lexicalEditor,\n} from "@payloadcms/richtext-lexical"\n\nimport { link } from "@/fields/link"\n\nconst columnFields: Field[] = [\n {\n name: "size",\n type: "select",\n defaultValue: "oneThird",\n options: [\n {\n label: "One Third",\n value: "oneThird",\n },\n {\n label: "Half",\n value: "half",\n },\n {\n label: "Two Thirds",\n value: "twoThirds",\n },\n {\n label: "Full",\n value: "full",\n },\n ],\n },\n {\n name: "richText",\n type: "richText",\n editor: lexicalEditor({\n features: ({ rootFeatures }) => {\n return [\n ...rootFeatures,\n HeadingFeature({ enabledHeadingSizes: ["h2", "h3", "h4"] }),\n FixedToolbarFeature(),\n InlineToolbarFeature(),\n StrikethroughFeature(),\n SubscriptFeature(),\n SuperscriptFeature(),\n InlineCodeFeature(),\n BlockquoteFeature(),\n UnorderedListFeature(),\n OrderedListFeature(),\n ChecklistFeature(),\n AlignFeature(),\n IndentFeature(),\n RelationshipFeature(),\n UploadFeature(),\n EXPERIMENTAL_TableFeature(),\n ]\n },\n }),\n label: false,\n },\n {\n name: "enableLink",\n type: "checkbox",\n },\n link({\n overrides: {\n admin: {\n condition: (_data, siblingData) => {\n return Boolean(siblingData?.enableLink)\n },\n },\n },\n }),\n]\n\nexport const Content: Block = {\n slug: "content",\n interfaceName: "ContentBlock",\n fields: [\n {\n name: "columns",\n type: "array",\n admin: {\n initCollapsed: true,\n },\n fields: columnFields,\n },\n ],\n}\n',
|
|
1905
1905
|
"marketing/payload/src/blocks/FAQAccordion/Component.tsx": '"use client"\n\nimport RichText from "@/components/RichText"\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from "@/components/ui/accordion"\nimport type { FAQAccordionBlock as FAQAccordionBlockProps, Faq } from "@/payload-types"\nimport { cn } from "@/utilities/ui"\nimport type React from "react"\n\nexport const FAQAccordionBlock: React.FC<FAQAccordionBlockProps> = ({\n heading,\n subheading,\n style = "default",\n faqs,\n}) => {\n // Type guard to ensure we have FAQ objects, not just IDs\n const faqItems = (faqs || []).filter((faq): faq is Faq => typeof faq === "object" && faq !== null)\n\n if (faqItems.length === 0) {\n return null\n }\n\n const isCentered = style === "centered"\n const isTwoColumn = style === "twoColumn"\n\n // Split FAQs into two columns for two-column layout\n const midpoint = Math.ceil(faqItems.length / 2)\n const leftColumnFaqs = isTwoColumn ? faqItems.slice(0, midpoint) : faqItems\n const rightColumnFaqs = isTwoColumn ? faqItems.slice(midpoint) : []\n\n const renderFAQAccordion = (items: Faq[], columnKey: string) => (\n <Accordion type="single" collapsible className="w-full">\n {items.map((faq, index) => (\n <AccordionItem\n key={faq.id || `${columnKey}-${index}`}\n value={`${columnKey}-item-${index}`}\n className="border-b border-border/50"\n >\n <AccordionTrigger className="text-left text-base md:text-lg font-semibold hover:no-underline py-5">\n {faq.question}\n </AccordionTrigger>\n <AccordionContent className="text-muted-foreground pb-5">\n {faq.answer && (\n <RichText\n data={faq.answer}\n enableGutter={false}\n enableProse={false}\n className="prose-sm"\n />\n )}\n </AccordionContent>\n </AccordionItem>\n ))}\n </Accordion>\n )\n\n return (\n <section className="py-16 md:py-24">\n <div className="container">\n {/* Header */}\n {(heading || subheading) && (\n <div className={cn("mb-12 md:mb-16", isCentered && "text-center max-w-3xl mx-auto")}>\n {heading && (\n <h2 className="text-3xl md:text-4xl lg:text-5xl font-bold tracking-tight mb-4">\n {heading}\n </h2>\n )}\n {subheading && <p className="text-lg md:text-xl text-muted-foreground">{subheading}</p>}\n </div>\n )}\n\n {/* FAQ Content */}\n {isTwoColumn ? (\n <div className="grid grid-cols-1 lg:grid-cols-2 gap-8 lg:gap-16">\n <div>{renderFAQAccordion(leftColumnFaqs, "left")}</div>\n <div>{renderFAQAccordion(rightColumnFaqs, "right")}</div>\n </div>\n ) : (\n <div className={cn(isCentered && "max-w-3xl mx-auto")}>\n {renderFAQAccordion(faqItems, "main")}\n </div>\n )}\n </div>\n </section>\n )\n}\n',
|
|
1906
1906
|
"marketing/payload/src/blocks/FAQAccordion/config.ts": 'import type { Block } from "payload"\n\nexport const FAQAccordion: Block = {\n slug: "faqAccordion",\n interfaceName: "FAQAccordionBlock",\n labels: {\n singular: "FAQ Accordion",\n plural: "FAQ Accordions",\n },\n fields: [\n {\n name: "heading",\n type: "text",\n label: "Section Heading",\n defaultValue: "Frequently Asked Questions",\n },\n {\n name: "subheading",\n type: "textarea",\n label: "Section Subheading",\n },\n {\n name: "style",\n type: "select",\n defaultValue: "default",\n options: [\n { label: "Default", value: "default" },\n { label: "Centered", value: "centered" },\n { label: "Two Column", value: "twoColumn" },\n ],\n admin: {\n description: "Layout style for the FAQ section",\n },\n },\n {\n name: "faqs",\n type: "relationship",\n relationTo: "faqs",\n hasMany: true,\n label: "FAQs to Display",\n admin: {\n description: "Select FAQs to display in this section. Leave empty to show all FAQs.",\n },\n },\n {\n name: "filterByCategory",\n type: "select",\n label: "Filter by Category",\n options: [\n { label: "All Categories", value: "all" },\n { label: "General", value: "general" },\n { label: "Pricing", value: "pricing" },\n { label: "Features", value: "features" },\n { label: "Getting Started", value: "getting-started" },\n { label: "Technical", value: "technical" },\n { label: "Support", value: "support" },\n ],\n defaultValue: "all",\n admin: {\n condition: (data, siblingData) => !siblingData?.faqs?.length,\n description: "Only used when no specific FAQs are selected",\n },\n },\n {\n name: "maxItems",\n type: "number",\n label: "Maximum Items",\n defaultValue: 10,\n admin: {\n condition: (data, siblingData) => !siblingData?.faqs?.length,\n description: "Maximum number of FAQs to display (only when using category filter)",\n },\n },\n ],\n}\n',
|
|
1907
|
-
"marketing/payload/src/blocks/FeatureGrid/Component.tsx": 'import {\n BarChart3,\n Building,\n Database,\n DollarSign,\n Globe,\n Layers,\n Layout,\n type LucideIcon,\n Rocket,\n Search,\n Settings,\n Shield,\n Star,\n Target,\n Users,\n Zap,\n} from "lucide-react"\nimport type React from "react"\n\nimport type { FeatureGridBlock as FeatureGridBlockProps } from "@/payload-types"\n\nimport RichText from "@/components/RichText"\nimport { cn } from "@/utilities/ui"\n\nconst iconMap: Record<string, LucideIcon> = {\n rocket: Rocket,\n zap: Zap,\n building: Building,\n target: Target,\n layout: Layout,\n star: Star,\n dollarSign: DollarSign,\n search: Search,\n users: Users,\n globe: Globe,\n shield: Shield,\n settings: Settings,\n database: Database,\n barChart: BarChart3,\n layers: Layers,\n}\n\nexport const FeatureGridBlock: React.FC<FeatureGridBlockProps> = ({\n heading,\n subheading,\n columns,\n features,\n}) => {\n const gridCols: Record<string, string> = {\n "2": "md:grid-cols-2",\n "3": "md:grid-cols-2 lg:grid-cols-3",\n "4": "md:grid-cols-2 lg:grid-cols-4",\n }\n\n const columnClass = columns && columns in gridCols ? gridCols[columns] : gridCols["3"]\n\n return (\n <section className="py-20 md:py-28">\n <div className="container">\n {(heading || subheading) && (\n <div className="text-center mb-16 max-w-3xl mx-auto">\n {heading && <h2 className="text-3xl md:text-4xl font-bold mb-4">{heading}</h2>}\n {subheading && <p className="text-lg text-muted-foreground">{subheading}</p>}\n </div>\n )}\n\n {Array.isArray(features) && features.length > 0 && (\n <div className={cn("grid gap-6 lg:gap-8", columnClass)}>\n {features.map((feature, index) => {\n const iconKey = feature.icon\n const Icon =\n iconKey && iconKey in iconMap ? iconMap[iconKey as keyof typeof iconMap] : null\n\n return (\n <div\n key={index}\n className="group relative p-6 lg:p-8 rounded-xl border border-border bg-card hover:border-primary/30 hover:shadow-lg transition-all duration-300"\n >\n {/* Subtle gradient hover effect */}\n <div className="absolute inset-0 rounded-xl bg-gradient-to-br from-primary/5 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300" />\n\n <div className="relative">\n {Icon && (\n <div className="w-14 h-14 rounded-xl bg-primary/10 flex items-center justify-center mb-5 group-hover:bg-primary/15 group-hover:scale-105 transition-all duration-300">\n <Icon className="w-7 h-7 text-primary" />\n </div>\n )}\n {feature.title && (\n <h3 className="text-lg lg:text-xl font-semibold mb-3 group-hover:text-primary transition-colors duration-300">\n {feature.title}\n </h3>\n )}\n {feature.description && (\n <div className="text-muted-foreground text-sm lg:text-base leading-relaxed">\n <RichText data={feature.description} enableGutter={false} />\n </div>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )}\n </div>\n </section>\n )\n}\n',
|
|
1908
|
-
"marketing/payload/src/blocks/FeatureGrid/config.ts": 'import type { Block } from "payload"\n\nimport {\n AlignFeature,\n BlockquoteFeature,\n ChecklistFeature,\n EXPERIMENTAL_TableFeature,\n FixedToolbarFeature,\n IndentFeature,\n InlineCodeFeature,\n InlineToolbarFeature,\n OrderedListFeature,\n RelationshipFeature,\n StrikethroughFeature,\n SubscriptFeature,\n SuperscriptFeature,\n UnorderedListFeature,\n UploadFeature,\n lexicalEditor,\n} from "@payloadcms/richtext-lexical"\n\nexport const FeatureGrid: Block = {\n slug: "featureGrid",\n interfaceName: "FeatureGridBlock",\n fields: [\n {\n name: "heading",\n type: "text",\n label: "Section Heading",\n },\n {\n name: "subheading",\n type: "textarea",\n label: "Section Subheading",\n },\n {\n name: "columns",\n type: "select",\n defaultValue: "3",\n options: [\n { label: "2 Columns", value: "2" },\n { label: "3 Columns", value: "3" },\n { label: "4 Columns", value: "4" },\n ],\n },\n {\n name: "features",\n type: "array",\n label: "Features",\n minRows: 1,\n maxRows: 12,\n fields: [\n {\n name: "icon",\n type: "select",\n options: [\n { label: "Rocket", value: "rocket" },\n { label: "Zap", value: "zap" },\n { label: "Building", value: "building" },\n { label: "Target", value: "target" },\n { label: "Layout", value: "layout" },\n { label: "Star", value: "star" },\n { label: "DollarSign", value: "dollarSign" },\n { label: "Search", value: "search" },\n { label: "Users", value: "users" },\n { label: "Globe", value: "globe" },\n { label: "Shield", value: "shield" },\n { label: "Settings", value: "settings" },\n ],\n },\n {\n name: "title",\n type: "text",\n required: true,\n },\n {\n name: "description",\n type: "richText",\n editor: lexicalEditor({\n features: ({ rootFeatures }) => {\n return [\n ...rootFeatures,\n FixedToolbarFeature(),\n InlineToolbarFeature(),\n StrikethroughFeature(),\n SubscriptFeature(),\n SuperscriptFeature(),\n InlineCodeFeature(),\n BlockquoteFeature(),\n UnorderedListFeature(),\n OrderedListFeature(),\n ChecklistFeature(),\n AlignFeature(),\n IndentFeature(),\n RelationshipFeature(),\n UploadFeature(),\n EXPERIMENTAL_TableFeature(),\n ]\n },\n }),\n },\n ],\n },\n ],\n labels: {\n plural: "Feature Grids",\n singular: "Feature Grid",\n },\n}\n',
|
|
1907
|
+
"marketing/payload/src/blocks/FeatureGrid/Component.tsx": 'import {\n Award,\n BarChart3,\n Briefcase,\n Building,\n Check,\n Cloud,\n Database,\n DollarSign,\n Globe,\n Layers,\n Layout,\n Lock,\n type LucideIcon,\n Plug,\n Rocket,\n Search,\n Server,\n Settings,\n Shield,\n Star,\n Target,\n TrendingUp,\n Users,\n Zap,\n} from "lucide-react"\nimport type React from "react"\n\nimport type { FeatureGridBlock as FeatureGridBlockProps } from "@/payload-types"\n\nimport RichText from "@/components/RichText"\nimport { cn } from "@/utilities/ui"\n\nconst iconMap: Record<string, LucideIcon> = {\n rocket: Rocket,\n zap: Zap,\n building: Building,\n target: Target,\n layout: Layout,\n star: Star,\n dollarSign: DollarSign,\n search: Search,\n users: Users,\n globe: Globe,\n shield: Shield,\n settings: Settings,\n database: Database,\n barChart: BarChart3,\n layers: Layers,\n lock: Lock,\n cloud: Cloud,\n plug: Plug,\n award: Award,\n check: Check,\n server: Server,\n briefcase: Briefcase,\n trendingUp: TrendingUp,\n}\n\nexport const FeatureGridBlock: React.FC<FeatureGridBlockProps> = ({\n heading,\n subheading,\n columns,\n features,\n}) => {\n const gridCols: Record<string, string> = {\n "2": "md:grid-cols-2",\n "3": "md:grid-cols-2 lg:grid-cols-3",\n "4": "md:grid-cols-2 lg:grid-cols-4",\n }\n\n const columnClass = columns && columns in gridCols ? gridCols[columns] : gridCols["3"]\n\n return (\n <section className="py-20 md:py-28">\n <div className="container">\n {(heading || subheading) && (\n <div className="text-center mb-16 max-w-3xl mx-auto">\n {heading && <h2 className="text-3xl md:text-4xl font-bold mb-4">{heading}</h2>}\n {subheading && <p className="text-lg text-muted-foreground">{subheading}</p>}\n </div>\n )}\n\n {Array.isArray(features) && features.length > 0 && (\n <div className={cn("grid gap-6 lg:gap-8", columnClass)}>\n {features.map((feature, index) => {\n const iconKey = feature.icon\n const Icon =\n iconKey && iconKey in iconMap ? iconMap[iconKey as keyof typeof iconMap] : null\n\n return (\n <div\n key={index}\n className="group relative p-6 lg:p-8 rounded-xl border border-border bg-card hover:border-primary/30 hover:shadow-lg transition-all duration-300"\n >\n {/* Subtle gradient hover effect */}\n <div className="absolute inset-0 rounded-xl bg-gradient-to-br from-primary/5 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300" />\n\n <div className="relative">\n {Icon && (\n <div className="w-14 h-14 rounded-xl bg-primary/10 flex items-center justify-center mb-5 group-hover:bg-primary/15 group-hover:scale-105 transition-all duration-300">\n <Icon className="w-7 h-7 text-primary" />\n </div>\n )}\n {feature.title && (\n <h3 className="text-lg lg:text-xl font-semibold mb-3 group-hover:text-primary transition-colors duration-300">\n {feature.title}\n </h3>\n )}\n {feature.description && (\n <div className="text-muted-foreground text-sm lg:text-base leading-relaxed">\n <RichText data={feature.description} enableGutter={false} />\n </div>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )}\n </div>\n </section>\n )\n}\n',
|
|
1908
|
+
"marketing/payload/src/blocks/FeatureGrid/config.ts": 'import type { Block } from "payload"\n\nimport {\n AlignFeature,\n BlockquoteFeature,\n ChecklistFeature,\n EXPERIMENTAL_TableFeature,\n FixedToolbarFeature,\n IndentFeature,\n InlineCodeFeature,\n InlineToolbarFeature,\n OrderedListFeature,\n RelationshipFeature,\n StrikethroughFeature,\n SubscriptFeature,\n SuperscriptFeature,\n UnorderedListFeature,\n UploadFeature,\n lexicalEditor,\n} from "@payloadcms/richtext-lexical"\n\nexport const FeatureGrid: Block = {\n slug: "featureGrid",\n interfaceName: "FeatureGridBlock",\n fields: [\n {\n name: "heading",\n type: "text",\n label: "Section Heading",\n },\n {\n name: "subheading",\n type: "textarea",\n label: "Section Subheading",\n },\n {\n name: "columns",\n type: "select",\n defaultValue: "3",\n options: [\n { label: "2 Columns", value: "2" },\n { label: "3 Columns", value: "3" },\n { label: "4 Columns", value: "4" },\n ],\n },\n {\n name: "features",\n type: "array",\n label: "Features",\n minRows: 1,\n maxRows: 12,\n fields: [\n {\n name: "icon",\n type: "select",\n options: [\n { label: "Rocket", value: "rocket" },\n { label: "Zap", value: "zap" },\n { label: "Building", value: "building" },\n { label: "Target", value: "target" },\n { label: "Layout", value: "layout" },\n { label: "Star", value: "star" },\n { label: "DollarSign", value: "dollarSign" },\n { label: "Search", value: "search" },\n { label: "Users", value: "users" },\n { label: "Globe", value: "globe" },\n { label: "Shield", value: "shield" },\n { label: "Settings", value: "settings" },\n { label: "Database", value: "database" },\n { label: "BarChart", value: "barChart" },\n { label: "Layers", value: "layers" },\n { label: "Lock", value: "lock" },\n { label: "Cloud", value: "cloud" },\n { label: "Plug", value: "plug" },\n { label: "Award", value: "award" },\n { label: "Check", value: "check" },\n { label: "Server", value: "server" },\n { label: "Briefcase", value: "briefcase" },\n { label: "TrendingUp", value: "trendingUp" },\n ],\n },\n {\n name: "title",\n type: "text",\n required: true,\n },\n {\n name: "description",\n type: "richText",\n editor: lexicalEditor({\n features: ({ rootFeatures }) => {\n return [\n ...rootFeatures,\n FixedToolbarFeature(),\n InlineToolbarFeature(),\n StrikethroughFeature(),\n SubscriptFeature(),\n SuperscriptFeature(),\n InlineCodeFeature(),\n BlockquoteFeature(),\n UnorderedListFeature(),\n OrderedListFeature(),\n ChecklistFeature(),\n AlignFeature(),\n IndentFeature(),\n RelationshipFeature(),\n UploadFeature(),\n EXPERIMENTAL_TableFeature(),\n ]\n },\n }),\n },\n ],\n },\n ],\n labels: {\n plural: "Feature Grids",\n singular: "Feature Grid",\n },\n}\n',
|
|
1909
1909
|
"marketing/payload/src/blocks/FeatureShowcase/Component.tsx": `import { CheckCircle2 } from "lucide-react"
|
|
1910
1910
|
import type React from "react"
|
|
1911
1911
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kofi-stack-template-generator",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.40",
|
|
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.
|
|
20
|
+
"kofi-stack-types": "^2.1.40",
|
|
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-18T22:
|
|
3
|
+
// Generated: 2026-01-18T22:45:54.957Z
|
|
4
4
|
// Template count: 338
|
|
5
5
|
|
|
6
6
|
export const EMBEDDED_TEMPLATES: Record<string, string> = {
|
|
@@ -120,8 +120,8 @@ export const EMBEDDED_TEMPLATES: Record<string, string> = {
|
|
|
120
120
|
"marketing/payload/src/blocks/Content/config.ts": "import type { Block, Field } from \"payload\"\n\nimport {\n\tAlignFeature,\n\tBlockquoteFeature,\n\tChecklistFeature,\n\tEXPERIMENTAL_TableFeature,\n\tFixedToolbarFeature,\n\tHeadingFeature,\n\tIndentFeature,\n\tInlineCodeFeature,\n\tInlineToolbarFeature,\n\tOrderedListFeature,\n\tRelationshipFeature,\n\tStrikethroughFeature,\n\tSubscriptFeature,\n\tSuperscriptFeature,\n\tUnorderedListFeature,\n\tUploadFeature,\n\tlexicalEditor,\n} from \"@payloadcms/richtext-lexical\"\n\nimport { link } from \"@/fields/link\"\n\nconst columnFields: Field[] = [\n\t{\n\t\tname: \"size\",\n\t\ttype: \"select\",\n\t\tdefaultValue: \"oneThird\",\n\t\toptions: [\n\t\t\t{\n\t\t\t\tlabel: \"One Third\",\n\t\t\t\tvalue: \"oneThird\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"Half\",\n\t\t\t\tvalue: \"half\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"Two Thirds\",\n\t\t\t\tvalue: \"twoThirds\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"Full\",\n\t\t\t\tvalue: \"full\",\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"richText\",\n\t\ttype: \"richText\",\n\t\teditor: lexicalEditor({\n\t\t\tfeatures: ({ rootFeatures }) => {\n\t\t\t\treturn [\n\t\t\t\t\t...rootFeatures,\n\t\t\t\t\tHeadingFeature({ enabledHeadingSizes: [\"h2\", \"h3\", \"h4\"] }),\n\t\t\t\t\tFixedToolbarFeature(),\n\t\t\t\t\tInlineToolbarFeature(),\n\t\t\t\t\tStrikethroughFeature(),\n\t\t\t\t\tSubscriptFeature(),\n\t\t\t\t\tSuperscriptFeature(),\n\t\t\t\t\tInlineCodeFeature(),\n\t\t\t\t\tBlockquoteFeature(),\n\t\t\t\t\tUnorderedListFeature(),\n\t\t\t\t\tOrderedListFeature(),\n\t\t\t\t\tChecklistFeature(),\n\t\t\t\t\tAlignFeature(),\n\t\t\t\t\tIndentFeature(),\n\t\t\t\t\tRelationshipFeature(),\n\t\t\t\t\tUploadFeature(),\n\t\t\t\t\tEXPERIMENTAL_TableFeature(),\n\t\t\t\t]\n\t\t\t},\n\t\t}),\n\t\tlabel: false,\n\t},\n\t{\n\t\tname: \"enableLink\",\n\t\ttype: \"checkbox\",\n\t},\n\tlink({\n\t\toverrides: {\n\t\t\tadmin: {\n\t\t\t\tcondition: (_data, siblingData) => {\n\t\t\t\t\treturn Boolean(siblingData?.enableLink)\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}),\n]\n\nexport const Content: Block = {\n\tslug: \"content\",\n\tinterfaceName: \"ContentBlock\",\n\tfields: [\n\t\t{\n\t\t\tname: \"columns\",\n\t\t\ttype: \"array\",\n\t\t\tadmin: {\n\t\t\t\tinitCollapsed: true,\n\t\t\t},\n\t\t\tfields: columnFields,\n\t\t},\n\t],\n}\n",
|
|
121
121
|
"marketing/payload/src/blocks/FAQAccordion/Component.tsx": "\"use client\"\n\nimport RichText from \"@/components/RichText\"\nimport {\n\tAccordion,\n\tAccordionContent,\n\tAccordionItem,\n\tAccordionTrigger,\n} from \"@/components/ui/accordion\"\nimport type { FAQAccordionBlock as FAQAccordionBlockProps, Faq } from \"@/payload-types\"\nimport { cn } from \"@/utilities/ui\"\nimport type React from \"react\"\n\nexport const FAQAccordionBlock: React.FC<FAQAccordionBlockProps> = ({\n\theading,\n\tsubheading,\n\tstyle = \"default\",\n\tfaqs,\n}) => {\n\t// Type guard to ensure we have FAQ objects, not just IDs\n\tconst faqItems = (faqs || []).filter((faq): faq is Faq => typeof faq === \"object\" && faq !== null)\n\n\tif (faqItems.length === 0) {\n\t\treturn null\n\t}\n\n\tconst isCentered = style === \"centered\"\n\tconst isTwoColumn = style === \"twoColumn\"\n\n\t// Split FAQs into two columns for two-column layout\n\tconst midpoint = Math.ceil(faqItems.length / 2)\n\tconst leftColumnFaqs = isTwoColumn ? faqItems.slice(0, midpoint) : faqItems\n\tconst rightColumnFaqs = isTwoColumn ? faqItems.slice(midpoint) : []\n\n\tconst renderFAQAccordion = (items: Faq[], columnKey: string) => (\n\t\t<Accordion type=\"single\" collapsible className=\"w-full\">\n\t\t\t{items.map((faq, index) => (\n\t\t\t\t<AccordionItem\n\t\t\t\t\tkey={faq.id || `${columnKey}-${index}`}\n\t\t\t\t\tvalue={`${columnKey}-item-${index}`}\n\t\t\t\t\tclassName=\"border-b border-border/50\"\n\t\t\t\t>\n\t\t\t\t\t<AccordionTrigger className=\"text-left text-base md:text-lg font-semibold hover:no-underline py-5\">\n\t\t\t\t\t\t{faq.question}\n\t\t\t\t\t</AccordionTrigger>\n\t\t\t\t\t<AccordionContent className=\"text-muted-foreground pb-5\">\n\t\t\t\t\t\t{faq.answer && (\n\t\t\t\t\t\t\t<RichText\n\t\t\t\t\t\t\t\tdata={faq.answer}\n\t\t\t\t\t\t\t\tenableGutter={false}\n\t\t\t\t\t\t\t\tenableProse={false}\n\t\t\t\t\t\t\t\tclassName=\"prose-sm\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AccordionContent>\n\t\t\t\t</AccordionItem>\n\t\t\t))}\n\t\t</Accordion>\n\t)\n\n\treturn (\n\t\t<section className=\"py-16 md:py-24\">\n\t\t\t<div className=\"container\">\n\t\t\t\t{/* Header */}\n\t\t\t\t{(heading || subheading) && (\n\t\t\t\t\t<div className={cn(\"mb-12 md:mb-16\", isCentered && \"text-center max-w-3xl mx-auto\")}>\n\t\t\t\t\t\t{heading && (\n\t\t\t\t\t\t\t<h2 className=\"text-3xl md:text-4xl lg:text-5xl font-bold tracking-tight mb-4\">\n\t\t\t\t\t\t\t\t{heading}\n\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{subheading && <p className=\"text-lg md:text-xl text-muted-foreground\">{subheading}</p>}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* FAQ Content */}\n\t\t\t\t{isTwoColumn ? (\n\t\t\t\t\t<div className=\"grid grid-cols-1 lg:grid-cols-2 gap-8 lg:gap-16\">\n\t\t\t\t\t\t<div>{renderFAQAccordion(leftColumnFaqs, \"left\")}</div>\n\t\t\t\t\t\t<div>{renderFAQAccordion(rightColumnFaqs, \"right\")}</div>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div className={cn(isCentered && \"max-w-3xl mx-auto\")}>\n\t\t\t\t\t\t{renderFAQAccordion(faqItems, \"main\")}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</section>\n\t)\n}\n",
|
|
122
122
|
"marketing/payload/src/blocks/FAQAccordion/config.ts": "import type { Block } from \"payload\"\n\nexport const FAQAccordion: Block = {\n\tslug: \"faqAccordion\",\n\tinterfaceName: \"FAQAccordionBlock\",\n\tlabels: {\n\t\tsingular: \"FAQ Accordion\",\n\t\tplural: \"FAQ Accordions\",\n\t},\n\tfields: [\n\t\t{\n\t\t\tname: \"heading\",\n\t\t\ttype: \"text\",\n\t\t\tlabel: \"Section Heading\",\n\t\t\tdefaultValue: \"Frequently Asked Questions\",\n\t\t},\n\t\t{\n\t\t\tname: \"subheading\",\n\t\t\ttype: \"textarea\",\n\t\t\tlabel: \"Section Subheading\",\n\t\t},\n\t\t{\n\t\t\tname: \"style\",\n\t\t\ttype: \"select\",\n\t\t\tdefaultValue: \"default\",\n\t\t\toptions: [\n\t\t\t\t{ label: \"Default\", value: \"default\" },\n\t\t\t\t{ label: \"Centered\", value: \"centered\" },\n\t\t\t\t{ label: \"Two Column\", value: \"twoColumn\" },\n\t\t\t],\n\t\t\tadmin: {\n\t\t\t\tdescription: \"Layout style for the FAQ section\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"faqs\",\n\t\t\ttype: \"relationship\",\n\t\t\trelationTo: \"faqs\",\n\t\t\thasMany: true,\n\t\t\tlabel: \"FAQs to Display\",\n\t\t\tadmin: {\n\t\t\t\tdescription: \"Select FAQs to display in this section. Leave empty to show all FAQs.\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"filterByCategory\",\n\t\t\ttype: \"select\",\n\t\t\tlabel: \"Filter by Category\",\n\t\t\toptions: [\n\t\t\t\t{ label: \"All Categories\", value: \"all\" },\n\t\t\t\t{ label: \"General\", value: \"general\" },\n\t\t\t\t{ label: \"Pricing\", value: \"pricing\" },\n\t\t\t\t{ label: \"Features\", value: \"features\" },\n\t\t\t\t{ label: \"Getting Started\", value: \"getting-started\" },\n\t\t\t\t{ label: \"Technical\", value: \"technical\" },\n\t\t\t\t{ label: \"Support\", value: \"support\" },\n\t\t\t],\n\t\t\tdefaultValue: \"all\",\n\t\t\tadmin: {\n\t\t\t\tcondition: (data, siblingData) => !siblingData?.faqs?.length,\n\t\t\t\tdescription: \"Only used when no specific FAQs are selected\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"maxItems\",\n\t\t\ttype: \"number\",\n\t\t\tlabel: \"Maximum Items\",\n\t\t\tdefaultValue: 10,\n\t\t\tadmin: {\n\t\t\t\tcondition: (data, siblingData) => !siblingData?.faqs?.length,\n\t\t\t\tdescription: \"Maximum number of FAQs to display (only when using category filter)\",\n\t\t\t},\n\t\t},\n\t],\n}\n",
|
|
123
|
-
"marketing/payload/src/blocks/FeatureGrid/Component.tsx": "import {\n\tBarChart3,\n\tBuilding,\n\tDatabase,\n\tDollarSign,\n\tGlobe,\n\tLayers,\n\tLayout,\n\ttype LucideIcon,\n\tRocket,\n\tSearch,\n\tSettings,\n\tShield,\n\tStar,\n\tTarget,\n\tUsers,\n\tZap,\n} from \"lucide-react\"\nimport type React from \"react\"\n\nimport type { FeatureGridBlock as FeatureGridBlockProps } from \"@/payload-types\"\n\nimport RichText from \"@/components/RichText\"\nimport { cn } from \"@/utilities/ui\"\n\nconst iconMap: Record<string, LucideIcon> = {\n\trocket: Rocket,\n\tzap: Zap,\n\tbuilding: Building,\n\ttarget: Target,\n\tlayout: Layout,\n\tstar: Star,\n\tdollarSign: DollarSign,\n\tsearch: Search,\n\tusers: Users,\n\tglobe: Globe,\n\tshield: Shield,\n\tsettings: Settings,\n\tdatabase: Database,\n\tbarChart: BarChart3,\n\tlayers: Layers,\n}\n\nexport const FeatureGridBlock: React.FC<FeatureGridBlockProps> = ({\n\theading,\n\tsubheading,\n\tcolumns,\n\tfeatures,\n}) => {\n\tconst gridCols: Record<string, string> = {\n\t\t\"2\": \"md:grid-cols-2\",\n\t\t\"3\": \"md:grid-cols-2 lg:grid-cols-3\",\n\t\t\"4\": \"md:grid-cols-2 lg:grid-cols-4\",\n\t}\n\n\tconst columnClass = columns && columns in gridCols ? gridCols[columns] : gridCols[\"3\"]\n\n\treturn (\n\t\t<section className=\"py-20 md:py-28\">\n\t\t\t<div className=\"container\">\n\t\t\t\t{(heading || subheading) && (\n\t\t\t\t\t<div className=\"text-center mb-16 max-w-3xl mx-auto\">\n\t\t\t\t\t\t{heading && <h2 className=\"text-3xl md:text-4xl font-bold mb-4\">{heading}</h2>}\n\t\t\t\t\t\t{subheading && <p className=\"text-lg text-muted-foreground\">{subheading}</p>}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{Array.isArray(features) && features.length > 0 && (\n\t\t\t\t\t<div className={cn(\"grid gap-6 lg:gap-8\", columnClass)}>\n\t\t\t\t\t\t{features.map((feature, index) => {\n\t\t\t\t\t\t\tconst iconKey = feature.icon\n\t\t\t\t\t\t\tconst Icon =\n\t\t\t\t\t\t\t\ticonKey && iconKey in iconMap ? iconMap[iconKey as keyof typeof iconMap] : null\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\t\t\tclassName=\"group relative p-6 lg:p-8 rounded-xl border border-border bg-card hover:border-primary/30 hover:shadow-lg transition-all duration-300\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{/* Subtle gradient hover effect */}\n\t\t\t\t\t\t\t\t\t<div className=\"absolute inset-0 rounded-xl bg-gradient-to-br from-primary/5 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300\" />\n\n\t\t\t\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t\t\t\t{Icon && (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"w-14 h-14 rounded-xl bg-primary/10 flex items-center justify-center mb-5 group-hover:bg-primary/15 group-hover:scale-105 transition-all duration-300\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Icon className=\"w-7 h-7 text-primary\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{feature.title && (\n\t\t\t\t\t\t\t\t\t\t\t<h3 className=\"text-lg lg:text-xl font-semibold mb-3 group-hover:text-primary transition-colors duration-300\">\n\t\t\t\t\t\t\t\t\t\t\t\t{feature.title}\n\t\t\t\t\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{feature.description && (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-muted-foreground text-sm lg:text-base leading-relaxed\">\n\t\t\t\t\t\t\t\t\t\t\t\t<RichText data={feature.description} enableGutter={false} />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</section>\n\t)\n}\n",
|
|
124
|
-
"marketing/payload/src/blocks/FeatureGrid/config.ts": "import type { Block } from \"payload\"\n\nimport {\n\tAlignFeature,\n\tBlockquoteFeature,\n\tChecklistFeature,\n\tEXPERIMENTAL_TableFeature,\n\tFixedToolbarFeature,\n\tIndentFeature,\n\tInlineCodeFeature,\n\tInlineToolbarFeature,\n\tOrderedListFeature,\n\tRelationshipFeature,\n\tStrikethroughFeature,\n\tSubscriptFeature,\n\tSuperscriptFeature,\n\tUnorderedListFeature,\n\tUploadFeature,\n\tlexicalEditor,\n} from \"@payloadcms/richtext-lexical\"\n\nexport const FeatureGrid: Block = {\n\tslug: \"featureGrid\",\n\tinterfaceName: \"FeatureGridBlock\",\n\tfields: [\n\t\t{\n\t\t\tname: \"heading\",\n\t\t\ttype: \"text\",\n\t\t\tlabel: \"Section Heading\",\n\t\t},\n\t\t{\n\t\t\tname: \"subheading\",\n\t\t\ttype: \"textarea\",\n\t\t\tlabel: \"Section Subheading\",\n\t\t},\n\t\t{\n\t\t\tname: \"columns\",\n\t\t\ttype: \"select\",\n\t\t\tdefaultValue: \"3\",\n\t\t\toptions: [\n\t\t\t\t{ label: \"2 Columns\", value: \"2\" },\n\t\t\t\t{ label: \"3 Columns\", value: \"3\" },\n\t\t\t\t{ label: \"4 Columns\", value: \"4\" },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tname: \"features\",\n\t\t\ttype: \"array\",\n\t\t\tlabel: \"Features\",\n\t\t\tminRows: 1,\n\t\t\tmaxRows: 12,\n\t\t\tfields: [\n\t\t\t\t{\n\t\t\t\t\tname: \"icon\",\n\t\t\t\t\ttype: \"select\",\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ label: \"Rocket\", value: \"rocket\" },\n\t\t\t\t\t\t{ label: \"Zap\", value: \"zap\" },\n\t\t\t\t\t\t{ label: \"Building\", value: \"building\" },\n\t\t\t\t\t\t{ label: \"Target\", value: \"target\" },\n\t\t\t\t\t\t{ label: \"Layout\", value: \"layout\" },\n\t\t\t\t\t\t{ label: \"Star\", value: \"star\" },\n\t\t\t\t\t\t{ label: \"DollarSign\", value: \"dollarSign\" },\n\t\t\t\t\t\t{ label: \"Search\", value: \"search\" },\n\t\t\t\t\t\t{ label: \"Users\", value: \"users\" },\n\t\t\t\t\t\t{ label: \"Globe\", value: \"globe\" },\n\t\t\t\t\t\t{ label: \"Shield\", value: \"shield\" },\n\t\t\t\t\t\t{ label: \"Settings\", value: \"settings\" },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"title\",\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\trequired: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"description\",\n\t\t\t\t\ttype: \"richText\",\n\t\t\t\t\teditor: lexicalEditor({\n\t\t\t\t\t\tfeatures: ({ rootFeatures }) => {\n\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t...rootFeatures,\n\t\t\t\t\t\t\t\tFixedToolbarFeature(),\n\t\t\t\t\t\t\t\tInlineToolbarFeature(),\n\t\t\t\t\t\t\t\tStrikethroughFeature(),\n\t\t\t\t\t\t\t\tSubscriptFeature(),\n\t\t\t\t\t\t\t\tSuperscriptFeature(),\n\t\t\t\t\t\t\t\tInlineCodeFeature(),\n\t\t\t\t\t\t\t\tBlockquoteFeature(),\n\t\t\t\t\t\t\t\tUnorderedListFeature(),\n\t\t\t\t\t\t\t\tOrderedListFeature(),\n\t\t\t\t\t\t\t\tChecklistFeature(),\n\t\t\t\t\t\t\t\tAlignFeature(),\n\t\t\t\t\t\t\t\tIndentFeature(),\n\t\t\t\t\t\t\t\tRelationshipFeature(),\n\t\t\t\t\t\t\t\tUploadFeature(),\n\t\t\t\t\t\t\t\tEXPERIMENTAL_TableFeature(),\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],\n\tlabels: {\n\t\tplural: \"Feature Grids\",\n\t\tsingular: \"Feature Grid\",\n\t},\n}\n",
|
|
123
|
+
"marketing/payload/src/blocks/FeatureGrid/Component.tsx": "import {\n\tAward,\n\tBarChart3,\n\tBriefcase,\n\tBuilding,\n\tCheck,\n\tCloud,\n\tDatabase,\n\tDollarSign,\n\tGlobe,\n\tLayers,\n\tLayout,\n\tLock,\n\ttype LucideIcon,\n\tPlug,\n\tRocket,\n\tSearch,\n\tServer,\n\tSettings,\n\tShield,\n\tStar,\n\tTarget,\n\tTrendingUp,\n\tUsers,\n\tZap,\n} from \"lucide-react\"\nimport type React from \"react\"\n\nimport type { FeatureGridBlock as FeatureGridBlockProps } from \"@/payload-types\"\n\nimport RichText from \"@/components/RichText\"\nimport { cn } from \"@/utilities/ui\"\n\nconst iconMap: Record<string, LucideIcon> = {\n\trocket: Rocket,\n\tzap: Zap,\n\tbuilding: Building,\n\ttarget: Target,\n\tlayout: Layout,\n\tstar: Star,\n\tdollarSign: DollarSign,\n\tsearch: Search,\n\tusers: Users,\n\tglobe: Globe,\n\tshield: Shield,\n\tsettings: Settings,\n\tdatabase: Database,\n\tbarChart: BarChart3,\n\tlayers: Layers,\n\tlock: Lock,\n\tcloud: Cloud,\n\tplug: Plug,\n\taward: Award,\n\tcheck: Check,\n\tserver: Server,\n\tbriefcase: Briefcase,\n\ttrendingUp: TrendingUp,\n}\n\nexport const FeatureGridBlock: React.FC<FeatureGridBlockProps> = ({\n\theading,\n\tsubheading,\n\tcolumns,\n\tfeatures,\n}) => {\n\tconst gridCols: Record<string, string> = {\n\t\t\"2\": \"md:grid-cols-2\",\n\t\t\"3\": \"md:grid-cols-2 lg:grid-cols-3\",\n\t\t\"4\": \"md:grid-cols-2 lg:grid-cols-4\",\n\t}\n\n\tconst columnClass = columns && columns in gridCols ? gridCols[columns] : gridCols[\"3\"]\n\n\treturn (\n\t\t<section className=\"py-20 md:py-28\">\n\t\t\t<div className=\"container\">\n\t\t\t\t{(heading || subheading) && (\n\t\t\t\t\t<div className=\"text-center mb-16 max-w-3xl mx-auto\">\n\t\t\t\t\t\t{heading && <h2 className=\"text-3xl md:text-4xl font-bold mb-4\">{heading}</h2>}\n\t\t\t\t\t\t{subheading && <p className=\"text-lg text-muted-foreground\">{subheading}</p>}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{Array.isArray(features) && features.length > 0 && (\n\t\t\t\t\t<div className={cn(\"grid gap-6 lg:gap-8\", columnClass)}>\n\t\t\t\t\t\t{features.map((feature, index) => {\n\t\t\t\t\t\t\tconst iconKey = feature.icon\n\t\t\t\t\t\t\tconst Icon =\n\t\t\t\t\t\t\t\ticonKey && iconKey in iconMap ? iconMap[iconKey as keyof typeof iconMap] : null\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\t\t\tclassName=\"group relative p-6 lg:p-8 rounded-xl border border-border bg-card hover:border-primary/30 hover:shadow-lg transition-all duration-300\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{/* Subtle gradient hover effect */}\n\t\t\t\t\t\t\t\t\t<div className=\"absolute inset-0 rounded-xl bg-gradient-to-br from-primary/5 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300\" />\n\n\t\t\t\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t\t\t\t{Icon && (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"w-14 h-14 rounded-xl bg-primary/10 flex items-center justify-center mb-5 group-hover:bg-primary/15 group-hover:scale-105 transition-all duration-300\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Icon className=\"w-7 h-7 text-primary\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{feature.title && (\n\t\t\t\t\t\t\t\t\t\t\t<h3 className=\"text-lg lg:text-xl font-semibold mb-3 group-hover:text-primary transition-colors duration-300\">\n\t\t\t\t\t\t\t\t\t\t\t\t{feature.title}\n\t\t\t\t\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{feature.description && (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-muted-foreground text-sm lg:text-base leading-relaxed\">\n\t\t\t\t\t\t\t\t\t\t\t\t<RichText data={feature.description} enableGutter={false} />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</section>\n\t)\n}\n",
|
|
124
|
+
"marketing/payload/src/blocks/FeatureGrid/config.ts": "import type { Block } from \"payload\"\n\nimport {\n\tAlignFeature,\n\tBlockquoteFeature,\n\tChecklistFeature,\n\tEXPERIMENTAL_TableFeature,\n\tFixedToolbarFeature,\n\tIndentFeature,\n\tInlineCodeFeature,\n\tInlineToolbarFeature,\n\tOrderedListFeature,\n\tRelationshipFeature,\n\tStrikethroughFeature,\n\tSubscriptFeature,\n\tSuperscriptFeature,\n\tUnorderedListFeature,\n\tUploadFeature,\n\tlexicalEditor,\n} from \"@payloadcms/richtext-lexical\"\n\nexport const FeatureGrid: Block = {\n\tslug: \"featureGrid\",\n\tinterfaceName: \"FeatureGridBlock\",\n\tfields: [\n\t\t{\n\t\t\tname: \"heading\",\n\t\t\ttype: \"text\",\n\t\t\tlabel: \"Section Heading\",\n\t\t},\n\t\t{\n\t\t\tname: \"subheading\",\n\t\t\ttype: \"textarea\",\n\t\t\tlabel: \"Section Subheading\",\n\t\t},\n\t\t{\n\t\t\tname: \"columns\",\n\t\t\ttype: \"select\",\n\t\t\tdefaultValue: \"3\",\n\t\t\toptions: [\n\t\t\t\t{ label: \"2 Columns\", value: \"2\" },\n\t\t\t\t{ label: \"3 Columns\", value: \"3\" },\n\t\t\t\t{ label: \"4 Columns\", value: \"4\" },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tname: \"features\",\n\t\t\ttype: \"array\",\n\t\t\tlabel: \"Features\",\n\t\t\tminRows: 1,\n\t\t\tmaxRows: 12,\n\t\t\tfields: [\n\t\t\t\t{\n\t\t\t\t\tname: \"icon\",\n\t\t\t\t\ttype: \"select\",\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ label: \"Rocket\", value: \"rocket\" },\n\t\t\t\t\t\t{ label: \"Zap\", value: \"zap\" },\n\t\t\t\t\t\t{ label: \"Building\", value: \"building\" },\n\t\t\t\t\t\t{ label: \"Target\", value: \"target\" },\n\t\t\t\t\t\t{ label: \"Layout\", value: \"layout\" },\n\t\t\t\t\t\t{ label: \"Star\", value: \"star\" },\n\t\t\t\t\t\t{ label: \"DollarSign\", value: \"dollarSign\" },\n\t\t\t\t\t\t{ label: \"Search\", value: \"search\" },\n\t\t\t\t\t\t{ label: \"Users\", value: \"users\" },\n\t\t\t\t\t\t{ label: \"Globe\", value: \"globe\" },\n\t\t\t\t\t\t{ label: \"Shield\", value: \"shield\" },\n\t\t\t\t\t\t{ label: \"Settings\", value: \"settings\" },\n\t\t\t\t\t\t{ label: \"Database\", value: \"database\" },\n\t\t\t\t\t\t{ label: \"BarChart\", value: \"barChart\" },\n\t\t\t\t\t\t{ label: \"Layers\", value: \"layers\" },\n\t\t\t\t\t\t{ label: \"Lock\", value: \"lock\" },\n\t\t\t\t\t\t{ label: \"Cloud\", value: \"cloud\" },\n\t\t\t\t\t\t{ label: \"Plug\", value: \"plug\" },\n\t\t\t\t\t\t{ label: \"Award\", value: \"award\" },\n\t\t\t\t\t\t{ label: \"Check\", value: \"check\" },\n\t\t\t\t\t\t{ label: \"Server\", value: \"server\" },\n\t\t\t\t\t\t{ label: \"Briefcase\", value: \"briefcase\" },\n\t\t\t\t\t\t{ label: \"TrendingUp\", value: \"trendingUp\" },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"title\",\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\trequired: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"description\",\n\t\t\t\t\ttype: \"richText\",\n\t\t\t\t\teditor: lexicalEditor({\n\t\t\t\t\t\tfeatures: ({ rootFeatures }) => {\n\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t...rootFeatures,\n\t\t\t\t\t\t\t\tFixedToolbarFeature(),\n\t\t\t\t\t\t\t\tInlineToolbarFeature(),\n\t\t\t\t\t\t\t\tStrikethroughFeature(),\n\t\t\t\t\t\t\t\tSubscriptFeature(),\n\t\t\t\t\t\t\t\tSuperscriptFeature(),\n\t\t\t\t\t\t\t\tInlineCodeFeature(),\n\t\t\t\t\t\t\t\tBlockquoteFeature(),\n\t\t\t\t\t\t\t\tUnorderedListFeature(),\n\t\t\t\t\t\t\t\tOrderedListFeature(),\n\t\t\t\t\t\t\t\tChecklistFeature(),\n\t\t\t\t\t\t\t\tAlignFeature(),\n\t\t\t\t\t\t\t\tIndentFeature(),\n\t\t\t\t\t\t\t\tRelationshipFeature(),\n\t\t\t\t\t\t\t\tUploadFeature(),\n\t\t\t\t\t\t\t\tEXPERIMENTAL_TableFeature(),\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],\n\tlabels: {\n\t\tplural: \"Feature Grids\",\n\t\tsingular: \"Feature Grid\",\n\t},\n}\n",
|
|
125
125
|
"marketing/payload/src/blocks/FeatureShowcase/Component.tsx": "import { CheckCircle2 } from \"lucide-react\"\nimport type React from \"react\"\n\nimport type { FeatureShowcaseBlock as FeatureShowcaseBlockProps } from \"@/payload-types\"\n\nimport { CMSLink } from \"@/components/Link\"\nimport { Media } from \"@/components/Media\"\nimport RichText from \"@/components/RichText\"\nimport { cn } from \"@/utilities/ui\"\n\nexport const FeatureShowcaseBlock: React.FC<FeatureShowcaseBlockProps> = ({\n\tlabel,\n\theadline,\n\tdescription,\n\tlink,\n\tmedia,\n\timagePosition = \"right\",\n\tfeatures,\n}) => {\n\tconst isImageLeft = imagePosition === \"left\"\n\n\treturn (\n\t\t<section className=\"py-16 md:py-24\">\n\t\t\t<div className=\"container\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"grid gap-12 lg:gap-16 items-center\",\n\t\t\t\t\t\t\"lg:grid-cols-2\",\n\t\t\t\t\t\tisImageLeft && \"lg:[direction:rtl]\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{/* Content Side */}\n\t\t\t\t\t<div className={cn(\"lg:[direction:ltr]\", \"max-w-xl\")}>\n\t\t\t\t\t\t{label && (\n\t\t\t\t\t\t\t<span className=\"inline-block text-sm font-medium text-secondary mb-4 tracking-wide\">\n\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{headline && (\n\t\t\t\t\t\t\t<h2 className=\"text-3xl md:text-4xl lg:text-5xl font-bold mb-6 leading-tight\">\n\t\t\t\t\t\t\t\t{headline}\n\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{description && (\n\t\t\t\t\t\t\t<div className=\"text-lg text-muted-foreground mb-6\">\n\t\t\t\t\t\t\t\t<RichText data={description} enableGutter={false} />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Feature Bullets */}\n\t\t\t\t\t\t{Array.isArray(features) && features.length > 0 && (\n\t\t\t\t\t\t\t<ul className=\"space-y-3 mb-8\">\n\t\t\t\t\t\t\t\t{features.map((feature, index) => (\n\t\t\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: CMS items don't have stable IDs\n\t\t\t\t\t\t\t\t\t<li key={index} className=\"flex items-start gap-3\">\n\t\t\t\t\t\t\t\t\t\t<CheckCircle2 className=\"w-5 h-5 text-secondary mt-0.5 flex-shrink-0\" />\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">{feature.text}</span>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{link?.label && <CMSLink {...link} size=\"lg\" />}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Image Side */}\n\t\t\t\t\t<div className={cn(\"lg:[direction:ltr]\", \"relative\")}>\n\t\t\t\t\t\t{media && typeof media === \"object\" ? (\n\t\t\t\t\t\t\t<div className=\"relative rounded-xl overflow-hidden bg-muted\">\n\t\t\t\t\t\t\t\t<Media\n\t\t\t\t\t\t\t\t\tresource={media}\n\t\t\t\t\t\t\t\t\timgClassName=\"w-full h-auto object-cover\"\n\t\t\t\t\t\t\t\t\tsize=\"(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 600px\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t/* Placeholder when no image */\n\t\t\t\t\t\t\t<div className=\"relative rounded-xl overflow-hidden bg-gradient-to-br from-muted to-accent aspect-[4/3] flex items-center justify-center\">\n\t\t\t\t\t\t\t\t<div className=\"text-center p-8\">\n\t\t\t\t\t\t\t\t\t<div className=\"w-16 h-16 rounded-full bg-primary/10 flex items-center justify-center mx-auto mb-4\">\n\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-8 h-8 text-primary\"\n\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">Feature image placeholder</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</section>\n\t)\n}\n",
|
|
126
126
|
"marketing/payload/src/blocks/FeatureShowcase/config.ts": "import type { Block } from \"payload\"\n\nimport {\n\tAlignFeature,\n\tBlockquoteFeature,\n\tChecklistFeature,\n\tEXPERIMENTAL_TableFeature,\n\tFixedToolbarFeature,\n\tIndentFeature,\n\tInlineCodeFeature,\n\tInlineToolbarFeature,\n\tOrderedListFeature,\n\tRelationshipFeature,\n\tStrikethroughFeature,\n\tSubscriptFeature,\n\tSuperscriptFeature,\n\tUnorderedListFeature,\n\tUploadFeature,\n\tlexicalEditor,\n} from \"@payloadcms/richtext-lexical\"\n\nimport { link } from \"@/fields/link\"\n\nexport const FeatureShowcase: Block = {\n\tslug: \"featureShowcase\",\n\tinterfaceName: \"FeatureShowcaseBlock\",\n\tfields: [\n\t\t{\n\t\t\tname: \"label\",\n\t\t\ttype: \"text\",\n\t\t\tlabel: \"Label Tag\",\n\t\t\tadmin: {\n\t\t\t\tdescription: 'Small label above the headline (e.g., \"Marketing platform\")',\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"headline\",\n\t\t\ttype: \"text\",\n\t\t\tlabel: \"Headline\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tname: \"description\",\n\t\t\ttype: \"richText\",\n\t\t\teditor: lexicalEditor({\n\t\t\t\tfeatures: ({ rootFeatures }) => {\n\t\t\t\t\treturn [\n\t\t\t\t\t\t...rootFeatures,\n\t\t\t\t\t\tFixedToolbarFeature(),\n\t\t\t\t\t\tInlineToolbarFeature(),\n\t\t\t\t\t\tStrikethroughFeature(),\n\t\t\t\t\t\tSubscriptFeature(),\n\t\t\t\t\t\tSuperscriptFeature(),\n\t\t\t\t\t\tInlineCodeFeature(),\n\t\t\t\t\t\tBlockquoteFeature(),\n\t\t\t\t\t\tUnorderedListFeature(),\n\t\t\t\t\t\tOrderedListFeature(),\n\t\t\t\t\t\tChecklistFeature(),\n\t\t\t\t\t\tAlignFeature(),\n\t\t\t\t\t\tIndentFeature(),\n\t\t\t\t\t\tRelationshipFeature(),\n\t\t\t\t\t\tUploadFeature(),\n\t\t\t\t\t\tEXPERIMENTAL_TableFeature(),\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t}),\n\t\t},\n\t\tlink({\n\t\t\tappearances: [\"default\", \"outline\"],\n\t\t}),\n\t\t{\n\t\t\tname: \"media\",\n\t\t\ttype: \"upload\",\n\t\t\trelationTo: \"media\",\n\t\t\tlabel: \"Feature Image\",\n\t\t\tadmin: {\n\t\t\t\tdescription: \"Large image showcasing the feature (recommended: 800x600 or larger)\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"imagePosition\",\n\t\t\ttype: \"select\",\n\t\t\tdefaultValue: \"right\",\n\t\t\toptions: [\n\t\t\t\t{ label: \"Image on Right\", value: \"right\" },\n\t\t\t\t{ label: \"Image on Left\", value: \"left\" },\n\t\t\t],\n\t\t\tlabel: \"Image Position\",\n\t\t},\n\t\t{\n\t\t\tname: \"features\",\n\t\t\ttype: \"array\",\n\t\t\tlabel: \"Feature Bullets\",\n\t\t\tmaxRows: 6,\n\t\t\tadmin: {\n\t\t\t\tdescription: \"Optional list of feature highlights\",\n\t\t\t},\n\t\t\tfields: [\n\t\t\t\t{\n\t\t\t\t\tname: \"text\",\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\trequired: true,\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n\tlabels: {\n\t\tplural: \"Feature Showcases\",\n\t\tsingular: \"Feature Showcase\",\n\t},\n}\n",
|
|
127
127
|
"marketing/payload/src/blocks/FinalCTA/Component.tsx": "\"use client\"\n\nimport type React from \"react\"\n\nimport type { FinalCTABlock as FinalCTABlockProps } from \"@/payload-types\"\n\nimport { CTATracker } from \"@/components/Analytics\"\nimport { CMSLink } from \"@/components/Link\"\nimport { Media } from \"@/components/Media\"\nimport { cn } from \"@/utilities/ui\"\n\nexport const FinalCTABlock: React.FC<FinalCTABlockProps> = ({\n\theadline,\n\tsubheading,\n\tlinks,\n\tbackgroundImage,\n\tstyle = \"dark\",\n}) => {\n\tconst isDark = style === \"dark\"\n\tconst isGradient = style === \"gradient\"\n\n\treturn (\n\t\t<section className=\"relative overflow-hidden\">\n\t\t\t{/* Background */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute inset-0\",\n\t\t\t\t\tisDark && \"bg-primary\",\n\t\t\t\t\tisGradient && \"bg-gradient-to-br from-primary via-primary/90 to-primary/80\",\n\t\t\t\t\t!isDark && !isGradient && \"bg-muted\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{/* Background Image */}\n\t\t\t\t{backgroundImage && typeof backgroundImage === \"object\" && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Media\n\t\t\t\t\t\t\tresource={backgroundImage}\n\t\t\t\t\t\t\timgClassName=\"w-full h-full object-cover\"\n\t\t\t\t\t\t\tfill\n\t\t\t\t\t\t\tsize=\"100vw\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{/* Overlay for readability */}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"absolute inset-0\",\n\t\t\t\t\t\t\t\tisDark || isGradient ? \"bg-primary/80\" : \"bg-background/80\",\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\n\t\t\t\t{/* Decorative elements */}\n\t\t\t\t<div className=\"absolute inset-0 opacity-10\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"w-full h-full\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackgroundImage: `\n radial-gradient(circle at 20% 80%, rgba(255,255,255,0.1) 0%, transparent 50%),\n radial-gradient(circle at 80% 20%, rgba(255,255,255,0.1) 0%, transparent 50%)\n `,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Content */}\n\t\t\t<div className=\"container relative z-10 py-20 md:py-28 lg:py-32\">\n\t\t\t\t<div className=\"max-w-3xl\">\n\t\t\t\t\t{headline && (\n\t\t\t\t\t\t<h2\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"text-3xl md:text-4xl lg:text-5xl font-bold mb-6 leading-tight\",\n\t\t\t\t\t\t\t\tisDark || isGradient ? \"text-white\" : \"text-foreground\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{headline}\n\t\t\t\t\t\t</h2>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{subheading && (\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"text-lg md:text-xl mb-8 max-w-2xl\",\n\t\t\t\t\t\t\t\tisDark || isGradient ? \"text-white/80\" : \"text-muted-foreground\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{subheading}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{Array.isArray(links) && links.length > 0 && (\n\t\t\t\t\t\t<div className=\"flex flex-wrap gap-4\">\n\t\t\t\t\t\t\t{links.map(({ link }, i) => (\n\t\t\t\t\t\t\t\t// biome-ignore lint/suspicious/noArrayIndexKey: CMS links don't have stable IDs\n\t\t\t\t\t\t\t\t<CTATracker key={i} location=\"final_cta\" variant={link?.label || `cta_${i}`}>\n\t\t\t\t\t\t\t\t\t<CMSLink\n\t\t\t\t\t\t\t\t\t\t{...link}\n\t\t\t\t\t\t\t\t\t\tsize=\"lg\"\n\t\t\t\t\t\t\t\t\t\tappearance={link?.appearance}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t(isDark || isGradient) &&\n\t\t\t\t\t\t\t\t\t\t\t\ti === 0 &&\n\t\t\t\t\t\t\t\t\t\t\t\t\"bg-white text-primary hover:bg-white/90 border-white\",\n\t\t\t\t\t\t\t\t\t\t\t(isDark || isGradient) &&\n\t\t\t\t\t\t\t\t\t\t\t\ti !== 0 &&\n\t\t\t\t\t\t\t\t\t\t\t\t\"bg-white/10 border-white text-white hover:bg-white/20\",\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</CTATracker>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</section>\n\t)\n}\n",
|
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
import {
|
|
2
|
+
Award,
|
|
2
3
|
BarChart3,
|
|
4
|
+
Briefcase,
|
|
3
5
|
Building,
|
|
6
|
+
Check,
|
|
7
|
+
Cloud,
|
|
4
8
|
Database,
|
|
5
9
|
DollarSign,
|
|
6
10
|
Globe,
|
|
7
11
|
Layers,
|
|
8
12
|
Layout,
|
|
13
|
+
Lock,
|
|
9
14
|
type LucideIcon,
|
|
15
|
+
Plug,
|
|
10
16
|
Rocket,
|
|
11
17
|
Search,
|
|
18
|
+
Server,
|
|
12
19
|
Settings,
|
|
13
20
|
Shield,
|
|
14
21
|
Star,
|
|
15
22
|
Target,
|
|
23
|
+
TrendingUp,
|
|
16
24
|
Users,
|
|
17
25
|
Zap,
|
|
18
26
|
} from "lucide-react"
|
|
@@ -39,6 +47,14 @@ const iconMap: Record<string, LucideIcon> = {
|
|
|
39
47
|
database: Database,
|
|
40
48
|
barChart: BarChart3,
|
|
41
49
|
layers: Layers,
|
|
50
|
+
lock: Lock,
|
|
51
|
+
cloud: Cloud,
|
|
52
|
+
plug: Plug,
|
|
53
|
+
award: Award,
|
|
54
|
+
check: Check,
|
|
55
|
+
server: Server,
|
|
56
|
+
briefcase: Briefcase,
|
|
57
|
+
trendingUp: TrendingUp,
|
|
42
58
|
}
|
|
43
59
|
|
|
44
60
|
export const FeatureGridBlock: React.FC<FeatureGridBlockProps> = ({
|
|
@@ -66,6 +66,17 @@ export const FeatureGrid: Block = {
|
|
|
66
66
|
{ label: "Globe", value: "globe" },
|
|
67
67
|
{ label: "Shield", value: "shield" },
|
|
68
68
|
{ label: "Settings", value: "settings" },
|
|
69
|
+
{ label: "Database", value: "database" },
|
|
70
|
+
{ label: "BarChart", value: "barChart" },
|
|
71
|
+
{ label: "Layers", value: "layers" },
|
|
72
|
+
{ label: "Lock", value: "lock" },
|
|
73
|
+
{ label: "Cloud", value: "cloud" },
|
|
74
|
+
{ label: "Plug", value: "plug" },
|
|
75
|
+
{ label: "Award", value: "award" },
|
|
76
|
+
{ label: "Check", value: "check" },
|
|
77
|
+
{ label: "Server", value: "server" },
|
|
78
|
+
{ label: "Briefcase", value: "briefcase" },
|
|
79
|
+
{ label: "TrendingUp", value: "trendingUp" },
|
|
69
80
|
],
|
|
70
81
|
},
|
|
71
82
|
{
|