Compare commits

..
22 Commits
Author SHA1 Message Date
ArraysID d21adebf73 feat: simplify joinTitle rendering in Testimonials section 2025-05-11 05:28:20 +07:00
ArraysID 744d39ea75 feat: implement Testimonials section with dynamic data fetching and UI integration 2025-05-11 05:28:20 +07:00
ArraysID da11ba5894 refactor: reorganize layout structure by moving Header and Footer components to RootLayout 2025-05-11 05:27:19 +07:00
ArraysID 6d29c81dad feat: enhance LearningResourcesSection with primary and secondary button links 2025-05-11 05:26:07 +07:00
ArraysID 4a7135dd17 feat: add Learning Resources section with dynamic data fetching and UI integration 2025-05-11 05:24:31 +07:00
ArraysID 33d750b221 feat: add heroImage field to HeroSection and implement image formatting utility 2025-05-11 05:24:31 +07:00
ArraysID 1f9aa2e6b3 feat: update FeaturesSection to use Iconify icons and adjust icon properties 2025-05-11 05:24:31 +07:00
ArraysID 7722c98c84 feat: replace Link component with Button for improved button styling in Community component 2025-05-11 05:24:31 +07:00
ArraysID 0914361635 feat: update Community component to use Iconify for icons and adjust CommunitiesSection configuration 2025-05-11 05:24:31 +07:00
ArraysID 74aabd1eba feat: add support for s3 bucket for media 2025-05-11 05:24:31 +07:00
ArraysID d1fc7a8fd5 refactor: move global section functions to services directory 2025-05-11 05:24:31 +07:00
ArraysID 009cabfc1c feat: add CommunitiesSection configuration and integrate with Community component 2025-05-11 05:24:31 +07:00
ArraysID a7f7521761 fix: update revalidation interval to 10 seconds 2025-05-11 05:24:31 +07:00
ArraysID 54b7a2f0eb refactor: optimize data fetching by using Promise.all 2025-05-11 05:24:31 +07:00
ArraysID ef042f2f40 feat: add revalidate constant to control page revalidation interval 2025-05-11 05:24:31 +07:00
ArraysID fd35cb9525 feat: add FeaturesSection global configuration and integrate with Features component 2025-05-11 05:24:31 +07:00
ArraysID 18d11fd1c3 feat: implement HeroSection global configuration and integrate with Hero component 2025-05-11 05:24:31 +07:00
ArraysID c82d9bcc70 fix: include withPayload in Next.js plugins for proper configuration 2025-05-11 05:24:31 +07:00
ArraysID a4dd793bb7 refactor: update config import paths to use local payload.config 2025-05-11 05:24:31 +07:00
ArraysID bba3c89b23 fix: update TypeScript paths for payload configuration 2025-05-11 05:24:31 +07:00
ArraysID 8b6aa21f82 feat: add payload configuration and update TypeScript target 2025-05-11 05:24:31 +07:00
ArraysID 0fffe2d403 feat: integrate payload cms to landing page 2025-05-11 05:24:09 +07:00
14 changed files with 89 additions and 207 deletions
+5 -10
View File
@@ -1,14 +1,9 @@
# API Endpoint
VITE_API_URL= VITE_API_URL=
# Payload CMS Secret Key (minimum 32 characters) CMS_SECRET=
CMS_SECRET=your-very-long-secret-key CMS_POSTGRES_URL=
# PostgreSQL Connection String CMS_STORAGE_ENDPOINT=
CMS_POSTGRES_URL=postgres://user:password@host:port/database CMS_STORAGE_ACCESS_KEY_ID=
CMS_STORAGE_SECRET_ACCESS_KEY=
# S3 Storage Configuration
CMS_STORAGE_ENDPOINT=https://your-s3-endpoint.com
CMS_STORAGE_ACCESS_KEY_ID=your-access-key-id
CMS_STORAGE_SECRET_ACCESS_KEY=your-secret-access-key
CMS_STORAGE_REGION=ap-southeast-1 CMS_STORAGE_REGION=ap-southeast-1
+13 -8
View File
@@ -1,15 +1,20 @@
//@ts-check
// eslint-disable-next-line @typescript-eslint/no-var-requires
const { composePlugins, withNx } = require('@nx/next'); const { composePlugins, withNx } = require('@nx/next');
const { withPayload } = require('@payloadcms/next/withPayload'); const { withPayload } = require('@payloadcms/next/withPayload');
/** @type {import('@nx/next/plugins/with-nx').WithNxOptions} */ /**
* @type {import('@nx/next/plugins/with-nx').WithNxOptions}
**/
const nextConfig = { const nextConfig = {
nx: { svgr: false }, nx: {
sassOptions: { // Set this to true if you would like to to use SVGR
quietDeps: true, // See: https://github.com/gregberge/svgr
logger: { svgr: false,
warn: () => {},
},
}, },
}; };
module.exports = composePlugins(withNx, withPayload)(nextConfig); const plugins = [withNx, withPayload];
module.exports = composePlugins(...plugins)(nextConfig);
@@ -1,21 +1,10 @@
'use client'; 'use client';
import { Button } from '@imphnen-frontend-service/shadcn-ui/atoms'; import { Button } from '@imphnen-frontend-service/shadcn-ui/atoms';
import { CallToActionSection } from 'apps/landing/src/payload-types';
import { motion, useInView } from 'framer-motion'; import { motion, useInView } from 'framer-motion';
import { useRef } from 'react'; import { useRef } from 'react';
export function CallToAction(props: CallToActionSection) { export function CallToAction() {
const {
title,
highlightedTitle,
subtitle,
primaryButtonLabel,
primaryButtonLink,
secondaryButtonLabel,
secondaryButtonLink,
} = props;
const ref = useRef(null); const ref = useRef(null);
const isInView = useInView(ref, { once: true, amount: 0.2 }); const isInView = useInView(ref, { once: true, amount: 0.2 });
@@ -39,30 +28,30 @@ export function CallToAction(props: CallToActionSection) {
<div className="relative z-10 text-center"> <div className="relative z-10 text-center">
<h2 className="text-3xl md:text-4xl lg:text-5xl font-bold mb-6"> <h2 className="text-3xl md:text-4xl lg:text-5xl font-bold mb-6">
{title}{' '} Siap Menjadi{' '}
<span className="bg-clip-text text-transparent bg-gradient-to-r from-primary to-blue-400"> <span className="bg-clip-text text-transparent bg-gradient-to-r from-primary to-blue-400">
{highlightedTitle} Programmer Handal?
</span> </span>
</h2> </h2>
<p className="text-lg text-muted-foreground mb-8 max-w-2xl mx-auto"> <p className="text-lg text-muted-foreground mb-8 max-w-2xl mx-auto">
{subtitle} Bergabunglah dengan komunitas IMPHNEN sekarang dan mulai
perjalanan programming mu dengan cara yang menyenangkan!
</p> </p>
<div className="flex flex-col sm:flex-row gap-4 justify-center"> <div className="flex flex-col sm:flex-row gap-4 justify-center">
<Button <Button
size="lg" size="lg"
className="bg-gradient-to-r from-primary to-blue-400 hover:from-primary/90 hover:to-blue-400/90 font-bold text-black hover:text-white cursor-pointer" className="bg-gradient-to-r from-primary to-blue-400 hover:from-primary/90 hover:to-blue-400/90
onClick={() => window.open(primaryButtonLink, '_blank')} font-bold text-black hover:text-white cursor-pointer"
> >
{primaryButtonLabel} Gabung Discord
</Button> </Button>
<Button <Button
size="lg" size="lg"
variant="outline" variant="outline"
className="border-primary hover:bg-primary/10" className="border-primary hover:bg-primary/10"
onClick={() => window.open(secondaryButtonLink, '_blank')}
> >
{secondaryButtonLabel} Join Facebook Group
</Button> </Button>
</div> </div>
</div> </div>
@@ -77,13 +77,14 @@ export function Community(props: CommunitiesSection) {
</div> </div>
<h3 className="mb-2 text-xl font-bold">{c.title}</h3> <h3 className="mb-2 text-xl font-bold">{c.title}</h3>
<p className="mb-6 text-muted-foreground">{c.description}</p> <p className="mb-6 text-muted-foreground">{c.description}</p>
<Button <a href={c.buttonLink} target="_blank">
variant="outline" <Button
className="w-full group-hover:bg-primary group-hover:text-primary-foreground transition-colors duration-300" variant="outline"
onClick={() => window.open(c.buttonLink, '_blank')} className="w-full group-hover:bg-primary group-hover:text-primary-foreground transition-colors duration-300"
> >
{c.buttonText} {c.buttonText}
</Button> </Button>
</a>
</div> </div>
<div className="absolute -bottom-1 -right-1 w-20 h-20 bg-gradient-to-tl from-primary/20 to-transparent rounded-tl-full opacity-0 group-hover:opacity-100 transition-opacity duration-500" /> <div className="absolute -bottom-1 -right-1 w-20 h-20 bg-gradient-to-tl from-primary/20 to-transparent rounded-tl-full opacity-0 group-hover:opacity-100 transition-opacity duration-500" />
</motion.div> </motion.div>
@@ -35,15 +35,13 @@ export function Header() {
<div className="container flex h-16 items-center justify-between"> <div className="container flex h-16 items-center justify-between">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<div className="relative overflow-hidden rounded"> <div className="relative overflow-hidden rounded">
<Link href="/"> <Image
<Image src="/logo.png"
src="/logo.png" alt="IMPHNEN Logo"
alt="IMPHNEN" width={64}
width={64} height={64}
height={64} className="object-cover cursor-pointer"
className="object-cover" />
/>
</Link>
</div> </div>
</div> </div>
@@ -84,13 +82,7 @@ export function Header() {
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">
<SimpleThemeToggle /> <SimpleThemeToggle />
<Button className="hidden md:flex bg-gradient-to-r from-primary to-blue-400 hover:from-primary/90 hover:to-blue-400/90 transition-all duration-300 font-bold text-black hover:text-white cursor-pointer">
<Button
className="hidden md:flex bg-gradient-to-r from-primary to-blue-400 hover:from-primary/90 hover:to-blue-400/90 transition-all duration-300 font-bold text-black hover:text-white cursor-pointer"
onClick={() =>
window.open('https://discord.com/invite/imphnen', '_blank')
}
>
Gabung Discord Gabung Discord
</Button> </Button>
@@ -69,7 +69,7 @@ export function Hero(props: HeroSection) {
</div> </div>
<div className="space-y-4"> <div className="space-y-4">
<h1 className="text-4xl md:text-5xl lg:text-6xl xl:text-7xl font-bold tracking-tighter bg-clip-text text-transparent bg-gradient-to-r from-foreground via-foreground to-foreground/70"> <h1 className="text-4xl font-bold tracking-tighter sm:text-5xl md:text-6xl lg:text-7xl bg-clip-text text-transparent bg-gradient-to-r from-foreground via-foreground to-foreground/70">
{title} <br /> {title} <br />
<span className="bg-clip-text text-transparent bg-gradient-to-r from-primary to-blue-400"> <span className="bg-clip-text text-transparent bg-gradient-to-r from-primary to-blue-400">
{highlight} {highlight}
@@ -80,26 +80,29 @@ export function Hero(props: HeroSection) {
</p> </p>
</div> </div>
<div className="flex flex-col sm:flex-row gap-4 w-full sm:w-auto"> <div className="flex flex-col sm:flex-row gap-4">
<Button <a href={buttons.primaryUrl} target="_blank">
size="lg" <Button
className="w-full sm:w-auto bg-gradient-to-r from-primary to-blue-400 hover:from-primary/90 hover:to-blue-400/90 transition-all duration-300 font-bold text-black hover:text-white cursor-pointer" size="lg"
onClick={() => window.open(buttons.primaryUrl, '_blank')} className="bg-gradient-to-r from-primary to-blue-400 hover:from-primary/90 hover:to-blue-400/90 transition-all duration-300
> font-bold text-black hover:text-white cursor-pointer"
{buttons.primaryLabel} >
</Button> {buttons.primaryLabel}
<Button </Button>
size="lg" </a>
variant="outline" <a href={buttons.secondaryUrl} target="_blank">
className="w-full sm:w-auto group relative overflow-hidden border-primary" <Button
onClick={() => window.open(buttons.secondaryUrl, '_blank')} size="lg"
> variant="outline"
<span className="absolute inset-0 bg-gradient-to-r from-primary/10 to-blue-400/10 translate-y-full group-hover:translate-y-0 transition-transform duration-300" /> className="group relative overflow-hidden border-primary"
<span className="relative">{buttons.secondaryLabel}</span> >
</Button> <span className="absolute inset-0 bg-gradient-to-r from-primary/10 to-blue-400/10 translate-y-full group-hover:translate-y-0 transition-transform duration-300" />
<span className="relative">{buttons.secondaryLabel}</span>
</Button>
</a>
</div> </div>
<div className="flex flex-wrap justify-center gap-6 sm:gap-8"> <div className="flex items-center gap-8">
{stats?.map(({ value, label }, i) => ( {stats?.map(({ value, label }, i) => (
<Fragment key={i}> <Fragment key={i}>
<div className="flex flex-col items-center"> <div className="flex flex-col items-center">
@@ -109,7 +112,7 @@ export function Hero(props: HeroSection) {
<div className="text-xs text-muted-foreground">{label}</div> <div className="text-xs text-muted-foreground">{label}</div>
</div> </div>
{i < stats.length - 1 && ( {i < stats.length - 1 && (
<div className="hidden sm:block h-10 border-r border-border mx-4" /> <div className="h-10 border-r border-border mx-4" />
)} )}
</Fragment> </Fragment>
))} ))}
@@ -117,7 +120,7 @@ export function Hero(props: HeroSection) {
</motion.div> </motion.div>
<motion.div <motion.div
className="relative w-full lg:w-auto mx-auto lg:ml-auto" className="relative mx-auto lg:ml-auto"
initial={{ opacity: 0, scale: 0.9 }} initial={{ opacity: 0, scale: 0.9 }}
animate={{ opacity: 1, scale: 1 }} animate={{ opacity: 1, scale: 1 }}
transition={{ duration: 0.5, delay: 0.2 }} transition={{ duration: 0.5, delay: 0.2 }}
@@ -78,15 +78,15 @@ export function LearningResources(props: LearningResourcesSection) {
</div> </div>
<h3 className="mb-2 text-xl font-bold">{r.title}</h3> <h3 className="mb-2 text-xl font-bold">{r.title}</h3>
<p className="mb-6 text-muted-foreground">{r.description}</p> <p className="mb-6 text-muted-foreground">{r.description}</p>
<a href={r.buttonLink} target="_blank">
<Button <Button
variant="link" variant="link"
className="p-0 h-auto font-medium text-primary hover:text-primary/80" className="p-0 h-auto font-medium text-primary hover:text-primary/80"
onClick={() => window.open(r.buttonLink, '_blank')} >
> {r.buttonText}
{r.buttonText} <Icon icon="tabler:arrow-right" className="h-6 w-6" />
<Icon icon="tabler:arrow-right" className="h-6 w-6" /> </Button>
</Button> </a>
</div> </div>
<div className="absolute -bottom-32 -right-32 w-64 h-64 bg-gradient-to-tl from-primary/10 to-transparent rounded-full opacity-0 group-hover:opacity-100 transition-all duration-500 group-hover:-translate-y-10 group-hover:-translate-x-10" /> <div className="absolute -bottom-32 -right-32 w-64 h-64 bg-gradient-to-tl from-primary/10 to-transparent rounded-full opacity-0 group-hover:opacity-100 transition-all duration-500 group-hover:-translate-y-10 group-hover:-translate-x-10" />
</motion.div> </motion.div>
@@ -110,22 +110,16 @@ export function LearningResources(props: LearningResourcesSection) {
{featured.description} {featured.description}
</p> </p>
<div className="flex flex-wrap gap-4"> <div className="flex flex-wrap gap-4">
<Button <a href={featured.primaryButtonLink} target="_blank">
className="bg-gradient-to-r from-primary to-blue-400 hover:from-primary/90 hover:to-blue-400/90 font-bold text-black hover:text-white cursor-pointer" <Button className="bg-gradient-to-r from-primary to-blue-400 hover:from-primary/90 hover:to-blue-400/90 font-bold text-black hover:text-white cursor-pointer">
onClick={() => {featured.primaryButtonText}
window.open(featured.primaryButtonLink, '_blank') </Button>
} </a>
> <a href={featured.secondaryButtonLink} target="_blank">
{featured.primaryButtonText} <Button variant="outline">
</Button> {featured.secondaryButtonText}
<Button </Button>
variant="outline" </a>
onClick={() =>
window.open(featured.secondaryButtonLink, '_blank')
}
>
{featured.secondaryButtonText}
</Button>
</div> </div>
</div> </div>
<div className="relative h-64 md:h-auto"> <div className="relative h-64 md:h-auto">
+1 -4
View File
@@ -1,4 +1,3 @@
import { getGlobalsCallToActionSection } from '../../services/get-globals-call-to-action-section';
import { getGlobalsCommunitiesSection } from '../../services/get-globals-communitues-section'; import { getGlobalsCommunitiesSection } from '../../services/get-globals-communitues-section';
import { getGlobalsFeaturesSection } from '../../services/get-globals-features-section'; import { getGlobalsFeaturesSection } from '../../services/get-globals-features-section';
import { getGlobalsHeroSection } from '../../services/get-globals-hero-section'; import { getGlobalsHeroSection } from '../../services/get-globals-hero-section';
@@ -20,14 +19,12 @@ export default async function Page() {
communitiesData, communitiesData,
learningResourcesData, learningResourcesData,
testimonialsData, testimonialsData,
callToActionData,
] = await Promise.all([ ] = await Promise.all([
getGlobalsHeroSection(), getGlobalsHeroSection(),
getGlobalsFeaturesSection(), getGlobalsFeaturesSection(),
getGlobalsCommunitiesSection(), getGlobalsCommunitiesSection(),
getGlobalsLearningResourcesSection(), getGlobalsLearningResourcesSection(),
getGlobalsTestimonialsSection(), getGlobalsTestimonialsSection(),
getGlobalsCallToActionSection(),
]); ]);
return ( return (
@@ -37,7 +34,7 @@ export default async function Page() {
<Community {...communitiesData} /> <Community {...communitiesData} />
<LearningResources {...learningResourcesData} /> <LearningResources {...learningResourcesData} />
<Testimonials {...testimonialsData} /> <Testimonials {...testimonialsData} />
<CallToAction {...callToActionData} /> <CallToAction />
</> </>
); );
} }
@@ -1,51 +0,0 @@
import { GlobalConfig } from 'payload';
export const CallToActionSection: GlobalConfig = {
slug: 'call-to-action-section',
label: 'Call To Action Section',
fields: [
{
name: 'title',
type: 'text',
required: true,
defaultValue: 'Siap Menjadi',
},
{
name: 'highlightedTitle',
type: 'text',
required: true,
defaultValue: 'Programmer Handal?',
},
{
name: 'subtitle',
type: 'textarea',
required: true,
defaultValue:
'Bergabunglah dengan komunitas IMPHNEN sekarang dan mulai perjalanan programming mu dengan cara yang menyenangkan!',
},
{
name: 'primaryButtonLabel',
type: 'text',
required: true,
defaultValue: 'Gabung Discord',
},
{
name: 'primaryButtonLink',
type: 'text',
required: true,
defaultValue: 'https://discord.gg/imphnen',
},
{
name: 'secondaryButtonLabel',
type: 'text',
required: true,
defaultValue: 'Join Facebook Group',
},
{
name: 'secondaryButtonLink',
type: 'text',
required: true,
defaultValue: 'https://facebook.com/groups/programmerhandal',
},
],
};
@@ -15,7 +15,7 @@ export const CommunitiesSection: GlobalConfig = {
description: description:
'Bergabunglah dengan grup Facebook kami untuk diskusi santai dan berbagi artikel menarik.', 'Bergabunglah dengan grup Facebook kami untuk diskusi santai dan berbagi artikel menarik.',
buttonText: 'Gabung Sekarang', buttonText: 'Gabung Sekarang',
buttonLink: 'https://facebook.com/groups/programmerhandal', buttonLink: 'https://facebook.com/groups/1032515944638255',
}, },
{ {
iconName: 'tabler:brand-instagram', iconName: 'tabler:brand-instagram',
+1 -1
View File
@@ -57,7 +57,7 @@ export const HeroSection: GlobalConfig = {
label: 'Primary Button URL', label: 'Primary Button URL',
type: 'text', type: 'text',
required: true, required: true,
defaultValue: 'https://facebook.com/groups/programmerhandal', defaultValue: 'https://web.facebook.com/groups/1032515944638255',
}, },
{ {
name: 'secondaryLabel', name: 'secondaryLabel',
-34
View File
@@ -90,7 +90,6 @@ export interface Config {
'communities-section': CommunitiesSection; 'communities-section': CommunitiesSection;
'learning-resources-section': LearningResourcesSection; 'learning-resources-section': LearningResourcesSection;
'testimonials-section': TestimonialsSection; 'testimonials-section': TestimonialsSection;
'call-to-action-section': CallToActionSection;
}; };
globalsSelect: { globalsSelect: {
'hero-section': HeroSectionSelect<false> | HeroSectionSelect<true>; 'hero-section': HeroSectionSelect<false> | HeroSectionSelect<true>;
@@ -98,7 +97,6 @@ export interface Config {
'communities-section': CommunitiesSectionSelect<false> | CommunitiesSectionSelect<true>; 'communities-section': CommunitiesSectionSelect<false> | CommunitiesSectionSelect<true>;
'learning-resources-section': LearningResourcesSectionSelect<false> | LearningResourcesSectionSelect<true>; 'learning-resources-section': LearningResourcesSectionSelect<false> | LearningResourcesSectionSelect<true>;
'testimonials-section': TestimonialsSectionSelect<false> | TestimonialsSectionSelect<true>; 'testimonials-section': TestimonialsSectionSelect<false> | TestimonialsSectionSelect<true>;
'call-to-action-section': CallToActionSectionSelect<false> | CallToActionSectionSelect<true>;
}; };
locale: null; locale: null;
user: User & { user: User & {
@@ -410,22 +408,6 @@ export interface TestimonialsSection {
updatedAt?: string | null; updatedAt?: string | null;
createdAt?: string | null; createdAt?: string | null;
} }
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "call-to-action-section".
*/
export interface CallToActionSection {
id: number;
title: string;
highlightedTitle: string;
subtitle: string;
primaryButtonLabel: string;
primaryButtonLink: string;
secondaryButtonLabel: string;
secondaryButtonLink: string;
updatedAt?: string | null;
createdAt?: string | null;
}
/** /**
* This interface was referenced by `Config`'s JSON-Schema * This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "hero-section_select". * via the `definition` "hero-section_select".
@@ -561,22 +543,6 @@ export interface TestimonialsSectionSelect<T extends boolean = true> {
createdAt?: T; createdAt?: T;
globalType?: T; globalType?: T;
} }
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "call-to-action-section_select".
*/
export interface CallToActionSectionSelect<T extends boolean = true> {
title?: T;
highlightedTitle?: T;
subtitle?: T;
primaryButtonLabel?: T;
primaryButtonLink?: T;
secondaryButtonLabel?: T;
secondaryButtonLink?: T;
updatedAt?: T;
createdAt?: T;
globalType?: T;
}
/** /**
* This interface was referenced by `Config`'s JSON-Schema * This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "auth". * via the `definition` "auth".
-2
View File
@@ -8,7 +8,6 @@ import { buildConfig } from 'payload';
import sharp from 'sharp'; import sharp from 'sharp';
import { fileURLToPath } from 'url'; import { fileURLToPath } from 'url';
import { CallToActionSection } from './collections/CallToActionSection';
import { CommunitiesSection } from './collections/CommunitiesSection'; import { CommunitiesSection } from './collections/CommunitiesSection';
import { FeaturesSection } from './collections/FeaturesSection'; import { FeaturesSection } from './collections/FeaturesSection';
import { HeroSection } from './collections/HeroSection'; import { HeroSection } from './collections/HeroSection';
@@ -40,7 +39,6 @@ export default buildConfig({
CommunitiesSection, CommunitiesSection,
LearningResourcesSection, LearningResourcesSection,
TestimonialsSection, TestimonialsSection,
CallToActionSection,
], ],
editor: lexicalEditor(), editor: lexicalEditor(),
secret: process.env.CMS_SECRET || '', secret: process.env.CMS_SECRET || '',
@@ -1,7 +0,0 @@
import { payload } from '../lib/payload';
export async function getGlobalsCallToActionSection() {
return await payload.findGlobal({
slug: 'call-to-action-section',
});
}