@treely/strapi-slices 7.16.1 → 7.17.0

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 +1 @@
1
- {"version":3,"file":"strapi-slices.cjs.production.min.js","sources":["../src/constants/strapi.ts","../src/integrations/strapi/strapiClient.ts","../src/integrations/strapi/getAllSlugsFromStrapi.ts","../src/constants/api.ts","../src/slices/TextCardGrid/TextCardGrid.tsx","../src/integrations/fpmClient.ts","../src/integrations/strapi/getStrapiProjects.ts","../src/integrations/strapi/getPortfolioProjects.ts","../src/integrations/strapi/getStrapiCollectionType.ts","../src/integrations/strapi/getStrapiSingleType.ts","../src/utils/strapiMediaUrl.ts","../src/constants/metadata.ts","../src/constants/slicesConfig.ts","../src/utils/strapiLinkUrl.ts","../src/components/SEOTags/SEOTags.tsx","../src/components/FullScreenImage/ZoomableImage.tsx","../src/components/FullScreenImage/FullScreenImage.tsx","../src/constants/breakpoints.ts","../src/slices/FullWidthImage/FullWidthImage.tsx","../src/constants/globalStyle.ts","../src/rootMessages.de.ts","../src/components/CreditsAvailableBadge/messages.de.ts","../src/components/EventCard/messages.de.ts","../src/components/portfolio/DocumentsDownloadList/messages.de.ts","../src/components/portfolio/ProjectInfo/messages.de.ts","../src/components/portfolio/SmallCheckout/messages.de.ts","../src/components/ProjectGridCard/messages.de.ts","../src/slices/Comparison/messages.de.ts","../src/slices/Cta/messages.de.ts","../src/components/CustomerCard/messages.de.ts","../src/components/CustomerQuoteCard/messages.de.ts","../src/slices/Events/messages.de.ts","../src/slices/Glossary/messages.de.ts","../src/slices/ProjectFacts/messages.de.ts","../src/slices/ProjectsMap/messages.de.ts","../src/slices/ShopCheckout/messages.de.ts","../src/slices/TextCarousel/messages.de.ts","../src/slices/Timeline/messages.de.ts","../src/unit.messages.de.ts","../src/utils/getMessages.ts","../src/rootMessages.en.ts","../src/components/CreditsAvailableBadge/messages.en.ts","../src/components/EventCard/messages.en.ts","../src/components/portfolio/DocumentsDownloadList/messages.en.ts","../src/components/portfolio/ProjectInfo/messages.en.ts","../src/components/portfolio/SmallCheckout/messages.en.ts","../src/components/ProjectGridCard/messages.en.ts","../src/slices/Comparison/messages.en.ts","../src/slices/Cta/messages.en.ts","../src/components/CustomerCard/messages.en.ts","../src/components/CustomerQuoteCard/messages.en.ts","../src/slices/Events/messages.en.ts","../src/slices/Glossary/messages.en.ts","../src/slices/ProjectFacts/messages.en.ts","../src/slices/ProjectsMap/messages.en.ts","../src/slices/ShopCheckout/messages.en.ts","../src/slices/TextCarousel/messages.en.ts","../src/slices/Timeline/messages.en.ts","../src/unit.messages.en.ts","../src/components/ContextProvider/ContextProvider.tsx","../src/components/StrapiLinkButton/StrapiLinkButton.tsx","../src/utils/openHubSpotChat.ts","../src/slices/Hero/Hero.tsx","../src/slices/IconGrid/IconGrid.tsx","../src/icons/LinkedInIcon.tsx","../src/components/StrapiLinkButtonWithIcon/StrapiLinkButtonWithIcon.tsx","../src/slices/ImageGrid/ImageGrid.tsx","../src/slices/ImageTextSequence/ImageTextSequence.tsx","../src/slices/LeftTextRightCard/LeftTextRightCard.tsx","../src/slices/LogoGridWithText/LogoGridWithText.tsx","../src/slices/MapHero/styles.ts","../src/slices/MapHero/MapHero.tsx","../src/utils/convertToKebabCase.ts","../src/slices/QAndA/QAndA.tsx","../src/slices/QuoteCards/QuoteCards.tsx","../src/slices/RichTextSection/RichTextSection.tsx","../src/slices/Steps/Steps.tsx","../src/models/fpm/FPMProject.ts","../src/slices/TextCarousel/styles.ts","../src/slices/TextCarousel/TextCarousel.tsx","../src/utils/shuffleElements.ts","../src/slices/TextWithTextCards/TextWithTextCards.tsx","../src/constants/formatter.ts","../src/components/CreditsAvailableBadge/CreditsAvailableBadge.tsx","../src/constants/mapbox.ts","../src/components/ProjectGridCard/ProjectGridCard.tsx","../src/slices/TextWithCard/TextWithCard.tsx","../src/slices/LinkCardsGrid/LinkCardsGrid.tsx","../src/slices/SmallHero/SmallHero.tsx","../src/slices/Blog/styles.ts","../src/slices/Blog/Blog.tsx","../src/slices/ProjectsGrid/ProjectsGrid.tsx","../src/slices/ProjectsMap/mapboxStyle.ts","../src/integrations/strapi/getFpmProjectsByBbox.ts","../src/utils/mergeProjectData.ts","../src/slices/ProjectsMap/ProjectsMap.tsx","../src/slices/Cta/Cta.tsx","../src/slices/Video/Video.tsx","../src/slices/FullWidthHighlightQuote/FullWidthHighlightQuote.tsx","../src/slices/FullWidthImageSlider/styles.ts","../src/utils/getClosestRatio.ts","../src/slices/FullWidthImageSlider/FullWidthImageSlider.tsx","../src/slices/SideBySideImages/SideBySideImages.tsx","../src/models/strapi/StrapiEvent.ts","../src/slices/CtaOnly/CtaOnly.tsx","../src/slices/Glossary/Glossary.tsx","../src/slices/ShopCheckout/ShopCheckout.tsx","../src/constants/domain.ts","../src/slices/Facts/Facts.tsx","../src/slices/BlogCards/BlogCards.tsx","../src/components/portfolio/SmallCheckout/SmallCheckout.tsx","../src/components/portfolio/ProjectInfo/ProjectInfo.tsx","../src/utils/convertCo2AmountKgToTons.ts","../src/utils/getTimeSpanInYears.ts","../src/utils/convertAreaM2ToHa.ts","../src/components/portfolio/DocumentsDownloadList/DocumentsDownloadList.tsx","../src/components/portfolio/Contact/Contact.tsx","../src/integrations/strapi/getFpmProjectById.ts","../src/slices/ProjectFacts/ProjectFacts.tsx","../src/components/CustomerCard/CustomerCard.tsx","../src/components/CustomerQuoteCard/CustomerQuoteCard.tsx","../src/components/LogoCard/LogoCard.tsx","../src/slices/CustomerStories/CustomerStories.tsx","../src/slices/Comparison/Icon.tsx","../src/slices/Comparison/Comparison.tsx","../src/slices/CarouselMarqueeBanner/styles.ts","../src/slices/CarouselMarqueeBanner/CarouselMarqueeBanner.tsx","../src/slices/Timeline/Timeline.tsx","../src/utils/isSameDate.ts","../src/slices/Events/Events.tsx","../src/components/EventCard/EventCard.tsx","../src/utils/getCountryFlag.ts","../src/models/hooks/useEvents.ts","../src/slices/Redirect/Redirect.tsx","../src/components/PreviewAlert/PreviewAlert.tsx","../src/components/SliceRenderer/SliceRenderer.tsx","../src/utils/mergeGlobalAndStrapiBlogPostData.ts","../src/utils/mergeGlobalAndStrapiCustomerStoryData.ts","../src/utils/mergeGlobalAndStrapiPageData.ts","../src/utils/mergeGlobalAndStrapiProjectData.ts"],"sourcesContent":["export const STRAPI_URI =\n process.env.NEXT_PUBLIC_STRAPI_URI || 'http://127.0.0.1:1337';\n\nexport const STRAPI_DEFAULT_PAGE_SIZE = '100';\nexport const STRAPI_DEFAULT_POPULATE_DEPTH = '6';\n\nexport const STRAPI_FALLBACK_LOCALE = 'en';\n","import axios from 'axios';\nimport qs from 'qs';\nimport { setupCache } from 'axios-cache-interceptor';\nimport { STRAPI_URI } from '../../constants/strapi';\n\nconst strapiClient = setupCache(\n axios.create({\n baseURL: `${STRAPI_URI}/api`,\n headers: { 'Strapi-Response-Format': 'v4' },\n paramsSerializer: (p) => qs.stringify(p, { encodeValuesOnly: true }),\n timeout: 60_000,\n }),\n {\n ttl:\n STRAPI_URI.includes('127.0.0.1') || STRAPI_URI.includes('localhost')\n ? 0\n : 10 * 60 * 1000, // 10 minutes\n }\n);\n\nexport default strapiClient;\n","import strapiClient from './strapiClient';\nimport {\n STRAPI_DEFAULT_PAGE_SIZE,\n STRAPI_FALLBACK_LOCALE,\n} from '../../constants/strapi';\nimport IStrapiResponse from '../../models/strapi/IStrapiResponse';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport LocalizedEntity from '../../models/LocalizedEntity';\n\ninterface Options {\n filters?: Record<string, any>;\n}\n\ntype Slug = { slug: string; locale: string };\n\nconst getAllSlugsFromStrapi = async <T extends LocalizedEntity<'slug'>>(\n path: string,\n locales: string[],\n { filters = {} }: Options = { filters: {} }\n): Promise<Slug[]> => {\n const slugPromises = locales.map((locale) =>\n strapiClient\n .get<IStrapiResponse<IStrapiData<T>[]>>(path, {\n params: {\n locale: locale,\n 'pagination[pageSize]': STRAPI_DEFAULT_PAGE_SIZE,\n filters,\n },\n })\n .then((response) =>\n response.data.data.map((page) => ({\n slug: page.attributes.slug,\n locale: page.attributes.locale,\n }))\n )\n // when a collection type for a requested locale does not exist, Strapi returns a 404. In this case, we return an empty array instead of throwing an error\n .catch((error) => {\n if (error.response?.status === 404) {\n return [];\n }\n throw error;\n })\n );\n\n const slugResults = await Promise.all(slugPromises);\n\n let allSlugs = slugResults.flat();\n\n // Identify missing locales for each slug\n const missingLocales = locales.flatMap((locale) => {\n return allSlugs\n .filter((slug) => slug.locale === STRAPI_FALLBACK_LOCALE)\n .filter(\n (fallbackSlug) =>\n !allSlugs.some(\n (slug) => slug.slug === fallbackSlug.slug && slug.locale === locale\n )\n )\n .map((fallbackSlug) => ({ ...fallbackSlug, locale })); // Clone only for missing locales\n });\n\n return [...allSlugs, ...missingLocales]; // Merge original and missing slugs\n};\n\nexport default getAllSlugsFromStrapi;\n","export const API_URI =\n process.env.NEXT_PUBLIC_API_URI || 'http://localhost:4001';\nexport const FPM_API_URI =\n process.env.NEXT_PUBLIC_FPM_API_URI || 'https://api.fpm.t-staging.com';\nexport const CDN_URI = 'https://cdn.tree.ly';\n","import React from 'react';\nimport { css } from '@emotion/react';\nimport {\n Box,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Flex,\n Heading,\n RichText,\n SimpleGrid,\n Text,\n useToken,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport { CaretRight } from '@phosphor-icons/react';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\n\ninterface TextCardGridSlice extends StrapiDefaultHeader {\n variant: 'shape' | 'image';\n cards: {\n id: number;\n tagline?: string;\n title: string;\n text: string;\n image: StrapiImage;\n buttons?: StrapiLink[];\n }[];\n}\nexport interface TextCardGridProps {\n slice: TextCardGridSlice;\n}\n\nenum ShapePosition {\n topLeft = 'top-left',\n topRight = 'top-right',\n bottomLeft = 'bottom-left',\n bottomRight = 'bottom-right',\n unset = 'unset',\n}\n\nconst shapePositions: ShapePosition[] = [\n ShapePosition.topLeft,\n ShapePosition.bottomRight,\n ShapePosition.topRight,\n ShapePosition.bottomLeft,\n ShapePosition.topRight,\n ShapePosition.bottomLeft,\n ShapePosition.topLeft,\n ShapePosition.bottomRight,\n];\n\nconst oppositesOfCorners = {\n [ShapePosition.bottomLeft]: ShapePosition.topRight,\n [ShapePosition.topRight]: ShapePosition.bottomLeft,\n [ShapePosition.bottomRight]: ShapePosition.topLeft,\n [ShapePosition.topLeft]: ShapePosition.bottomRight,\n [ShapePosition.unset]: ShapePosition.unset,\n};\n\ntype Variant = {\n padding: (string | null)[];\n positionIcon: (index: number) => ShapePosition;\n width: string;\n height: string;\n position: 'absolute' | 'relative';\n mb: string;\n};\n\nconst variants: { shape: Variant; image: Variant } = {\n shape: {\n padding: ['6', null, null, '8'],\n positionIcon: (index: number) =>\n shapePositions[index % shapePositions.length],\n width: '40',\n height: '40',\n position: 'absolute',\n mb: 'unset',\n },\n image: {\n padding: ['6', null, null, '8'],\n positionIcon: () => ShapePosition.unset,\n width: '24',\n height: '24',\n position: 'relative',\n mb: '10',\n },\n};\n\nexport const TextCardGrid: React.FC<TextCardGridProps> = ({\n slice,\n}: TextCardGridProps) => {\n const [primary800] = useToken('colors', ['primary.800']);\n\n return (\n <DefaultSectionContainer backgroundColor={primary800} title={slice.title}>\n <Wrapper>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n taglineProps={{ textAlign: 'center', color: 'white' }}\n titleProps={{\n textAlign: 'center',\n maxW: '2xl',\n marginX: 'auto',\n color: 'white',\n }}\n textProps={{\n textAlign: 'center',\n maxW: 'xl',\n marginX: 'auto',\n color: 'whiteAlpha.800',\n }}\n />\n\n <SimpleGrid\n mt={['14', null, null, '24']}\n columns={3}\n justifyItems=\"center\"\n gap=\"20\"\n rowGap=\"16\"\n minChildWidth={['100%', null, '16rem']}\n >\n {slice.cards.map(\n ({ id, tagline, title, text, image, buttons }, index) => (\n <Box\n key={id}\n backgroundColor=\"white\"\n zIndex=\"base\"\n padding={variants[slice.variant].padding}\n boxShadow=\"lg\"\n borderRadius=\"2xl\"\n minHeight=\"2xs\"\n width=\"full\"\n maxWidth={slice.cards.length > 1 ? 'unset' : 'xl'}\n position=\"relative\"\n display=\"flex\"\n flexDir=\"column\"\n alignItems=\"flex-start\"\n justifyContent={\n slice.variant === 'shape' ? 'flex-end' : 'flex-start'\n }\n overflow=\"hidden\"\n >\n <Box\n position={variants[slice.variant].position}\n width={variants[slice.variant].width}\n height={variants[slice.variant].height}\n mb={variants[slice.variant].mb}\n top={\n variants[slice.variant].positionIcon(index).includes('top')\n ? '-4'\n : 'unset'\n }\n left={\n variants[slice.variant].positionIcon(index).includes('left')\n ? '-4'\n : 'unset'\n }\n right={\n variants[slice.variant]\n .positionIcon(index)\n .includes('right')\n ? '-4'\n : 'unset'\n }\n bottom={\n variants[slice.variant]\n .positionIcon(index)\n .includes('bottom')\n ? '-4'\n : 'unset'\n }\n borderBottomRightRadius={\n oppositesOfCorners[\n variants[slice.variant].positionIcon(index)\n ].includes('bottomRight')\n ? 'full'\n : 'unset'\n }\n borderBottomLeftRadius={\n oppositesOfCorners[\n variants[slice.variant].positionIcon(index)\n ].includes('bottomLeft')\n ? 'full'\n : 'unset'\n }\n borderTopRightRadius={\n oppositesOfCorners[\n variants[slice.variant].positionIcon(index)\n ].includes('topRight')\n ? 'full'\n : 'unset'\n }\n borderTopLeftRadius={\n oppositesOfCorners[\n variants[slice.variant].positionIcon(index)\n ].includes('topLeft')\n ? 'full'\n : 'unset'\n }\n css={\n variants[slice.variant]\n .positionIcon(index)\n .includes('unset')\n ? css`\n & span,\n div,\n img {\n border-radius: var(--boemly-radii-xl);\n }\n `\n : css`\n & span,\n div,\n img {\n border-${\n oppositesOfCorners[\n variants[slice.variant].positionIcon(index)\n ]\n }-radius: var(--boemly-radii-full);\n }\n `\n }\n >\n <Image\n src={strapiMediaUrl(image.img, 'small')}\n alt={image.alt}\n fill\n style={{ objectFit: image.objectFit || 'cover' }}\n />\n </Box>\n <Box zIndex=\"aboveBase\" width=\"full\">\n {tagline && (\n <Text color=\"black\" size=\"smMonoNormal\" mb=\"2\">\n {tagline}\n </Text>\n )}\n <Heading as=\"h4\" size=\"xl\" mb=\"3\">\n {title}\n </Heading>\n <RichText\n content={text}\n listProps={{\n textColor: 'gray.500',\n textSize: 'smRegularNormal',\n }}\n textProps={{\n color: 'gray.500',\n size: 'smRegularNormal',\n }}\n />\n {buttons && !!buttons.length && (\n <Flex\n mt=\"4\"\n gap=\"3\"\n flexDir={['column', null, null, null, 'row']}\n >\n {buttons.map((button, buttonIndex) => (\n <StrapiLinkButton\n key={button.id}\n link={button}\n size=\"sm\"\n rightIcon={\n buttonIndex === 0 ? (\n <CaretRight size=\"10\" weight=\"bold\" />\n ) : undefined\n }\n variant={buttonIndex === 0 ? 'outline' : 'ghost'}\n component=\"TextCardGrid\"\n />\n ))}\n </Flex>\n )}\n </Box>\n </Box>\n )\n )}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import axios from 'axios';\nimport qs from 'qs';\nimport { setupCache } from 'axios-cache-interceptor';\nimport { FPM_API_URI } from '../constants/api';\n\nconst fpmClient = setupCache(\n axios.create({\n baseURL: `${FPM_API_URI}/v1`,\n paramsSerializer: (p) => qs.stringify(p, { encodeValuesOnly: true }),\n timeout: 5000,\n }),\n {\n ttl:\n FPM_API_URI.includes('127.0.0.1') || FPM_API_URI.includes('localhost')\n ? 0\n : 10 * 60 * 1000, // 10 minutes\n }\n);\n\nexport default fpmClient;\n","import { IStrapiData, IStrapiResponse, StrapiProject } from '../..';\nimport {\n STRAPI_DEFAULT_PAGE_SIZE,\n STRAPI_DEFAULT_POPULATE_DEPTH,\n} from '../../constants/strapi';\nimport strapiClient from './strapiClient';\n\nconst FALLBACK_LOCALE = 'en';\n\nconst getStrapiProjects = async (\n locale: string = 'en',\n pLevel: string = STRAPI_DEFAULT_POPULATE_DEPTH,\n preview: boolean = false\n): Promise<Map<string, IStrapiData<StrapiProject>>> => {\n const cache = preview ? false : undefined;\n const strapiParams: Record<string, any> = {\n pLevel,\n locale,\n 'pagination[pageSize]': STRAPI_DEFAULT_PAGE_SIZE,\n status: preview ? 'draft' : 'published',\n };\n\n const strapiProjects = new Map<string, IStrapiData<StrapiProject>>();\n\n try {\n const [strapiProjectsLocalized, strapiProjectsEnglish] = await Promise.all([\n strapiClient.get<IStrapiResponse<IStrapiData<StrapiProject>[]>>(\n '/projects',\n { params: strapiParams, cache }\n ),\n strapiClient.get<IStrapiResponse<IStrapiData<StrapiProject>[]>>(\n '/projects',\n {\n params: { ...strapiParams, locale: FALLBACK_LOCALE },\n cache,\n }\n ),\n ]);\n\n // Process Strapi data if we got it\n for (const project of [\n ...strapiProjectsEnglish.data.data,\n ...strapiProjectsLocalized.data.data,\n ]) {\n if (project.attributes.fpmProjectId) {\n strapiProjects.set(project.attributes.fpmProjectId, project);\n }\n }\n } catch (error) {\n console.warn('Failed to fetch Strapi data:', error);\n // Return empty map on failure\n }\n\n return strapiProjects;\n};\n\nexport default getStrapiProjects;\n","import { PortfolioProject } from '../..';\nimport { STRAPI_DEFAULT_POPULATE_DEPTH } from '../../constants/strapi';\nimport FPMProject from '../../models/fpm/FPMProject';\nimport fpmClient from '../fpmClient';\nimport getStrapiProjects from './getStrapiProjects';\n\nconst getPortfolioProjects = async (\n locale: string = 'en',\n preview: boolean = false\n): Promise<PortfolioProject[]> => {\n const cache = preview ? false : undefined;\n\n const [{ data: fpmProjects }, strapiProjects] = await Promise.all([\n fpmClient.get<FPMProject[]>('/public/projects', { cache }),\n getStrapiProjects(locale, STRAPI_DEFAULT_POPULATE_DEPTH, preview),\n ]);\n\n return fpmProjects.map((fpmProject: FPMProject) => {\n const strapiProject = strapiProjects.get(fpmProject.id);\n\n const toReturn: PortfolioProject = fpmProject;\n\n if (strapiProject?.attributes.slug) {\n toReturn.slug = strapiProject.attributes.slug;\n }\n if (strapiProject?.attributes.thumbnail) {\n toReturn.thumbnail = strapiProject?.attributes.thumbnail;\n }\n if (strapiProject?.attributes.portfolio.data?.attributes.host) {\n toReturn.portfolioHost =\n strapiProject.attributes.portfolio.data.attributes.host;\n }\n\n return toReturn;\n });\n};\n\nexport default getPortfolioProjects;\n","import strapiClient from './strapiClient';\nimport {\n STRAPI_DEFAULT_PAGE_SIZE,\n STRAPI_DEFAULT_POPULATE_DEPTH,\n STRAPI_FALLBACK_LOCALE,\n} from '../../constants/strapi';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport IStrapiResponse from '../../models/strapi/IStrapiResponse';\nimport LocalizedEntity from '../../models/LocalizedEntity';\n\ninterface Options {\n locale?: string;\n slug?: string;\n preview?: boolean;\n filters?: Record<string, any>;\n}\n\nconst getStrapiCollectionType = async <\n T extends LocalizedEntity<K>,\n K extends string\n>(\n path: string,\n key: K,\n { locale = 'en', preview = false, filters = {} }: Options\n): Promise<IStrapiData<T>[]> => {\n const cache = preview ? false : undefined;\n\n const sharedParams = {\n pLevel: STRAPI_DEFAULT_POPULATE_DEPTH,\n 'pagination[pageSize]': STRAPI_DEFAULT_PAGE_SIZE,\n filters,\n status: preview ? 'draft' : 'published',\n };\n\n const requestedLocaleData = await strapiClient\n .get<IStrapiResponse<IStrapiData<T>[]>>(path, {\n params: {\n ...sharedParams,\n locale,\n },\n cache,\n })\n .then((response) => response.data.data)\n // when a collection type for a requested locale does not exist, Strapi returns a 404. In this case, we return an empty array instead of throwing an error\n .catch((error) => {\n if (error.response?.status === 404) {\n return [];\n }\n throw error;\n });\n\n const fallbackLocaleData = await strapiClient\n .get<IStrapiResponse<IStrapiData<T>[]>>(path, {\n params: {\n ...sharedParams,\n locale: STRAPI_FALLBACK_LOCALE,\n },\n cache,\n })\n .then((response) => response.data.data)\n // when a collection type for a requested locale does not exist, Strapi returns a 404. In this case, we return an empty array instead of throwing an error\n .catch((error) => {\n if (error.response?.status === 404) {\n return [];\n }\n throw error;\n });\n\n const results = fallbackLocaleData.map((fallbackLocaleDataEntry) => {\n const requestedLocale = requestedLocaleData.find(\n (localized) =>\n localized.attributes[key] === fallbackLocaleDataEntry.attributes[key]\n );\n\n return requestedLocale || fallbackLocaleDataEntry;\n });\n\n return results;\n};\n\nexport default getStrapiCollectionType;\n","import { AxiosResponse } from 'axios';\nimport strapiClient from './strapiClient';\nimport {\n STRAPI_DEFAULT_PAGE_SIZE,\n STRAPI_DEFAULT_POPULATE_DEPTH,\n STRAPI_FALLBACK_LOCALE,\n} from '../../constants/strapi';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport IStrapiResponse from '../../models/strapi/IStrapiResponse';\n\ninterface Options {\n locale?: string;\n preview?: boolean;\n filters?: Record<string, any>;\n}\n\nconst getStrapiSingleType = async <T>(\n path: string,\n { locale = 'en', preview = false, filters = {} }: Options\n): Promise<IStrapiData<T>> => {\n const cache = preview ? false : undefined;\n const params: Record<string, any> = {\n pLevel: STRAPI_DEFAULT_POPULATE_DEPTH,\n locale,\n 'pagination[pageSize]': STRAPI_DEFAULT_PAGE_SIZE,\n filters,\n status: preview ? 'draft' : 'published',\n };\n\n let response: AxiosResponse<IStrapiResponse<IStrapiData<T>>>;\n\n try {\n response = await strapiClient.get(path, { params, cache });\n return response.data.data;\n } catch (error: any) {\n if (error.isAxiosError && error.response?.status === 404) {\n // Retry request with fallback locale\n response = await strapiClient.get(path, {\n params: { ...params, locale: STRAPI_FALLBACK_LOCALE },\n cache,\n });\n\n return response.data.data;\n }\n\n throw error;\n }\n};\n\nexport default getStrapiSingleType;\n","import { STRAPI_URI } from '../constants/strapi';\nimport IStrapi from '../models/strapi/IStrapi';\nimport IStrapiData from '../models/strapi/IStrapiData';\nimport StrapiMedia from '../models/strapi/StrapiMedia';\n\nconst strapiMediaUrl = (\n media: IStrapi<IStrapiData<StrapiMedia>>,\n preferredSize:\n | 'native'\n | 'thumbnail'\n | 'xSmall'\n | 'small'\n | 'medium'\n | 'large'\n | 'xLarge' = 'native'\n): string => {\n let { url } = media.data.attributes || {};\n if (preferredSize !== 'native' && media.data.attributes.ext !== '.svg') {\n url = media.data.attributes.formats[preferredSize]?.url || url;\n }\n if (url && (url.indexOf('http://') === 0 || url.indexOf('https://') === 0)) {\n return url;\n }\n return `${\n STRAPI_URI.includes('127.0.0.1') || STRAPI_URI.includes('localhost')\n ? STRAPI_URI\n : ''\n }${url}`;\n};\n\nexport default strapiMediaUrl;\n","export const DEFAULT_SHARE_IMAGE =\n 'https://cdn.tree.ly/assets/v3/app/share-image-generic.webp';\nexport const DEFAULT_SHARE_ALT = 'Share Image';\n","export const EXTENDABLE_HEADER_SECTIONS = [\n 'sections.hero',\n 'sections.map-hero',\n 'sections.full-width-image',\n 'sections.small-hero',\n 'sections.small-hero-light',\n];\nexport const DARK_THEME_HEADER_SECTIONS = [\n 'sections.hero',\n 'sections.small-hero',\n];\nexport const SLICES_WITH_BLOG_POSTS = ['sections.blog', 'sections.blog-cards'];\nexport const SLICES_WITH_CUSTOMER_STORIES = ['sections.customer-stories'];\nexport const SLICES_WITH_PROJECTS = [\n 'sections.projects-grid',\n 'sections.projects-map',\n 'sections.project-facts',\n 'sections.text-with-card',\n];\n","import StrapiLink from '../models/strapi/StrapiLink';\n\nconst strapiLinkUrl = (\n strapiLink: StrapiLink | undefined = undefined\n): string => {\n if (strapiLink?.page?.data) {\n return `/${strapiLink.page.data.attributes.slug}`;\n }\n\n return strapiLink?.url || '/';\n};\n\nexport default strapiLinkUrl;\n","import React from 'react';\nimport Head from 'next/head';\nimport {\n DEFAULT_SHARE_ALT,\n DEFAULT_SHARE_IMAGE,\n} from '../../constants/metadata';\nimport {\n Article,\n BlogPosting,\n Brand,\n BreadcrumbList,\n Event,\n FAQPage,\n HowTo,\n LocalBusiness,\n Offer,\n Organization,\n Person,\n Product,\n QAPage,\n Service,\n SoftwareApplication,\n WebPage,\n WithContext,\n} from 'schema-dts';\n\ntype SupportedSchemaType =\n | Article\n | BlogPosting\n | Brand\n | BreadcrumbList\n | Event\n | FAQPage\n | HowTo\n | LocalBusiness\n | Offer\n | Organization\n | Person\n | Product\n | QAPage\n | Product\n | Service\n | SoftwareApplication\n | WebPage;\n\n// Helper function to convert SchemaValue to string\nconst getTextValue = (value: unknown): string => {\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value !== null && 'text' in value) {\n return (value as { text: string }).text;\n }\n return '';\n};\n\n// Helper function to safely access properties from a schema\nconst getSchemaProperty = (\n schema: SupportedSchemaType,\n property: string\n): string => {\n return (\n getTextValue((schema as unknown as Record<string, unknown>)[property]) || ''\n );\n};\n\n// Helper function to get a unique identifier from a schema\nconst getSchemaIdentifier = (schema: SupportedSchemaType): string => {\n const type = (schema as { '@type': string })['@type'];\n\n switch (type) {\n case 'Organization':\n return getSchemaProperty(schema, 'name') || 'default';\n case 'Article':\n case 'BlogPosting':\n return getSchemaProperty(schema, 'headline') || 'untitled-article';\n case 'Product':\n return getSchemaProperty(schema, 'name') || 'untitled-product';\n case 'Person':\n return getSchemaProperty(schema, 'name') || 'unnamed-person';\n case 'Event':\n return getSchemaProperty(schema, 'name') || 'untitled-event';\n case 'LocalBusiness':\n return getSchemaProperty(schema, 'name') || 'unnamed-business';\n case 'Service':\n return getSchemaProperty(schema, 'name') || 'unnamed-service';\n case 'Brand':\n return getSchemaProperty(schema, 'name') || 'unnamed-brand';\n case 'FAQPage':\n return 'faq-page';\n case 'HowTo':\n return getSchemaProperty(schema, 'name') || 'untitled-howto';\n case 'BreadcrumbList':\n return 'breadcrumbs';\n case 'Offer':\n const offer = schema as Offer;\n return `offer-${offer.price ?? 'unknown-price'}`;\n case 'WebPage':\n return getSchemaProperty(schema, 'name') || 'untitled-page';\n case 'QAPage':\n return getSchemaProperty(schema, 'name') || 'untitled-qa';\n case 'SoftwareApplication':\n return getSchemaProperty(schema, 'name') || 'untitled-software';\n default:\n return 'unknown-schema';\n }\n};\n\ninterface SEOTagsProps {\n title: string;\n description: string;\n shareImage?: {\n url: string;\n alt: string;\n };\n metaTitleSuffix?: string;\n favicon?: string;\n domain?: string;\n /**\n * Structured data for SEO purposes, following the schema.org standard.\n * This can be a single schema object or an array of schema objects.\n * Each object must include an `@context` property set to \"https://schema.org\"\n * and an `@type` property indicating the type of schema (e.g., Article, Product).\n */\n schemaMarkup?:\n | WithContext<SupportedSchemaType>\n | WithContext<SupportedSchemaType>[];\n}\n\nconst validateSchema = (\n schema: WithContext<SupportedSchemaType> | WithContext<SupportedSchemaType>[]\n): boolean => {\n if (Array.isArray(schema)) {\n return schema.every(\n (item) => item['@context'] === 'https://schema.org' && '@type' in item\n );\n }\n return schema['@context'] === 'https://schema.org' && '@type' in schema;\n};\n\nexport const SEOTags: React.FC<SEOTagsProps> = ({\n title,\n description,\n shareImage,\n metaTitleSuffix = 'Tree.ly',\n favicon = 'https://cdn.tree.ly/favicon.ico',\n domain = 'tree.ly',\n schemaMarkup,\n}: SEOTagsProps) => {\n const shareImageUrl = shareImage?.url ?? DEFAULT_SHARE_IMAGE;\n const shareImageAlt = shareImage?.alt ?? DEFAULT_SHARE_ALT;\n\n let schemas = schemaMarkup;\n let isValidSchema = schemaMarkup ? validateSchema(schemaMarkup) : false;\n\n if (schemaMarkup && !isValidSchema) {\n console.warn(\n 'Invalid schema markup provided to SEOTags component. Schema markup will not be rendered.',\n schemaMarkup\n );\n schemas = undefined;\n isValidSchema = false;\n }\n\n const schemaArray = schemas\n ? Array.isArray(schemas)\n ? schemas\n : [schemas]\n : [];\n\n const getSchemaKey = (\n schema: WithContext<SupportedSchemaType>,\n index: number\n ): string => {\n const type = (schema as { '@type': string })['@type'];\n const identifier = getSchemaIdentifier(schema as SupportedSchemaType);\n return `${type}-${identifier}-${index}`;\n };\n\n return (\n <Head>\n <title>{`${title} - ${metaTitleSuffix}`}</title>\n <meta name=\"description\" content={description} />\n <link rel=\"icon\" href={favicon} />\n\n <meta property=\"og:url\" content={`https://${domain}`} />\n <meta property=\"og:type\" content=\"website\" />\n <meta property=\"og:title\" content={title} />\n <meta property=\"og:description\" content={description} />\n <meta property=\"og:image\" content={shareImageUrl} />\n <meta property=\"og:image:alt\" content={shareImageAlt} />\n\n <meta name=\"twitter:card\" content=\"summary_large_image\" />\n <meta property=\"twitter:domain\" content={domain} />\n <meta property=\"twitter:url\" content={`https://${domain}`} />\n <meta name=\"twitter:title\" content={title} />\n <meta name=\"twitter:description\" content={description} />\n <meta name=\"twitter:image\" content={shareImageUrl} />\n <meta name=\"twitter:image:alt\" content={shareImageAlt} />\n\n {isValidSchema &&\n schemaArray.map((schema, index) => (\n <script\n key={getSchemaKey(schema, index)}\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(schema),\n }}\n />\n ))}\n </Head>\n );\n};\n","import StrapiImage from '../../models/strapi/StrapiImage';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport { Box } from 'boemly';\nimport Head from 'next/head';\nimport Image from 'next/image';\nimport React, { useState } from 'react';\n\ninterface ZoomableImageProps {\n image: StrapiImage;\n zoom?: number;\n}\n\nconst ZoomableImage = ({ image, zoom = 200 }: ZoomableImageProps) => {\n // define and set default values to the states of the component\n const [isZoomed, setIsZoomed] = useState(false);\n const [backgroundPos, setBackgroundPos] = useState('50% 50%');\n\n const imageSrc = strapiMediaUrl(image.img, 'xLarge');\n\n const zoomInPosition = (e: React.MouseEvent<HTMLElement, MouseEvent>) => {\n // This will handle the calculations of the area where the image needs to zoom in depending on the user interaction\n const zoomer = e.currentTarget.getBoundingClientRect();\n const x = ((e.clientX - zoomer.x) / zoomer.width) * 100;\n const y = ((e.clientY - zoomer.y) / zoomer.height) * 100;\n setBackgroundPos(`${x}% ${y}%`);\n };\n\n const toggleZoomImage = (e: React.MouseEvent<HTMLElement, MouseEvent>) => {\n if (isZoomed) {\n setIsZoomed(false);\n } else {\n // Zoom in and set the background position correctly\n setIsZoomed(true);\n zoomInPosition(e);\n }\n };\n\n const handleClick = (e: React.MouseEvent<HTMLElement, MouseEvent>) => {\n toggleZoomImage(e);\n };\n\n const handleMove = (e: React.MouseEvent<HTMLElement, MouseEvent>) => {\n if (isZoomed) {\n zoomInPosition(e);\n }\n };\n\n return (\n <>\n <Head>\n <link rel=\"prefetch\" as=\"image\" href={imageSrc} />\n </Head>\n <Box\n position=\"relative\"\n display=\"inline-block\"\n width=\"full\"\n height=\"full\"\n overflow=\"hidden\"\n flexShrink=\"0\"\n scrollSnapAlign=\"center\"\n scrollSnapStop=\"always\"\n draggable=\"false\"\n cursor={isZoomed ? 'zoom-out' : 'zoom-in'}\n backgroundImage={isZoomed ? `url( ${imageSrc} )` : 'none'}\n backgroundSize={`${zoom}%`}\n backgroundPosition={backgroundPos}\n onClick={(e) => handleClick(e)}\n onMouseMove={(e) => handleMove(e)}\n >\n <Image\n src={imageSrc}\n alt={image.alt}\n fill\n style={{\n visibility: isZoomed ? 'hidden' : 'visible',\n objectFit: 'contain',\n }}\n />\n </Box>\n </>\n );\n};\n\nexport default ZoomableImage;\n","import React, { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { BoemlyModal, Flex, IconButton } from 'boemly';\nimport { useKey, useLockBodyScroll } from 'react-use';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport { CaretLeft, CaretRight } from '@phosphor-icons/react';\nimport ZoomableImage from './ZoomableImage';\n\nexport interface FullScreenImageProps {\n images: StrapiImage[];\n isOpen: boolean;\n onClose: () => void;\n currentIndex?: number;\n setCurrentIndex?: (callback: (c: number) => number) => void;\n}\n\nexport const FullScreenImage = ({\n images,\n isOpen,\n onClose,\n currentIndex = 0,\n setCurrentIndex,\n}: FullScreenImageProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useLockBodyScroll(isOpen);\n\n const canMoveRight = useMemo(\n () => currentIndex < images.length - 1,\n [currentIndex, images.length]\n );\n const canMoveLeft = useMemo(() => currentIndex !== 0, [currentIndex]);\n\n const onRight = useCallback(\n () => canMoveRight && setCurrentIndex && setCurrentIndex((c) => c + 1),\n [canMoveRight]\n );\n const onLeft = useCallback(\n () => canMoveLeft && setCurrentIndex && setCurrentIndex((c) => c - 1),\n [canMoveLeft]\n );\n\n useKey('ArrowRight', onRight, {}, [onRight]);\n useKey('ArrowLeft', onLeft, {}, [onLeft]);\n\n useEffect(() => {\n if (!!isOpen) {\n setTimeout(() => {\n containerRef?.current?.scrollTo({\n left: currentIndex * containerRef.current.clientWidth,\n behavior: 'instant',\n });\n }, 10);\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (containerRef.current) {\n containerRef.current.scrollTo({\n left: currentIndex * containerRef.current.clientWidth,\n behavior: 'smooth',\n });\n }\n }, [currentIndex, containerRef]);\n\n return (\n <BoemlyModal\n onClose={onClose}\n isOpen={isOpen}\n title=\"\"\n trigger=\"\"\n size=\"full\"\n content={\n <Flex\n position=\"absolute\"\n insetY=\"16\"\n insetX=\"0\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Flex\n ref={containerRef}\n flexGrow=\"1\"\n flexBasis=\"100%\"\n flexShrink=\"1\"\n gap=\"4\"\n marginX=\"24\"\n scrollSnapType=\"x mandatory\"\n overflow=\"hidden\"\n position=\"relative\"\n height=\"full\"\n width=\"full\"\n >\n {images.map((image) => (\n <ZoomableImage key={image.id} image={image} />\n ))}\n </Flex>\n\n <Flex\n position=\"absolute\"\n inset=\"6\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n pointerEvents=\"none\"\n >\n <IconButton\n visibility={canMoveLeft ? 'visible' : 'hidden'}\n onClick={onLeft}\n icon={<CaretLeft size={16} />}\n aria-label=\"Previous picture\"\n variant=\"outline\"\n pointerEvents=\"all\"\n mr=\"6\"\n />\n\n <IconButton\n visibility={canMoveRight ? 'visible' : 'hidden'}\n onClick={onRight}\n icon={<CaretRight size={16} />}\n aria-label=\"Next picture\"\n variant=\"outline\"\n pointerEvents=\"all\"\n ml=\"4\"\n />\n </Flex>\n </Flex>\n }\n />\n );\n};\n","export const BREAKPOINT_SM = `${320 - 1}px`;\nexport const BREAKPOINT_MD = `${768 - 1}px`;\nexport const BREAKPOINT_LG = `${960 - 1}px`;\nexport const BREAKPOINT_XL = `${1200 - 1}px`;\n\nexport const BREAKPOINT_SM_QUERY = `(max-width: ${BREAKPOINT_SM})`;\nexport const BREAKPOINT_MD_QUERY = `(max-width: ${BREAKPOINT_MD})`;\nexport const BREAKPOINT_LG_QUERY = `(max-width: ${BREAKPOINT_LG})`;\nexport const BREAKPOINT_XL_QUERY = `(max-width: ${BREAKPOINT_XL})`;\n","import React, { useState } from 'react';\nimport {\n Box,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Wrapper,\n useMediaQuery,\n} from 'boemly';\nimport Image from 'next/image';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport FullScreenImage from '../../components/FullScreenImage';\nimport { BREAKPOINT_MD_QUERY } from '../../constants/breakpoints';\n\ninterface FullWidthImageSlice extends StrapiDefaultHeader {\n image: StrapiImage;\n}\nexport interface FullWidthImageProps {\n slice: FullWidthImageSlice;\n}\n\nexport const FullWidthImage: React.FC<FullWidthImageProps> = ({\n slice,\n}: FullWidthImageProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const [isMobile] = useMediaQuery(BREAKPOINT_MD_QUERY);\n\n return (\n <DefaultSectionContainer title={slice.title}>\n <Wrapper>\n <DefaultSectionHeader\n isHero\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n taglineProps={{ textAlign: 'center', mt: ['32', null, null, '56'] }}\n titleProps={{ textAlign: 'center', maxW: '6xl', marginX: 'auto' }}\n textProps={{ textAlign: 'center', maxW: '3xl', marginX: 'auto' }}\n />\n\n <Box position=\"relative\" mt=\"20\" height={['3xs', null, 'xl']}>\n <Image\n src={strapiMediaUrl(slice.image.img, 'xLarge')}\n alt={slice.image.alt}\n fill\n style={{\n objectFit: slice.image.objectFit || 'cover',\n cursor: isMobile ? 'unset' : 'pointer',\n borderRadius: 'var(--boemly-radii-2xl)',\n }}\n onClick={() => !isMobile && setIsOpen(true)}\n />\n\n <FullScreenImage\n images={[slice.image]}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n />\n </Box>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import { css } from '@emotion/react';\n\nexport const GLOBAL_STYLE = css`\n :root {\n --default-hero-height: calc(100vh - var(--boemly-space-24));\n }\n\n a {\n text-decoration: none;\n }\n`;\n","import comparisonMessagesDe from './slices/Comparison/messages.de';\nimport creditsAvailableBadgeMessagesDe from './components/CreditsAvailableBadge/messages.de';\nimport ctaMessagesDe from './slices/Cta/messages.de';\nimport customerCardMessagesDe from './components/CustomerCard/messages.de';\nimport customerQuoteCardMessagesDe from './components/CustomerQuoteCard/messages.de';\nimport eventCardMessagesDe from './components/EventCard/messages.de';\nimport eventsMessagesDe from './slices/Events/messages.de';\nimport glossaryMessagesDe from './slices/Glossary/messages.de';\nimport portfolioDocumentsDownloadListMessagesDe from './components/portfolio/DocumentsDownloadList/messages.de';\nimport projectFactsMessagesDe from './slices/ProjectFacts/messages.de';\nimport projectGridCardMessagesDe from './components/ProjectGridCard/messages.de';\nimport projectsMapMessagesDe from './slices/ProjectsMap/messages.de';\nimport portfolioProjectInfoMessagesDe from './components/portfolio/ProjectInfo/messages.de';\nimport portfolioSmallCheckoutMessagesDe from './components/portfolio/SmallCheckout/messages.de';\nimport shopCheckoutMessagesDe from './slices/ShopCheckout/messages.de';\nimport textCarouselMessagesDe from './slices/TextCarousel/messages.de';\nimport timelineMessagesDe from './slices/Timeline/messages.de';\n\nimport unitMessagesDe from './unit.messages.de';\n\nconst rootMessagesDe = {\n //\n // Components\n //\n ...creditsAvailableBadgeMessagesDe,\n ...eventCardMessagesDe,\n ...portfolioDocumentsDownloadListMessagesDe,\n ...portfolioProjectInfoMessagesDe,\n ...portfolioSmallCheckoutMessagesDe,\n ...projectGridCardMessagesDe,\n\n //\n // Slices\n //\n ...comparisonMessagesDe,\n ...ctaMessagesDe,\n ...customerCardMessagesDe,\n ...customerQuoteCardMessagesDe,\n ...eventsMessagesDe,\n ...glossaryMessagesDe,\n ...projectFactsMessagesDe,\n ...projectsMapMessagesDe,\n ...shopCheckoutMessagesDe,\n ...textCarouselMessagesDe,\n ...timelineMessagesDe,\n\n //\n // Units\n //\n ...unitMessagesDe,\n};\n\nexport default rootMessagesDe;\n","const messagesDe = {\n 'components.creditsAvailableBadge.text.yes': 'Credits verfügbar',\n 'components.creditsAvailableBadge.text.some': 'Einige verbleibende Credits',\n 'components.creditsAvailableBadge.text.no': 'Keine verbleibenden Credits',\n 'components.creditsAvailableBadge.text.notYet': 'Credits bald verfügbar',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.eventCard.recommendedEvent': 'Empfohlene Veranstaltung',\n 'sections.eventCard.buttonShowMore': 'Mehr anzeigen',\n 'sections.eventCard.buttonShowLess': 'Weniger anzeigen',\n\n 'sections.eventCard.eventType.conference': 'Konferenz',\n 'sections.eventCard.eventType.webinar': 'Webinar',\n 'sections.eventCard.eventType.forestwalk': 'Waldspaziergang',\n 'sections.eventCard.eventType.partnerevent': 'Partnerveranstaltung',\n 'sections.eventCard.eventType.lunch&learn': 'Mittagessen & Lernen',\n 'sections.eventCard.eventType.fair': 'Messe',\n 'sections.eventCard.eventType.festival': 'Festival',\n 'sections.eventCard.eventType.roadshow': 'Roadshow',\n 'sections.eventCard.eventType.meetup': 'Meet Up',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'features.portfolio.documentsDownloadList.projectDocuments':\n 'Projektdokumente',\n 'features.portfolio.documentsDownloadList.downloadDocument':\n 'Dokument herunterladen',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'features.projectInfo.projectInfo.value': 'Projekt Infos',\n 'features.projectInfo.properties.area': 'Projekt Fläche',\n 'features.projectInfo.properties.location': 'Standort',\n 'features.projectInfo.properties.start': 'Projekt Start Datum',\n 'features.projectInfo.properties.timeSpan': 'Projekt Zeitraum',\n 'features.projectInfo.properties.projectType': 'Projekt Typ',\n 'features.projectInfo.properties.projectDeveloper': 'Projekt Entwickler',\n 'features.projectInfo.properties.verificationStandard.label':\n 'Verifizierungsstandard',\n 'features.projectInfo.properties.verificationStandard.value.SilvaconsultFCSISO14':\n 'SILVACONSULT® Forest Carbon Standard, ISO 14064-2',\n 'features.projectInfo.properties.verificationStandard.value.MfKWCH':\n 'Methodik für Klimaschutzprojekte im Wald für die Schweiz',\n 'features.projectInfo.properties.projectVolume.toolTip':\n 'Dies ist die durchschnittliche Anzahl der Credits, die pro Jahr ausgestellt werden. Dieser Wert entspricht nicht den Verfügbarkeiten.',\n 'features.projectInfo.properties.projectVolume.label': 'Projektvolumen',\n 'features.projectInfo.properties.riskBuffer': 'Anteil Risikopuffer',\n\n 'features.projectInfo.properties.year':\n '{years} {years, plural, one {Jahr} other {Jahre} }',\n};\n\nexport default messagesDe;\n","const messagesDe = {\n 'portfolio.smallCheckout.price.taxNotIncluded': 'ohne Steuern',\n 'portfolio.smallCheckout.price.taxIncluded':\n 'Preis inklusive Steuern: {number}',\n\n 'portfolio.smallCheckout.contributionValueCurrency.label.CHF':\n 'Geben Sie den Beitrag in Fr. ein',\n 'portfolio.smallCheckout.contributionValueCurrency.label.EUR':\n 'Geben Sie den Beitrag in € ein',\n 'portfolio.smallCheckout.contributionValueCurrency.unit.EUR': '€',\n 'portfolio.smallCheckout.contributionValueCurrency.unit.CHF': 'Fr.',\n 'portfolio.smallCheckout.contributionValueCurrency.validation.tooLow.CHF':\n 'Der Wert muss mindestens 10 CHF betragen',\n 'portfolio.smallCheckout.contributionValueCurrency.validation.tooLow.EUR':\n 'Der Wert muss mindestens 10 Euro betragen.',\n 'portfolio.smallCheckout.contributionValueCurrency.validation.empty':\n 'Bitte geben Sie einen Wert ein',\n 'portfolio.smallCheckout.contributionValueCurrency.validation.tooHigh':\n 'Für größere Einkäufe kontaktieren Sie bitte unser Verkaufsteam',\n\n 'portfolio.smallCheckout.contributionValueTons.label': 'Beitrag in Tonnen',\n\n 'portfolio.smallCheckout.submitButton': 'Credits kaufen',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'components.projectGridCard.certified': 'Zertifiziert, {year}',\n 'components.projectGridCard.certificationInProgress':\n 'Zertifizierung ist in Arbeit',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.comparison.backgroundShapes': 'Hintergrundformen',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.cta.backgroundShapes': 'Dunkle Hintergrundformen',\n 'sections.cta.backgroundShapesLight': 'Helle Hintergrundformen',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.customerCard.more': 'Weiterlesen',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.customerQuoteCard.more': 'Weiterlesen',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.events.loadMore': 'Mehr laden',\n 'sections.events.noUpcomingEvents':\n 'Keine bevorstehenden Veranstaltungen gefunden',\n 'sections.events.noPastEvents': 'Keine vergangenen Veranstaltungen gefunden',\n 'sections.eventsFilter.searchPlaceholder': 'Suchen',\n 'sections.events.eventsFilter.eventType': 'Event Type',\n 'sections.events.eventsFilter.language': 'Sprache',\n 'sections.events.eventsFilter.sortBy.title': 'Sortieren nach',\n 'sections.events.eventsFilter.sortBy.newest': 'Neueste zuerst',\n 'sections.events.eventsFilter.sortBy.oldest': 'Älteste zuerst',\n};\n\nexport default messagesDe;\n","const messagesDe = {\n 'sections.glossary.copyButtonLabel':\n 'Kopiere den Link zu diesem Abschnitt in die Zwischenablage',\n 'sections.glossary.copySuccessMessage': 'Link in die Zwischenablage kopiert',\n 'sections.glossary.copyFailureMessage':\n 'Link konnte nicht in die Zwischenablage kopiert werden',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.projectFacts.projectInfo.value': 'Projekt Infos',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.projectsMap.link.text': 'Mehr Infos',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.shopCheckout.intro.price': 'Preis',\n\n 'sections.shopCheckout.contributionValue.label.EUR':\n 'Geben sie einen Betrag in € ein',\n 'sections.shopCheckout.contributionValue.label.CHF':\n 'Geben sie einen Betrag in CHF ein',\n 'sections.shopCheckout.contributionValue.unit.EUR': '€',\n 'sections.shopCheckout.contributionValue.unit.CHF': 'CHF',\n 'sections.shopCheckout.contributionValue.validation.empty':\n 'Bitte geben sie einen Betrag ein',\n 'sections.shopCheckout.contributionValue.validation.tooLow.EUR':\n 'Der Betrag muss mindestens 10 Euro sein',\n 'sections.shopCheckout.contributionValue.validation.tooLow.CHF':\n 'Der Betrag muss mindestens 10 CHF sein',\n 'sections.shopCheckout.contributionValue.validation.tooHigh':\n 'Für größere Einkäufe kontaktieren Sie bitte unser Verkaufsteam über office@tree.ly',\n\n 'sections.shopCheckout.summary.kg': 'Menge',\n 'sections.shopCheckout.summary.price': 'Preis',\n 'sections.shopCheckout.summary.price.taxNotIncluded': 'ohne Steuern',\n 'sections.shopCheckout.summary.price.taxIncluded':\n 'Preis inklusive Steuern: {number}',\n\n 'sections.shopCheckout.submit': 'Kaufen',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.textCarousel.moveRight': 'Nach rechts bewegen',\n 'sections.textCarousel.moveLeft': 'Nach links bewegen',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.timeline.backgroundShapes': 'Hintergrundformen',\n 'sections.timeline.showMoreButton': 'Drei weitere Meilensteine anzeigen',\n};\nexport default messagesDe;\n","const unitMessagesDe = {\n 'unit.formatter.tonsCo2': '{number} /tCO₂',\n 'unit.formatter.tonsCo2PerYear': '{number} tCO₂/Jahr',\n};\nexport default unitMessagesDe;\n","import { STRAPI_FALLBACK_LOCALE } from '../constants/strapi';\nimport rootMessagesDe from '../rootMessages.de';\nimport rootMessagesEn from '../rootMessages.en';\n\nconst messages = {\n en: rootMessagesEn,\n de: rootMessagesDe,\n};\n\nconst getMessages = (locale: string) => {\n const messagesLocale = Object.keys(messages).includes(`${locale}`)\n ? (locale as keyof typeof messages)\n : STRAPI_FALLBACK_LOCALE;\n\n return messages[messagesLocale];\n};\n\nexport default getMessages;\n","import comparisonMessagesEn from './slices/Comparison/messages.en';\nimport creditsAvailableBadgeMessagesEn from './components/CreditsAvailableBadge/messages.en';\nimport ctaMessagesEn from './slices/Cta/messages.en';\nimport customerCardMessagesEn from './components/CustomerCard/messages.en';\nimport customerQuoteCardMessagesEn from './components/CustomerQuoteCard/messages.en';\nimport eventCardMessagesEn from './components/EventCard/messages.en';\nimport eventsMessagesEn from './slices/Events/messages.en';\nimport glossaryMessagesEn from './slices/Glossary/messages.en';\nimport portfolioDocumentsDownloadListMessagesEn from './components/portfolio/DocumentsDownloadList/messages.en';\nimport projectFactsMessagesEn from './slices/ProjectFacts/messages.en';\nimport projectGridCardMessagesEn from './components/ProjectGridCard/messages.en';\nimport projectsMapMessagesEn from './slices/ProjectsMap/messages.en';\nimport portfolioProjectInfoMessagesEn from './components/portfolio/ProjectInfo/messages.en';\nimport portfolioSmallCheckoutMessagesEn from './components/portfolio/SmallCheckout/messages.en';\nimport shopCheckoutMessagesEn from './slices/ShopCheckout/messages.en';\nimport textCarouselMessagesEn from './slices/TextCarousel/messages.en';\nimport timelineMessagesEn from './slices/Timeline/messages.en';\n\nimport unitMessagesEn from './unit.messages.en';\n\nconst rootMessagesEn = {\n //\n // Components\n //\n ...creditsAvailableBadgeMessagesEn,\n ...eventCardMessagesEn,\n ...portfolioDocumentsDownloadListMessagesEn,\n ...portfolioProjectInfoMessagesEn,\n ...portfolioSmallCheckoutMessagesEn,\n ...projectGridCardMessagesEn,\n\n //\n // Slices\n //\n ...comparisonMessagesEn,\n ...ctaMessagesEn,\n ...customerCardMessagesEn,\n ...customerQuoteCardMessagesEn,\n ...eventsMessagesEn,\n ...glossaryMessagesEn,\n ...projectFactsMessagesEn,\n ...projectsMapMessagesEn,\n ...shopCheckoutMessagesEn,\n ...textCarouselMessagesEn,\n ...timelineMessagesEn,\n\n //\n // Units\n //\n ...unitMessagesEn,\n};\n\nexport default rootMessagesEn;\n","const messagesEn = {\n 'components.creditsAvailableBadge.text.yes': 'Credits available',\n 'components.creditsAvailableBadge.text.some': 'Some remaining credits',\n 'components.creditsAvailableBadge.text.no': 'No remaining credits',\n 'components.creditsAvailableBadge.text.notYet': 'Credits available soon',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'sections.eventCard.recommendedEvent': 'Recommended Event',\n 'sections.eventCard.buttonShowMore': 'Show More',\n 'sections.eventCard.buttonShowLess': 'Show Less',\n\n 'sections.eventCard.eventType.conference': 'Conference',\n 'sections.eventCard.eventType.webinar': 'Webinar',\n 'sections.eventCard.eventType.forestwalk': 'Forest Walk',\n 'sections.eventCard.eventType.partnerevent': 'Partner Event',\n 'sections.eventCard.eventType.lunch&learn': 'Lunch & Learn',\n 'sections.eventCard.eventType.fair': 'Fair',\n 'sections.eventCard.eventType.festival': 'Festival',\n 'sections.eventCard.eventType.roadshow': 'Roadshow',\n 'sections.eventCard.eventType.meetup': 'Meet Up',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'features.portfolio.documentsDownloadList.projectDocuments':\n 'Project documents',\n 'features.portfolio.documentsDownloadList.downloadDocument':\n 'Download document',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'features.projectInfo.projectInfo.value': 'Project Infos',\n 'features.projectInfo.properties.area': 'Project Area',\n 'features.projectInfo.properties.location': 'Location',\n 'features.projectInfo.properties.start': 'Project Start Date',\n 'features.projectInfo.properties.timeSpan': 'Project Time Span',\n 'features.projectInfo.properties.projectType': 'Project Type',\n 'features.projectInfo.properties.projectDeveloper': 'Project Developer',\n 'features.projectInfo.properties.verificationStandard.label':\n 'Verification Standard',\n 'features.projectInfo.properties.verificationStandard.value.SilvaconsultFCSISO14':\n 'SILVACONSULT® Forest Carbon Standard, ISO 14064-2',\n 'features.projectInfo.properties.verificationStandard.value.MfKWCH':\n 'Methodik für Klimaschutzprojekte im Wald für die Schweiz',\n 'features.projectInfo.properties.projectVolume.label': 'Project Volume',\n 'features.projectInfo.properties.projectVolume.toolTip':\n \"This is the average amount of credits that are issued per year. This value doesn't represent availabilities.\",\n 'features.projectInfo.properties.riskBuffer': 'Risk Buffer Share',\n\n 'features.projectInfo.properties.year':\n '{years} {years, plural, one {year} other {years} }',\n};\n\nexport default messagesEn;\n","const messagesEn = {\n 'portfolio.smallCheckout.price.taxNotIncluded': 'not including tax',\n 'portfolio.smallCheckout.price.taxIncluded': 'Price including tax: {number}',\n\n 'portfolio.smallCheckout.contributionValueCurrency.label.CHF':\n 'Contribution Amount in CHF',\n 'portfolio.smallCheckout.contributionValueCurrency.label.EUR':\n 'Contribution Amount in €',\n 'portfolio.smallCheckout.contributionValueCurrency.unit.EUR': '€',\n 'portfolio.smallCheckout.contributionValueCurrency.unit.CHF': 'CHF',\n 'portfolio.smallCheckout.contributionValueCurrency.validation.tooLow.CHF':\n 'The value must be at least 10 CHF',\n 'portfolio.smallCheckout.contributionValueCurrency.validation.tooLow.EUR':\n 'The value must be at least 10 Euro',\n 'portfolio.smallCheckout.contributionValueCurrency.validation.empty':\n 'Please enter a value',\n 'portfolio.smallCheckout.contributionValueCurrency.validation.tooHigh':\n 'For bigger purchases please contact our sales team',\n\n 'portfolio.smallCheckout.contributionValueTons.label':\n 'Contribution Amount in Tons',\n\n 'portfolio.smallCheckout.submitButton': 'Buy credits',\n};\nexport default messagesEn;\n","const messagesDe = {\n 'components.projectGridCard.certified': 'Certified, {year}',\n 'components.projectGridCard.certificationInProgress':\n 'Certification in progress',\n};\nexport default messagesDe;\n","const messagesEn = {\n 'sections.comparison.backgroundShapes': 'Background shapes',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'sections.cta.backgroundShapesDark': 'Dark background shapes',\n 'sections.cta.backgroundShapesLight': 'Light background shapes',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'sections.customerCard.more': 'Read more',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'sections.customerQuoteCard.more': 'Read more',\n};\nexport default messagesEn;\n","const messagesDe = {\n 'sections.events.loadMore': 'Load more',\n 'sections.events.noUpcomingEvents': 'No upcoming events found',\n 'sections.events.noPastEvents': 'No past events found',\n 'sections.events.eventsFilter.searchPlaceholder': 'Search',\n 'sections.events.eventsFilter.eventType': 'Event Type',\n 'sections.events.eventsFilter.language': 'Language',\n 'sections.events.eventsFilter.sortBy.title': 'Sort by',\n 'sections.events.eventsFilter.sortBy.newest': 'Newest first',\n 'sections.events.eventsFilter.sortBy.oldest': 'Oldest first',\n};\n\nexport default messagesDe;\n","const messagesEn = {\n 'sections.glossary.copyButtonLabel':\n 'Copy a link to this section to your clipboard',\n 'sections.glossary.copySuccessMessage': 'Copied the link to your clipboard',\n 'sections.glossary.copyFailureMessage': 'Could not copy link to clipboard',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'sections.projectFacts.projectInfo.value': 'Project Infos',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'sections.projectsMap.link.text': 'Show more info',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'sections.shopCheckout.intro.price': 'Price',\n\n 'sections.shopCheckout.contributionValue.label.EUR':\n 'Enter contribution value in €',\n 'sections.shopCheckout.contributionValue.label.CHF':\n 'Enter contribution value in CHF',\n 'sections.shopCheckout.contributionValue.unit.EUR': '€',\n 'sections.shopCheckout.contributionValue.unit.CHF': 'CHF',\n 'sections.shopCheckout.contributionValue.validation.empty':\n 'Please enter a value',\n 'sections.shopCheckout.contributionValue.validation.tooLow.EUR':\n 'Der Betrag muss mindestens 10 Euro sein',\n 'sections.shopCheckout.contributionValue.validation.tooLow.CHF':\n 'Der Betrag muss mindestens 10 CHF sein',\n 'sections.shopCheckout.contributionValue.validation.tooHigh':\n 'For bigger purchases please contact our sales team via office@tree.ly',\n\n 'sections.shopCheckout.summary.kg': 'Quantity',\n 'sections.shopCheckout.summary.price': 'Price',\n 'sections.shopCheckout.summary.price.taxNotIncluded': 'not including tax',\n 'sections.shopCheckout.summary.price.taxIncluded':\n 'Price including tax: {number}',\n\n 'sections.shopCheckout.submit': 'Checkout',\n};\nexport default messagesEn;\n","const messagesDe = {\n 'sections.textCarousel.moveRight': 'Move right',\n 'sections.textCarousel.moveLeft': 'Move left',\n};\nexport default messagesDe;\n","const messagesEn = {\n 'sections.timeline.backgroundShapes': 'Background shapes',\n 'sections.timeline.showMoreButton': 'Show three more milestones',\n};\nexport default messagesEn;\n","const unitMessagesEn = {\n 'unit.formatter.tonsCo2': '{number} /tCO₂',\n 'unit.formatter.tonsCo2PerYear': '{number} tCO₂/year',\n};\nexport default unitMessagesEn;\n","import React, { createContext } from 'react';\nimport { createIntl, createIntlCache } from 'react-intl';\nimport { Global } from '@emotion/react';\nimport { GLOBAL_STYLE } from '../../constants/globalStyle';\nimport getMessages from '../../utils/getMessages';\nimport strapiClient from '../../integrations/strapi/strapiClient';\nimport { SWRConfig } from 'swr/_internal';\n\nexport type AnalyticsFunction = ({\n type,\n props,\n}: {\n type: 'track' | 'page';\n props?: Record<string, any>;\n}) => void;\n\nexport const AnalyticsContext = createContext<AnalyticsFunction | undefined>(\n undefined\n);\n\nconst cache = createIntlCache();\n\nconst intlFactory = (locale: string) =>\n createIntl(\n {\n locale,\n messages: getMessages(locale),\n },\n cache\n );\n\nexport const IntlContext = createContext(intlFactory('en'));\n\nexport interface ContextProviderProps {\n children: React.ReactNode;\n locale: string;\n analyticsFunction?: AnalyticsFunction;\n}\n\nexport const ContextProvider: React.FC<ContextProviderProps> = ({\n children,\n locale,\n analyticsFunction,\n}: ContextProviderProps): JSX.Element => {\n const fetcher = async (resource: any, init: any) => {\n const response = await strapiClient.get(`${resource}`, {\n ...init,\n headers: {},\n });\n // Check if the response was an error:\n if (response.status < 200 || response.status >= 300) {\n let errorData = { message: '' };\n try {\n errorData = await response.data;\n } catch (error) {\n errorData = {\n message: `An unknown error occurred while fetching data.`,\n };\n }\n throw new Error(errorData.message); // Throwing the error will lead to onError being called\n }\n\n return { body: await response.data, headers: response.headers };\n };\n return (\n <>\n <SWRConfig\n value={{\n fetcher,\n }}\n >\n <Global styles={{ GLOBAL_STYLE }} />\n <IntlContext.Provider value={intlFactory(locale)}>\n <AnalyticsContext.Provider value={analyticsFunction}>\n {children}\n </AnalyticsContext.Provider>\n </IntlContext.Provider>\n </SWRConfig>\n </>\n );\n};\n","import React, { useContext } from 'react';\nimport { Button } from 'boemly';\nimport Link from 'next/link';\nimport { useDetectAdBlock } from 'adblock-detect-react';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport openHubSpotChat from '../../utils/openHubSpotChat';\nimport { AnalyticsContext } from '../ContextProvider/ContextProvider';\n\nexport interface StrapiLinkButtonProps {\n link: StrapiLink;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n variant?: 'solid' | 'outline' | 'outlineWhite' | 'link' | 'ghost';\n colorScheme?: 'primary' | 'gray' | 'orange' | 'green' | 'white';\n rightIcon?: JSX.Element;\n leftIcon?: JSX.Element;\n mt?: any;\n mr?: any;\n mb?: any;\n ml?: any;\n mx?: any;\n my?: any;\n background?: string;\n width?: string;\n component?: string;\n}\n\nexport const StrapiLinkButton: React.FC<StrapiLinkButtonProps> = ({\n link,\n component = 'StrapiLinkButton',\n ...buttonProps\n}: StrapiLinkButtonProps) => {\n const adBlockDetected = useDetectAdBlock();\n const analyticsFunction = useContext(AnalyticsContext);\n\n const handleClick = () => {\n const buttonUrl =\n link.intercomLauncher && adBlockDetected\n ? 'mailto:hello@tree.ly'\n : strapiLinkUrl(link);\n\n analyticsFunction?.({\n type: 'track',\n props: {\n action: 'click',\n component,\n buttonText: link.text,\n buttonUrl,\n },\n });\n };\n\n if (link.intercomLauncher) {\n if (adBlockDetected) {\n return (\n <Button\n {...buttonProps}\n as={Link}\n href=\"mailto:hello@tree.ly\"\n onClick={handleClick}\n >\n {link.text}\n </Button>\n );\n }\n\n return (\n <Button\n {...buttonProps}\n onClick={() => {\n handleClick();\n openHubSpotChat();\n }}\n >\n {link.text}\n </Button>\n );\n }\n\n return (\n <Button\n {...buttonProps}\n as={Link}\n href={strapiLinkUrl(link)}\n onClick={handleClick}\n >\n {link.text}\n </Button>\n );\n};\n","const openHubSpotChat = () => {\n const w = window as any;\n\n if (w.HubSpotConversations) {\n w.HubSpotConversations.widget.open();\n } else {\n w.hsConversationsOnReady = [\n () => {\n w.HubSpotConversations.widget.open();\n },\n ];\n }\n};\n\nexport default openHubSpotChat;\n","import React from 'react';\nimport { Box, DefaultSectionHeader, Flex, Gradient, Wrapper } from 'boemly';\nimport Image from 'next/image';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport StrapiButtonWithVariant from '../../models/strapi/StrapiButtonWithVariant';\n\nexport interface HeroProps {\n slice: {\n tagline?: string;\n title: string;\n subTitle: string;\n button?: StrapiLink;\n additionalButtons: StrapiButtonWithVariant[];\n image?: StrapiImage;\n textAlign: 'left' | 'center';\n shape?: StrapiImage;\n };\n}\n\nexport const Hero = ({ slice }: HeroProps): JSX.Element => (\n <Box\n position=\"relative\"\n width=\"full\"\n height=\"var(--default-hero-height)\"\n minHeight=\"2xl\"\n backgroundColor=\"gray.900\"\n overflowX=\"hidden\"\n >\n {slice.image && (\n <>\n <Image\n src={strapiMediaUrl(slice.image.img, 'xLarge')}\n alt={slice.image.alt}\n fill\n style={{ objectFit: slice.image.objectFit || 'cover' }}\n />\n <Gradient />\n </>\n )}\n {slice.shape && (\n <Box\n position=\"absolute\"\n bottom=\"0\"\n borderTopRightRadius=\"full\"\n width={['3xs', null, '2xs', null, 'sm']}\n height={['3xs', null, '2xs', null, 'sm']}\n right={['-16', null, '24']}\n >\n <Image\n src={strapiMediaUrl(slice.shape.img, 'medium')}\n alt={slice.shape.alt}\n fill\n style={{\n objectFit: slice.shape.objectFit || 'cover',\n borderTopRightRadius: 'var(--boemly-radii-full)',\n }}\n />\n </Box>\n )}\n <Box\n position=\"absolute\"\n left=\"0\"\n top=\"56%\"\n width=\"full\"\n textAlign={slice.textAlign}\n transform=\"translateY(-50%)\"\n >\n <Wrapper>\n <>\n <DefaultSectionHeader\n isHero\n tagline={slice.tagline}\n title={slice.title}\n text={slice.subTitle}\n taglineProps={{ color: 'white' }}\n titleProps={{\n color: 'white',\n maxW: slice.textAlign === 'center' ? '4xl' : '3xl',\n mx: slice.textAlign === 'center' ? 'auto' : 'unset',\n textAlign: slice.textAlign,\n }}\n textProps={{\n maxW: '2xl',\n mx: slice.textAlign === 'center' ? 'auto' : 'unset',\n textAlign: slice.textAlign,\n color: 'white',\n }}\n />\n\n <Flex\n gap=\"8\"\n justifyContent={slice.textAlign === 'center' ? 'center' : 'start'}\n >\n {slice.button && (\n <StrapiLinkButton\n key={slice.button.id}\n mt=\"10\"\n size=\"xl\"\n link={slice.button}\n component=\"Hero\"\n />\n )}\n {slice.additionalButtons.map((button) => (\n <StrapiLinkButton\n key={button.button.id}\n mt=\"10\"\n size=\"xl\"\n variant={button.variant}\n link={button.button}\n component=\"Hero\"\n />\n ))}\n </Flex>\n </>\n </Wrapper>\n </Box>\n </Box>\n);\n","import React from 'react';\nimport {\n Box,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Flex,\n Heading,\n SimpleGrid,\n Spacer,\n Text,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\n\nexport interface IconGridProps {\n slice: {\n tagline?: string;\n title?: string;\n subTitle?: string;\n iconsWithTextAndButton: {\n id: number;\n title: string;\n text: string;\n icon: StrapiImage;\n button?: StrapiLink;\n }[];\n };\n}\n\nexport const IconGrid = ({ slice }: IconGridProps): JSX.Element => {\n const columns = () => {\n if (slice.iconsWithTextAndButton.length === 2) {\n return [1, null, null, 2, 2];\n }\n if (slice.iconsWithTextAndButton.length === 1) {\n return 1;\n }\n return [1, null, null, 2, 3];\n };\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n {slice.title ? (\n <>\n <Flex alignItems=\"center\" flexDirection=\"column\">\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.subTitle}\n taglineProps={{ maxW: '2xl', textAlign: 'center' }}\n titleProps={{ maxW: '3xl', textAlign: 'center' }}\n textProps={{ maxW: '3xl', textAlign: 'center' }}\n />\n </Flex>\n <Spacer h=\"20\" />\n </>\n ) : (\n <></>\n )}\n\n <SimpleGrid\n columns={columns()}\n gap={slice.iconsWithTextAndButton.length === 2 ? '14' : '16'}\n rowGap={['16', null, null, '20']}\n >\n {slice.iconsWithTextAndButton.map((iconWithTextAndButton) => (\n <Box key={iconWithTextAndButton.id}>\n <Box\n margin=\"0 auto\"\n backgroundColor=\"primary.50\"\n borderRadius=\"full\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-around\"\n width=\"6.5rem\"\n height=\"6.5rem\"\n >\n <Box position=\"absolute\" width=\"12\" height=\"12\">\n <Image\n src={strapiMediaUrl(\n iconWithTextAndButton.icon.img,\n 'xSmall'\n )}\n alt={iconWithTextAndButton.icon.alt}\n fill\n style={{\n objectFit:\n iconWithTextAndButton.icon.objectFit || 'contain',\n }}\n />\n </Box>\n </Box>\n <Heading size=\"xl\" textAlign=\"center\" mb=\"4\" mt=\"8\">\n {iconWithTextAndButton.title}\n </Heading>\n <Text size=\"mdRegularNormal\" textAlign=\"center\">\n {iconWithTextAndButton.text}\n </Text>\n {iconWithTextAndButton.button && (\n <Box textAlign=\"center\">\n <StrapiLinkButton\n key={iconWithTextAndButton.button.id}\n mt=\"8\"\n size=\"md\"\n variant=\"outline\"\n link={iconWithTextAndButton.button}\n component=\"IconGrid\"\n />\n </Box>\n )}\n </Box>\n ))}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React from 'react';\n\nconst LinkedInIcon = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clipPath=\"url(#clip0_112_606)\">\n <path\n d=\"M11.9286 11.9285H9.85424V8.67998C9.85424 7.90534 9.84042 6.90813 8.77539 6.90813C7.695 6.90813 7.52969 7.75213 7.52969 8.62357V11.9283H5.45533V5.24799H7.44671V6.16093H7.47459C7.67388 5.82018 7.96186 5.53986 8.30786 5.34984C8.65386 5.15981 9.04493 5.06719 9.4394 5.08183C11.5418 5.08183 11.9295 6.46473 11.9295 8.2638L11.9286 11.9285ZM3.11477 4.33484C2.87669 4.33489 2.64393 4.26433 2.44595 4.13209C2.24796 3.99985 2.09365 3.81188 2.0025 3.59193C1.91135 3.37199 1.88746 3.12995 1.93387 2.89644C1.98027 2.66292 2.09488 2.44841 2.26321 2.28003C2.43153 2.11164 2.646 1.99696 2.8795 1.95047C3.11301 1.90398 3.35504 1.92778 3.57502 2.01884C3.795 2.10992 3.98303 2.26417 4.11533 2.46211C4.24764 2.66004 4.31829 2.89277 4.31833 3.13085C4.31836 3.28894 4.28725 3.44547 4.22678 3.59153C4.1663 3.7376 4.07767 3.87031 3.96591 3.98211C3.85415 4.09392 3.72146 4.18261 3.57541 4.24313C3.42937 4.30365 3.27286 4.33481 3.11477 4.33484ZM4.15194 11.9285H2.07544V5.24799H4.15194V11.9285ZM12.9628 0.000953808H1.03307C0.762304 -0.00210183 0.501383 0.102466 0.307673 0.291681C0.113961 0.480895 0.00330461 0.739273 0 1.01004V12.9892C0.00319151 13.2602 0.113783 13.5187 0.307487 13.7081C0.501192 13.8975 0.762169 14.0023 1.03307 13.9994H12.9628C13.2342 14.0028 13.496 13.8983 13.6904 13.7089C13.8848 13.5195 13.9962 13.2607 14 12.9892V1.00918C13.9961 0.737873 13.8846 0.479199 13.6902 0.28999C13.4958 0.10078 13.2341 -0.00348904 12.9628 8.91429e-05\"\n fill=\"#0A66C2\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_112_606\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n);\n\nexport default LinkedInIcon;\n","import React from 'react';\nimport { CaretRight, Globe } from '@phosphor-icons/react';\nimport LinkedInIcon from '../../icons/LinkedInIcon';\nimport StrapiLinkWithIcon from '../../models/strapi/StrapiLinkWithIcon';\nimport StrapiLinkButton from '../StrapiLinkButton';\nimport { StrapiLinkButtonProps } from '../StrapiLinkButton/StrapiLinkButton';\n\nexport interface StrapiLinkButtonWithIconProps\n extends Omit<StrapiLinkButtonProps, 'link'> {\n link: StrapiLinkWithIcon;\n}\n\nexport const StrapiLinkButtonWithIcon: React.FC<\n StrapiLinkButtonWithIconProps\n> = ({ link, ...props }: StrapiLinkButtonWithIconProps) => {\n const getLinkIcon = (destination: string) => {\n switch (destination) {\n case 'linkedin': {\n return <LinkedInIcon />;\n }\n case 'web': {\n return <Globe />;\n }\n default: {\n return <CaretRight />;\n }\n }\n };\n\n return (\n <StrapiLinkButton\n {...props}\n link={link.link}\n rightIcon={getLinkIcon(link.destination)}\n />\n );\n};\n","import React from 'react';\nimport {\n Box,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Flex,\n Heading,\n SimpleGrid,\n Text,\n useToken,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport StrapiLinkButtonWithIcon from '../../components/StrapiLinkButtonWithIcon';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport StrapiLinkWithIcon from '../../models/strapi/StrapiLinkWithIcon';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\n\ninterface ImageGridSlice extends StrapiDefaultHeader {\n images: {\n id: number;\n title: string;\n subTitle?: string;\n image: StrapiImage;\n links: StrapiLinkWithIcon[];\n }[];\n}\nexport interface ImageGridProps {\n slice: ImageGridSlice;\n}\n\nexport const ImageGrid: React.FC<ImageGridProps> = ({\n slice,\n}: ImageGridProps) => {\n const [primary50] = useToken('colors', ['primary.50']);\n\n return (\n <DefaultSectionContainer backgroundColor={primary50} title={slice.title}>\n <Wrapper>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n taglineProps={{ textAlign: 'center' }}\n titleProps={{ textAlign: 'center', maxW: '6xl', marginX: 'auto' }}\n textProps={{ textAlign: 'center', maxW: '2xl', marginX: 'auto' }}\n />\n\n <SimpleGrid\n mt=\"24\"\n columns={3}\n gap=\"24\"\n rowGap=\"16\"\n minChildWidth=\"16rem\"\n >\n {slice.images.map(({ id, title, subTitle, image, links }) => (\n <Box key={id}>\n <Box position=\"relative\" height=\"sm\" borderRadius=\"xl\">\n <Image\n src={strapiMediaUrl(image.img, 'medium')}\n alt={image.alt}\n fill\n style={{\n objectFit: image.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n <Heading size=\"xl\" mt=\"4\">\n {title}\n </Heading>\n {subTitle && <Text size=\"mdRegularNormal\">{subTitle}</Text>}\n {links && links.length > 0 && (\n <Flex mt=\"3\" flexDir=\"row\" gap=\"2\" flexWrap=\"wrap\">\n {links.map((link) => (\n <StrapiLinkButtonWithIcon\n key={link.id}\n link={link}\n size=\"sm\"\n variant=\"outline\"\n component=\"ImageGrid\"\n />\n ))}\n </Flex>\n )}\n </Box>\n ))}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React, { Fragment } from 'react';\nimport {\n Box,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Heading,\n SimpleGrid,\n Text,\n useMediaQuery,\n useToken,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport { CaretRight } from '@phosphor-icons/react';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport { BREAKPOINT_LG_QUERY } from '../../constants/breakpoints';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport { CDN_URI } from '../../constants/api';\n\ninterface ImageTextSequenceSlice extends StrapiDefaultHeader {\n imageTextRows: {\n id: number;\n title: string;\n text: string;\n button?: StrapiLink;\n image: StrapiImage;\n }[];\n background?: boolean;\n}\nexport interface ImageTextSequenceProps {\n slice: ImageTextSequenceSlice;\n}\n\nexport const ImageTextSequence: React.FC<ImageTextSequenceProps> = ({\n slice,\n}: ImageTextSequenceProps) => {\n const [oneColumnGrid] = useMediaQuery(BREAKPOINT_LG_QUERY);\n const [primary50] = useToken('colors', ['primary.50']);\n const [gray700] = useToken('colors', ['gray.700']);\n\n return (\n <DefaultSectionContainer backgroundColor={primary50} title={slice.title}>\n {slice.background ? (\n <>\n <Box\n position=\"absolute\"\n top=\"0\"\n right=\"24\"\n display={['none', null, null, 'unset']}\n >\n <Image\n src={`${CDN_URI}/assets/v3/strapi-slices/desktop-map-border.svg`}\n alt=\"Map\"\n width=\"786\"\n height=\"897\"\n />\n </Box>\n <Box\n position=\"absolute\"\n top=\"64\"\n right=\"-14\"\n display={['unset', null, null, 'none']}\n >\n <Image\n src={`${CDN_URI}/assets/v3/strapi-slices/mobile-map-border.svg`}\n alt=\"Map\"\n width=\"227\"\n height=\"452\"\n />\n </Box>\n </>\n ) : (\n <></>\n )}\n <Wrapper>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n taglineProps={{ textAlign: ['left', null, null, null, 'center'] }}\n titleProps={{\n maxW: '6xl',\n marginX: ['0', null, null, null, 'auto'],\n textAlign: ['left', null, null, null, 'center'],\n }}\n textProps={{\n maxW: '2xl',\n marginX: ['0', null, null, null, 'auto'],\n textAlign: ['left', null, null, null, 'center'],\n color: 'black',\n }}\n />\n\n <SimpleGrid\n gap=\"16\"\n mt={['28', null, null, null, '40']}\n columns={[1, null, null, null, 2]}\n >\n {slice.imageTextRows.map(\n ({ id, title, text, button, image }, index) => {\n const imageBox = (\n <Box>\n <Box\n position=\"relative\"\n width=\"full\"\n minHeight={['2xs', null, null, 'sm']}\n >\n <Image\n src={strapiMediaUrl(image.img, 'large')}\n alt={image.alt}\n fill\n style={{\n objectFit: image.objectFit || 'contain',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n </Box>\n );\n return (\n <Fragment key={id}>\n {(oneColumnGrid || index % 2 !== 0) && imageBox}\n <Box\n display=\"flex\"\n alignItems=\"flex-start\"\n flexDirection=\"column\"\n justifyContent=\"center\"\n >\n <Heading as=\"h2\" size=\"xl\" mb=\"4\">\n {title}\n </Heading>\n <Text size=\"mdRegularNormal\">{text}</Text>\n {button && (\n <StrapiLinkButton\n mt=\"5\"\n link={button}\n size=\"sm\"\n variant=\"outline\"\n rightIcon={<CaretRight size=\"10\" color={gray700} />}\n component=\"ImageTextSequence\"\n />\n )}\n </Box>\n {!oneColumnGrid && index % 2 === 0 && imageBox}\n </Fragment>\n );\n }\n )}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React, { useContext } from 'react';\nimport {\n DefaultSectionContainer,\n DefaultSectionHeader,\n Grid,\n GridItem,\n PortfolioCard,\n Spacer,\n BoemlyList,\n Wrapper,\n} from 'boemly';\nimport { ArrowRight } from '@phosphor-icons/react';\nimport Image from 'next/image';\nimport { useRouter } from 'next/router';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiPortfolioCard from '../../models/strapi/StrapiPortfolioCard';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport { AnalyticsContext } from '../../components/ContextProvider/ContextProvider';\n\ninterface LeftTextRightCardSlice extends StrapiDefaultHeader {\n checkMarkLabels?: {\n id: number;\n text: string;\n }[];\n button?: StrapiLink;\n card?: StrapiPortfolioCard;\n}\nexport interface LeftTextRightCardProps {\n slice: LeftTextRightCardSlice;\n}\n\nexport const LeftTextRightCard: React.FC<LeftTextRightCardProps> = ({\n slice,\n}: LeftTextRightCardProps) => {\n const { push } = useRouter();\n const analyticsFunction = useContext(AnalyticsContext);\n\n const handleCardButtonClick = () => {\n if (slice.card?.button) {\n if (analyticsFunction) {\n analyticsFunction({\n type: 'track',\n props: {\n action: 'click',\n component: 'LeftTextRightCard',\n buttonText: slice.card?.button?.text,\n buttonUrl: strapiLinkUrl(slice.card?.button),\n cardTitle: slice.card?.title,\n },\n });\n }\n\n push(strapiLinkUrl(slice.card?.button));\n }\n };\n\n return (\n <DefaultSectionContainer title={slice.title}>\n <Wrapper>\n <Grid\n templateColumns={[\n 'repeat(8, 1fr)',\n null,\n null,\n null,\n 'repeat(12, 1fr)',\n ]}\n templateRows={['repeat(2, 1fr)', null, null, null, 'repeat(1, 1fr)']}\n rowGap=\"12\"\n >\n <GridItem colSpan={8} rowSpan={1} pr={['0', null, null, null, '28']}>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n />\n\n {slice.checkMarkLabels && (\n <>\n <Spacer height=\"10\" />\n <BoemlyList listItems={slice.checkMarkLabels} />\n <Spacer height=\"10\" />\n </>\n )}\n\n {slice.button && (\n <StrapiLinkButton\n link={slice.button}\n size=\"md\"\n colorScheme=\"white\"\n variant=\"outline\"\n rightIcon={<ArrowRight />}\n component=\"LeftTextRightCard\"\n />\n )}\n </GridItem>\n <GridItem\n colSpan={[8, null, null, null, 4]}\n rowSpan={1}\n position=\"relative\"\n >\n {slice.card && (\n <PortfolioCard\n title={slice.card.title}\n button={\n slice.card.button && {\n text: slice.card.button.text,\n onClick: handleCardButtonClick,\n }\n }\n facts={slice.card.facts}\n image={\n <Image\n src={strapiMediaUrl(slice.card.image.img, 'medium')}\n alt={slice.card.image.alt}\n fill\n style={{ objectFit: slice.card.image.objectFit || 'cover' }}\n />\n }\n portfolioNumber={slice.card.portfolioNumber}\n />\n )}\n </GridItem>\n </Grid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React from 'react';\nimport {\n Box,\n DefaultSectionContainer,\n Flex,\n Heading,\n RichText,\n SimpleGrid,\n useToken,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport { ArrowRight } from '@phosphor-icons/react';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport StrapiImageWithLink from '../../models/strapi/StrapiImageWithLink';\nimport StrapiLink from '../../models/strapi/StrapiLink';\n\nexport interface LogoGridWithTextProps {\n slice: {\n title: string;\n text: string;\n button?: StrapiLink;\n logos: StrapiImageWithLink[];\n };\n}\n\nexport const LogoGridWithText: React.FC<LogoGridWithTextProps> = ({\n slice,\n}: LogoGridWithTextProps) => {\n const [primary50] = useToken('colors', ['primary.50']);\n\n return (\n <DefaultSectionContainer backgroundColor={primary50} title={slice.title}>\n <Wrapper>\n <SimpleGrid columns={2} gap=\"28\" minChildWidth=\"16rem\">\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n justifyContent=\"center\"\n alignItems=\"flex-start\"\n >\n <Heading as=\"h2\" size=\"3xl\" mb=\"4\">\n {slice.title}\n </Heading>\n <RichText content={slice.text} />\n {slice.button && (\n <StrapiLinkButton\n link={slice.button}\n size=\"md\"\n colorScheme=\"white\"\n variant=\"outline\"\n mt=\"6\"\n rightIcon={<ArrowRight />}\n component=\"LogoGridWithText\"\n />\n )}\n </Box>\n <Flex flexDir=\"row\" flexWrap=\"wrap\" gap={['12', null, null, '28']}>\n {slice.logos.map((logo) => (\n <Flex\n key={logo.id}\n justifyContent=\"center\"\n alignItems=\"center\"\n flexGrow={1}\n flexShrink={0}\n flexBasis={slice.logos.length > 2 ? '34%' : '90%'} // 34% are just enough to not allow three in one row\n >\n <Box position=\"relative\" height=\"20\" width=\"100%\">\n {logo.link ? (\n <a href={strapiLinkUrl(logo.link)}>\n <Image\n src={strapiMediaUrl(logo.img, 'small')}\n alt={logo.alt}\n fill\n style={{ objectFit: logo.objectFit || 'contain' }}\n />\n </a>\n ) : (\n <Image\n src={strapiMediaUrl(logo.img, 'small')}\n alt={logo.alt}\n fill\n style={{ objectFit: logo.objectFit || 'contain' }}\n />\n )}\n </Box>\n </Flex>\n ))}\n </Flex>\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import styled from '@emotion/styled';\nimport { BREAKPOINT_LG } from '../../constants/breakpoints';\nimport { Box } from 'boemly';\n\nexport const MapHeroContainer = styled(Box)`\n position: relative;\n width: 100vw;\n height: var(--default-hero-height);\n min-height: var(--boemly-sizes-3xl);\n background-color: var(--boemly-colors-primary-50);\n overflow: hidden;\n z-index: var(--boemly-zIndices-base);\n\n @media screen and (max-width: ${BREAKPOINT_LG}) {\n height: auto;\n }\n`;\n\nexport const MapHeroTextContainer = styled(Box)`\n position: absolute;\n width: 100vw;\n top: 56%;\n left: 0;\n transform: translateY(-50%);\n z-index: var(--boemly-zIndices-aboveBase);\n\n @media screen and (max-width: ${BREAKPOINT_LG}) {\n position: relative;\n transform: unset;\n\n padding-top: var(--boemly-space-32);\n }\n`;\n\nexport const ShapeContainer = styled(Box)`\n position: absolute;\n bottom: calc(var(--boemly-space-8) * -1);\n left: 0;\n\n width: var(--boemly-sizes-sm);\n height: var(--boemly-sizes-sm);\n\n border-top-right-radius: var(--boemly-radii-full);\n\n & span,\n div {\n border-top-right-radius: var(--boemly-radii-full);\n }\n\n @media screen and (max-width: ${BREAKPOINT_LG}) {\n display: none;\n }\n`;\n\nexport const MapContainer = styled(Box)`\n position: absolute;\n\n width: 50%;\n height: 100%;\n\n right: 0;\n top: 0;\n\n & img {\n object-fit: cover !important;\n }\n\n @media screen and (max-width: ${BREAKPOINT_LG}) {\n width: 100%;\n height: var(--boemly-sizes-4xl);\n position: relative;\n margin-top: calc(var(--boemly-space-72) * -1);\n background-color: var(--boemly-colors-white);\n\n & img {\n object-fit: contain !important;\n }\n }\n`;\n\nexport const MapGradient = styled(Box)`\n position: absolute;\n top: 0;\n right: 0;\n width: 100%;\n height: 100%;\n\n background: linear-gradient(\n 90deg,\n var(--boemly-colors-primary-50) 0%,\n var(--boemly-colors-primary-50) 10%,\n rgba(243, 246, 245, 0.6) 28%,\n rgba(243, 246, 245, 0) 40%,\n rgba(243, 246, 245, 0) 100%\n );\n\n @media screen and (max-width: ${BREAKPOINT_LG}) {\n background: linear-gradient(\n 180deg,\n var(--boemly-colors-primary-50) 0%,\n var(--boemly-colors-primary-50) 36%,\n rgba(243, 246, 245, 0.12) 46%,\n rgba(243, 246, 245, 0) 100%\n );\n }\n`;\n","import React from 'react';\nimport { DefaultSectionHeader, Flex, useMediaQuery, Wrapper } from 'boemly';\nimport Image from 'next/image';\nimport { BREAKPOINT_LG_QUERY } from '../../constants/breakpoints';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport {\n MapHeroContainer,\n MapHeroTextContainer,\n ShapeContainer,\n MapContainer,\n MapGradient,\n} from './styles';\n\nexport interface MapHeroProps {\n slice: {\n tagline?: string;\n title: string;\n subTitle?: string;\n buttons?: StrapiLink[];\n shape?: StrapiImage;\n map: StrapiImage;\n mobileMap: StrapiImage;\n };\n}\n\nexport const MapHero: React.FC<MapHeroProps> = ({ slice }: MapHeroProps) => {\n const [belowBreakpoint] = useMediaQuery(BREAKPOINT_LG_QUERY);\n\n return (\n <MapHeroContainer maxWidth=\"full\">\n {slice.shape && (\n <ShapeContainer>\n <Image\n src={strapiMediaUrl(slice.shape.img, 'medium')}\n alt={slice.shape.alt}\n fill\n style={{ objectFit: slice.shape.objectFit || 'cover' }}\n />\n </ShapeContainer>\n )}\n <MapHeroTextContainer>\n <Wrapper>\n <>\n <DefaultSectionHeader\n isHero\n tagline={slice.tagline}\n title={slice.title}\n text={slice.subTitle}\n titleProps={{ maxW: ['100%', null, null, null, '60%'] }}\n textProps={{ maxW: ['100%', null, null, null, '55%'] }}\n />\n {slice.buttons && slice.buttons.length > 0 && (\n <Flex mt=\"10\" flexDir=\"row\" gap=\"5\">\n <StrapiLinkButton\n link={slice.buttons[0]}\n size=\"xl\"\n component=\"MapHero\"\n />\n {slice.buttons.length === 2 && (\n <StrapiLinkButton\n link={slice.buttons[1]}\n variant=\"outline\"\n size=\"xl\"\n component=\"MapHero\"\n />\n )}\n </Flex>\n )}\n </>\n </Wrapper>\n </MapHeroTextContainer>\n <MapContainer>\n {belowBreakpoint ? (\n <Image\n src={strapiMediaUrl(slice.mobileMap.img, 'xLarge')}\n alt={slice.mobileMap.alt}\n fill\n style={{ objectFit: slice.mobileMap.objectFit || 'contain' }}\n />\n ) : (\n <Image\n src={strapiMediaUrl(slice.map.img, 'xLarge')}\n alt={slice.map.alt}\n fill\n style={{ objectFit: slice.map.objectFit || 'cover' }}\n />\n )}\n <MapGradient />\n </MapContainer>\n </MapHeroContainer>\n );\n};\n","const convertToKebabCase = (str: string) => {\n const matches =\n str &&\n str.match(\n /[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g\n );\n return matches ? matches.map((x: string) => x.toLowerCase()).join('-') : '';\n};\n\nexport default convertToKebabCase;\n","import React, { useContext } from 'react';\nimport {\n Box,\n Heading,\n HeroCard,\n SimpleGrid,\n Text,\n BoemlyAccordion,\n Wrapper,\n Flex,\n Spacer,\n} from 'boemly';\nimport { ArrowRight } from '@phosphor-icons/react';\nimport { useRouter } from 'next/router';\nimport Image from 'next/image';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport StrapiHeroCard from '../../models/strapi/StrapiHeroCard';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport convertToKebabCase from '../../utils/convertToKebabCase';\nimport { AnalyticsContext } from '../../components/ContextProvider/ContextProvider';\n\nconst VARIANTS = {\n gray: {\n backgroundColor: 'primary.50',\n tagLineColor: 'primary.500',\n textColor: 'black',\n accordionVariant: 'black',\n otherQuestionsBackground: 'primary.700',\n },\n green: {\n backgroundColor: 'primary.800',\n tagLineColor: 'white',\n textColor: 'white',\n accordionVariant: 'white',\n otherQuestionsBackground: 'primary.900',\n },\n white: {\n backgroundColor: 'white',\n tagLineColor: 'primary.500',\n textColor: 'black',\n accordionVariant: 'black',\n otherQuestionsBackground: 'primary.700',\n },\n};\n\nexport interface QAndAProps {\n slice: {\n tagline: string;\n title: string;\n questionsAndAnswers: {\n id: number;\n key: string;\n value: string;\n }[];\n otherQuestions: string;\n button: StrapiLink;\n hero?: StrapiHeroCard;\n variant?: keyof typeof VARIANTS;\n defaultIndex: number[];\n };\n}\n\nexport const QAndA: React.FC<QAndAProps> = ({ slice }: QAndAProps) => {\n const { push } = useRouter();\n const analyticsFunction = useContext(AnalyticsContext);\n\n const handleHeroButtonClick = () => {\n if (slice.hero?.button) {\n analyticsFunction?.({\n type: 'track',\n props: {\n action: 'click',\n component: 'QAndA',\n buttonText: slice.hero.button.text,\n buttonUrl: strapiLinkUrl(slice.hero.button),\n section: 'hero',\n },\n });\n push(strapiLinkUrl(slice.hero.button));\n }\n };\n\n const variant = VARIANTS[slice.variant ?? 'green'];\n\n return (\n <>\n <Box\n pb={slice.hero ? 80 : 28}\n id={convertToKebabCase(slice.title)}\n backgroundColor={variant.backgroundColor}\n >\n <Wrapper>\n <SimpleGrid columns={[1, null, null, 2]}>\n <Box mr=\"16\" paddingY=\"28\">\n <Text size=\"mdMonoUppercase\" color={variant.tagLineColor}>\n {slice.tagline}\n </Text>\n <Heading\n as=\"h2\"\n size=\"3xl\"\n color={variant.textColor}\n mt=\"6\"\n mb=\"16\"\n >\n {slice.title}\n </Heading>\n </Box>\n <Box\n maxHeight={['unset', null, null, 'xl']}\n paddingTop={['0', null, null, '28']}\n paddingRight={['0', null, null, '6']}\n overflowY={['unset', null, null, 'scroll']}\n >\n <Box>\n <BoemlyAccordion\n rows={slice.questionsAndAnswers}\n defaultIndex={slice.defaultIndex}\n variant={variant.accordionVariant as 'white' | 'black'}\n />\n <Flex\n padding=\"8\"\n backgroundColor={variant.otherQuestionsBackground}\n borderRadius=\"2xl\"\n mt=\"14\"\n flexDir={['column', null, null, 'row']}\n justifyContent={['flex-start', null, null, 'space-between']}\n alignItems={['flex-start', null, null, 'center']}\n >\n <Heading as=\"h6\" size=\"sm\" color=\"white\">\n {slice.otherQuestions}\n </Heading>\n <Spacer minHeight={['4', null, null, '0']} />\n <StrapiLinkButton\n size=\"lg\"\n colorScheme=\"white\"\n background=\"white\"\n rightIcon={<ArrowRight />}\n link={slice.button}\n component=\"QAndA\"\n />\n </Flex>\n </Box>\n </Box>\n </SimpleGrid>\n </Wrapper>\n </Box>\n\n {slice.hero && (\n <Box pb=\"28\" mt=\"-56\">\n <Wrapper>\n <HeroCard\n title={slice.hero.title}\n subTitle={slice.hero.subTitle}\n link={\n slice.hero.button && {\n text: slice.hero.button.text,\n onClick: handleHeroButtonClick,\n }\n }\n image={\n slice.hero.image && (\n <Image\n src={strapiMediaUrl(slice.hero.image.img, 'xLarge')}\n alt={slice.hero.image.alt}\n fill\n style={{ objectFit: slice.hero.image.objectFit || 'cover' }}\n />\n )\n }\n />\n </Wrapper>\n </Box>\n )}\n </>\n );\n};\n","import React, { useContext } from 'react';\nimport Image from 'next/image';\nimport {\n Box,\n DefaultSectionHeader,\n HeroCard,\n QuoteCard,\n Shape,\n SimpleGrid,\n Wrapper,\n} from 'boemly';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiQuoteCard from '../../models/strapi/StrapiQuoteCard';\nimport StrapiHeroCard from '../../models/strapi/StrapiHeroCard';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport convertToKebabCase from '../../utils/convertToKebabCase';\nimport { useRouter } from 'next/router';\nimport { AnalyticsContext } from '../../components/ContextProvider/ContextProvider';\n\ninterface QuoteCardsSlice extends StrapiDefaultHeader {\n cards: StrapiQuoteCard[];\n shapes?: StrapiImage[];\n hero?: StrapiHeroCard;\n}\nexport interface QuoteCardsProps {\n slice: QuoteCardsSlice;\n}\n\nexport const QuoteCards: React.FC<QuoteCardsProps> = ({\n slice,\n}: QuoteCardsProps) => {\n const { push } = useRouter();\n const analyticsFunction = useContext(AnalyticsContext);\n\n const handleHeroCardButtonClick = () => {\n if (slice.hero?.button) {\n analyticsFunction?.({\n type: 'track',\n props: {\n action: 'click',\n component: 'QuoteCards',\n buttonText: slice.hero.button.text,\n buttonUrl: strapiLinkUrl(slice.hero.button),\n section: 'hero',\n },\n });\n push(strapiLinkUrl(slice.hero.button));\n }\n };\n\n return (\n <>\n <Box\n id={convertToKebabCase(slice.title)}\n position=\"relative\"\n paddingTop=\"28\"\n paddingBottom={!!slice.hero ? '80' : '28'}\n >\n {slice.shapes && slice.shapes.length === 2 && (\n <>\n <Shape\n shape={\n <Image\n src={strapiMediaUrl(slice.shapes[0].img, 'small')}\n alt={slice.shapes[0].alt}\n fill\n style={{ objectFit: slice.shapes[0].objectFit || 'cover' }}\n />\n }\n top=\"0\"\n right=\"0\"\n size=\"xs\"\n radius=\"bottom-left\"\n />\n <Shape\n shape={\n <Image\n src={strapiMediaUrl(slice.shapes[1].img, 'small')}\n alt={slice.shapes[1].alt}\n fill\n style={{ objectFit: slice.shapes[1].objectFit || 'cover' }}\n />\n }\n bottom=\"0\"\n left=\"0\"\n radius=\"top-right\"\n />\n </>\n )}\n <Wrapper>\n <Box maxW=\"3xl\">\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n />\n </Box>\n <SimpleGrid\n columns={2}\n gap=\"20\"\n rowGap=\"6\"\n mt=\"16\"\n minChildWidth={['100%', null, '16rem']}\n >\n {slice.cards.map((card) => (\n <Box key={card.id} width=\"full\" maxWidth=\"2xl\">\n <QuoteCard\n key={card.id}\n avatar={{\n name: card.avatar.name,\n description: card.avatar.description,\n image: (\n <Image\n src={strapiMediaUrl(card.avatar.image.img, 'small')}\n alt={card.avatar.image.alt}\n fill\n style={{\n objectFit: card.avatar.image.objectFit || 'cover',\n }}\n />\n ),\n }}\n text={card.text}\n />\n </Box>\n ))}\n </SimpleGrid>\n </Wrapper>\n </Box>\n {slice.hero && (\n <Box marginTop=\"-40\" paddingBottom=\"28\">\n <Wrapper>\n <HeroCard\n title={slice.hero.title}\n subTitle={slice.hero.subTitle}\n link={\n slice.hero.button && {\n text: slice.hero.button.text,\n onClick: handleHeroCardButtonClick,\n }\n }\n image={\n slice.hero.image && (\n <Image\n src={strapiMediaUrl(slice.hero.image.img, 'xLarge')}\n alt={slice.hero.image.alt}\n fill\n style={{ objectFit: slice.hero.image.objectFit || 'cover' }}\n />\n )\n }\n />\n </Wrapper>\n </Box>\n )}\n </>\n );\n};\n","import React from 'react';\nimport {\n DefaultSectionContainer,\n Grid,\n GridItem,\n RichText,\n Wrapper,\n} from 'boemly';\n\nexport interface RichTextSectionProps {\n slice: {\n content: string;\n };\n}\n\nexport const RichTextSection: React.FC<RichTextSectionProps> = ({\n slice,\n}: RichTextSectionProps) => (\n <DefaultSectionContainer>\n <Wrapper>\n <Grid templateColumns=\"repeat(12, 1fr)\" gap=\"4\">\n <GridItem colSpan={[12, null, null, 7]}>\n <RichText content={slice.content} />\n </GridItem>\n </Grid>\n </Wrapper>\n </DefaultSectionContainer>\n);\n","import React, {\n createRef,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport {\n Box,\n Center,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Flex,\n Gradient,\n Heading,\n RichText,\n ShapesCard,\n Text,\n useToken,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport { useWindowScroll, useWindowSize } from 'react-use';\nimport { useRouter } from 'next/router';\nimport StrapiShapesCard from '../../models/strapi/StrapiShapesCard';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport { AnalyticsContext } from '../../components/ContextProvider/ContextProvider';\n\ninterface StepsSlice extends StrapiDefaultHeader {\n steps: {\n id: number;\n step: number;\n title: string;\n text?: string;\n }[];\n image?: StrapiImage;\n card?: StrapiShapesCard;\n}\nexport interface StepsProps {\n slice: StepsSlice;\n}\n\nexport const Steps: React.FC<StepsProps> = ({ slice }: StepsProps) => {\n const { push } = useRouter();\n const analyticsFunction = useContext(AnalyticsContext);\n\n const [gray900] = useToken('colors', ['gray.900']);\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n const [stepRefs, setStepRefs] = useState(new Array(slice.steps.length));\n const [stepProgress, setStepProgress] = useState(\n new Array(slice.steps.length)\n );\n\n const { y: offsetY } = useWindowScroll();\n const { height: windowHeight } = useWindowSize();\n\n const handleShapesCardButtonClick = () => {\n if (slice.card?.button) {\n analyticsFunction?.({\n type: 'track',\n props: {\n action: 'click',\n component: 'Steps',\n buttonText: slice.card.button.text,\n buttonUrl: strapiLinkUrl(slice.card.button),\n section: 'card',\n },\n });\n push(strapiLinkUrl(slice.card.button));\n }\n };\n useEffect(() => {\n setStepRefs(slice.steps.map(() => createRef()));\n }, []);\n\n useEffect(() => {\n const containerOffsetTop = containerRef.current?.offsetTop || 0;\n setStepProgress(\n stepRefs.map((ref) => {\n const currentItemOffsetTop = ref.current?.offsetTop || 0;\n return containerOffsetTop + currentItemOffsetTop <\n offsetY + windowHeight / 3\n ? 100\n : 0;\n })\n );\n }, [offsetY]);\n\n return (\n <div ref={containerRef}>\n <DefaultSectionContainer backgroundColor={gray900} title={slice.title}>\n <>\n {slice.image && (\n <Box\n position=\"absolute\"\n top=\"0\"\n left=\"0\"\n width=\"full\"\n height=\"full\"\n >\n <Image\n src={strapiMediaUrl(slice.image.img, 'xLarge')}\n alt={slice.image.alt}\n fill\n style={{ objectFit: slice.image.objectFit || 'cover' }}\n />\n <Gradient />\n </Box>\n )}\n </>\n <Wrapper>\n <>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n taglineProps={{ textAlign: 'center' }}\n titleProps={{\n textAlign: 'center',\n maxW: '2xl',\n marginX: 'auto',\n color: 'white',\n }}\n textProps={{\n textAlign: 'center',\n maxW: 'xl',\n marginX: 'auto',\n color: 'whiteAlpha.800',\n }}\n />\n\n <Box marginTop={['16', null, '24']}>\n {slice.steps.map(({ id, step, title, text }, index) => (\n <Flex flexDir=\"column\" alignItems=\"center\" key={id}>\n <Center\n width=\"10\"\n height=\"10\"\n borderRadius=\"full\"\n backgroundColor=\"white\"\n >\n <Text size=\"smRegularNormal\" color=\"black\">\n {step}\n </Text>\n </Center>\n <Heading size=\"lg\" color=\"white\" mt=\"4\" textAlign=\"center\">\n {title}\n </Heading>\n {text && (\n <Box maxW=\"xl\" mt=\"4\">\n <RichText\n options={{ forceBlock: true }}\n content={text}\n textProps={{\n size: 'mdRegularNormal',\n color: 'whiteAlpha.700',\n textAlign: 'center',\n }}\n />\n </Box>\n )}\n {(index + 1 < slice.steps.length || slice.card) && (\n <Box\n ref={stepRefs[index]}\n position=\"relative\"\n marginTop=\"4\"\n marginBottom=\"6\"\n height=\"12\"\n >\n <Box\n position=\"absolute\"\n height=\"full\"\n borderLeft=\"dashed 1px white\"\n opacity=\"0.5\"\n />\n <Box\n position=\"absolute\"\n height={`${stepProgress[index]}%`}\n borderRight=\"solid 1px white\"\n opacity=\"1\"\n transition=\"height ease var(--medium-transition-duration)\"\n />\n </Box>\n )}\n </Flex>\n ))}\n </Box>\n\n {slice.card && (\n <ShapesCard\n tagline={slice.card.tagline}\n title={slice.card.title}\n text={slice.card.text}\n shapes={\n slice.card.shapes &&\n slice.card.shapes?.map((shape) => (\n <Image\n key={shape.id}\n src={strapiMediaUrl(shape.img, 'small')}\n alt={shape.alt}\n fill\n style={{ objectFit: shape.objectFit || 'cover' }}\n />\n ))\n }\n button={\n slice.card.button && {\n text: slice.card.button.text,\n onClick: handleShapesCardButtonClick,\n }\n }\n />\n )}\n </>\n </Wrapper>\n </DefaultSectionContainer>\n </div>\n );\n};\n","import Issuer from './Issuer';\n\nexport enum CreditAvailability {\n CREDITS_AVAILABLE = 'credits_available',\n NO_CREDITS_AVAILABLE = 'no_credits_available',\n SOME_CREDITS_AVAILABLE = 'some_credits_available',\n SOON_CREDITS_AVAILABLE = 'soon_credits_available',\n}\n\ninterface FPMProject {\n id: string;\n title: string;\n description?: string;\n friendlyName?: string;\n\n isPublic?: boolean;\n geom?: {\n type: 'Point';\n coordinates: [number, number];\n };\n area?: number;\n location?: string;\n countryCode: string;\n start?: Date;\n end?: Date;\n projectType?: {\n title: string;\n id: string;\n createdAt: Date;\n updatedAt: Date;\n };\n projectDeveloper?: {\n name: string;\n friendlyName?: string;\n id: string;\n createdAt: Date;\n updatedAt: Date;\n };\n verificationStandard?: {\n id: string;\n createdAt: Date;\n updatedAt: Date;\n };\n forecastedAmountYearly?: number;\n averageSellableAmountPerYear: number;\n riskBuffer?: number;\n defaultIssuer?: Issuer;\n creditAvailability: CreditAvailability;\n certificationDate?: Date;\n\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport default FPMProject;\n","import { motion } from 'framer-motion';\nimport styled from '@emotion/styled';\nimport { BREAKPOINT_MD } from '../../constants/breakpoints';\nimport { Box } from 'boemly';\n\nexport const CarouselContainer = styled(Box)`\n margin-top: var(--boemly-space-6);\n padding: var(--boemly-space-8) 0;\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n margin-top: var(--boemly-space-4);\n width: var(--boemly-sizes-full);\n }\n\n width: var(--boemly-sizes-full);\n\n overflow-x: hidden;\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n overflow-x: scroll;\n }\n`;\n\ninterface CarouselInnerContainerProps {\n numberOfItems: number;\n}\nexport const CarouselInnerContainer = styled(\n motion.div\n)<CarouselInnerContainerProps>`\n display: flex;\n gap: var(--boemly-space-6);\n justify-content: center;\n\n width: calc(\n (var(--boemly-sizes-sm) + var(--boemly-space-6)) *\n ${({ numberOfItems }: CarouselInnerContainerProps) => numberOfItems} +\n var(--boemly-space-6)\n );\n min-width: var(--boemly-sizes-full);\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n gap: var(--boemly-space-1);\n justify-content: flex-start;\n width: calc(\n (var(--boemly-sizes-2xs) + var(--boemly-space-4)) *\n ${({ numberOfItems }: CarouselInnerContainerProps) => numberOfItems} +\n var(--boemly-space-6)\n );\n }\n`;\n\nexport const CardContainer = styled(Box)`\n width: var(--boemly-sizes-sm);\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n min-width: var(--boemly-sizes-sm);\n\n margin-right: var(--boemly-space-4);\n\n &:first-of-type {\n margin-left: var(--boemly-space-6);\n }\n }\n`;\n","import React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Box,\n Center,\n DefaultSectionContainer,\n DefaultSectionHeader,\n IconButton,\n TextCardWithIcon,\n useToken,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport StrapiTextCardWithIcon from '../../models/strapi/StrapiTextCardWithIcons';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport {\n CardContainer,\n CarouselContainer,\n CarouselInnerContainer,\n} from './styles';\nimport { useMeasure, useWindowSize } from 'react-use';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { ArrowLeft, ArrowRight } from '@phosphor-icons/react';\nimport { IntlContext } from '../../components/ContextProvider';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport { useRouter } from 'next/router';\nimport shuffleElements from '../../utils/shuffleElements';\nimport { AnalyticsContext } from '../../components/ContextProvider/ContextProvider';\n\ninterface TextCarouselSlice extends StrapiDefaultHeader {\n slides: StrapiTextCardWithIcon[];\n button?: StrapiLink;\n isShuffled?: boolean;\n}\nexport interface TextCarouselProps {\n slice: TextCarouselSlice;\n}\n\nconst ITEM_GAP = 24;\nconst MAX_OFFSET_RIGHT = 55;\n\nexport const TextCarousel: React.FC<TextCarouselProps> = ({\n slice,\n}: TextCarouselProps) => {\n const containerRef = useRef(null);\n const [primary50] = useToken('colors', ['primary.50']);\n const [itemRef, { width: itemWidth }] = useMeasure<HTMLDivElement>();\n const { formatMessage } = useContext(IntlContext);\n const analyticsFunction = useContext(AnalyticsContext);\n const { width: windowWidth } = useWindowSize();\n const { push } = useRouter();\n\n const [displaySlides, setDisplaySlides] = useState(slice.slides);\n const [sliderIndex, setSliderIndex] = useState(0);\n\n const numberOfItems = useMemo(\n () => slice.slides.length,\n [slice.slides.length]\n );\n\n const sliderItemsWidth = useMemo(\n () => numberOfItems * (itemWidth + ITEM_GAP) - ITEM_GAP,\n [itemWidth, numberOfItems]\n );\n\n const offsetLeft = useMemo(\n () => sliderIndex * (itemWidth + ITEM_GAP) * -1,\n [sliderIndex, itemWidth]\n );\n\n const allowScroll = useMemo(\n () => sliderItemsWidth + ITEM_GAP * 2 > windowWidth,\n\n [sliderItemsWidth, windowWidth]\n );\n\n const canMoveRight = useMemo(() => {\n const offsetRight = windowWidth - (sliderItemsWidth + offsetLeft);\n\n return offsetRight < MAX_OFFSET_RIGHT;\n }, [itemWidth, sliderIndex, sliderItemsWidth, windowWidth]);\n\n const canMoveLeft = useMemo(() => sliderIndex !== 0, [sliderIndex]);\n\n const handleSlidesButtonClick = (button?: StrapiLink) => {\n if (button) {\n analyticsFunction?.({\n type: 'track',\n props: {\n action: 'click',\n component: 'TextCarousel',\n buttonText: button.text,\n buttonUrl: strapiLinkUrl(button),\n section: 'slides',\n },\n });\n push(strapiLinkUrl(button));\n }\n };\n\n const { slides, isShuffled = false } = slice;\n\n useEffect(() => {\n if (isShuffled) {\n setDisplaySlides(shuffleElements(slides));\n }\n }, [slides, isShuffled]);\n\n return (\n <DefaultSectionContainer backgroundColor={primary50} title={slice.title}>\n <Wrapper>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n taglineProps={{ textAlign: 'center' }}\n titleProps={{ textAlign: 'center', maxW: '6xl', marginX: 'auto' }}\n textProps={{ textAlign: 'center', maxW: '2xl', marginX: 'auto' }}\n />\n </Wrapper>\n\n <CarouselContainer ref={containerRef}>\n <Box position=\"relative\" width=\"full\">\n <Wrapper>\n <CarouselInnerContainer\n numberOfItems={slice.slides.length}\n animate={{\n x: offsetLeft,\n }}\n transition={{\n duration: 0.3,\n ease: 'easeInOut',\n }}\n >\n {displaySlides.map(({ id, title, text, icon, image, button }) => (\n <CardContainer key={id} ref={itemRef}>\n <TextCardWithIcon\n title={title}\n text={text}\n height=\"full\"\n icon={\n <Image\n src={strapiMediaUrl(icon.img, 'small')}\n alt={icon.alt}\n fill\n style={{ objectFit: icon.objectFit || 'contain' }}\n />\n }\n image={\n image && (\n <Image\n src={strapiMediaUrl(image?.img, 'medium')}\n alt={image?.alt}\n fill\n style={{\n objectFit: image?.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n )\n }\n button={\n button && {\n text: button.text,\n onClick: () => handleSlidesButtonClick(button),\n }\n }\n displayAs=\"column\"\n />\n </CardContainer>\n ))}\n </CarouselInnerContainer>\n </Wrapper>\n <Box\n display={['none', null, null, !!allowScroll ? 'flex' : 'none']}\n pointerEvents=\"none\"\n position=\"absolute\"\n top=\"40%\"\n left=\"0\"\n width=\"full\"\n py=\"0\"\n px=\"32\"\n justifyContent=\"space-between\"\n >\n <Box>\n <AnimatePresence>\n {canMoveLeft && (\n <IconButton\n key=\"leftButton\"\n as={motion.button}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n size=\"lg\"\n variant=\"outline\"\n onClick={() => setSliderIndex(sliderIndex - 1)}\n aria-label={formatMessage({\n id: 'sections.textCarousel.moveLeft',\n })}\n icon={<ArrowLeft size={16} />}\n pointerEvents=\"auto\"\n boxShadow=\"md\"\n />\n )}\n </AnimatePresence>\n </Box>\n <Box>\n <AnimatePresence>\n {canMoveRight && (\n <IconButton\n key=\"rightButton\"\n as={motion.button}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n size=\"lg\"\n variant=\"outline\"\n onClick={() => setSliderIndex(sliderIndex + 1)}\n aria-label={formatMessage({\n id: 'sections.textCarousel.moveRight',\n })}\n icon={<ArrowRight size={16} />}\n pointerEvents=\"auto\"\n boxShadow=\"md\"\n />\n )}\n </AnimatePresence>\n </Box>\n </Box>\n </Box>\n </CarouselContainer>\n\n <>\n {slice.button && (\n <Wrapper>\n <Center>\n <StrapiLinkButton\n link={slice.button}\n size=\"xl\"\n mt={['8', null, '14']}\n component=\"TextCarousel\"\n />\n </Center>\n </Wrapper>\n )}\n </>\n </DefaultSectionContainer>\n );\n};\n","const shuffleElements = (slides: any[]) => {\n const slidesCopy = [...slides]; // Create a copy to avoid mutating the original array\n for (let i = slidesCopy.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [slidesCopy[i], slidesCopy[j]] = [slidesCopy[j], slidesCopy[i]];\n }\n return slidesCopy;\n};\n\nexport default shuffleElements;\n","import React, { useContext } from 'react';\nimport {\n Box,\n ContactArea,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Grid,\n GridItem,\n TextCardWithIcon,\n useMediaQuery,\n useToken,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport { useRouter } from 'next/router';\nimport { BREAKPOINT_LG_QUERY } from '../../constants/breakpoints';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport StrapiContactArea from '../../models/strapi/StrapiContactArea';\nimport StrapiTextCardWithIcon from '../../models/strapi/StrapiTextCardWithIcons';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport { AnalyticsContext } from '../../components/ContextProvider/ContextProvider';\n\ninterface TextWithTextCardsSlice extends StrapiDefaultHeader {\n cards: StrapiTextCardWithIcon[];\n contact?: StrapiContactArea;\n shape?: StrapiImage;\n}\nexport interface TextWithTextCardsProps {\n slice: TextWithTextCardsSlice;\n}\n\nexport const TextWithTextCards: React.FC<TextWithTextCardsProps> = ({\n slice,\n}: TextWithTextCardsProps) => {\n const { push } = useRouter();\n const analyticsFunction = useContext(AnalyticsContext);\n const [white] = useToken('colors', ['white']);\n const [belowBreakpoint] = useMediaQuery(BREAKPOINT_LG_QUERY);\n\n const handleContactButtonClick = () => {\n if (slice.contact?.button) {\n analyticsFunction?.({\n type: 'track',\n props: {\n action: 'click',\n component: 'TextWithTextCards',\n buttonText: slice.contact.button.text,\n buttonUrl: strapiLinkUrl(slice.contact.button),\n section: 'contact',\n },\n });\n push(strapiLinkUrl(slice.contact.button));\n }\n };\n\n return (\n <DefaultSectionContainer backgroundColor={white} title={slice.title}>\n <>\n {slice.shape && (\n <Box\n position=\"absolute\"\n right={['-28', null, null, '-136']}\n top={['96', null, null, '-28']}\n width={['sm', null, null, '4xl']}\n height={['sm', null, null, '4xl']}\n borderBottomRightRadius=\"full\"\n >\n <Image\n src={strapiMediaUrl(slice.shape.img, 'medium')}\n alt={slice.shape.alt}\n fill\n style={{\n objectFit: slice.shape.objectFit || 'cover',\n borderBottomRightRadius: 'var(--boemly-radii-full)',\n }}\n />\n </Box>\n )}\n </>\n <Wrapper>\n <>\n <Grid\n templateColumns={[\n 'repeat(8, 1fr)',\n null,\n null,\n null,\n 'repeat(16, 1fr)',\n ]}\n templateRows={[\n 'repeat(2, auto)',\n null,\n null,\n null,\n 'repeat(1, auto)',\n ]}\n rowGap=\"12\"\n >\n <GridItem\n colSpan={[8, null, null, null, 9]}\n rowSpan={1}\n pr={['0', null, null, null, '32']}\n >\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n textProps={{ pr: ['0', null, null, null, '10'] }}\n />\n\n {slice.contact && !belowBreakpoint && (\n <ContactArea\n title={slice.contact.title}\n text={slice.contact.text}\n avatar={{\n name: slice.contact.avatar.name,\n description: slice.contact.avatar.description,\n image: (\n <Image\n src={strapiMediaUrl(\n slice.contact.avatar.image.img,\n 'small'\n )}\n alt={slice.contact.avatar.image.alt}\n fill\n style={{\n objectFit:\n slice.contact.avatar.image.objectFit || 'cover',\n }}\n />\n ),\n }}\n link={{\n text: slice.contact.button.text,\n onClick: handleContactButtonClick,\n }}\n />\n )}\n </GridItem>\n <GridItem\n colSpan={[8, null, null, null, 7]}\n rowSpan={1}\n position=\"relative\"\n >\n {slice.cards.map((card) => (\n <TextCardWithIcon\n key={card.id}\n title={card.title}\n text={card.text}\n icon={\n <Image\n src={strapiMediaUrl(card.icon.img, 'small')}\n alt={card.icon.alt}\n fill\n style={{ objectFit: card.icon.objectFit || 'contain' }}\n />\n }\n />\n ))}\n </GridItem>\n </Grid>\n {slice.contact && belowBreakpoint && (\n <ContactArea\n title={slice.contact.title}\n text={slice.contact.text}\n avatar={{\n name: slice.contact.avatar.name,\n description: slice.contact.avatar.description,\n image: (\n <Image\n src={strapiMediaUrl(\n slice.contact.avatar.image.img,\n 'small'\n )}\n alt={slice.contact.avatar.image.alt}\n fill\n style={{\n objectFit:\n slice.contact.avatar.image.objectFit || 'cover',\n }}\n />\n ),\n }}\n link={{\n text: slice.contact.button.text,\n onClick: handleContactButtonClick,\n }}\n />\n )}\n </>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import { FormatNumberOptions } from 'react-intl';\n\nexport const FORMAT_AS_EUR_CONFIG: FormatNumberOptions = {\n style: 'currency',\n currency: 'EUR',\n};\n\nexport const FORMAT_AS_METER_CONFIG: FormatNumberOptions = {\n unit: 'meter',\n unitDisplay: 'short',\n style: 'unit',\n maximumFractionDigits: 0,\n};\n\nexport const FORMAT_AS_HECTARE_CONFIG: FormatNumberOptions = {\n unit: 'hectare',\n unitDisplay: 'short',\n style: 'unit',\n maximumFractionDigits: 2,\n};\n\nexport const FORMAT_AS_CUBIC_METERS_PER_HECTARE_CONFIG: FormatNumberOptions = {\n maximumFractionDigits: 0,\n};\n\nexport const FORMAT_AS_PERCENT_CONFIG: FormatNumberOptions = {\n style: 'percent',\n maximumFractionDigits: 2,\n};\n","import React, { useContext } from 'react';\nimport { Flex, Tag, Text } from 'boemly';\nimport NextLink from 'next/link';\nimport { IntlContext } from '../ContextProvider';\nimport { CreditAvailability } from '../../models/fpm/FPMProject';\n\nexport interface CreditsAvailableBadgeProps {\n status: CreditAvailability;\n href?: string;\n}\n\nconst CreditsAvailableBadge = ({\n status,\n href,\n}: CreditsAvailableBadgeProps) => {\n const { formatMessage } = useContext(IntlContext);\n\n const variants: Record<\n CreditAvailability,\n { message: string; color: string }\n > = {\n [CreditAvailability.CREDITS_AVAILABLE]: {\n message: formatMessage({\n id: 'components.creditsAvailableBadge.text.yes',\n }),\n color: 'green.600',\n },\n [CreditAvailability.NO_CREDITS_AVAILABLE]: {\n message: formatMessage({\n id: 'components.creditsAvailableBadge.text.no',\n }),\n color: 'red.600',\n },\n [CreditAvailability.SOME_CREDITS_AVAILABLE]: {\n message: formatMessage({\n id: 'components.creditsAvailableBadge.text.some',\n }),\n color: 'orange.500',\n },\n [CreditAvailability.SOON_CREDITS_AVAILABLE]: {\n message: formatMessage({\n id: 'components.creditsAvailableBadge.text.notYet',\n }),\n color: 'blue.500',\n },\n };\n\n const variant = variants[status];\n\n return (\n <Flex\n justifyContent=\"flex-start\"\n as={href ? NextLink : undefined}\n href={href}\n >\n <Tag backgroundColor={variant.color}>\n <Text color=\"white\" size=\"xsLowBold\">\n {variant.message}\n </Text>\n </Tag>\n </Flex>\n );\n};\n\nexport default CreditsAvailableBadge;\n","export const MAPBOX_TOKEN =\n 'pk.eyJ1IjoidHJlZS1seSIsImEiOiJja25rNG1heHgwNThjMnZwZTl2eThmeXUwIn0.SOrYUKfevZkbx8jZPxJesA';\n\nexport enum MapBoxStyle {\n Outdoors = 'mapbox://styles/mapbox/outdoors-v11',\n SatelliteStreets = 'mapbox://styles/mapbox/satellite-streets-v11',\n Satellite = 'mapbox://styles/mapbox/satellite-v9',\n CaliTerrain = 'mapbox://styles/tree-ly/clna54iq603ht01pbc199cszw',\n}\n\nexport const MAPBOX_TILES_URL = `${\n process.env.NEXT_PUBLIC_MAPBOX_TILES_URL || 'http://localhost:8123'\n}/vectortiles/v1/plots/{z}/{x}/{y}.mvt`;\nexport const MAPBOX_SOURCE_LAYER = 'plots';\nexport const MAPBOX_SOURCE_IDENTIFIER = 'plots';\nexport const MAPBOX_BORDER_LAYER_IDENTIFIER = 'plots-borders';\nexport const MAPBOX_FILL_LAYER_IDENTIFIER = 'plots-fill';\nexport const MAPBOX_TEXT_LAYER_IDENTIFIER = 'plots-text';\n\nexport const MAPBOX_TEXT_MIN_ZOOM = 15;\nexport const MAPBOX_SHAPES_MIN_ZOOM = 13;\n\nexport const MAPBOX_MAX_ZOOM = 19;\nexport const MAPBOX_INITIAL_ZOOM = 13;\n","import { Box, Container, Flex, Heading, Tag, Text } from 'boemly';\nimport React, { useContext } from 'react';\nimport Image from 'next/image';\nimport PortfolioProject from '../../models/PortfolioProject';\nimport { strapiMediaUrl } from '../..';\nimport { FORMAT_AS_HECTARE_CONFIG } from '../../constants/formatter';\nimport CreditsAvailableBadge from '../../components/CreditsAvailableBadge';\nimport { IntlContext } from '../ContextProvider';\n\nexport interface ProjectGridCardProps {\n project: PortfolioProject;\n}\n\nexport const ProjectGridCard = ({\n project,\n}: ProjectGridCardProps): JSX.Element => {\n const { formatNumber, formatMessage } = useContext(IntlContext);\n\n return (\n <Container height=\"full\">\n <Flex flexDir=\"column\" height=\"full\">\n {project.thumbnail && (\n <Box borderRadius=\"xl\" position=\"relative\" height=\"36\" mb=\"2\">\n <Image\n src={strapiMediaUrl(project.thumbnail?.img, 'medium')}\n alt={project.thumbnail?.alt}\n fill\n style={{\n objectFit: project.thumbnail?.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n )}\n <Heading my=\"4\" size=\"lg\">\n {project.friendlyName || project.title}\n </Heading>\n <Flex flexDir=\"row\" gap=\"2\" flexWrap=\"wrap\">\n <Tag>\n <Text size=\"xsLowBold\" color=\"gray.800\">\n {formatNumber(\n (project.area || 0) / 10000,\n FORMAT_AS_HECTARE_CONFIG\n )}\n </Text>\n </Tag>\n <Tag>\n <Text size=\"xsLowBold\" color=\"gray.800\">\n {project.location}\n </Text>\n </Tag>\n {project.certificationDate ? (\n <Tag>\n <Text size=\"xsLowBold\" color=\"gray.800\">\n {formatMessage(\n { id: 'components.projectGridCard.certified' },\n { year: new Date(project.certificationDate).getFullYear() }\n )}\n </Text>\n </Tag>\n ) : (\n <Tag>\n <Text size=\"xsLowBold\" color=\"gray.800\">\n {formatMessage({\n id: 'components.projectGridCard.certificationInProgress',\n })}\n </Text>\n </Tag>\n )}\n <CreditsAvailableBadge status={project.creditAvailability} />\n </Flex>\n </Flex>\n </Container>\n );\n};\n","import React from 'react';\nimport {\n DefaultSectionContainer,\n DefaultSectionHeader,\n Grid,\n GridItem,\n ProjectCard,\n Spacer,\n BoemlyList,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport { ArrowRight } from '@phosphor-icons/react';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport StrapiProjectCard from '../../models/strapi/StrapiProjectCard';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport { IStrapiData, PortfolioProject, StrapiProject } from '../..';\nimport ProjectGridCard from '../../components/ProjectGridCard';\n\ninterface TextWithCardSlice {\n tagline?: string;\n title: string;\n text?: string;\n listItems?: {\n id: number;\n text: string;\n }[];\n button?: StrapiLink;\n card?: StrapiProjectCard;\n project?: { data?: IStrapiData<StrapiProject> };\n cardPosition: 'left' | 'right';\n}\nexport interface TextWithCardProps {\n slice: TextWithCardSlice;\n projects: PortfolioProject[];\n}\n\nexport const TextWithCard: React.FC<TextWithCardProps> = ({\n slice,\n projects,\n}: TextWithCardProps) => {\n const portfolioProject = projects.find(\n (p) =>\n slice.project?.data?.attributes.fpmProjectId &&\n p.id === slice.project.data.attributes.fpmProjectId\n );\n\n const card = (\n <GridItem\n colSpan={[4, null, null, null, 2]}\n rowSpan={1}\n position=\"relative\"\n data-testid={`card-position-${slice.cardPosition}`}\n >\n {portfolioProject && <ProjectGridCard project={portfolioProject} />}\n {!portfolioProject && slice.card && (\n <ProjectCard\n facts={slice.card.facts}\n footerSubTitle={slice.card.footerSubTitle}\n footerTitle={slice.card.footerTitle}\n title={slice.card.title}\n image={\n <Image\n src={strapiMediaUrl(slice.card.image.img, 'medium')}\n alt={slice.card.image.alt}\n fill\n style={{ objectFit: slice.card.image.objectFit || 'cover' }}\n />\n }\n />\n )}\n </GridItem>\n );\n\n return (\n <DefaultSectionContainer title={slice.title}>\n <Wrapper>\n <Grid\n templateColumns={[\n 'repeat(4, auto)',\n null,\n null,\n null,\n 'repeat(6, auto)',\n ]}\n templateRows={[\n 'repeat(2, auto)',\n null,\n null,\n null,\n 'repeat(1, auto)',\n ]}\n rowGap=\"12\"\n columnGap={['0', null, null, null, '28']}\n >\n {slice.cardPosition === 'left' && card}\n <GridItem colSpan={4} rowSpan={1} position=\"relative\">\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n />\n\n {slice.listItems && (\n <>\n <Spacer height=\"10\" />\n <BoemlyList listItems={slice.listItems} />\n <Spacer height=\"10\" />\n </>\n )}\n\n {slice.button && (\n <StrapiLinkButton\n link={slice.button}\n size=\"md\"\n colorScheme=\"white\"\n variant=\"outline\"\n rightIcon={<ArrowRight />}\n component=\"TextWithCard\"\n />\n )}\n </GridItem>\n {slice.cardPosition === 'right' && card}\n </Grid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React from 'react';\nimport Link from 'next/link';\nimport {\n Box,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Heading,\n SimpleGrid,\n Text,\n Wrapper,\n} from 'boemly';\nimport { CaretRight } from '@phosphor-icons/react';\nimport { MEDIUM_TRANSITION_DURATION } from '../../constants/animations';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport StrapiLink from '../../models/strapi/StrapiLink';\n\ninterface LinkCardsGridSlice {\n tagline?: string;\n title: string;\n text?: string;\n cards: {\n id: number;\n title: string;\n text?: string;\n link: StrapiLink;\n }[];\n}\nexport interface LinkCardsGridProps {\n slice: LinkCardsGridSlice;\n}\n\nexport const LinkCardsGrid: React.FC<LinkCardsGridProps> = ({\n slice,\n}: LinkCardsGridProps) => (\n <DefaultSectionContainer title={slice.title}>\n <Wrapper>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n />\n\n <SimpleGrid mt=\"16\" columns={[1, null, null, null, 2]} gap=\"4\">\n {slice.cards.map(({ id, title, text, link }) => (\n <Box\n key={id}\n as={Link}\n href={strapiLinkUrl(link)}\n data-testid=\"link\"\n px=\"10\"\n py=\"8\"\n borderStyle=\"solid\"\n borderWidth=\"thin\"\n borderColor=\"gray.200\"\n borderRadius=\"2xl\"\n display=\"flex\"\n flexDir=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n cursor=\"pointer\"\n transitionDuration={`${MEDIUM_TRANSITION_DURATION}s`}\n _hover={{ backgroundColor: 'gray.50' }}\n >\n <div>\n <Heading as=\"h4\" size=\"lg\">\n {title}\n </Heading>\n {text && (\n <Text mt=\"2\" size=\"smRegularNormal\">\n {text}\n </Text>\n )}\n </div>\n\n <Box\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderStyle=\"solid\"\n borderWidth=\"thin\"\n borderColor=\"gray.200\"\n borderRadius=\"2xl\"\n height=\"12\"\n width=\"12\"\n minWidth=\"12\"\n minHeight=\"12\"\n ml=\"6\"\n backgroundColor=\"white\"\n >\n <CaretRight />\n </Box>\n </Box>\n ))}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n);\n","import React from 'react';\nimport {\n Box,\n DefaultSectionHeader,\n Flex,\n Gradient,\n Tag,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\n\nexport interface SmallHeroProps {\n slice: {\n tags?: {\n id: number;\n text: string;\n colorScheme: string;\n }[];\n tagline?: string;\n title: string;\n subTitle?: string;\n button?: StrapiLink;\n image?: StrapiImage;\n gradient?: boolean;\n };\n theme: 'dark' | 'light';\n}\n\nconst colors = {\n dark: {\n tagline: 'white',\n title: 'white',\n text: 'white',\n background: 'gray.900',\n },\n light: {\n tagline: 'primary.500',\n title: 'black',\n text: 'gray.500',\n background: 'primary.50',\n },\n};\n\nexport const SmallHero: React.FC<SmallHeroProps> = ({\n slice,\n theme,\n}: SmallHeroProps) => (\n <Box\n position=\"relative\"\n width=\"full\"\n height=\"xl\"\n backgroundColor={colors[theme].background}\n >\n {slice.image && (\n <>\n <Image\n src={strapiMediaUrl(slice.image.img, 'xLarge')}\n alt={slice.image.alt}\n fill\n style={{ objectFit: slice.image.objectFit || 'cover' }}\n />\n {slice.gradient && <Gradient />}\n </>\n )}\n <Box\n position=\"absolute\"\n left=\"0\"\n top=\"60%\"\n width=\"full\"\n textAlign=\"center\"\n transform=\"translateY(-50%)\"\n >\n <Wrapper>\n <>\n {slice.tags && (\n <Flex direction=\"row\" justify=\"center\" gap=\"2\" mb=\"4\" wrap=\"wrap\">\n {slice.tags.map(({ id, text, colorScheme }) => (\n <Tag\n key={id}\n colorScheme={colorScheme}\n size=\"md\"\n variant=\"subtle\"\n >\n {text}\n </Tag>\n ))}\n </Flex>\n )}\n <DefaultSectionHeader\n isHero\n tagline={slice.tagline}\n title={slice.title}\n text={slice.subTitle}\n taglineProps={{\n color: colors[theme].tagline,\n textAlign: 'center',\n mx: 'auto',\n }}\n titleProps={{\n color: colors[theme].title,\n maxW: '4xl',\n textAlign: 'center',\n mx: 'auto',\n }}\n textProps={{\n maxW: '2xl',\n textAlign: 'center',\n mx: 'auto',\n color: colors[theme].text,\n }}\n />\n {slice.button && (\n <StrapiLinkButton\n link={slice.button}\n mt=\"6\"\n size=\"lg\"\n component=\"SmallHero\"\n />\n )}\n </>\n </Wrapper>\n </Box>\n </Box>\n);\n","import styled from '@emotion/styled';\nimport { BREAKPOINT_MD } from '../../constants/breakpoints';\nimport { Box, Link } from 'boemly';\n\nexport const BlogItemContainer = styled(Link)`\n text-decoration: none;\n\n & div img {\n transition: transform var(--default-ease) var(--medium-transition-duration);\n }\n\n &:hover {\n text-decoration: none;\n\n & > div:first-of-type img {\n transform: scale(1.03);\n }\n }\n`;\n\nexport const ImageContainer = styled(Box)`\n width: 100%;\n height: var(--boemly-sizes-xs);\n position: relative;\n border-radius: var(--boemly-radii-2xl);\n\n // Fixes the flickering of borders during animation in Safari\n -webkit-mask-image: -webkit-radial-gradient(white, black);\n\n & span,\n div {\n border-radius: var(--boemly-radii-2xl);\n }\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n height: var(--boemly-sizes-3xs);\n }\n`;\n","import React, { useContext } from 'react';\nimport {\n Box,\n DatePersonPair,\n DefaultSectionContainer,\n Heading,\n SimpleGrid,\n Spacer,\n Text,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport Link from 'next/link';\nimport StrapiBlogPost from '../../models/strapi/StrapiBlogPost';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport { BlogItemContainer, ImageContainer } from './styles';\nimport { IntlContext } from '../../components/ContextProvider';\n\nexport interface BlogProps {\n slice: {\n blog_posts: IStrapiData<StrapiBlogPost>[];\n };\n blogPosts: IStrapiData<StrapiBlogPost>[];\n}\n\nexport const Blog: React.FC<BlogProps> = ({ slice, blogPosts }: BlogProps) => {\n const { formatDate } = useContext(IntlContext);\n const sortedBlogPosts = slice.blog_posts.sort(\n (a, b) =>\n new Date(b.attributes.createdAt).getTime() -\n new Date(a.attributes.createdAt).getTime()\n );\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n <SimpleGrid columns={[1, null, null, 2]} spacingX={56} spacingY={24}>\n {sortedBlogPosts.map(({ attributes }) => {\n const blogPost: IStrapiData<StrapiBlogPost> | undefined =\n blogPosts.find((bp) => bp.attributes.slug === attributes.slug);\n if (!blogPost) {\n return null;\n }\n return (\n <BlogItemContainer\n key={blogPost.attributes.slug}\n as={Link}\n href={`/blog/${blogPost.attributes.slug}`}\n >\n <ImageContainer>\n <Image\n src={strapiMediaUrl(blogPost.attributes.img.img, 'large')}\n alt={blogPost.attributes.img.alt}\n fill\n style={{\n objectFit: blogPost.attributes.img.objectFit || 'cover',\n }}\n />\n </ImageContainer>\n <Box px=\"2\" py=\"8\">\n {blogPost.attributes.category.data && (\n <Text size=\"smMonoUppercase\" color=\"primary.800\" mb=\"2\">\n {blogPost.attributes.category.data.attributes.name}\n </Text>\n )}\n <Heading size=\"lg\">{blogPost.attributes.title}</Heading>\n {blogPost.attributes.teaser && (\n <Text size=\"mdRegularNormal\" mt=\"2\">\n {blogPost.attributes.teaser}\n </Text>\n )}\n <Spacer height=\"4\" />\n <DatePersonPair\n date={formatDate(blogPost.attributes.createdAt)}\n person={\n blogPost.attributes.author.data\n ? {\n name: blogPost.attributes.author.data.attributes\n .name,\n image: (\n <Image\n src={strapiMediaUrl(\n blogPost.attributes.author.data.attributes.img\n .img,\n 'thumbnail'\n )}\n alt={\n blogPost.attributes.author.data.attributes.img\n .alt\n }\n fill\n style={{\n objectFit:\n blogPost.attributes.author.data.attributes\n .img.objectFit || 'cover',\n }}\n />\n ),\n }\n : undefined\n }\n />\n </Box>\n </BlogItemContainer>\n );\n })}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React from 'react';\nimport { Box, DefaultSectionContainer, SimpleGrid, Wrapper } from 'boemly';\nimport Link from 'next/link';\nimport { MEDIUM_TRANSITION_DURATION } from '../../constants/animations';\nimport PortfolioProject from '../../models/PortfolioProject';\nimport IStrapi from '../../models/strapi/IStrapi';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport StrapiProject from '../../models/strapi/StrapiProject';\nimport ProjectGridCard from '../../components/ProjectGridCard';\n\nexport interface ProjectsGridProps {\n slice: {\n projects: IStrapi<IStrapiData<StrapiProject>[]>;\n };\n projects: PortfolioProject[];\n}\n\nconst ConditionalWrapper = ({\n condition,\n wrapper,\n children,\n}: {\n condition: boolean;\n wrapper: (children: JSX.Element) => JSX.Element;\n children: JSX.Element;\n}) => (condition ? wrapper(children) : children);\n\nexport const ProjectsGrid: React.FC<ProjectsGridProps> = ({\n projects,\n slice,\n}: ProjectsGridProps) => {\n const filteredProjects = projects.filter(\n (fpmProject) =>\n fpmProject.thumbnail &&\n slice.projects.data.some(\n (strapiProject) =>\n strapiProject.attributes.fpmProjectId === fpmProject.id\n )\n );\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n <SimpleGrid columns={[1, null, null, 2, null, 3]} gap=\"16\">\n {filteredProjects.map((project) => (\n <ConditionalWrapper\n key={project.id}\n condition={!!project.slug}\n wrapper={(children: JSX.Element) => (\n <Link\n href={`${project.portfolioHost || ''}/portfolio/${\n project.slug\n }`}\n passHref\n key={project.id}\n legacyBehavior\n >\n {children}\n </Link>\n )}\n >\n <Box\n as=\"a\"\n cursor=\"pointer\"\n borderRadius=\"2xl\"\n transition={`box-shadow ease ${MEDIUM_TRANSITION_DURATION}s`}\n _hover={{ boxShadow: 'lg' }}\n >\n <ProjectGridCard project={project} />\n </Box>\n </ConditionalWrapper>\n ))}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import { css } from '@emotion/react';\n\nconst mapboxStyle = css`\n .mapboxgl-map {\n -webkit-tap-highlight-color: rgb(0 0 0/0);\n font: 12px/20px Helvetica Neue, Arial, Helvetica, sans-serif;\n overflow: hidden;\n position: relative;\n }\n .mapboxgl-canvas {\n left: 0;\n position: absolute;\n top: 0;\n }\n .mapboxgl-map:-webkit-full-screen {\n height: 100%;\n width: 100%;\n }\n .mapboxgl-canary {\n background-color: salmon;\n }\n .mapboxgl-canvas-container.mapboxgl-interactive,\n .mapboxgl-ctrl-group button.mapboxgl-ctrl-compass {\n cursor: grab;\n -webkit-user-select: none;\n user-select: none;\n }\n .mapboxgl-canvas-container.mapboxgl-interactive.mapboxgl-track-pointer {\n cursor: pointer;\n }\n .mapboxgl-canvas-container.mapboxgl-interactive:active,\n .mapboxgl-ctrl-group button.mapboxgl-ctrl-compass:active {\n cursor: grabbing;\n }\n .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate,\n .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate .mapboxgl-canvas {\n touch-action: pan-x pan-y;\n }\n .mapboxgl-canvas-container.mapboxgl-touch-drag-pan,\n .mapboxgl-canvas-container.mapboxgl-touch-drag-pan .mapboxgl-canvas {\n touch-action: pinch-zoom;\n }\n .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan,\n .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan\n .mapboxgl-canvas {\n touch-action: none;\n }\n .mapboxgl-ctrl-bottom-left,\n .mapboxgl-ctrl-bottom-right,\n .mapboxgl-ctrl-top-left,\n .mapboxgl-ctrl-top-right {\n pointer-events: none;\n position: absolute;\n z-index: 2;\n }\n .mapboxgl-ctrl-top-left {\n left: 0;\n top: 0;\n }\n .mapboxgl-ctrl-top-right {\n right: 0;\n top: 0;\n }\n .mapboxgl-ctrl-bottom-left {\n bottom: 0;\n left: 0;\n }\n .mapboxgl-ctrl-bottom-right {\n bottom: 0;\n right: 0;\n }\n .mapboxgl-ctrl {\n clear: both;\n pointer-events: auto;\n transform: translate(0);\n }\n .mapboxgl-ctrl-top-left .mapboxgl-ctrl {\n float: left;\n margin: 10px 0 0 10px;\n }\n .mapboxgl-ctrl-top-right .mapboxgl-ctrl {\n float: right;\n margin: 10px 10px 0 0;\n }\n .mapboxgl-ctrl-bottom-left .mapboxgl-ctrl {\n float: left;\n margin: 0 0 10px 10px;\n }\n .mapboxgl-ctrl-bottom-right .mapboxgl-ctrl {\n float: right;\n margin: 0 10px 10px 0;\n }\n .mapboxgl-ctrl-group {\n background: #fff;\n border-radius: 4px;\n }\n .mapboxgl-ctrl-group:not(:empty) {\n box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1);\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl-group:not(:empty) {\n box-shadow: 0 0 0 2px ButtonText;\n }\n }\n .mapboxgl-ctrl-group button {\n background-color: transparent;\n border: 0;\n box-sizing: border-box;\n cursor: pointer;\n display: block;\n height: 29px;\n outline: none;\n overflow: hidden;\n padding: 0;\n width: 29px;\n }\n .mapboxgl-ctrl-group button + button {\n border-top: 1px solid #ddd;\n }\n .mapboxgl-ctrl button .mapboxgl-ctrl-icon {\n background-position: 50%;\n background-repeat: no-repeat;\n display: block;\n height: 100%;\n width: 100%;\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl-icon {\n background-color: transparent;\n }\n .mapboxgl-ctrl-group button + button {\n border-top: 1px solid ButtonText;\n }\n }\n .mapboxgl-ctrl-attrib-button:focus,\n .mapboxgl-ctrl-group button:focus {\n box-shadow: 0 0 2px 2px #0096ff;\n }\n .mapboxgl-ctrl button:disabled {\n cursor: not-allowed;\n }\n .mapboxgl-ctrl button:disabled .mapboxgl-ctrl-icon {\n opacity: 0.25;\n }\n .mapboxgl-ctrl-group button:first-of-type {\n border-radius: 4px 4px 0 0;\n }\n .mapboxgl-ctrl-group button:last-of-type {\n border-radius: 0 0 4px 4px;\n }\n .mapboxgl-ctrl-group button:only-of-type {\n border-radius: inherit;\n }\n .mapboxgl-ctrl button:not(:disabled):hover {\n background-color: rgb(0 0 0/5%);\n }\n .mapboxgl-ctrl-group button:focus:focus-visible {\n box-shadow: 0 0 2px 2px #0096ff;\n }\n .mapboxgl-ctrl-group button:focus:not(:focus-visible) {\n box-shadow: none;\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E\");\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E\");\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath id='south' d='M10.5 16l4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E\");\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath id='south' d='M10.5 16l4 8 4-8h-8z' fill='%23999'/%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath id='south' d='M10.5 16l4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23aaa'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' fill='%23f00'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e58978'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e54e33'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-waiting\n .mapboxgl-ctrl-icon {\n animation: mapboxgl-spin 2s linear infinite;\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23999'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' fill='%23f00'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e58978'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e54e33'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23000'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23666'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' fill='%23f00'/%3E%3C/svg%3E\");\n }\n }\n @keyframes mapboxgl-spin {\n 0% {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(1turn);\n }\n }\n a.mapboxgl-ctrl-logo {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='logo' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='text' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='clip'%3E%3Crect x='0' y='0' width='100%25' height='100%25' fill='white'/%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/mask%3E%3Cg id='outline' opacity='0.3' stroke='%23000' stroke-width='3'%3E%3Ccircle mask='url(%23clip)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23text' mask='url(%23clip)'/%3E%3C/g%3E%3Cg id='fill' opacity='0.9' fill='%23fff'%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/g%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n cursor: pointer;\n display: block;\n height: 23px;\n margin: 0 0 -4px -4px;\n overflow: hidden;\n width: 88px;\n }\n a.mapboxgl-ctrl-logo.mapboxgl-compact {\n width: 23px;\n }\n @media (-ms-high-contrast: active) {\n a.mapboxgl-ctrl-logo {\n background-color: transparent;\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='logo' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='text' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='clip'%3E%3Crect x='0' y='0' width='100%25' height='100%25' fill='white'/%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/mask%3E%3Cg id='outline' opacity='1' stroke='%23000' stroke-width='3'%3E%3Ccircle mask='url(%23clip)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23text' mask='url(%23clip)'/%3E%3C/g%3E%3Cg id='fill' opacity='1' fill='%23fff'%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/g%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n a.mapboxgl-ctrl-logo {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='logo' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='text' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='clip'%3E%3Crect x='0' y='0' width='100%25' height='100%25' fill='white'/%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/mask%3E%3Cg id='outline' opacity='1' stroke='%23fff' stroke-width='3' fill='%23fff'%3E%3Ccircle mask='url(%23clip)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23text' mask='url(%23clip)'/%3E%3C/g%3E%3Cg id='fill' opacity='1' fill='%23000'%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/g%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl.mapboxgl-ctrl-attrib {\n background-color: hsla(0, 0%, 100%, 0.5);\n margin: 0;\n padding: 0 5px;\n }\n @media screen {\n .mapboxgl-ctrl-attrib.mapboxgl-compact {\n background-color: #fff;\n border-radius: 12px;\n margin: 10px;\n min-height: 20px;\n padding: 2px 24px 2px 0;\n position: relative;\n }\n .mapboxgl-ctrl-attrib.mapboxgl-compact-show {\n padding: 2px 28px 2px 8px;\n visibility: visible;\n }\n .mapboxgl-ctrl-bottom-left > .mapboxgl-ctrl-attrib.mapboxgl-compact-show,\n .mapboxgl-ctrl-top-left > .mapboxgl-ctrl-attrib.mapboxgl-compact-show {\n border-radius: 12px;\n padding: 2px 8px 2px 28px;\n }\n .mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-inner {\n display: none;\n }\n .mapboxgl-ctrl-attrib-button {\n background-color: hsla(0, 0%, 100%, 0.5);\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E\");\n border: 0;\n border-radius: 12px;\n box-sizing: border-box;\n cursor: pointer;\n display: none;\n height: 24px;\n outline: none;\n position: absolute;\n right: 0;\n top: 0;\n width: 24px;\n }\n .mapboxgl-ctrl-bottom-left .mapboxgl-ctrl-attrib-button,\n .mapboxgl-ctrl-top-left .mapboxgl-ctrl-attrib-button {\n left: 0;\n }\n .mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-button,\n .mapboxgl-ctrl-attrib.mapboxgl-compact-show .mapboxgl-ctrl-attrib-inner {\n display: block;\n }\n .mapboxgl-ctrl-attrib.mapboxgl-compact-show .mapboxgl-ctrl-attrib-button {\n background-color: rgb(0 0 0/5%);\n }\n .mapboxgl-ctrl-bottom-right > .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n bottom: 0;\n right: 0;\n }\n .mapboxgl-ctrl-top-right > .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n right: 0;\n top: 0;\n }\n .mapboxgl-ctrl-top-left > .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n left: 0;\n top: 0;\n }\n .mapboxgl-ctrl-bottom-left > .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n bottom: 0;\n left: 0;\n }\n }\n @media screen and (-ms-high-contrast: active) {\n .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' fill='%23fff'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E\");\n }\n }\n @media screen and (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl-attrib a {\n color: rgba(0, 0, 0, 0.75);\n text-decoration: none;\n }\n .mapboxgl-ctrl-attrib a:hover {\n color: inherit;\n text-decoration: underline;\n }\n .mapboxgl-ctrl-attrib .mapbox-improve-map {\n font-weight: 700;\n margin-left: 2px;\n }\n .mapboxgl-attrib-empty {\n display: none;\n }\n .mapboxgl-ctrl-scale {\n background-color: hsla(0, 0%, 100%, 0.75);\n border: 2px solid #333;\n border-top: #333;\n box-sizing: border-box;\n color: #333;\n font-size: 10px;\n padding: 0 5px;\n white-space: nowrap;\n }\n .mapboxgl-popup {\n display: flex;\n left: 0;\n pointer-events: none;\n position: absolute;\n top: 0;\n will-change: transform;\n }\n .mapboxgl-popup-anchor-top,\n .mapboxgl-popup-anchor-top-left,\n .mapboxgl-popup-anchor-top-right {\n flex-direction: column;\n }\n .mapboxgl-popup-anchor-bottom,\n .mapboxgl-popup-anchor-bottom-left,\n .mapboxgl-popup-anchor-bottom-right {\n flex-direction: column-reverse;\n }\n .mapboxgl-popup-anchor-left {\n flex-direction: row;\n }\n .mapboxgl-popup-anchor-right {\n flex-direction: row-reverse;\n }\n .mapboxgl-popup-tip {\n border: 10px solid transparent;\n height: 0;\n width: 0;\n z-index: 1;\n }\n .mapboxgl-popup-anchor-top .mapboxgl-popup-tip {\n align-self: center;\n border-bottom-color: #fff;\n border-top: none;\n }\n .mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip {\n align-self: flex-start;\n border-bottom-color: #fff;\n border-left: none;\n border-top: none;\n }\n .mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip {\n align-self: flex-end;\n border-bottom-color: #fff;\n border-right: none;\n border-top: none;\n }\n .mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip {\n align-self: center;\n border-bottom: none;\n border-top-color: #fff;\n }\n .mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip {\n align-self: flex-start;\n border-bottom: none;\n border-left: none;\n border-top-color: #fff;\n }\n .mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip {\n align-self: flex-end;\n border-bottom: none;\n border-right: none;\n border-top-color: #fff;\n }\n .mapboxgl-popup-anchor-left .mapboxgl-popup-tip {\n align-self: center;\n border-left: none;\n border-right-color: #fff;\n }\n .mapboxgl-popup-anchor-right .mapboxgl-popup-tip {\n align-self: center;\n border-left-color: #fff;\n border-right: none;\n }\n .mapboxgl-popup-close-button {\n background-color: transparent;\n border: 0;\n border-radius: 0 3px 0 0;\n cursor: pointer;\n position: absolute;\n right: 0;\n top: 0;\n }\n .mapboxgl-popup-close-button:hover {\n background-color: rgb(0 0 0/5%);\n }\n .mapboxgl-popup-content {\n background: #fff;\n border-radius: 3px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n padding: 10px 10px 15px;\n pointer-events: auto;\n position: relative;\n }\n .mapboxgl-popup-anchor-top-left .mapboxgl-popup-content {\n border-top-left-radius: 0;\n }\n .mapboxgl-popup-anchor-top-right .mapboxgl-popup-content {\n border-top-right-radius: 0;\n }\n .mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content {\n border-bottom-left-radius: 0;\n }\n .mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content {\n border-bottom-right-radius: 0;\n }\n .mapboxgl-popup-track-pointer {\n display: none;\n }\n .mapboxgl-popup-track-pointer * {\n pointer-events: none;\n user-select: none;\n }\n .mapboxgl-map:hover .mapboxgl-popup-track-pointer {\n display: flex;\n }\n .mapboxgl-map:active .mapboxgl-popup-track-pointer {\n display: none;\n }\n .mapboxgl-marker {\n left: 0;\n opacity: 1;\n position: absolute;\n top: 0;\n transition: opacity 0.2s;\n will-change: transform;\n }\n .mapboxgl-user-location-dot,\n .mapboxgl-user-location-dot:before {\n background-color: #1da1f2;\n border-radius: 50%;\n height: 15px;\n width: 15px;\n }\n .mapboxgl-user-location-dot:before {\n animation: mapboxgl-user-location-dot-pulse 2s infinite;\n content: '';\n position: absolute;\n }\n .mapboxgl-user-location-dot:after {\n border: 2px solid #fff;\n border-radius: 50%;\n box-shadow: 0 0 3px rgba(0, 0, 0, 0.35);\n box-sizing: border-box;\n content: '';\n height: 19px;\n left: -2px;\n position: absolute;\n top: -2px;\n width: 19px;\n }\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading {\n height: 0;\n width: 0;\n }\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:after,\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:before {\n border-bottom: 7.5px solid #4aa1eb;\n content: '';\n position: absolute;\n }\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:before {\n border-left: 7.5px solid transparent;\n transform: translateY(-28px) skewY(-20deg);\n }\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:after {\n border-right: 7.5px solid transparent;\n transform: translate(7.5px, -28px) skewY(20deg);\n }\n @keyframes mapboxgl-user-location-dot-pulse {\n 0% {\n opacity: 1;\n transform: scale(1);\n }\n 70% {\n opacity: 0;\n transform: scale(3);\n }\n to {\n opacity: 0;\n transform: scale(1);\n }\n }\n .mapboxgl-user-location-dot-stale {\n background-color: #aaa;\n }\n .mapboxgl-user-location-dot-stale:after {\n display: none;\n }\n .mapboxgl-user-location-accuracy-circle {\n background-color: #1da1f233;\n border-radius: 100%;\n height: 1px;\n width: 1px;\n }\n .mapboxgl-crosshair,\n .mapboxgl-crosshair .mapboxgl-interactive,\n .mapboxgl-crosshair .mapboxgl-interactive:active {\n cursor: crosshair;\n }\n .mapboxgl-boxzoom {\n background: #fff;\n border: 2px dotted #202020;\n height: 0;\n left: 0;\n opacity: 0.5;\n position: absolute;\n top: 0;\n width: 0;\n }\n @media print {\n .mapbox-improve-map {\n display: none;\n }\n }\n .mapboxgl-scroll-zoom-blocker,\n .mapboxgl-touch-pan-blocker {\n align-items: center;\n background: rgba(0, 0, 0, 0.7);\n color: #fff;\n display: flex;\n font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,\n sans-serif;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n pointer-events: none;\n position: absolute;\n text-align: center;\n top: 0;\n transition: opacity 0.75s ease-in-out;\n transition-delay: 1s;\n width: 100%;\n }\n .mapboxgl-scroll-zoom-blocker-show,\n .mapboxgl-touch-pan-blocker-show {\n opacity: 1;\n transition: opacity 0.1s ease-in-out;\n }\n .mapboxgl-canvas-container.mapboxgl-touch-pan-blocker-override.mapboxgl-scrollable-page,\n .mapboxgl-canvas-container.mapboxgl-touch-pan-blocker-override.mapboxgl-scrollable-page\n .mapboxgl-canvas {\n touch-action: pan-x pan-y;\n }\n`;\n\nexport default mapboxStyle;\n","import { FeatureCollection } from 'geojson';\nimport fpmClient from '../fpmClient';\n\nconst getFpmProjectsByBbox = async (\n bbox: string,\n preview: boolean = false\n): Promise<FeatureCollection> => {\n const [west, south, east, north] = bbox.split(',').map(Number);\n const cache = preview ? false : undefined;\n\n const fpmResponse = await fpmClient.get<FeatureCollection>(\n '/public/projects',\n {\n params: {\n bbox: `${west},${south},${east},${north}`,\n },\n cache,\n }\n );\n\n return fpmResponse.data;\n};\n\nexport default getFpmProjectsByBbox;\n","import { FeatureCollection } from 'geojson';\nimport { IStrapiData, StrapiProject } from '..';\n\nconst mergeProjectData = (\n featureCollection: FeatureCollection,\n strapiProjects: Map<string, IStrapiData<StrapiProject>>\n): FeatureCollection => {\n // Add slug and portfolioHost to each feature's properties if we have Strapi data\n const mergedFeatureCollection = {\n ...featureCollection,\n features: featureCollection.features.map((feature) => {\n const fpmProjectId = feature.properties?.id;\n const strapiProject = fpmProjectId\n ? strapiProjects.get(fpmProjectId)\n : null;\n\n if (strapiProject) {\n feature.properties = {\n ...feature.properties,\n slug: strapiProject.attributes.slug || undefined,\n portfolioHost:\n strapiProject.attributes.portfolio?.data?.attributes.host ||\n undefined,\n };\n }\n\n return feature;\n }),\n };\n\n return mergedFeatureCollection;\n};\n\nexport default mergeProjectData;\n","import React, {\n useRef,\n useEffect,\n useState,\n useCallback,\n useContext,\n} from 'react';\nimport mapboxgl from 'mapbox-gl';\nimport {\n Box,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Wrapper,\n} from 'boemly';\nimport { MAPBOX_MAX_ZOOM, MAPBOX_TOKEN } from '../../constants/mapbox';\nimport { IntlContext } from '../../components/ContextProvider';\nimport mapboxStyle from './mapboxStyle';\nimport { FeatureCollection } from 'geojson';\nimport debounce from 'lodash/debounce';\nimport getFpmProjectsByBbox from '../../integrations/strapi/getFpmProjectsByBbox';\nimport getStrapiProjects from '../../integrations/strapi/getStrapiProjects';\nimport mergeProjectData from '../../utils/mergeProjectData';\nimport { CreditAvailability } from '../../models/fpm/FPMProject';\nimport { IStrapiData, StrapiProject } from '../..';\n\nconst projectPinImage =\n 'https://cdn.jsdelivr.net/npm/@phosphor-icons/core@2.0.2/assets/fill/map-pin-fill.svg';\n\nmapboxgl.accessToken = MAPBOX_TOKEN;\n\nexport interface ProjectsMapProps {\n slice: {\n tagline?: string;\n title?: string;\n text?: string;\n defaultCenterCoordinates?: { latitude: number; longitude: number };\n defaultZoomLevel?: number;\n };\n}\n\nconst FALLBACK_BBOX =\n '-1.9950830850086163,44.4464186384987,21.995083085002875,54.12644342419196';\n\nexport const ProjectsMap: React.FC<ProjectsMapProps> = ({\n slice,\n}: ProjectsMapProps) => {\n const { locale, formatMessage } = useContext(IntlContext);\n const mapContainer = useRef<HTMLDivElement>(null);\n const map = useRef<mapboxgl.Map | null>(null);\n const animationIntervalRef = useRef<NodeJS.Timeout | null>(null);\n const [featureCollection, setFeatureCollection] =\n useState<FeatureCollection | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const initialBboxRef = useRef<string | null>(null);\n const [isMapReady, setIsMapReady] = useState(false);\n const [strapiProjects, setStrapiProjects] = useState<Map<\n string,\n IStrapiData<StrapiProject>\n > | null>(null);\n\n const isBboxContained = useCallback(\n (innerBbox: string, outerBbox: string): boolean => {\n const [innerWest, innerSouth, innerEast, innerNorth] = innerBbox\n .split(',')\n .map(Number);\n const [outerWest, outerSouth, outerEast, outerNorth] = outerBbox\n .split(',')\n .map(Number);\n return (\n innerWest >= outerWest &&\n innerEast <= outerEast &&\n innerSouth >= outerSouth &&\n innerNorth <= outerNorth\n );\n },\n []\n );\n\n const fetchStrapiData = useCallback(async () => {\n if (strapiProjects) return; // If we already have Strapi data, don't fetch it again\n\n try {\n const data = await getStrapiProjects(locale, '2'); // pLevel = Population depth which is a param in the API request. 2 is enough to get the slug and the portfolioHost\n setStrapiProjects(data);\n } catch (error) {\n console.error('❌ Error fetching Strapi projects:', error);\n }\n }, [locale, strapiProjects]);\n\n const fetchProjectsData = useCallback(\n async (bbox: string) => {\n setIsLoading(true);\n try {\n const fpmData = await getFpmProjectsByBbox(bbox);\n\n // If we have Strapi data, merge it, otherwise show FPM data immediately\n const mergedData = strapiProjects\n ? mergeProjectData(fpmData, strapiProjects)\n : fpmData;\n\n setFeatureCollection(mergedData);\n } catch (error) {\n console.error('Error fetching projects:', error);\n } finally {\n setIsLoading(false);\n }\n },\n [strapiProjects]\n );\n\n const debouncedUpdateBbox = useCallback(\n debounce(() => {\n if (!map.current || !initialBboxRef.current) return;\n const bounds = map.current.getBounds();\n const newBbox = `${bounds.getWest()},${bounds.getSouth()},${bounds.getEast()},${bounds.getNorth()}`;\n if (!isBboxContained(newBbox, initialBboxRef.current)) {\n fetchProjectsData(newBbox);\n initialBboxRef.current = newBbox;\n }\n }, 500),\n [fetchProjectsData, isBboxContained]\n );\n\n const addProjectsLayer = useCallback(() => {\n if (!map.current || !featureCollection || !map.current.isStyleLoaded()) {\n return;\n }\n\n const filteredFeatureCollection = {\n ...featureCollection,\n features: featureCollection.features.filter(\n (feature) => feature.properties?.isPublic !== false\n ),\n };\n\n const source = map.current.getSource('projects') as mapboxgl.GeoJSONSource;\n\n if (!source) {\n map.current.addSource('projects', {\n type: 'geojson',\n data: filteredFeatureCollection,\n cluster: true,\n clusterMaxZoom: 14,\n clusterRadius: 50,\n });\n\n map.current.addLayer({\n id: 'clusters',\n type: 'circle',\n source: 'projects',\n filter: ['has', 'point_count'],\n paint: {\n 'circle-color': [\n 'step',\n ['get', 'point_count'],\n '#51bbd6',\n 2,\n '#2A3FBA',\n ],\n 'circle-radius': ['step', ['get', 'point_count'], 20, 10, 30, 30, 40],\n 'circle-radius-transition': { duration: 300 },\n 'circle-stroke-width': 5,\n 'circle-stroke-color': '#2A3FBA',\n 'circle-stroke-opacity': 0.4,\n },\n });\n\n if (animationIntervalRef.current) {\n clearInterval(animationIntervalRef.current);\n }\n animationIntervalRef.current = setInterval(() => {\n if (!map.current) return;\n const now = Date.now() / 1000;\n const pulseFactor = 1 + 0.05 * Math.sin((now * 2 * Math.PI) / 2.8);\n const expression = [\n 'step',\n ['get', 'point_count'],\n 20 * pulseFactor,\n 10,\n 30 * pulseFactor,\n 30,\n 40 * pulseFactor,\n ] as mapboxgl.ExpressionSpecification;\n map.current.setPaintProperty('clusters', 'circle-radius', expression);\n }, 50);\n\n map.current.addLayer({\n id: 'cluster-count',\n type: 'symbol',\n source: 'projects',\n filter: ['has', 'point_count'],\n layout: {\n 'text-field': '{point_count_abbreviated}',\n 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Bold'],\n 'text-size': 12,\n },\n paint: {\n 'text-color': '#fff',\n },\n });\n\n // Load SVG as PNG\n fetch(projectPinImage)\n .then((response) => response.text())\n .then((svgText) => {\n // Modify SVG color\n const modifiedSvg = svgText.replace(/fill=\"[^\"]*\"/, `fill=\"#2A3FBA\"`);\n const img = new Image();\n img.src = `data:image/svg+xml;base64,${btoa(modifiedSvg)}`;\n return new Promise<HTMLImageElement>((resolve, reject) => {\n img.onload = () => resolve(img);\n img.onerror = reject;\n });\n })\n .then((img) => {\n if (!map.current) return;\n const canvas = document.createElement('canvas');\n canvas.width = 80;\n canvas.height = 80;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n ctx.drawImage(img, 10, 10, 60, 60);\n const pngImg = new Image();\n pngImg.src = canvas.toDataURL('image/png');\n pngImg.onload = () => {\n map.current?.addImage('project-pin', pngImg, { pixelRatio: 2 });\n map.current?.addLayer({\n id: 'unclustered-point',\n type: 'symbol',\n source: 'projects',\n filter: ['!', ['has', 'point_count']],\n layout: {\n 'icon-image': 'project-pin',\n },\n });\n };\n })\n .catch((error) => {\n console.error('Error loading project pin image:', error);\n });\n\n const popup = new mapboxgl.Popup({\n closeButton: true,\n closeOnClick: false,\n className: 'custom-popup',\n offset: [0, -20],\n });\n\n const style = document.createElement('style');\n style.textContent = `\n .custom-popup .mapboxgl-popup-content {\n border-radius: 8px;\n padding: 12px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n background: white;\n color: #333;\n }\n .mapboxgl-popup {\n max-width: 300px !important;\n }\n .mapboxgl-popup-close-button {\n padding: 4px 8px;\n font-size: 16px;\n color: #666;\n }\n .mapboxgl-popup-close-button:hover {\n background: #f0f0f0;\n color: #333;\n }\n `;\n document.head.appendChild(style);\n\n map.current.on('click', 'unclustered-point', (e) => {\n if (!e.features || !e.features[0].properties) return;\n map.current!.getCanvas().style.cursor = 'pointer';\n\n const coordinates = (e.features[0].geometry as any).coordinates.slice();\n const {\n title,\n projectDeveloper,\n slug,\n portfolioHost,\n creditAvailability,\n } = e.features[0].properties;\n\n // Calculate if popup would go off screen at the top\n const point = map.current!.project(coordinates);\n const popupHeight = 150; // Approximate height of popup\n const offset: [number, number] =\n point.y - popupHeight - 20 < 0 ? [0, 20] : [0, -20];\n\n let developer = 'Unknown';\n try {\n const projectDeveloperRaw = projectDeveloper;\n if (projectDeveloperRaw) {\n developer =\n JSON.parse(projectDeveloperRaw as string)?.name ?? 'Unknown';\n }\n } catch {\n developer = 'Unknown';\n }\n\n const projectUrl =\n slug && portfolioHost ? `${portfolioHost}/portfolio/${slug}` : null;\n\n const getBadgeMessage = (status: string) => {\n switch (status) {\n case CreditAvailability.CREDITS_AVAILABLE:\n return formatMessage({\n id: 'components.creditsAvailableBadge.text.yes',\n });\n case CreditAvailability.NO_CREDITS_AVAILABLE:\n return formatMessage({\n id: 'components.creditsAvailableBadge.text.no',\n });\n case CreditAvailability.SOME_CREDITS_AVAILABLE:\n return formatMessage({\n id: 'components.creditsAvailableBadge.text.some',\n });\n case CreditAvailability.SOON_CREDITS_AVAILABLE:\n return formatMessage({\n id: 'components.creditsAvailableBadge.text.notYet',\n });\n default:\n return '';\n }\n };\n\n const getBadgeColor = (status: string) => {\n switch (status) {\n case CreditAvailability.CREDITS_AVAILABLE:\n return '#15803d';\n case CreditAvailability.NO_CREDITS_AVAILABLE:\n return '#b91c1c';\n case CreditAvailability.SOME_CREDITS_AVAILABLE:\n return '#ea580c';\n case CreditAvailability.SOON_CREDITS_AVAILABLE:\n return '#2563eb';\n default:\n return '#e0e7ff';\n }\n };\n\n const badgeColor = getBadgeColor(creditAvailability);\n const badgeMessage = getBadgeMessage(creditAvailability);\n\n const badge = projectUrl\n ? `<a href=\"${projectUrl}\" target=\"_blank\" rel=\"noopener\" style=\"text-decoration: none;\"><span style=\"display: inline-block; background: ${badgeColor}; color: white; font-weight: 600; border-radius: 4px; padding: 2px 8px; font-size: 12px; margin-bottom: 6px; cursor: pointer;\">${badgeMessage}</span></a>`\n : `<span style=\"display: inline-block; background: ${badgeColor}; color: white; font-weight: 600; border-radius: 4px; padding: 2px 8px; font-size: 12px; margin-bottom: 6px;\">${badgeMessage}</span>`;\n\n const button = projectUrl\n ? `<a href=\"${projectUrl}\" target=\"_blank\" rel=\"noopener\" style=\"display: inline-block; margin-top: 12px; padding: 4px 8px; border: 1px solid #e2e8f0; border-radius: 4px; background: #fff; font-size: 14px; font-weight: 700; text-decoration: none;\">Show more info</a>`\n : '';\n\n const description = `\n <div style=\"padding: 2px; padding-right: 16px; min-width: 180px; max-width: 260px;\">\n ${badge}\n <h3 style=\"font-size: 15px; font-weight: bold;\">${title}</h3>\n <p style=\"font-size: 15px; color: #64748b;\">${developer}</p>\n ${button}\n </div>\n `;\n\n while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) {\n coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360;\n }\n\n popup\n .setOffset(offset)\n .setLngLat(coordinates)\n .setHTML(description)\n .addTo(map.current!);\n });\n\n map.current.on('click', 'clusters', (e) => {\n const features = map.current?.queryRenderedFeatures(e.point, {\n layers: ['clusters'],\n });\n if (!features || !features[0].properties) return;\n\n const clusterId = features[0].properties.cluster_id;\n const projectSource = map.current?.getSource(\n 'projects'\n ) as mapboxgl.GeoJSONSource;\n\n projectSource.getClusterExpansionZoom(clusterId, (err, zoom) => {\n if (err || !map.current) return;\n const coordinates = (features[0].geometry as any).coordinates;\n map.current.easeTo({ center: coordinates, zoom });\n });\n });\n\n map.current.on('mouseenter', 'clusters', () => {\n if (map.current) map.current.getCanvas().style.cursor = 'pointer';\n });\n map.current.on('mouseleave', 'clusters', () => {\n if (map.current) map.current.getCanvas().style.cursor = '';\n });\n\n map.current.on('mouseenter', 'unclustered-point', () => {\n if (map.current) map.current.getCanvas().style.cursor = 'pointer';\n });\n map.current.on('mouseleave', 'unclustered-point', () => {\n if (map.current) map.current.getCanvas().style.cursor = '';\n });\n } else {\n source.setData(filteredFeatureCollection);\n }\n }, [featureCollection, locale, formatMessage]);\n\n useEffect(() => {\n if (map.current || !mapContainer.current) return;\n\n let initialCenter: [number, number];\n let initialZoom: number;\n\n if (slice.defaultCenterCoordinates && slice.defaultZoomLevel) {\n initialCenter = [\n slice.defaultCenterCoordinates.longitude,\n slice.defaultCenterCoordinates.latitude,\n ];\n initialZoom = slice.defaultZoomLevel;\n } else {\n // Always start with fallback view - don't wait for user location\n const bbox = initialBboxRef.current || FALLBACK_BBOX;\n const [west, south, east, north] = bbox.split(',').map(Number);\n const bounds = new mapboxgl.LngLatBounds([west, south], [east, north]);\n const center = bounds.getCenter();\n initialCenter = [center.lng, center.lat];\n initialZoom = 6;\n }\n\n map.current = new mapboxgl.Map({\n container: mapContainer.current,\n style: 'mapbox://styles/mapbox/streets-v12',\n center: initialCenter,\n zoom: initialZoom,\n maxZoom: MAPBOX_MAX_ZOOM,\n });\n\n map.current.addControl(new mapboxgl.NavigationControl(), 'top-right');\n\n map.current.on('load', () => {\n setIsMapReady(true);\n if (!(slice.defaultCenterCoordinates && slice.defaultZoomLevel)) {\n const bbox = initialBboxRef.current || FALLBACK_BBOX;\n const [west, south, east, north] = bbox.split(',').map(Number);\n const bounds = new mapboxgl.LngLatBounds([west, south], [east, north]);\n map.current?.fitBounds(bounds, { padding: 20 });\n }\n });\n\n map.current.on('moveend', () => {\n if (initialBboxRef.current) {\n debouncedUpdateBbox();\n }\n });\n\n return () => {\n debouncedUpdateBbox.cancel();\n if (animationIntervalRef.current) {\n clearInterval(animationIntervalRef.current);\n }\n map.current?.remove();\n map.current = null;\n };\n }, [\n slice.defaultCenterCoordinates,\n slice.defaultZoomLevel,\n debouncedUpdateBbox,\n ]);\n\n // Fetch Strapi data once on component mount\n useEffect(() => {\n fetchStrapiData();\n }, [fetchStrapiData]);\n\n // Handle re-merging data when Strapi data becomes available\n useEffect(() => {\n if (strapiProjects && featureCollection) {\n const mergedData = mergeProjectData(featureCollection, strapiProjects);\n setFeatureCollection(mergedData);\n }\n }, [strapiProjects]);\n\n // Request user location (non-blocking)\n useEffect(() => {\n if (slice.defaultCenterCoordinates && slice.defaultZoomLevel) {\n // Use provided default coordinates\n const { latitude, longitude } = slice.defaultCenterCoordinates;\n const buffer = 10;\n const bbox = `${longitude - buffer},${latitude - buffer},${\n longitude + buffer\n },${latitude + buffer}`;\n initialBboxRef.current = bbox;\n fetchProjectsData(bbox);\n } else if (navigator.geolocation) {\n // Set fallback immediately (non-blocking)\n initialBboxRef.current = FALLBACK_BBOX;\n fetchProjectsData(FALLBACK_BBOX);\n\n // Request user location asynchronously\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const userLoc = {\n lat: position.coords.latitude,\n lon: position.coords.longitude,\n };\n if (map.current) {\n map.current.easeTo({\n center: [userLoc.lon, userLoc.lat],\n zoom: 10,\n duration: 1500,\n });\n\n // Update bbox for this location\n const buffer = 1;\n const bbox = `${userLoc.lon - buffer},${userLoc.lat - buffer},${\n userLoc.lon + buffer\n },${userLoc.lat + buffer}`;\n initialBboxRef.current = bbox;\n fetchProjectsData(bbox);\n }\n },\n () => {\n // Permission denied or error - already have fallback data loaded\n // No need to re-fetch since we already loaded FALLBACK_BBOX data\n }\n );\n } else {\n // Geolocation not supported - use fallback\n initialBboxRef.current = FALLBACK_BBOX;\n fetchProjectsData(FALLBACK_BBOX);\n }\n }, [\n slice.defaultCenterCoordinates,\n slice.defaultZoomLevel,\n fetchProjectsData,\n ]);\n\n useEffect(() => {\n if (isMapReady && featureCollection && map.current?.isStyleLoaded()) {\n addProjectsLayer();\n }\n }, [isMapReady, featureCollection, addProjectsLayer]);\n\n return (\n <DefaultSectionContainer>\n <Box css={mapboxStyle}>\n <Wrapper>\n {slice.title ? (\n <>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n taglineProps={{ textAlign: 'center' }}\n titleProps={{\n textAlign: 'center',\n maxW: '6xl',\n marginX: 'auto',\n }}\n textProps={{\n textAlign: 'center',\n maxW: '3xl',\n marginX: 'auto',\n }}\n />\n <Box height=\"16\" />\n </>\n ) : (\n <></>\n )}\n <Box\n height=\"xl\"\n ref={mapContainer}\n borderRadius=\"xl\"\n overflow=\"hidden\"\n boxShadow={['md', null, null, 'none']}\n />\n <>{isLoading && <Box>Loading projects...</Box>}</>\n </Wrapper>\n </Box>\n </DefaultSectionContainer>\n );\n};\n\nexport default ProjectsMap;\n","import React, { useContext } from 'react';\nimport {\n Box,\n Container,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Flex,\n Gradient,\n Spacer,\n Wrapper,\n} from 'boemly';\nimport StrapiButtonWithVariant from '../../models/strapi/StrapiButtonWithVariant';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport Image from 'next/image';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport { CDN_URI } from '../../constants/api';\nimport { IntlContext } from '../../components/ContextProvider';\n\ntype Variant = 'gray' | 'green' | 'white';\n\nenum CtaCardType {\n Left = 'left',\n CenterWithoutImage = 'centerWithoutImage',\n CenterWithImage = 'centerWithImage',\n Right = 'right',\n}\n\nexport interface CtaProps {\n slice: {\n tagline?: string;\n title?: string;\n subTitle?: string;\n variant: Variant;\n ctaCards: CtaCard[];\n };\n}\n\nexport interface CtaCard {\n id: number;\n tagline?: string;\n title: string;\n subTitle?: string;\n image?: StrapiImage;\n buttons?: StrapiButtonWithVariant[];\n variant: Variant;\n backgroundShape: boolean;\n textAlign: 'left' | 'right' | 'center';\n}\n\nconst STATES: Record<CtaCardType, Record<string, any>> = {\n left: {\n textAlign: 'left',\n paddingTagline: '0',\n paddingTitle: '0',\n justifyContent: 'space-between',\n buttonJustifyContent: 'start',\n textMarginLeft: ['0', null, null, null, '14'],\n textMarginRight: '0',\n },\n centerWithoutImage: {\n textAlign: 'center',\n paddingTagline: '28',\n paddingTitle: '20',\n justifyContent: 'center',\n buttonJustifyContent: 'center',\n textMarginLeft: '0',\n textMarginRight: '0',\n },\n centerWithImage: {\n textAlign: 'center',\n paddingTagline: '28',\n paddingTitle: '20',\n justifyContent: 'center',\n buttonJustifyContent: 'center',\n textMarginLeft: '0',\n textMarginRight: '0',\n },\n right: {\n textAlign: 'left',\n paddingTagline: '0',\n paddingTitle: '0',\n justifyContent: 'start',\n buttonJustifyContent: 'start',\n textMarginLeft: '0',\n textMarginRight: ['0', null, null, null, '10'],\n },\n};\n\nconst VARIANTS: Record<Variant, Record<string, Record<CtaCardType, string>>> = {\n gray: {\n backgroundColor: {\n left: 'primary.50',\n centerWithoutImage: 'primary.50',\n centerWithImage: 'primary.50',\n right: 'primary.50',\n },\n taglineColor: {\n left: 'primary.500',\n centerWithoutImage: 'primary.500',\n centerWithImage: 'white',\n right: 'primary.500',\n },\n titleColor: {\n left: 'black',\n centerWithoutImage: 'black',\n centerWithImage: 'white',\n right: 'black',\n },\n subTitleColor: {\n left: 'black',\n centerWithoutImage: 'black',\n centerWithImage: 'white',\n right: 'black',\n },\n },\n green: {\n backgroundColor: {\n left: 'primary.800',\n centerWithoutImage: 'primary.800',\n centerWithImage: 'primary.800',\n right: 'primary.800',\n },\n taglineColor: {\n left: 'white',\n centerWithoutImage: 'white',\n centerWithImage: 'white',\n right: 'white',\n },\n titleColor: {\n left: 'white',\n centerWithoutImage: 'white',\n centerWithImage: 'white',\n right: 'white',\n },\n subTitleColor: {\n left: 'white',\n centerWithoutImage: 'white',\n centerWithImage: 'white',\n right: 'white',\n },\n },\n white: {\n backgroundColor: {\n left: 'white',\n centerWithoutImage: 'white',\n centerWithImage: 'primary.800',\n right: 'white',\n },\n taglineColor: {\n left: 'primary.500',\n centerWithoutImage: 'primary.500',\n centerWithImage: 'white',\n right: 'primary.500',\n },\n titleColor: {\n left: 'black',\n centerWithoutImage: 'black',\n centerWithImage: 'white',\n right: 'black',\n },\n subTitleColor: {\n left: 'black',\n centerWithoutImage: 'black',\n centerWithImage: 'white',\n right: 'black',\n },\n },\n};\n\nconst getTypeOfCard = (ctaCard: CtaCard): CtaCardType => {\n if (ctaCard.textAlign === 'center') {\n if (ctaCard.image) {\n return CtaCardType.CenterWithImage;\n }\n return CtaCardType.CenterWithoutImage;\n }\n if (ctaCard.textAlign === 'left') {\n return CtaCardType.Left;\n }\n return CtaCardType.Right;\n};\n\nexport const Cta: React.FC<CtaProps> = ({ slice }: CtaProps) => {\n const { formatMessage } = useContext(IntlContext);\n\n return (\n <DefaultSectionContainer\n backgroundColor={VARIANTS[slice.variant].backgroundColor.left}\n title={slice.title}\n >\n <Wrapper>\n {slice.title ? (\n <>\n <Flex alignItems=\"center\" flexDirection=\"column\">\n <DefaultSectionHeader\n tagline={slice.tagline}\n taglineProps={{\n color: VARIANTS[slice.variant].taglineColor.left,\n textAlign: 'center',\n maxWidth: '3xl',\n }}\n title={slice.title}\n titleProps={{\n color: VARIANTS[slice.variant].titleColor.left,\n textAlign: 'center',\n width: 'full',\n maxWidth: '3xl',\n }}\n text={slice.subTitle}\n textProps={{\n color: VARIANTS[slice.variant].subTitleColor.left,\n textAlign: 'center',\n maxWidth: '3xl',\n }}\n />\n </Flex>\n <Spacer height={['16', null, null, null, '20']} />\n </>\n ) : (\n <></>\n )}\n <Flex gap=\"4\" flexDirection=\"column\">\n {slice.ctaCards.map((ctaCard) => {\n const ctaCardType = getTypeOfCard(ctaCard);\n\n return (\n <Container\n backgroundColor={\n VARIANTS[ctaCard.variant].backgroundColor[ctaCardType]\n }\n key={ctaCard.id}\n position=\"relative\"\n elevation=\"none\"\n >\n {ctaCard.image &&\n ctaCardType === CtaCardType.CenterWithImage ? (\n <Box\n position=\"absolute\"\n left=\"0\"\n top=\"0\"\n width=\"full\"\n height=\"full\"\n borderRadius=\"xl\"\n overflow=\"hidden\"\n >\n <Image\n src={strapiMediaUrl(ctaCard.image.img, 'large')}\n alt={ctaCard.image.alt}\n fill\n style={{\n objectFit: ctaCard.image.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n <Gradient />\n </Box>\n ) : (\n <></>\n )}\n {ctaCard.backgroundShape ? (\n <Box\n position=\"absolute\"\n left=\"0\"\n top=\"0\"\n width=\"full\"\n height=\"full\"\n >\n <Image\n src={\n ctaCardType === CtaCardType.CenterWithImage ||\n ctaCard.variant === 'green'\n ? `${CDN_URI}/assets/v3/strapi-slices/shapes-dark.svg`\n : `${CDN_URI}/assets/v3/strapi-slices/shapes-light.svg`\n }\n alt={formatMessage({\n id: `sections.cta.backgroundShapes${\n ctaCardType === CtaCardType.CenterWithImage ||\n ctaCard.variant === 'green'\n ? 'Dark'\n : 'Light'\n }`,\n })}\n fill\n style={{\n objectFit: 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n ) : (\n <></>\n )}\n\n <Flex\n flexDir={['column', null, null, null, 'row']}\n flexGrow=\"1\"\n gap={['8', null, null, null, '16']}\n justifyContent={STATES[ctaCardType].justifyContent}\n >\n {ctaCard.image && ctaCardType === CtaCardType.Right ? (\n <Box\n position=\"relative\"\n height={['3xs', null, null, null, 'auto']}\n minWidth={[null, null, null, null, '50%']}\n >\n <Image\n src={strapiMediaUrl(ctaCard.image.img, 'xLarge')}\n alt={ctaCard.image.alt}\n fill\n style={{\n objectFit: ctaCard.image.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n ) : (\n <></>\n )}\n\n <Box\n zIndex=\"base\"\n marginLeft={STATES[ctaCardType].textMarginLeft}\n marginRight={STATES[ctaCardType].textMarginRight}\n maxWidth=\"3xl\"\n >\n <Spacer height={['0', null, null, null, '20']} />\n\n <DefaultSectionHeader\n tagline={ctaCard.tagline}\n taglineProps={{\n textAlign: STATES[ctaCardType].textAlign,\n color:\n VARIANTS[ctaCard.variant].taglineColor[ctaCardType],\n paddingX: [\n '0',\n null,\n null,\n null,\n STATES[ctaCardType].paddingTagline,\n ],\n }}\n title={ctaCard.title}\n titleProps={{\n fontFamily: 'heading',\n fontSize: '4xl',\n fontWeight: '600',\n lineHeight: '9',\n textAlign: STATES[ctaCardType].textAlign,\n paddingX: [\n '0',\n null,\n null,\n null,\n STATES[ctaCardType].paddingTitle,\n ],\n color:\n VARIANTS[ctaCard.variant].titleColor[ctaCardType],\n }}\n text={ctaCard.subTitle}\n textProps={{\n textAlign: STATES[ctaCardType].textAlign,\n color:\n VARIANTS[ctaCard.variant].subTitleColor[ctaCardType],\n }}\n />\n {ctaCard.buttons && ctaCard.buttons.length > 0 ? (\n <>\n <Spacer height=\"8\" />\n <Flex\n gap=\"2\"\n justifyContent={\n STATES[ctaCardType].buttonJustifyContent\n }\n >\n {ctaCard.buttons &&\n ctaCard.buttons.map((button) => (\n <StrapiLinkButton\n key={button.button.id}\n link={button.button}\n size=\"md\"\n variant={button.variant}\n component=\"Cta\"\n />\n ))}\n </Flex>\n </>\n ) : (\n <></>\n )}\n <Spacer height={['1', null, null, null, '20']} />\n </Box>\n {ctaCard.image && ctaCardType === CtaCardType.Left ? (\n <Box\n position=\"relative\"\n height={['3xs', null, null, null, 'auto']}\n minWidth={[null, null, null, null, '50%']}\n >\n <Image\n src={strapiMediaUrl(ctaCard.image.img, 'xLarge')}\n alt={ctaCard.image.alt}\n fill\n style={{\n objectFit: ctaCard.image.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n ) : (\n <></>\n )}\n </Flex>\n </Container>\n );\n })}\n </Flex>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React from 'react';\nimport { Box, DefaultSectionContainer, Wrapper } from 'boemly';\nimport { useMeasure } from 'react-use';\n\ninterface VideoSlice {\n youTubeID: string;\n title: string;\n}\n\nexport interface VideoProps {\n slice: VideoSlice;\n}\n\nexport const Video: React.FC<VideoProps> = ({ slice }: VideoProps) => {\n const [ref, { width }] = useMeasure<HTMLDivElement>();\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n <Box ref={ref} borderRadius=\"xl\">\n <iframe\n data-testid=\"video-iframe\"\n width={width}\n height={(width / 16) * 9}\n src={`https://www.youtube.com/embed/${slice.youTubeID}`}\n frameBorder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n title={slice.title}\n style={{ borderRadius: 'var(--boemly-radii-xl)' }}\n />\n </Box>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React from 'react';\nimport Image from 'next/image';\nimport {\n DefaultSectionContainer,\n Wrapper,\n AvatarWithName,\n Text,\n Box,\n} from 'boemly';\nimport StrapiAvatarWithName from '../../models/strapi/StrapiAvatarWithName';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\n\nexport interface FullWidthHighlightQuoteProps {\n slice: {\n tagline?: string;\n quote: string;\n avatarWithName: StrapiAvatarWithName;\n };\n}\n\nexport const FullWidthHighlightQuote: React.FC<\n FullWidthHighlightQuoteProps\n> = ({ slice }: FullWidthHighlightQuoteProps) => (\n <DefaultSectionContainer>\n <Wrapper>\n <Box maxWidth=\"5xl\" marginX=\"auto\" mb=\"8\">\n {slice.tagline && (\n <Text\n color=\"primary.700\"\n size=\"mdMonoUppercase\"\n textAlign=\"center\"\n mb=\"3\"\n >\n {slice.tagline}\n </Text>\n )}\n <Text color=\"black\" size=\"xlRegularNormalBold\" textAlign=\"center\">\n {slice.quote}\n </Text>\n </Box>\n <AvatarWithName\n name={slice.avatarWithName.name}\n description={slice.avatarWithName.description}\n image={\n <Image\n src={strapiMediaUrl(slice.avatarWithName.image.img, 'small')}\n alt={slice.avatarWithName.image.alt}\n fill\n style={{\n objectFit: slice.avatarWithName.image.objectFit || 'cover',\n }}\n />\n }\n orientation=\"vertical\"\n />\n </Wrapper>\n </DefaultSectionContainer>\n);\n","import { motion } from 'framer-motion';\nimport styled from '@emotion/styled';\nimport { BREAKPOINT_MD } from '../../constants/breakpoints';\nimport { Box } from 'boemly';\n\nexport const SliderContainer = styled(Box)`\n --mobile-image-width: calc(100vw - var(--boemly-space-24));\n --desktop-image-width: var(--boemly-sizes-md);\n\n width: var(--boemly-size-full);\n\n overflow-x: hidden;\n\n padding-left: max(\n var(--boemly-space-8),\n calc(50vw - var(--boemly-sizes-7xl) / 2 + var(--boemly-space-6))\n );\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n overflow-x: scroll;\n padding-left: max(\n var(--boemly-space-8),\n calc(50vw - var(--boemly-sizes-7xl) / 2 + var(--boemly-space-8))\n );\n }\n`;\n\ninterface SliderInnerContainerProps {\n imageCount: number;\n}\nexport const SliderInnerContainer = styled(\n motion.div\n)<SliderInnerContainerProps>`\n display: flex;\n gap: var(--boemly-space-6);\n\n width: fit-content;\n`;\n\nexport const ItemContainer = styled(Box)`\n width: var(--desktop-image-width);\n\n :last-of-type {\n margin-right: var(--boemly-space-8);\n }\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n width: var(--mobile-image-width);\n }\n`;\n\ninterface ImageContainerProps {\n aspectRatio: number;\n}\nexport const ImageContainer = styled(Box)<ImageContainerProps>`\n position: relative;\n\n max-height: var(--boemly-sizes-xl);\n height: calc(\n var(--desktop-image-width) /\n ${({ aspectRatio }: ImageContainerProps) => aspectRatio}\n );\n width: var(--desktop-image-width);\n\n border-radius: var(--boemly-radii-xl);\n\n & img {\n border-radius: var(--boemly-radii-xl);\n }\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n height: calc(\n var(--mobile-image-width) /\n ${({ aspectRatio }: ImageContainerProps) => aspectRatio}\n );\n width: var(--mobile-image-width);\n }\n`;\n","const ALLOWED_RATIOS = [2 / 3, 1 / 1, 3 / 2, 2 / 1, 3 / 1, 4 / 1, 5 / 1]; // width / height\n\nexport const getClosestRatio = (width: number, height: number): number => {\n const ratio = width / height;\n\n let minDiff = Math.abs(ratio - ALLOWED_RATIOS[0]);\n let posMinDiff = 0;\n\n ALLOWED_RATIOS.forEach((allowedRatio, index) => {\n if (Math.abs(ratio - allowedRatio) < minDiff) {\n minDiff = Math.abs(ratio - allowedRatio);\n posMinDiff = index;\n }\n });\n\n return ALLOWED_RATIOS[posMinDiff];\n};\n","import React, { useMemo, useRef, useState } from 'react';\nimport {\n Box,\n IconButton,\n DefaultSectionContainer,\n Flex,\n Text,\n useMediaQuery,\n} from 'boemly';\nimport Image from 'next/image';\nimport { useMeasure, useWindowSize } from 'react-use';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { ArrowLeft, ArrowRight } from '@phosphor-icons/react';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport FullScreenImage from '../../components/FullScreenImage';\nimport { BREAKPOINT_MD_QUERY } from '../../constants/breakpoints';\nimport {\n ItemContainer,\n SliderContainer,\n SliderInnerContainer,\n ImageContainer,\n} from './styles';\nimport { getClosestRatio } from '../../utils/getClosestRatio';\n\nexport interface FullWidthImageSliderProps {\n slice: {\n images: {\n id: number;\n caption: string;\n img: StrapiImage;\n }[];\n };\n}\n\nconst ITEM_GAP = 24;\nconst MAX_OFFSET_RIGHT = 162;\n\nexport const FullWidthImageSlider: React.FC<FullWidthImageSliderProps> = ({\n slice,\n}: FullWidthImageSliderProps) => {\n const containerRef = useRef(null);\n const [imageRef, { width: imageWidth }] = useMeasure<HTMLDivElement>();\n const { width: windowWidth } = useWindowSize();\n const [isMobile] = useMediaQuery(BREAKPOINT_MD_QUERY);\n\n const [sliderIndex, setSliderIndex] = useState(0);\n const [isOpen, setIsOpen] = useState(false);\n\n const numberOfItems = useMemo(\n () => slice.images.length,\n [slice.images.length]\n );\n\n const sliderItemsWidth = useMemo(\n () => numberOfItems * (imageWidth + ITEM_GAP) - ITEM_GAP,\n [imageWidth, numberOfItems]\n );\n\n const offsetLeft = useMemo(\n () => sliderIndex * (imageWidth + ITEM_GAP) * -1,\n [sliderIndex, imageWidth]\n );\n\n const allowScroll = useMemo(\n () => sliderItemsWidth + ITEM_GAP * 3 > windowWidth,\n\n [sliderItemsWidth, windowWidth]\n );\n\n const canMoveRight = useMemo(() => {\n const offsetRight = windowWidth - (sliderItemsWidth + offsetLeft);\n\n return offsetRight < MAX_OFFSET_RIGHT;\n }, [imageWidth, sliderIndex, sliderItemsWidth, windowWidth]);\n\n const canMoveLeft = useMemo(() => sliderIndex !== 0, [sliderIndex]);\n\n return (\n <DefaultSectionContainer>\n <SliderContainer ref={containerRef}>\n <SliderInnerContainer\n animate={{\n x: imageWidth * -sliderIndex,\n }}\n transition={{\n duration: 0.3,\n ease: 'easeInOut',\n }}\n imageCount={slice.images.length}\n >\n {slice.images.map((image, index) => (\n <ItemContainer key={image.id} ref={imageRef}>\n <Flex\n height=\"full\"\n width=\"full\"\n justifyContent=\"end\"\n flexDirection=\"column\"\n gap=\"2\"\n >\n <ImageContainer\n aspectRatio={getClosestRatio(\n image.img.img.data.attributes.width,\n image.img.img.data.attributes.height\n )}\n >\n <Image\n src={strapiMediaUrl(image.img.img, 'large')}\n alt={image.img.alt}\n fill\n style={{\n objectFit: image.img.objectFit || 'cover',\n cursor: isMobile ? 'unset' : 'pointer',\n }}\n onClick={() => {\n setSliderIndex(index);\n if (!isMobile) setIsOpen(true);\n }}\n />\n </ImageContainer>\n\n <Text noOfLines={3} height=\"72px\" fontSize=\"md\">\n {image.caption}\n </Text>\n </Flex>\n </ItemContainer>\n ))}\n </SliderInnerContainer>\n </SliderContainer>\n\n <Box\n display={['none', null, null, !!allowScroll ? 'flex' : 'none']}\n pointerEvents=\"none\"\n position=\"absolute\"\n top=\"calc(50% - var(--boemly-sizes-12))\"\n left=\"0\"\n width=\"full\"\n py=\"0\"\n px=\"32\"\n justifyContent=\"space-between\"\n >\n <Box>\n <AnimatePresence>\n {canMoveLeft && (\n <IconButton\n key=\"leftButton\"\n as={motion.button}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n size=\"lg\"\n variant=\"outline\"\n onClick={() => setSliderIndex(sliderIndex - 1)}\n aria-label=\"Move left\"\n icon={<ArrowLeft size={16} />}\n pointerEvents=\"auto\"\n />\n )}\n </AnimatePresence>\n </Box>\n <Box>\n <AnimatePresence>\n {canMoveRight && (\n <IconButton\n key=\"rightButton\"\n as={motion.button}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n size=\"lg\"\n variant=\"outline\"\n onClick={() => setSliderIndex(sliderIndex + 1)}\n aria-label=\"Move right\"\n icon={<ArrowRight size={16} />}\n pointerEvents=\"auto\"\n />\n )}\n </AnimatePresence>\n </Box>\n </Box>\n\n <FullScreenImage\n images={slice.images.map((image) => image.img)}\n currentIndex={sliderIndex}\n setCurrentIndex={setSliderIndex}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n />\n </DefaultSectionContainer>\n );\n};\n","import React from 'react';\nimport {\n Box,\n DefaultSectionContainer,\n Grid,\n GridItem,\n SimpleGrid,\n Text,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\n\nexport interface SideBySideImagesProps {\n slice: {\n images: {\n id: number;\n caption: string;\n img: StrapiImage;\n }[];\n };\n}\nexport const SideBySideImages: React.FC<SideBySideImagesProps> = ({\n slice,\n}: SideBySideImagesProps) => (\n <DefaultSectionContainer>\n <Wrapper>\n <Grid templateColumns=\"repeat(12, 1fr)\" gap=\"4\">\n <GridItem colSpan={[12, null, null, 7]}>\n <SimpleGrid\n columns={[1, null, null, 2]}\n gap={['12', null, null, '6']}\n >\n {slice.images.map((image) => (\n <Box key={image.id}>\n <Box height=\"md\" position=\"relative\" borderRadius=\"xl\">\n <Image\n src={strapiMediaUrl(image.img.img, 'large')}\n alt={image.img.alt}\n fill\n style={{\n objectFit: image.img.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n <Text mt=\"3\" size=\"xsLowNormal\">\n {image.caption}\n </Text>\n </Box>\n ))}\n </SimpleGrid>\n </GridItem>\n </Grid>\n </Wrapper>\n </DefaultSectionContainer>\n);\n","import Locale from '../Locale';\nimport StrapiImage from './StrapiImage';\nimport StrapiLink from './StrapiLink';\nimport StrapiLocalization from './StrapiLocalization';\nimport StrapiTopBanner from './StrapiTopBanner';\n\nexport enum EventType {\n CONFERENCE = 'Conference',\n MEET_UP = 'Meet Up',\n WEBINAR = 'Webinar',\n FOREST_WALK = 'Forest Walk',\n LUNCH_AND_LEARN = 'Lunch & Learn',\n FESTIVAL = 'Festival',\n ROADSHOW = 'RoadShow',\n PARTNER_EVENT = 'Partner Event',\n FAIR = 'Fair',\n}\n\ninterface StrapiEvent {\n title: string;\n description: string;\n button?: StrapiLink;\n buttonVariant?: 'outline' | 'ghost' | 'link' | 'solid' | 'outlineWhite';\n recommended?: boolean;\n speakers?: {\n id: number;\n name: string;\n image: StrapiImage;\n }[];\n image: StrapiImage;\n logo: StrapiImage;\n eventTypes: {\n id: number;\n eventType: EventType;\n }[];\n languages: {\n id: number;\n language: string;\n countryCode: string;\n }[];\n location?: string;\n locale: Locale;\n online?: boolean;\n start: Date;\n end?: Date;\n allDay?: boolean;\n slices: any[];\n localizations: StrapiLocalization[];\n topBanner?: StrapiTopBanner;\n}\n\nexport default StrapiEvent;\n","import React from 'react';\nimport { Box, Wrapper } from 'boemly';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport StrapiLink from '../../models/strapi/StrapiLink';\n\nexport interface CtaOnlyProps {\n slice: {\n button: StrapiLink;\n };\n}\n\nexport const CtaOnly: React.FC<CtaOnlyProps> = ({ slice }: CtaOnlyProps) => (\n <Wrapper>\n <Box position=\"absolute\" top=\"-28\" transform=\"translateY(50%)\">\n <StrapiLinkButton size=\"md\" link={slice.button} component=\"CtaOnly\" />\n </Box>\n </Wrapper>\n);\n","import React, { useContext, useState } from 'react';\nimport {\n DefaultSectionContainer,\n Divider,\n Flex,\n GridItem,\n Heading,\n IconButton,\n SimpleGrid,\n Text,\n Wrapper,\n} from 'boemly';\nimport { Check, Link as LinkIcon } from '@phosphor-icons/react';\nimport { useCopyToClipboard } from 'react-use';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport StrapiGlossaryItem from '../../models/strapi/StrapiGlossaryItem';\nimport { IntlContext } from '../../components/ContextProvider';\n\nexport interface GlossaryProps {\n slice: {\n glossary_items: IStrapiData<StrapiGlossaryItem>[];\n };\n}\n\nexport const Glossary: React.FC<GlossaryProps> = ({ slice }: GlossaryProps) => {\n const [, copyToClipboard] = useCopyToClipboard();\n const { formatMessage } = useContext(IntlContext);\n const grouped: Record<string, StrapiGlossaryItem[]> = {};\n const [copiedItem, setCopiedItem] = useState<string>();\n\n slice.glossary_items\n .sort((a, b) => a.attributes.title.localeCompare(b.attributes.title))\n .forEach((curr) => {\n const index = curr.attributes.title.at(0)?.toUpperCase() || 'A';\n if (!grouped[index]) {\n grouped[index] = [];\n }\n grouped[index].push(curr.attributes);\n }, {});\n\n const handleAnchorClick = async (slug: string) => {\n if (window?.location) {\n const currentUrl = window.location.href.split('#')[0];\n copyToClipboard(`${currentUrl}#${slug}`);\n setCopiedItem(slug);\n\n setTimeout(() => {\n setCopiedItem(undefined);\n }, 1200);\n }\n };\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n <SimpleGrid>\n {Object.entries(grouped).map(([letter, items], index) => (\n <GridItem maxW=\"xl\" placeSelf=\"center\" key={letter}>\n <Heading size=\"3xl\" mb=\"8\">\n {letter}\n </Heading>\n\n <SimpleGrid spacing=\"6\">\n {items.map((item) => (\n <GridItem key={item.slug}>\n <Flex mb=\"2\" gap=\"1.5\" alignItems=\"center\">\n <Heading\n wordBreak=\"break-word\"\n size=\"xl\"\n id={item.slug}\n scrollMarginTop=\"calc(var(--header-height) + var(--boemly-sizes-10))\"\n >\n {item.title}\n </Heading>\n <IconButton\n variant=\"ghost\"\n size=\"xs\"\n icon={\n copiedItem === item.slug ? (\n <Check size=\"16\" data-testid=\"check-icon\" />\n ) : (\n <LinkIcon size=\"16\" />\n )\n }\n title={formatMessage({\n id: 'sections.glossary.copyButtonLabel',\n })}\n aria-label={formatMessage({\n id: 'sections.glossary.copyButtonLabel',\n })}\n onClick={async () => handleAnchorClick(item.slug)}\n />\n </Flex>\n <Text color=\"black\" wordBreak=\"break-word\">\n {item.text}\n </Text>\n </GridItem>\n ))}\n </SimpleGrid>\n\n {index !== Object.keys(grouped).length - 1 && (\n <Divider maxW=\"xl\" placeSelf=\"center\" mb=\"10\" mt=\"10\" />\n )}\n </GridItem>\n ))}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React, { useContext, useCallback } from 'react';\nimport {\n Badge,\n BoemlyFormControl,\n Box,\n Button,\n Container,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Divider,\n Flex,\n InputRightAddon,\n LabelNumberPair,\n RichText,\n SimpleGrid,\n Spacer,\n useToken,\n Wrapper,\n} from 'boemly';\nimport { Field, FieldProps, Form, Formik, FormikProps } from 'formik';\nimport { FPM_API_URI } from '../../constants/api';\nimport CheckoutForm from '../../models/forms/CheckoutForm';\nimport {\n MAXIMUM_CONTRIBUTION_VALUE_IN_MONEY,\n MINIMUM_CONTRIBUTION_VALUE_IN_MONEY,\n} from '../../constants/domain';\nimport { IntlContext } from '../../components/ContextProvider';\nimport { useRouter } from 'next/router';\n\nexport interface ShopCheckoutProps {\n slice: {\n tagline?: string;\n title: string;\n text?: string;\n badge?: string;\n batchId: string;\n pricePerKg: number;\n couponId?: string;\n initialContributionValue: number;\n checkoutText: string;\n currency: 'EUR' | 'CHF';\n taxInPercent?: number;\n };\n}\n\nexport const ShopCheckout = ({ slice }: ShopCheckoutProps): JSX.Element => {\n const [primary50] = useToken('colors', ['primary.50']);\n const { formatMessage, formatNumber, locale } = useContext(IntlContext);\n const { push } = useRouter();\n\n const validateForm = useCallback(\n (values: CheckoutForm) => {\n const errors: Partial<{ contributionValue: string }> = {};\n\n if (!values.contributionValue) {\n errors.contributionValue = formatMessage({\n id: 'sections.shopCheckout.contributionValue.validation.empty',\n });\n } else if (\n values.contributionValue < MINIMUM_CONTRIBUTION_VALUE_IN_MONEY\n ) {\n errors.contributionValue = formatMessage({\n id: `sections.shopCheckout.contributionValue.validation.tooLow.${slice.currency}`,\n });\n } else if (\n values.contributionValue > MAXIMUM_CONTRIBUTION_VALUE_IN_MONEY\n ) {\n errors.contributionValue = formatMessage({\n id: 'sections.shopCheckout.contributionValue.validation.tooHigh',\n });\n }\n\n return errors;\n },\n [locale]\n );\n\n const onSubmit = ({ contributionValue }: CheckoutForm) => {\n const checkoutURL = new URL(`${FPM_API_URI}/v1/webhooks/shop/checkout`);\n const currentURL = new URL(window.location.href);\n\n checkoutURL.searchParams.append('batchId', slice.batchId);\n\n checkoutURL.searchParams.append(\n 'quantity',\n Math.floor(contributionValue / slice.pricePerKg).toString()\n );\n\n checkoutURL.searchParams.append('cancelPath', currentURL.pathname);\n\n if (slice.couponId)\n checkoutURL.searchParams.append('couponId', slice.couponId);\n\n push(checkoutURL.toString());\n };\n\n return (\n <DefaultSectionContainer backgroundColor={primary50} title={slice.title}>\n <Wrapper>\n <Flex\n flexDir={['column', null, null, null, 'row']}\n justifyContent=\"space-between\"\n alignItems={['left', null, null, null, 'center']}\n >\n <Box marginRight={['0', null, null, null, '36']} flexShrink={2}>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n />\n </Box>\n <Container maxWidth=\"md\" padding=\"lg\" shadow=\"lg\">\n {slice.badge ? (\n <>\n <Badge\n colorScheme=\"green\"\n textTransform=\"none\"\n whiteSpace=\"unset\"\n >\n {slice.badge}\n </Badge>\n <Spacer height=\"3\" />\n </>\n ) : (\n <></>\n )}\n\n <RichText\n content={slice.checkoutText}\n textProps={{ color: 'gray.500' }}\n />\n\n <Spacer height=\"6\" />\n <Divider />\n <Spacer height=\"6\" />\n\n <LabelNumberPair\n label={formatMessage({ id: 'sections.shopCheckout.intro.price' })}\n number={`${formatNumber(slice.pricePerKg * 100, {\n style: 'currency',\n currency: slice.currency,\n })}/${formatNumber(100, {\n style: 'unit',\n unit: 'kilogram',\n })} CO₂`}\n caption={formatMessage({\n id: 'sections.shopCheckout.summary.price.taxNotIncluded',\n })}\n />\n\n <Spacer height=\"6\" />\n <Divider />\n <Spacer height=\"6\" />\n\n <Formik\n initialValues={{\n contributionValue: slice.initialContributionValue,\n }}\n validate={validateForm}\n onSubmit={onSubmit}\n >\n {({\n errors,\n touched,\n handleSubmit,\n values,\n }: FormikProps<CheckoutForm>) => {\n const summaryPrice =\n Math.floor(values.contributionValue / slice.pricePerKg) *\n slice.pricePerKg;\n\n return (\n <Form onSubmit={handleSubmit}>\n <Box width=\"full\">\n <Field name=\"contributionValue\">\n {({ field }: FieldProps) => (\n <BoemlyFormControl\n id=\"contributionValue\"\n size=\"md\"\n inputProps={{ type: 'number', ...field }}\n label={formatMessage({\n id: `sections.shopCheckout.contributionValue.label.${slice.currency}`,\n })}\n rightAddonsOrElements={[\n <InputRightAddon key=\"1\">\n {formatMessage({\n id: `sections.shopCheckout.contributionValue.unit.${slice.currency}`,\n })}\n </InputRightAddon>,\n ]}\n isInvalid={\n !!errors.contributionValue &&\n touched.contributionValue\n }\n errorMessage={errors.contributionValue}\n />\n )}\n </Field>\n </Box>\n\n <Spacer height=\"6\" />\n\n <SimpleGrid columns={2} gap=\"4\">\n <LabelNumberPair\n label={formatMessage({\n id: 'sections.shopCheckout.summary.kg',\n })}\n number={`${formatNumber(\n Math.floor(\n values.contributionValue / slice.pricePerKg\n ),\n {\n style: 'unit',\n unit: 'kilogram',\n maximumFractionDigits: 0,\n }\n )} CO₂`}\n />\n <LabelNumberPair\n label={formatMessage({\n id: 'sections.shopCheckout.summary.price',\n })}\n number={formatNumber(summaryPrice, {\n style: 'currency',\n currency: slice.currency,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}\n caption={\n slice.taxInPercent &&\n slice.taxInPercent > 0 &&\n summaryPrice > 0\n ? formatMessage(\n {\n id: 'sections.shopCheckout.summary.price.taxIncluded',\n },\n {\n number: formatNumber(\n summaryPrice +\n summaryPrice * (slice.taxInPercent / 100),\n {\n style: 'currency',\n currency: slice.currency,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }\n ),\n }\n )\n : ''\n }\n />\n </SimpleGrid>\n\n <Spacer height=\"6\" />\n\n <Button type=\"submit\" width=\"full\">\n {formatMessage({ id: 'sections.shopCheckout.submit' })}\n </Button>\n </Form>\n );\n }}\n </Formik>\n </Container>\n </Flex>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","export const MINIMUM_CONTRIBUTION_VALUE_IN_MONEY = 10;\n\nexport const MAXIMUM_CONTRIBUTION_VALUE_IN_MONEY = 10_000;\n","import React from 'react';\nimport {\n DefaultSectionContainer,\n DefaultSectionHeader,\n Flex,\n Heading,\n Spacer,\n Text,\n} from 'boemly';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport StrapiLink from '../../models/strapi/StrapiLink';\n\nexport interface FactsProps {\n slice: {\n tagline?: string;\n title?: string;\n subTitle?: string;\n button?: StrapiLink;\n variant: 'gray' | 'green' | 'white';\n facts: { key: string; value: string }[];\n };\n}\n\nconst VARIANTS = {\n gray: {\n backgroundColor: 'primary.50',\n tagLineColor: 'primary.500',\n titleColor: 'black',\n subTitleColor: 'black',\n factKeyColor: 'gray.700',\n factValueColor: 'gray.700',\n },\n green: {\n backgroundColor: 'primary.800',\n tagLineColor: 'white',\n titleColor: 'white',\n subTitleColor: 'white',\n factKeyColor: 'whiteAlpha.900',\n factValueColor: 'white',\n },\n white: {\n backgroundColor: 'white',\n tagLineColor: 'primary.500',\n titleColor: 'black',\n subTitleColor: 'black',\n factKeyColor: 'gray.700',\n factValueColor: 'gray.700',\n },\n};\n\nexport const Facts: React.FC<FactsProps> = ({ slice }: FactsProps) => (\n <DefaultSectionContainer\n backgroundColor={VARIANTS[slice.variant].backgroundColor}\n flexDir=\"column\"\n textAlign=\"center\"\n justifyContent=\"space-between\"\n paddingX={['6', null, '8']}\n title={slice.title}\n >\n <>\n {slice.title && (\n <>\n <DefaultSectionHeader\n tagline={slice.tagline}\n text={slice.subTitle}\n title={slice.title}\n taglineProps={{\n color: VARIANTS[slice.variant].tagLineColor,\n textAlign: 'center',\n }}\n titleProps={{\n color: VARIANTS[slice.variant].titleColor,\n textAlign: 'center',\n maxW: '6xl',\n marginX: 'auto',\n }}\n textProps={{\n color: VARIANTS[slice.variant].subTitleColor,\n textAlign: 'center',\n maxW: '3xl',\n marginX: 'auto',\n }}\n />\n <Spacer height={['0', null, '12']} />\n </>\n )}\n <Flex\n justifyContent={slice.facts.length < 3 ? 'center' : 'flex-start'}\n alignItems=\"center\"\n flexWrap=\"wrap\"\n mx={[null, null, null, '22', '28']}\n flexDir={['column', null, null, 'row']}\n gap={[null, null, null, '12']}\n >\n {slice.facts.map((fact) => (\n <Flex\n key={fact.key}\n flexDir=\"column\"\n width={[\n 'var(--boemly-sizes-full)',\n null,\n null,\n 'calc((var(--boemly-sizes-full) - var(--boemly-space-24))/ 3 )',\n ]}\n mt={['8', '8', '8', slice.facts.length > 3 ? '16' : '0']}\n >\n <Heading\n fontSize=\"6xl\"\n fontFamily=\"display\"\n lineHeight=\"10\"\n fontWeight=\"700\"\n color={VARIANTS[slice.variant].factValueColor}\n mb=\"2\"\n as=\"p\"\n >\n {fact.value}\n </Heading>\n\n <Text\n size=\"mdLowNormal\"\n color={VARIANTS[slice.variant].factKeyColor}\n >\n {fact.key}\n </Text>\n </Flex>\n ))}\n </Flex>\n\n {slice.button && (\n <>\n <Spacer height={['0', null, '20']} />\n <StrapiLinkButton\n link={slice.button}\n size=\"md\"\n variant={slice.variant === 'green' ? 'outline' : 'solid'}\n component=\"Facts\"\n />\n </>\n )}\n </>\n </DefaultSectionContainer>\n);\n","import React, { useContext, useMemo } from 'react';\nimport {\n Text,\n Heading,\n Spacer,\n DatePersonPair,\n DefaultSectionHeader,\n DefaultSectionContainer,\n Wrapper,\n SimpleGrid,\n Box,\n Flex,\n useMediaQuery,\n useToken,\n} from 'boemly';\nimport Image from 'next/image';\nimport Link from 'next/link';\nimport { CaretRight } from '@phosphor-icons/react';\nimport StrapiBlogPost from '../../models/strapi/StrapiBlogPost';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiCategory from '../../models/strapi/StrapiCategory';\nimport IStrapi from '../../models/strapi/IStrapi';\nimport { BREAKPOINT_LG_QUERY } from '../../constants/breakpoints';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport { BlogItemContainer, ImageContainer } from '../Blog/styles';\nimport { IntlContext } from '../../components/ContextProvider';\n\nexport interface BlogCardsProps {\n slice: {\n tagline: string;\n title: string;\n subTitle: string;\n button?: StrapiLink;\n variant: 'white' | 'gray';\n blogPostCategory: IStrapi<IStrapiData<StrapiCategory> | null>;\n };\n blogPosts: IStrapiData<StrapiBlogPost>[];\n}\n\nconst VARIANTS = {\n white: {\n backgroundColor: 'white',\n },\n gray: {\n backgroundColor: 'primary.50',\n },\n};\n\nconst sortByCreatedAt = (\n a: IStrapiData<StrapiBlogPost>,\n b: IStrapiData<StrapiBlogPost>\n): number =>\n new Date(b.attributes.createdAt).getTime() -\n new Date(a.attributes.createdAt).getTime();\n\nexport const BlogCards: React.FC<BlogCardsProps> = ({\n slice,\n blogPosts,\n}: BlogCardsProps) => {\n const { formatDate } = useContext(IntlContext);\n const [mobile] = useMediaQuery(BREAKPOINT_LG_QUERY);\n const [gray700] = useToken('colors', ['gray.700']);\n\n const sortedBlogPosts = useMemo(\n () => blogPosts.sort(sortByCreatedAt),\n [blogPosts]\n );\n\n const blogPostsToDisplay = useMemo(\n () =>\n slice.blogPostCategory?.data?.attributes.name\n ? sortedBlogPosts\n .filter(\n (blogPost) =>\n blogPost.attributes.category.data?.attributes.name ===\n slice.blogPostCategory?.data?.attributes.name\n )\n .slice(0, 3)\n : sortedBlogPosts.slice(0, 3),\n [sortedBlogPosts, slice]\n );\n\n return (\n <DefaultSectionContainer\n backgroundColor={VARIANTS[slice.variant].backgroundColor}\n title={slice.title}\n >\n <Wrapper>\n {mobile || !slice.button ? (\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.subTitle}\n titleProps={{ maxW: '2xl' }}\n textProps={{ maxW: '2xl' }}\n />\n ) : (\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap=\"60\">\n <Box>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.subTitle}\n />\n </Box>\n <Box minWidth=\"40\">\n <StrapiLinkButton\n link={slice.button}\n size=\"lg\"\n variant=\"outline\"\n rightIcon={<CaretRight color={gray700} />}\n component=\"BlogCards\"\n />\n </Box>\n </Flex>\n )}\n <Spacer height=\"14\" />\n <SimpleGrid\n columns={[1, null, null, 3]}\n spacingX={4}\n spacingY={24}\n flexShrink=\"0\"\n >\n {blogPostsToDisplay.map((blogPost) => (\n <BlogItemContainer\n as={Link}\n href={`/blog/${blogPost.attributes.slug}`}\n data-testid=\"blog-item\"\n key={blogPost.attributes.slug}\n >\n <ImageContainer>\n <Image\n src={strapiMediaUrl(blogPost.attributes.img.img, 'medium')}\n alt={blogPost.attributes.img.alt}\n fill\n style={{\n objectFit: blogPost.attributes.img.objectFit || 'cover',\n }}\n />\n </ImageContainer>\n <Box px=\"2\" py=\"8\">\n {blogPost.attributes.category && (\n <Text size=\"smMonoUppercase\" color=\"primary.800\" mb=\"2\">\n {blogPost.attributes.category.data?.attributes.name}\n </Text>\n )}\n <Heading size=\"lg\">{blogPost.attributes.title}</Heading>\n {blogPost.attributes.teaser && (\n <Text size=\"mdRegularNormal\" mt=\"2\">\n {blogPost.attributes.teaser}\n </Text>\n )}\n\n <Spacer height=\"4\" />\n\n <DatePersonPair\n date={formatDate(blogPost.attributes.createdAt)}\n person={\n blogPost.attributes.author.data\n ? {\n name: blogPost.attributes.author.data.attributes.name,\n image: (\n <Image\n src={strapiMediaUrl(\n blogPost.attributes.author.data.attributes.img\n .img,\n 'thumbnail'\n )}\n alt={\n blogPost.attributes.author.data.attributes.img\n .alt\n }\n fill\n style={{\n objectFit:\n blogPost.attributes.author.data.attributes.img\n .objectFit || 'cover',\n }}\n />\n ),\n }\n : undefined\n }\n />\n </Box>\n </BlogItemContainer>\n ))}\n </SimpleGrid>\n <>\n {mobile && slice.button && (\n <>\n <Box minWidth=\"40\" mt=\"6\">\n <StrapiLinkButton\n link={slice.button}\n size=\"lg\"\n variant=\"outline\"\n rightIcon={<CaretRight color={gray700} />}\n component=\"BlogCards\"\n />\n </Box>\n </>\n )}\n </>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React, { useCallback, useContext } from 'react';\nimport {\n BoemlyFormControl,\n Box,\n Button,\n Divider,\n Flex,\n InputRightAddon,\n Spacer,\n Text,\n} from 'boemly';\nimport {\n Field,\n FieldProps,\n Form,\n Formik,\n FormikErrors,\n FormikProps,\n} from 'formik';\nimport { useRouter } from 'next/router';\nimport Image from 'next/image';\nimport { StrapiLink } from '../../..';\nimport { IntlContext } from '../../ContextProvider';\nimport {\n MAXIMUM_CONTRIBUTION_VALUE_IN_MONEY,\n MINIMUM_CONTRIBUTION_VALUE_IN_MONEY,\n} from '../../../constants/domain';\nimport { CDN_URI, FPM_API_URI } from '../../../constants/api';\nimport StrapiLinkButton from '../../StrapiLinkButton';\nimport SmallCheckoutForm from '../../../models/forms/SmallCheckoutForm';\n\nconst calculateTaxIncludedValue = (\n values: SmallCheckoutForm,\n taxInPercent: number\n) => {\n const value = parseInt(values.contributionValueCurrency);\n\n if (isNaN(value)) return 0;\n\n return value + value * (taxInPercent / 100);\n};\n\nexport interface SmallCheckoutProps {\n batchId: string;\n pricePerKg: number;\n initialContributionValue: number;\n taxInPercent?: number;\n checkoutText?: string;\n currency: 'EUR' | 'CHF';\n\n title?: string;\n subtitle?: string;\n button?: StrapiLink;\n}\n\nconst SmallCheckout = ({\n pricePerKg,\n currency,\n batchId,\n initialContributionValue,\n taxInPercent,\n checkoutText,\n title,\n subtitle,\n button,\n}: SmallCheckoutProps) => {\n const { formatNumber, formatMessage, locale } = useContext(IntlContext);\n const { push } = useRouter();\n\n const validateForm = useCallback(\n (values: SmallCheckoutForm) => {\n const errors: FormikErrors<SmallCheckoutForm> = {};\n const value = parseInt(values.contributionValueCurrency);\n if (!values.contributionValueCurrency || isNaN(value)) {\n errors.contributionValueCurrency = formatMessage({\n id: 'portfolio.smallCheckout.contributionValueCurrency.validation.empty',\n });\n } else if (value < MINIMUM_CONTRIBUTION_VALUE_IN_MONEY) {\n errors.contributionValueCurrency = formatMessage({\n id: `portfolio.smallCheckout.contributionValueCurrency.validation.tooLow.${currency}`,\n });\n } else if (value > MAXIMUM_CONTRIBUTION_VALUE_IN_MONEY) {\n errors.contributionValueCurrency = formatMessage({\n id: 'portfolio.smallCheckout.contributionValueCurrency.validation.tooHigh',\n });\n }\n\n return errors;\n },\n [currency, locale]\n );\n\n const onSubmit = async ({ contributionValueCurrency }: SmallCheckoutForm) => {\n const checkoutURL = new URL(`${FPM_API_URI}/v1/webhooks/shop/checkout`);\n const currentURL = new URL(window.location.href);\n\n checkoutURL.searchParams.append('batchId', batchId);\n\n checkoutURL.searchParams.append(\n 'quantity',\n Math.floor(parseInt(contributionValueCurrency) / pricePerKg).toString()\n );\n\n checkoutURL.searchParams.append('cancelPath', currentURL.pathname);\n\n push(checkoutURL.toString());\n };\n\n return (\n <Flex\n width=\"full\"\n height=\"full\"\n borderRadius=\"xl\"\n background=\"primary.100\"\n padding=\"6\"\n direction=\"column\"\n >\n <Flex gap=\"2\" alignItems=\"end\" mb=\"6\">\n <Text color=\"black\" lineHeight=\"0\">\n {formatMessage(\n { id: 'unit.formatter.tonsCo2' },\n {\n number: (\n <Text as=\"span\" size=\"lgLowBold\" color=\"black\">\n {formatNumber(pricePerKg * 1000, {\n style: 'currency',\n currency,\n maximumFractionDigits: 0,\n })}\n </Text>\n ),\n }\n )}\n </Text>\n <Text size=\"smLowNormal\">\n {formatMessage({\n id: 'portfolio.smallCheckout.price.taxNotIncluded',\n })}\n </Text>\n </Flex>\n\n <Formik\n initialValues={{\n contributionValueCurrency: initialContributionValue.toString(),\n contributionValueTons: (\n initialContributionValue /\n pricePerKg /\n 1000\n ).toString(),\n }}\n validate={validateForm}\n onSubmit={onSubmit}\n >\n {({\n errors,\n touched,\n handleSubmit,\n setValues,\n values,\n }: FormikProps<SmallCheckoutForm>) => (\n <Form onSubmit={handleSubmit}>\n <Flex gap=\"4\">\n <Box width=\"full\">\n <Field name=\"contributionValueCurrency\">\n {({ field }: FieldProps) => (\n <BoemlyFormControl\n id=\"contributionValueCurrency\"\n size=\"md\"\n inputProps={{\n type: 'number',\n value: field.value || '',\n onChange: (e) => {\n const value = e.target.valueAsNumber;\n\n setValues({\n contributionValueCurrency: value.toString(),\n contributionValueTons: (\n value /\n pricePerKg /\n 1000\n ).toString(),\n });\n },\n }}\n label={formatMessage({\n id: `portfolio.smallCheckout.contributionValueCurrency.label.${currency}`,\n })}\n rightAddonsOrElements={[\n <InputRightAddon key=\"currencyUnit\">\n {formatMessage({\n id: `portfolio.smallCheckout.contributionValueCurrency.unit.${currency}`,\n })}\n </InputRightAddon>,\n ]}\n isInvalid={\n !!errors.contributionValueCurrency &&\n touched.contributionValueCurrency\n }\n errorMessage={errors.contributionValueCurrency}\n />\n )}\n </Field>\n </Box>\n\n <Box width=\"full\">\n <Field name=\"contributionValueTons\">\n {({ field }: FieldProps) => (\n <BoemlyFormControl\n id=\"contributionValueTons\"\n size=\"md\"\n inputProps={{\n type: 'number',\n value: field.value || '',\n onChange: (e) => {\n const value = e.target.valueAsNumber;\n setValues({\n contributionValueCurrency: (\n value *\n pricePerKg *\n 1000\n ).toString(),\n contributionValueTons: value.toString(),\n });\n },\n }}\n label={formatMessage({\n id: 'portfolio.smallCheckout.contributionValueTons.label',\n })}\n rightAddonsOrElements={[\n <InputRightAddon key=\"tCO₂\">tCO₂</InputRightAddon>,\n ]}\n isInvalid={\n !!errors.contributionValueTons &&\n touched.contributionValueTons\n }\n errorMessage={errors.contributionValueTons}\n />\n )}\n </Field>\n </Box>\n </Flex>\n {values.contributionValueCurrency &&\n taxInPercent &&\n taxInPercent > 0 && (\n <Text size=\"smLowNormal\" mt=\"2\">\n {formatMessage(\n { id: 'portfolio.smallCheckout.price.taxIncluded' },\n {\n number: formatNumber(\n calculateTaxIncludedValue(values, taxInPercent),\n {\n style: 'currency',\n currency,\n maximumFractionDigits: 2,\n }\n ),\n }\n )}\n </Text>\n )}\n\n <Spacer height=\"4\" />\n\n <Button type=\"submit\" width=\"full\">\n {formatMessage({ id: 'portfolio.smallCheckout.submitButton' })}\n </Button>\n </Form>\n )}\n </Formik>\n\n <Flex\n width=\"full\"\n justifyContent=\"center\"\n alignItems=\"center\"\n mt=\"6\"\n gap=\"2\"\n >\n <Image\n src={`${CDN_URI}/assets/v3/strapi-slices/globe-love-icon.svg`}\n alt=\"Icon\"\n width={20}\n height={20}\n />\n <Text size=\"smLowNormal\">{checkoutText}</Text>\n </Flex>\n\n <Divider my=\"6\" />\n\n <Flex width=\"full\" alignItems=\"center\" direction=\"column\">\n {title && (\n <Text size=\"smLowBold\" textAlign=\"center\" color=\"black\" mb=\"2\">\n {title}\n </Text>\n )}\n {subtitle && (\n <Text size=\"smRegularNormal\" textAlign=\"center\" mb=\"3\">\n {subtitle}\n </Text>\n )}\n {button && (\n <StrapiLinkButton\n link={{\n intercomLauncher: true,\n ...button,\n }}\n variant=\"outline\"\n component=\"SmallCheckout\"\n />\n )}\n </Flex>\n </Flex>\n );\n};\n\nexport default SmallCheckout;\n","import React, { useContext } from 'react';\nimport {\n Box,\n Container,\n Divider,\n Flex,\n Heading,\n LabelTextPair,\n SimpleGrid,\n Spacer,\n Tooltip,\n} from 'boemly';\nimport Image from 'next/image';\nimport convertAreaM2ToHa from '../../../utils/convertAreaM2ToHa';\nimport convertCo2AmountKgToTons from '../../../utils/convertCo2AmountKgToTons';\nimport CreditsAvailableBadge from '../../../components/CreditsAvailableBadge';\nimport PortfolioProject from '../../../models/PortfolioProject';\nimport {\n FORMAT_AS_HECTARE_CONFIG,\n FORMAT_AS_PERCENT_CONFIG,\n} from '../../../constants/formatter';\nimport getTimeSpanInYears from '../../../utils/getTimeSpanInYears';\nimport { IntlContext } from '../../ContextProvider';\n\nexport interface ProjectInfoProps {\n project: PortfolioProject;\n subtitles: {\n areaSubtitle?: string;\n locationSubtitle?: string;\n startSubtitle?: string;\n timeSpanSubtitle?: string;\n projectTypeSubtitle?: string;\n projectDeveloperSubtitle?: string;\n verificationStandardSubtitle?: string;\n averageSellableAmountPerYearSubtitle?: string;\n riskBufferSubtitle?: string;\n buyCreditsSubtitle?: string;\n };\n}\n\nexport const ProjectInfo: React.FC<ProjectInfoProps> = ({\n project,\n subtitles,\n}: ProjectInfoProps) => {\n const { formatMessage, formatNumber, formatDate } = useContext(IntlContext);\n return (\n <Container p=\"2\" width=\"full\">\n <Heading size=\"xl\" textAlign=\"left\">\n {formatMessage({ id: 'features.projectInfo.projectInfo.value' })}\n </Heading>\n\n <Spacer height=\"8\" />\n\n <SimpleGrid\n columns={[1, null, null, 2]}\n gap=\"8\"\n spacingX=\"10\"\n spacingY=\"8\"\n >\n {project.area && (\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.area',\n })}\n text={formatNumber(\n convertAreaM2ToHa(project.area.toString()),\n FORMAT_AS_HECTARE_CONFIG\n )}\n caption={subtitles.areaSubtitle}\n />\n </Box>\n )}\n\n {project.location && (\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.location',\n })}\n text={project.location}\n caption={subtitles.locationSubtitle}\n />\n </Box>\n )}\n\n {project.start && (\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.start',\n })}\n text={formatDate(project.start, {\n year: 'numeric',\n month: 'long',\n })}\n caption={subtitles.startSubtitle}\n />\n </Box>\n )}\n\n {project.start && project.end && (\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.timeSpan',\n })}\n text={formatMessage(\n {\n id: 'features.projectInfo.properties.year',\n },\n {\n years: getTimeSpanInYears(\n new Date(project.start),\n new Date(project.end)\n ),\n }\n )}\n caption={subtitles.timeSpanSubtitle}\n />\n </Box>\n )}\n </SimpleGrid>\n\n {project.projectType ||\n project.projectDeveloper ||\n project.verificationStandard ? (\n <>\n <Spacer height=\"6\" />\n <Divider />\n <Spacer height=\"6\" />\n </>\n ) : (\n <></>\n )}\n <SimpleGrid columns={[1, null, null, 2]} spacingX=\"10\" spacingY=\"8\">\n {project.projectType && (\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.projectType',\n })}\n text={project.projectType.title}\n caption={subtitles.projectTypeSubtitle}\n />\n </Box>\n )}\n {project.projectDeveloper && (\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.projectDeveloper',\n })}\n text={project.projectDeveloper.name}\n caption={subtitles.projectDeveloperSubtitle}\n />\n </Box>\n )}\n </SimpleGrid>\n\n {project.verificationStandard ? (\n <>\n {project.projectType || project.projectDeveloper ? (\n <Spacer height=\"6\" />\n ) : (\n <></>\n )}\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.verificationStandard.label',\n })}\n text={formatMessage({\n id: `features.projectInfo.properties.verificationStandard.value.${project.verificationStandard.id}`,\n defaultMessage: project.verificationStandard.id,\n })}\n caption={subtitles.verificationStandardSubtitle}\n />\n </Box>\n\n {project.defaultIssuer && (\n <Box position=\"relative\" width=\"14\" height=\"8\">\n <Image\n src={project.defaultIssuer.logoUrl}\n alt={`${project.defaultIssuer.name} logo`}\n fill\n style={{ objectFit: 'contain' }}\n />\n </Box>\n )}\n </Flex>\n </>\n ) : (\n <></>\n )}\n\n {(project.averageSellableAmountPerYear &&\n project.averageSellableAmountPerYear > 0) ||\n project.riskBuffer ? (\n <>\n <Spacer height=\"8\" />\n <Divider />\n <Spacer height=\"8\" />\n </>\n ) : (\n <></>\n )}\n <SimpleGrid columns={[1, null, null, 2]} spacingX=\"10\" spacingY=\"8\">\n {project.averageSellableAmountPerYear > 0 ? (\n <Tooltip\n label={formatMessage({\n id: 'features.projectInfo.properties.projectVolume.toolTip',\n })}\n >\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.projectVolume.label',\n })}\n text={formatMessage(\n {\n id: 'unit.formatter.tonsCo2PerYear',\n },\n {\n number: formatNumber(\n convertCo2AmountKgToTons(\n project.averageSellableAmountPerYear.toString()\n ),\n { maximumFractionDigits: 0 }\n ),\n }\n )}\n caption={subtitles.averageSellableAmountPerYearSubtitle}\n />\n </Box>\n </Tooltip>\n ) : (\n <Box>\n <CreditsAvailableBadge status={project.creditAvailability} />\n </Box>\n )}\n\n {project.riskBuffer && (\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.riskBuffer',\n })}\n text={formatNumber(\n project.riskBuffer / 100,\n FORMAT_AS_PERCENT_CONFIG\n )}\n caption={subtitles.riskBufferSubtitle}\n />\n </Box>\n )}\n </SimpleGrid>\n\n {project.averageSellableAmountPerYear > 0 ? (\n <Box mt=\"2\">\n <CreditsAvailableBadge status={project.creditAvailability} />\n </Box>\n ) : (\n <></>\n )}\n </Container>\n );\n};\n","const convertCo2AmountKgToTons = (amount: string): number =>\n parseInt(amount, 10) / 1000;\n\nexport default convertCo2AmountKgToTons;\n","const getTimeSpanInYears = (start: Date, end: Date) => {\n const monthsDifference = end.getMonth() - start.getMonth();\n const yearsDifference = end.getFullYear() - start.getFullYear();\n\n if (monthsDifference > 4) {\n return yearsDifference + 1;\n }\n if (monthsDifference < -4) {\n return yearsDifference - 1;\n }\n return yearsDifference;\n};\n\nexport default getTimeSpanInYears;\n","const convertAreaM2ToHa = (areaInM2: string): number =>\n parseInt(areaInM2, 10) / 10000;\n\nexport default convertAreaM2ToHa;\n","import React, { useContext } from 'react';\nimport StrapiLink from '../../../models/strapi/StrapiLink';\nimport {\n Center,\n Container,\n Flex,\n Heading,\n IconButton,\n Spacer,\n Text,\n} from 'boemly';\nimport { DownloadSimple, FilePdf } from '@phosphor-icons/react';\nimport Link from 'next/link';\nimport { IntlContext } from '../../ContextProvider';\n\nexport interface DocumentsDownloadListProps {\n documentUrls: StrapiLink[];\n}\n\nexport const DocumentsDownloadList: React.FC<DocumentsDownloadListProps> = ({\n documentUrls,\n}: DocumentsDownloadListProps) => {\n const { formatMessage } = useContext(IntlContext);\n\n return (\n <Container p=\"2\">\n <Heading size=\"xl\" textAlign=\"left\">\n {formatMessage({\n id: 'features.portfolio.documentsDownloadList.projectDocuments',\n })}\n </Heading>\n\n <Flex flexDir=\"column\">\n {documentUrls.map((documentUrl) => (\n <Flex\n justifyContent=\"space-between\"\n alignItems=\"center\"\n mt=\"6\"\n key={documentUrl.text}\n >\n <Flex alignItems=\"center\">\n <Center\n w=\"8\"\n h=\"8\"\n borderRadius=\"full\"\n borderWidth=\"1px\"\n borderColor=\"grey.200\"\n >\n <FilePdf />\n </Center>\n\n <Spacer width=\"4\" />\n\n <Flex flexDir=\"column\">\n <Text size=\"smMonoNormal\">PDF</Text>\n <Text size=\"mdLowBold\" color=\"black\" textAlign=\"left\">\n {documentUrl.text}\n </Text>\n </Flex>\n </Flex>\n\n <Spacer width=\"32\" />\n\n <IconButton\n variant=\"outline\"\n aria-label={formatMessage({\n id: 'features.portfolio.documentsDownloadList.downloadDocument',\n })}\n icon={<DownloadSimple />}\n as={Link}\n href={documentUrl.url}\n size=\"sm\"\n />\n </Flex>\n ))}\n </Flex>\n </Container>\n );\n};\n","import React from 'react';\nimport StrapiImage from '../../../models/strapi/StrapiImage';\nimport StrapiLink from '../../../models/strapi/StrapiLink';\nimport strapiMediaUrl from '../../../utils/strapiMediaUrl';\nimport { Text, Heading, Flex, Box, Container } from 'boemly';\nimport Image from 'next/image';\nimport StrapiLinkButton from '../../../components/StrapiLinkButton';\n\nexport interface ContactProps {\n avatar?: StrapiImage;\n title?: string;\n text?: string;\n button?: StrapiLink;\n}\n\nexport const Contact: React.FC<ContactProps> = ({\n avatar,\n title,\n text,\n button,\n}: ContactProps) => (\n <Container backgroundColor=\"primary.100\" border=\"none\" p=\"8\" height=\"full\">\n <Flex\n flexDir=\"column\"\n justifyContent=\"center\"\n alignItems=\"center\"\n height=\"full\"\n >\n {avatar ? (\n <Box\n position=\"relative\"\n width=\"20\"\n height=\"20\"\n borderRadius=\"full\"\n overflow=\"hidden\"\n >\n <Image\n src={strapiMediaUrl(avatar.img, 'small')}\n alt={avatar.alt}\n fill\n objectFit={avatar.objectFit}\n />\n </Box>\n ) : (\n <></>\n )}\n {title ? (\n <Heading\n mt=\"6\"\n size=\"md\"\n fontWeight=\"500\"\n textAlign=\"center\"\n color=\"black\"\n >\n {title}\n </Heading>\n ) : (\n <></>\n )}\n {text ? (\n <Text mt=\"2\" size=\"smRegularNormal\" textAlign=\"center\">\n {text}\n </Text>\n ) : (\n <></>\n )}\n {button ? (\n <StrapiLinkButton\n mt=\"6\"\n link={button}\n size=\"md\"\n variant=\"outline\"\n component=\"Contact\"\n />\n ) : (\n <></>\n )}\n </Flex>\n </Container>\n);\n","import FPMProject from '../../models/fpm/FPMProject';\nimport fpmClient from '../fpmClient';\n\nconst getFpmProjectById = async (projectId: string): Promise<FPMProject> => {\n const fpmResponse = await fpmClient.get<FPMProject>(\n `/public/projects/${projectId}`\n );\n\n return fpmResponse.data;\n};\n\nexport default getFpmProjectById;\n","import React, { useEffect, useState } from 'react';\nimport { DefaultSectionContainer, Flex, Wrapper } from 'boemly';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport PortfolioProject from '../../models/PortfolioProject';\nimport SmallCheckout from '../../components/portfolio/SmallCheckout';\nimport ProjectInfo from '../../components/portfolio/ProjectInfo';\nimport DocumentsDownloadList from '../../components/portfolio/DocumentsDownloadList';\nimport Contact from '../../components/portfolio/Contact';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport getFpmProjectById from '../../integrations/strapi/getFpmProjectById';\n\nexport interface ProjectFactsProps {\n project?: PortfolioProject;\n slice: {\n projectId: string;\n\n batchId?: string;\n currency?: 'EUR' | 'CHF';\n pricePerKg?: number;\n taxInPercent?: number;\n initialContributionValue?: number;\n checkoutText?: string;\n\n customTitle?: string;\n customSubtitle?: string;\n customButton?: StrapiLink;\n documentUrls?: StrapiLink[];\n\n areaSubtitle?: string;\n locationSubtitle?: string;\n startSubtitle?: string;\n timeSpanSubtitle?: string;\n projectTypeSubtitle?: string;\n projectDeveloperSubtitle?: string;\n verificationStandardSubtitle?: string;\n averageSellableAmountPerYearSubtitle?: string;\n riskBufferSubtitle?: string;\n buyCreditsSubtitle?: string;\n\n contactTitle?: string;\n contactText?: string;\n contactButton?: StrapiLink;\n contactAvatar?: StrapiImage;\n };\n}\n\nexport const ProjectFacts: React.FC<ProjectFactsProps> = ({\n slice,\n project,\n}: ProjectFactsProps) => {\n const [enhancedProject, setEnhancedProject] = useState<\n PortfolioProject | undefined\n >(project);\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n const fetchCompleteProjectData = async () => {\n if (project && project.id) {\n setIsLoading(true);\n try {\n const completeFpmProject = await getFpmProjectById(project.id);\n\n // Merge the complete FPM data with existing project data (preserving Strapi fields like slug, portfolioHost, thumbnail)\n const mergedProject: PortfolioProject = {\n ...completeFpmProject,\n slug: project.slug,\n portfolioHost: project.portfolioHost,\n thumbnail: project.thumbnail,\n };\n\n setEnhancedProject(mergedProject);\n } catch (error) {\n console.error('Error fetching complete project data:', error);\n // Fallback to original project data if fetch fails\n setEnhancedProject(project);\n } finally {\n setIsLoading(false);\n }\n }\n };\n\n fetchCompleteProjectData();\n }, [project]);\n\n if (!enhancedProject) {\n return (\n <>Invalid configuration, check if a project this id exists in the FPM</>\n );\n }\n\n if (isLoading) {\n return (\n <DefaultSectionContainer>\n <Wrapper>\n <div>Loading project data...</div>\n </Wrapper>\n </DefaultSectionContainer>\n );\n }\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n <Flex flexDir={['column', null, null, 'row']} gap=\"4\" width=\"full\">\n <ProjectInfo project={enhancedProject} subtitles={slice} />\n <Flex flexDir=\"column\" gap=\"4\" width=\"full\">\n {slice.documentUrls && slice.documentUrls.length > 0 && (\n <DocumentsDownloadList documentUrls={slice.documentUrls} />\n )}\n {slice.batchId &&\n slice.pricePerKg &&\n slice.currency &&\n slice.initialContributionValue ? (\n <SmallCheckout\n batchId={slice.batchId}\n checkoutText={slice.checkoutText}\n currency={slice.currency}\n initialContributionValue={slice.initialContributionValue}\n pricePerKg={slice.pricePerKg}\n title={slice.customTitle}\n subtitle={slice.customSubtitle}\n button={slice.customButton}\n taxInPercent={slice.taxInPercent}\n />\n ) : (\n (slice.contactTitle ||\n slice.contactText ||\n slice.contactButton ||\n slice.contactAvatar) && (\n <Contact\n title={slice.contactTitle}\n text={slice.contactText}\n button={slice.contactButton}\n avatar={slice.contactAvatar}\n />\n )\n )}\n </Flex>\n </Flex>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import { Container, Center, Heading, Button, Box, Text, Flex } from 'boemly';\nimport React, { useContext } from 'react';\nimport { StrapiCustomerStory, strapiMediaUrl } from '../..';\nimport Image from 'next/image';\nimport { IntlContext } from '../../components/ContextProvider';\nimport Link from 'next/link';\n\nexport interface CustomerCardProps {\n customerStory: StrapiCustomerStory;\n}\nexport const CustomerCard = ({\n customerStory,\n}: CustomerCardProps): JSX.Element => {\n const { formatMessage } = useContext(IntlContext);\n\n return (\n <Container padding=\"none\" height=\"full\">\n <Flex flexDir=\"column\" height=\"full\">\n <Center height=\"24\" backgroundColor=\"primary.50\" borderTopRadius=\"xl\">\n {customerStory.cardImage && (\n <Box position=\"relative\" height=\"12\" width=\"12\">\n <Image\n src={strapiMediaUrl(customerStory.cardImage.img, 'medium')}\n alt={customerStory.cardImage.alt}\n fill\n style={{\n objectFit: customerStory.cardImage.objectFit,\n }}\n />\n </Box>\n )}\n </Center>\n <Box px=\"6\" pt=\"8\" pb=\"6\" mb=\"auto\">\n {customerStory.customerCardCustomerIndustry && (\n <Text size=\"xsMonoUppercase\" color=\"gray.500\" mb=\"2\">\n {customerStory.customerCardCustomerIndustry}\n </Text>\n )}\n {customerStory.title && (\n <Heading size=\"md\" fontWeight=\"500\">\n {customerStory.title}\n </Heading>\n )}\n </Box>\n <Box px=\"6\" pt=\"8\" pb=\"6\">\n <Button\n as={Link}\n href={`/customer-stories/${customerStory.slug}`}\n variant=\"outline\"\n size=\"sm\"\n >\n {formatMessage({ id: 'sections.customerCard.more' })}\n </Button>\n </Box>\n </Flex>\n </Container>\n );\n};\n","import { Container, Heading, Button, Box, Text } from 'boemly';\nimport React, { useContext } from 'react';\nimport { StrapiCustomerStory, strapiMediaUrl } from '../..';\nimport Image from 'next/image';\nimport { IntlContext } from '../../components/ContextProvider';\nimport Link from 'next/link';\n\nexport interface CustomerQuoteCardProps {\n customerStory: StrapiCustomerStory;\n}\n\nexport const CustomerQuoteCard = ({\n customerStory,\n}: CustomerQuoteCardProps): JSX.Element => {\n const { formatMessage } = useContext(IntlContext);\n\n return (\n <Container p=\"1\" backgroundColor=\"primary.100\" height=\"full\">\n {customerStory.cardImage ? (\n <Box\n position=\"relative\"\n height=\"12\"\n width=\"12\"\n borderRadius=\"full\"\n overflow=\"hidden\"\n >\n <Image\n src={strapiMediaUrl(customerStory.cardImage.img, 'medium')}\n alt={customerStory.cardImage.alt}\n fill\n style={{\n objectFit: customerStory.cardImage.objectFit,\n }}\n />\n </Box>\n ) : (\n <></>\n )}\n <Box>\n <Box my=\"8\">\n <Heading size=\"md\" fontWeight=\"500\">\n {customerStory.customerName}\n </Heading>\n <Text size=\"xs\">{customerStory.quoteCardCustomerTitle}</Text>\n </Box>\n <Text size=\"xs\" color=\"black\">\n {customerStory.quoteCardQuote}\n </Text>\n <Button\n href={`/customer-stories/${customerStory.slug}`}\n as={Link}\n variant=\"outline\"\n size=\"sm\"\n mt=\"8\"\n >\n {formatMessage({ id: 'sections.customerQuoteCard.more' })}\n </Button>\n </Box>\n </Container>\n );\n};\n","import { Box, Container, Flex } from 'boemly';\nimport { StrapiCustomerStory, strapiMediaUrl } from '../..';\nimport Image from 'next/image';\nimport React from 'react';\nimport Link from 'next/link';\n\nexport interface LogoCardProps {\n customerStory: StrapiCustomerStory;\n}\nexport const LogoCard = ({ customerStory }: LogoCardProps) => {\n if (customerStory.cardImage) {\n return (\n <Container height=\"full\" backgroundColor=\"primary.50\">\n <Flex justifyContent=\"center\" height=\"full\" padding=\"4\">\n <Box position=\"relative\" height=\"12\" width=\"36\" marginY=\"auto\">\n <Link href={`/customer-stories/${customerStory.slug}`}>\n <Image\n src={strapiMediaUrl(customerStory.cardImage.img, 'medium')}\n alt={customerStory.cardImage.alt}\n fill\n style={{\n objectFit: customerStory.cardImage.objectFit,\n }}\n />\n </Link>\n </Box>\n </Flex>\n </Container>\n );\n }\n return <></>;\n};\n","import React from 'react';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport StrapiCustomerStory from '../../models/strapi/StrapiCustomerStory';\nimport { Box, DefaultSectionContainer, SimpleGrid, Wrapper } from 'boemly';\nimport CustomerCard from '../../components/CustomerCard';\nimport CustomerQuoteCard from '../../components/CustomerQuoteCard';\nimport LogoCard from '../../components/LogoCard';\n\nexport interface CustomerStoriesProps {\n slice: {\n customer_stories: IStrapiData<StrapiCustomerStory>[];\n };\n customerStories: IStrapiData<StrapiCustomerStory>[];\n}\n\nexport const CustomerStories = ({\n slice,\n customerStories,\n}: CustomerStoriesProps): JSX.Element => {\n return (\n <DefaultSectionContainer>\n <Wrapper>\n <SimpleGrid columns={[1, null, null, 2, 3]} spacingX={6} spacingY={6}>\n {slice.customer_stories.map(({ attributes }) => {\n const customerStory: IStrapiData<StrapiCustomerStory> | undefined =\n customerStories.find(\n (cs) => cs.attributes.slug === attributes.slug\n );\n if (!customerStory) {\n return null;\n }\n return (\n <Box key={customerStory.id}>\n {attributes.variant === 'customerCard' && (\n <CustomerCard customerStory={customerStory.attributes} />\n )}\n {attributes.variant === 'quoteCard' && (\n <CustomerQuoteCard customerStory={customerStory.attributes} />\n )}\n {attributes.variant === 'logoCard' && (\n <LogoCard customerStory={customerStory.attributes} />\n )}\n </Box>\n );\n })}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React from 'react';\nimport { Check, X } from '@phosphor-icons/react';\nimport { Box } from 'boemly';\n\nexport interface IconProps {\n variant: 'gray' | 'green' | 'white';\n icon: string;\n}\n\nconst BULLET_POINT_VARIANTS = {\n gray: { bulletPointColor: 'black' },\n green: { bulletPointColor: 'white' },\n white: { bulletPointColor: 'black' },\n};\n\nexport const Icon = ({ variant, icon }: IconProps): JSX.Element => {\n switch (icon) {\n case 'check':\n return <Check size={20} color=\"var(--boemly-colors-primary-500)\" />;\n case 'cross':\n return <X size={20} color=\"var(--boemly-colors-red-500)\" />;\n default:\n return (\n <Box\n data-testid=\"bullet-point-box\"\n borderRadius=\"full\"\n backgroundColor={BULLET_POINT_VARIANTS[variant].bulletPointColor}\n width=\"2\"\n height=\"2\"\n margin=\"1.5\"\n />\n );\n }\n};\nexport default Icon;\n","import React, { useContext } from 'react';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport {\n Container,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Wrapper,\n Text,\n Flex,\n Box,\n Spacer,\n Divider,\n Heading,\n Badge,\n SimpleGrid,\n} from 'boemly';\nimport Image from 'next/image';\nimport { CaretRight } from '@phosphor-icons/react';\nimport { Icon } from './Icon';\nimport { CDN_URI } from '../../constants/api';\nimport { IntlContext } from '../../components/ContextProvider';\n\nexport interface ComparisonProps {\n slice: {\n title?: string;\n subTitle?: string;\n tagline?: string;\n\n comparisonCards: ComparisonCard[];\n };\n}\n\nexport interface ComparisonCard {\n id: number;\n title: string;\n subTitle: string;\n badge?: string;\n variant: 'gray' | 'green' | 'white';\n image?: StrapiImage;\n button?: StrapiLink;\n factTitle?: string;\n factSubtitle?: string;\n lists: {\n id: string;\n title: string;\n items: { id: string; text: string; icon: 'bullet' | 'check' | 'cross' }[];\n }[];\n}\n\nconst VARIANTS = {\n gray: {\n backgroundColor: 'primary.50',\n textColor: 'black',\n subTitleColor: 'gray.500',\n factColor: 'primary.800',\n dividerColor: 'gray.200',\n },\n green: {\n backgroundColor: 'primary.800',\n textColor: 'white',\n subTitleColor: 'whiteAlpha.900',\n factColor: 'white',\n dividerColor: 'whiteAlpha.200',\n },\n white: {\n backgroundColor: 'white',\n textColor: 'black',\n subTitleColor: 'gray.500',\n factColor: 'primary.800',\n dividerColor: 'gray.200',\n },\n};\n\nexport const Comparison: React.FC<ComparisonProps> = ({\n slice,\n}: ComparisonProps) => {\n const { formatMessage } = useContext(IntlContext);\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n {slice.title ? (\n <>\n <Flex alignItems=\"center\" flexDirection=\"column\">\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.subTitle}\n textProps={{ maxW: '2xl', textAlign: 'center' }}\n titleProps={{\n textAlign: 'center',\n maxWidth: '3xl',\n }}\n taglineProps={{ textAlign: 'center', maxWidth: '3xl' }}\n />\n </Flex>\n <Spacer height=\"12\" />\n </>\n ) : (\n <></>\n )}\n <SimpleGrid\n columns={[1, null, null, null, slice.comparisonCards.length]}\n spacing=\"4\"\n >\n {slice.comparisonCards.map((comparisonCard) => (\n <Container\n boxShadow={comparisonCard.variant === 'green' ? 'xl' : 'base'}\n border={\n comparisonCard.variant === 'green' ? 'primary.800' : undefined\n }\n zIndex=\"base\"\n key={comparisonCard.id}\n position=\"relative\"\n elevation=\"none\"\n p=\"3\"\n backgroundColor={VARIANTS[comparisonCard.variant].backgroundColor}\n >\n {comparisonCard.variant === 'green' ? (\n <Box\n position=\"absolute\"\n left=\"0\"\n top=\"0\"\n width=\"full\"\n height=\"full\"\n zIndex=\"-1\"\n >\n <Image\n src={`${CDN_URI}/assets/v3/strapi-slices/shapes-comparison.svg`}\n alt={formatMessage({\n id: 'sections.comparison.backgroundShapes',\n })}\n fill\n style={{\n objectFit: 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n ) : (\n <></>\n )}\n <Flex flexDir=\"column\" gap=\"4\">\n {comparisonCard.image && (\n <Box position=\"relative\" height=\"7\" width=\"100%\">\n <Image\n src={strapiMediaUrl(comparisonCard.image.img, 'small')}\n alt={comparisonCard.image.alt}\n fill\n style={{\n objectFit: comparisonCard.image.objectFit,\n }}\n />\n </Box>\n )}\n <Flex gap=\"2\" alignItems=\"center\" flexWrap=\"wrap\">\n <Heading\n size=\"xl\"\n color={VARIANTS[comparisonCard.variant].textColor}\n whiteSpace=\"pre-line\"\n >\n {comparisonCard.title}\n </Heading>\n {comparisonCard.badge && (\n <Badge\n backgroundColor=\"green.100\"\n borderRadius=\"md\"\n whiteSpace=\"pre-line\"\n >\n {comparisonCard.badge}\n </Badge>\n )}\n </Flex>\n </Flex>\n <Spacer height=\"4\" />\n <Text\n size=\"smRegularNormal\"\n color={VARIANTS[comparisonCard.variant].subTitleColor}\n >\n {comparisonCard.subTitle}\n </Text>\n\n {comparisonCard.factTitle ||\n comparisonCard.factSubtitle ||\n comparisonCard.button ? (\n <>\n <Spacer height=\"6\" />\n <Flex flexDir=\"column\">\n {comparisonCard.factTitle && (\n <>\n <Text\n color={VARIANTS[comparisonCard.variant].factColor}\n size=\"lgMonoNormal\"\n >\n {comparisonCard.factTitle}\n </Text>\n <Text\n color={VARIANTS[comparisonCard.variant].factColor}\n size=\"smLowNormal\"\n >\n {comparisonCard.factSubtitle}\n </Text>\n </>\n )}\n {comparisonCard.button && (\n <StrapiLinkButton\n mt=\"6\"\n link={comparisonCard.button}\n size=\"md\"\n variant=\"outline\"\n rightIcon={<CaretRight size={16} weight=\"bold\" />}\n component=\"Comparison\"\n />\n )}\n </Flex>\n </>\n ) : (\n <></>\n )}\n <>\n {comparisonCard.lists.map((list) => (\n <Box key={list.id}>\n <Divider\n my=\"8\"\n color={VARIANTS[comparisonCard.variant].dividerColor}\n />\n <Text\n size=\"smLowBold\"\n color={VARIANTS[comparisonCard.variant].textColor}\n >\n {list.title}\n </Text>\n <>\n {list.items.map((item) => (\n <Box key={item.id}>\n <Spacer height=\"4\" />\n <Flex gap=\"4\" alignItems=\"center\">\n <Box>\n <Icon\n variant={comparisonCard.variant}\n icon={item.icon}\n />\n </Box>\n <Text\n size=\"smLowNormal\"\n color={VARIANTS[comparisonCard.variant].textColor}\n >\n {item.text}\n </Text>\n </Flex>\n </Box>\n ))}\n </>\n </Box>\n ))}\n </>\n </Container>\n ))}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\nexport default Comparison;\n","import { motion } from 'framer-motion';\nimport styled from '@emotion/styled';\nimport { BREAKPOINT_MD } from '../../constants/breakpoints';\n\ninterface CarouselInnerContainerProps {\n logoCount: number;\n}\n\nexport const CarouselInnerContainer = styled(\n motion.div\n)<CarouselInnerContainerProps>`\n display: flex;\n justify-content: ${(props) =>\n props.logoCount < 5 ? 'center' : 'flex-start'};\n gap: var(--boemly-space-24);\n padding-right: var(--boemly-space-24);\n padding-left: var(--boemly-space-24);\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n width: calc(\n ${(props) => props.logoCount} *\n (var(--boemly-sizes-16) + var(--boemly-space-6))\n );\n justify-content: ${(props) =>\n props.logoCount < 5 ? 'center' : 'flex-start'};\n }\n`;\n\nexport const LogoGrid = styled(motion.div)`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: var(--boemly-space-24);\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-gap: var(--boemly-space-6);\n }\n`;\n","import React, { useEffect, useState } from 'react';\nimport {\n DefaultSectionContainer,\n Flex,\n Heading,\n Spacer,\n Box,\n useMediaQuery,\n useToken,\n} from 'boemly';\nimport Image from 'next/image';\nimport useEmblaCarousel from 'embla-carousel-react';\nimport { useWindowSize } from 'react-use';\n\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport AutoScroll from 'embla-carousel-auto-scroll';\nimport { BREAKPOINT_MD_QUERY } from '../../constants/breakpoints';\nimport { getClosestRatio } from '../../utils/getClosestRatio';\nimport { CarouselInnerContainer, LogoGrid } from './styles';\n\nexport interface CarouselMarqueeBannerProps {\n slice: {\n title?: string;\n logos: StrapiImage[];\n };\n}\n\n// Separate component containing the actual logic\nconst CarouselMarqueeBannerContent: React.FC<CarouselMarqueeBannerProps> = ({\n slice,\n}) => {\n const [primary50] = useToken('colors', ['primary.50']);\n const { width: windowWidth } = useWindowSize();\n const hasEnoughLogosForLoop = slice.logos.length >= 5;\n const LOOP_ARRAY_LENGTH = windowWidth > 2000 ? 5 : 4;\n\n // Duplicate Logos to create a full loop\n const logosToRender = hasEnoughLogosForLoop\n ? Array.from({ length: LOOP_ARRAY_LENGTH }, () => slice.logos).flat()\n : slice.logos;\n\n const [isMobile] = useMediaQuery(BREAKPOINT_MD_QUERY);\n\n // Carousel setup\n const [emblaRef] = useEmblaCarousel(\n {\n loop: hasEnoughLogosForLoop,\n align: 'start',\n containScroll: 'trimSnaps',\n dragFree: true,\n },\n hasEnoughLogosForLoop\n ? [\n AutoScroll({\n playOnInit: true,\n speed: isMobile ? 0.5 : 1,\n stopOnInteraction: false,\n stopOnMouseEnter: false,\n stopOnFocusIn: false,\n }),\n ]\n : []\n );\n\n const renderLogos = (): React.ReactNode => {\n if (!hasEnoughLogosForLoop) {\n return (\n <LogoGrid>\n {slice.logos.map((logo, index) => (\n <Box\n key={`${logo.id}-${index}`}\n flexShrink={0}\n transform=\"translate3d(0, 0, 0)\"\n >\n <Flex\n height=\"full\"\n width=\"full\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <Box\n position=\"relative\"\n height={isMobile ? '16' : '36'}\n width={`calc(var(--boemly-sizes-10)\n * ${getClosestRatio(\n logo.img.data.attributes.width,\n logo.img.data.attributes.height\n )})`}\n >\n <Image\n src={strapiMediaUrl(logo.img, 'large')}\n alt={logo.alt}\n fill\n style={{\n objectFit: logo.objectFit || 'contain',\n filter: 'grayscale(100%)',\n }}\n />\n </Box>\n </Flex>\n </Box>\n ))}\n </LogoGrid>\n );\n }\n\n return (\n <Box width=\"full\" overflow=\"hidden\" ref={emblaRef} cursor=\"pointer\">\n <CarouselInnerContainer logoCount={slice.logos.length}>\n {logosToRender.map((logo, index) => (\n <Box\n key={`${logo.id}-${index}`}\n flexShrink={0}\n transform=\"translate3d(0, 0, 0)\"\n >\n <Flex\n height=\"full\"\n width=\"full\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <Box\n position=\"relative\"\n height={isMobile ? '16' : '36'}\n width={`calc(var(--boemly-sizes-10) * ${getClosestRatio(\n logo.img.data.attributes.width,\n logo.img.data.attributes.height\n )})`}\n >\n <Image\n src={strapiMediaUrl(logo.img, 'large')}\n alt={logo.alt}\n fill\n style={{\n objectFit: logo.objectFit || 'contain',\n filter: 'grayscale(100%)',\n }}\n />\n </Box>\n </Flex>\n </Box>\n ))}\n </CarouselInnerContainer>\n </Box>\n );\n };\n\n return (\n <DefaultSectionContainer backgroundColor={primary50}>\n <>\n {slice.title ? (\n <>\n <Flex alignItems=\"center\" flexDirection=\"column\">\n <Heading size=\"md\" fontWeight=\"500\">\n {slice.title}\n </Heading>\n </Flex>\n <Spacer height=\"12\" minHeight=\"12\" />\n </>\n ) : null}\n\n {renderLogos()}\n </>\n </DefaultSectionContainer>\n );\n};\n\n// Lazy-rendering the child component after client-side hydration\nexport const CarouselMarqueeBanner: React.FC<CarouselMarqueeBannerProps> = ({\n slice,\n}: CarouselMarqueeBannerProps) => {\n const [showChild, setShowChild] = useState(false);\n\n useEffect(() => {\n setShowChild(true); // Hydrate the component after the client-side is ready\n }, []);\n\n if (!showChild) {\n return <div />;\n }\n\n return <CarouselMarqueeBannerContent slice={slice} />;\n};\n\nexport default CarouselMarqueeBanner;\n","import React, { useContext } from 'react';\nimport {\n Button,\n Box,\n Container,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Flex,\n Heading,\n RichText,\n SimpleGrid,\n Spacer,\n Tag,\n Text,\n Wrapper,\n useMediaQuery,\n} from 'boemly';\nimport Image from 'next/image';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport { CDN_URI } from '../../constants/api';\nimport { IntlContext } from 'react-intl';\nimport { BREAKPOINT_MD_QUERY } from '../../constants/breakpoints';\nimport { useState } from 'react';\nimport FullScreenImage from '../../components/FullScreenImage';\n\nexport interface TimelineProps {\n slice: {\n title: string;\n text?: string;\n tagline?: string;\n\n timelineItems: TimelineItem[];\n };\n}\n\nexport interface TimelineItem {\n id: number;\n tagline?: string;\n title: string;\n text?: string;\n badge?: { text: string; variant: 'orange' | 'green' | 'red' | 'gray' };\n logo?: StrapiImage;\n icon?: StrapiImage;\n image?: StrapiImage;\n button?: StrapiLink;\n backgroundShapes?: boolean;\n}\n\nexport const Timeline: React.FC<TimelineProps> = ({ slice }: TimelineProps) => {\n const { formatMessage } = useContext(IntlContext);\n const [visibleItems, setVisibleItems] = useState(3);\n const [mobile] = useMediaQuery(BREAKPOINT_MD_QUERY);\n const [isOpen, setIsOpen] = useState(false);\n\n const showMoreItems = () => {\n setVisibleItems((prevVisibleItems) => prevVisibleItems + 3);\n };\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n <Flex flexDir={['column', null, null, 'row']}>\n <Box\n width={['full', null, null, '50%']}\n position={[null, null, null, 'sticky']}\n top={['16', null, null, '32']}\n height=\"full\"\n paddingRight={[null, null, null, '28']}\n >\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n />\n {mobile && (\n <>\n <Spacer h=\"10\" />\n <Flex justifyContent=\"center\">\n <Box\n borderRadius=\"full\"\n width=\"3\"\n height=\"3\"\n margin=\"1.5\"\n backgroundColor=\"gray\"\n />\n </Flex>\n <Box\n overflow=\"visible\"\n borderRight=\"dashed 1px var(--boemly-colors-gray-200)\"\n transform=\"translateX(-50%)\"\n position=\"relative\"\n height=\"20\"\n />\n </>\n )}\n </Box>\n <Box\n overflow=\"visible\"\n maxWidth={['full', null, null, '50%']}\n borderLeft={[\n null,\n null,\n null,\n 'dashed 1px var(--boemly-colors-gray-200)',\n ]}\n position=\"relative\"\n width=\"full\"\n >\n <Flex\n flexDir=\"column\"\n overflow=\"visible\"\n gap={[null, null, null, '8']}\n >\n {slice.timelineItems.slice(0, visibleItems).map((item, index) => (\n <SimpleGrid\n gap={['none', null, null, '4']}\n key={item.id}\n columns={[1, null, null, 2]}\n alignContent=\"center\"\n gridTemplateColumns={[null, null, null, '1fr 16fr']}\n position=\"relative\"\n >\n <Flex\n alignItems=\"center\"\n justifyContent={['center', null, null, 'flex-start']}\n >\n <Box\n position=\"absolute\"\n transform={[null, null, null, 'translateX(-50%)']}\n backgroundColor=\"white\"\n >\n {item.icon ? (\n <Box padding=\"2\">\n <Image\n src={strapiMediaUrl(item.icon.img, 'xSmall')}\n alt={item.icon.alt}\n width=\"21\"\n height=\"21\"\n />\n </Box>\n ) : (\n <Box padding=\"2\">\n <Box\n borderRadius=\"full\"\n backgroundColor=\"primary.800\"\n width=\"2\"\n height=\"2\"\n />\n </Box>\n )}\n {mobile && (\n <Box\n overflow=\"visible\"\n borderRight=\"dashed 1px var(--boemly-colors-gray-200)\"\n transform=\"translateX(-50%)\"\n position=\"relative\"\n height=\"10\"\n />\n )}\n </Box>\n </Flex>\n <Container\n p={[null, null, null, '3']}\n zIndex=\"base\"\n position=\"relative\"\n elevation=\"none\"\n >\n {item.backgroundShapes ? (\n <Box\n position=\"absolute\"\n left=\"0\"\n top=\"0\"\n width=\"full\"\n height=\"full\"\n zIndex=\"-1\"\n >\n <Image\n src={`${CDN_URI}/assets/v3/strapi-slices/timeline-shapes.svg`}\n alt={formatMessage({\n id: 'sections.timeline.backgroundShapes',\n })}\n fill\n style={{\n objectFit: 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n ) : (\n <></>\n )}\n\n <Flex flexDir=\"column\">\n <Flex\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n >\n <Box>\n {item.tagline && (\n <>\n <Text color=\"primary.800\" size=\"smMonoUppercase\">\n {item.tagline}\n </Text>\n <Spacer h=\"2\" />\n </>\n )}\n </Box>\n <Flex>\n {item.badge && (\n <Tag\n colorScheme={item.badge.variant}\n borderRadius=\"md\"\n >\n {item.badge.text}\n </Tag>\n )}\n {item.logo && (\n <Box position=\"relative\" height=\"8\" width=\"16\">\n <Image\n src={strapiMediaUrl(item.logo.img, 'small')}\n alt={item.logo.alt}\n fill\n style={{\n objectFit: item.logo.objectFit,\n }}\n />\n </Box>\n )}\n </Flex>\n </Flex>\n <Heading\n size=\"lg\"\n mt={['6', null, null, '3']}\n maxWidth=\"xs\"\n >\n {item.title}\n </Heading>\n {item.text && (\n <Box mt=\"3\">\n <RichText content={item.text} />\n </Box>\n )}\n {item.button && (\n <Box textAlign=\"left\">\n <Spacer h=\"4\" />\n <StrapiLinkButton\n link={item.button}\n size=\"sm\"\n variant=\"outline\"\n component=\"Timeline\"\n />\n </Box>\n )}\n {item.image ? (\n <>\n <Box\n position=\"relative\"\n mt=\"4\"\n height={['2xs', null, null, null, '48']}\n minWidth={[null, null, null, null, '50%']}\n >\n <Image\n src={strapiMediaUrl(item.image.img, 'xLarge')}\n alt={item.image.alt}\n fill\n style={{\n cursor: mobile ? 'unset' : 'pointer',\n objectFit: item.image.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n onClick={() => !mobile && setIsOpen(true)}\n />\n <FullScreenImage\n images={[item.image]}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n />\n </Box>\n </>\n ) : (\n <></>\n )}\n </Flex>\n </Container>\n {mobile && index + 1 < slice.timelineItems.length && (\n <Box\n overflow=\"visible\"\n borderRight=\"dashed 1px var(--boemly-colors-gray-200)\"\n transform=\"translateX(-50%)\"\n position=\"relative\"\n height=\"20\"\n />\n )}\n </SimpleGrid>\n ))}\n </Flex>\n {visibleItems < slice.timelineItems.length && (\n <>\n <Box\n width=\"full\"\n height={['36', null, null, '64']}\n position=\"absolute\"\n bottom=\"0\"\n zIndex=\"1\"\n background=\"linear-gradient(180deg, rgba(255, 255, 255, 0.00) 0%, rgba(255, 255, 255, 0.98) 76.54%, #FFF 100%)\"\n />\n <Box\n bottom=\"0\"\n textAlign=\"center\"\n zIndex=\"overlay\"\n position=\"relative\"\n >\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={showMoreItems}\n m={[null, null, null, '8']}\n >\n {formatMessage({ id: 'sections.timeline.showMoreButton' })}\n </Button>\n </Box>\n </>\n )}\n </Box>\n </Flex>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","const isSameDate = (date1: Date, date2: Date): boolean => {\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n};\n\nexport default isSameDate;\n","import {\n DefaultSectionContainer,\n Wrapper,\n Spacer,\n DefaultSectionHeader,\n SimpleGrid,\n Box,\n Button,\n Flex,\n Center,\n Text,\n BoemlyTag,\n Select,\n} from 'boemly';\n\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport EventCard from '../../components/EventCard';\nimport { SWRInfiniteKeyLoader } from 'swr/infinite';\nimport useEvents from '../../models/hooks/useEvents';\nimport {\n STRAPI_DEFAULT_POPULATE_DEPTH,\n STRAPI_URI,\n} from '../../constants/strapi';\nimport { IntlContext } from '../../components/ContextProvider';\nimport { mutate } from 'swr/_internal';\nimport { EventType } from '@testing-library/react';\nimport StrapiEvent from '../../models/strapi/StrapiEvent';\nimport IStrapiData from '../../models/strapi/IStrapiData';\n\nconst UPCOMING_BATCH_SIZE = 6;\nconst PAST_BATCH_SIZE = 2;\n\ninterface FiltersProps {\n eventTypes: EventType[];\n languages: {\n id: number;\n language: string;\n countryCode: string;\n }[];\n}\n\nexport interface EventsProps {\n slice: {\n upcomingTitle?: string;\n upcomingDescription?: string;\n pastTitle: string;\n pastDescription?: string;\n filterSearch?: boolean;\n };\n}\n\nconst enum Sort {\n NEWEST_FIRST = 'newest',\n OLDEST_FIRST = 'oldest',\n}\n\ninterface EventOption {\n value: string;\n label: string;\n}\n\nexport const Events: React.FC<EventsProps> = ({ slice }: EventsProps) => {\n const { formatMessage, locale } = useContext(IntlContext);\n const [eventTypeFilter, setEventTypeFilter] = useState([] as string[]);\n const [languageFilter, setLanguageFilter] = useState([] as string[]);\n const [sort, setSort] = useState([Sort.NEWEST_FIRST] as string[]);\n\n const [allEventTypeOptions, setAllEventTypeOptions] = useState<EventOption[]>(\n []\n );\n const [allLanguageOptions, setAllLanguageOptions] = useState<EventOption[]>(\n []\n );\n\n const now = new Date().toISOString();\n\n const buildEventsUrl = (\n index: any,\n batchSize: number,\n startFilter: string\n ) => {\n const url = new URL(`/treely-events`, STRAPI_URI);\n url.searchParams.append(\n 'pagination[start]',\n (index * batchSize).toString()\n );\n url.searchParams.append('pagination[limit]', batchSize.toString());\n url.searchParams.append(startFilter, now);\n url.searchParams.append('locale', locale);\n url.searchParams.append('pLevel', STRAPI_DEFAULT_POPULATE_DEPTH);\n\n if (sort[0] === Sort.OLDEST_FIRST) {\n url.searchParams.append('sort', 'start:asc');\n } else {\n url.searchParams.append('sort', 'start:desc');\n }\n\n if (eventTypeFilter.length) {\n eventTypeFilter.forEach((filter, i) => {\n url.searchParams.append(\n `filters[$or][${i}][eventTypes][eventType]`,\n filter\n );\n });\n }\n\n if (languageFilter.length) {\n languageFilter.forEach((filter, i) => {\n url.searchParams.append(\n `filters[$or][${eventTypeFilter.length + i}][languages][language]`,\n filter\n );\n });\n }\n return `/treely-events` + url.search;\n };\n\n const getUpcomingKey: SWRInfiniteKeyLoader = useCallback(\n (index) =>\n buildEventsUrl(index, UPCOMING_BATCH_SIZE, 'filters[start][$gte]'),\n [eventTypeFilter, languageFilter, sort]\n );\n\n const getPastKey: SWRInfiniteKeyLoader = useCallback(\n (index) => buildEventsUrl(index, PAST_BATCH_SIZE, 'filters[start][$lt]'),\n [eventTypeFilter, languageFilter, sort]\n );\n\n const {\n data: upcomingData,\n isLoading: isLoadingUpcoming,\n isLoadingMore: isLoadingMoreUpcoming,\n canLoadMore: canLoadMoreUpcoming,\n loadMore: loadMoreUpcoming,\n } = useEvents({ getKey: getUpcomingKey, batchSize: UPCOMING_BATCH_SIZE });\n\n const {\n data: pastData,\n isLoading: isLoadingPast,\n isLoadingMore: isLoadingMorePast,\n canLoadMore: canLoadMorePast,\n loadMore: loadMorePast,\n } = useEvents({ getKey: getPastKey, batchSize: PAST_BATCH_SIZE });\n\n const processEvents = (data: any) => {\n return (\n data?.flatMap((d: any) => d?.body?.data)?.filter((t: any) => !!t) || []\n );\n };\n\n // Process upcoming events\n const upcomingEvents = useMemo(() => {\n return processEvents(upcomingData);\n }, [upcomingData]);\n\n // Process past events\n const pastEvents = useMemo(() => {\n return processEvents(pastData);\n }, [pastData]);\n\n // Function to fetch all possible options\n const fetchAllOptions = useCallback(async () => {\n const url = new URL(`/treely-events`, STRAPI_URI);\n url.searchParams.append('locale', locale);\n url.searchParams.append('pLevel', STRAPI_DEFAULT_POPULATE_DEPTH);\n\n const response = await fetch(\n `${STRAPI_URI}/api/treely-events${url.search}`,\n {\n headers: {\n 'Strapi-Response-Format': 'v4',\n },\n }\n );\n const data = await response.json();\n\n const events = data?.data || [];\n\n // Extract all event types\n const allEventTypes = new Set<string>();\n events.forEach((event: any) => {\n if (event?.attributes?.eventTypes) {\n event.attributes.eventTypes.forEach((item: any) => {\n allEventTypes.add(item.eventType);\n });\n }\n });\n\n // Extract all languages\n const allLanguages = new Set<string>();\n events.forEach((event: any) => {\n if (event?.attributes?.languages) {\n event.attributes.languages.forEach((item: any) => {\n allLanguages.add(item.language);\n });\n }\n });\n\n // Update state with all options\n setAllEventTypeOptions(\n Array.from(allEventTypes).map((value) => ({ value, label: value }))\n );\n\n setAllLanguageOptions(\n Array.from(allLanguages).map((value) => ({ value, label: value }))\n );\n }, [locale]);\n\n // Fetch all options when component mounts\n useEffect(() => {\n fetchAllOptions();\n }, [fetchAllOptions]);\n\n const removeFilter = (\n filterType: keyof FiltersProps,\n valueToRemove: string\n ) => {\n if (filterType === 'eventTypes') {\n setEventTypeFilter((prev) =>\n prev.filter((item) => item !== valueToRemove)\n );\n } else if (filterType === 'languages') {\n setLanguageFilter((prev) =>\n prev.filter((item) => item !== valueToRemove)\n );\n }\n };\n\n useEffect(() => {\n mutate(getUpcomingKey);\n }, [eventTypeFilter, languageFilter, sort]);\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n {slice.upcomingTitle ? (\n <>\n <DefaultSectionHeader\n title={slice.upcomingTitle}\n text={slice.upcomingDescription}\n titleProps={{ maxW: '3xl' }}\n textProps={{ maxW: '3xl' }}\n />\n <Spacer h=\"10\" />\n </>\n ) : (\n <></>\n )}\n {slice.filterSearch && (upcomingEvents || pastEvents) ? (\n <>\n <Flex\n justifyContent=\"space-between\"\n direction={['column-reverse', null, null, 'row']}\n alignItems=\"baseline\"\n gap=\"4\"\n >\n <Flex\n direction=\"column\"\n width=\"full\"\n justifyContent=\"start\"\n gap=\"4\"\n >\n {/* Filter section */}\n <Flex\n direction={['column', null, null, 'row']}\n gap=\"4\"\n justifyContent=\"start\"\n >\n <Box position=\"relative\" width={['full', null, null, '56']}>\n <Select\n isMultiple={true}\n isSearchable={true}\n id=\"eventTypeFilter\"\n size=\"md\"\n placeholder={formatMessage({\n id: 'sections.events.eventsFilter.eventType',\n })}\n searchPlaceholder={formatMessage({\n id: 'sections.events.eventsFilter.searchPlaceholder',\n })}\n options={allEventTypeOptions}\n value={eventTypeFilter ?? []}\n onChange={(selected: string[]) => {\n setEventTypeFilter(selected);\n }}\n />\n </Box>\n <Box position=\"relative\" width={['full', null, null, '56']}>\n <Select\n isMultiple={true}\n isSearchable={true}\n id=\"languageFilter\"\n size=\"md\"\n placeholder={formatMessage({\n id: 'sections.events.eventsFilter.language',\n })}\n searchPlaceholder={formatMessage({\n id: 'sections.events.eventsFilter.searchPlaceholder',\n })}\n options={allLanguageOptions}\n value={languageFilter ?? []}\n onChange={(selected: string[]) => {\n setLanguageFilter(selected);\n }}\n />\n </Box>\n </Flex>\n\n {/* Filter Tags */}\n <Box display=\"flex\" flexWrap=\"wrap\" minHeight=\"6\" gap=\"2\">\n {eventTypeFilter.map((eventType) => {\n const event = allEventTypeOptions.find(\n (option) => option.value === eventType\n );\n return (\n <BoemlyTag\n key={eventType}\n isClosable={true}\n onClose={() => removeFilter('eventTypes', eventType)}\n >\n {event?.label}\n </BoemlyTag>\n );\n })}\n\n {languageFilter.map((singleLanguage) => {\n const language = allLanguageOptions.find(\n (option) => option.value === singleLanguage\n );\n return (\n <BoemlyTag\n key={singleLanguage}\n isClosable={true}\n onClose={() =>\n removeFilter('languages', singleLanguage)\n }\n >\n {language?.label}\n </BoemlyTag>\n );\n })}\n </Box>\n </Flex>\n {/* Sort Section */}\n <Box display=\"flex\" gap=\"1px\" width=\"52\" alignItems=\"center\">\n <Text size=\"smLowNormal\" color=\"black\" width=\"20\">\n Sort by:\n </Text>\n <Select\n isMultiple={false}\n borderColor=\"white\"\n value={[sort[0]]}\n placeholder={sort[0]}\n onChange={(selected: string[]) => setSort(selected)}\n options={[\n {\n label: formatMessage({\n id: `sections.events.eventsFilter.sortBy.${Sort.NEWEST_FIRST}`,\n }),\n value: Sort.NEWEST_FIRST,\n },\n {\n label: formatMessage({\n id: `sections.events.eventsFilter.sortBy.${Sort.OLDEST_FIRST}`,\n }),\n value: Sort.OLDEST_FIRST,\n },\n ]}\n />\n </Box>\n </Flex>\n\n <Spacer h={['8', null, null, '16']} />\n </>\n ) : (\n <></>\n )}\n\n {(!upcomingEvents || upcomingEvents.length === 0) &&\n !isLoadingUpcoming ? (\n <Center>\n {formatMessage({ id: 'sections.events.noUpcomingEvents' })}\n </Center>\n ) : (\n // List of upcoming events\n <SimpleGrid\n columns={[1, null, null, null, null, 2]}\n spacingX=\"6\"\n gap=\"6\"\n flexShrink=\"0\"\n mb={['10', null, null, '20']}\n placeItems=\"center\"\n >\n {upcomingEvents.map((event: IStrapiData<StrapiEvent>) => (\n <Box key={event.id} width=\"full\" height=\"full\">\n <EventCard event={event.attributes} />\n </Box>\n ))}\n </SimpleGrid>\n )}\n <Flex justifyContent=\"center\">\n {!isLoadingUpcoming && canLoadMoreUpcoming && (\n <Button\n onClick={() => {\n loadMoreUpcoming();\n }}\n variant=\"solid\"\n isLoading={isLoadingMoreUpcoming}\n >\n {formatMessage({ id: 'sections.events.loadMore' })}\n </Button>\n )}\n </Flex>\n </Wrapper>\n\n <Spacer h={['10', null, null, '28']} />\n\n <Box background=\"primary.50\" pt={['8', null, null, '24']}>\n <Wrapper>\n <DefaultSectionHeader\n title={slice.pastTitle}\n text={slice.pastDescription}\n titleProps={{ maxW: '3xl' }}\n textProps={{ maxW: '3xl' }}\n />\n\n <Spacer h=\"10\" />\n\n {(!pastEvents || pastEvents.length === 0) && !isLoadingPast ? (\n <>\n <Center>\n {formatMessage({ id: 'sections.events.noPastEvents' })}\n </Center>\n <Spacer h=\"24\" />\n </>\n ) : (\n // List of past events\n <SimpleGrid\n columns={[1, null, null, null, null, 2]}\n spacingX=\"6\"\n gap=\"6\"\n flexShrink=\"0\"\n placeItems=\"center\"\n mb={['10', null, null, '20']}\n >\n {pastEvents.map((event: IStrapiData<StrapiEvent>) => (\n <Box key={event.id} height=\"full\" width=\"full\">\n <EventCard event={event.attributes} />\n </Box>\n ))}\n </SimpleGrid>\n )}\n <Flex justifyContent=\"center\">\n {!isLoadingPast && canLoadMorePast && (\n <Button\n mb=\"20\"\n onClick={() => {\n loadMorePast();\n }}\n variant=\"solid\"\n isLoading={isLoadingMorePast}\n >\n {formatMessage({ id: 'sections.events.loadMore' })}\n </Button>\n )}\n </Flex>\n </Wrapper>\n </Box>\n </DefaultSectionContainer>\n );\n};\n","import React, { useContext, useState } from 'react';\nimport {\n Text,\n Box,\n Flex,\n Heading,\n Tooltip,\n Tag,\n useMediaQuery,\n Button,\n} from 'boemly';\nimport { css } from '@emotion/react';\nimport Image from 'next/image';\nimport StrapiLinkButton from '../StrapiLinkButton';\nimport {\n BowlFood,\n CalendarBlank,\n CaretDown,\n CaretRight,\n CaretUp,\n ChalkboardTeacher,\n Confetti,\n Handshake,\n Headset,\n Info,\n Laptop,\n MapPinLine,\n PersonSimpleWalk,\n ProjectorScreenChart,\n Star,\n UsersThree,\n Webcam,\n} from '@phosphor-icons/react';\nimport getCountryFlag from '../../utils/getCountryFlag';\nimport { BREAKPOINT_MD_QUERY } from '../../constants/breakpoints';\nimport StrapiEvent, { EventType } from '../../models/strapi/StrapiEvent';\nimport { IntlContext } from '../ContextProvider';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport isSameDate from '../../utils/isSameDate';\n\nexport interface EventCardProps {\n event: StrapiEvent;\n}\n\nconst MAX_LENGTH = 120;\nconst LOCATION_MAX_LENGTH = 28;\n\nconst getEventIcon = (eventType: string): JSX.Element => {\n switch (eventType) {\n case EventType.WEBINAR:\n return <Webcam size={12} />;\n case EventType.CONFERENCE:\n return <Headset size={12} />;\n case EventType.MEET_UP:\n return <UsersThree size={12} />;\n case EventType.FOREST_WALK:\n return <PersonSimpleWalk size={12} />;\n case EventType.PARTNER_EVENT:\n return <Handshake size={12} />;\n case EventType.LUNCH_AND_LEARN:\n return <BowlFood size={12} />;\n case EventType.FAIR:\n return <ChalkboardTeacher size={12} />;\n case EventType.FESTIVAL:\n return <Confetti size={12} />;\n case EventType.ROADSHOW:\n return <ProjectorScreenChart size={12} />;\n default:\n return <Info size={12} weight=\"fill\" />;\n }\n};\n\nexport const EventCard = ({ event }: EventCardProps): JSX.Element => {\n const { formatDate, formatNumber, formatMessage } = useContext(IntlContext);\n const [isExpanded, setIsExpanded] = useState(false);\n const [mobile] = useMediaQuery(BREAKPOINT_MD_QUERY);\n\n const toggleText = () => {\n setIsExpanded(!isExpanded);\n };\n\n const isLocationTooLong =\n (event.location?.length ?? 0) >= LOCATION_MAX_LENGTH;\n\n return (\n <Box\n borderRadius={['xl', null, null, '2xl']}\n height=\"full\"\n width=\"full\"\n border=\"1px solid var(--boemly-colors-gray-200)\"\n background=\"white\"\n >\n <Box\n position=\"relative\"\n width=\"full\"\n height={['32', null, null, '44']}\n borderTopRadius={['xl', null, null, '2xl']}\n css={css`\n & span,\n div,\n img {\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n }\n `}\n >\n <Image\n src={strapiMediaUrl(event.image?.img, 'medium')}\n alt={event.image?.alt}\n fill\n style={{\n objectFit: event.image?.objectFit || 'cover',\n }}\n />\n\n <Box\n position=\"absolute\"\n top={['6', null, null, '8']}\n right={['6', null, null, '8']}\n zIndex=\"1\"\n width={['12', null, null, '16']}\n height={['12', null, null, '16']}\n >\n <Image\n src={strapiMediaUrl(event.logo.img, 'medium')}\n alt={event.logo.alt}\n fill\n style={{\n objectFit: event.logo.objectFit || 'contain',\n borderRadius: 'var(--boemly-radii-md)',\n border:\n '1px solid, var(--whiteAlpha-700, rgba(255, 255, 255, 0.64))',\n }}\n />\n </Box>\n </Box>\n <Flex\n flexDir=\"column\"\n p={['6', null, null, '8']}\n h=\"calc(var(--boemly-sizes-full) - var(--boemly-sizes-44))\"\n >\n <Flex flexDir=\"row\" mb=\"4\" gap=\"2\" flexWrap=\"wrap\">\n {event.recommended ? (\n <Flex mb={['2', null, null, '0']}>\n <Tag backgroundColor=\"green.600\">\n <Star size={12} weight=\"fill\" color=\"white\" />\n &nbsp;\n <Text size=\"xsLowBold\" color=\"white\">\n {formatMessage({\n id: 'sections.eventCard.recommendedEvent',\n })}\n </Text>\n </Tag>\n </Flex>\n ) : (\n <></>\n )}\n <Flex flexWrap=\"wrap\" gap=\"2\">\n {event.eventTypes.map((e) => (\n <Tag key={e.id}>\n {getEventIcon(e.eventType)}&nbsp;\n <Text size=\"xsLowBold\" color=\"gray.800\">\n {formatMessage({\n id: `sections.eventCard.eventType.${e.eventType\n .toLowerCase()\n .replace(/\\s+/g, '')}`,\n })}\n </Text>\n </Tag>\n ))}\n {event.languages.map(({ id, language, countryCode }) => (\n <Tag key={id}>\n {getCountryFlag(countryCode)}&nbsp;\n <Text size=\"xsLowBold\" color=\"gray.800\">\n {language}\n </Text>\n </Tag>\n ))}\n </Flex>\n </Flex>\n <Heading>{event.title}</Heading>\n <Flex\n gap={isLocationTooLong ? '2' : ['2', null, null, '6']}\n alignItems={mobile || isLocationTooLong ? 'flex-start' : 'center'}\n my=\"4\"\n flexDir={mobile || isLocationTooLong ? 'column' : 'row'}\n >\n {event.online && (\n <Flex gap=\"2\" alignItems=\"center\">\n <Laptop size={20} color={'var(--boemly-colors-primary-700)'} />\n <Text size={['xsLowBold', null, null, 'smLowBold']}>Online</Text>\n </Flex>\n )}\n {event.location && (\n <Flex gap=\"2\" alignItems=\"center\">\n <MapPinLine\n size={20}\n color={'var(--boemly-colors-primary-700)'}\n weight=\"fill\"\n />\n <Text size={['xsLowBold', null, null, 'smLowBold']}>\n {event.location}\n </Text>\n </Flex>\n )}\n <Flex alignItems=\"center\" gap=\"2\">\n <CalendarBlank\n size={20}\n color={'var(--boemly-colors-primary-700)'}\n />\n <Text size={['xsLowBold', null, null, 'smLowBold']}>\n {formatDate(event.start, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n })}\n\n {!event.allDay &&\n ` | ${formatNumber(new Date(event.start).getUTCHours(), {\n minimumIntegerDigits: 2,\n })}:${formatNumber(new Date(event.start).getUTCMinutes(), {\n minimumIntegerDigits: 2,\n })}`}\n\n {event.end &&\n !isSameDate(new Date(event.start), new Date(event.end)) && (\n <>\n {' - '}\n {formatDate(event.end, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n })}\n\n {!event.allDay &&\n ` | ${formatNumber(new Date(event.end).getUTCHours(), {\n minimumIntegerDigits: 2,\n })}:${formatNumber(new Date(event.end).getUTCMinutes(), {\n minimumIntegerDigits: 2,\n })}`}\n </>\n )}\n\n {event.end &&\n !event.allDay &&\n isSameDate(new Date(event.start), new Date(event.end)) &&\n ` - ${formatNumber(new Date(event.end).getUTCHours(), {\n minimumIntegerDigits: 2,\n })}:${formatNumber(new Date(event.end).getUTCMinutes(), {\n minimumIntegerDigits: 2,\n })}`}\n </Text>\n </Flex>\n </Flex>\n <Text\n mb={mobile ? '0' : '7'}\n size={['xsRegularNormal', null, null, 'smRegularNormal']}\n >\n {isExpanded || !mobile\n ? event.description\n : `${event.description.substring(0, MAX_LENGTH)}...`}\n </Text>\n {event.description.length > MAX_LENGTH && mobile && (\n <Flex justifyContent=\"flex-start\">\n <Button\n mt=\"2\"\n onClick={toggleText}\n variant=\"link\"\n rightIcon={\n isExpanded ? <CaretUp size=\"12\" /> : <CaretDown size=\"12\" />\n }\n >\n {formatMessage(\n isExpanded\n ? {\n id: 'sections.eventCard.buttonShowLess',\n }\n : { id: 'sections.eventCard.buttonShowMore' }\n )}\n </Button>\n </Flex>\n )}\n <Flex\n mt={mobile ? '7' : 'auto'}\n justifyContent={mobile ? undefined : 'space-between'}\n flexDir={mobile ? 'column-reverse' : 'row'}\n gap={mobile ? '4' : '0'}\n >\n {event.button && (\n <Flex width={mobile ? 'full' : 'auto'}>\n <StrapiLinkButton\n key={event.button.id}\n size=\"md\"\n variant={event.buttonVariant}\n link={event.button}\n rightIcon={<CaretRight size=\"10\" />}\n width=\"full\"\n component=\"EventCard\"\n />\n </Flex>\n )}\n {event.speakers && event.speakers.length > 0 && (\n <Flex flexDir=\"row\" gap=\"2\">\n {event.speakers.map((speaker) => (\n <Box key={speaker.id}>\n <Box\n width={['10', null, null, '12']}\n height={['10', null, null, '12']}\n position=\"relative\"\n borderRadius=\"2xl\"\n >\n <Tooltip label={speaker.name}>\n <Image\n src={strapiMediaUrl(speaker.image.img, 'medium')}\n alt={speaker.image.alt}\n fill\n style={{\n objectFit: speaker.image.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-md)',\n border:\n '1px solid, var(--whiteAlpha-700, rgba(255, 255, 255, 0.64))',\n }}\n />\n </Tooltip>\n </Box>\n </Box>\n ))}\n </Flex>\n )}\n </Flex>\n </Flex>\n </Box>\n );\n};\n","const getCountryFlag = (countryCode: string): string => {\n return countryCode\n .toUpperCase()\n .replace(/./g, (char) => String.fromCodePoint(char.charCodeAt(0) + 127397));\n};\nexport default getCountryFlag;\n","import useSWRInfinite, { SWRInfiniteKeyLoader } from 'swr/infinite';\nimport { useCallback, useMemo } from 'react';\nimport UseInfiniteDataHookProps from './UseInfiniteDataHookProps';\nimport SWRData from '../SWRData';\nimport IStrapiResponse from '../../models/strapi/IStrapiResponse';\nimport StrapiEvent from '../strapi/StrapiEvent';\n\nconst useEvents = ({\n getKey,\n batchSize,\n}: {\n getKey: SWRInfiniteKeyLoader;\n batchSize: number;\n}): UseInfiniteDataHookProps<IStrapiResponse<StrapiEvent[]>[]> => {\n const { data, isLoading, setSize, size, mutate } = useSWRInfinite<\n SWRData<IStrapiResponse<StrapiEvent[]>>\n >(getKey, { revalidateFirstPage: false, revalidateAll: false });\n\n const count: number | undefined = useMemo(() => {\n return data?.[0]?.body?.meta?.pagination?.total || 0;\n }, [data]);\n\n const isLoadingMore = useMemo(\n () => !!(size > 0 && data && typeof data[size - 1] === 'undefined'),\n [size, data]\n );\n\n const loadMore = useCallback(() => setSize(size + 1), [setSize, size]);\n\n const canLoadMore = useMemo(\n () => count !== undefined && size * batchSize < count,\n [count, size, batchSize]\n );\n\n return {\n data: data as any,\n isLoading,\n isLoadingMore,\n canLoadMore,\n refetch: mutate,\n loadMore,\n count,\n };\n};\n\nexport default useEvents;\n","import { useRouter } from 'next/router';\nimport React, { useEffect } from 'react';\n\nexport interface RedirectProps {\n slice: {\n url: string;\n };\n}\n\nexport const Redirect = ({ slice }: RedirectProps): JSX.Element => {\n const router = useRouter();\n useEffect(() => {\n // When using `replace`, the current browser history entry will be replaced\n router.replace(slice.url);\n }, [slice.url]);\n\n return <></>;\n};\n","import React from 'react';\nimport { BoemlyAlert, Box } from 'boemly';\n\nexport const PreviewAlert = (): JSX.Element => {\n return (\n <Box position=\"fixed\" top=\"4\" left=\"4\">\n <BoemlyAlert text=\"Preview\" status=\"error\" />\n </Box>\n );\n};\n","import React from 'react';\nimport FullWidthImage from '../../slices/FullWidthImage';\nimport Hero from '../../slices/Hero';\nimport IconGrid from '../../slices/IconGrid';\nimport ImageGrid from '../../slices/ImageGrid';\nimport ImageTextSequence from '../../slices/ImageTextSequence';\nimport LeftTextRightCard from '../../slices/LeftTextRightCard';\nimport LogoGridWithText from '../../slices/LogoGridWithText';\nimport MapHero from '../../slices/MapHero';\nimport QAndA from '../../slices/QAndA';\nimport QuoteCards from '../../slices/QuoteCards';\nimport RichTextSection from '../../slices/RichTextSection';\nimport Steps from '../../slices/Steps';\nimport TextCardGrid from '../../slices/TextCardGrid';\nimport TextCarousel from '../../slices/TextCarousel';\nimport TextWithTextCards from '../../slices/TextWithTextCards';\nimport TextWithCard from '../../slices/TextWithCard';\nimport LinkCardsGrid from '../../slices/LinkCardsGrid';\nimport SmallHero from '../../slices/SmallHero';\nimport Blog from '../../slices/Blog';\nimport StrapiBlogPost from '../../models/strapi/StrapiBlogPost';\nimport ProjectsGrid from '../../slices/ProjectsGrid';\nimport ProjectsMap from '../../slices/ProjectsMap';\nimport Video from '../../slices/Video';\nimport FullWidthHighlightQuote from '../../slices/FullWidthHighlightQuote';\nimport FullWidthImageSlider from '../../slices/FullWidthImageSlider';\nimport SideBySideImages from '../../slices/SideBySideImages';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport Cta from '../../slices/Cta';\nimport CtaOnly from '../../slices/CtaOnly';\nimport Glossary from '../../slices/Glossary';\nimport ShopCheckout from '../../slices/ShopCheckout';\nimport Facts from '../../slices/Facts';\nimport BlogCards from '../../slices/BlogCards';\nimport PortfolioProject from '../../models/PortfolioProject';\nimport ProjectFacts from '../../slices/ProjectFacts';\nimport CustomerStories from '../../slices/CustomerStories';\nimport StrapiCustomerStory from '../../models/strapi/StrapiCustomerStory';\nimport Comparison from '../../slices/Comparison';\nimport CarouselMarqueeBanner from '../../slices/CarouselMarqueeBanner';\nimport Locale from '../../models/Locale';\nimport { ContextProvider } from '../ContextProvider';\nimport Timeline from '../../slices/Timeline';\nimport Events from '../../slices/Events';\nimport Redirect from '../../slices/Redirect';\nimport { AnalyticsFunction } from '../ContextProvider/ContextProvider';\n\nexport interface CustomSliceProps {\n slice: any;\n id: string;\n}\n\nexport interface SliceRendererProps {\n slices: any;\n blogPosts: IStrapiData<StrapiBlogPost>[];\n projects: PortfolioProject[];\n customerStories: IStrapiData<StrapiCustomerStory>[];\n locale?: Locale;\n CustomSlice?: ({ slice, id }: CustomSliceProps) => JSX.Element;\n analyticsFunction?: AnalyticsFunction;\n}\n\nexport const SliceRenderer = ({\n slices,\n blogPosts,\n projects,\n customerStories,\n locale = 'en',\n CustomSlice,\n analyticsFunction,\n}: SliceRendererProps): JSX.Element => (\n <ContextProvider locale={locale} analyticsFunction={analyticsFunction}>\n {slices.map((slice: any) => {\n switch (slice.__component) {\n case 'sections.hero':\n return (\n <Hero key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.map-hero':\n return (\n <MapHero key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.rich-text':\n return (\n <RichTextSection\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.left-text-right-card':\n return (\n <LeftTextRightCard\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.text-with-card':\n return (\n <TextWithCard\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n projects={projects}\n />\n );\n case 'sections.logo-grid-with-text':\n return (\n <LogoGridWithText\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.quote-cards':\n return (\n <QuoteCards\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.q-and-a':\n return (\n <QAndA key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.image-grid':\n return (\n <ImageGrid key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.full-width-image':\n return (\n <FullWidthImage\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.text-with-text-cards':\n return (\n <TextWithTextCards\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.text-card-grid':\n return (\n <TextCardGrid\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.icon-grid':\n return (\n <IconGrid key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.image-text-sequence':\n return (\n <ImageTextSequence\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.steps':\n return (\n <Steps key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.text-carousel':\n return (\n <TextCarousel\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.link-cards-grid':\n return (\n <LinkCardsGrid\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.small-hero':\n return (\n <SmallHero\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n theme=\"dark\"\n />\n );\n case 'sections.small-hero-light':\n return (\n <SmallHero\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n theme=\"light\"\n />\n );\n case 'sections.project-facts':\n return (\n <ProjectFacts\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n project={projects.find((p) => p.id === slice.projectId)}\n />\n );\n case 'sections.projects-grid':\n return (\n <ProjectsGrid\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n projects={projects}\n />\n );\n case 'sections.projects-map':\n return (\n <ProjectsMap\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.video':\n return (\n <Video key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.full-width-highlight-quote':\n return (\n <FullWidthHighlightQuote\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.full-width-image-slider':\n return (\n <FullWidthImageSlider\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.side-by-side-images':\n return (\n <SideBySideImages\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.cta-only':\n return (\n <CtaOnly key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.cta':\n return <Cta key={`${slice.__component}-${slice.id}`} slice={slice} />;\n case 'sections.shop-checkout':\n return (\n <ShopCheckout\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.facts':\n return (\n <Facts key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.blog-cards':\n return (\n <BlogCards\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n blogPosts={blogPosts}\n />\n );\n case 'sections.blog':\n return (\n <Blog\n key={`${slice.__component}-${slice.id}`}\n slice={{\n ...slice,\n blog_posts: slice.blog_posts.data,\n }}\n blogPosts={blogPosts}\n />\n );\n case 'sections.glossary':\n return (\n <Glossary\n key={`${slice.__component}-${slice.id}`}\n slice={{\n ...slice,\n glossary_items: slice.glossary_items.data,\n }}\n />\n );\n case 'sections.customer-stories':\n return (\n <CustomerStories\n key={`${slice.__component}-${slice.id}`}\n slice={{\n ...slice,\n customer_stories: slice.customer_stories.data,\n }}\n customerStories={customerStories}\n />\n );\n case 'sections.comparison':\n return (\n <Comparison\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.timeline':\n return (\n <Timeline key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.carousel-marquee-banner':\n return (\n <CarouselMarqueeBanner\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.events':\n return (\n <Events key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.redirect':\n return (\n <Redirect key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n default:\n if (CustomSlice) {\n return (\n <CustomSlice\n key={`${slice.__component}-${slice.id}`}\n id={slice.__component}\n slice={slice}\n />\n );\n }\n\n return (\n <div key={`${slice.__component}-${slice.id}`}>\n Slice component not supported\n </div>\n );\n }\n })}\n </ContextProvider>\n);\n","import { GetStaticPropsContext } from 'next';\nimport strapiMediaUrl from './strapiMediaUrl';\nimport {\n IStrapiData,\n StrapiBlogPost,\n StrapiBlogPostProps,\n StrapiGlobal,\n} from '..';\nimport PortfolioProject from '../models/PortfolioProject';\nimport { DEFAULT_SHARE_ALT, DEFAULT_SHARE_IMAGE } from '../constants/metadata';\nimport {\n SLICES_WITH_BLOG_POSTS,\n SLICES_WITH_PROJECTS,\n} from '../constants/slicesConfig';\n\nconst mergeGlobalAndStrapiBlogPostData = (\n context: GetStaticPropsContext,\n global: IStrapiData<StrapiGlobal>,\n post: IStrapiData<StrapiBlogPost>,\n blog: IStrapiData<StrapiBlogPost>[],\n projects: PortfolioProject[]\n): StrapiBlogPostProps => {\n const metaShareImageUrl = post.attributes.metadata?.shareImage\n ? strapiMediaUrl(\n post.attributes.metadata?.shareImage.media ??\n global.attributes.metadata.shareImage?.media,\n 'large'\n )\n : DEFAULT_SHARE_IMAGE;\n\n const schemaMarkupTypes =\n post.attributes.metadata?.schemaMarkupTypes ??\n global.attributes.metadata?.schemaMarkupTypes ??\n [];\n\n const returnBlog = post.attributes.slices.some((slice) =>\n SLICES_WITH_BLOG_POSTS.includes(slice.__component)\n );\n const returnProjects = post.attributes.slices.some((slice) =>\n SLICES_WITH_PROJECTS.includes(slice.__component)\n );\n\n return {\n ...post,\n // Portfolio Projects\n projects: returnProjects ? projects : [],\n // StrapiBlogPost\n attributes: {\n ...post?.attributes,\n metadata: post?.attributes?.metadata || global.attributes.metadata,\n },\n // PageProps\n headerType: {\n extendable: true,\n theme: 'light',\n },\n headerNavMenus: global.attributes.navbar.navMenus || [],\n headerButtons: global.attributes.navbar.buttons || [],\n footerLinks: global.attributes.footer.links || [],\n metadata: {\n title:\n post.attributes.metadata?.title ?? global.attributes.metadata.title,\n description:\n post.attributes.metadata?.description ??\n global.attributes.metadata.description,\n shareImage: {\n url: metaShareImageUrl,\n alt:\n post.attributes.metadata?.shareImage?.alt ??\n global.attributes.metadata.shareImage?.alt ??\n DEFAULT_SHARE_ALT,\n },\n metaTitleSuffix: global.attributes.metaTitleSuffix,\n favicon: strapiMediaUrl(global.attributes.favicon, 'thumbnail'),\n schemaMarkupTypes,\n },\n slices: post?.attributes.slices,\n blogPosts: returnBlog ? blog : [],\n banner: global.attributes.banner,\n topBanner: post?.attributes.topBanner || global.attributes.topBanner,\n customerStories: [],\n preview: !!context.preview,\n isFallbackLocale: context.locale !== post.attributes.locale,\n };\n};\n\nexport default mergeGlobalAndStrapiBlogPostData;\n","import { GetStaticPropsContext } from 'next';\nimport strapiMediaUrl from './strapiMediaUrl';\nimport {\n IStrapiData,\n StrapiCustomerStory,\n StrapiCustomerStoryProps,\n StrapiGlobal,\n} from '..';\nimport { DEFAULT_SHARE_ALT, DEFAULT_SHARE_IMAGE } from '../constants/metadata';\nimport { SLICES_WITH_CUSTOMER_STORIES } from '../constants/slicesConfig';\n\nconst mergeGlobalAndStrapiCustomerStoryData = (\n context: GetStaticPropsContext,\n global: IStrapiData<StrapiGlobal>,\n customerStory: IStrapiData<StrapiCustomerStory>,\n customerStories: IStrapiData<StrapiCustomerStory>[]\n): StrapiCustomerStoryProps => {\n const metaShareImageUrl = customerStory.attributes.metadata?.shareImage\n ? strapiMediaUrl(\n customerStory.attributes.metadata?.shareImage.media ??\n global.attributes.metadata.shareImage?.media,\n 'large'\n )\n : DEFAULT_SHARE_IMAGE;\n\n const schemaMarkupTypes =\n customerStory.attributes.metadata?.schemaMarkupTypes ??\n global.attributes.metadata?.schemaMarkupTypes ??\n [];\n\n const returnCustomerStories = customerStory.attributes.slices.some((slice) =>\n SLICES_WITH_CUSTOMER_STORIES.includes(slice.__component)\n );\n\n return {\n ...customerStory,\n // Portfolio Projects\n projects: [],\n attributes: {\n ...customerStory?.attributes,\n metadata:\n customerStory?.attributes?.metadata || global.attributes.metadata,\n },\n // PageProps\n headerType: {\n extendable: true,\n theme: 'light',\n },\n headerNavMenus: global.attributes.navbar.navMenus || [],\n headerButtons: global.attributes.navbar.buttons || [],\n footerLinks: global.attributes.footer.links || [],\n metadata: {\n title:\n customerStory.attributes.metadata?.title ??\n global.attributes.metadata.title,\n description:\n customerStory.attributes.metadata?.description ??\n global.attributes.metadata.description,\n shareImage: {\n url: metaShareImageUrl,\n alt:\n customerStory.attributes.metadata?.shareImage?.alt ??\n global.attributes.metadata.shareImage?.alt ??\n DEFAULT_SHARE_ALT,\n },\n metaTitleSuffix: global.attributes.metaTitleSuffix,\n favicon: strapiMediaUrl(global.attributes.favicon, 'thumbnail'),\n schemaMarkupTypes,\n },\n slices: customerStory?.attributes.slices,\n customerStories: returnCustomerStories ? customerStories : [],\n banner: global.attributes.banner,\n topBanner:\n customerStory?.attributes.topBanner || global.attributes.topBanner,\n blogPosts: [],\n preview: !!context.preview,\n isFallbackLocale: context.locale !== customerStory.attributes.locale,\n };\n};\n\nexport default mergeGlobalAndStrapiCustomerStoryData;\n","import { GetStaticPropsContext } from 'next';\nimport strapiMediaUrl from './strapiMediaUrl';\nimport {\n IStrapiData,\n StrapiBlogPost,\n StrapiCustomerStory,\n StrapiGlobal,\n StrapiPage,\n StrapiPageProps,\n} from '..';\nimport PortfolioProject from '../models/PortfolioProject';\nimport {\n DARK_THEME_HEADER_SECTIONS,\n EXTENDABLE_HEADER_SECTIONS,\n SLICES_WITH_BLOG_POSTS,\n SLICES_WITH_CUSTOMER_STORIES,\n SLICES_WITH_PROJECTS,\n} from '../constants/slicesConfig';\nimport { DEFAULT_SHARE_ALT, DEFAULT_SHARE_IMAGE } from '../constants/metadata';\n\nconst mergeGlobalAndStrapiPageData = (\n context: GetStaticPropsContext,\n global: IStrapiData<StrapiGlobal>,\n page: IStrapiData<StrapiPage>,\n blogPosts: IStrapiData<StrapiBlogPost>[],\n customerStories: IStrapiData<StrapiCustomerStory>[],\n projects: PortfolioProject[]\n): StrapiPageProps => {\n const metaShareImageUrl = page.attributes.metadata?.shareImage\n ? strapiMediaUrl(\n page.attributes.metadata?.shareImage.media ??\n global.attributes.metadata.shareImage?.media,\n 'large'\n )\n : DEFAULT_SHARE_IMAGE;\n\n const schemaMarkupTypes =\n page.attributes.metadata?.schemaMarkupTypes ??\n global.attributes.metadata?.schemaMarkupTypes ??\n [];\n\n const returnBlogPosts = page.attributes.slices.some((slice) =>\n SLICES_WITH_BLOG_POSTS.includes(slice.__component)\n );\n const returnCustomerStories = page.attributes.slices.some((slice) =>\n SLICES_WITH_CUSTOMER_STORIES.includes(slice.__component)\n );\n const returnProjects = page.attributes.slices.some((slice) =>\n SLICES_WITH_PROJECTS.includes(slice.__component)\n );\n\n return {\n ...page,\n // Portfolio Projects\n projects: returnProjects ? projects : [],\n // StrapiPage\n attributes: {\n ...page?.attributes,\n metadata: page?.attributes?.metadata ?? global.attributes.metadata,\n },\n // PageProps\n headerType: {\n extendable: EXTENDABLE_HEADER_SECTIONS.includes(\n page.attributes.slices[0]?.__component\n ),\n theme: DARK_THEME_HEADER_SECTIONS.includes(\n page.attributes.slices[0]?.__component\n )\n ? 'dark'\n : 'light',\n },\n headerNavMenus: global.attributes.navbar.navMenus || [],\n headerButtons: global.attributes.navbar.buttons || [],\n footerLinks: global.attributes.footer.links || [],\n metadata: {\n title:\n page.attributes.metadata?.title ?? global.attributes.metadata.title,\n description:\n page.attributes.metadata?.description ??\n global.attributes.metadata.description,\n shareImage: {\n url: metaShareImageUrl,\n alt:\n page.attributes.metadata?.shareImage?.alt ??\n global.attributes.metadata.shareImage?.alt ??\n DEFAULT_SHARE_ALT,\n },\n metaTitleSuffix: global.attributes.metaTitleSuffix,\n favicon: strapiMediaUrl(global.attributes.favicon, 'thumbnail'),\n schemaMarkupTypes,\n },\n slices: page?.attributes.slices,\n blogPosts: returnBlogPosts ? blogPosts : [],\n banner: global.attributes.banner,\n topBanner: page?.attributes.topBanner || global.attributes.topBanner,\n customerStories: returnCustomerStories ? customerStories : [],\n preview: !!context.preview,\n isFallbackLocale: context.locale !== page.attributes.locale,\n };\n};\n\nexport default mergeGlobalAndStrapiPageData;\n","import { GetStaticPropsContext } from 'next';\nimport strapiMediaUrl from './strapiMediaUrl';\nimport {\n IStrapiData,\n StrapiBlogPost,\n StrapiGlobal,\n StrapiProject,\n StrapiProjectProps,\n} from '..';\nimport PortfolioProject from '../models/PortfolioProject';\nimport {\n DARK_THEME_HEADER_SECTIONS,\n EXTENDABLE_HEADER_SECTIONS,\n SLICES_WITH_BLOG_POSTS,\n SLICES_WITH_PROJECTS,\n} from '../constants/slicesConfig';\nimport { DEFAULT_SHARE_ALT, DEFAULT_SHARE_IMAGE } from '../constants/metadata';\n\nconst mergeGlobalAndStrapiProject = (\n context: GetStaticPropsContext,\n global: IStrapiData<StrapiGlobal>,\n project: IStrapiData<StrapiProject>,\n blogPosts: IStrapiData<StrapiBlogPost>[],\n projects: PortfolioProject[]\n): StrapiProjectProps => {\n const metaShareImageUrl = project.attributes.metadata?.shareImage\n ? strapiMediaUrl(\n project.attributes.metadata?.shareImage.media ??\n global.attributes.metadata.shareImage?.media,\n 'large'\n )\n : DEFAULT_SHARE_IMAGE;\n\n const schemaMarkupTypes =\n project.attributes.metadata?.schemaMarkupTypes ??\n global.attributes.metadata?.schemaMarkupTypes ??\n [];\n\n const returnBlogPosts = project.attributes.slices.some((slice) =>\n SLICES_WITH_BLOG_POSTS.includes(slice.__component)\n );\n const returnProjects = project.attributes.slices.some((slice) =>\n SLICES_WITH_PROJECTS.includes(slice.__component)\n );\n\n return {\n ...project,\n // Portfolio Projects\n projects: returnProjects ? projects : [],\n // StrapiProject\n attributes: {\n ...project.attributes,\n metadata: project?.attributes?.metadata || global.attributes.metadata,\n },\n headerType: {\n extendable: EXTENDABLE_HEADER_SECTIONS.includes(\n project.attributes.slices[0]?.__component\n ),\n theme: DARK_THEME_HEADER_SECTIONS.includes(\n project.attributes.slices[0]?.__component\n )\n ? 'dark'\n : 'light',\n },\n // PageProps\n headerNavMenus: global.attributes.navbar.navMenus || [],\n headerButtons: global.attributes.navbar.buttons || [],\n footerLinks: global.attributes.footer.links || [],\n metadata: {\n title:\n project.attributes.metadata?.title ?? global.attributes.metadata.title,\n description:\n project.attributes.metadata?.description ??\n global.attributes.metadata.description,\n shareImage: {\n url: metaShareImageUrl,\n alt:\n project.attributes.metadata?.shareImage?.alt ??\n global.attributes.metadata.shareImage?.alt ??\n DEFAULT_SHARE_ALT,\n },\n metaTitleSuffix: global.attributes.metaTitleSuffix,\n favicon: strapiMediaUrl(global.attributes.favicon, 'thumbnail'),\n schemaMarkupTypes,\n },\n slices: project.attributes.slices,\n blogPosts: returnBlogPosts ? blogPosts : [],\n banner: global.attributes.banner,\n topBanner: project?.attributes.topBanner || global.attributes.topBanner,\n customerStories: [],\n preview: !!context.preview,\n isFallbackLocale: context.locale !== project.attributes.locale,\n };\n};\n\nexport default mergeGlobalAndStrapiProject;\n"],"names":["STRAPI_URI","process","env","NEXT_PUBLIC_STRAPI_URI","STRAPI_DEFAULT_PAGE_SIZE","STRAPI_DEFAULT_POPULATE_DEPTH","STRAPI_FALLBACK_LOCALE","strapiClient","setupCache","axios","default","create","baseURL","headers","paramsSerializer","p","qs","stringify","encodeValuesOnly","timeout","ttl","includes","getAllSlugsFromStrapi","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","path","locales","_temp","_ref2$filters","filters","slugPromises","allSlugs","missingLocales","wrap","_context","prev","next","map","locale","get","params","then","response","data","page","slug","attributes","error","_error$response","status","Promise","all","sent","flat","flatMap","filter","fallbackSlug","some","_extends","abrupt","concat","stop","_x","_x2","_x3","apply","this","arguments","ShapePosition","FPM_API_URI","NEXT_PUBLIC_FPM_API_URI","CDN_URI","fpmClient","getStrapiProjects","pLevel","preview","cache","strapiParams","strapiProjects","_yield$Promise$all","_i","_arr","project","undefined","Map","length","fpmProjectId","set","t0","console","warn","getPortfolioProjects","fpmProjects","fpmProject","_strapiProject$attrib","strapiProject","id","toReturn","thumbnail","portfolio","host","portfolioHost","getStrapiCollectionType","_ref2","key","_ref$locale","_ref$preview","_ref$filters","sharedParams","requestedLocaleData","results","_error$response2","fallbackLocaleDataEntry","find","localized","getStrapiSingleType","isAxiosError","strapiMediaUrl","media","preferredSize","_media$data$attribute","url","ext","formats","indexOf","DEFAULT_SHARE_IMAGE","DEFAULT_SHARE_ALT","EXTENDABLE_HEADER_SECTIONS","DARK_THEME_HEADER_SECTIONS","SLICES_WITH_BLOG_POSTS","SLICES_WITH_CUSTOMER_STORIES","SLICES_WITH_PROJECTS","strapiLinkUrl","strapiLink","_strapiLink","_strapiLink2","getSchemaProperty","schema","property","value","text","ZoomableImage","image","_ref$zoom","zoom","_useState","useState","isZoomed","setIsZoomed","_useState2","backgroundPos","setBackgroundPos","imageSrc","img","zoomInPosition","e","zoomer","currentTarget","getBoundingClientRect","clientX","x","width","y","clientY","height","React","createElement","Fragment","Head","rel","as","href","Box","position","display","overflow","flexShrink","scrollSnapAlign","scrollSnapStop","draggable","cursor","backgroundImage","backgroundSize","backgroundPosition","onClick","toggleZoomImage","handleClick","onMouseMove","handleMove","Image","src","alt","fill","style","visibility","objectFit","FullScreenImage","images","isOpen","onClose","_ref$currentIndex","currentIndex","setCurrentIndex","containerRef","useRef","useLockBodyScroll","canMoveRight","useMemo","canMoveLeft","onRight","useCallback","c","onLeft","useKey","useEffect","setTimeout","_containerRef$current","current","scrollTo","left","clientWidth","behavior","BoemlyModal","title","trigger","size","content","Flex","insetY","insetX","alignItems","justifyContent","ref","flexGrow","flexBasis","gap","marginX","scrollSnapType","inset","pointerEvents","IconButton","icon","CaretLeft","variant","mr","CaretRight","ml","BREAKPOINT_MD","BREAKPOINT_LG","BREAKPOINT_MD_QUERY","BREAKPOINT_LG_QUERY","FullWidthImage","slice","setIsOpen","isMobile","useMediaQuery","DefaultSectionContainer","Wrapper","DefaultSectionHeader","isHero","tagline","taglineProps","textAlign","mt","titleProps","maxW","textProps","borderRadius","GLOBAL_STYLE","css","_templateObject","_taggedTemplateLiteralLoose","rootMessagesDe","creditsAvailableBadgeMessagesDe","messages","en","creditsAvailableBadgeMessagesEn","de","getMessages","messagesLocale","Object","keys","AnalyticsContext","createContext","createIntlCache","intlFactory","createIntl","IntlContext","ContextProvider","children","analyticsFunction","fetcher","resource","init","errorData","message","Error","t1","t2","body","SWRConfig","Global","styles","Provider","StrapiLinkButton","link","_ref$component","component","buttonProps","_objectWithoutPropertiesLoose","_excluded","adBlockDetected","useDetectAdBlock","useContext","buttonUrl","intercomLauncher","type","props","action","buttonText","Button","Link","w","window","HubSpotConversations","widget","open","hsConversationsOnReady","Hero","minHeight","backgroundColor","overflowX","Gradient","shape","bottom","borderTopRightRadius","right","top","transform","subTitle","color","mx","button","additionalButtons","IconGrid","flexDirection","Spacer","h","SimpleGrid","columns","iconsWithTextAndButton","rowGap","iconWithTextAndButton","margin","Heading","mb","Text","LinkedInIcon","viewBox","xmlns","clipPath","d","StrapiLinkButtonWithIcon","rightIcon","destination","Globe","getLinkIcon","ImageGrid","_useToken","useToken","minChildWidth","links","flexDir","flexWrap","ImageTextSequence","oneColumnGrid","primary50","gray700","background","imageTextRows","index","imageBox","LeftTextRightCard","push","useRouter","Grid","templateColumns","templateRows","GridItem","colSpan","rowSpan","pr","checkMarkLabels","BoemlyList","listItems","colorScheme","ArrowRight","card","PortfolioCard","_slice$card","_slice$card5","_slice$card2","_slice$card3","_slice$card4","cardTitle","facts","portfolioNumber","LogoGridWithText","RichText","logos","logo","MapHeroContainer","styled","MapHeroTextContainer","_templateObject2","ShapeContainer","_templateObject3","MapContainer","_templateObject4","MapGradient","_templateObject5","MapHero","belowBreakpoint","maxWidth","buttons","mobileMap","convertToKebabCase","str","matches","match","toLowerCase","join","VARIANTS","gray","tagLineColor","textColor","accordionVariant","otherQuestionsBackground","green","white","QAndA","_slice$variant","pb","hero","paddingY","maxHeight","paddingTop","paddingRight","overflowY","BoemlyAccordion","rows","questionsAndAnswers","defaultIndex","padding","otherQuestions","HeroCard","_slice$hero","section","QuoteCards","paddingBottom","shapes","Shape","radius","cards","QuoteCard","avatar","name","description","marginTop","RichTextSection","Steps","_slice$card$shapes","gray900","Array","steps","stepRefs","setStepRefs","stepProgress","setStepProgress","offsetY","useWindowScroll","windowHeight","useWindowSize","createRef","containerOffsetTop","offsetTop","_ref$current","currentItemOffsetTop","Center","step","options","forceBlock","marginBottom","borderLeft","opacity","borderRight","transition","ShapesCard","CreditAvailability","shapePositions","topLeft","bottomRight","topRight","bottomLeft","oppositesOfCorners","_oppositesOfCorners","unset","variants","positionIcon","TextCardGrid","justifyItems","zIndex","boxShadow","borderBottomRightRadius","borderBottomLeftRadius","borderTopLeftRadius","listProps","textSize","buttonIndex","weight","CarouselContainer","CarouselInnerContainer","motion","div","numberOfItems","CardContainer","TextCarousel","_useMeasure","useMeasure","itemRef","itemWidth","formatMessage","windowWidth","slides","displaySlides","setDisplaySlides","sliderIndex","setSliderIndex","sliderItemsWidth","offsetLeft","allowScroll","ITEM_GAP","_slice$isShuffled","isShuffled","slidesCopy","i","j","Math","floor","random","shuffleElements","animate","duration","ease","TextCardWithIcon","handleSlidesButtonClick","displayAs","py","px","AnimatePresence","initial","exit","ArrowLeft","TextWithTextCards","handleContactButtonClick","_slice$contact","contact","ContactArea","FORMAT_AS_HECTARE_CONFIG","unit","unitDisplay","maximumFractionDigits","FORMAT_AS_PERCENT_CONFIG","MapBoxStyle","CreditsAvailableBadge","_variants","CREDITS_AVAILABLE","NO_CREDITS_AVAILABLE","SOME_CREDITS_AVAILABLE","SOON_CREDITS_AVAILABLE","NextLink","Tag","ProjectGridCard","_project$thumbnail","_project$thumbnail2","_project$thumbnail3","_useContext","formatNumber","Container","my","friendlyName","area","location","certificationDate","year","Date","getFullYear","creditAvailability","TextWithCard","portfolioProject","projects","_slice$project","cardPosition","ProjectCard","footerSubTitle","footerTitle","columnGap","LinkCardsGrid","borderStyle","borderWidth","borderColor","transitionDuration","MEDIUM_TRANSITION_DURATION","_hover","minWidth","colors","dark","light","SmallHero","theme","gradient","tags","direction","justify","BlogItemContainer","ImageContainer","Blog","blogPosts","formatDate","sortedBlogPosts","blog_posts","sort","a","b","createdAt","getTime","spacingX","spacingY","blogPost","bp","category","teaser","DatePersonPair","date","person","author","ConditionalWrapper","condition","wrapper","ProjectsGrid","filteredProjects","passHref","legacyBehavior","mapboxStyle","getFpmProjectsByBbox","bbox","_bbox$split$map","west","south","east","north","split","Number","fpmResponse","mergeProjectData","featureCollection","features","feature","_feature$properties","properties","mapboxgl","accessToken","CtaCardType","FALLBACK_BBOX","ProjectsMap","mapContainer","animationIntervalRef","setFeatureCollection","isLoading","setIsLoading","initialBboxRef","_useState3","isMapReady","setIsMapReady","_useState4","setStrapiProjects","isBboxContained","innerBbox","outerBbox","_innerBbox$split$map","innerWest","innerSouth","innerEast","innerNorth","_outerBbox$split$map","fetchStrapiData","fetchProjectsData","_ref3","_callee2","fpmData","mergedData","_context2","finish","debouncedUpdateBbox","debounce","bounds","getBounds","newBbox","getWest","getSouth","getEast","getNorth","addProjectsLayer","isStyleLoaded","filteredFeatureCollection","isPublic","source","getSource","setData","addSource","cluster","clusterMaxZoom","clusterRadius","addLayer","paint","clearInterval","setInterval","now","pulseFactor","sin","PI","setPaintProperty","layout","fetch","svgText","modifiedSvg","replace","btoa","resolve","reject","onload","onerror","canvas","document","ctx","getContext","drawImage","pngImg","toDataURL","_map$current","_map$current2","addImage","pixelRatio","popup","Popup","closeButton","closeOnClick","className","offset","textContent","head","appendChild","on","getCanvas","coordinates","geometry","_e$features$0$propert","projectDeveloper","developer","_JSON$parse$name","_JSON$parse","JSON","parse","_unused","projectUrl","badgeColor","getBadgeColor","badgeMessage","getBadgeMessage","abs","lngLat","lng","setOffset","setLngLat","setHTML","addTo","_map$current3","_map$current4","queryRenderedFeatures","point","layers","clusterId","cluster_id","getClusterExpansionZoom","err","easeTo","center","initialCenter","initialZoom","defaultCenterCoordinates","defaultZoomLevel","longitude","latitude","LngLatBounds","getCenter","lat","container","maxZoom","addControl","NavigationControl","_map$current5","_bbox$split$map2","fitBounds","_map$current6","cancel","remove","_slice$defaultCenterC","navigator","geolocation","getCurrentPosition","userLoc","coords","lon","_map$current7","Video","youTubeID","frameBorder","allow","allowFullScreen","FullWidthHighlightQuote","quote","AvatarWithName","avatarWithName","orientation","SliderContainer","SliderInnerContainer","ItemContainer","aspectRatio","ALLOWED_RATIOS","getClosestRatio","ratio","minDiff","posMinDiff","forEach","allowedRatio","FullWidthImageSlider","imageRef","imageWidth","imageCount","noOfLines","fontSize","caption","SideBySideImages","EventType","STATES","paddingTagline","paddingTitle","buttonJustifyContent","textMarginLeft","textMarginRight","centerWithoutImage","centerWithImage","taglineColor","titleColor","subTitleColor","Cta","ctaCards","ctaCard","ctaCardType","CenterWithImage","CenterWithoutImage","Left","Right","getTypeOfCard","elevation","backgroundShape","marginLeft","marginRight","paddingX","fontFamily","fontWeight","lineHeight","CtaOnly","Glossary","copyToClipboard","useCopyToClipboard","grouped","copiedItem","setCopiedItem","glossary_items","localeCompare","curr","_curr$attributes$titl","at","toUpperCase","handleAnchorClick","_window","currentUrl","entries","letter","items","placeSelf","spacing","item","wordBreak","scrollMarginTop","Check","LinkIcon","_onClick","Divider","ShopCheckout","validateForm","values","errors","contributionValue","currency","shadow","badge","Badge","textTransform","whiteSpace","checkoutText","LabelNumberPair","label","number","pricePerKg","Formik","initialValues","initialContributionValue","validate","onSubmit","checkoutURL","URL","currentURL","searchParams","append","batchId","toString","pathname","couponId","touched","handleSubmit","summaryPrice","Form","Field","_ref4","BoemlyFormControl","inputProps","field","rightAddonsOrElements","InputRightAddon","isInvalid","errorMessage","minimumFractionDigits","taxInPercent","factKeyColor","factValueColor","Facts","fact","sortByCreatedAt","BlogCards","mobile","blogPostsToDisplay","_slice$blogPostCatego","blogPostCategory","_blogPost$attributes$","_slice$blogPostCatego2","_blogPost$attributes$2","calculateTaxIncludedValue","parseInt","contributionValueCurrency","isNaN","SmallCheckout","subtitle","contributionValueTons","setValues","_ref5","onChange","target","valueAsNumber","_ref6","ProjectInfo","amount","start","end","monthsDifference","yearsDifference","areaInM2","subtitles","LabelTextPair","areaSubtitle","locationSubtitle","month","startSubtitle","years","getMonth","timeSpanSubtitle","projectType","verificationStandard","projectTypeSubtitle","projectDeveloperSubtitle","defaultMessage","verificationStandardSubtitle","defaultIssuer","logoUrl","averageSellableAmountPerYear","riskBuffer","Tooltip","averageSellableAmountPerYearSubtitle","riskBufferSubtitle","DocumentsDownloadList","documentUrls","documentUrl","FilePdf","DownloadSimple","Contact","border","getFpmProjectById","projectId","ProjectFacts","enhancedProject","setEnhancedProject","fetchCompleteProjectData","mergedProject","customTitle","customSubtitle","customButton","contactTitle","contactText","contactButton","contactAvatar","CustomerCard","customerStory","borderTopRadius","cardImage","pt","customerCardCustomerIndustry","CustomerQuoteCard","customerName","quoteCardCustomerTitle","quoteCardQuote","LogoCard","marginY","CustomerStories","customerStories","customer_stories","cs","BULLET_POINT_VARIANTS","bulletPointColor","Icon","X","factColor","dividerColor","Comparison","comparisonCards","comparisonCard","factTitle","factSubtitle","lists","list","logoCount","LogoGrid","CarouselMarqueeBannerContent","_useWindowSize","hasEnoughLogosForLoop","logosToRender","from","emblaRef","useEmblaCarousel","loop","align","containScroll","dragFree","AutoScroll","playOnInit","speed","stopOnInteraction","stopOnMouseEnter","stopOnFocusIn","CarouselMarqueeBanner","showChild","setShowChild","Timeline","visibleItems","setVisibleItems","timelineItems","alignContent","gridTemplateColumns","backgroundShapes","prevVisibleItems","m","Sort","isSameDate","date1","date2","getDate","EventCard","_event$location$lengt","_event$location","_event$image","_event$image2","_event$image3","event","isExpanded","setIsExpanded","isLocationTooLong","recommended","Star","eventTypes","eventType","WEBINAR","Webcam","CONFERENCE","Headset","MEET_UP","UsersThree","FOREST_WALK","PersonSimpleWalk","PARTNER_EVENT","Handshake","LUNCH_AND_LEARN","BowlFood","FAIR","ChalkboardTeacher","FESTIVAL","Confetti","ROADSHOW","ProjectorScreenChart","Info","getEventIcon","languages","language","countryCode","char","String","fromCodePoint","charCodeAt","online","Laptop","MapPinLine","CalendarBlank","day","allDay","getUTCHours","minimumIntegerDigits","getUTCMinutes","substring","CaretUp","CaretDown","buttonVariant","speakers","speaker","useEvents","batchSize","_useSWRInfinite","useSWRInfinite","getKey","revalidateFirstPage","revalidateAll","setSize","mutate","count","_data$","meta","pagination","total","isLoadingMore","loadMore","canLoadMore","refetch","Events","eventTypeFilter","setEventTypeFilter","languageFilter","setLanguageFilter","NEWEST_FIRST","setSort","allEventTypeOptions","setAllEventTypeOptions","_useState5","allLanguageOptions","setAllLanguageOptions","toISOString","buildEventsUrl","startFilter","OLDEST_FIRST","search","getUpcomingKey","getPastKey","_useEvents","upcomingData","isLoadingUpcoming","isLoadingMoreUpcoming","canLoadMoreUpcoming","loadMoreUpcoming","_useEvents2","pastData","isLoadingPast","isLoadingMorePast","canLoadMorePast","loadMorePast","processEvents","_data$flatMap","_d$body","t","upcomingEvents","pastEvents","fetchAllOptions","events","allEventTypes","allLanguages","json","Set","_event$attributes","add","_event$attributes2","removeFilter","filterType","valueToRemove","upcomingTitle","upcomingDescription","filterSearch","Select","isMultiple","isSearchable","placeholder","searchPlaceholder","selected","option","BoemlyTag","isClosable","singleLanguage","placeItems","pastTitle","pastDescription","Redirect","router","BoemlyAlert","_shareImage$url","_shareImage$alt","shareImage","_ref$metaTitleSuffix","metaTitleSuffix","_ref$favicon","favicon","_ref$domain","domain","schemaMarkup","shareImageUrl","shareImageAlt","schemas","isValidSchema","isArray","every","schemaArray","getSchemaKey","identifier","_offer$price","price","getSchemaIdentifier","dangerouslySetInnerHTML","__html","CustomSlice","slices","__component","context","global","post","blog","_post$attributes$meta","_post$attributes$meta2","_post$attributes$meta3","_global$attributes$me","_post$attributes$meta4","_post$attributes$meta5","_global$attributes$me2","_post$attributes","_post$attributes$meta6","_post$attributes$meta7","_post$attributes$meta8","_post$attributes$meta9","_post$attributes$meta10","_post$attributes$meta11","_global$attributes$me3","metaShareImageUrl","metadata","schemaMarkupTypes","returnBlog","returnProjects","headerType","extendable","headerNavMenus","navbar","navMenus","headerButtons","footerLinks","footer","banner","topBanner","isFallbackLocale","_customerStory$attrib","_customerStory$attrib2","_customerStory$attrib3","_customerStory$attrib4","_customerStory$attrib5","_customerStory$attrib6","_customerStory$attrib7","_customerStory$attrib8","_customerStory$attrib9","_customerStory$attrib10","_customerStory$attrib11","_customerStory$attrib12","returnCustomerStories","_page$attributes$meta","_page$attributes$meta2","_page$attributes$meta3","_page$attributes$meta4","_page$attributes$meta5","_page$attributes$meta6","_page$attributes","_page$attributes$slic","_page$attributes$slic2","_page$attributes$meta7","_page$attributes$meta8","_page$attributes$meta9","_page$attributes$meta10","_page$attributes$meta11","_page$attributes$meta12","returnBlogPosts","_project$attributes$m","_project$attributes$m2","_project$attributes$m3","_project$attributes$m4","_project$attributes$m5","_project$attributes","_project$attributes$s","_project$attributes$s2","_project$attributes$m6","_project$attributes$m7","_project$attributes$m8","_project$attributes$m9","_project$attributes$m10","_project$attributes$m11"],"mappings":"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"}
1
+ {"version":3,"file":"strapi-slices.cjs.production.min.js","sources":["../src/constants/strapi.ts","../src/integrations/strapi/strapiClient.ts","../src/integrations/strapi/getAllSlugsFromStrapi.ts","../src/constants/api.ts","../src/slices/TextCardGrid/TextCardGrid.tsx","../src/integrations/fpmClient.ts","../src/integrations/strapi/getStrapiProjects.ts","../src/integrations/strapi/getPortfolioProjects.ts","../src/integrations/strapi/getStrapiCollectionType.ts","../src/integrations/strapi/getStrapiSingleType.ts","../src/utils/strapiMediaUrl.ts","../src/constants/metadata.ts","../src/constants/slicesConfig.ts","../src/utils/strapiLinkUrl.ts","../src/components/SEOTags/SEOTags.tsx","../src/components/FullScreenImage/ZoomableImage.tsx","../src/components/FullScreenImage/FullScreenImage.tsx","../src/constants/breakpoints.ts","../src/slices/FullWidthImage/FullWidthImage.tsx","../src/constants/globalStyle.ts","../src/rootMessages.de.ts","../src/components/CreditsAvailableBadge/messages.de.ts","../src/components/EventCard/messages.de.ts","../src/components/portfolio/DocumentsDownloadList/messages.de.ts","../src/components/portfolio/ProjectInfo/messages.de.ts","../src/components/portfolio/SmallCheckout/messages.de.ts","../src/components/ProjectGridCard/messages.de.ts","../src/slices/Comparison/messages.de.ts","../src/slices/Cta/messages.de.ts","../src/components/CustomerCard/messages.de.ts","../src/components/CustomerQuoteCard/messages.de.ts","../src/slices/Events/messages.de.ts","../src/slices/Glossary/messages.de.ts","../src/slices/ProjectFacts/messages.de.ts","../src/slices/ProjectsMap/messages.de.ts","../src/slices/ShopCheckout/messages.de.ts","../src/slices/TextCarousel/messages.de.ts","../src/slices/Timeline/messages.de.ts","../src/unit.messages.de.ts","../src/utils/getMessages.ts","../src/rootMessages.en.ts","../src/components/CreditsAvailableBadge/messages.en.ts","../src/components/EventCard/messages.en.ts","../src/components/portfolio/DocumentsDownloadList/messages.en.ts","../src/components/portfolio/ProjectInfo/messages.en.ts","../src/components/portfolio/SmallCheckout/messages.en.ts","../src/components/ProjectGridCard/messages.en.ts","../src/slices/Comparison/messages.en.ts","../src/slices/Cta/messages.en.ts","../src/components/CustomerCard/messages.en.ts","../src/components/CustomerQuoteCard/messages.en.ts","../src/slices/Events/messages.en.ts","../src/slices/Glossary/messages.en.ts","../src/slices/ProjectFacts/messages.en.ts","../src/slices/ProjectsMap/messages.en.ts","../src/slices/ShopCheckout/messages.en.ts","../src/slices/TextCarousel/messages.en.ts","../src/slices/Timeline/messages.en.ts","../src/unit.messages.en.ts","../src/components/ContextProvider/ContextProvider.tsx","../src/components/StrapiLinkButton/StrapiLinkButton.tsx","../src/utils/openHubSpotChat.ts","../src/slices/Hero/Hero.tsx","../src/slices/IconGrid/IconGrid.tsx","../src/icons/LinkedInIcon.tsx","../src/components/StrapiLinkButtonWithIcon/StrapiLinkButtonWithIcon.tsx","../src/slices/ImageGrid/ImageGrid.tsx","../src/slices/ImageTextSequence/ImageTextSequence.tsx","../src/slices/LeftTextRightCard/LeftTextRightCard.tsx","../src/slices/LogoGridWithText/LogoGridWithText.tsx","../src/slices/MapHero/styles.ts","../src/slices/MapHero/MapHero.tsx","../src/utils/convertToKebabCase.ts","../src/slices/QAndA/QAndA.tsx","../src/slices/QuoteCards/QuoteCards.tsx","../src/slices/RichTextSection/RichTextSection.tsx","../src/slices/Steps/Steps.tsx","../src/models/fpm/FPMProject.ts","../src/slices/TextCarousel/styles.ts","../src/slices/TextCarousel/TextCarousel.tsx","../src/utils/shuffleElements.ts","../src/slices/TextWithTextCards/TextWithTextCards.tsx","../src/constants/formatter.ts","../src/components/CreditsAvailableBadge/CreditsAvailableBadge.tsx","../src/constants/mapbox.ts","../src/components/ProjectGridCard/ProjectGridCard.tsx","../src/slices/TextWithCard/TextWithCard.tsx","../src/slices/LinkCardsGrid/LinkCardsGrid.tsx","../src/slices/SmallHero/SmallHero.tsx","../src/slices/Blog/styles.ts","../src/slices/Blog/Blog.tsx","../src/slices/ProjectsGrid/ProjectsGrid.tsx","../src/slices/ProjectsMap/mapboxStyle.ts","../src/integrations/strapi/getFpmProjectsByBbox.ts","../src/utils/mergeProjectData.ts","../src/slices/ProjectsMap/ProjectsMap.tsx","../src/slices/Cta/Cta.tsx","../src/slices/Video/Video.tsx","../src/slices/FullWidthHighlightQuote/FullWidthHighlightQuote.tsx","../src/slices/FullWidthImageSlider/styles.ts","../src/utils/getClosestRatio.ts","../src/slices/FullWidthImageSlider/FullWidthImageSlider.tsx","../src/slices/SideBySideImages/SideBySideImages.tsx","../src/models/strapi/StrapiEvent.ts","../src/slices/CtaOnly/CtaOnly.tsx","../src/slices/Glossary/Glossary.tsx","../src/slices/ShopCheckout/ShopCheckout.tsx","../src/constants/domain.ts","../src/slices/Facts/Facts.tsx","../src/slices/BlogCards/BlogCards.tsx","../src/components/portfolio/SmallCheckout/SmallCheckout.tsx","../src/components/portfolio/ProjectInfo/ProjectInfo.tsx","../src/utils/convertCo2AmountKgToTons.ts","../src/utils/getTimeSpanInYears.ts","../src/utils/convertAreaM2ToHa.ts","../src/components/portfolio/DocumentsDownloadList/DocumentsDownloadList.tsx","../src/components/portfolio/Contact/Contact.tsx","../src/integrations/strapi/getFpmProjectById.ts","../src/slices/ProjectFacts/ProjectFacts.tsx","../src/components/CustomerCard/CustomerCard.tsx","../src/components/CustomerQuoteCard/CustomerQuoteCard.tsx","../src/components/LogoCard/LogoCard.tsx","../src/slices/CustomerStories/CustomerStories.tsx","../src/slices/Comparison/Icon.tsx","../src/slices/Comparison/Comparison.tsx","../src/slices/CarouselMarqueeBanner/styles.ts","../src/slices/CarouselMarqueeBanner/CarouselMarqueeBanner.tsx","../src/slices/Timeline/Timeline.tsx","../src/utils/isSameDate.ts","../src/slices/Events/Events.tsx","../src/components/EventCard/EventCard.tsx","../src/utils/getCountryFlag.ts","../src/models/hooks/useEvents.ts","../src/slices/Redirect/Redirect.tsx","../src/utils/buildRedirectUrl.ts","../src/components/PreviewAlert/PreviewAlert.tsx","../src/components/SliceRenderer/SliceRenderer.tsx","../src/utils/mergeGlobalAndStrapiBlogPostData.ts","../src/utils/mergeGlobalAndStrapiCustomerStoryData.ts","../src/utils/mergeGlobalAndStrapiPageData.ts","../src/utils/mergeGlobalAndStrapiProjectData.ts"],"sourcesContent":["export const STRAPI_URI =\n process.env.NEXT_PUBLIC_STRAPI_URI || 'http://127.0.0.1:1337';\n\nexport const STRAPI_DEFAULT_PAGE_SIZE = '100';\nexport const STRAPI_DEFAULT_POPULATE_DEPTH = '6';\n\nexport const STRAPI_FALLBACK_LOCALE = 'en';\n","import axios from 'axios';\nimport qs from 'qs';\nimport { setupCache } from 'axios-cache-interceptor';\nimport { STRAPI_URI } from '../../constants/strapi';\n\nconst strapiClient = setupCache(\n axios.create({\n baseURL: `${STRAPI_URI}/api`,\n headers: { 'Strapi-Response-Format': 'v4' },\n paramsSerializer: (p) => qs.stringify(p, { encodeValuesOnly: true }),\n timeout: 60_000,\n }),\n {\n ttl:\n STRAPI_URI.includes('127.0.0.1') || STRAPI_URI.includes('localhost')\n ? 0\n : 10 * 60 * 1000, // 10 minutes\n }\n);\n\nexport default strapiClient;\n","import strapiClient from './strapiClient';\nimport {\n STRAPI_DEFAULT_PAGE_SIZE,\n STRAPI_FALLBACK_LOCALE,\n} from '../../constants/strapi';\nimport IStrapiResponse from '../../models/strapi/IStrapiResponse';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport LocalizedEntity from '../../models/LocalizedEntity';\n\ninterface Options {\n filters?: Record<string, any>;\n}\n\ntype Slug = { slug: string; locale: string };\n\nconst getAllSlugsFromStrapi = async <T extends LocalizedEntity<'slug'>>(\n path: string,\n locales: string[],\n { filters = {} }: Options = { filters: {} }\n): Promise<Slug[]> => {\n const slugPromises = locales.map((locale) =>\n strapiClient\n .get<IStrapiResponse<IStrapiData<T>[]>>(path, {\n params: {\n locale: locale,\n 'pagination[pageSize]': STRAPI_DEFAULT_PAGE_SIZE,\n filters,\n },\n })\n .then((response) =>\n response.data.data.map((page) => ({\n slug: page.attributes.slug,\n locale: page.attributes.locale,\n }))\n )\n // when a collection type for a requested locale does not exist, Strapi returns a 404. In this case, we return an empty array instead of throwing an error\n .catch((error) => {\n if (error.response?.status === 404) {\n return [];\n }\n throw error;\n })\n );\n\n const slugResults = await Promise.all(slugPromises);\n\n let allSlugs = slugResults.flat();\n\n // Identify missing locales for each slug\n const missingLocales = locales.flatMap((locale) => {\n return allSlugs\n .filter((slug) => slug.locale === STRAPI_FALLBACK_LOCALE)\n .filter(\n (fallbackSlug) =>\n !allSlugs.some(\n (slug) => slug.slug === fallbackSlug.slug && slug.locale === locale\n )\n )\n .map((fallbackSlug) => ({ ...fallbackSlug, locale })); // Clone only for missing locales\n });\n\n return [...allSlugs, ...missingLocales]; // Merge original and missing slugs\n};\n\nexport default getAllSlugsFromStrapi;\n","export const API_URI =\n process.env.NEXT_PUBLIC_API_URI || 'http://localhost:4001';\nexport const FPM_API_URI =\n process.env.NEXT_PUBLIC_FPM_API_URI || 'https://api.fpm.t-staging.com';\nexport const CDN_URI = 'https://cdn.tree.ly';\n","import React from 'react';\nimport { css } from '@emotion/react';\nimport {\n Box,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Flex,\n Heading,\n RichText,\n SimpleGrid,\n Text,\n useToken,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport { CaretRight } from '@phosphor-icons/react';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\n\ninterface TextCardGridSlice extends StrapiDefaultHeader {\n variant: 'shape' | 'image';\n cards: {\n id: number;\n tagline?: string;\n title: string;\n text: string;\n image: StrapiImage;\n buttons?: StrapiLink[];\n }[];\n}\nexport interface TextCardGridProps {\n slice: TextCardGridSlice;\n}\n\nenum ShapePosition {\n topLeft = 'top-left',\n topRight = 'top-right',\n bottomLeft = 'bottom-left',\n bottomRight = 'bottom-right',\n unset = 'unset',\n}\n\nconst shapePositions: ShapePosition[] = [\n ShapePosition.topLeft,\n ShapePosition.bottomRight,\n ShapePosition.topRight,\n ShapePosition.bottomLeft,\n ShapePosition.topRight,\n ShapePosition.bottomLeft,\n ShapePosition.topLeft,\n ShapePosition.bottomRight,\n];\n\nconst oppositesOfCorners = {\n [ShapePosition.bottomLeft]: ShapePosition.topRight,\n [ShapePosition.topRight]: ShapePosition.bottomLeft,\n [ShapePosition.bottomRight]: ShapePosition.topLeft,\n [ShapePosition.topLeft]: ShapePosition.bottomRight,\n [ShapePosition.unset]: ShapePosition.unset,\n};\n\ntype Variant = {\n padding: (string | null)[];\n positionIcon: (index: number) => ShapePosition;\n width: string;\n height: string;\n position: 'absolute' | 'relative';\n mb: string;\n};\n\nconst variants: { shape: Variant; image: Variant } = {\n shape: {\n padding: ['6', null, null, '8'],\n positionIcon: (index: number) =>\n shapePositions[index % shapePositions.length],\n width: '40',\n height: '40',\n position: 'absolute',\n mb: 'unset',\n },\n image: {\n padding: ['6', null, null, '8'],\n positionIcon: () => ShapePosition.unset,\n width: '24',\n height: '24',\n position: 'relative',\n mb: '10',\n },\n};\n\nexport const TextCardGrid: React.FC<TextCardGridProps> = ({\n slice,\n}: TextCardGridProps) => {\n const [primary800] = useToken('colors', ['primary.800']);\n\n return (\n <DefaultSectionContainer backgroundColor={primary800} title={slice.title}>\n <Wrapper>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n taglineProps={{ textAlign: 'center', color: 'white' }}\n titleProps={{\n textAlign: 'center',\n maxW: '2xl',\n marginX: 'auto',\n color: 'white',\n }}\n textProps={{\n textAlign: 'center',\n maxW: 'xl',\n marginX: 'auto',\n color: 'whiteAlpha.800',\n }}\n />\n\n <SimpleGrid\n mt={['14', null, null, '24']}\n columns={3}\n justifyItems=\"center\"\n gap=\"20\"\n rowGap=\"16\"\n minChildWidth={['100%', null, '16rem']}\n >\n {slice.cards.map(\n ({ id, tagline, title, text, image, buttons }, index) => (\n <Box\n key={id}\n backgroundColor=\"white\"\n zIndex=\"base\"\n padding={variants[slice.variant].padding}\n boxShadow=\"lg\"\n borderRadius=\"2xl\"\n minHeight=\"2xs\"\n width=\"full\"\n maxWidth={slice.cards.length > 1 ? 'unset' : 'xl'}\n position=\"relative\"\n display=\"flex\"\n flexDir=\"column\"\n alignItems=\"flex-start\"\n justifyContent={\n slice.variant === 'shape' ? 'flex-end' : 'flex-start'\n }\n overflow=\"hidden\"\n >\n <Box\n position={variants[slice.variant].position}\n width={variants[slice.variant].width}\n height={variants[slice.variant].height}\n mb={variants[slice.variant].mb}\n top={\n variants[slice.variant].positionIcon(index).includes('top')\n ? '-4'\n : 'unset'\n }\n left={\n variants[slice.variant].positionIcon(index).includes('left')\n ? '-4'\n : 'unset'\n }\n right={\n variants[slice.variant]\n .positionIcon(index)\n .includes('right')\n ? '-4'\n : 'unset'\n }\n bottom={\n variants[slice.variant]\n .positionIcon(index)\n .includes('bottom')\n ? '-4'\n : 'unset'\n }\n borderBottomRightRadius={\n oppositesOfCorners[\n variants[slice.variant].positionIcon(index)\n ].includes('bottomRight')\n ? 'full'\n : 'unset'\n }\n borderBottomLeftRadius={\n oppositesOfCorners[\n variants[slice.variant].positionIcon(index)\n ].includes('bottomLeft')\n ? 'full'\n : 'unset'\n }\n borderTopRightRadius={\n oppositesOfCorners[\n variants[slice.variant].positionIcon(index)\n ].includes('topRight')\n ? 'full'\n : 'unset'\n }\n borderTopLeftRadius={\n oppositesOfCorners[\n variants[slice.variant].positionIcon(index)\n ].includes('topLeft')\n ? 'full'\n : 'unset'\n }\n css={\n variants[slice.variant]\n .positionIcon(index)\n .includes('unset')\n ? css`\n & span,\n div,\n img {\n border-radius: var(--boemly-radii-xl);\n }\n `\n : css`\n & span,\n div,\n img {\n border-${\n oppositesOfCorners[\n variants[slice.variant].positionIcon(index)\n ]\n }-radius: var(--boemly-radii-full);\n }\n `\n }\n >\n <Image\n src={strapiMediaUrl(image.img, 'small')}\n alt={image.alt}\n fill\n style={{ objectFit: image.objectFit || 'cover' }}\n />\n </Box>\n <Box zIndex=\"aboveBase\" width=\"full\">\n {tagline && (\n <Text color=\"black\" size=\"smMonoNormal\" mb=\"2\">\n {tagline}\n </Text>\n )}\n <Heading as=\"h4\" size=\"xl\" mb=\"3\">\n {title}\n </Heading>\n <RichText\n content={text}\n listProps={{\n textColor: 'gray.500',\n textSize: 'smRegularNormal',\n }}\n textProps={{\n color: 'gray.500',\n size: 'smRegularNormal',\n }}\n />\n {buttons && !!buttons.length && (\n <Flex\n mt=\"4\"\n gap=\"3\"\n flexDir={['column', null, null, null, 'row']}\n >\n {buttons.map((button, buttonIndex) => (\n <StrapiLinkButton\n key={button.id}\n link={button}\n size=\"sm\"\n rightIcon={\n buttonIndex === 0 ? (\n <CaretRight size=\"10\" weight=\"bold\" />\n ) : undefined\n }\n variant={buttonIndex === 0 ? 'outline' : 'ghost'}\n component=\"TextCardGrid\"\n />\n ))}\n </Flex>\n )}\n </Box>\n </Box>\n )\n )}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import axios from 'axios';\nimport qs from 'qs';\nimport { setupCache } from 'axios-cache-interceptor';\nimport { FPM_API_URI } from '../constants/api';\n\nconst fpmClient = setupCache(\n axios.create({\n baseURL: `${FPM_API_URI}/v1`,\n paramsSerializer: (p) => qs.stringify(p, { encodeValuesOnly: true }),\n timeout: 5000,\n }),\n {\n ttl:\n FPM_API_URI.includes('127.0.0.1') || FPM_API_URI.includes('localhost')\n ? 0\n : 10 * 60 * 1000, // 10 minutes\n }\n);\n\nexport default fpmClient;\n","import { IStrapiData, IStrapiResponse, StrapiProject } from '../..';\nimport {\n STRAPI_DEFAULT_PAGE_SIZE,\n STRAPI_DEFAULT_POPULATE_DEPTH,\n} from '../../constants/strapi';\nimport strapiClient from './strapiClient';\n\nconst FALLBACK_LOCALE = 'en';\n\nconst getStrapiProjects = async (\n locale: string = 'en',\n pLevel: string = STRAPI_DEFAULT_POPULATE_DEPTH,\n preview: boolean = false\n): Promise<Map<string, IStrapiData<StrapiProject>>> => {\n const cache = preview ? false : undefined;\n const strapiParams: Record<string, any> = {\n pLevel,\n locale,\n 'pagination[pageSize]': STRAPI_DEFAULT_PAGE_SIZE,\n status: preview ? 'draft' : 'published',\n };\n\n const strapiProjects = new Map<string, IStrapiData<StrapiProject>>();\n\n try {\n const [strapiProjectsLocalized, strapiProjectsEnglish] = await Promise.all([\n strapiClient.get<IStrapiResponse<IStrapiData<StrapiProject>[]>>(\n '/projects',\n { params: strapiParams, cache }\n ),\n strapiClient.get<IStrapiResponse<IStrapiData<StrapiProject>[]>>(\n '/projects',\n {\n params: { ...strapiParams, locale: FALLBACK_LOCALE },\n cache,\n }\n ),\n ]);\n\n // Process Strapi data if we got it\n for (const project of [\n ...strapiProjectsEnglish.data.data,\n ...strapiProjectsLocalized.data.data,\n ]) {\n if (project.attributes.fpmProjectId) {\n strapiProjects.set(project.attributes.fpmProjectId, project);\n }\n }\n } catch (error) {\n console.warn('Failed to fetch Strapi data:', error);\n // Return empty map on failure\n }\n\n return strapiProjects;\n};\n\nexport default getStrapiProjects;\n","import { PortfolioProject } from '../..';\nimport { STRAPI_DEFAULT_POPULATE_DEPTH } from '../../constants/strapi';\nimport FPMProject from '../../models/fpm/FPMProject';\nimport fpmClient from '../fpmClient';\nimport getStrapiProjects from './getStrapiProjects';\n\nconst getPortfolioProjects = async (\n locale: string = 'en',\n preview: boolean = false\n): Promise<PortfolioProject[]> => {\n const cache = preview ? false : undefined;\n\n const [{ data: fpmProjects }, strapiProjects] = await Promise.all([\n fpmClient.get<FPMProject[]>('/public/projects', { cache }),\n getStrapiProjects(locale, STRAPI_DEFAULT_POPULATE_DEPTH, preview),\n ]);\n\n return fpmProjects.map((fpmProject: FPMProject) => {\n const strapiProject = strapiProjects.get(fpmProject.id);\n\n const toReturn: PortfolioProject = fpmProject;\n\n if (strapiProject?.attributes.slug) {\n toReturn.slug = strapiProject.attributes.slug;\n }\n if (strapiProject?.attributes.thumbnail) {\n toReturn.thumbnail = strapiProject?.attributes.thumbnail;\n }\n if (strapiProject?.attributes.portfolio.data?.attributes.host) {\n toReturn.portfolioHost =\n strapiProject.attributes.portfolio.data.attributes.host;\n }\n\n return toReturn;\n });\n};\n\nexport default getPortfolioProjects;\n","import strapiClient from './strapiClient';\nimport {\n STRAPI_DEFAULT_PAGE_SIZE,\n STRAPI_DEFAULT_POPULATE_DEPTH,\n STRAPI_FALLBACK_LOCALE,\n} from '../../constants/strapi';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport IStrapiResponse from '../../models/strapi/IStrapiResponse';\nimport LocalizedEntity from '../../models/LocalizedEntity';\n\ninterface Options {\n locale?: string;\n slug?: string;\n preview?: boolean;\n filters?: Record<string, any>;\n}\n\nconst getStrapiCollectionType = async <\n T extends LocalizedEntity<K>,\n K extends string\n>(\n path: string,\n key: K,\n { locale = 'en', preview = false, filters = {} }: Options\n): Promise<IStrapiData<T>[]> => {\n const cache = preview ? false : undefined;\n\n const sharedParams = {\n pLevel: STRAPI_DEFAULT_POPULATE_DEPTH,\n 'pagination[pageSize]': STRAPI_DEFAULT_PAGE_SIZE,\n filters,\n status: preview ? 'draft' : 'published',\n };\n\n const requestedLocaleData = await strapiClient\n .get<IStrapiResponse<IStrapiData<T>[]>>(path, {\n params: {\n ...sharedParams,\n locale,\n },\n cache,\n })\n .then((response) => response.data.data)\n // when a collection type for a requested locale does not exist, Strapi returns a 404. In this case, we return an empty array instead of throwing an error\n .catch((error) => {\n if (error.response?.status === 404) {\n return [];\n }\n throw error;\n });\n\n const fallbackLocaleData = await strapiClient\n .get<IStrapiResponse<IStrapiData<T>[]>>(path, {\n params: {\n ...sharedParams,\n locale: STRAPI_FALLBACK_LOCALE,\n },\n cache,\n })\n .then((response) => response.data.data)\n // when a collection type for a requested locale does not exist, Strapi returns a 404. In this case, we return an empty array instead of throwing an error\n .catch((error) => {\n if (error.response?.status === 404) {\n return [];\n }\n throw error;\n });\n\n const results = fallbackLocaleData.map((fallbackLocaleDataEntry) => {\n const requestedLocale = requestedLocaleData.find(\n (localized) =>\n localized.attributes[key] === fallbackLocaleDataEntry.attributes[key]\n );\n\n return requestedLocale || fallbackLocaleDataEntry;\n });\n\n return results;\n};\n\nexport default getStrapiCollectionType;\n","import { AxiosResponse } from 'axios';\nimport strapiClient from './strapiClient';\nimport {\n STRAPI_DEFAULT_PAGE_SIZE,\n STRAPI_DEFAULT_POPULATE_DEPTH,\n STRAPI_FALLBACK_LOCALE,\n} from '../../constants/strapi';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport IStrapiResponse from '../../models/strapi/IStrapiResponse';\n\ninterface Options {\n locale?: string;\n preview?: boolean;\n filters?: Record<string, any>;\n}\n\nconst getStrapiSingleType = async <T>(\n path: string,\n { locale = 'en', preview = false, filters = {} }: Options\n): Promise<IStrapiData<T>> => {\n const cache = preview ? false : undefined;\n const params: Record<string, any> = {\n pLevel: STRAPI_DEFAULT_POPULATE_DEPTH,\n locale,\n 'pagination[pageSize]': STRAPI_DEFAULT_PAGE_SIZE,\n filters,\n status: preview ? 'draft' : 'published',\n };\n\n let response: AxiosResponse<IStrapiResponse<IStrapiData<T>>>;\n\n try {\n response = await strapiClient.get(path, { params, cache });\n return response.data.data;\n } catch (error: any) {\n if (error.isAxiosError && error.response?.status === 404) {\n // Retry request with fallback locale\n response = await strapiClient.get(path, {\n params: { ...params, locale: STRAPI_FALLBACK_LOCALE },\n cache,\n });\n\n return response.data.data;\n }\n\n throw error;\n }\n};\n\nexport default getStrapiSingleType;\n","import { STRAPI_URI } from '../constants/strapi';\nimport IStrapi from '../models/strapi/IStrapi';\nimport IStrapiData from '../models/strapi/IStrapiData';\nimport StrapiMedia from '../models/strapi/StrapiMedia';\n\nconst strapiMediaUrl = (\n media: IStrapi<IStrapiData<StrapiMedia>>,\n preferredSize:\n | 'native'\n | 'thumbnail'\n | 'xSmall'\n | 'small'\n | 'medium'\n | 'large'\n | 'xLarge' = 'native'\n): string => {\n let { url } = media.data.attributes || {};\n if (preferredSize !== 'native' && media.data.attributes.ext !== '.svg') {\n url = media.data.attributes.formats[preferredSize]?.url || url;\n }\n if (url && (url.indexOf('http://') === 0 || url.indexOf('https://') === 0)) {\n return url;\n }\n return `${\n STRAPI_URI.includes('127.0.0.1') || STRAPI_URI.includes('localhost')\n ? STRAPI_URI\n : ''\n }${url}`;\n};\n\nexport default strapiMediaUrl;\n","export const DEFAULT_SHARE_IMAGE =\n 'https://cdn.tree.ly/assets/v3/app/share-image-generic.webp';\nexport const DEFAULT_SHARE_ALT = 'Share Image';\n","export const EXTENDABLE_HEADER_SECTIONS = [\n 'sections.hero',\n 'sections.map-hero',\n 'sections.full-width-image',\n 'sections.small-hero',\n 'sections.small-hero-light',\n];\nexport const DARK_THEME_HEADER_SECTIONS = [\n 'sections.hero',\n 'sections.small-hero',\n];\nexport const SLICES_WITH_BLOG_POSTS = ['sections.blog', 'sections.blog-cards'];\nexport const SLICES_WITH_CUSTOMER_STORIES = ['sections.customer-stories'];\nexport const SLICES_WITH_PROJECTS = [\n 'sections.projects-grid',\n 'sections.projects-map',\n 'sections.project-facts',\n 'sections.text-with-card',\n];\n","import StrapiLink from '../models/strapi/StrapiLink';\n\nconst strapiLinkUrl = (\n strapiLink: StrapiLink | undefined = undefined\n): string => {\n if (strapiLink?.page?.data) {\n return `/${strapiLink.page.data.attributes.slug}`;\n }\n\n return strapiLink?.url || '/';\n};\n\nexport default strapiLinkUrl;\n","import React from 'react';\nimport Head from 'next/head';\nimport {\n DEFAULT_SHARE_ALT,\n DEFAULT_SHARE_IMAGE,\n} from '../../constants/metadata';\nimport {\n Article,\n BlogPosting,\n Brand,\n BreadcrumbList,\n Event,\n FAQPage,\n HowTo,\n LocalBusiness,\n Offer,\n Organization,\n Person,\n Product,\n QAPage,\n Service,\n SoftwareApplication,\n WebPage,\n WithContext,\n} from 'schema-dts';\n\ntype SupportedSchemaType =\n | Article\n | BlogPosting\n | Brand\n | BreadcrumbList\n | Event\n | FAQPage\n | HowTo\n | LocalBusiness\n | Offer\n | Organization\n | Person\n | Product\n | QAPage\n | Product\n | Service\n | SoftwareApplication\n | WebPage;\n\n// Helper function to convert SchemaValue to string\nconst getTextValue = (value: unknown): string => {\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value !== null && 'text' in value) {\n return (value as { text: string }).text;\n }\n return '';\n};\n\n// Helper function to safely access properties from a schema\nconst getSchemaProperty = (\n schema: SupportedSchemaType,\n property: string\n): string => {\n return (\n getTextValue((schema as unknown as Record<string, unknown>)[property]) || ''\n );\n};\n\n// Helper function to get a unique identifier from a schema\nconst getSchemaIdentifier = (schema: SupportedSchemaType): string => {\n const type = (schema as { '@type': string })['@type'];\n\n switch (type) {\n case 'Organization':\n return getSchemaProperty(schema, 'name') || 'default';\n case 'Article':\n case 'BlogPosting':\n return getSchemaProperty(schema, 'headline') || 'untitled-article';\n case 'Product':\n return getSchemaProperty(schema, 'name') || 'untitled-product';\n case 'Person':\n return getSchemaProperty(schema, 'name') || 'unnamed-person';\n case 'Event':\n return getSchemaProperty(schema, 'name') || 'untitled-event';\n case 'LocalBusiness':\n return getSchemaProperty(schema, 'name') || 'unnamed-business';\n case 'Service':\n return getSchemaProperty(schema, 'name') || 'unnamed-service';\n case 'Brand':\n return getSchemaProperty(schema, 'name') || 'unnamed-brand';\n case 'FAQPage':\n return 'faq-page';\n case 'HowTo':\n return getSchemaProperty(schema, 'name') || 'untitled-howto';\n case 'BreadcrumbList':\n return 'breadcrumbs';\n case 'Offer':\n const offer = schema as Offer;\n return `offer-${offer.price ?? 'unknown-price'}`;\n case 'WebPage':\n return getSchemaProperty(schema, 'name') || 'untitled-page';\n case 'QAPage':\n return getSchemaProperty(schema, 'name') || 'untitled-qa';\n case 'SoftwareApplication':\n return getSchemaProperty(schema, 'name') || 'untitled-software';\n default:\n return 'unknown-schema';\n }\n};\n\ninterface SEOTagsProps {\n title: string;\n description: string;\n shareImage?: {\n url: string;\n alt: string;\n };\n metaTitleSuffix?: string;\n favicon?: string;\n domain?: string;\n /**\n * Structured data for SEO purposes, following the schema.org standard.\n * This can be a single schema object or an array of schema objects.\n * Each object must include an `@context` property set to \"https://schema.org\"\n * and an `@type` property indicating the type of schema (e.g., Article, Product).\n */\n schemaMarkup?:\n | WithContext<SupportedSchemaType>\n | WithContext<SupportedSchemaType>[];\n}\n\nconst validateSchema = (\n schema: WithContext<SupportedSchemaType> | WithContext<SupportedSchemaType>[]\n): boolean => {\n if (Array.isArray(schema)) {\n return schema.every(\n (item) => item['@context'] === 'https://schema.org' && '@type' in item\n );\n }\n return schema['@context'] === 'https://schema.org' && '@type' in schema;\n};\n\nexport const SEOTags: React.FC<SEOTagsProps> = ({\n title,\n description,\n shareImage,\n metaTitleSuffix = 'Tree.ly',\n favicon = 'https://cdn.tree.ly/favicon.ico',\n domain = 'tree.ly',\n schemaMarkup,\n}: SEOTagsProps) => {\n const shareImageUrl = shareImage?.url ?? DEFAULT_SHARE_IMAGE;\n const shareImageAlt = shareImage?.alt ?? DEFAULT_SHARE_ALT;\n\n let schemas = schemaMarkup;\n let isValidSchema = schemaMarkup ? validateSchema(schemaMarkup) : false;\n\n if (schemaMarkup && !isValidSchema) {\n console.warn(\n 'Invalid schema markup provided to SEOTags component. Schema markup will not be rendered.',\n schemaMarkup\n );\n schemas = undefined;\n isValidSchema = false;\n }\n\n const schemaArray = schemas\n ? Array.isArray(schemas)\n ? schemas\n : [schemas]\n : [];\n\n const getSchemaKey = (\n schema: WithContext<SupportedSchemaType>,\n index: number\n ): string => {\n const type = (schema as { '@type': string })['@type'];\n const identifier = getSchemaIdentifier(schema as SupportedSchemaType);\n return `${type}-${identifier}-${index}`;\n };\n\n return (\n <Head>\n <title>{`${title} - ${metaTitleSuffix}`}</title>\n <meta name=\"description\" content={description} />\n <link rel=\"icon\" href={favicon} />\n\n <meta property=\"og:url\" content={`https://${domain}`} />\n <meta property=\"og:type\" content=\"website\" />\n <meta property=\"og:title\" content={title} />\n <meta property=\"og:description\" content={description} />\n <meta property=\"og:image\" content={shareImageUrl} />\n <meta property=\"og:image:alt\" content={shareImageAlt} />\n\n <meta name=\"twitter:card\" content=\"summary_large_image\" />\n <meta property=\"twitter:domain\" content={domain} />\n <meta property=\"twitter:url\" content={`https://${domain}`} />\n <meta name=\"twitter:title\" content={title} />\n <meta name=\"twitter:description\" content={description} />\n <meta name=\"twitter:image\" content={shareImageUrl} />\n <meta name=\"twitter:image:alt\" content={shareImageAlt} />\n\n {isValidSchema &&\n schemaArray.map((schema, index) => (\n <script\n key={getSchemaKey(schema, index)}\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(schema),\n }}\n />\n ))}\n </Head>\n );\n};\n","import StrapiImage from '../../models/strapi/StrapiImage';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport { Box } from 'boemly';\nimport Head from 'next/head';\nimport Image from 'next/image';\nimport React, { useState } from 'react';\n\ninterface ZoomableImageProps {\n image: StrapiImage;\n zoom?: number;\n}\n\nconst ZoomableImage = ({ image, zoom = 200 }: ZoomableImageProps) => {\n // define and set default values to the states of the component\n const [isZoomed, setIsZoomed] = useState(false);\n const [backgroundPos, setBackgroundPos] = useState('50% 50%');\n\n const imageSrc = strapiMediaUrl(image.img, 'xLarge');\n\n const zoomInPosition = (e: React.MouseEvent<HTMLElement, MouseEvent>) => {\n // This will handle the calculations of the area where the image needs to zoom in depending on the user interaction\n const zoomer = e.currentTarget.getBoundingClientRect();\n const x = ((e.clientX - zoomer.x) / zoomer.width) * 100;\n const y = ((e.clientY - zoomer.y) / zoomer.height) * 100;\n setBackgroundPos(`${x}% ${y}%`);\n };\n\n const toggleZoomImage = (e: React.MouseEvent<HTMLElement, MouseEvent>) => {\n if (isZoomed) {\n setIsZoomed(false);\n } else {\n // Zoom in and set the background position correctly\n setIsZoomed(true);\n zoomInPosition(e);\n }\n };\n\n const handleClick = (e: React.MouseEvent<HTMLElement, MouseEvent>) => {\n toggleZoomImage(e);\n };\n\n const handleMove = (e: React.MouseEvent<HTMLElement, MouseEvent>) => {\n if (isZoomed) {\n zoomInPosition(e);\n }\n };\n\n return (\n <>\n <Head>\n <link rel=\"prefetch\" as=\"image\" href={imageSrc} />\n </Head>\n <Box\n position=\"relative\"\n display=\"inline-block\"\n width=\"full\"\n height=\"full\"\n overflow=\"hidden\"\n flexShrink=\"0\"\n scrollSnapAlign=\"center\"\n scrollSnapStop=\"always\"\n draggable=\"false\"\n cursor={isZoomed ? 'zoom-out' : 'zoom-in'}\n backgroundImage={isZoomed ? `url( ${imageSrc} )` : 'none'}\n backgroundSize={`${zoom}%`}\n backgroundPosition={backgroundPos}\n onClick={(e) => handleClick(e)}\n onMouseMove={(e) => handleMove(e)}\n >\n <Image\n src={imageSrc}\n alt={image.alt}\n fill\n style={{\n visibility: isZoomed ? 'hidden' : 'visible',\n objectFit: 'contain',\n }}\n />\n </Box>\n </>\n );\n};\n\nexport default ZoomableImage;\n","import React, { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { BoemlyModal, Flex, IconButton } from 'boemly';\nimport { useKey, useLockBodyScroll } from 'react-use';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport { CaretLeft, CaretRight } from '@phosphor-icons/react';\nimport ZoomableImage from './ZoomableImage';\n\nexport interface FullScreenImageProps {\n images: StrapiImage[];\n isOpen: boolean;\n onClose: () => void;\n currentIndex?: number;\n setCurrentIndex?: (callback: (c: number) => number) => void;\n}\n\nexport const FullScreenImage = ({\n images,\n isOpen,\n onClose,\n currentIndex = 0,\n setCurrentIndex,\n}: FullScreenImageProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useLockBodyScroll(isOpen);\n\n const canMoveRight = useMemo(\n () => currentIndex < images.length - 1,\n [currentIndex, images.length]\n );\n const canMoveLeft = useMemo(() => currentIndex !== 0, [currentIndex]);\n\n const onRight = useCallback(\n () => canMoveRight && setCurrentIndex && setCurrentIndex((c) => c + 1),\n [canMoveRight]\n );\n const onLeft = useCallback(\n () => canMoveLeft && setCurrentIndex && setCurrentIndex((c) => c - 1),\n [canMoveLeft]\n );\n\n useKey('ArrowRight', onRight, {}, [onRight]);\n useKey('ArrowLeft', onLeft, {}, [onLeft]);\n\n useEffect(() => {\n if (!!isOpen) {\n setTimeout(() => {\n containerRef?.current?.scrollTo({\n left: currentIndex * containerRef.current.clientWidth,\n behavior: 'instant',\n });\n }, 10);\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (containerRef.current) {\n containerRef.current.scrollTo({\n left: currentIndex * containerRef.current.clientWidth,\n behavior: 'smooth',\n });\n }\n }, [currentIndex, containerRef]);\n\n return (\n <BoemlyModal\n onClose={onClose}\n isOpen={isOpen}\n title=\"\"\n trigger=\"\"\n size=\"full\"\n content={\n <Flex\n position=\"absolute\"\n insetY=\"16\"\n insetX=\"0\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Flex\n ref={containerRef}\n flexGrow=\"1\"\n flexBasis=\"100%\"\n flexShrink=\"1\"\n gap=\"4\"\n marginX=\"24\"\n scrollSnapType=\"x mandatory\"\n overflow=\"hidden\"\n position=\"relative\"\n height=\"full\"\n width=\"full\"\n >\n {images.map((image) => (\n <ZoomableImage key={image.id} image={image} />\n ))}\n </Flex>\n\n <Flex\n position=\"absolute\"\n inset=\"6\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n pointerEvents=\"none\"\n >\n <IconButton\n visibility={canMoveLeft ? 'visible' : 'hidden'}\n onClick={onLeft}\n icon={<CaretLeft size={16} />}\n aria-label=\"Previous picture\"\n variant=\"outline\"\n pointerEvents=\"all\"\n mr=\"6\"\n />\n\n <IconButton\n visibility={canMoveRight ? 'visible' : 'hidden'}\n onClick={onRight}\n icon={<CaretRight size={16} />}\n aria-label=\"Next picture\"\n variant=\"outline\"\n pointerEvents=\"all\"\n ml=\"4\"\n />\n </Flex>\n </Flex>\n }\n />\n );\n};\n","export const BREAKPOINT_SM = `${320 - 1}px`;\nexport const BREAKPOINT_MD = `${768 - 1}px`;\nexport const BREAKPOINT_LG = `${960 - 1}px`;\nexport const BREAKPOINT_XL = `${1200 - 1}px`;\n\nexport const BREAKPOINT_SM_QUERY = `(max-width: ${BREAKPOINT_SM})`;\nexport const BREAKPOINT_MD_QUERY = `(max-width: ${BREAKPOINT_MD})`;\nexport const BREAKPOINT_LG_QUERY = `(max-width: ${BREAKPOINT_LG})`;\nexport const BREAKPOINT_XL_QUERY = `(max-width: ${BREAKPOINT_XL})`;\n","import React, { useState } from 'react';\nimport {\n Box,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Wrapper,\n useMediaQuery,\n} from 'boemly';\nimport Image from 'next/image';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport FullScreenImage from '../../components/FullScreenImage';\nimport { BREAKPOINT_MD_QUERY } from '../../constants/breakpoints';\n\ninterface FullWidthImageSlice extends StrapiDefaultHeader {\n image: StrapiImage;\n}\nexport interface FullWidthImageProps {\n slice: FullWidthImageSlice;\n}\n\nexport const FullWidthImage: React.FC<FullWidthImageProps> = ({\n slice,\n}: FullWidthImageProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const [isMobile] = useMediaQuery(BREAKPOINT_MD_QUERY);\n\n return (\n <DefaultSectionContainer title={slice.title}>\n <Wrapper>\n <DefaultSectionHeader\n isHero\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n taglineProps={{ textAlign: 'center', mt: ['32', null, null, '56'] }}\n titleProps={{ textAlign: 'center', maxW: '6xl', marginX: 'auto' }}\n textProps={{ textAlign: 'center', maxW: '3xl', marginX: 'auto' }}\n />\n\n <Box position=\"relative\" mt=\"20\" height={['3xs', null, 'xl']}>\n <Image\n src={strapiMediaUrl(slice.image.img, 'xLarge')}\n alt={slice.image.alt}\n fill\n style={{\n objectFit: slice.image.objectFit || 'cover',\n cursor: isMobile ? 'unset' : 'pointer',\n borderRadius: 'var(--boemly-radii-2xl)',\n }}\n onClick={() => !isMobile && setIsOpen(true)}\n />\n\n <FullScreenImage\n images={[slice.image]}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n />\n </Box>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import { css } from '@emotion/react';\n\nexport const GLOBAL_STYLE = css`\n :root {\n --default-hero-height: calc(100vh - var(--boemly-space-24));\n }\n\n a {\n text-decoration: none;\n }\n`;\n","import comparisonMessagesDe from './slices/Comparison/messages.de';\nimport creditsAvailableBadgeMessagesDe from './components/CreditsAvailableBadge/messages.de';\nimport ctaMessagesDe from './slices/Cta/messages.de';\nimport customerCardMessagesDe from './components/CustomerCard/messages.de';\nimport customerQuoteCardMessagesDe from './components/CustomerQuoteCard/messages.de';\nimport eventCardMessagesDe from './components/EventCard/messages.de';\nimport eventsMessagesDe from './slices/Events/messages.de';\nimport glossaryMessagesDe from './slices/Glossary/messages.de';\nimport portfolioDocumentsDownloadListMessagesDe from './components/portfolio/DocumentsDownloadList/messages.de';\nimport projectFactsMessagesDe from './slices/ProjectFacts/messages.de';\nimport projectGridCardMessagesDe from './components/ProjectGridCard/messages.de';\nimport projectsMapMessagesDe from './slices/ProjectsMap/messages.de';\nimport portfolioProjectInfoMessagesDe from './components/portfolio/ProjectInfo/messages.de';\nimport portfolioSmallCheckoutMessagesDe from './components/portfolio/SmallCheckout/messages.de';\nimport shopCheckoutMessagesDe from './slices/ShopCheckout/messages.de';\nimport textCarouselMessagesDe from './slices/TextCarousel/messages.de';\nimport timelineMessagesDe from './slices/Timeline/messages.de';\n\nimport unitMessagesDe from './unit.messages.de';\n\nconst rootMessagesDe = {\n //\n // Components\n //\n ...creditsAvailableBadgeMessagesDe,\n ...eventCardMessagesDe,\n ...portfolioDocumentsDownloadListMessagesDe,\n ...portfolioProjectInfoMessagesDe,\n ...portfolioSmallCheckoutMessagesDe,\n ...projectGridCardMessagesDe,\n\n //\n // Slices\n //\n ...comparisonMessagesDe,\n ...ctaMessagesDe,\n ...customerCardMessagesDe,\n ...customerQuoteCardMessagesDe,\n ...eventsMessagesDe,\n ...glossaryMessagesDe,\n ...projectFactsMessagesDe,\n ...projectsMapMessagesDe,\n ...shopCheckoutMessagesDe,\n ...textCarouselMessagesDe,\n ...timelineMessagesDe,\n\n //\n // Units\n //\n ...unitMessagesDe,\n};\n\nexport default rootMessagesDe;\n","const messagesDe = {\n 'components.creditsAvailableBadge.text.yes': 'Credits verfügbar',\n 'components.creditsAvailableBadge.text.some': 'Einige verbleibende Credits',\n 'components.creditsAvailableBadge.text.no': 'Keine verbleibenden Credits',\n 'components.creditsAvailableBadge.text.notYet': 'Credits bald verfügbar',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.eventCard.recommendedEvent': 'Empfohlene Veranstaltung',\n 'sections.eventCard.buttonShowMore': 'Mehr anzeigen',\n 'sections.eventCard.buttonShowLess': 'Weniger anzeigen',\n\n 'sections.eventCard.eventType.conference': 'Konferenz',\n 'sections.eventCard.eventType.webinar': 'Webinar',\n 'sections.eventCard.eventType.forestwalk': 'Waldspaziergang',\n 'sections.eventCard.eventType.partnerevent': 'Partnerveranstaltung',\n 'sections.eventCard.eventType.lunch&learn': 'Mittagessen & Lernen',\n 'sections.eventCard.eventType.fair': 'Messe',\n 'sections.eventCard.eventType.festival': 'Festival',\n 'sections.eventCard.eventType.roadshow': 'Roadshow',\n 'sections.eventCard.eventType.meetup': 'Meet Up',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'features.portfolio.documentsDownloadList.projectDocuments':\n 'Projektdokumente',\n 'features.portfolio.documentsDownloadList.downloadDocument':\n 'Dokument herunterladen',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'features.projectInfo.projectInfo.value': 'Projekt Infos',\n 'features.projectInfo.properties.area': 'Projekt Fläche',\n 'features.projectInfo.properties.location': 'Standort',\n 'features.projectInfo.properties.start': 'Projekt Start Datum',\n 'features.projectInfo.properties.timeSpan': 'Projekt Zeitraum',\n 'features.projectInfo.properties.projectType': 'Projekt Typ',\n 'features.projectInfo.properties.projectDeveloper': 'Projekt Entwickler',\n 'features.projectInfo.properties.verificationStandard.label':\n 'Verifizierungsstandard',\n 'features.projectInfo.properties.verificationStandard.value.SilvaconsultFCSISO14':\n 'SILVACONSULT® Forest Carbon Standard, ISO 14064-2',\n 'features.projectInfo.properties.verificationStandard.value.MfKWCH':\n 'Methodik für Klimaschutzprojekte im Wald für die Schweiz',\n 'features.projectInfo.properties.projectVolume.toolTip':\n 'Dies ist die durchschnittliche Anzahl der Credits, die pro Jahr ausgestellt werden. Dieser Wert entspricht nicht den Verfügbarkeiten.',\n 'features.projectInfo.properties.projectVolume.label': 'Projektvolumen',\n 'features.projectInfo.properties.riskBuffer': 'Anteil Risikopuffer',\n\n 'features.projectInfo.properties.year':\n '{years} {years, plural, one {Jahr} other {Jahre} }',\n};\n\nexport default messagesDe;\n","const messagesDe = {\n 'portfolio.smallCheckout.price.taxNotIncluded': 'ohne Steuern',\n 'portfolio.smallCheckout.price.taxIncluded':\n 'Preis inklusive Steuern: {number}',\n\n 'portfolio.smallCheckout.contributionValueCurrency.label.CHF':\n 'Geben Sie den Beitrag in Fr. ein',\n 'portfolio.smallCheckout.contributionValueCurrency.label.EUR':\n 'Geben Sie den Beitrag in € ein',\n 'portfolio.smallCheckout.contributionValueCurrency.unit.EUR': '€',\n 'portfolio.smallCheckout.contributionValueCurrency.unit.CHF': 'Fr.',\n 'portfolio.smallCheckout.contributionValueCurrency.validation.tooLow.CHF':\n 'Der Wert muss mindestens 10 CHF betragen',\n 'portfolio.smallCheckout.contributionValueCurrency.validation.tooLow.EUR':\n 'Der Wert muss mindestens 10 Euro betragen.',\n 'portfolio.smallCheckout.contributionValueCurrency.validation.empty':\n 'Bitte geben Sie einen Wert ein',\n 'portfolio.smallCheckout.contributionValueCurrency.validation.tooHigh':\n 'Für größere Einkäufe kontaktieren Sie bitte unser Verkaufsteam',\n\n 'portfolio.smallCheckout.contributionValueTons.label': 'Beitrag in Tonnen',\n\n 'portfolio.smallCheckout.submitButton': 'Credits kaufen',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'components.projectGridCard.certified': 'Zertifiziert, {year}',\n 'components.projectGridCard.certificationInProgress':\n 'Zertifizierung ist in Arbeit',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.comparison.backgroundShapes': 'Hintergrundformen',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.cta.backgroundShapes': 'Dunkle Hintergrundformen',\n 'sections.cta.backgroundShapesLight': 'Helle Hintergrundformen',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.customerCard.more': 'Weiterlesen',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.customerQuoteCard.more': 'Weiterlesen',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.events.loadMore': 'Mehr laden',\n 'sections.events.noUpcomingEvents':\n 'Keine bevorstehenden Veranstaltungen gefunden',\n 'sections.events.noPastEvents': 'Keine vergangenen Veranstaltungen gefunden',\n 'sections.eventsFilter.searchPlaceholder': 'Suchen',\n 'sections.events.eventsFilter.eventType': 'Event Type',\n 'sections.events.eventsFilter.language': 'Sprache',\n 'sections.events.eventsFilter.sortBy.title': 'Sortieren nach',\n 'sections.events.eventsFilter.sortBy.newest': 'Neueste zuerst',\n 'sections.events.eventsFilter.sortBy.oldest': 'Älteste zuerst',\n};\n\nexport default messagesDe;\n","const messagesDe = {\n 'sections.glossary.copyButtonLabel':\n 'Kopiere den Link zu diesem Abschnitt in die Zwischenablage',\n 'sections.glossary.copySuccessMessage': 'Link in die Zwischenablage kopiert',\n 'sections.glossary.copyFailureMessage':\n 'Link konnte nicht in die Zwischenablage kopiert werden',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.projectFacts.projectInfo.value': 'Projekt Infos',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.projectsMap.link.text': 'Mehr Infos',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.shopCheckout.intro.price': 'Preis',\n\n 'sections.shopCheckout.contributionValue.label.EUR':\n 'Geben sie einen Betrag in € ein',\n 'sections.shopCheckout.contributionValue.label.CHF':\n 'Geben sie einen Betrag in CHF ein',\n 'sections.shopCheckout.contributionValue.unit.EUR': '€',\n 'sections.shopCheckout.contributionValue.unit.CHF': 'CHF',\n 'sections.shopCheckout.contributionValue.validation.empty':\n 'Bitte geben sie einen Betrag ein',\n 'sections.shopCheckout.contributionValue.validation.tooLow.EUR':\n 'Der Betrag muss mindestens 10 Euro sein',\n 'sections.shopCheckout.contributionValue.validation.tooLow.CHF':\n 'Der Betrag muss mindestens 10 CHF sein',\n 'sections.shopCheckout.contributionValue.validation.tooHigh':\n 'Für größere Einkäufe kontaktieren Sie bitte unser Verkaufsteam über office@tree.ly',\n\n 'sections.shopCheckout.summary.kg': 'Menge',\n 'sections.shopCheckout.summary.price': 'Preis',\n 'sections.shopCheckout.summary.price.taxNotIncluded': 'ohne Steuern',\n 'sections.shopCheckout.summary.price.taxIncluded':\n 'Preis inklusive Steuern: {number}',\n\n 'sections.shopCheckout.submit': 'Kaufen',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.textCarousel.moveRight': 'Nach rechts bewegen',\n 'sections.textCarousel.moveLeft': 'Nach links bewegen',\n};\nexport default messagesDe;\n","const messagesDe = {\n 'sections.timeline.backgroundShapes': 'Hintergrundformen',\n 'sections.timeline.showMoreButton': 'Drei weitere Meilensteine anzeigen',\n};\nexport default messagesDe;\n","const unitMessagesDe = {\n 'unit.formatter.tonsCo2': '{number} /tCO₂',\n 'unit.formatter.tonsCo2PerYear': '{number} tCO₂/Jahr',\n};\nexport default unitMessagesDe;\n","import { STRAPI_FALLBACK_LOCALE } from '../constants/strapi';\nimport rootMessagesDe from '../rootMessages.de';\nimport rootMessagesEn from '../rootMessages.en';\n\nconst messages = {\n en: rootMessagesEn,\n de: rootMessagesDe,\n};\n\nconst getMessages = (locale: string) => {\n const messagesLocale = Object.keys(messages).includes(`${locale}`)\n ? (locale as keyof typeof messages)\n : STRAPI_FALLBACK_LOCALE;\n\n return messages[messagesLocale];\n};\n\nexport default getMessages;\n","import comparisonMessagesEn from './slices/Comparison/messages.en';\nimport creditsAvailableBadgeMessagesEn from './components/CreditsAvailableBadge/messages.en';\nimport ctaMessagesEn from './slices/Cta/messages.en';\nimport customerCardMessagesEn from './components/CustomerCard/messages.en';\nimport customerQuoteCardMessagesEn from './components/CustomerQuoteCard/messages.en';\nimport eventCardMessagesEn from './components/EventCard/messages.en';\nimport eventsMessagesEn from './slices/Events/messages.en';\nimport glossaryMessagesEn from './slices/Glossary/messages.en';\nimport portfolioDocumentsDownloadListMessagesEn from './components/portfolio/DocumentsDownloadList/messages.en';\nimport projectFactsMessagesEn from './slices/ProjectFacts/messages.en';\nimport projectGridCardMessagesEn from './components/ProjectGridCard/messages.en';\nimport projectsMapMessagesEn from './slices/ProjectsMap/messages.en';\nimport portfolioProjectInfoMessagesEn from './components/portfolio/ProjectInfo/messages.en';\nimport portfolioSmallCheckoutMessagesEn from './components/portfolio/SmallCheckout/messages.en';\nimport shopCheckoutMessagesEn from './slices/ShopCheckout/messages.en';\nimport textCarouselMessagesEn from './slices/TextCarousel/messages.en';\nimport timelineMessagesEn from './slices/Timeline/messages.en';\n\nimport unitMessagesEn from './unit.messages.en';\n\nconst rootMessagesEn = {\n //\n // Components\n //\n ...creditsAvailableBadgeMessagesEn,\n ...eventCardMessagesEn,\n ...portfolioDocumentsDownloadListMessagesEn,\n ...portfolioProjectInfoMessagesEn,\n ...portfolioSmallCheckoutMessagesEn,\n ...projectGridCardMessagesEn,\n\n //\n // Slices\n //\n ...comparisonMessagesEn,\n ...ctaMessagesEn,\n ...customerCardMessagesEn,\n ...customerQuoteCardMessagesEn,\n ...eventsMessagesEn,\n ...glossaryMessagesEn,\n ...projectFactsMessagesEn,\n ...projectsMapMessagesEn,\n ...shopCheckoutMessagesEn,\n ...textCarouselMessagesEn,\n ...timelineMessagesEn,\n\n //\n // Units\n //\n ...unitMessagesEn,\n};\n\nexport default rootMessagesEn;\n","const messagesEn = {\n 'components.creditsAvailableBadge.text.yes': 'Credits available',\n 'components.creditsAvailableBadge.text.some': 'Some remaining credits',\n 'components.creditsAvailableBadge.text.no': 'No remaining credits',\n 'components.creditsAvailableBadge.text.notYet': 'Credits available soon',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'sections.eventCard.recommendedEvent': 'Recommended Event',\n 'sections.eventCard.buttonShowMore': 'Show More',\n 'sections.eventCard.buttonShowLess': 'Show Less',\n\n 'sections.eventCard.eventType.conference': 'Conference',\n 'sections.eventCard.eventType.webinar': 'Webinar',\n 'sections.eventCard.eventType.forestwalk': 'Forest Walk',\n 'sections.eventCard.eventType.partnerevent': 'Partner Event',\n 'sections.eventCard.eventType.lunch&learn': 'Lunch & Learn',\n 'sections.eventCard.eventType.fair': 'Fair',\n 'sections.eventCard.eventType.festival': 'Festival',\n 'sections.eventCard.eventType.roadshow': 'Roadshow',\n 'sections.eventCard.eventType.meetup': 'Meet Up',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'features.portfolio.documentsDownloadList.projectDocuments':\n 'Project documents',\n 'features.portfolio.documentsDownloadList.downloadDocument':\n 'Download document',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'features.projectInfo.projectInfo.value': 'Project Infos',\n 'features.projectInfo.properties.area': 'Project Area',\n 'features.projectInfo.properties.location': 'Location',\n 'features.projectInfo.properties.start': 'Project Start Date',\n 'features.projectInfo.properties.timeSpan': 'Project Time Span',\n 'features.projectInfo.properties.projectType': 'Project Type',\n 'features.projectInfo.properties.projectDeveloper': 'Project Developer',\n 'features.projectInfo.properties.verificationStandard.label':\n 'Verification Standard',\n 'features.projectInfo.properties.verificationStandard.value.SilvaconsultFCSISO14':\n 'SILVACONSULT® Forest Carbon Standard, ISO 14064-2',\n 'features.projectInfo.properties.verificationStandard.value.MfKWCH':\n 'Methodik für Klimaschutzprojekte im Wald für die Schweiz',\n 'features.projectInfo.properties.projectVolume.label': 'Project Volume',\n 'features.projectInfo.properties.projectVolume.toolTip':\n \"This is the average amount of credits that are issued per year. This value doesn't represent availabilities.\",\n 'features.projectInfo.properties.riskBuffer': 'Risk Buffer Share',\n\n 'features.projectInfo.properties.year':\n '{years} {years, plural, one {year} other {years} }',\n};\n\nexport default messagesEn;\n","const messagesEn = {\n 'portfolio.smallCheckout.price.taxNotIncluded': 'not including tax',\n 'portfolio.smallCheckout.price.taxIncluded': 'Price including tax: {number}',\n\n 'portfolio.smallCheckout.contributionValueCurrency.label.CHF':\n 'Contribution Amount in CHF',\n 'portfolio.smallCheckout.contributionValueCurrency.label.EUR':\n 'Contribution Amount in €',\n 'portfolio.smallCheckout.contributionValueCurrency.unit.EUR': '€',\n 'portfolio.smallCheckout.contributionValueCurrency.unit.CHF': 'CHF',\n 'portfolio.smallCheckout.contributionValueCurrency.validation.tooLow.CHF':\n 'The value must be at least 10 CHF',\n 'portfolio.smallCheckout.contributionValueCurrency.validation.tooLow.EUR':\n 'The value must be at least 10 Euro',\n 'portfolio.smallCheckout.contributionValueCurrency.validation.empty':\n 'Please enter a value',\n 'portfolio.smallCheckout.contributionValueCurrency.validation.tooHigh':\n 'For bigger purchases please contact our sales team',\n\n 'portfolio.smallCheckout.contributionValueTons.label':\n 'Contribution Amount in Tons',\n\n 'portfolio.smallCheckout.submitButton': 'Buy credits',\n};\nexport default messagesEn;\n","const messagesDe = {\n 'components.projectGridCard.certified': 'Certified, {year}',\n 'components.projectGridCard.certificationInProgress':\n 'Certification in progress',\n};\nexport default messagesDe;\n","const messagesEn = {\n 'sections.comparison.backgroundShapes': 'Background shapes',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'sections.cta.backgroundShapesDark': 'Dark background shapes',\n 'sections.cta.backgroundShapesLight': 'Light background shapes',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'sections.customerCard.more': 'Read more',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'sections.customerQuoteCard.more': 'Read more',\n};\nexport default messagesEn;\n","const messagesDe = {\n 'sections.events.loadMore': 'Load more',\n 'sections.events.noUpcomingEvents': 'No upcoming events found',\n 'sections.events.noPastEvents': 'No past events found',\n 'sections.events.eventsFilter.searchPlaceholder': 'Search',\n 'sections.events.eventsFilter.eventType': 'Event Type',\n 'sections.events.eventsFilter.language': 'Language',\n 'sections.events.eventsFilter.sortBy.title': 'Sort by',\n 'sections.events.eventsFilter.sortBy.newest': 'Newest first',\n 'sections.events.eventsFilter.sortBy.oldest': 'Oldest first',\n};\n\nexport default messagesDe;\n","const messagesEn = {\n 'sections.glossary.copyButtonLabel':\n 'Copy a link to this section to your clipboard',\n 'sections.glossary.copySuccessMessage': 'Copied the link to your clipboard',\n 'sections.glossary.copyFailureMessage': 'Could not copy link to clipboard',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'sections.projectFacts.projectInfo.value': 'Project Infos',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'sections.projectsMap.link.text': 'Show more info',\n};\nexport default messagesEn;\n","const messagesEn = {\n 'sections.shopCheckout.intro.price': 'Price',\n\n 'sections.shopCheckout.contributionValue.label.EUR':\n 'Enter contribution value in €',\n 'sections.shopCheckout.contributionValue.label.CHF':\n 'Enter contribution value in CHF',\n 'sections.shopCheckout.contributionValue.unit.EUR': '€',\n 'sections.shopCheckout.contributionValue.unit.CHF': 'CHF',\n 'sections.shopCheckout.contributionValue.validation.empty':\n 'Please enter a value',\n 'sections.shopCheckout.contributionValue.validation.tooLow.EUR':\n 'Der Betrag muss mindestens 10 Euro sein',\n 'sections.shopCheckout.contributionValue.validation.tooLow.CHF':\n 'Der Betrag muss mindestens 10 CHF sein',\n 'sections.shopCheckout.contributionValue.validation.tooHigh':\n 'For bigger purchases please contact our sales team via office@tree.ly',\n\n 'sections.shopCheckout.summary.kg': 'Quantity',\n 'sections.shopCheckout.summary.price': 'Price',\n 'sections.shopCheckout.summary.price.taxNotIncluded': 'not including tax',\n 'sections.shopCheckout.summary.price.taxIncluded':\n 'Price including tax: {number}',\n\n 'sections.shopCheckout.submit': 'Checkout',\n};\nexport default messagesEn;\n","const messagesDe = {\n 'sections.textCarousel.moveRight': 'Move right',\n 'sections.textCarousel.moveLeft': 'Move left',\n};\nexport default messagesDe;\n","const messagesEn = {\n 'sections.timeline.backgroundShapes': 'Background shapes',\n 'sections.timeline.showMoreButton': 'Show three more milestones',\n};\nexport default messagesEn;\n","const unitMessagesEn = {\n 'unit.formatter.tonsCo2': '{number} /tCO₂',\n 'unit.formatter.tonsCo2PerYear': '{number} tCO₂/year',\n};\nexport default unitMessagesEn;\n","import React, { createContext } from 'react';\nimport { createIntl, createIntlCache } from 'react-intl';\nimport { Global } from '@emotion/react';\nimport { GLOBAL_STYLE } from '../../constants/globalStyle';\nimport getMessages from '../../utils/getMessages';\nimport strapiClient from '../../integrations/strapi/strapiClient';\nimport { SWRConfig } from 'swr/_internal';\n\nexport type AnalyticsFunction = ({\n type,\n props,\n}: {\n type: 'track' | 'page';\n props?: Record<string, any>;\n}) => void;\n\nexport const AnalyticsContext = createContext<AnalyticsFunction | undefined>(\n undefined\n);\n\nconst cache = createIntlCache();\n\nconst intlFactory = (locale: string) =>\n createIntl(\n {\n locale,\n messages: getMessages(locale),\n },\n cache\n );\n\nexport const IntlContext = createContext(intlFactory('en'));\n\nexport interface ContextProviderProps {\n children: React.ReactNode;\n locale: string;\n analyticsFunction?: AnalyticsFunction;\n}\n\nexport const ContextProvider: React.FC<ContextProviderProps> = ({\n children,\n locale,\n analyticsFunction,\n}: ContextProviderProps): JSX.Element => {\n const fetcher = async (resource: any, init: any) => {\n const response = await strapiClient.get(`${resource}`, {\n ...init,\n headers: {},\n });\n // Check if the response was an error:\n if (response.status < 200 || response.status >= 300) {\n let errorData = { message: '' };\n try {\n errorData = await response.data;\n } catch (error) {\n errorData = {\n message: `An unknown error occurred while fetching data.`,\n };\n }\n throw new Error(errorData.message); // Throwing the error will lead to onError being called\n }\n\n return { body: await response.data, headers: response.headers };\n };\n return (\n <>\n <SWRConfig\n value={{\n fetcher,\n }}\n >\n <Global styles={{ GLOBAL_STYLE }} />\n <IntlContext.Provider value={intlFactory(locale)}>\n <AnalyticsContext.Provider value={analyticsFunction}>\n {children}\n </AnalyticsContext.Provider>\n </IntlContext.Provider>\n </SWRConfig>\n </>\n );\n};\n","import React, { useContext } from 'react';\nimport { Button } from 'boemly';\nimport Link from 'next/link';\nimport { useDetectAdBlock } from 'adblock-detect-react';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport openHubSpotChat from '../../utils/openHubSpotChat';\nimport { AnalyticsContext } from '../ContextProvider/ContextProvider';\n\nexport interface StrapiLinkButtonProps {\n link: StrapiLink;\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n variant?: 'solid' | 'outline' | 'outlineWhite' | 'link' | 'ghost';\n colorScheme?: 'primary' | 'gray' | 'orange' | 'green' | 'white';\n rightIcon?: JSX.Element;\n leftIcon?: JSX.Element;\n mt?: any;\n mr?: any;\n mb?: any;\n ml?: any;\n mx?: any;\n my?: any;\n background?: string;\n width?: string;\n component?: string;\n}\n\nexport const StrapiLinkButton: React.FC<StrapiLinkButtonProps> = ({\n link,\n component = 'StrapiLinkButton',\n ...buttonProps\n}: StrapiLinkButtonProps) => {\n const adBlockDetected = useDetectAdBlock();\n const analyticsFunction = useContext(AnalyticsContext);\n\n const handleClick = () => {\n const buttonUrl =\n link.intercomLauncher && adBlockDetected\n ? 'mailto:hello@tree.ly'\n : strapiLinkUrl(link);\n\n analyticsFunction?.({\n type: 'track',\n props: {\n action: 'click',\n component,\n buttonText: link.text,\n buttonUrl,\n },\n });\n };\n\n if (link.intercomLauncher) {\n if (adBlockDetected) {\n return (\n <Button\n {...buttonProps}\n as={Link}\n href=\"mailto:hello@tree.ly\"\n onClick={handleClick}\n >\n {link.text}\n </Button>\n );\n }\n\n return (\n <Button\n {...buttonProps}\n onClick={() => {\n handleClick();\n openHubSpotChat();\n }}\n >\n {link.text}\n </Button>\n );\n }\n\n return (\n <Button\n {...buttonProps}\n as={Link}\n href={strapiLinkUrl(link)}\n onClick={handleClick}\n >\n {link.text}\n </Button>\n );\n};\n","const openHubSpotChat = () => {\n const w = window as any;\n\n if (w.HubSpotConversations) {\n w.HubSpotConversations.widget.open();\n } else {\n w.hsConversationsOnReady = [\n () => {\n w.HubSpotConversations.widget.open();\n },\n ];\n }\n};\n\nexport default openHubSpotChat;\n","import React from 'react';\nimport { Box, DefaultSectionHeader, Flex, Gradient, Wrapper } from 'boemly';\nimport Image from 'next/image';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport StrapiButtonWithVariant from '../../models/strapi/StrapiButtonWithVariant';\n\nexport interface HeroProps {\n slice: {\n tagline?: string;\n title: string;\n subTitle: string;\n button?: StrapiLink;\n additionalButtons: StrapiButtonWithVariant[];\n image?: StrapiImage;\n textAlign: 'left' | 'center';\n shape?: StrapiImage;\n };\n}\n\nexport const Hero = ({ slice }: HeroProps): JSX.Element => (\n <Box\n position=\"relative\"\n width=\"full\"\n height=\"var(--default-hero-height)\"\n minHeight=\"2xl\"\n backgroundColor=\"gray.900\"\n overflowX=\"hidden\"\n >\n {slice.image && (\n <>\n <Image\n src={strapiMediaUrl(slice.image.img, 'xLarge')}\n alt={slice.image.alt}\n fill\n style={{ objectFit: slice.image.objectFit || 'cover' }}\n />\n <Gradient />\n </>\n )}\n {slice.shape && (\n <Box\n position=\"absolute\"\n bottom=\"0\"\n borderTopRightRadius=\"full\"\n width={['3xs', null, '2xs', null, 'sm']}\n height={['3xs', null, '2xs', null, 'sm']}\n right={['-16', null, '24']}\n >\n <Image\n src={strapiMediaUrl(slice.shape.img, 'medium')}\n alt={slice.shape.alt}\n fill\n style={{\n objectFit: slice.shape.objectFit || 'cover',\n borderTopRightRadius: 'var(--boemly-radii-full)',\n }}\n />\n </Box>\n )}\n <Box\n position=\"absolute\"\n left=\"0\"\n top=\"56%\"\n width=\"full\"\n textAlign={slice.textAlign}\n transform=\"translateY(-50%)\"\n >\n <Wrapper>\n <>\n <DefaultSectionHeader\n isHero\n tagline={slice.tagline}\n title={slice.title}\n text={slice.subTitle}\n taglineProps={{ color: 'white' }}\n titleProps={{\n color: 'white',\n maxW: slice.textAlign === 'center' ? '4xl' : '3xl',\n mx: slice.textAlign === 'center' ? 'auto' : 'unset',\n textAlign: slice.textAlign,\n }}\n textProps={{\n maxW: '2xl',\n mx: slice.textAlign === 'center' ? 'auto' : 'unset',\n textAlign: slice.textAlign,\n color: 'white',\n }}\n />\n\n <Flex\n gap=\"8\"\n justifyContent={slice.textAlign === 'center' ? 'center' : 'start'}\n >\n {slice.button && (\n <StrapiLinkButton\n key={slice.button.id}\n mt=\"10\"\n size=\"xl\"\n link={slice.button}\n component=\"Hero\"\n />\n )}\n {slice.additionalButtons.map((button) => (\n <StrapiLinkButton\n key={button.button.id}\n mt=\"10\"\n size=\"xl\"\n variant={button.variant}\n link={button.button}\n component=\"Hero\"\n />\n ))}\n </Flex>\n </>\n </Wrapper>\n </Box>\n </Box>\n);\n","import React from 'react';\nimport {\n Box,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Flex,\n Heading,\n SimpleGrid,\n Spacer,\n Text,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\n\nexport interface IconGridProps {\n slice: {\n tagline?: string;\n title?: string;\n subTitle?: string;\n iconsWithTextAndButton: {\n id: number;\n title: string;\n text: string;\n icon: StrapiImage;\n button?: StrapiLink;\n }[];\n };\n}\n\nexport const IconGrid = ({ slice }: IconGridProps): JSX.Element => {\n const columns = () => {\n if (slice.iconsWithTextAndButton.length === 2) {\n return [1, null, null, 2, 2];\n }\n if (slice.iconsWithTextAndButton.length === 1) {\n return 1;\n }\n return [1, null, null, 2, 3];\n };\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n {slice.title ? (\n <>\n <Flex alignItems=\"center\" flexDirection=\"column\">\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.subTitle}\n taglineProps={{ maxW: '2xl', textAlign: 'center' }}\n titleProps={{ maxW: '3xl', textAlign: 'center' }}\n textProps={{ maxW: '3xl', textAlign: 'center' }}\n />\n </Flex>\n <Spacer h=\"20\" />\n </>\n ) : (\n <></>\n )}\n\n <SimpleGrid\n columns={columns()}\n gap={slice.iconsWithTextAndButton.length === 2 ? '14' : '16'}\n rowGap={['16', null, null, '20']}\n >\n {slice.iconsWithTextAndButton.map((iconWithTextAndButton) => (\n <Box key={iconWithTextAndButton.id}>\n <Box\n margin=\"0 auto\"\n backgroundColor=\"primary.50\"\n borderRadius=\"full\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-around\"\n width=\"6.5rem\"\n height=\"6.5rem\"\n >\n <Box position=\"absolute\" width=\"12\" height=\"12\">\n <Image\n src={strapiMediaUrl(\n iconWithTextAndButton.icon.img,\n 'xSmall'\n )}\n alt={iconWithTextAndButton.icon.alt}\n fill\n style={{\n objectFit:\n iconWithTextAndButton.icon.objectFit || 'contain',\n }}\n />\n </Box>\n </Box>\n <Heading size=\"xl\" textAlign=\"center\" mb=\"4\" mt=\"8\">\n {iconWithTextAndButton.title}\n </Heading>\n <Text size=\"mdRegularNormal\" textAlign=\"center\">\n {iconWithTextAndButton.text}\n </Text>\n {iconWithTextAndButton.button && (\n <Box textAlign=\"center\">\n <StrapiLinkButton\n key={iconWithTextAndButton.button.id}\n mt=\"8\"\n size=\"md\"\n variant=\"outline\"\n link={iconWithTextAndButton.button}\n component=\"IconGrid\"\n />\n </Box>\n )}\n </Box>\n ))}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React from 'react';\n\nconst LinkedInIcon = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clipPath=\"url(#clip0_112_606)\">\n <path\n d=\"M11.9286 11.9285H9.85424V8.67998C9.85424 7.90534 9.84042 6.90813 8.77539 6.90813C7.695 6.90813 7.52969 7.75213 7.52969 8.62357V11.9283H5.45533V5.24799H7.44671V6.16093H7.47459C7.67388 5.82018 7.96186 5.53986 8.30786 5.34984C8.65386 5.15981 9.04493 5.06719 9.4394 5.08183C11.5418 5.08183 11.9295 6.46473 11.9295 8.2638L11.9286 11.9285ZM3.11477 4.33484C2.87669 4.33489 2.64393 4.26433 2.44595 4.13209C2.24796 3.99985 2.09365 3.81188 2.0025 3.59193C1.91135 3.37199 1.88746 3.12995 1.93387 2.89644C1.98027 2.66292 2.09488 2.44841 2.26321 2.28003C2.43153 2.11164 2.646 1.99696 2.8795 1.95047C3.11301 1.90398 3.35504 1.92778 3.57502 2.01884C3.795 2.10992 3.98303 2.26417 4.11533 2.46211C4.24764 2.66004 4.31829 2.89277 4.31833 3.13085C4.31836 3.28894 4.28725 3.44547 4.22678 3.59153C4.1663 3.7376 4.07767 3.87031 3.96591 3.98211C3.85415 4.09392 3.72146 4.18261 3.57541 4.24313C3.42937 4.30365 3.27286 4.33481 3.11477 4.33484ZM4.15194 11.9285H2.07544V5.24799H4.15194V11.9285ZM12.9628 0.000953808H1.03307C0.762304 -0.00210183 0.501383 0.102466 0.307673 0.291681C0.113961 0.480895 0.00330461 0.739273 0 1.01004V12.9892C0.00319151 13.2602 0.113783 13.5187 0.307487 13.7081C0.501192 13.8975 0.762169 14.0023 1.03307 13.9994H12.9628C13.2342 14.0028 13.496 13.8983 13.6904 13.7089C13.8848 13.5195 13.9962 13.2607 14 12.9892V1.00918C13.9961 0.737873 13.8846 0.479199 13.6902 0.28999C13.4958 0.10078 13.2341 -0.00348904 12.9628 8.91429e-05\"\n fill=\"#0A66C2\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_112_606\">\n <rect width=\"14\" height=\"14\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n);\n\nexport default LinkedInIcon;\n","import React from 'react';\nimport { CaretRight, Globe } from '@phosphor-icons/react';\nimport LinkedInIcon from '../../icons/LinkedInIcon';\nimport StrapiLinkWithIcon from '../../models/strapi/StrapiLinkWithIcon';\nimport StrapiLinkButton from '../StrapiLinkButton';\nimport { StrapiLinkButtonProps } from '../StrapiLinkButton/StrapiLinkButton';\n\nexport interface StrapiLinkButtonWithIconProps\n extends Omit<StrapiLinkButtonProps, 'link'> {\n link: StrapiLinkWithIcon;\n}\n\nexport const StrapiLinkButtonWithIcon: React.FC<\n StrapiLinkButtonWithIconProps\n> = ({ link, ...props }: StrapiLinkButtonWithIconProps) => {\n const getLinkIcon = (destination: string) => {\n switch (destination) {\n case 'linkedin': {\n return <LinkedInIcon />;\n }\n case 'web': {\n return <Globe />;\n }\n default: {\n return <CaretRight />;\n }\n }\n };\n\n return (\n <StrapiLinkButton\n {...props}\n link={link.link}\n rightIcon={getLinkIcon(link.destination)}\n />\n );\n};\n","import React from 'react';\nimport {\n Box,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Flex,\n Heading,\n SimpleGrid,\n Text,\n useToken,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport StrapiLinkButtonWithIcon from '../../components/StrapiLinkButtonWithIcon';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport StrapiLinkWithIcon from '../../models/strapi/StrapiLinkWithIcon';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\n\ninterface ImageGridSlice extends StrapiDefaultHeader {\n images: {\n id: number;\n title: string;\n subTitle?: string;\n image: StrapiImage;\n links: StrapiLinkWithIcon[];\n }[];\n}\nexport interface ImageGridProps {\n slice: ImageGridSlice;\n}\n\nexport const ImageGrid: React.FC<ImageGridProps> = ({\n slice,\n}: ImageGridProps) => {\n const [primary50] = useToken('colors', ['primary.50']);\n\n return (\n <DefaultSectionContainer backgroundColor={primary50} title={slice.title}>\n <Wrapper>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n taglineProps={{ textAlign: 'center' }}\n titleProps={{ textAlign: 'center', maxW: '6xl', marginX: 'auto' }}\n textProps={{ textAlign: 'center', maxW: '2xl', marginX: 'auto' }}\n />\n\n <SimpleGrid\n mt=\"24\"\n columns={3}\n gap=\"24\"\n rowGap=\"16\"\n minChildWidth=\"16rem\"\n >\n {slice.images.map(({ id, title, subTitle, image, links }) => (\n <Box key={id}>\n <Box position=\"relative\" height=\"sm\" borderRadius=\"xl\">\n <Image\n src={strapiMediaUrl(image.img, 'medium')}\n alt={image.alt}\n fill\n style={{\n objectFit: image.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n <Heading size=\"xl\" mt=\"4\">\n {title}\n </Heading>\n {subTitle && <Text size=\"mdRegularNormal\">{subTitle}</Text>}\n {links && links.length > 0 && (\n <Flex mt=\"3\" flexDir=\"row\" gap=\"2\" flexWrap=\"wrap\">\n {links.map((link) => (\n <StrapiLinkButtonWithIcon\n key={link.id}\n link={link}\n size=\"sm\"\n variant=\"outline\"\n component=\"ImageGrid\"\n />\n ))}\n </Flex>\n )}\n </Box>\n ))}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React, { Fragment } from 'react';\nimport {\n Box,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Heading,\n SimpleGrid,\n Text,\n useMediaQuery,\n useToken,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport { CaretRight } from '@phosphor-icons/react';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport { BREAKPOINT_LG_QUERY } from '../../constants/breakpoints';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport { CDN_URI } from '../../constants/api';\n\ninterface ImageTextSequenceSlice extends StrapiDefaultHeader {\n imageTextRows: {\n id: number;\n title: string;\n text: string;\n button?: StrapiLink;\n image: StrapiImage;\n }[];\n background?: boolean;\n}\nexport interface ImageTextSequenceProps {\n slice: ImageTextSequenceSlice;\n}\n\nexport const ImageTextSequence: React.FC<ImageTextSequenceProps> = ({\n slice,\n}: ImageTextSequenceProps) => {\n const [oneColumnGrid] = useMediaQuery(BREAKPOINT_LG_QUERY);\n const [primary50] = useToken('colors', ['primary.50']);\n const [gray700] = useToken('colors', ['gray.700']);\n\n return (\n <DefaultSectionContainer backgroundColor={primary50} title={slice.title}>\n {slice.background ? (\n <>\n <Box\n position=\"absolute\"\n top=\"0\"\n right=\"24\"\n display={['none', null, null, 'unset']}\n >\n <Image\n src={`${CDN_URI}/assets/v3/strapi-slices/desktop-map-border.svg`}\n alt=\"Map\"\n width=\"786\"\n height=\"897\"\n />\n </Box>\n <Box\n position=\"absolute\"\n top=\"64\"\n right=\"-14\"\n display={['unset', null, null, 'none']}\n >\n <Image\n src={`${CDN_URI}/assets/v3/strapi-slices/mobile-map-border.svg`}\n alt=\"Map\"\n width=\"227\"\n height=\"452\"\n />\n </Box>\n </>\n ) : (\n <></>\n )}\n <Wrapper>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n taglineProps={{ textAlign: ['left', null, null, null, 'center'] }}\n titleProps={{\n maxW: '6xl',\n marginX: ['0', null, null, null, 'auto'],\n textAlign: ['left', null, null, null, 'center'],\n }}\n textProps={{\n maxW: '2xl',\n marginX: ['0', null, null, null, 'auto'],\n textAlign: ['left', null, null, null, 'center'],\n color: 'black',\n }}\n />\n\n <SimpleGrid\n gap=\"16\"\n mt={['28', null, null, null, '40']}\n columns={[1, null, null, null, 2]}\n >\n {slice.imageTextRows.map(\n ({ id, title, text, button, image }, index) => {\n const imageBox = (\n <Box>\n <Box\n position=\"relative\"\n width=\"full\"\n minHeight={['2xs', null, null, 'sm']}\n >\n <Image\n src={strapiMediaUrl(image.img, 'large')}\n alt={image.alt}\n fill\n style={{\n objectFit: image.objectFit || 'contain',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n </Box>\n );\n return (\n <Fragment key={id}>\n {(oneColumnGrid || index % 2 !== 0) && imageBox}\n <Box\n display=\"flex\"\n alignItems=\"flex-start\"\n flexDirection=\"column\"\n justifyContent=\"center\"\n >\n <Heading as=\"h2\" size=\"xl\" mb=\"4\">\n {title}\n </Heading>\n <Text size=\"mdRegularNormal\">{text}</Text>\n {button && (\n <StrapiLinkButton\n mt=\"5\"\n link={button}\n size=\"sm\"\n variant=\"outline\"\n rightIcon={<CaretRight size=\"10\" color={gray700} />}\n component=\"ImageTextSequence\"\n />\n )}\n </Box>\n {!oneColumnGrid && index % 2 === 0 && imageBox}\n </Fragment>\n );\n }\n )}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React, { useContext } from 'react';\nimport {\n DefaultSectionContainer,\n DefaultSectionHeader,\n Grid,\n GridItem,\n PortfolioCard,\n Spacer,\n BoemlyList,\n Wrapper,\n} from 'boemly';\nimport { ArrowRight } from '@phosphor-icons/react';\nimport Image from 'next/image';\nimport { useRouter } from 'next/router';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiPortfolioCard from '../../models/strapi/StrapiPortfolioCard';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport { AnalyticsContext } from '../../components/ContextProvider/ContextProvider';\n\ninterface LeftTextRightCardSlice extends StrapiDefaultHeader {\n checkMarkLabels?: {\n id: number;\n text: string;\n }[];\n button?: StrapiLink;\n card?: StrapiPortfolioCard;\n}\nexport interface LeftTextRightCardProps {\n slice: LeftTextRightCardSlice;\n}\n\nexport const LeftTextRightCard: React.FC<LeftTextRightCardProps> = ({\n slice,\n}: LeftTextRightCardProps) => {\n const { push } = useRouter();\n const analyticsFunction = useContext(AnalyticsContext);\n\n const handleCardButtonClick = () => {\n if (slice.card?.button) {\n if (analyticsFunction) {\n analyticsFunction({\n type: 'track',\n props: {\n action: 'click',\n component: 'LeftTextRightCard',\n buttonText: slice.card?.button?.text,\n buttonUrl: strapiLinkUrl(slice.card?.button),\n cardTitle: slice.card?.title,\n },\n });\n }\n\n push(strapiLinkUrl(slice.card?.button));\n }\n };\n\n return (\n <DefaultSectionContainer title={slice.title}>\n <Wrapper>\n <Grid\n templateColumns={[\n 'repeat(8, 1fr)',\n null,\n null,\n null,\n 'repeat(12, 1fr)',\n ]}\n templateRows={['repeat(2, 1fr)', null, null, null, 'repeat(1, 1fr)']}\n rowGap=\"12\"\n >\n <GridItem colSpan={8} rowSpan={1} pr={['0', null, null, null, '28']}>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n />\n\n {slice.checkMarkLabels && (\n <>\n <Spacer height=\"10\" />\n <BoemlyList listItems={slice.checkMarkLabels} />\n <Spacer height=\"10\" />\n </>\n )}\n\n {slice.button && (\n <StrapiLinkButton\n link={slice.button}\n size=\"md\"\n colorScheme=\"white\"\n variant=\"outline\"\n rightIcon={<ArrowRight />}\n component=\"LeftTextRightCard\"\n />\n )}\n </GridItem>\n <GridItem\n colSpan={[8, null, null, null, 4]}\n rowSpan={1}\n position=\"relative\"\n >\n {slice.card && (\n <PortfolioCard\n title={slice.card.title}\n button={\n slice.card.button && {\n text: slice.card.button.text,\n onClick: handleCardButtonClick,\n }\n }\n facts={slice.card.facts}\n image={\n <Image\n src={strapiMediaUrl(slice.card.image.img, 'medium')}\n alt={slice.card.image.alt}\n fill\n style={{ objectFit: slice.card.image.objectFit || 'cover' }}\n />\n }\n portfolioNumber={slice.card.portfolioNumber}\n />\n )}\n </GridItem>\n </Grid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React from 'react';\nimport {\n Box,\n DefaultSectionContainer,\n Flex,\n Heading,\n RichText,\n SimpleGrid,\n useToken,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport { ArrowRight } from '@phosphor-icons/react';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport StrapiImageWithLink from '../../models/strapi/StrapiImageWithLink';\nimport StrapiLink from '../../models/strapi/StrapiLink';\n\nexport interface LogoGridWithTextProps {\n slice: {\n title: string;\n text: string;\n button?: StrapiLink;\n logos: StrapiImageWithLink[];\n };\n}\n\nexport const LogoGridWithText: React.FC<LogoGridWithTextProps> = ({\n slice,\n}: LogoGridWithTextProps) => {\n const [primary50] = useToken('colors', ['primary.50']);\n\n return (\n <DefaultSectionContainer backgroundColor={primary50} title={slice.title}>\n <Wrapper>\n <SimpleGrid columns={2} gap=\"28\" minChildWidth=\"16rem\">\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n justifyContent=\"center\"\n alignItems=\"flex-start\"\n >\n <Heading as=\"h2\" size=\"3xl\" mb=\"4\">\n {slice.title}\n </Heading>\n <RichText content={slice.text} />\n {slice.button && (\n <StrapiLinkButton\n link={slice.button}\n size=\"md\"\n colorScheme=\"white\"\n variant=\"outline\"\n mt=\"6\"\n rightIcon={<ArrowRight />}\n component=\"LogoGridWithText\"\n />\n )}\n </Box>\n <Flex flexDir=\"row\" flexWrap=\"wrap\" gap={['12', null, null, '28']}>\n {slice.logos.map((logo) => (\n <Flex\n key={logo.id}\n justifyContent=\"center\"\n alignItems=\"center\"\n flexGrow={1}\n flexShrink={0}\n flexBasis={slice.logos.length > 2 ? '34%' : '90%'} // 34% are just enough to not allow three in one row\n >\n <Box position=\"relative\" height=\"20\" width=\"100%\">\n {logo.link ? (\n <a href={strapiLinkUrl(logo.link)}>\n <Image\n src={strapiMediaUrl(logo.img, 'small')}\n alt={logo.alt}\n fill\n style={{ objectFit: logo.objectFit || 'contain' }}\n />\n </a>\n ) : (\n <Image\n src={strapiMediaUrl(logo.img, 'small')}\n alt={logo.alt}\n fill\n style={{ objectFit: logo.objectFit || 'contain' }}\n />\n )}\n </Box>\n </Flex>\n ))}\n </Flex>\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import styled from '@emotion/styled';\nimport { BREAKPOINT_LG } from '../../constants/breakpoints';\nimport { Box } from 'boemly';\n\nexport const MapHeroContainer = styled(Box)`\n position: relative;\n width: 100vw;\n height: var(--default-hero-height);\n min-height: var(--boemly-sizes-3xl);\n background-color: var(--boemly-colors-primary-50);\n overflow: hidden;\n z-index: var(--boemly-zIndices-base);\n\n @media screen and (max-width: ${BREAKPOINT_LG}) {\n height: auto;\n }\n`;\n\nexport const MapHeroTextContainer = styled(Box)`\n position: absolute;\n width: 100vw;\n top: 56%;\n left: 0;\n transform: translateY(-50%);\n z-index: var(--boemly-zIndices-aboveBase);\n\n @media screen and (max-width: ${BREAKPOINT_LG}) {\n position: relative;\n transform: unset;\n\n padding-top: var(--boemly-space-32);\n }\n`;\n\nexport const ShapeContainer = styled(Box)`\n position: absolute;\n bottom: calc(var(--boemly-space-8) * -1);\n left: 0;\n\n width: var(--boemly-sizes-sm);\n height: var(--boemly-sizes-sm);\n\n border-top-right-radius: var(--boemly-radii-full);\n\n & span,\n div {\n border-top-right-radius: var(--boemly-radii-full);\n }\n\n @media screen and (max-width: ${BREAKPOINT_LG}) {\n display: none;\n }\n`;\n\nexport const MapContainer = styled(Box)`\n position: absolute;\n\n width: 50%;\n height: 100%;\n\n right: 0;\n top: 0;\n\n & img {\n object-fit: cover !important;\n }\n\n @media screen and (max-width: ${BREAKPOINT_LG}) {\n width: 100%;\n height: var(--boemly-sizes-4xl);\n position: relative;\n margin-top: calc(var(--boemly-space-72) * -1);\n background-color: var(--boemly-colors-white);\n\n & img {\n object-fit: contain !important;\n }\n }\n`;\n\nexport const MapGradient = styled(Box)`\n position: absolute;\n top: 0;\n right: 0;\n width: 100%;\n height: 100%;\n\n background: linear-gradient(\n 90deg,\n var(--boemly-colors-primary-50) 0%,\n var(--boemly-colors-primary-50) 10%,\n rgba(243, 246, 245, 0.6) 28%,\n rgba(243, 246, 245, 0) 40%,\n rgba(243, 246, 245, 0) 100%\n );\n\n @media screen and (max-width: ${BREAKPOINT_LG}) {\n background: linear-gradient(\n 180deg,\n var(--boemly-colors-primary-50) 0%,\n var(--boemly-colors-primary-50) 36%,\n rgba(243, 246, 245, 0.12) 46%,\n rgba(243, 246, 245, 0) 100%\n );\n }\n`;\n","import React from 'react';\nimport { DefaultSectionHeader, Flex, useMediaQuery, Wrapper } from 'boemly';\nimport Image from 'next/image';\nimport { BREAKPOINT_LG_QUERY } from '../../constants/breakpoints';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport {\n MapHeroContainer,\n MapHeroTextContainer,\n ShapeContainer,\n MapContainer,\n MapGradient,\n} from './styles';\n\nexport interface MapHeroProps {\n slice: {\n tagline?: string;\n title: string;\n subTitle?: string;\n buttons?: StrapiLink[];\n shape?: StrapiImage;\n map: StrapiImage;\n mobileMap: StrapiImage;\n };\n}\n\nexport const MapHero: React.FC<MapHeroProps> = ({ slice }: MapHeroProps) => {\n const [belowBreakpoint] = useMediaQuery(BREAKPOINT_LG_QUERY);\n\n return (\n <MapHeroContainer maxWidth=\"full\">\n {slice.shape && (\n <ShapeContainer>\n <Image\n src={strapiMediaUrl(slice.shape.img, 'medium')}\n alt={slice.shape.alt}\n fill\n style={{ objectFit: slice.shape.objectFit || 'cover' }}\n />\n </ShapeContainer>\n )}\n <MapHeroTextContainer>\n <Wrapper>\n <>\n <DefaultSectionHeader\n isHero\n tagline={slice.tagline}\n title={slice.title}\n text={slice.subTitle}\n titleProps={{ maxW: ['100%', null, null, null, '60%'] }}\n textProps={{ maxW: ['100%', null, null, null, '55%'] }}\n />\n {slice.buttons && slice.buttons.length > 0 && (\n <Flex mt=\"10\" flexDir=\"row\" gap=\"5\">\n <StrapiLinkButton\n link={slice.buttons[0]}\n size=\"xl\"\n component=\"MapHero\"\n />\n {slice.buttons.length === 2 && (\n <StrapiLinkButton\n link={slice.buttons[1]}\n variant=\"outline\"\n size=\"xl\"\n component=\"MapHero\"\n />\n )}\n </Flex>\n )}\n </>\n </Wrapper>\n </MapHeroTextContainer>\n <MapContainer>\n {belowBreakpoint ? (\n <Image\n src={strapiMediaUrl(slice.mobileMap.img, 'xLarge')}\n alt={slice.mobileMap.alt}\n fill\n style={{ objectFit: slice.mobileMap.objectFit || 'contain' }}\n />\n ) : (\n <Image\n src={strapiMediaUrl(slice.map.img, 'xLarge')}\n alt={slice.map.alt}\n fill\n style={{ objectFit: slice.map.objectFit || 'cover' }}\n />\n )}\n <MapGradient />\n </MapContainer>\n </MapHeroContainer>\n );\n};\n","const convertToKebabCase = (str: string) => {\n const matches =\n str &&\n str.match(\n /[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g\n );\n return matches ? matches.map((x: string) => x.toLowerCase()).join('-') : '';\n};\n\nexport default convertToKebabCase;\n","import React, { useContext } from 'react';\nimport {\n Box,\n Heading,\n HeroCard,\n SimpleGrid,\n Text,\n BoemlyAccordion,\n Wrapper,\n Flex,\n Spacer,\n} from 'boemly';\nimport { ArrowRight } from '@phosphor-icons/react';\nimport { useRouter } from 'next/router';\nimport Image from 'next/image';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport StrapiHeroCard from '../../models/strapi/StrapiHeroCard';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport convertToKebabCase from '../../utils/convertToKebabCase';\nimport { AnalyticsContext } from '../../components/ContextProvider/ContextProvider';\n\nconst VARIANTS = {\n gray: {\n backgroundColor: 'primary.50',\n tagLineColor: 'primary.500',\n textColor: 'black',\n accordionVariant: 'black',\n otherQuestionsBackground: 'primary.700',\n },\n green: {\n backgroundColor: 'primary.800',\n tagLineColor: 'white',\n textColor: 'white',\n accordionVariant: 'white',\n otherQuestionsBackground: 'primary.900',\n },\n white: {\n backgroundColor: 'white',\n tagLineColor: 'primary.500',\n textColor: 'black',\n accordionVariant: 'black',\n otherQuestionsBackground: 'primary.700',\n },\n};\n\nexport interface QAndAProps {\n slice: {\n tagline: string;\n title: string;\n questionsAndAnswers: {\n id: number;\n key: string;\n value: string;\n }[];\n otherQuestions: string;\n button: StrapiLink;\n hero?: StrapiHeroCard;\n variant?: keyof typeof VARIANTS;\n defaultIndex: number[];\n };\n}\n\nexport const QAndA: React.FC<QAndAProps> = ({ slice }: QAndAProps) => {\n const { push } = useRouter();\n const analyticsFunction = useContext(AnalyticsContext);\n\n const handleHeroButtonClick = () => {\n if (slice.hero?.button) {\n analyticsFunction?.({\n type: 'track',\n props: {\n action: 'click',\n component: 'QAndA',\n buttonText: slice.hero.button.text,\n buttonUrl: strapiLinkUrl(slice.hero.button),\n section: 'hero',\n },\n });\n push(strapiLinkUrl(slice.hero.button));\n }\n };\n\n const variant = VARIANTS[slice.variant ?? 'green'];\n\n return (\n <>\n <Box\n pb={slice.hero ? 80 : 28}\n id={convertToKebabCase(slice.title)}\n backgroundColor={variant.backgroundColor}\n >\n <Wrapper>\n <SimpleGrid columns={[1, null, null, 2]}>\n <Box mr=\"16\" paddingY=\"28\">\n <Text size=\"mdMonoUppercase\" color={variant.tagLineColor}>\n {slice.tagline}\n </Text>\n <Heading\n as=\"h2\"\n size=\"3xl\"\n color={variant.textColor}\n mt=\"6\"\n mb=\"16\"\n >\n {slice.title}\n </Heading>\n </Box>\n <Box\n maxHeight={['unset', null, null, 'xl']}\n paddingTop={['0', null, null, '28']}\n paddingRight={['0', null, null, '6']}\n overflowY={['unset', null, null, 'scroll']}\n >\n <Box>\n <BoemlyAccordion\n rows={slice.questionsAndAnswers}\n defaultIndex={slice.defaultIndex}\n variant={variant.accordionVariant as 'white' | 'black'}\n />\n <Flex\n padding=\"8\"\n backgroundColor={variant.otherQuestionsBackground}\n borderRadius=\"2xl\"\n mt=\"14\"\n flexDir={['column', null, null, 'row']}\n justifyContent={['flex-start', null, null, 'space-between']}\n alignItems={['flex-start', null, null, 'center']}\n >\n <Heading as=\"h6\" size=\"sm\" color=\"white\">\n {slice.otherQuestions}\n </Heading>\n <Spacer minHeight={['4', null, null, '0']} />\n <StrapiLinkButton\n size=\"lg\"\n colorScheme=\"white\"\n background=\"white\"\n rightIcon={<ArrowRight />}\n link={slice.button}\n component=\"QAndA\"\n />\n </Flex>\n </Box>\n </Box>\n </SimpleGrid>\n </Wrapper>\n </Box>\n\n {slice.hero && (\n <Box pb=\"28\" mt=\"-56\">\n <Wrapper>\n <HeroCard\n title={slice.hero.title}\n subTitle={slice.hero.subTitle}\n link={\n slice.hero.button && {\n text: slice.hero.button.text,\n onClick: handleHeroButtonClick,\n }\n }\n image={\n slice.hero.image && (\n <Image\n src={strapiMediaUrl(slice.hero.image.img, 'xLarge')}\n alt={slice.hero.image.alt}\n fill\n style={{ objectFit: slice.hero.image.objectFit || 'cover' }}\n />\n )\n }\n />\n </Wrapper>\n </Box>\n )}\n </>\n );\n};\n","import React, { useContext } from 'react';\nimport Image from 'next/image';\nimport {\n Box,\n DefaultSectionHeader,\n HeroCard,\n QuoteCard,\n Shape,\n SimpleGrid,\n Wrapper,\n} from 'boemly';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiQuoteCard from '../../models/strapi/StrapiQuoteCard';\nimport StrapiHeroCard from '../../models/strapi/StrapiHeroCard';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport convertToKebabCase from '../../utils/convertToKebabCase';\nimport { useRouter } from 'next/router';\nimport { AnalyticsContext } from '../../components/ContextProvider/ContextProvider';\n\ninterface QuoteCardsSlice extends StrapiDefaultHeader {\n cards: StrapiQuoteCard[];\n shapes?: StrapiImage[];\n hero?: StrapiHeroCard;\n}\nexport interface QuoteCardsProps {\n slice: QuoteCardsSlice;\n}\n\nexport const QuoteCards: React.FC<QuoteCardsProps> = ({\n slice,\n}: QuoteCardsProps) => {\n const { push } = useRouter();\n const analyticsFunction = useContext(AnalyticsContext);\n\n const handleHeroCardButtonClick = () => {\n if (slice.hero?.button) {\n analyticsFunction?.({\n type: 'track',\n props: {\n action: 'click',\n component: 'QuoteCards',\n buttonText: slice.hero.button.text,\n buttonUrl: strapiLinkUrl(slice.hero.button),\n section: 'hero',\n },\n });\n push(strapiLinkUrl(slice.hero.button));\n }\n };\n\n return (\n <>\n <Box\n id={convertToKebabCase(slice.title)}\n position=\"relative\"\n paddingTop=\"28\"\n paddingBottom={!!slice.hero ? '80' : '28'}\n >\n {slice.shapes && slice.shapes.length === 2 && (\n <>\n <Shape\n shape={\n <Image\n src={strapiMediaUrl(slice.shapes[0].img, 'small')}\n alt={slice.shapes[0].alt}\n fill\n style={{ objectFit: slice.shapes[0].objectFit || 'cover' }}\n />\n }\n top=\"0\"\n right=\"0\"\n size=\"xs\"\n radius=\"bottom-left\"\n />\n <Shape\n shape={\n <Image\n src={strapiMediaUrl(slice.shapes[1].img, 'small')}\n alt={slice.shapes[1].alt}\n fill\n style={{ objectFit: slice.shapes[1].objectFit || 'cover' }}\n />\n }\n bottom=\"0\"\n left=\"0\"\n radius=\"top-right\"\n />\n </>\n )}\n <Wrapper>\n <Box maxW=\"3xl\">\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n />\n </Box>\n <SimpleGrid\n columns={2}\n gap=\"20\"\n rowGap=\"6\"\n mt=\"16\"\n minChildWidth={['100%', null, '16rem']}\n >\n {slice.cards.map((card) => (\n <Box key={card.id} width=\"full\" maxWidth=\"2xl\">\n <QuoteCard\n key={card.id}\n avatar={{\n name: card.avatar.name,\n description: card.avatar.description,\n image: (\n <Image\n src={strapiMediaUrl(card.avatar.image.img, 'small')}\n alt={card.avatar.image.alt}\n fill\n style={{\n objectFit: card.avatar.image.objectFit || 'cover',\n }}\n />\n ),\n }}\n text={card.text}\n />\n </Box>\n ))}\n </SimpleGrid>\n </Wrapper>\n </Box>\n {slice.hero && (\n <Box marginTop=\"-40\" paddingBottom=\"28\">\n <Wrapper>\n <HeroCard\n title={slice.hero.title}\n subTitle={slice.hero.subTitle}\n link={\n slice.hero.button && {\n text: slice.hero.button.text,\n onClick: handleHeroCardButtonClick,\n }\n }\n image={\n slice.hero.image && (\n <Image\n src={strapiMediaUrl(slice.hero.image.img, 'xLarge')}\n alt={slice.hero.image.alt}\n fill\n style={{ objectFit: slice.hero.image.objectFit || 'cover' }}\n />\n )\n }\n />\n </Wrapper>\n </Box>\n )}\n </>\n );\n};\n","import React from 'react';\nimport {\n DefaultSectionContainer,\n Grid,\n GridItem,\n RichText,\n Wrapper,\n} from 'boemly';\n\nexport interface RichTextSectionProps {\n slice: {\n content: string;\n };\n}\n\nexport const RichTextSection: React.FC<RichTextSectionProps> = ({\n slice,\n}: RichTextSectionProps) => (\n <DefaultSectionContainer>\n <Wrapper>\n <Grid templateColumns=\"repeat(12, 1fr)\" gap=\"4\">\n <GridItem colSpan={[12, null, null, 7]}>\n <RichText content={slice.content} />\n </GridItem>\n </Grid>\n </Wrapper>\n </DefaultSectionContainer>\n);\n","import React, {\n createRef,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport {\n Box,\n Center,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Flex,\n Gradient,\n Heading,\n RichText,\n ShapesCard,\n Text,\n useToken,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport { useWindowScroll, useWindowSize } from 'react-use';\nimport { useRouter } from 'next/router';\nimport StrapiShapesCard from '../../models/strapi/StrapiShapesCard';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport { AnalyticsContext } from '../../components/ContextProvider/ContextProvider';\n\ninterface StepsSlice extends StrapiDefaultHeader {\n steps: {\n id: number;\n step: number;\n title: string;\n text?: string;\n }[];\n image?: StrapiImage;\n card?: StrapiShapesCard;\n}\nexport interface StepsProps {\n slice: StepsSlice;\n}\n\nexport const Steps: React.FC<StepsProps> = ({ slice }: StepsProps) => {\n const { push } = useRouter();\n const analyticsFunction = useContext(AnalyticsContext);\n\n const [gray900] = useToken('colors', ['gray.900']);\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n const [stepRefs, setStepRefs] = useState(new Array(slice.steps.length));\n const [stepProgress, setStepProgress] = useState(\n new Array(slice.steps.length)\n );\n\n const { y: offsetY } = useWindowScroll();\n const { height: windowHeight } = useWindowSize();\n\n const handleShapesCardButtonClick = () => {\n if (slice.card?.button) {\n analyticsFunction?.({\n type: 'track',\n props: {\n action: 'click',\n component: 'Steps',\n buttonText: slice.card.button.text,\n buttonUrl: strapiLinkUrl(slice.card.button),\n section: 'card',\n },\n });\n push(strapiLinkUrl(slice.card.button));\n }\n };\n useEffect(() => {\n setStepRefs(slice.steps.map(() => createRef()));\n }, []);\n\n useEffect(() => {\n const containerOffsetTop = containerRef.current?.offsetTop || 0;\n setStepProgress(\n stepRefs.map((ref) => {\n const currentItemOffsetTop = ref.current?.offsetTop || 0;\n return containerOffsetTop + currentItemOffsetTop <\n offsetY + windowHeight / 3\n ? 100\n : 0;\n })\n );\n }, [offsetY]);\n\n return (\n <div ref={containerRef}>\n <DefaultSectionContainer backgroundColor={gray900} title={slice.title}>\n <>\n {slice.image && (\n <Box\n position=\"absolute\"\n top=\"0\"\n left=\"0\"\n width=\"full\"\n height=\"full\"\n >\n <Image\n src={strapiMediaUrl(slice.image.img, 'xLarge')}\n alt={slice.image.alt}\n fill\n style={{ objectFit: slice.image.objectFit || 'cover' }}\n />\n <Gradient />\n </Box>\n )}\n </>\n <Wrapper>\n <>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n taglineProps={{ textAlign: 'center' }}\n titleProps={{\n textAlign: 'center',\n maxW: '2xl',\n marginX: 'auto',\n color: 'white',\n }}\n textProps={{\n textAlign: 'center',\n maxW: 'xl',\n marginX: 'auto',\n color: 'whiteAlpha.800',\n }}\n />\n\n <Box marginTop={['16', null, '24']}>\n {slice.steps.map(({ id, step, title, text }, index) => (\n <Flex flexDir=\"column\" alignItems=\"center\" key={id}>\n <Center\n width=\"10\"\n height=\"10\"\n borderRadius=\"full\"\n backgroundColor=\"white\"\n >\n <Text size=\"smRegularNormal\" color=\"black\">\n {step}\n </Text>\n </Center>\n <Heading size=\"lg\" color=\"white\" mt=\"4\" textAlign=\"center\">\n {title}\n </Heading>\n {text && (\n <Box maxW=\"xl\" mt=\"4\">\n <RichText\n options={{ forceBlock: true }}\n content={text}\n textProps={{\n size: 'mdRegularNormal',\n color: 'whiteAlpha.700',\n textAlign: 'center',\n }}\n />\n </Box>\n )}\n {(index + 1 < slice.steps.length || slice.card) && (\n <Box\n ref={stepRefs[index]}\n position=\"relative\"\n marginTop=\"4\"\n marginBottom=\"6\"\n height=\"12\"\n >\n <Box\n position=\"absolute\"\n height=\"full\"\n borderLeft=\"dashed 1px white\"\n opacity=\"0.5\"\n />\n <Box\n position=\"absolute\"\n height={`${stepProgress[index]}%`}\n borderRight=\"solid 1px white\"\n opacity=\"1\"\n transition=\"height ease var(--medium-transition-duration)\"\n />\n </Box>\n )}\n </Flex>\n ))}\n </Box>\n\n {slice.card && (\n <ShapesCard\n tagline={slice.card.tagline}\n title={slice.card.title}\n text={slice.card.text}\n shapes={\n slice.card.shapes &&\n slice.card.shapes?.map((shape) => (\n <Image\n key={shape.id}\n src={strapiMediaUrl(shape.img, 'small')}\n alt={shape.alt}\n fill\n style={{ objectFit: shape.objectFit || 'cover' }}\n />\n ))\n }\n button={\n slice.card.button && {\n text: slice.card.button.text,\n onClick: handleShapesCardButtonClick,\n }\n }\n />\n )}\n </>\n </Wrapper>\n </DefaultSectionContainer>\n </div>\n );\n};\n","import Issuer from './Issuer';\n\nexport enum CreditAvailability {\n CREDITS_AVAILABLE = 'credits_available',\n NO_CREDITS_AVAILABLE = 'no_credits_available',\n SOME_CREDITS_AVAILABLE = 'some_credits_available',\n SOON_CREDITS_AVAILABLE = 'soon_credits_available',\n}\n\ninterface FPMProject {\n id: string;\n title: string;\n description?: string;\n friendlyName?: string;\n\n isPublic?: boolean;\n geom?: {\n type: 'Point';\n coordinates: [number, number];\n };\n area?: number;\n location?: string;\n countryCode: string;\n start?: Date;\n end?: Date;\n projectType?: {\n title: string;\n id: string;\n createdAt: Date;\n updatedAt: Date;\n };\n projectDeveloper?: {\n name: string;\n friendlyName?: string;\n id: string;\n createdAt: Date;\n updatedAt: Date;\n };\n verificationStandard?: {\n id: string;\n createdAt: Date;\n updatedAt: Date;\n };\n forecastedAmountYearly?: number;\n averageSellableAmountPerYear: number;\n riskBuffer?: number;\n defaultIssuer?: Issuer;\n creditAvailability: CreditAvailability;\n certificationDate?: Date;\n\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport default FPMProject;\n","import { motion } from 'framer-motion';\nimport styled from '@emotion/styled';\nimport { BREAKPOINT_MD } from '../../constants/breakpoints';\nimport { Box } from 'boemly';\n\nexport const CarouselContainer = styled(Box)`\n margin-top: var(--boemly-space-6);\n padding: var(--boemly-space-8) 0;\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n margin-top: var(--boemly-space-4);\n width: var(--boemly-sizes-full);\n }\n\n width: var(--boemly-sizes-full);\n\n overflow-x: hidden;\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n overflow-x: scroll;\n }\n`;\n\ninterface CarouselInnerContainerProps {\n numberOfItems: number;\n}\nexport const CarouselInnerContainer = styled(\n motion.div\n)<CarouselInnerContainerProps>`\n display: flex;\n gap: var(--boemly-space-6);\n justify-content: center;\n\n width: calc(\n (var(--boemly-sizes-sm) + var(--boemly-space-6)) *\n ${({ numberOfItems }: CarouselInnerContainerProps) => numberOfItems} +\n var(--boemly-space-6)\n );\n min-width: var(--boemly-sizes-full);\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n gap: var(--boemly-space-1);\n justify-content: flex-start;\n width: calc(\n (var(--boemly-sizes-2xs) + var(--boemly-space-4)) *\n ${({ numberOfItems }: CarouselInnerContainerProps) => numberOfItems} +\n var(--boemly-space-6)\n );\n }\n`;\n\nexport const CardContainer = styled(Box)`\n width: var(--boemly-sizes-sm);\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n min-width: var(--boemly-sizes-sm);\n\n margin-right: var(--boemly-space-4);\n\n &:first-of-type {\n margin-left: var(--boemly-space-6);\n }\n }\n`;\n","import React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Box,\n Center,\n DefaultSectionContainer,\n DefaultSectionHeader,\n IconButton,\n TextCardWithIcon,\n useToken,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport StrapiTextCardWithIcon from '../../models/strapi/StrapiTextCardWithIcons';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport {\n CardContainer,\n CarouselContainer,\n CarouselInnerContainer,\n} from './styles';\nimport { useMeasure, useWindowSize } from 'react-use';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { ArrowLeft, ArrowRight } from '@phosphor-icons/react';\nimport { IntlContext } from '../../components/ContextProvider';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport { useRouter } from 'next/router';\nimport shuffleElements from '../../utils/shuffleElements';\nimport { AnalyticsContext } from '../../components/ContextProvider/ContextProvider';\n\ninterface TextCarouselSlice extends StrapiDefaultHeader {\n slides: StrapiTextCardWithIcon[];\n button?: StrapiLink;\n isShuffled?: boolean;\n}\nexport interface TextCarouselProps {\n slice: TextCarouselSlice;\n}\n\nconst ITEM_GAP = 24;\nconst MAX_OFFSET_RIGHT = 55;\n\nexport const TextCarousel: React.FC<TextCarouselProps> = ({\n slice,\n}: TextCarouselProps) => {\n const containerRef = useRef(null);\n const [primary50] = useToken('colors', ['primary.50']);\n const [itemRef, { width: itemWidth }] = useMeasure<HTMLDivElement>();\n const { formatMessage } = useContext(IntlContext);\n const analyticsFunction = useContext(AnalyticsContext);\n const { width: windowWidth } = useWindowSize();\n const { push } = useRouter();\n\n const [displaySlides, setDisplaySlides] = useState(slice.slides);\n const [sliderIndex, setSliderIndex] = useState(0);\n\n const numberOfItems = useMemo(\n () => slice.slides.length,\n [slice.slides.length]\n );\n\n const sliderItemsWidth = useMemo(\n () => numberOfItems * (itemWidth + ITEM_GAP) - ITEM_GAP,\n [itemWidth, numberOfItems]\n );\n\n const offsetLeft = useMemo(\n () => sliderIndex * (itemWidth + ITEM_GAP) * -1,\n [sliderIndex, itemWidth]\n );\n\n const allowScroll = useMemo(\n () => sliderItemsWidth + ITEM_GAP * 2 > windowWidth,\n\n [sliderItemsWidth, windowWidth]\n );\n\n const canMoveRight = useMemo(() => {\n const offsetRight = windowWidth - (sliderItemsWidth + offsetLeft);\n\n return offsetRight < MAX_OFFSET_RIGHT;\n }, [itemWidth, sliderIndex, sliderItemsWidth, windowWidth]);\n\n const canMoveLeft = useMemo(() => sliderIndex !== 0, [sliderIndex]);\n\n const handleSlidesButtonClick = (button?: StrapiLink) => {\n if (button) {\n analyticsFunction?.({\n type: 'track',\n props: {\n action: 'click',\n component: 'TextCarousel',\n buttonText: button.text,\n buttonUrl: strapiLinkUrl(button),\n section: 'slides',\n },\n });\n push(strapiLinkUrl(button));\n }\n };\n\n const { slides, isShuffled = false } = slice;\n\n useEffect(() => {\n if (isShuffled) {\n setDisplaySlides(shuffleElements(slides));\n }\n }, [slides, isShuffled]);\n\n return (\n <DefaultSectionContainer backgroundColor={primary50} title={slice.title}>\n <Wrapper>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n taglineProps={{ textAlign: 'center' }}\n titleProps={{ textAlign: 'center', maxW: '6xl', marginX: 'auto' }}\n textProps={{ textAlign: 'center', maxW: '2xl', marginX: 'auto' }}\n />\n </Wrapper>\n\n <CarouselContainer ref={containerRef}>\n <Box position=\"relative\" width=\"full\">\n <Wrapper>\n <CarouselInnerContainer\n numberOfItems={slice.slides.length}\n animate={{\n x: offsetLeft,\n }}\n transition={{\n duration: 0.3,\n ease: 'easeInOut',\n }}\n >\n {displaySlides.map(({ id, title, text, icon, image, button }) => (\n <CardContainer key={id} ref={itemRef}>\n <TextCardWithIcon\n title={title}\n text={text}\n height=\"full\"\n icon={\n <Image\n src={strapiMediaUrl(icon.img, 'small')}\n alt={icon.alt}\n fill\n style={{ objectFit: icon.objectFit || 'contain' }}\n />\n }\n image={\n image && (\n <Image\n src={strapiMediaUrl(image?.img, 'medium')}\n alt={image?.alt}\n fill\n style={{\n objectFit: image?.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n )\n }\n button={\n button && {\n text: button.text,\n onClick: () => handleSlidesButtonClick(button),\n }\n }\n displayAs=\"column\"\n />\n </CardContainer>\n ))}\n </CarouselInnerContainer>\n </Wrapper>\n <Box\n display={['none', null, null, !!allowScroll ? 'flex' : 'none']}\n pointerEvents=\"none\"\n position=\"absolute\"\n top=\"40%\"\n left=\"0\"\n width=\"full\"\n py=\"0\"\n px=\"32\"\n justifyContent=\"space-between\"\n >\n <Box>\n <AnimatePresence>\n {canMoveLeft && (\n <IconButton\n key=\"leftButton\"\n as={motion.button}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n size=\"lg\"\n variant=\"outline\"\n onClick={() => setSliderIndex(sliderIndex - 1)}\n aria-label={formatMessage({\n id: 'sections.textCarousel.moveLeft',\n })}\n icon={<ArrowLeft size={16} />}\n pointerEvents=\"auto\"\n boxShadow=\"md\"\n />\n )}\n </AnimatePresence>\n </Box>\n <Box>\n <AnimatePresence>\n {canMoveRight && (\n <IconButton\n key=\"rightButton\"\n as={motion.button}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n size=\"lg\"\n variant=\"outline\"\n onClick={() => setSliderIndex(sliderIndex + 1)}\n aria-label={formatMessage({\n id: 'sections.textCarousel.moveRight',\n })}\n icon={<ArrowRight size={16} />}\n pointerEvents=\"auto\"\n boxShadow=\"md\"\n />\n )}\n </AnimatePresence>\n </Box>\n </Box>\n </Box>\n </CarouselContainer>\n\n <>\n {slice.button && (\n <Wrapper>\n <Center>\n <StrapiLinkButton\n link={slice.button}\n size=\"xl\"\n mt={['8', null, '14']}\n component=\"TextCarousel\"\n />\n </Center>\n </Wrapper>\n )}\n </>\n </DefaultSectionContainer>\n );\n};\n","const shuffleElements = (slides: any[]) => {\n const slidesCopy = [...slides]; // Create a copy to avoid mutating the original array\n for (let i = slidesCopy.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [slidesCopy[i], slidesCopy[j]] = [slidesCopy[j], slidesCopy[i]];\n }\n return slidesCopy;\n};\n\nexport default shuffleElements;\n","import React, { useContext } from 'react';\nimport {\n Box,\n ContactArea,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Grid,\n GridItem,\n TextCardWithIcon,\n useMediaQuery,\n useToken,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport { useRouter } from 'next/router';\nimport { BREAKPOINT_LG_QUERY } from '../../constants/breakpoints';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport StrapiDefaultHeader from '../../models/strapi/StrapiDefaultHeader';\nimport StrapiContactArea from '../../models/strapi/StrapiContactArea';\nimport StrapiTextCardWithIcon from '../../models/strapi/StrapiTextCardWithIcons';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport { AnalyticsContext } from '../../components/ContextProvider/ContextProvider';\n\ninterface TextWithTextCardsSlice extends StrapiDefaultHeader {\n cards: StrapiTextCardWithIcon[];\n contact?: StrapiContactArea;\n shape?: StrapiImage;\n}\nexport interface TextWithTextCardsProps {\n slice: TextWithTextCardsSlice;\n}\n\nexport const TextWithTextCards: React.FC<TextWithTextCardsProps> = ({\n slice,\n}: TextWithTextCardsProps) => {\n const { push } = useRouter();\n const analyticsFunction = useContext(AnalyticsContext);\n const [white] = useToken('colors', ['white']);\n const [belowBreakpoint] = useMediaQuery(BREAKPOINT_LG_QUERY);\n\n const handleContactButtonClick = () => {\n if (slice.contact?.button) {\n analyticsFunction?.({\n type: 'track',\n props: {\n action: 'click',\n component: 'TextWithTextCards',\n buttonText: slice.contact.button.text,\n buttonUrl: strapiLinkUrl(slice.contact.button),\n section: 'contact',\n },\n });\n push(strapiLinkUrl(slice.contact.button));\n }\n };\n\n return (\n <DefaultSectionContainer backgroundColor={white} title={slice.title}>\n <>\n {slice.shape && (\n <Box\n position=\"absolute\"\n right={['-28', null, null, '-136']}\n top={['96', null, null, '-28']}\n width={['sm', null, null, '4xl']}\n height={['sm', null, null, '4xl']}\n borderBottomRightRadius=\"full\"\n >\n <Image\n src={strapiMediaUrl(slice.shape.img, 'medium')}\n alt={slice.shape.alt}\n fill\n style={{\n objectFit: slice.shape.objectFit || 'cover',\n borderBottomRightRadius: 'var(--boemly-radii-full)',\n }}\n />\n </Box>\n )}\n </>\n <Wrapper>\n <>\n <Grid\n templateColumns={[\n 'repeat(8, 1fr)',\n null,\n null,\n null,\n 'repeat(16, 1fr)',\n ]}\n templateRows={[\n 'repeat(2, auto)',\n null,\n null,\n null,\n 'repeat(1, auto)',\n ]}\n rowGap=\"12\"\n >\n <GridItem\n colSpan={[8, null, null, null, 9]}\n rowSpan={1}\n pr={['0', null, null, null, '32']}\n >\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n textProps={{ pr: ['0', null, null, null, '10'] }}\n />\n\n {slice.contact && !belowBreakpoint && (\n <ContactArea\n title={slice.contact.title}\n text={slice.contact.text}\n avatar={{\n name: slice.contact.avatar.name,\n description: slice.contact.avatar.description,\n image: (\n <Image\n src={strapiMediaUrl(\n slice.contact.avatar.image.img,\n 'small'\n )}\n alt={slice.contact.avatar.image.alt}\n fill\n style={{\n objectFit:\n slice.contact.avatar.image.objectFit || 'cover',\n }}\n />\n ),\n }}\n link={{\n text: slice.contact.button.text,\n onClick: handleContactButtonClick,\n }}\n />\n )}\n </GridItem>\n <GridItem\n colSpan={[8, null, null, null, 7]}\n rowSpan={1}\n position=\"relative\"\n >\n {slice.cards.map((card) => (\n <TextCardWithIcon\n key={card.id}\n title={card.title}\n text={card.text}\n icon={\n <Image\n src={strapiMediaUrl(card.icon.img, 'small')}\n alt={card.icon.alt}\n fill\n style={{ objectFit: card.icon.objectFit || 'contain' }}\n />\n }\n />\n ))}\n </GridItem>\n </Grid>\n {slice.contact && belowBreakpoint && (\n <ContactArea\n title={slice.contact.title}\n text={slice.contact.text}\n avatar={{\n name: slice.contact.avatar.name,\n description: slice.contact.avatar.description,\n image: (\n <Image\n src={strapiMediaUrl(\n slice.contact.avatar.image.img,\n 'small'\n )}\n alt={slice.contact.avatar.image.alt}\n fill\n style={{\n objectFit:\n slice.contact.avatar.image.objectFit || 'cover',\n }}\n />\n ),\n }}\n link={{\n text: slice.contact.button.text,\n onClick: handleContactButtonClick,\n }}\n />\n )}\n </>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import { FormatNumberOptions } from 'react-intl';\n\nexport const FORMAT_AS_EUR_CONFIG: FormatNumberOptions = {\n style: 'currency',\n currency: 'EUR',\n};\n\nexport const FORMAT_AS_METER_CONFIG: FormatNumberOptions = {\n unit: 'meter',\n unitDisplay: 'short',\n style: 'unit',\n maximumFractionDigits: 0,\n};\n\nexport const FORMAT_AS_HECTARE_CONFIG: FormatNumberOptions = {\n unit: 'hectare',\n unitDisplay: 'short',\n style: 'unit',\n maximumFractionDigits: 2,\n};\n\nexport const FORMAT_AS_CUBIC_METERS_PER_HECTARE_CONFIG: FormatNumberOptions = {\n maximumFractionDigits: 0,\n};\n\nexport const FORMAT_AS_PERCENT_CONFIG: FormatNumberOptions = {\n style: 'percent',\n maximumFractionDigits: 2,\n};\n","import React, { useContext } from 'react';\nimport { Flex, Tag, Text } from 'boemly';\nimport NextLink from 'next/link';\nimport { IntlContext } from '../ContextProvider';\nimport { CreditAvailability } from '../../models/fpm/FPMProject';\n\nexport interface CreditsAvailableBadgeProps {\n status: CreditAvailability;\n href?: string;\n}\n\nconst CreditsAvailableBadge = ({\n status,\n href,\n}: CreditsAvailableBadgeProps) => {\n const { formatMessage } = useContext(IntlContext);\n\n const variants: Record<\n CreditAvailability,\n { message: string; color: string }\n > = {\n [CreditAvailability.CREDITS_AVAILABLE]: {\n message: formatMessage({\n id: 'components.creditsAvailableBadge.text.yes',\n }),\n color: 'green.600',\n },\n [CreditAvailability.NO_CREDITS_AVAILABLE]: {\n message: formatMessage({\n id: 'components.creditsAvailableBadge.text.no',\n }),\n color: 'red.600',\n },\n [CreditAvailability.SOME_CREDITS_AVAILABLE]: {\n message: formatMessage({\n id: 'components.creditsAvailableBadge.text.some',\n }),\n color: 'orange.500',\n },\n [CreditAvailability.SOON_CREDITS_AVAILABLE]: {\n message: formatMessage({\n id: 'components.creditsAvailableBadge.text.notYet',\n }),\n color: 'blue.500',\n },\n };\n\n const variant = variants[status];\n\n return (\n <Flex\n justifyContent=\"flex-start\"\n as={href ? NextLink : undefined}\n href={href}\n >\n <Tag backgroundColor={variant.color}>\n <Text color=\"white\" size=\"xsLowBold\">\n {variant.message}\n </Text>\n </Tag>\n </Flex>\n );\n};\n\nexport default CreditsAvailableBadge;\n","export const MAPBOX_TOKEN =\n 'pk.eyJ1IjoidHJlZS1seSIsImEiOiJja25rNG1heHgwNThjMnZwZTl2eThmeXUwIn0.SOrYUKfevZkbx8jZPxJesA';\n\nexport enum MapBoxStyle {\n Outdoors = 'mapbox://styles/mapbox/outdoors-v11',\n SatelliteStreets = 'mapbox://styles/mapbox/satellite-streets-v11',\n Satellite = 'mapbox://styles/mapbox/satellite-v9',\n CaliTerrain = 'mapbox://styles/tree-ly/clna54iq603ht01pbc199cszw',\n}\n\nexport const MAPBOX_TILES_URL = `${\n process.env.NEXT_PUBLIC_MAPBOX_TILES_URL || 'http://localhost:8123'\n}/vectortiles/v1/plots/{z}/{x}/{y}.mvt`;\nexport const MAPBOX_SOURCE_LAYER = 'plots';\nexport const MAPBOX_SOURCE_IDENTIFIER = 'plots';\nexport const MAPBOX_BORDER_LAYER_IDENTIFIER = 'plots-borders';\nexport const MAPBOX_FILL_LAYER_IDENTIFIER = 'plots-fill';\nexport const MAPBOX_TEXT_LAYER_IDENTIFIER = 'plots-text';\n\nexport const MAPBOX_TEXT_MIN_ZOOM = 15;\nexport const MAPBOX_SHAPES_MIN_ZOOM = 13;\n\nexport const MAPBOX_MAX_ZOOM = 19;\nexport const MAPBOX_INITIAL_ZOOM = 13;\n","import { Box, Container, Flex, Heading, Tag, Text } from 'boemly';\nimport React, { useContext } from 'react';\nimport Image from 'next/image';\nimport PortfolioProject from '../../models/PortfolioProject';\nimport { strapiMediaUrl } from '../..';\nimport { FORMAT_AS_HECTARE_CONFIG } from '../../constants/formatter';\nimport CreditsAvailableBadge from '../../components/CreditsAvailableBadge';\nimport { IntlContext } from '../ContextProvider';\n\nexport interface ProjectGridCardProps {\n project: PortfolioProject;\n}\n\nexport const ProjectGridCard = ({\n project,\n}: ProjectGridCardProps): JSX.Element => {\n const { formatNumber, formatMessage } = useContext(IntlContext);\n\n return (\n <Container height=\"full\">\n <Flex flexDir=\"column\" height=\"full\">\n {project.thumbnail && (\n <Box borderRadius=\"xl\" position=\"relative\" height=\"36\" mb=\"2\">\n <Image\n src={strapiMediaUrl(project.thumbnail?.img, 'medium')}\n alt={project.thumbnail?.alt}\n fill\n style={{\n objectFit: project.thumbnail?.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n )}\n <Heading my=\"4\" size=\"lg\">\n {project.friendlyName || project.title}\n </Heading>\n <Flex flexDir=\"row\" gap=\"2\" flexWrap=\"wrap\">\n <Tag>\n <Text size=\"xsLowBold\" color=\"gray.800\">\n {formatNumber(\n (project.area || 0) / 10000,\n FORMAT_AS_HECTARE_CONFIG\n )}\n </Text>\n </Tag>\n <Tag>\n <Text size=\"xsLowBold\" color=\"gray.800\">\n {project.location}\n </Text>\n </Tag>\n {project.certificationDate ? (\n <Tag>\n <Text size=\"xsLowBold\" color=\"gray.800\">\n {formatMessage(\n { id: 'components.projectGridCard.certified' },\n { year: new Date(project.certificationDate).getFullYear() }\n )}\n </Text>\n </Tag>\n ) : (\n <Tag>\n <Text size=\"xsLowBold\" color=\"gray.800\">\n {formatMessage({\n id: 'components.projectGridCard.certificationInProgress',\n })}\n </Text>\n </Tag>\n )}\n <CreditsAvailableBadge status={project.creditAvailability} />\n </Flex>\n </Flex>\n </Container>\n );\n};\n","import React from 'react';\nimport {\n DefaultSectionContainer,\n DefaultSectionHeader,\n Grid,\n GridItem,\n ProjectCard,\n Spacer,\n BoemlyList,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport { ArrowRight } from '@phosphor-icons/react';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport StrapiProjectCard from '../../models/strapi/StrapiProjectCard';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport { IStrapiData, PortfolioProject, StrapiProject } from '../..';\nimport ProjectGridCard from '../../components/ProjectGridCard';\n\ninterface TextWithCardSlice {\n tagline?: string;\n title: string;\n text?: string;\n listItems?: {\n id: number;\n text: string;\n }[];\n button?: StrapiLink;\n card?: StrapiProjectCard;\n project?: { data?: IStrapiData<StrapiProject> };\n cardPosition: 'left' | 'right';\n}\nexport interface TextWithCardProps {\n slice: TextWithCardSlice;\n projects: PortfolioProject[];\n}\n\nexport const TextWithCard: React.FC<TextWithCardProps> = ({\n slice,\n projects,\n}: TextWithCardProps) => {\n const portfolioProject = projects.find(\n (p) =>\n slice.project?.data?.attributes.fpmProjectId &&\n p.id === slice.project.data.attributes.fpmProjectId\n );\n\n const card = (\n <GridItem\n colSpan={[4, null, null, null, 2]}\n rowSpan={1}\n position=\"relative\"\n data-testid={`card-position-${slice.cardPosition}`}\n >\n {portfolioProject && <ProjectGridCard project={portfolioProject} />}\n {!portfolioProject && slice.card && (\n <ProjectCard\n facts={slice.card.facts}\n footerSubTitle={slice.card.footerSubTitle}\n footerTitle={slice.card.footerTitle}\n title={slice.card.title}\n image={\n <Image\n src={strapiMediaUrl(slice.card.image.img, 'medium')}\n alt={slice.card.image.alt}\n fill\n style={{ objectFit: slice.card.image.objectFit || 'cover' }}\n />\n }\n />\n )}\n </GridItem>\n );\n\n return (\n <DefaultSectionContainer title={slice.title}>\n <Wrapper>\n <Grid\n templateColumns={[\n 'repeat(4, auto)',\n null,\n null,\n null,\n 'repeat(6, auto)',\n ]}\n templateRows={[\n 'repeat(2, auto)',\n null,\n null,\n null,\n 'repeat(1, auto)',\n ]}\n rowGap=\"12\"\n columnGap={['0', null, null, null, '28']}\n >\n {slice.cardPosition === 'left' && card}\n <GridItem colSpan={4} rowSpan={1} position=\"relative\">\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n />\n\n {slice.listItems && (\n <>\n <Spacer height=\"10\" />\n <BoemlyList listItems={slice.listItems} />\n <Spacer height=\"10\" />\n </>\n )}\n\n {slice.button && (\n <StrapiLinkButton\n link={slice.button}\n size=\"md\"\n colorScheme=\"white\"\n variant=\"outline\"\n rightIcon={<ArrowRight />}\n component=\"TextWithCard\"\n />\n )}\n </GridItem>\n {slice.cardPosition === 'right' && card}\n </Grid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React from 'react';\nimport Link from 'next/link';\nimport {\n Box,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Heading,\n SimpleGrid,\n Text,\n Wrapper,\n} from 'boemly';\nimport { CaretRight } from '@phosphor-icons/react';\nimport { MEDIUM_TRANSITION_DURATION } from '../../constants/animations';\nimport strapiLinkUrl from '../../utils/strapiLinkUrl';\nimport StrapiLink from '../../models/strapi/StrapiLink';\n\ninterface LinkCardsGridSlice {\n tagline?: string;\n title: string;\n text?: string;\n cards: {\n id: number;\n title: string;\n text?: string;\n link: StrapiLink;\n }[];\n}\nexport interface LinkCardsGridProps {\n slice: LinkCardsGridSlice;\n}\n\nexport const LinkCardsGrid: React.FC<LinkCardsGridProps> = ({\n slice,\n}: LinkCardsGridProps) => (\n <DefaultSectionContainer title={slice.title}>\n <Wrapper>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n />\n\n <SimpleGrid mt=\"16\" columns={[1, null, null, null, 2]} gap=\"4\">\n {slice.cards.map(({ id, title, text, link }) => (\n <Box\n key={id}\n as={Link}\n href={strapiLinkUrl(link)}\n data-testid=\"link\"\n px=\"10\"\n py=\"8\"\n borderStyle=\"solid\"\n borderWidth=\"thin\"\n borderColor=\"gray.200\"\n borderRadius=\"2xl\"\n display=\"flex\"\n flexDir=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n cursor=\"pointer\"\n transitionDuration={`${MEDIUM_TRANSITION_DURATION}s`}\n _hover={{ backgroundColor: 'gray.50' }}\n >\n <div>\n <Heading as=\"h4\" size=\"lg\">\n {title}\n </Heading>\n {text && (\n <Text mt=\"2\" size=\"smRegularNormal\">\n {text}\n </Text>\n )}\n </div>\n\n <Box\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderStyle=\"solid\"\n borderWidth=\"thin\"\n borderColor=\"gray.200\"\n borderRadius=\"2xl\"\n height=\"12\"\n width=\"12\"\n minWidth=\"12\"\n minHeight=\"12\"\n ml=\"6\"\n backgroundColor=\"white\"\n >\n <CaretRight />\n </Box>\n </Box>\n ))}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n);\n","import React from 'react';\nimport {\n Box,\n DefaultSectionHeader,\n Flex,\n Gradient,\n Tag,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\n\nexport interface SmallHeroProps {\n slice: {\n tags?: {\n id: number;\n text: string;\n colorScheme: string;\n }[];\n tagline?: string;\n title: string;\n subTitle?: string;\n button?: StrapiLink;\n image?: StrapiImage;\n gradient?: boolean;\n };\n theme: 'dark' | 'light';\n}\n\nconst colors = {\n dark: {\n tagline: 'white',\n title: 'white',\n text: 'white',\n background: 'gray.900',\n },\n light: {\n tagline: 'primary.500',\n title: 'black',\n text: 'gray.500',\n background: 'primary.50',\n },\n};\n\nexport const SmallHero: React.FC<SmallHeroProps> = ({\n slice,\n theme,\n}: SmallHeroProps) => (\n <Box\n position=\"relative\"\n width=\"full\"\n height=\"xl\"\n backgroundColor={colors[theme].background}\n >\n {slice.image && (\n <>\n <Image\n src={strapiMediaUrl(slice.image.img, 'xLarge')}\n alt={slice.image.alt}\n fill\n style={{ objectFit: slice.image.objectFit || 'cover' }}\n />\n {slice.gradient && <Gradient />}\n </>\n )}\n <Box\n position=\"absolute\"\n left=\"0\"\n top=\"60%\"\n width=\"full\"\n textAlign=\"center\"\n transform=\"translateY(-50%)\"\n >\n <Wrapper>\n <>\n {slice.tags && (\n <Flex direction=\"row\" justify=\"center\" gap=\"2\" mb=\"4\" wrap=\"wrap\">\n {slice.tags.map(({ id, text, colorScheme }) => (\n <Tag\n key={id}\n colorScheme={colorScheme}\n size=\"md\"\n variant=\"subtle\"\n >\n {text}\n </Tag>\n ))}\n </Flex>\n )}\n <DefaultSectionHeader\n isHero\n tagline={slice.tagline}\n title={slice.title}\n text={slice.subTitle}\n taglineProps={{\n color: colors[theme].tagline,\n textAlign: 'center',\n mx: 'auto',\n }}\n titleProps={{\n color: colors[theme].title,\n maxW: '4xl',\n textAlign: 'center',\n mx: 'auto',\n }}\n textProps={{\n maxW: '2xl',\n textAlign: 'center',\n mx: 'auto',\n color: colors[theme].text,\n }}\n />\n {slice.button && (\n <StrapiLinkButton\n link={slice.button}\n mt=\"6\"\n size=\"lg\"\n component=\"SmallHero\"\n />\n )}\n </>\n </Wrapper>\n </Box>\n </Box>\n);\n","import styled from '@emotion/styled';\nimport { BREAKPOINT_MD } from '../../constants/breakpoints';\nimport { Box, Link } from 'boemly';\n\nexport const BlogItemContainer = styled(Link)`\n text-decoration: none;\n\n & div img {\n transition: transform var(--default-ease) var(--medium-transition-duration);\n }\n\n &:hover {\n text-decoration: none;\n\n & > div:first-of-type img {\n transform: scale(1.03);\n }\n }\n`;\n\nexport const ImageContainer = styled(Box)`\n width: 100%;\n height: var(--boemly-sizes-xs);\n position: relative;\n border-radius: var(--boemly-radii-2xl);\n\n // Fixes the flickering of borders during animation in Safari\n -webkit-mask-image: -webkit-radial-gradient(white, black);\n\n & span,\n div {\n border-radius: var(--boemly-radii-2xl);\n }\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n height: var(--boemly-sizes-3xs);\n }\n`;\n","import React, { useContext } from 'react';\nimport {\n Box,\n DatePersonPair,\n DefaultSectionContainer,\n Heading,\n SimpleGrid,\n Spacer,\n Text,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport Link from 'next/link';\nimport StrapiBlogPost from '../../models/strapi/StrapiBlogPost';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport { BlogItemContainer, ImageContainer } from './styles';\nimport { IntlContext } from '../../components/ContextProvider';\n\nexport interface BlogProps {\n slice: {\n blog_posts: IStrapiData<StrapiBlogPost>[];\n };\n blogPosts: IStrapiData<StrapiBlogPost>[];\n}\n\nexport const Blog: React.FC<BlogProps> = ({ slice, blogPosts }: BlogProps) => {\n const { formatDate } = useContext(IntlContext);\n const sortedBlogPosts = slice.blog_posts.sort(\n (a, b) =>\n new Date(b.attributes.createdAt).getTime() -\n new Date(a.attributes.createdAt).getTime()\n );\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n <SimpleGrid columns={[1, null, null, 2]} spacingX={56} spacingY={24}>\n {sortedBlogPosts.map(({ attributes }) => {\n const blogPost: IStrapiData<StrapiBlogPost> | undefined =\n blogPosts.find((bp) => bp.attributes.slug === attributes.slug);\n if (!blogPost) {\n return null;\n }\n return (\n <BlogItemContainer\n key={blogPost.attributes.slug}\n as={Link}\n href={`/blog/${blogPost.attributes.slug}`}\n >\n <ImageContainer>\n <Image\n src={strapiMediaUrl(blogPost.attributes.img.img, 'large')}\n alt={blogPost.attributes.img.alt}\n fill\n style={{\n objectFit: blogPost.attributes.img.objectFit || 'cover',\n }}\n />\n </ImageContainer>\n <Box px=\"2\" py=\"8\">\n {blogPost.attributes.category.data && (\n <Text size=\"smMonoUppercase\" color=\"primary.800\" mb=\"2\">\n {blogPost.attributes.category.data.attributes.name}\n </Text>\n )}\n <Heading size=\"lg\">{blogPost.attributes.title}</Heading>\n {blogPost.attributes.teaser && (\n <Text size=\"mdRegularNormal\" mt=\"2\">\n {blogPost.attributes.teaser}\n </Text>\n )}\n <Spacer height=\"4\" />\n <DatePersonPair\n date={formatDate(blogPost.attributes.createdAt)}\n person={\n blogPost.attributes.author.data\n ? {\n name: blogPost.attributes.author.data.attributes\n .name,\n image: (\n <Image\n src={strapiMediaUrl(\n blogPost.attributes.author.data.attributes.img\n .img,\n 'thumbnail'\n )}\n alt={\n blogPost.attributes.author.data.attributes.img\n .alt\n }\n fill\n style={{\n objectFit:\n blogPost.attributes.author.data.attributes\n .img.objectFit || 'cover',\n }}\n />\n ),\n }\n : undefined\n }\n />\n </Box>\n </BlogItemContainer>\n );\n })}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React from 'react';\nimport { Box, DefaultSectionContainer, SimpleGrid, Wrapper } from 'boemly';\nimport Link from 'next/link';\nimport { MEDIUM_TRANSITION_DURATION } from '../../constants/animations';\nimport PortfolioProject from '../../models/PortfolioProject';\nimport IStrapi from '../../models/strapi/IStrapi';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport StrapiProject from '../../models/strapi/StrapiProject';\nimport ProjectGridCard from '../../components/ProjectGridCard';\n\nexport interface ProjectsGridProps {\n slice: {\n projects: IStrapi<IStrapiData<StrapiProject>[]>;\n };\n projects: PortfolioProject[];\n}\n\nconst ConditionalWrapper = ({\n condition,\n wrapper,\n children,\n}: {\n condition: boolean;\n wrapper: (children: JSX.Element) => JSX.Element;\n children: JSX.Element;\n}) => (condition ? wrapper(children) : children);\n\nexport const ProjectsGrid: React.FC<ProjectsGridProps> = ({\n projects,\n slice,\n}: ProjectsGridProps) => {\n const filteredProjects = projects.filter(\n (fpmProject) =>\n fpmProject.thumbnail &&\n slice.projects.data.some(\n (strapiProject) =>\n strapiProject.attributes.fpmProjectId === fpmProject.id\n )\n );\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n <SimpleGrid columns={[1, null, null, 2, null, 3]} gap=\"16\">\n {filteredProjects.map((project) => (\n <ConditionalWrapper\n key={project.id}\n condition={!!project.slug}\n wrapper={(children: JSX.Element) => (\n <Link\n href={`${project.portfolioHost || ''}/portfolio/${\n project.slug\n }`}\n passHref\n key={project.id}\n legacyBehavior\n >\n {children}\n </Link>\n )}\n >\n <Box\n as=\"a\"\n cursor=\"pointer\"\n borderRadius=\"2xl\"\n transition={`box-shadow ease ${MEDIUM_TRANSITION_DURATION}s`}\n _hover={{ boxShadow: 'lg' }}\n >\n <ProjectGridCard project={project} />\n </Box>\n </ConditionalWrapper>\n ))}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import { css } from '@emotion/react';\n\nconst mapboxStyle = css`\n .mapboxgl-map {\n -webkit-tap-highlight-color: rgb(0 0 0/0);\n font: 12px/20px Helvetica Neue, Arial, Helvetica, sans-serif;\n overflow: hidden;\n position: relative;\n }\n .mapboxgl-canvas {\n left: 0;\n position: absolute;\n top: 0;\n }\n .mapboxgl-map:-webkit-full-screen {\n height: 100%;\n width: 100%;\n }\n .mapboxgl-canary {\n background-color: salmon;\n }\n .mapboxgl-canvas-container.mapboxgl-interactive,\n .mapboxgl-ctrl-group button.mapboxgl-ctrl-compass {\n cursor: grab;\n -webkit-user-select: none;\n user-select: none;\n }\n .mapboxgl-canvas-container.mapboxgl-interactive.mapboxgl-track-pointer {\n cursor: pointer;\n }\n .mapboxgl-canvas-container.mapboxgl-interactive:active,\n .mapboxgl-ctrl-group button.mapboxgl-ctrl-compass:active {\n cursor: grabbing;\n }\n .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate,\n .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate .mapboxgl-canvas {\n touch-action: pan-x pan-y;\n }\n .mapboxgl-canvas-container.mapboxgl-touch-drag-pan,\n .mapboxgl-canvas-container.mapboxgl-touch-drag-pan .mapboxgl-canvas {\n touch-action: pinch-zoom;\n }\n .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan,\n .mapboxgl-canvas-container.mapboxgl-touch-zoom-rotate.mapboxgl-touch-drag-pan\n .mapboxgl-canvas {\n touch-action: none;\n }\n .mapboxgl-ctrl-bottom-left,\n .mapboxgl-ctrl-bottom-right,\n .mapboxgl-ctrl-top-left,\n .mapboxgl-ctrl-top-right {\n pointer-events: none;\n position: absolute;\n z-index: 2;\n }\n .mapboxgl-ctrl-top-left {\n left: 0;\n top: 0;\n }\n .mapboxgl-ctrl-top-right {\n right: 0;\n top: 0;\n }\n .mapboxgl-ctrl-bottom-left {\n bottom: 0;\n left: 0;\n }\n .mapboxgl-ctrl-bottom-right {\n bottom: 0;\n right: 0;\n }\n .mapboxgl-ctrl {\n clear: both;\n pointer-events: auto;\n transform: translate(0);\n }\n .mapboxgl-ctrl-top-left .mapboxgl-ctrl {\n float: left;\n margin: 10px 0 0 10px;\n }\n .mapboxgl-ctrl-top-right .mapboxgl-ctrl {\n float: right;\n margin: 10px 10px 0 0;\n }\n .mapboxgl-ctrl-bottom-left .mapboxgl-ctrl {\n float: left;\n margin: 0 0 10px 10px;\n }\n .mapboxgl-ctrl-bottom-right .mapboxgl-ctrl {\n float: right;\n margin: 0 10px 10px 0;\n }\n .mapboxgl-ctrl-group {\n background: #fff;\n border-radius: 4px;\n }\n .mapboxgl-ctrl-group:not(:empty) {\n box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1);\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl-group:not(:empty) {\n box-shadow: 0 0 0 2px ButtonText;\n }\n }\n .mapboxgl-ctrl-group button {\n background-color: transparent;\n border: 0;\n box-sizing: border-box;\n cursor: pointer;\n display: block;\n height: 29px;\n outline: none;\n overflow: hidden;\n padding: 0;\n width: 29px;\n }\n .mapboxgl-ctrl-group button + button {\n border-top: 1px solid #ddd;\n }\n .mapboxgl-ctrl button .mapboxgl-ctrl-icon {\n background-position: 50%;\n background-repeat: no-repeat;\n display: block;\n height: 100%;\n width: 100%;\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl-icon {\n background-color: transparent;\n }\n .mapboxgl-ctrl-group button + button {\n border-top: 1px solid ButtonText;\n }\n }\n .mapboxgl-ctrl-attrib-button:focus,\n .mapboxgl-ctrl-group button:focus {\n box-shadow: 0 0 2px 2px #0096ff;\n }\n .mapboxgl-ctrl button:disabled {\n cursor: not-allowed;\n }\n .mapboxgl-ctrl button:disabled .mapboxgl-ctrl-icon {\n opacity: 0.25;\n }\n .mapboxgl-ctrl-group button:first-of-type {\n border-radius: 4px 4px 0 0;\n }\n .mapboxgl-ctrl-group button:last-of-type {\n border-radius: 0 0 4px 4px;\n }\n .mapboxgl-ctrl-group button:only-of-type {\n border-radius: inherit;\n }\n .mapboxgl-ctrl button:not(:disabled):hover {\n background-color: rgb(0 0 0/5%);\n }\n .mapboxgl-ctrl-group button:focus:focus-visible {\n box-shadow: 0 0 2px 2px #0096ff;\n }\n .mapboxgl-ctrl-group button:focus:not(:focus-visible) {\n box-shadow: none;\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E\");\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-zoom-in .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z'/%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E\");\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-fullscreen .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-shrink .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z'/%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath id='south' d='M10.5 16l4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E\");\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath id='south' d='M10.5 16l4 8 4-8h-8z' fill='%23999'/%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-compass .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 29 29'%3E%3Cpath d='M10.5 14l4-8 4 8h-8z'/%3E%3Cpath id='south' d='M10.5 16l4 8 4-8h-8z' fill='%23ccc'/%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23aaa'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' fill='%23f00'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e58978'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e54e33'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-waiting\n .mapboxgl-ctrl-icon {\n animation: mapboxgl-spin 2s linear infinite;\n }\n @media (-ms-high-contrast: active) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23fff'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23999'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' fill='%23f00'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-active-error\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e58978'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%2333b5e5'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl\n button.mapboxgl-ctrl-geolocate.mapboxgl-ctrl-geolocate-background-error\n .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23e54e33'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2' display='none'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23000'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' display='none'/%3E%3C/svg%3E\");\n }\n .mapboxgl-ctrl button.mapboxgl-ctrl-geolocate:disabled .mapboxgl-ctrl-icon {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill='%23666'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z'/%3E%3Ccircle id='dot' cx='10' cy='10' r='2'/%3E%3Cpath id='stroke' d='M14 5l1 1-9 9-1-1 9-9z' fill='%23f00'/%3E%3C/svg%3E\");\n }\n }\n @keyframes mapboxgl-spin {\n 0% {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(1turn);\n }\n }\n a.mapboxgl-ctrl-logo {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='logo' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='text' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='clip'%3E%3Crect x='0' y='0' width='100%25' height='100%25' fill='white'/%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/mask%3E%3Cg id='outline' opacity='0.3' stroke='%23000' stroke-width='3'%3E%3Ccircle mask='url(%23clip)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23text' mask='url(%23clip)'/%3E%3C/g%3E%3Cg id='fill' opacity='0.9' fill='%23fff'%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/g%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n cursor: pointer;\n display: block;\n height: 23px;\n margin: 0 0 -4px -4px;\n overflow: hidden;\n width: 88px;\n }\n a.mapboxgl-ctrl-logo.mapboxgl-compact {\n width: 23px;\n }\n @media (-ms-high-contrast: active) {\n a.mapboxgl-ctrl-logo {\n background-color: transparent;\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='logo' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='text' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='clip'%3E%3Crect x='0' y='0' width='100%25' height='100%25' fill='white'/%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/mask%3E%3Cg id='outline' opacity='1' stroke='%23000' stroke-width='3'%3E%3Ccircle mask='url(%23clip)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23text' mask='url(%23clip)'/%3E%3C/g%3E%3Cg id='fill' opacity='1' fill='%23fff'%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/g%3E%3C/svg%3E\");\n }\n }\n @media (-ms-high-contrast: black-on-white) {\n a.mapboxgl-ctrl-logo {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' fill-rule='evenodd' viewBox='0 0 88 23'%3E%3Cdefs%3E%3Cpath id='logo' d='M11.5 2.25c5.105 0 9.25 4.145 9.25 9.25s-4.145 9.25-9.25 9.25-9.25-4.145-9.25-9.25 4.145-9.25 9.25-9.25zM6.997 15.983c-.051-.338-.828-5.802 2.233-8.873a4.395 4.395 0 013.13-1.28c1.27 0 2.49.51 3.39 1.42.91.9 1.42 2.12 1.42 3.39 0 1.18-.449 2.301-1.28 3.13C12.72 16.93 7 16 7 16l-.003-.017zM15.3 10.5l-2 .8-.8 2-.8-2-2-.8 2-.8.8-2 .8 2 2 .8z'/%3E%3Cpath id='text' d='M50.63 8c.13 0 .23.1.23.23V9c.7-.76 1.7-1.18 2.73-1.18 2.17 0 3.95 1.85 3.95 4.17s-1.77 4.19-3.94 4.19c-1.04 0-2.03-.43-2.74-1.18v3.77c0 .13-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V8.23c0-.12.1-.23.23-.23h1.4zm-3.86.01c.01 0 .01 0 .01-.01.13 0 .22.1.22.22v7.55c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V15c-.7.76-1.69 1.19-2.73 1.19-2.17 0-3.94-1.87-3.94-4.19 0-2.32 1.77-4.19 3.94-4.19 1.03 0 2.02.43 2.73 1.18v-.75c0-.12.1-.23.23-.23h1.4zm26.375-.19a4.24 4.24 0 00-4.16 3.29c-.13.59-.13 1.19 0 1.77a4.233 4.233 0 004.17 3.3c2.35 0 4.26-1.87 4.26-4.19 0-2.32-1.9-4.17-4.27-4.17zM60.63 5c.13 0 .23.1.23.23v3.76c.7-.76 1.7-1.18 2.73-1.18 1.88 0 3.45 1.4 3.84 3.28.13.59.13 1.2 0 1.8-.39 1.88-1.96 3.29-3.84 3.29-1.03 0-2.02-.43-2.73-1.18v.77c0 .12-.1.23-.23.23h-1.4c-.13 0-.23-.1-.23-.23V5.23c0-.12.1-.23.23-.23h1.4zm-34 11h-1.4c-.13 0-.23-.11-.23-.23V8.22c.01-.13.1-.22.23-.22h1.4c.13 0 .22.11.23.22v.68c.5-.68 1.3-1.09 2.16-1.1h.03c1.09 0 2.09.6 2.6 1.55.45-.95 1.4-1.55 2.44-1.56 1.62 0 2.93 1.25 2.9 2.78l.03 5.2c0 .13-.1.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.8 0-1.46.7-1.59 1.62l.01 4.68c0 .13-.11.23-.23.23h-1.41c-.13 0-.23-.11-.23-.23v-4.59c0-.98-.74-1.71-1.62-1.71-.85 0-1.54.79-1.6 1.8v4.5c0 .13-.1.23-.23.23zm53.615 0h-1.61c-.04 0-.08-.01-.12-.03-.09-.06-.13-.19-.06-.28l2.43-3.71-2.39-3.65a.213.213 0 01-.03-.12c0-.12.09-.21.21-.21h1.61c.13 0 .24.06.3.17l1.41 2.37 1.4-2.37a.34.34 0 01.3-.17h1.6c.04 0 .08.01.12.03.09.06.13.19.06.28l-2.37 3.65 2.43 3.7c0 .05.01.09.01.13 0 .12-.09.21-.21.21h-1.61c-.13 0-.24-.06-.3-.17l-1.44-2.42-1.44 2.42a.34.34 0 01-.3.17zm-7.12-1.49c-1.33 0-2.42-1.12-2.42-2.51 0-1.39 1.08-2.52 2.42-2.52 1.33 0 2.42 1.12 2.42 2.51 0 1.39-1.08 2.51-2.42 2.52zm-19.865 0c-1.32 0-2.39-1.11-2.42-2.48v-.07c.02-1.38 1.09-2.49 2.4-2.49 1.32 0 2.41 1.12 2.41 2.51 0 1.39-1.07 2.52-2.39 2.53zm-8.11-2.48c-.01 1.37-1.09 2.47-2.41 2.47s-2.42-1.12-2.42-2.51c0-1.39 1.08-2.52 2.4-2.52 1.33 0 2.39 1.11 2.41 2.48l.02.08zm18.12 2.47c-1.32 0-2.39-1.11-2.41-2.48v-.06c.02-1.38 1.09-2.48 2.41-2.48s2.42 1.12 2.42 2.51c0 1.39-1.09 2.51-2.42 2.51z'/%3E%3C/defs%3E%3Cmask id='clip'%3E%3Crect x='0' y='0' width='100%25' height='100%25' fill='white'/%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/mask%3E%3Cg id='outline' opacity='1' stroke='%23fff' stroke-width='3' fill='%23fff'%3E%3Ccircle mask='url(%23clip)' cx='11.5' cy='11.5' r='9.25'/%3E%3Cuse xlink:href='%23text' mask='url(%23clip)'/%3E%3C/g%3E%3Cg id='fill' opacity='1' fill='%23000'%3E%3Cuse xlink:href='%23logo'/%3E%3Cuse xlink:href='%23text'/%3E%3C/g%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl.mapboxgl-ctrl-attrib {\n background-color: hsla(0, 0%, 100%, 0.5);\n margin: 0;\n padding: 0 5px;\n }\n @media screen {\n .mapboxgl-ctrl-attrib.mapboxgl-compact {\n background-color: #fff;\n border-radius: 12px;\n margin: 10px;\n min-height: 20px;\n padding: 2px 24px 2px 0;\n position: relative;\n }\n .mapboxgl-ctrl-attrib.mapboxgl-compact-show {\n padding: 2px 28px 2px 8px;\n visibility: visible;\n }\n .mapboxgl-ctrl-bottom-left > .mapboxgl-ctrl-attrib.mapboxgl-compact-show,\n .mapboxgl-ctrl-top-left > .mapboxgl-ctrl-attrib.mapboxgl-compact-show {\n border-radius: 12px;\n padding: 2px 8px 2px 28px;\n }\n .mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-inner {\n display: none;\n }\n .mapboxgl-ctrl-attrib-button {\n background-color: hsla(0, 0%, 100%, 0.5);\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E\");\n border: 0;\n border-radius: 12px;\n box-sizing: border-box;\n cursor: pointer;\n display: none;\n height: 24px;\n outline: none;\n position: absolute;\n right: 0;\n top: 0;\n width: 24px;\n }\n .mapboxgl-ctrl-bottom-left .mapboxgl-ctrl-attrib-button,\n .mapboxgl-ctrl-top-left .mapboxgl-ctrl-attrib-button {\n left: 0;\n }\n .mapboxgl-ctrl-attrib.mapboxgl-compact .mapboxgl-ctrl-attrib-button,\n .mapboxgl-ctrl-attrib.mapboxgl-compact-show .mapboxgl-ctrl-attrib-inner {\n display: block;\n }\n .mapboxgl-ctrl-attrib.mapboxgl-compact-show .mapboxgl-ctrl-attrib-button {\n background-color: rgb(0 0 0/5%);\n }\n .mapboxgl-ctrl-bottom-right > .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n bottom: 0;\n right: 0;\n }\n .mapboxgl-ctrl-top-right > .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n right: 0;\n top: 0;\n }\n .mapboxgl-ctrl-top-left > .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n left: 0;\n top: 0;\n }\n .mapboxgl-ctrl-bottom-left > .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n bottom: 0;\n left: 0;\n }\n }\n @media screen and (-ms-high-contrast: active) {\n .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' fill='%23fff'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E\");\n }\n }\n @media screen and (-ms-high-contrast: black-on-white) {\n .mapboxgl-ctrl-attrib.mapboxgl-compact:after {\n background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E\");\n }\n }\n .mapboxgl-ctrl-attrib a {\n color: rgba(0, 0, 0, 0.75);\n text-decoration: none;\n }\n .mapboxgl-ctrl-attrib a:hover {\n color: inherit;\n text-decoration: underline;\n }\n .mapboxgl-ctrl-attrib .mapbox-improve-map {\n font-weight: 700;\n margin-left: 2px;\n }\n .mapboxgl-attrib-empty {\n display: none;\n }\n .mapboxgl-ctrl-scale {\n background-color: hsla(0, 0%, 100%, 0.75);\n border: 2px solid #333;\n border-top: #333;\n box-sizing: border-box;\n color: #333;\n font-size: 10px;\n padding: 0 5px;\n white-space: nowrap;\n }\n .mapboxgl-popup {\n display: flex;\n left: 0;\n pointer-events: none;\n position: absolute;\n top: 0;\n will-change: transform;\n }\n .mapboxgl-popup-anchor-top,\n .mapboxgl-popup-anchor-top-left,\n .mapboxgl-popup-anchor-top-right {\n flex-direction: column;\n }\n .mapboxgl-popup-anchor-bottom,\n .mapboxgl-popup-anchor-bottom-left,\n .mapboxgl-popup-anchor-bottom-right {\n flex-direction: column-reverse;\n }\n .mapboxgl-popup-anchor-left {\n flex-direction: row;\n }\n .mapboxgl-popup-anchor-right {\n flex-direction: row-reverse;\n }\n .mapboxgl-popup-tip {\n border: 10px solid transparent;\n height: 0;\n width: 0;\n z-index: 1;\n }\n .mapboxgl-popup-anchor-top .mapboxgl-popup-tip {\n align-self: center;\n border-bottom-color: #fff;\n border-top: none;\n }\n .mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip {\n align-self: flex-start;\n border-bottom-color: #fff;\n border-left: none;\n border-top: none;\n }\n .mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip {\n align-self: flex-end;\n border-bottom-color: #fff;\n border-right: none;\n border-top: none;\n }\n .mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip {\n align-self: center;\n border-bottom: none;\n border-top-color: #fff;\n }\n .mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip {\n align-self: flex-start;\n border-bottom: none;\n border-left: none;\n border-top-color: #fff;\n }\n .mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip {\n align-self: flex-end;\n border-bottom: none;\n border-right: none;\n border-top-color: #fff;\n }\n .mapboxgl-popup-anchor-left .mapboxgl-popup-tip {\n align-self: center;\n border-left: none;\n border-right-color: #fff;\n }\n .mapboxgl-popup-anchor-right .mapboxgl-popup-tip {\n align-self: center;\n border-left-color: #fff;\n border-right: none;\n }\n .mapboxgl-popup-close-button {\n background-color: transparent;\n border: 0;\n border-radius: 0 3px 0 0;\n cursor: pointer;\n position: absolute;\n right: 0;\n top: 0;\n }\n .mapboxgl-popup-close-button:hover {\n background-color: rgb(0 0 0/5%);\n }\n .mapboxgl-popup-content {\n background: #fff;\n border-radius: 3px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n padding: 10px 10px 15px;\n pointer-events: auto;\n position: relative;\n }\n .mapboxgl-popup-anchor-top-left .mapboxgl-popup-content {\n border-top-left-radius: 0;\n }\n .mapboxgl-popup-anchor-top-right .mapboxgl-popup-content {\n border-top-right-radius: 0;\n }\n .mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content {\n border-bottom-left-radius: 0;\n }\n .mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content {\n border-bottom-right-radius: 0;\n }\n .mapboxgl-popup-track-pointer {\n display: none;\n }\n .mapboxgl-popup-track-pointer * {\n pointer-events: none;\n user-select: none;\n }\n .mapboxgl-map:hover .mapboxgl-popup-track-pointer {\n display: flex;\n }\n .mapboxgl-map:active .mapboxgl-popup-track-pointer {\n display: none;\n }\n .mapboxgl-marker {\n left: 0;\n opacity: 1;\n position: absolute;\n top: 0;\n transition: opacity 0.2s;\n will-change: transform;\n }\n .mapboxgl-user-location-dot,\n .mapboxgl-user-location-dot:before {\n background-color: #1da1f2;\n border-radius: 50%;\n height: 15px;\n width: 15px;\n }\n .mapboxgl-user-location-dot:before {\n animation: mapboxgl-user-location-dot-pulse 2s infinite;\n content: '';\n position: absolute;\n }\n .mapboxgl-user-location-dot:after {\n border: 2px solid #fff;\n border-radius: 50%;\n box-shadow: 0 0 3px rgba(0, 0, 0, 0.35);\n box-sizing: border-box;\n content: '';\n height: 19px;\n left: -2px;\n position: absolute;\n top: -2px;\n width: 19px;\n }\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading {\n height: 0;\n width: 0;\n }\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:after,\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:before {\n border-bottom: 7.5px solid #4aa1eb;\n content: '';\n position: absolute;\n }\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:before {\n border-left: 7.5px solid transparent;\n transform: translateY(-28px) skewY(-20deg);\n }\n .mapboxgl-user-location-show-heading .mapboxgl-user-location-heading:after {\n border-right: 7.5px solid transparent;\n transform: translate(7.5px, -28px) skewY(20deg);\n }\n @keyframes mapboxgl-user-location-dot-pulse {\n 0% {\n opacity: 1;\n transform: scale(1);\n }\n 70% {\n opacity: 0;\n transform: scale(3);\n }\n to {\n opacity: 0;\n transform: scale(1);\n }\n }\n .mapboxgl-user-location-dot-stale {\n background-color: #aaa;\n }\n .mapboxgl-user-location-dot-stale:after {\n display: none;\n }\n .mapboxgl-user-location-accuracy-circle {\n background-color: #1da1f233;\n border-radius: 100%;\n height: 1px;\n width: 1px;\n }\n .mapboxgl-crosshair,\n .mapboxgl-crosshair .mapboxgl-interactive,\n .mapboxgl-crosshair .mapboxgl-interactive:active {\n cursor: crosshair;\n }\n .mapboxgl-boxzoom {\n background: #fff;\n border: 2px dotted #202020;\n height: 0;\n left: 0;\n opacity: 0.5;\n position: absolute;\n top: 0;\n width: 0;\n }\n @media print {\n .mapbox-improve-map {\n display: none;\n }\n }\n .mapboxgl-scroll-zoom-blocker,\n .mapboxgl-touch-pan-blocker {\n align-items: center;\n background: rgba(0, 0, 0, 0.7);\n color: #fff;\n display: flex;\n font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,\n sans-serif;\n height: 100%;\n justify-content: center;\n left: 0;\n opacity: 0;\n pointer-events: none;\n position: absolute;\n text-align: center;\n top: 0;\n transition: opacity 0.75s ease-in-out;\n transition-delay: 1s;\n width: 100%;\n }\n .mapboxgl-scroll-zoom-blocker-show,\n .mapboxgl-touch-pan-blocker-show {\n opacity: 1;\n transition: opacity 0.1s ease-in-out;\n }\n .mapboxgl-canvas-container.mapboxgl-touch-pan-blocker-override.mapboxgl-scrollable-page,\n .mapboxgl-canvas-container.mapboxgl-touch-pan-blocker-override.mapboxgl-scrollable-page\n .mapboxgl-canvas {\n touch-action: pan-x pan-y;\n }\n`;\n\nexport default mapboxStyle;\n","import { FeatureCollection } from 'geojson';\nimport fpmClient from '../fpmClient';\n\nconst getFpmProjectsByBbox = async (\n bbox: string,\n preview: boolean = false\n): Promise<FeatureCollection> => {\n const [west, south, east, north] = bbox.split(',').map(Number);\n const cache = preview ? false : undefined;\n\n const fpmResponse = await fpmClient.get<FeatureCollection>(\n '/public/projects',\n {\n params: {\n bbox: `${west},${south},${east},${north}`,\n },\n cache,\n }\n );\n\n return fpmResponse.data;\n};\n\nexport default getFpmProjectsByBbox;\n","import { FeatureCollection } from 'geojson';\nimport { IStrapiData, StrapiProject } from '..';\n\nconst mergeProjectData = (\n featureCollection: FeatureCollection,\n strapiProjects: Map<string, IStrapiData<StrapiProject>>\n): FeatureCollection => {\n // Add slug and portfolioHost to each feature's properties if we have Strapi data\n const mergedFeatureCollection = {\n ...featureCollection,\n features: featureCollection.features.map((feature) => {\n const fpmProjectId = feature.properties?.id;\n const strapiProject = fpmProjectId\n ? strapiProjects.get(fpmProjectId)\n : null;\n\n if (strapiProject) {\n feature.properties = {\n ...feature.properties,\n slug: strapiProject.attributes.slug || undefined,\n portfolioHost:\n strapiProject.attributes.portfolio?.data?.attributes.host ||\n undefined,\n };\n }\n\n return feature;\n }),\n };\n\n return mergedFeatureCollection;\n};\n\nexport default mergeProjectData;\n","import React, {\n useRef,\n useEffect,\n useState,\n useCallback,\n useContext,\n} from 'react';\nimport mapboxgl from 'mapbox-gl';\nimport {\n Box,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Wrapper,\n} from 'boemly';\nimport { MAPBOX_MAX_ZOOM, MAPBOX_TOKEN } from '../../constants/mapbox';\nimport { IntlContext } from '../../components/ContextProvider';\nimport mapboxStyle from './mapboxStyle';\nimport { FeatureCollection } from 'geojson';\nimport debounce from 'lodash/debounce';\nimport getFpmProjectsByBbox from '../../integrations/strapi/getFpmProjectsByBbox';\nimport getStrapiProjects from '../../integrations/strapi/getStrapiProjects';\nimport mergeProjectData from '../../utils/mergeProjectData';\nimport { CreditAvailability } from '../../models/fpm/FPMProject';\nimport { IStrapiData, StrapiProject } from '../..';\n\nconst projectPinImage =\n 'https://cdn.jsdelivr.net/npm/@phosphor-icons/core@2.0.2/assets/fill/map-pin-fill.svg';\n\nmapboxgl.accessToken = MAPBOX_TOKEN;\n\nexport interface ProjectsMapProps {\n slice: {\n tagline?: string;\n title?: string;\n text?: string;\n defaultCenterCoordinates?: { latitude: number; longitude: number };\n defaultZoomLevel?: number;\n };\n}\n\nconst FALLBACK_BBOX =\n '-1.9950830850086163,44.4464186384987,21.995083085002875,54.12644342419196';\n\nexport const ProjectsMap: React.FC<ProjectsMapProps> = ({\n slice,\n}: ProjectsMapProps) => {\n const { locale, formatMessage } = useContext(IntlContext);\n const mapContainer = useRef<HTMLDivElement>(null);\n const map = useRef<mapboxgl.Map | null>(null);\n const animationIntervalRef = useRef<NodeJS.Timeout | null>(null);\n const [featureCollection, setFeatureCollection] =\n useState<FeatureCollection | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const initialBboxRef = useRef<string | null>(null);\n const [isMapReady, setIsMapReady] = useState(false);\n const [strapiProjects, setStrapiProjects] = useState<Map<\n string,\n IStrapiData<StrapiProject>\n > | null>(null);\n\n const isBboxContained = useCallback(\n (innerBbox: string, outerBbox: string): boolean => {\n const [innerWest, innerSouth, innerEast, innerNorth] = innerBbox\n .split(',')\n .map(Number);\n const [outerWest, outerSouth, outerEast, outerNorth] = outerBbox\n .split(',')\n .map(Number);\n return (\n innerWest >= outerWest &&\n innerEast <= outerEast &&\n innerSouth >= outerSouth &&\n innerNorth <= outerNorth\n );\n },\n []\n );\n\n const fetchStrapiData = useCallback(async () => {\n if (strapiProjects) return; // If we already have Strapi data, don't fetch it again\n\n try {\n const data = await getStrapiProjects(locale, '2'); // pLevel = Population depth which is a param in the API request. 2 is enough to get the slug and the portfolioHost\n setStrapiProjects(data);\n } catch (error) {\n console.error('❌ Error fetching Strapi projects:', error);\n }\n }, [locale, strapiProjects]);\n\n const fetchProjectsData = useCallback(\n async (bbox: string) => {\n setIsLoading(true);\n try {\n const fpmData = await getFpmProjectsByBbox(bbox);\n\n // If we have Strapi data, merge it, otherwise show FPM data immediately\n const mergedData = strapiProjects\n ? mergeProjectData(fpmData, strapiProjects)\n : fpmData;\n\n setFeatureCollection(mergedData);\n } catch (error) {\n console.error('Error fetching projects:', error);\n } finally {\n setIsLoading(false);\n }\n },\n [strapiProjects]\n );\n\n const debouncedUpdateBbox = useCallback(\n debounce(() => {\n if (!map.current || !initialBboxRef.current) return;\n const bounds = map.current.getBounds();\n const newBbox = `${bounds.getWest()},${bounds.getSouth()},${bounds.getEast()},${bounds.getNorth()}`;\n if (!isBboxContained(newBbox, initialBboxRef.current)) {\n fetchProjectsData(newBbox);\n initialBboxRef.current = newBbox;\n }\n }, 500),\n [fetchProjectsData, isBboxContained]\n );\n\n const addProjectsLayer = useCallback(() => {\n if (!map.current || !featureCollection || !map.current.isStyleLoaded()) {\n return;\n }\n\n const filteredFeatureCollection = {\n ...featureCollection,\n features: featureCollection.features.filter(\n (feature) => feature.properties?.isPublic !== false\n ),\n };\n\n const source = map.current.getSource('projects') as mapboxgl.GeoJSONSource;\n\n if (!source) {\n map.current.addSource('projects', {\n type: 'geojson',\n data: filteredFeatureCollection,\n cluster: true,\n clusterMaxZoom: 14,\n clusterRadius: 50,\n });\n\n map.current.addLayer({\n id: 'clusters',\n type: 'circle',\n source: 'projects',\n filter: ['has', 'point_count'],\n paint: {\n 'circle-color': [\n 'step',\n ['get', 'point_count'],\n '#51bbd6',\n 2,\n '#2A3FBA',\n ],\n 'circle-radius': ['step', ['get', 'point_count'], 20, 10, 30, 30, 40],\n 'circle-radius-transition': { duration: 300 },\n 'circle-stroke-width': 5,\n 'circle-stroke-color': '#2A3FBA',\n 'circle-stroke-opacity': 0.4,\n },\n });\n\n if (animationIntervalRef.current) {\n clearInterval(animationIntervalRef.current);\n }\n animationIntervalRef.current = setInterval(() => {\n if (!map.current) return;\n const now = Date.now() / 1000;\n const pulseFactor = 1 + 0.05 * Math.sin((now * 2 * Math.PI) / 2.8);\n const expression = [\n 'step',\n ['get', 'point_count'],\n 20 * pulseFactor,\n 10,\n 30 * pulseFactor,\n 30,\n 40 * pulseFactor,\n ] as mapboxgl.ExpressionSpecification;\n map.current.setPaintProperty('clusters', 'circle-radius', expression);\n }, 50);\n\n map.current.addLayer({\n id: 'cluster-count',\n type: 'symbol',\n source: 'projects',\n filter: ['has', 'point_count'],\n layout: {\n 'text-field': '{point_count_abbreviated}',\n 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Bold'],\n 'text-size': 12,\n },\n paint: {\n 'text-color': '#fff',\n },\n });\n\n // Load SVG as PNG\n fetch(projectPinImage)\n .then((response) => response.text())\n .then((svgText) => {\n // Modify SVG color\n const modifiedSvg = svgText.replace(/fill=\"[^\"]*\"/, `fill=\"#2A3FBA\"`);\n const img = new Image();\n img.src = `data:image/svg+xml;base64,${btoa(modifiedSvg)}`;\n return new Promise<HTMLImageElement>((resolve, reject) => {\n img.onload = () => resolve(img);\n img.onerror = reject;\n });\n })\n .then((img) => {\n if (!map.current) return;\n const canvas = document.createElement('canvas');\n canvas.width = 80;\n canvas.height = 80;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n ctx.drawImage(img, 10, 10, 60, 60);\n const pngImg = new Image();\n pngImg.src = canvas.toDataURL('image/png');\n pngImg.onload = () => {\n map.current?.addImage('project-pin', pngImg, { pixelRatio: 2 });\n map.current?.addLayer({\n id: 'unclustered-point',\n type: 'symbol',\n source: 'projects',\n filter: ['!', ['has', 'point_count']],\n layout: {\n 'icon-image': 'project-pin',\n },\n });\n };\n })\n .catch((error) => {\n console.error('Error loading project pin image:', error);\n });\n\n const popup = new mapboxgl.Popup({\n closeButton: true,\n closeOnClick: false,\n className: 'custom-popup',\n offset: [0, -20],\n });\n\n const style = document.createElement('style');\n style.textContent = `\n .custom-popup .mapboxgl-popup-content {\n border-radius: 8px;\n padding: 12px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n background: white;\n color: #333;\n }\n .mapboxgl-popup {\n max-width: 300px !important;\n }\n .mapboxgl-popup-close-button {\n padding: 4px 8px;\n font-size: 16px;\n color: #666;\n }\n .mapboxgl-popup-close-button:hover {\n background: #f0f0f0;\n color: #333;\n }\n `;\n document.head.appendChild(style);\n\n map.current.on('click', 'unclustered-point', (e) => {\n if (!e.features || !e.features[0].properties) return;\n map.current!.getCanvas().style.cursor = 'pointer';\n\n const coordinates = (e.features[0].geometry as any).coordinates.slice();\n const {\n title,\n projectDeveloper,\n slug,\n portfolioHost,\n creditAvailability,\n } = e.features[0].properties;\n\n // Calculate if popup would go off screen at the top\n const point = map.current!.project(coordinates);\n const popupHeight = 150; // Approximate height of popup\n const offset: [number, number] =\n point.y - popupHeight - 20 < 0 ? [0, 20] : [0, -20];\n\n let developer = 'Unknown';\n try {\n const projectDeveloperRaw = projectDeveloper;\n if (projectDeveloperRaw) {\n developer =\n JSON.parse(projectDeveloperRaw as string)?.name ?? 'Unknown';\n }\n } catch {\n developer = 'Unknown';\n }\n\n const projectUrl =\n slug && portfolioHost ? `${portfolioHost}/portfolio/${slug}` : null;\n\n const getBadgeMessage = (status: string) => {\n switch (status) {\n case CreditAvailability.CREDITS_AVAILABLE:\n return formatMessage({\n id: 'components.creditsAvailableBadge.text.yes',\n });\n case CreditAvailability.NO_CREDITS_AVAILABLE:\n return formatMessage({\n id: 'components.creditsAvailableBadge.text.no',\n });\n case CreditAvailability.SOME_CREDITS_AVAILABLE:\n return formatMessage({\n id: 'components.creditsAvailableBadge.text.some',\n });\n case CreditAvailability.SOON_CREDITS_AVAILABLE:\n return formatMessage({\n id: 'components.creditsAvailableBadge.text.notYet',\n });\n default:\n return '';\n }\n };\n\n const getBadgeColor = (status: string) => {\n switch (status) {\n case CreditAvailability.CREDITS_AVAILABLE:\n return '#15803d';\n case CreditAvailability.NO_CREDITS_AVAILABLE:\n return '#b91c1c';\n case CreditAvailability.SOME_CREDITS_AVAILABLE:\n return '#ea580c';\n case CreditAvailability.SOON_CREDITS_AVAILABLE:\n return '#2563eb';\n default:\n return '#e0e7ff';\n }\n };\n\n const badgeColor = getBadgeColor(creditAvailability);\n const badgeMessage = getBadgeMessage(creditAvailability);\n\n const badge = projectUrl\n ? `<a href=\"${projectUrl}\" target=\"_blank\" rel=\"noopener\" style=\"text-decoration: none;\"><span style=\"display: inline-block; background: ${badgeColor}; color: white; font-weight: 600; border-radius: 4px; padding: 2px 8px; font-size: 12px; margin-bottom: 6px; cursor: pointer;\">${badgeMessage}</span></a>`\n : `<span style=\"display: inline-block; background: ${badgeColor}; color: white; font-weight: 600; border-radius: 4px; padding: 2px 8px; font-size: 12px; margin-bottom: 6px;\">${badgeMessage}</span>`;\n\n const button = projectUrl\n ? `<a href=\"${projectUrl}\" target=\"_blank\" rel=\"noopener\" style=\"display: inline-block; margin-top: 12px; padding: 4px 8px; border: 1px solid #e2e8f0; border-radius: 4px; background: #fff; font-size: 14px; font-weight: 700; text-decoration: none;\">Show more info</a>`\n : '';\n\n const description = `\n <div style=\"padding: 2px; padding-right: 16px; min-width: 180px; max-width: 260px;\">\n ${badge}\n <h3 style=\"font-size: 15px; font-weight: bold;\">${title}</h3>\n <p style=\"font-size: 15px; color: #64748b;\">${developer}</p>\n ${button}\n </div>\n `;\n\n while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) {\n coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360;\n }\n\n popup\n .setOffset(offset)\n .setLngLat(coordinates)\n .setHTML(description)\n .addTo(map.current!);\n });\n\n map.current.on('click', 'clusters', (e) => {\n const features = map.current?.queryRenderedFeatures(e.point, {\n layers: ['clusters'],\n });\n if (!features || !features[0].properties) return;\n\n const clusterId = features[0].properties.cluster_id;\n const projectSource = map.current?.getSource(\n 'projects'\n ) as mapboxgl.GeoJSONSource;\n\n projectSource.getClusterExpansionZoom(clusterId, (err, zoom) => {\n if (err || !map.current) return;\n const coordinates = (features[0].geometry as any).coordinates;\n map.current.easeTo({ center: coordinates, zoom });\n });\n });\n\n map.current.on('mouseenter', 'clusters', () => {\n if (map.current) map.current.getCanvas().style.cursor = 'pointer';\n });\n map.current.on('mouseleave', 'clusters', () => {\n if (map.current) map.current.getCanvas().style.cursor = '';\n });\n\n map.current.on('mouseenter', 'unclustered-point', () => {\n if (map.current) map.current.getCanvas().style.cursor = 'pointer';\n });\n map.current.on('mouseleave', 'unclustered-point', () => {\n if (map.current) map.current.getCanvas().style.cursor = '';\n });\n } else {\n source.setData(filteredFeatureCollection);\n }\n }, [featureCollection, locale, formatMessage]);\n\n useEffect(() => {\n if (map.current || !mapContainer.current) return;\n\n let initialCenter: [number, number];\n let initialZoom: number;\n\n if (slice.defaultCenterCoordinates && slice.defaultZoomLevel) {\n initialCenter = [\n slice.defaultCenterCoordinates.longitude,\n slice.defaultCenterCoordinates.latitude,\n ];\n initialZoom = slice.defaultZoomLevel;\n } else {\n // Always start with fallback view - don't wait for user location\n const bbox = initialBboxRef.current || FALLBACK_BBOX;\n const [west, south, east, north] = bbox.split(',').map(Number);\n const bounds = new mapboxgl.LngLatBounds([west, south], [east, north]);\n const center = bounds.getCenter();\n initialCenter = [center.lng, center.lat];\n initialZoom = 6;\n }\n\n map.current = new mapboxgl.Map({\n container: mapContainer.current,\n style: 'mapbox://styles/mapbox/streets-v12',\n center: initialCenter,\n zoom: initialZoom,\n maxZoom: MAPBOX_MAX_ZOOM,\n });\n\n map.current.addControl(new mapboxgl.NavigationControl(), 'top-right');\n\n map.current.on('load', () => {\n setIsMapReady(true);\n if (!(slice.defaultCenterCoordinates && slice.defaultZoomLevel)) {\n const bbox = initialBboxRef.current || FALLBACK_BBOX;\n const [west, south, east, north] = bbox.split(',').map(Number);\n const bounds = new mapboxgl.LngLatBounds([west, south], [east, north]);\n map.current?.fitBounds(bounds, { padding: 20 });\n }\n });\n\n map.current.on('moveend', () => {\n if (initialBboxRef.current) {\n debouncedUpdateBbox();\n }\n });\n\n return () => {\n debouncedUpdateBbox.cancel();\n if (animationIntervalRef.current) {\n clearInterval(animationIntervalRef.current);\n }\n map.current?.remove();\n map.current = null;\n };\n }, [\n slice.defaultCenterCoordinates,\n slice.defaultZoomLevel,\n debouncedUpdateBbox,\n ]);\n\n // Fetch Strapi data once on component mount\n useEffect(() => {\n fetchStrapiData();\n }, [fetchStrapiData]);\n\n // Handle re-merging data when Strapi data becomes available\n useEffect(() => {\n if (strapiProjects && featureCollection) {\n const mergedData = mergeProjectData(featureCollection, strapiProjects);\n setFeatureCollection(mergedData);\n }\n }, [strapiProjects]);\n\n // Request user location (non-blocking)\n useEffect(() => {\n if (slice.defaultCenterCoordinates && slice.defaultZoomLevel) {\n // Use provided default coordinates\n const { latitude, longitude } = slice.defaultCenterCoordinates;\n const buffer = 10;\n const bbox = `${longitude - buffer},${latitude - buffer},${\n longitude + buffer\n },${latitude + buffer}`;\n initialBboxRef.current = bbox;\n fetchProjectsData(bbox);\n } else if (navigator.geolocation) {\n // Set fallback immediately (non-blocking)\n initialBboxRef.current = FALLBACK_BBOX;\n fetchProjectsData(FALLBACK_BBOX);\n\n // Request user location asynchronously\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const userLoc = {\n lat: position.coords.latitude,\n lon: position.coords.longitude,\n };\n if (map.current) {\n map.current.easeTo({\n center: [userLoc.lon, userLoc.lat],\n zoom: 10,\n duration: 1500,\n });\n\n // Update bbox for this location\n const buffer = 1;\n const bbox = `${userLoc.lon - buffer},${userLoc.lat - buffer},${\n userLoc.lon + buffer\n },${userLoc.lat + buffer}`;\n initialBboxRef.current = bbox;\n fetchProjectsData(bbox);\n }\n },\n () => {\n // Permission denied or error - already have fallback data loaded\n // No need to re-fetch since we already loaded FALLBACK_BBOX data\n }\n );\n } else {\n // Geolocation not supported - use fallback\n initialBboxRef.current = FALLBACK_BBOX;\n fetchProjectsData(FALLBACK_BBOX);\n }\n }, [\n slice.defaultCenterCoordinates,\n slice.defaultZoomLevel,\n fetchProjectsData,\n ]);\n\n useEffect(() => {\n if (isMapReady && featureCollection && map.current?.isStyleLoaded()) {\n addProjectsLayer();\n }\n }, [isMapReady, featureCollection, addProjectsLayer]);\n\n return (\n <DefaultSectionContainer>\n <Box css={mapboxStyle}>\n <Wrapper>\n {slice.title ? (\n <>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n taglineProps={{ textAlign: 'center' }}\n titleProps={{\n textAlign: 'center',\n maxW: '6xl',\n marginX: 'auto',\n }}\n textProps={{\n textAlign: 'center',\n maxW: '3xl',\n marginX: 'auto',\n }}\n />\n <Box height=\"16\" />\n </>\n ) : (\n <></>\n )}\n <Box\n height=\"xl\"\n ref={mapContainer}\n borderRadius=\"xl\"\n overflow=\"hidden\"\n boxShadow={['md', null, null, 'none']}\n />\n <>{isLoading && <Box>Loading projects...</Box>}</>\n </Wrapper>\n </Box>\n </DefaultSectionContainer>\n );\n};\n\nexport default ProjectsMap;\n","import React, { useContext } from 'react';\nimport {\n Box,\n Container,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Flex,\n Gradient,\n Spacer,\n Wrapper,\n} from 'boemly';\nimport StrapiButtonWithVariant from '../../models/strapi/StrapiButtonWithVariant';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport Image from 'next/image';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport { CDN_URI } from '../../constants/api';\nimport { IntlContext } from '../../components/ContextProvider';\n\ntype Variant = 'gray' | 'green' | 'white';\n\nenum CtaCardType {\n Left = 'left',\n CenterWithoutImage = 'centerWithoutImage',\n CenterWithImage = 'centerWithImage',\n Right = 'right',\n}\n\nexport interface CtaProps {\n slice: {\n tagline?: string;\n title?: string;\n subTitle?: string;\n variant: Variant;\n ctaCards: CtaCard[];\n };\n}\n\nexport interface CtaCard {\n id: number;\n tagline?: string;\n title: string;\n subTitle?: string;\n image?: StrapiImage;\n buttons?: StrapiButtonWithVariant[];\n variant: Variant;\n backgroundShape: boolean;\n textAlign: 'left' | 'right' | 'center';\n}\n\nconst STATES: Record<CtaCardType, Record<string, any>> = {\n left: {\n textAlign: 'left',\n paddingTagline: '0',\n paddingTitle: '0',\n justifyContent: 'space-between',\n buttonJustifyContent: 'start',\n textMarginLeft: ['0', null, null, null, '14'],\n textMarginRight: '0',\n },\n centerWithoutImage: {\n textAlign: 'center',\n paddingTagline: '28',\n paddingTitle: '20',\n justifyContent: 'center',\n buttonJustifyContent: 'center',\n textMarginLeft: '0',\n textMarginRight: '0',\n },\n centerWithImage: {\n textAlign: 'center',\n paddingTagline: '28',\n paddingTitle: '20',\n justifyContent: 'center',\n buttonJustifyContent: 'center',\n textMarginLeft: '0',\n textMarginRight: '0',\n },\n right: {\n textAlign: 'left',\n paddingTagline: '0',\n paddingTitle: '0',\n justifyContent: 'start',\n buttonJustifyContent: 'start',\n textMarginLeft: '0',\n textMarginRight: ['0', null, null, null, '10'],\n },\n};\n\nconst VARIANTS: Record<Variant, Record<string, Record<CtaCardType, string>>> = {\n gray: {\n backgroundColor: {\n left: 'primary.50',\n centerWithoutImage: 'primary.50',\n centerWithImage: 'primary.50',\n right: 'primary.50',\n },\n taglineColor: {\n left: 'primary.500',\n centerWithoutImage: 'primary.500',\n centerWithImage: 'white',\n right: 'primary.500',\n },\n titleColor: {\n left: 'black',\n centerWithoutImage: 'black',\n centerWithImage: 'white',\n right: 'black',\n },\n subTitleColor: {\n left: 'black',\n centerWithoutImage: 'black',\n centerWithImage: 'white',\n right: 'black',\n },\n },\n green: {\n backgroundColor: {\n left: 'primary.800',\n centerWithoutImage: 'primary.800',\n centerWithImage: 'primary.800',\n right: 'primary.800',\n },\n taglineColor: {\n left: 'white',\n centerWithoutImage: 'white',\n centerWithImage: 'white',\n right: 'white',\n },\n titleColor: {\n left: 'white',\n centerWithoutImage: 'white',\n centerWithImage: 'white',\n right: 'white',\n },\n subTitleColor: {\n left: 'white',\n centerWithoutImage: 'white',\n centerWithImage: 'white',\n right: 'white',\n },\n },\n white: {\n backgroundColor: {\n left: 'white',\n centerWithoutImage: 'white',\n centerWithImage: 'primary.800',\n right: 'white',\n },\n taglineColor: {\n left: 'primary.500',\n centerWithoutImage: 'primary.500',\n centerWithImage: 'white',\n right: 'primary.500',\n },\n titleColor: {\n left: 'black',\n centerWithoutImage: 'black',\n centerWithImage: 'white',\n right: 'black',\n },\n subTitleColor: {\n left: 'black',\n centerWithoutImage: 'black',\n centerWithImage: 'white',\n right: 'black',\n },\n },\n};\n\nconst getTypeOfCard = (ctaCard: CtaCard): CtaCardType => {\n if (ctaCard.textAlign === 'center') {\n if (ctaCard.image) {\n return CtaCardType.CenterWithImage;\n }\n return CtaCardType.CenterWithoutImage;\n }\n if (ctaCard.textAlign === 'left') {\n return CtaCardType.Left;\n }\n return CtaCardType.Right;\n};\n\nexport const Cta: React.FC<CtaProps> = ({ slice }: CtaProps) => {\n const { formatMessage } = useContext(IntlContext);\n\n return (\n <DefaultSectionContainer\n backgroundColor={VARIANTS[slice.variant].backgroundColor.left}\n title={slice.title}\n >\n <Wrapper>\n {slice.title ? (\n <>\n <Flex alignItems=\"center\" flexDirection=\"column\">\n <DefaultSectionHeader\n tagline={slice.tagline}\n taglineProps={{\n color: VARIANTS[slice.variant].taglineColor.left,\n textAlign: 'center',\n maxWidth: '3xl',\n }}\n title={slice.title}\n titleProps={{\n color: VARIANTS[slice.variant].titleColor.left,\n textAlign: 'center',\n width: 'full',\n maxWidth: '3xl',\n }}\n text={slice.subTitle}\n textProps={{\n color: VARIANTS[slice.variant].subTitleColor.left,\n textAlign: 'center',\n maxWidth: '3xl',\n }}\n />\n </Flex>\n <Spacer height={['16', null, null, null, '20']} />\n </>\n ) : (\n <></>\n )}\n <Flex gap=\"4\" flexDirection=\"column\">\n {slice.ctaCards.map((ctaCard) => {\n const ctaCardType = getTypeOfCard(ctaCard);\n\n return (\n <Container\n backgroundColor={\n VARIANTS[ctaCard.variant].backgroundColor[ctaCardType]\n }\n key={ctaCard.id}\n position=\"relative\"\n elevation=\"none\"\n >\n {ctaCard.image &&\n ctaCardType === CtaCardType.CenterWithImage ? (\n <Box\n position=\"absolute\"\n left=\"0\"\n top=\"0\"\n width=\"full\"\n height=\"full\"\n borderRadius=\"xl\"\n overflow=\"hidden\"\n >\n <Image\n src={strapiMediaUrl(ctaCard.image.img, 'large')}\n alt={ctaCard.image.alt}\n fill\n style={{\n objectFit: ctaCard.image.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n <Gradient />\n </Box>\n ) : (\n <></>\n )}\n {ctaCard.backgroundShape ? (\n <Box\n position=\"absolute\"\n left=\"0\"\n top=\"0\"\n width=\"full\"\n height=\"full\"\n >\n <Image\n src={\n ctaCardType === CtaCardType.CenterWithImage ||\n ctaCard.variant === 'green'\n ? `${CDN_URI}/assets/v3/strapi-slices/shapes-dark.svg`\n : `${CDN_URI}/assets/v3/strapi-slices/shapes-light.svg`\n }\n alt={formatMessage({\n id: `sections.cta.backgroundShapes${\n ctaCardType === CtaCardType.CenterWithImage ||\n ctaCard.variant === 'green'\n ? 'Dark'\n : 'Light'\n }`,\n })}\n fill\n style={{\n objectFit: 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n ) : (\n <></>\n )}\n\n <Flex\n flexDir={['column', null, null, null, 'row']}\n flexGrow=\"1\"\n gap={['8', null, null, null, '16']}\n justifyContent={STATES[ctaCardType].justifyContent}\n >\n {ctaCard.image && ctaCardType === CtaCardType.Right ? (\n <Box\n position=\"relative\"\n height={['3xs', null, null, null, 'auto']}\n minWidth={[null, null, null, null, '50%']}\n >\n <Image\n src={strapiMediaUrl(ctaCard.image.img, 'xLarge')}\n alt={ctaCard.image.alt}\n fill\n style={{\n objectFit: ctaCard.image.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n ) : (\n <></>\n )}\n\n <Box\n zIndex=\"base\"\n marginLeft={STATES[ctaCardType].textMarginLeft}\n marginRight={STATES[ctaCardType].textMarginRight}\n maxWidth=\"3xl\"\n >\n <Spacer height={['0', null, null, null, '20']} />\n\n <DefaultSectionHeader\n tagline={ctaCard.tagline}\n taglineProps={{\n textAlign: STATES[ctaCardType].textAlign,\n color:\n VARIANTS[ctaCard.variant].taglineColor[ctaCardType],\n paddingX: [\n '0',\n null,\n null,\n null,\n STATES[ctaCardType].paddingTagline,\n ],\n }}\n title={ctaCard.title}\n titleProps={{\n fontFamily: 'heading',\n fontSize: '4xl',\n fontWeight: '600',\n lineHeight: '9',\n textAlign: STATES[ctaCardType].textAlign,\n paddingX: [\n '0',\n null,\n null,\n null,\n STATES[ctaCardType].paddingTitle,\n ],\n color:\n VARIANTS[ctaCard.variant].titleColor[ctaCardType],\n }}\n text={ctaCard.subTitle}\n textProps={{\n textAlign: STATES[ctaCardType].textAlign,\n color:\n VARIANTS[ctaCard.variant].subTitleColor[ctaCardType],\n }}\n />\n {ctaCard.buttons && ctaCard.buttons.length > 0 ? (\n <>\n <Spacer height=\"8\" />\n <Flex\n gap=\"2\"\n justifyContent={\n STATES[ctaCardType].buttonJustifyContent\n }\n >\n {ctaCard.buttons &&\n ctaCard.buttons.map((button) => (\n <StrapiLinkButton\n key={button.button.id}\n link={button.button}\n size=\"md\"\n variant={button.variant}\n component=\"Cta\"\n />\n ))}\n </Flex>\n </>\n ) : (\n <></>\n )}\n <Spacer height={['1', null, null, null, '20']} />\n </Box>\n {ctaCard.image && ctaCardType === CtaCardType.Left ? (\n <Box\n position=\"relative\"\n height={['3xs', null, null, null, 'auto']}\n minWidth={[null, null, null, null, '50%']}\n >\n <Image\n src={strapiMediaUrl(ctaCard.image.img, 'xLarge')}\n alt={ctaCard.image.alt}\n fill\n style={{\n objectFit: ctaCard.image.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n ) : (\n <></>\n )}\n </Flex>\n </Container>\n );\n })}\n </Flex>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React from 'react';\nimport { Box, DefaultSectionContainer, Wrapper } from 'boemly';\nimport { useMeasure } from 'react-use';\n\ninterface VideoSlice {\n youTubeID: string;\n title: string;\n}\n\nexport interface VideoProps {\n slice: VideoSlice;\n}\n\nexport const Video: React.FC<VideoProps> = ({ slice }: VideoProps) => {\n const [ref, { width }] = useMeasure<HTMLDivElement>();\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n <Box ref={ref} borderRadius=\"xl\">\n <iframe\n data-testid=\"video-iframe\"\n width={width}\n height={(width / 16) * 9}\n src={`https://www.youtube.com/embed/${slice.youTubeID}`}\n frameBorder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n title={slice.title}\n style={{ borderRadius: 'var(--boemly-radii-xl)' }}\n />\n </Box>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React from 'react';\nimport Image from 'next/image';\nimport {\n DefaultSectionContainer,\n Wrapper,\n AvatarWithName,\n Text,\n Box,\n} from 'boemly';\nimport StrapiAvatarWithName from '../../models/strapi/StrapiAvatarWithName';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\n\nexport interface FullWidthHighlightQuoteProps {\n slice: {\n tagline?: string;\n quote: string;\n avatarWithName: StrapiAvatarWithName;\n };\n}\n\nexport const FullWidthHighlightQuote: React.FC<\n FullWidthHighlightQuoteProps\n> = ({ slice }: FullWidthHighlightQuoteProps) => (\n <DefaultSectionContainer>\n <Wrapper>\n <Box maxWidth=\"5xl\" marginX=\"auto\" mb=\"8\">\n {slice.tagline && (\n <Text\n color=\"primary.700\"\n size=\"mdMonoUppercase\"\n textAlign=\"center\"\n mb=\"3\"\n >\n {slice.tagline}\n </Text>\n )}\n <Text color=\"black\" size=\"xlRegularNormalBold\" textAlign=\"center\">\n {slice.quote}\n </Text>\n </Box>\n <AvatarWithName\n name={slice.avatarWithName.name}\n description={slice.avatarWithName.description}\n image={\n <Image\n src={strapiMediaUrl(slice.avatarWithName.image.img, 'small')}\n alt={slice.avatarWithName.image.alt}\n fill\n style={{\n objectFit: slice.avatarWithName.image.objectFit || 'cover',\n }}\n />\n }\n orientation=\"vertical\"\n />\n </Wrapper>\n </DefaultSectionContainer>\n);\n","import { motion } from 'framer-motion';\nimport styled from '@emotion/styled';\nimport { BREAKPOINT_MD } from '../../constants/breakpoints';\nimport { Box } from 'boemly';\n\nexport const SliderContainer = styled(Box)`\n --mobile-image-width: calc(100vw - var(--boemly-space-24));\n --desktop-image-width: var(--boemly-sizes-md);\n\n width: var(--boemly-size-full);\n\n overflow-x: hidden;\n\n padding-left: max(\n var(--boemly-space-8),\n calc(50vw - var(--boemly-sizes-7xl) / 2 + var(--boemly-space-6))\n );\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n overflow-x: scroll;\n padding-left: max(\n var(--boemly-space-8),\n calc(50vw - var(--boemly-sizes-7xl) / 2 + var(--boemly-space-8))\n );\n }\n`;\n\ninterface SliderInnerContainerProps {\n imageCount: number;\n}\nexport const SliderInnerContainer = styled(\n motion.div\n)<SliderInnerContainerProps>`\n display: flex;\n gap: var(--boemly-space-6);\n\n width: fit-content;\n`;\n\nexport const ItemContainer = styled(Box)`\n width: var(--desktop-image-width);\n\n :last-of-type {\n margin-right: var(--boemly-space-8);\n }\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n width: var(--mobile-image-width);\n }\n`;\n\ninterface ImageContainerProps {\n aspectRatio: number;\n}\nexport const ImageContainer = styled(Box)<ImageContainerProps>`\n position: relative;\n\n max-height: var(--boemly-sizes-xl);\n height: calc(\n var(--desktop-image-width) /\n ${({ aspectRatio }: ImageContainerProps) => aspectRatio}\n );\n width: var(--desktop-image-width);\n\n border-radius: var(--boemly-radii-xl);\n\n & img {\n border-radius: var(--boemly-radii-xl);\n }\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n height: calc(\n var(--mobile-image-width) /\n ${({ aspectRatio }: ImageContainerProps) => aspectRatio}\n );\n width: var(--mobile-image-width);\n }\n`;\n","const ALLOWED_RATIOS = [2 / 3, 1 / 1, 3 / 2, 2 / 1, 3 / 1, 4 / 1, 5 / 1]; // width / height\n\nexport const getClosestRatio = (width: number, height: number): number => {\n const ratio = width / height;\n\n let minDiff = Math.abs(ratio - ALLOWED_RATIOS[0]);\n let posMinDiff = 0;\n\n ALLOWED_RATIOS.forEach((allowedRatio, index) => {\n if (Math.abs(ratio - allowedRatio) < minDiff) {\n minDiff = Math.abs(ratio - allowedRatio);\n posMinDiff = index;\n }\n });\n\n return ALLOWED_RATIOS[posMinDiff];\n};\n","import React, { useMemo, useRef, useState } from 'react';\nimport {\n Box,\n IconButton,\n DefaultSectionContainer,\n Flex,\n Text,\n useMediaQuery,\n} from 'boemly';\nimport Image from 'next/image';\nimport { useMeasure, useWindowSize } from 'react-use';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { ArrowLeft, ArrowRight } from '@phosphor-icons/react';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport FullScreenImage from '../../components/FullScreenImage';\nimport { BREAKPOINT_MD_QUERY } from '../../constants/breakpoints';\nimport {\n ItemContainer,\n SliderContainer,\n SliderInnerContainer,\n ImageContainer,\n} from './styles';\nimport { getClosestRatio } from '../../utils/getClosestRatio';\n\nexport interface FullWidthImageSliderProps {\n slice: {\n images: {\n id: number;\n caption: string;\n img: StrapiImage;\n }[];\n };\n}\n\nconst ITEM_GAP = 24;\nconst MAX_OFFSET_RIGHT = 162;\n\nexport const FullWidthImageSlider: React.FC<FullWidthImageSliderProps> = ({\n slice,\n}: FullWidthImageSliderProps) => {\n const containerRef = useRef(null);\n const [imageRef, { width: imageWidth }] = useMeasure<HTMLDivElement>();\n const { width: windowWidth } = useWindowSize();\n const [isMobile] = useMediaQuery(BREAKPOINT_MD_QUERY);\n\n const [sliderIndex, setSliderIndex] = useState(0);\n const [isOpen, setIsOpen] = useState(false);\n\n const numberOfItems = useMemo(\n () => slice.images.length,\n [slice.images.length]\n );\n\n const sliderItemsWidth = useMemo(\n () => numberOfItems * (imageWidth + ITEM_GAP) - ITEM_GAP,\n [imageWidth, numberOfItems]\n );\n\n const offsetLeft = useMemo(\n () => sliderIndex * (imageWidth + ITEM_GAP) * -1,\n [sliderIndex, imageWidth]\n );\n\n const allowScroll = useMemo(\n () => sliderItemsWidth + ITEM_GAP * 3 > windowWidth,\n\n [sliderItemsWidth, windowWidth]\n );\n\n const canMoveRight = useMemo(() => {\n const offsetRight = windowWidth - (sliderItemsWidth + offsetLeft);\n\n return offsetRight < MAX_OFFSET_RIGHT;\n }, [imageWidth, sliderIndex, sliderItemsWidth, windowWidth]);\n\n const canMoveLeft = useMemo(() => sliderIndex !== 0, [sliderIndex]);\n\n return (\n <DefaultSectionContainer>\n <SliderContainer ref={containerRef}>\n <SliderInnerContainer\n animate={{\n x: imageWidth * -sliderIndex,\n }}\n transition={{\n duration: 0.3,\n ease: 'easeInOut',\n }}\n imageCount={slice.images.length}\n >\n {slice.images.map((image, index) => (\n <ItemContainer key={image.id} ref={imageRef}>\n <Flex\n height=\"full\"\n width=\"full\"\n justifyContent=\"end\"\n flexDirection=\"column\"\n gap=\"2\"\n >\n <ImageContainer\n aspectRatio={getClosestRatio(\n image.img.img.data.attributes.width,\n image.img.img.data.attributes.height\n )}\n >\n <Image\n src={strapiMediaUrl(image.img.img, 'large')}\n alt={image.img.alt}\n fill\n style={{\n objectFit: image.img.objectFit || 'cover',\n cursor: isMobile ? 'unset' : 'pointer',\n }}\n onClick={() => {\n setSliderIndex(index);\n if (!isMobile) setIsOpen(true);\n }}\n />\n </ImageContainer>\n\n <Text noOfLines={3} height=\"72px\" fontSize=\"md\">\n {image.caption}\n </Text>\n </Flex>\n </ItemContainer>\n ))}\n </SliderInnerContainer>\n </SliderContainer>\n\n <Box\n display={['none', null, null, !!allowScroll ? 'flex' : 'none']}\n pointerEvents=\"none\"\n position=\"absolute\"\n top=\"calc(50% - var(--boemly-sizes-12))\"\n left=\"0\"\n width=\"full\"\n py=\"0\"\n px=\"32\"\n justifyContent=\"space-between\"\n >\n <Box>\n <AnimatePresence>\n {canMoveLeft && (\n <IconButton\n key=\"leftButton\"\n as={motion.button}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n size=\"lg\"\n variant=\"outline\"\n onClick={() => setSliderIndex(sliderIndex - 1)}\n aria-label=\"Move left\"\n icon={<ArrowLeft size={16} />}\n pointerEvents=\"auto\"\n />\n )}\n </AnimatePresence>\n </Box>\n <Box>\n <AnimatePresence>\n {canMoveRight && (\n <IconButton\n key=\"rightButton\"\n as={motion.button}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n size=\"lg\"\n variant=\"outline\"\n onClick={() => setSliderIndex(sliderIndex + 1)}\n aria-label=\"Move right\"\n icon={<ArrowRight size={16} />}\n pointerEvents=\"auto\"\n />\n )}\n </AnimatePresence>\n </Box>\n </Box>\n\n <FullScreenImage\n images={slice.images.map((image) => image.img)}\n currentIndex={sliderIndex}\n setCurrentIndex={setSliderIndex}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n />\n </DefaultSectionContainer>\n );\n};\n","import React from 'react';\nimport {\n Box,\n DefaultSectionContainer,\n Grid,\n GridItem,\n SimpleGrid,\n Text,\n Wrapper,\n} from 'boemly';\nimport Image from 'next/image';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\n\nexport interface SideBySideImagesProps {\n slice: {\n images: {\n id: number;\n caption: string;\n img: StrapiImage;\n }[];\n };\n}\nexport const SideBySideImages: React.FC<SideBySideImagesProps> = ({\n slice,\n}: SideBySideImagesProps) => (\n <DefaultSectionContainer>\n <Wrapper>\n <Grid templateColumns=\"repeat(12, 1fr)\" gap=\"4\">\n <GridItem colSpan={[12, null, null, 7]}>\n <SimpleGrid\n columns={[1, null, null, 2]}\n gap={['12', null, null, '6']}\n >\n {slice.images.map((image) => (\n <Box key={image.id}>\n <Box height=\"md\" position=\"relative\" borderRadius=\"xl\">\n <Image\n src={strapiMediaUrl(image.img.img, 'large')}\n alt={image.img.alt}\n fill\n style={{\n objectFit: image.img.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n <Text mt=\"3\" size=\"xsLowNormal\">\n {image.caption}\n </Text>\n </Box>\n ))}\n </SimpleGrid>\n </GridItem>\n </Grid>\n </Wrapper>\n </DefaultSectionContainer>\n);\n","import Locale from '../Locale';\nimport StrapiImage from './StrapiImage';\nimport StrapiLink from './StrapiLink';\nimport StrapiLocalization from './StrapiLocalization';\nimport StrapiTopBanner from './StrapiTopBanner';\n\nexport enum EventType {\n CONFERENCE = 'Conference',\n MEET_UP = 'Meet Up',\n WEBINAR = 'Webinar',\n FOREST_WALK = 'Forest Walk',\n LUNCH_AND_LEARN = 'Lunch & Learn',\n FESTIVAL = 'Festival',\n ROADSHOW = 'RoadShow',\n PARTNER_EVENT = 'Partner Event',\n FAIR = 'Fair',\n}\n\ninterface StrapiEvent {\n title: string;\n description: string;\n button?: StrapiLink;\n buttonVariant?: 'outline' | 'ghost' | 'link' | 'solid' | 'outlineWhite';\n recommended?: boolean;\n speakers?: {\n id: number;\n name: string;\n image: StrapiImage;\n }[];\n image: StrapiImage;\n logo: StrapiImage;\n eventTypes: {\n id: number;\n eventType: EventType;\n }[];\n languages: {\n id: number;\n language: string;\n countryCode: string;\n }[];\n location?: string;\n locale: Locale;\n online?: boolean;\n start: Date;\n end?: Date;\n allDay?: boolean;\n slices: any[];\n localizations: StrapiLocalization[];\n topBanner?: StrapiTopBanner;\n}\n\nexport default StrapiEvent;\n","import React from 'react';\nimport { Box, Wrapper } from 'boemly';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport StrapiLink from '../../models/strapi/StrapiLink';\n\nexport interface CtaOnlyProps {\n slice: {\n button: StrapiLink;\n };\n}\n\nexport const CtaOnly: React.FC<CtaOnlyProps> = ({ slice }: CtaOnlyProps) => (\n <Wrapper>\n <Box position=\"absolute\" top=\"-28\" transform=\"translateY(50%)\">\n <StrapiLinkButton size=\"md\" link={slice.button} component=\"CtaOnly\" />\n </Box>\n </Wrapper>\n);\n","import React, { useContext, useState } from 'react';\nimport {\n DefaultSectionContainer,\n Divider,\n Flex,\n GridItem,\n Heading,\n IconButton,\n SimpleGrid,\n Text,\n Wrapper,\n} from 'boemly';\nimport { Check, Link as LinkIcon } from '@phosphor-icons/react';\nimport { useCopyToClipboard } from 'react-use';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport StrapiGlossaryItem from '../../models/strapi/StrapiGlossaryItem';\nimport { IntlContext } from '../../components/ContextProvider';\n\nexport interface GlossaryProps {\n slice: {\n glossary_items: IStrapiData<StrapiGlossaryItem>[];\n };\n}\n\nexport const Glossary: React.FC<GlossaryProps> = ({ slice }: GlossaryProps) => {\n const [, copyToClipboard] = useCopyToClipboard();\n const { formatMessage } = useContext(IntlContext);\n const grouped: Record<string, StrapiGlossaryItem[]> = {};\n const [copiedItem, setCopiedItem] = useState<string>();\n\n slice.glossary_items\n .sort((a, b) => a.attributes.title.localeCompare(b.attributes.title))\n .forEach((curr) => {\n const index = curr.attributes.title.at(0)?.toUpperCase() || 'A';\n if (!grouped[index]) {\n grouped[index] = [];\n }\n grouped[index].push(curr.attributes);\n }, {});\n\n const handleAnchorClick = async (slug: string) => {\n if (window?.location) {\n const currentUrl = window.location.href.split('#')[0];\n copyToClipboard(`${currentUrl}#${slug}`);\n setCopiedItem(slug);\n\n setTimeout(() => {\n setCopiedItem(undefined);\n }, 1200);\n }\n };\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n <SimpleGrid>\n {Object.entries(grouped).map(([letter, items], index) => (\n <GridItem maxW=\"xl\" placeSelf=\"center\" key={letter}>\n <Heading size=\"3xl\" mb=\"8\">\n {letter}\n </Heading>\n\n <SimpleGrid spacing=\"6\">\n {items.map((item) => (\n <GridItem key={item.slug}>\n <Flex mb=\"2\" gap=\"1.5\" alignItems=\"center\">\n <Heading\n wordBreak=\"break-word\"\n size=\"xl\"\n id={item.slug}\n scrollMarginTop=\"calc(var(--header-height) + var(--boemly-sizes-10))\"\n >\n {item.title}\n </Heading>\n <IconButton\n variant=\"ghost\"\n size=\"xs\"\n icon={\n copiedItem === item.slug ? (\n <Check size=\"16\" data-testid=\"check-icon\" />\n ) : (\n <LinkIcon size=\"16\" />\n )\n }\n title={formatMessage({\n id: 'sections.glossary.copyButtonLabel',\n })}\n aria-label={formatMessage({\n id: 'sections.glossary.copyButtonLabel',\n })}\n onClick={async () => handleAnchorClick(item.slug)}\n />\n </Flex>\n <Text color=\"black\" wordBreak=\"break-word\">\n {item.text}\n </Text>\n </GridItem>\n ))}\n </SimpleGrid>\n\n {index !== Object.keys(grouped).length - 1 && (\n <Divider maxW=\"xl\" placeSelf=\"center\" mb=\"10\" mt=\"10\" />\n )}\n </GridItem>\n ))}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React, { useContext, useCallback } from 'react';\nimport {\n Badge,\n BoemlyFormControl,\n Box,\n Button,\n Container,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Divider,\n Flex,\n InputRightAddon,\n LabelNumberPair,\n RichText,\n SimpleGrid,\n Spacer,\n useToken,\n Wrapper,\n} from 'boemly';\nimport { Field, FieldProps, Form, Formik, FormikProps } from 'formik';\nimport { FPM_API_URI } from '../../constants/api';\nimport CheckoutForm from '../../models/forms/CheckoutForm';\nimport {\n MAXIMUM_CONTRIBUTION_VALUE_IN_MONEY,\n MINIMUM_CONTRIBUTION_VALUE_IN_MONEY,\n} from '../../constants/domain';\nimport { IntlContext } from '../../components/ContextProvider';\nimport { useRouter } from 'next/router';\n\nexport interface ShopCheckoutProps {\n slice: {\n tagline?: string;\n title: string;\n text?: string;\n badge?: string;\n batchId: string;\n pricePerKg: number;\n couponId?: string;\n initialContributionValue: number;\n checkoutText: string;\n currency: 'EUR' | 'CHF';\n taxInPercent?: number;\n };\n}\n\nexport const ShopCheckout = ({ slice }: ShopCheckoutProps): JSX.Element => {\n const [primary50] = useToken('colors', ['primary.50']);\n const { formatMessage, formatNumber, locale } = useContext(IntlContext);\n const { push } = useRouter();\n\n const validateForm = useCallback(\n (values: CheckoutForm) => {\n const errors: Partial<{ contributionValue: string }> = {};\n\n if (!values.contributionValue) {\n errors.contributionValue = formatMessage({\n id: 'sections.shopCheckout.contributionValue.validation.empty',\n });\n } else if (\n values.contributionValue < MINIMUM_CONTRIBUTION_VALUE_IN_MONEY\n ) {\n errors.contributionValue = formatMessage({\n id: `sections.shopCheckout.contributionValue.validation.tooLow.${slice.currency}`,\n });\n } else if (\n values.contributionValue > MAXIMUM_CONTRIBUTION_VALUE_IN_MONEY\n ) {\n errors.contributionValue = formatMessage({\n id: 'sections.shopCheckout.contributionValue.validation.tooHigh',\n });\n }\n\n return errors;\n },\n [locale]\n );\n\n const onSubmit = ({ contributionValue }: CheckoutForm) => {\n const checkoutURL = new URL(`${FPM_API_URI}/v1/webhooks/shop/checkout`);\n const currentURL = new URL(window.location.href);\n\n checkoutURL.searchParams.append('batchId', slice.batchId);\n\n checkoutURL.searchParams.append(\n 'quantity',\n Math.floor(contributionValue / slice.pricePerKg).toString()\n );\n\n checkoutURL.searchParams.append('cancelPath', currentURL.pathname);\n\n if (slice.couponId)\n checkoutURL.searchParams.append('couponId', slice.couponId);\n\n push(checkoutURL.toString());\n };\n\n return (\n <DefaultSectionContainer backgroundColor={primary50} title={slice.title}>\n <Wrapper>\n <Flex\n flexDir={['column', null, null, null, 'row']}\n justifyContent=\"space-between\"\n alignItems={['left', null, null, null, 'center']}\n >\n <Box marginRight={['0', null, null, null, '36']} flexShrink={2}>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n />\n </Box>\n <Container maxWidth=\"md\" padding=\"lg\" shadow=\"lg\">\n {slice.badge ? (\n <>\n <Badge\n colorScheme=\"green\"\n textTransform=\"none\"\n whiteSpace=\"unset\"\n >\n {slice.badge}\n </Badge>\n <Spacer height=\"3\" />\n </>\n ) : (\n <></>\n )}\n\n <RichText\n content={slice.checkoutText}\n textProps={{ color: 'gray.500' }}\n />\n\n <Spacer height=\"6\" />\n <Divider />\n <Spacer height=\"6\" />\n\n <LabelNumberPair\n label={formatMessage({ id: 'sections.shopCheckout.intro.price' })}\n number={`${formatNumber(slice.pricePerKg * 100, {\n style: 'currency',\n currency: slice.currency,\n })}/${formatNumber(100, {\n style: 'unit',\n unit: 'kilogram',\n })} CO₂`}\n caption={formatMessage({\n id: 'sections.shopCheckout.summary.price.taxNotIncluded',\n })}\n />\n\n <Spacer height=\"6\" />\n <Divider />\n <Spacer height=\"6\" />\n\n <Formik\n initialValues={{\n contributionValue: slice.initialContributionValue,\n }}\n validate={validateForm}\n onSubmit={onSubmit}\n >\n {({\n errors,\n touched,\n handleSubmit,\n values,\n }: FormikProps<CheckoutForm>) => {\n const summaryPrice =\n Math.floor(values.contributionValue / slice.pricePerKg) *\n slice.pricePerKg;\n\n return (\n <Form onSubmit={handleSubmit}>\n <Box width=\"full\">\n <Field name=\"contributionValue\">\n {({ field }: FieldProps) => (\n <BoemlyFormControl\n id=\"contributionValue\"\n size=\"md\"\n inputProps={{ type: 'number', ...field }}\n label={formatMessage({\n id: `sections.shopCheckout.contributionValue.label.${slice.currency}`,\n })}\n rightAddonsOrElements={[\n <InputRightAddon key=\"1\">\n {formatMessage({\n id: `sections.shopCheckout.contributionValue.unit.${slice.currency}`,\n })}\n </InputRightAddon>,\n ]}\n isInvalid={\n !!errors.contributionValue &&\n touched.contributionValue\n }\n errorMessage={errors.contributionValue}\n />\n )}\n </Field>\n </Box>\n\n <Spacer height=\"6\" />\n\n <SimpleGrid columns={2} gap=\"4\">\n <LabelNumberPair\n label={formatMessage({\n id: 'sections.shopCheckout.summary.kg',\n })}\n number={`${formatNumber(\n Math.floor(\n values.contributionValue / slice.pricePerKg\n ),\n {\n style: 'unit',\n unit: 'kilogram',\n maximumFractionDigits: 0,\n }\n )} CO₂`}\n />\n <LabelNumberPair\n label={formatMessage({\n id: 'sections.shopCheckout.summary.price',\n })}\n number={formatNumber(summaryPrice, {\n style: 'currency',\n currency: slice.currency,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}\n caption={\n slice.taxInPercent &&\n slice.taxInPercent > 0 &&\n summaryPrice > 0\n ? formatMessage(\n {\n id: 'sections.shopCheckout.summary.price.taxIncluded',\n },\n {\n number: formatNumber(\n summaryPrice +\n summaryPrice * (slice.taxInPercent / 100),\n {\n style: 'currency',\n currency: slice.currency,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }\n ),\n }\n )\n : ''\n }\n />\n </SimpleGrid>\n\n <Spacer height=\"6\" />\n\n <Button type=\"submit\" width=\"full\">\n {formatMessage({ id: 'sections.shopCheckout.submit' })}\n </Button>\n </Form>\n );\n }}\n </Formik>\n </Container>\n </Flex>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","export const MINIMUM_CONTRIBUTION_VALUE_IN_MONEY = 10;\n\nexport const MAXIMUM_CONTRIBUTION_VALUE_IN_MONEY = 10_000;\n","import React from 'react';\nimport {\n DefaultSectionContainer,\n DefaultSectionHeader,\n Flex,\n Heading,\n Spacer,\n Text,\n} from 'boemly';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport StrapiLink from '../../models/strapi/StrapiLink';\n\nexport interface FactsProps {\n slice: {\n tagline?: string;\n title?: string;\n subTitle?: string;\n button?: StrapiLink;\n variant: 'gray' | 'green' | 'white';\n facts: { key: string; value: string }[];\n };\n}\n\nconst VARIANTS = {\n gray: {\n backgroundColor: 'primary.50',\n tagLineColor: 'primary.500',\n titleColor: 'black',\n subTitleColor: 'black',\n factKeyColor: 'gray.700',\n factValueColor: 'gray.700',\n },\n green: {\n backgroundColor: 'primary.800',\n tagLineColor: 'white',\n titleColor: 'white',\n subTitleColor: 'white',\n factKeyColor: 'whiteAlpha.900',\n factValueColor: 'white',\n },\n white: {\n backgroundColor: 'white',\n tagLineColor: 'primary.500',\n titleColor: 'black',\n subTitleColor: 'black',\n factKeyColor: 'gray.700',\n factValueColor: 'gray.700',\n },\n};\n\nexport const Facts: React.FC<FactsProps> = ({ slice }: FactsProps) => (\n <DefaultSectionContainer\n backgroundColor={VARIANTS[slice.variant].backgroundColor}\n flexDir=\"column\"\n textAlign=\"center\"\n justifyContent=\"space-between\"\n paddingX={['6', null, '8']}\n title={slice.title}\n >\n <>\n {slice.title && (\n <>\n <DefaultSectionHeader\n tagline={slice.tagline}\n text={slice.subTitle}\n title={slice.title}\n taglineProps={{\n color: VARIANTS[slice.variant].tagLineColor,\n textAlign: 'center',\n }}\n titleProps={{\n color: VARIANTS[slice.variant].titleColor,\n textAlign: 'center',\n maxW: '6xl',\n marginX: 'auto',\n }}\n textProps={{\n color: VARIANTS[slice.variant].subTitleColor,\n textAlign: 'center',\n maxW: '3xl',\n marginX: 'auto',\n }}\n />\n <Spacer height={['0', null, '12']} />\n </>\n )}\n <Flex\n justifyContent={slice.facts.length < 3 ? 'center' : 'flex-start'}\n alignItems=\"center\"\n flexWrap=\"wrap\"\n mx={[null, null, null, '22', '28']}\n flexDir={['column', null, null, 'row']}\n gap={[null, null, null, '12']}\n >\n {slice.facts.map((fact) => (\n <Flex\n key={fact.key}\n flexDir=\"column\"\n width={[\n 'var(--boemly-sizes-full)',\n null,\n null,\n 'calc((var(--boemly-sizes-full) - var(--boemly-space-24))/ 3 )',\n ]}\n mt={['8', '8', '8', slice.facts.length > 3 ? '16' : '0']}\n >\n <Heading\n fontSize=\"6xl\"\n fontFamily=\"display\"\n lineHeight=\"10\"\n fontWeight=\"700\"\n color={VARIANTS[slice.variant].factValueColor}\n mb=\"2\"\n as=\"p\"\n >\n {fact.value}\n </Heading>\n\n <Text\n size=\"mdLowNormal\"\n color={VARIANTS[slice.variant].factKeyColor}\n >\n {fact.key}\n </Text>\n </Flex>\n ))}\n </Flex>\n\n {slice.button && (\n <>\n <Spacer height={['0', null, '20']} />\n <StrapiLinkButton\n link={slice.button}\n size=\"md\"\n variant={slice.variant === 'green' ? 'outline' : 'solid'}\n component=\"Facts\"\n />\n </>\n )}\n </>\n </DefaultSectionContainer>\n);\n","import React, { useContext, useMemo } from 'react';\nimport {\n Text,\n Heading,\n Spacer,\n DatePersonPair,\n DefaultSectionHeader,\n DefaultSectionContainer,\n Wrapper,\n SimpleGrid,\n Box,\n Flex,\n useMediaQuery,\n useToken,\n} from 'boemly';\nimport Image from 'next/image';\nimport Link from 'next/link';\nimport { CaretRight } from '@phosphor-icons/react';\nimport StrapiBlogPost from '../../models/strapi/StrapiBlogPost';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiCategory from '../../models/strapi/StrapiCategory';\nimport IStrapi from '../../models/strapi/IStrapi';\nimport { BREAKPOINT_LG_QUERY } from '../../constants/breakpoints';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport { BlogItemContainer, ImageContainer } from '../Blog/styles';\nimport { IntlContext } from '../../components/ContextProvider';\n\nexport interface BlogCardsProps {\n slice: {\n tagline: string;\n title: string;\n subTitle: string;\n button?: StrapiLink;\n variant: 'white' | 'gray';\n blogPostCategory: IStrapi<IStrapiData<StrapiCategory> | null>;\n };\n blogPosts: IStrapiData<StrapiBlogPost>[];\n}\n\nconst VARIANTS = {\n white: {\n backgroundColor: 'white',\n },\n gray: {\n backgroundColor: 'primary.50',\n },\n};\n\nconst sortByCreatedAt = (\n a: IStrapiData<StrapiBlogPost>,\n b: IStrapiData<StrapiBlogPost>\n): number =>\n new Date(b.attributes.createdAt).getTime() -\n new Date(a.attributes.createdAt).getTime();\n\nexport const BlogCards: React.FC<BlogCardsProps> = ({\n slice,\n blogPosts,\n}: BlogCardsProps) => {\n const { formatDate } = useContext(IntlContext);\n const [mobile] = useMediaQuery(BREAKPOINT_LG_QUERY);\n const [gray700] = useToken('colors', ['gray.700']);\n\n const sortedBlogPosts = useMemo(\n () => blogPosts.sort(sortByCreatedAt),\n [blogPosts]\n );\n\n const blogPostsToDisplay = useMemo(\n () =>\n slice.blogPostCategory?.data?.attributes.name\n ? sortedBlogPosts\n .filter(\n (blogPost) =>\n blogPost.attributes.category.data?.attributes.name ===\n slice.blogPostCategory?.data?.attributes.name\n )\n .slice(0, 3)\n : sortedBlogPosts.slice(0, 3),\n [sortedBlogPosts, slice]\n );\n\n return (\n <DefaultSectionContainer\n backgroundColor={VARIANTS[slice.variant].backgroundColor}\n title={slice.title}\n >\n <Wrapper>\n {mobile || !slice.button ? (\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.subTitle}\n titleProps={{ maxW: '2xl' }}\n textProps={{ maxW: '2xl' }}\n />\n ) : (\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap=\"60\">\n <Box>\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.subTitle}\n />\n </Box>\n <Box minWidth=\"40\">\n <StrapiLinkButton\n link={slice.button}\n size=\"lg\"\n variant=\"outline\"\n rightIcon={<CaretRight color={gray700} />}\n component=\"BlogCards\"\n />\n </Box>\n </Flex>\n )}\n <Spacer height=\"14\" />\n <SimpleGrid\n columns={[1, null, null, 3]}\n spacingX={4}\n spacingY={24}\n flexShrink=\"0\"\n >\n {blogPostsToDisplay.map((blogPost) => (\n <BlogItemContainer\n as={Link}\n href={`/blog/${blogPost.attributes.slug}`}\n data-testid=\"blog-item\"\n key={blogPost.attributes.slug}\n >\n <ImageContainer>\n <Image\n src={strapiMediaUrl(blogPost.attributes.img.img, 'medium')}\n alt={blogPost.attributes.img.alt}\n fill\n style={{\n objectFit: blogPost.attributes.img.objectFit || 'cover',\n }}\n />\n </ImageContainer>\n <Box px=\"2\" py=\"8\">\n {blogPost.attributes.category && (\n <Text size=\"smMonoUppercase\" color=\"primary.800\" mb=\"2\">\n {blogPost.attributes.category.data?.attributes.name}\n </Text>\n )}\n <Heading size=\"lg\">{blogPost.attributes.title}</Heading>\n {blogPost.attributes.teaser && (\n <Text size=\"mdRegularNormal\" mt=\"2\">\n {blogPost.attributes.teaser}\n </Text>\n )}\n\n <Spacer height=\"4\" />\n\n <DatePersonPair\n date={formatDate(blogPost.attributes.createdAt)}\n person={\n blogPost.attributes.author.data\n ? {\n name: blogPost.attributes.author.data.attributes.name,\n image: (\n <Image\n src={strapiMediaUrl(\n blogPost.attributes.author.data.attributes.img\n .img,\n 'thumbnail'\n )}\n alt={\n blogPost.attributes.author.data.attributes.img\n .alt\n }\n fill\n style={{\n objectFit:\n blogPost.attributes.author.data.attributes.img\n .objectFit || 'cover',\n }}\n />\n ),\n }\n : undefined\n }\n />\n </Box>\n </BlogItemContainer>\n ))}\n </SimpleGrid>\n <>\n {mobile && slice.button && (\n <>\n <Box minWidth=\"40\" mt=\"6\">\n <StrapiLinkButton\n link={slice.button}\n size=\"lg\"\n variant=\"outline\"\n rightIcon={<CaretRight color={gray700} />}\n component=\"BlogCards\"\n />\n </Box>\n </>\n )}\n </>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React, { useCallback, useContext } from 'react';\nimport {\n BoemlyFormControl,\n Box,\n Button,\n Divider,\n Flex,\n InputRightAddon,\n Spacer,\n Text,\n} from 'boemly';\nimport {\n Field,\n FieldProps,\n Form,\n Formik,\n FormikErrors,\n FormikProps,\n} from 'formik';\nimport { useRouter } from 'next/router';\nimport Image from 'next/image';\nimport { StrapiLink } from '../../..';\nimport { IntlContext } from '../../ContextProvider';\nimport {\n MAXIMUM_CONTRIBUTION_VALUE_IN_MONEY,\n MINIMUM_CONTRIBUTION_VALUE_IN_MONEY,\n} from '../../../constants/domain';\nimport { CDN_URI, FPM_API_URI } from '../../../constants/api';\nimport StrapiLinkButton from '../../StrapiLinkButton';\nimport SmallCheckoutForm from '../../../models/forms/SmallCheckoutForm';\n\nconst calculateTaxIncludedValue = (\n values: SmallCheckoutForm,\n taxInPercent: number\n) => {\n const value = parseInt(values.contributionValueCurrency);\n\n if (isNaN(value)) return 0;\n\n return value + value * (taxInPercent / 100);\n};\n\nexport interface SmallCheckoutProps {\n batchId: string;\n pricePerKg: number;\n initialContributionValue: number;\n taxInPercent?: number;\n checkoutText?: string;\n currency: 'EUR' | 'CHF';\n\n title?: string;\n subtitle?: string;\n button?: StrapiLink;\n}\n\nconst SmallCheckout = ({\n pricePerKg,\n currency,\n batchId,\n initialContributionValue,\n taxInPercent,\n checkoutText,\n title,\n subtitle,\n button,\n}: SmallCheckoutProps) => {\n const { formatNumber, formatMessage, locale } = useContext(IntlContext);\n const { push } = useRouter();\n\n const validateForm = useCallback(\n (values: SmallCheckoutForm) => {\n const errors: FormikErrors<SmallCheckoutForm> = {};\n const value = parseInt(values.contributionValueCurrency);\n if (!values.contributionValueCurrency || isNaN(value)) {\n errors.contributionValueCurrency = formatMessage({\n id: 'portfolio.smallCheckout.contributionValueCurrency.validation.empty',\n });\n } else if (value < MINIMUM_CONTRIBUTION_VALUE_IN_MONEY) {\n errors.contributionValueCurrency = formatMessage({\n id: `portfolio.smallCheckout.contributionValueCurrency.validation.tooLow.${currency}`,\n });\n } else if (value > MAXIMUM_CONTRIBUTION_VALUE_IN_MONEY) {\n errors.contributionValueCurrency = formatMessage({\n id: 'portfolio.smallCheckout.contributionValueCurrency.validation.tooHigh',\n });\n }\n\n return errors;\n },\n [currency, locale]\n );\n\n const onSubmit = async ({ contributionValueCurrency }: SmallCheckoutForm) => {\n const checkoutURL = new URL(`${FPM_API_URI}/v1/webhooks/shop/checkout`);\n const currentURL = new URL(window.location.href);\n\n checkoutURL.searchParams.append('batchId', batchId);\n\n checkoutURL.searchParams.append(\n 'quantity',\n Math.floor(parseInt(contributionValueCurrency) / pricePerKg).toString()\n );\n\n checkoutURL.searchParams.append('cancelPath', currentURL.pathname);\n\n push(checkoutURL.toString());\n };\n\n return (\n <Flex\n width=\"full\"\n height=\"full\"\n borderRadius=\"xl\"\n background=\"primary.100\"\n padding=\"6\"\n direction=\"column\"\n >\n <Flex gap=\"2\" alignItems=\"end\" mb=\"6\">\n <Text color=\"black\" lineHeight=\"0\">\n {formatMessage(\n { id: 'unit.formatter.tonsCo2' },\n {\n number: (\n <Text as=\"span\" size=\"lgLowBold\" color=\"black\">\n {formatNumber(pricePerKg * 1000, {\n style: 'currency',\n currency,\n maximumFractionDigits: 0,\n })}\n </Text>\n ),\n }\n )}\n </Text>\n <Text size=\"smLowNormal\">\n {formatMessage({\n id: 'portfolio.smallCheckout.price.taxNotIncluded',\n })}\n </Text>\n </Flex>\n\n <Formik\n initialValues={{\n contributionValueCurrency: initialContributionValue.toString(),\n contributionValueTons: (\n initialContributionValue /\n pricePerKg /\n 1000\n ).toString(),\n }}\n validate={validateForm}\n onSubmit={onSubmit}\n >\n {({\n errors,\n touched,\n handleSubmit,\n setValues,\n values,\n }: FormikProps<SmallCheckoutForm>) => (\n <Form onSubmit={handleSubmit}>\n <Flex gap=\"4\">\n <Box width=\"full\">\n <Field name=\"contributionValueCurrency\">\n {({ field }: FieldProps) => (\n <BoemlyFormControl\n id=\"contributionValueCurrency\"\n size=\"md\"\n inputProps={{\n type: 'number',\n value: field.value || '',\n onChange: (e) => {\n const value = e.target.valueAsNumber;\n\n setValues({\n contributionValueCurrency: value.toString(),\n contributionValueTons: (\n value /\n pricePerKg /\n 1000\n ).toString(),\n });\n },\n }}\n label={formatMessage({\n id: `portfolio.smallCheckout.contributionValueCurrency.label.${currency}`,\n })}\n rightAddonsOrElements={[\n <InputRightAddon key=\"currencyUnit\">\n {formatMessage({\n id: `portfolio.smallCheckout.contributionValueCurrency.unit.${currency}`,\n })}\n </InputRightAddon>,\n ]}\n isInvalid={\n !!errors.contributionValueCurrency &&\n touched.contributionValueCurrency\n }\n errorMessage={errors.contributionValueCurrency}\n />\n )}\n </Field>\n </Box>\n\n <Box width=\"full\">\n <Field name=\"contributionValueTons\">\n {({ field }: FieldProps) => (\n <BoemlyFormControl\n id=\"contributionValueTons\"\n size=\"md\"\n inputProps={{\n type: 'number',\n value: field.value || '',\n onChange: (e) => {\n const value = e.target.valueAsNumber;\n setValues({\n contributionValueCurrency: (\n value *\n pricePerKg *\n 1000\n ).toString(),\n contributionValueTons: value.toString(),\n });\n },\n }}\n label={formatMessage({\n id: 'portfolio.smallCheckout.contributionValueTons.label',\n })}\n rightAddonsOrElements={[\n <InputRightAddon key=\"tCO₂\">tCO₂</InputRightAddon>,\n ]}\n isInvalid={\n !!errors.contributionValueTons &&\n touched.contributionValueTons\n }\n errorMessage={errors.contributionValueTons}\n />\n )}\n </Field>\n </Box>\n </Flex>\n {values.contributionValueCurrency &&\n taxInPercent &&\n taxInPercent > 0 && (\n <Text size=\"smLowNormal\" mt=\"2\">\n {formatMessage(\n { id: 'portfolio.smallCheckout.price.taxIncluded' },\n {\n number: formatNumber(\n calculateTaxIncludedValue(values, taxInPercent),\n {\n style: 'currency',\n currency,\n maximumFractionDigits: 2,\n }\n ),\n }\n )}\n </Text>\n )}\n\n <Spacer height=\"4\" />\n\n <Button type=\"submit\" width=\"full\">\n {formatMessage({ id: 'portfolio.smallCheckout.submitButton' })}\n </Button>\n </Form>\n )}\n </Formik>\n\n <Flex\n width=\"full\"\n justifyContent=\"center\"\n alignItems=\"center\"\n mt=\"6\"\n gap=\"2\"\n >\n <Image\n src={`${CDN_URI}/assets/v3/strapi-slices/globe-love-icon.svg`}\n alt=\"Icon\"\n width={20}\n height={20}\n />\n <Text size=\"smLowNormal\">{checkoutText}</Text>\n </Flex>\n\n <Divider my=\"6\" />\n\n <Flex width=\"full\" alignItems=\"center\" direction=\"column\">\n {title && (\n <Text size=\"smLowBold\" textAlign=\"center\" color=\"black\" mb=\"2\">\n {title}\n </Text>\n )}\n {subtitle && (\n <Text size=\"smRegularNormal\" textAlign=\"center\" mb=\"3\">\n {subtitle}\n </Text>\n )}\n {button && (\n <StrapiLinkButton\n link={{\n intercomLauncher: true,\n ...button,\n }}\n variant=\"outline\"\n component=\"SmallCheckout\"\n />\n )}\n </Flex>\n </Flex>\n );\n};\n\nexport default SmallCheckout;\n","import React, { useContext } from 'react';\nimport {\n Box,\n Container,\n Divider,\n Flex,\n Heading,\n LabelTextPair,\n SimpleGrid,\n Spacer,\n Tooltip,\n} from 'boemly';\nimport Image from 'next/image';\nimport convertAreaM2ToHa from '../../../utils/convertAreaM2ToHa';\nimport convertCo2AmountKgToTons from '../../../utils/convertCo2AmountKgToTons';\nimport CreditsAvailableBadge from '../../../components/CreditsAvailableBadge';\nimport PortfolioProject from '../../../models/PortfolioProject';\nimport {\n FORMAT_AS_HECTARE_CONFIG,\n FORMAT_AS_PERCENT_CONFIG,\n} from '../../../constants/formatter';\nimport getTimeSpanInYears from '../../../utils/getTimeSpanInYears';\nimport { IntlContext } from '../../ContextProvider';\n\nexport interface ProjectInfoProps {\n project: PortfolioProject;\n subtitles: {\n areaSubtitle?: string;\n locationSubtitle?: string;\n startSubtitle?: string;\n timeSpanSubtitle?: string;\n projectTypeSubtitle?: string;\n projectDeveloperSubtitle?: string;\n verificationStandardSubtitle?: string;\n averageSellableAmountPerYearSubtitle?: string;\n riskBufferSubtitle?: string;\n buyCreditsSubtitle?: string;\n };\n}\n\nexport const ProjectInfo: React.FC<ProjectInfoProps> = ({\n project,\n subtitles,\n}: ProjectInfoProps) => {\n const { formatMessage, formatNumber, formatDate } = useContext(IntlContext);\n return (\n <Container p=\"2\" width=\"full\">\n <Heading size=\"xl\" textAlign=\"left\">\n {formatMessage({ id: 'features.projectInfo.projectInfo.value' })}\n </Heading>\n\n <Spacer height=\"8\" />\n\n <SimpleGrid\n columns={[1, null, null, 2]}\n gap=\"8\"\n spacingX=\"10\"\n spacingY=\"8\"\n >\n {project.area && (\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.area',\n })}\n text={formatNumber(\n convertAreaM2ToHa(project.area.toString()),\n FORMAT_AS_HECTARE_CONFIG\n )}\n caption={subtitles.areaSubtitle}\n />\n </Box>\n )}\n\n {project.location && (\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.location',\n })}\n text={project.location}\n caption={subtitles.locationSubtitle}\n />\n </Box>\n )}\n\n {project.start && (\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.start',\n })}\n text={formatDate(project.start, {\n year: 'numeric',\n month: 'long',\n })}\n caption={subtitles.startSubtitle}\n />\n </Box>\n )}\n\n {project.start && project.end && (\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.timeSpan',\n })}\n text={formatMessage(\n {\n id: 'features.projectInfo.properties.year',\n },\n {\n years: getTimeSpanInYears(\n new Date(project.start),\n new Date(project.end)\n ),\n }\n )}\n caption={subtitles.timeSpanSubtitle}\n />\n </Box>\n )}\n </SimpleGrid>\n\n {project.projectType ||\n project.projectDeveloper ||\n project.verificationStandard ? (\n <>\n <Spacer height=\"6\" />\n <Divider />\n <Spacer height=\"6\" />\n </>\n ) : (\n <></>\n )}\n <SimpleGrid columns={[1, null, null, 2]} spacingX=\"10\" spacingY=\"8\">\n {project.projectType && (\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.projectType',\n })}\n text={project.projectType.title}\n caption={subtitles.projectTypeSubtitle}\n />\n </Box>\n )}\n {project.projectDeveloper && (\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.projectDeveloper',\n })}\n text={project.projectDeveloper.name}\n caption={subtitles.projectDeveloperSubtitle}\n />\n </Box>\n )}\n </SimpleGrid>\n\n {project.verificationStandard ? (\n <>\n {project.projectType || project.projectDeveloper ? (\n <Spacer height=\"6\" />\n ) : (\n <></>\n )}\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.verificationStandard.label',\n })}\n text={formatMessage({\n id: `features.projectInfo.properties.verificationStandard.value.${project.verificationStandard.id}`,\n defaultMessage: project.verificationStandard.id,\n })}\n caption={subtitles.verificationStandardSubtitle}\n />\n </Box>\n\n {project.defaultIssuer && (\n <Box position=\"relative\" width=\"14\" height=\"8\">\n <Image\n src={project.defaultIssuer.logoUrl}\n alt={`${project.defaultIssuer.name} logo`}\n fill\n style={{ objectFit: 'contain' }}\n />\n </Box>\n )}\n </Flex>\n </>\n ) : (\n <></>\n )}\n\n {(project.averageSellableAmountPerYear &&\n project.averageSellableAmountPerYear > 0) ||\n project.riskBuffer ? (\n <>\n <Spacer height=\"8\" />\n <Divider />\n <Spacer height=\"8\" />\n </>\n ) : (\n <></>\n )}\n <SimpleGrid columns={[1, null, null, 2]} spacingX=\"10\" spacingY=\"8\">\n {project.averageSellableAmountPerYear > 0 ? (\n <Tooltip\n label={formatMessage({\n id: 'features.projectInfo.properties.projectVolume.toolTip',\n })}\n >\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.projectVolume.label',\n })}\n text={formatMessage(\n {\n id: 'unit.formatter.tonsCo2PerYear',\n },\n {\n number: formatNumber(\n convertCo2AmountKgToTons(\n project.averageSellableAmountPerYear.toString()\n ),\n { maximumFractionDigits: 0 }\n ),\n }\n )}\n caption={subtitles.averageSellableAmountPerYearSubtitle}\n />\n </Box>\n </Tooltip>\n ) : (\n <Box>\n <CreditsAvailableBadge status={project.creditAvailability} />\n </Box>\n )}\n\n {project.riskBuffer && (\n <Box>\n <LabelTextPair\n label={formatMessage({\n id: 'features.projectInfo.properties.riskBuffer',\n })}\n text={formatNumber(\n project.riskBuffer / 100,\n FORMAT_AS_PERCENT_CONFIG\n )}\n caption={subtitles.riskBufferSubtitle}\n />\n </Box>\n )}\n </SimpleGrid>\n\n {project.averageSellableAmountPerYear > 0 ? (\n <Box mt=\"2\">\n <CreditsAvailableBadge status={project.creditAvailability} />\n </Box>\n ) : (\n <></>\n )}\n </Container>\n );\n};\n","const convertCo2AmountKgToTons = (amount: string): number =>\n parseInt(amount, 10) / 1000;\n\nexport default convertCo2AmountKgToTons;\n","const getTimeSpanInYears = (start: Date, end: Date) => {\n const monthsDifference = end.getMonth() - start.getMonth();\n const yearsDifference = end.getFullYear() - start.getFullYear();\n\n if (monthsDifference > 4) {\n return yearsDifference + 1;\n }\n if (monthsDifference < -4) {\n return yearsDifference - 1;\n }\n return yearsDifference;\n};\n\nexport default getTimeSpanInYears;\n","const convertAreaM2ToHa = (areaInM2: string): number =>\n parseInt(areaInM2, 10) / 10000;\n\nexport default convertAreaM2ToHa;\n","import React, { useContext } from 'react';\nimport StrapiLink from '../../../models/strapi/StrapiLink';\nimport {\n Center,\n Container,\n Flex,\n Heading,\n IconButton,\n Spacer,\n Text,\n} from 'boemly';\nimport { DownloadSimple, FilePdf } from '@phosphor-icons/react';\nimport Link from 'next/link';\nimport { IntlContext } from '../../ContextProvider';\n\nexport interface DocumentsDownloadListProps {\n documentUrls: StrapiLink[];\n}\n\nexport const DocumentsDownloadList: React.FC<DocumentsDownloadListProps> = ({\n documentUrls,\n}: DocumentsDownloadListProps) => {\n const { formatMessage } = useContext(IntlContext);\n\n return (\n <Container p=\"2\">\n <Heading size=\"xl\" textAlign=\"left\">\n {formatMessage({\n id: 'features.portfolio.documentsDownloadList.projectDocuments',\n })}\n </Heading>\n\n <Flex flexDir=\"column\">\n {documentUrls.map((documentUrl) => (\n <Flex\n justifyContent=\"space-between\"\n alignItems=\"center\"\n mt=\"6\"\n key={documentUrl.text}\n >\n <Flex alignItems=\"center\">\n <Center\n w=\"8\"\n h=\"8\"\n borderRadius=\"full\"\n borderWidth=\"1px\"\n borderColor=\"grey.200\"\n >\n <FilePdf />\n </Center>\n\n <Spacer width=\"4\" />\n\n <Flex flexDir=\"column\">\n <Text size=\"smMonoNormal\">PDF</Text>\n <Text size=\"mdLowBold\" color=\"black\" textAlign=\"left\">\n {documentUrl.text}\n </Text>\n </Flex>\n </Flex>\n\n <Spacer width=\"32\" />\n\n <IconButton\n variant=\"outline\"\n aria-label={formatMessage({\n id: 'features.portfolio.documentsDownloadList.downloadDocument',\n })}\n icon={<DownloadSimple />}\n as={Link}\n href={documentUrl.url}\n size=\"sm\"\n />\n </Flex>\n ))}\n </Flex>\n </Container>\n );\n};\n","import React from 'react';\nimport StrapiImage from '../../../models/strapi/StrapiImage';\nimport StrapiLink from '../../../models/strapi/StrapiLink';\nimport strapiMediaUrl from '../../../utils/strapiMediaUrl';\nimport { Text, Heading, Flex, Box, Container } from 'boemly';\nimport Image from 'next/image';\nimport StrapiLinkButton from '../../../components/StrapiLinkButton';\n\nexport interface ContactProps {\n avatar?: StrapiImage;\n title?: string;\n text?: string;\n button?: StrapiLink;\n}\n\nexport const Contact: React.FC<ContactProps> = ({\n avatar,\n title,\n text,\n button,\n}: ContactProps) => (\n <Container backgroundColor=\"primary.100\" border=\"none\" p=\"8\" height=\"full\">\n <Flex\n flexDir=\"column\"\n justifyContent=\"center\"\n alignItems=\"center\"\n height=\"full\"\n >\n {avatar ? (\n <Box\n position=\"relative\"\n width=\"20\"\n height=\"20\"\n borderRadius=\"full\"\n overflow=\"hidden\"\n >\n <Image\n src={strapiMediaUrl(avatar.img, 'small')}\n alt={avatar.alt}\n fill\n objectFit={avatar.objectFit}\n />\n </Box>\n ) : (\n <></>\n )}\n {title ? (\n <Heading\n mt=\"6\"\n size=\"md\"\n fontWeight=\"500\"\n textAlign=\"center\"\n color=\"black\"\n >\n {title}\n </Heading>\n ) : (\n <></>\n )}\n {text ? (\n <Text mt=\"2\" size=\"smRegularNormal\" textAlign=\"center\">\n {text}\n </Text>\n ) : (\n <></>\n )}\n {button ? (\n <StrapiLinkButton\n mt=\"6\"\n link={button}\n size=\"md\"\n variant=\"outline\"\n component=\"Contact\"\n />\n ) : (\n <></>\n )}\n </Flex>\n </Container>\n);\n","import FPMProject from '../../models/fpm/FPMProject';\nimport fpmClient from '../fpmClient';\n\nconst getFpmProjectById = async (projectId: string): Promise<FPMProject> => {\n const fpmResponse = await fpmClient.get<FPMProject>(\n `/public/projects/${projectId}`\n );\n\n return fpmResponse.data;\n};\n\nexport default getFpmProjectById;\n","import React, { useEffect, useState } from 'react';\nimport { DefaultSectionContainer, Flex, Wrapper } from 'boemly';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport PortfolioProject from '../../models/PortfolioProject';\nimport SmallCheckout from '../../components/portfolio/SmallCheckout';\nimport ProjectInfo from '../../components/portfolio/ProjectInfo';\nimport DocumentsDownloadList from '../../components/portfolio/DocumentsDownloadList';\nimport Contact from '../../components/portfolio/Contact';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport getFpmProjectById from '../../integrations/strapi/getFpmProjectById';\n\nexport interface ProjectFactsProps {\n project?: PortfolioProject;\n slice: {\n projectId: string;\n\n batchId?: string;\n currency?: 'EUR' | 'CHF';\n pricePerKg?: number;\n taxInPercent?: number;\n initialContributionValue?: number;\n checkoutText?: string;\n\n customTitle?: string;\n customSubtitle?: string;\n customButton?: StrapiLink;\n documentUrls?: StrapiLink[];\n\n areaSubtitle?: string;\n locationSubtitle?: string;\n startSubtitle?: string;\n timeSpanSubtitle?: string;\n projectTypeSubtitle?: string;\n projectDeveloperSubtitle?: string;\n verificationStandardSubtitle?: string;\n averageSellableAmountPerYearSubtitle?: string;\n riskBufferSubtitle?: string;\n buyCreditsSubtitle?: string;\n\n contactTitle?: string;\n contactText?: string;\n contactButton?: StrapiLink;\n contactAvatar?: StrapiImage;\n };\n}\n\nexport const ProjectFacts: React.FC<ProjectFactsProps> = ({\n slice,\n project,\n}: ProjectFactsProps) => {\n const [enhancedProject, setEnhancedProject] = useState<\n PortfolioProject | undefined\n >(project);\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n const fetchCompleteProjectData = async () => {\n if (project && project.id) {\n setIsLoading(true);\n try {\n const completeFpmProject = await getFpmProjectById(project.id);\n\n // Merge the complete FPM data with existing project data (preserving Strapi fields like slug, portfolioHost, thumbnail)\n const mergedProject: PortfolioProject = {\n ...completeFpmProject,\n slug: project.slug,\n portfolioHost: project.portfolioHost,\n thumbnail: project.thumbnail,\n };\n\n setEnhancedProject(mergedProject);\n } catch (error) {\n console.error('Error fetching complete project data:', error);\n // Fallback to original project data if fetch fails\n setEnhancedProject(project);\n } finally {\n setIsLoading(false);\n }\n }\n };\n\n fetchCompleteProjectData();\n }, [project]);\n\n if (!enhancedProject) {\n return (\n <>Invalid configuration, check if a project this id exists in the FPM</>\n );\n }\n\n if (isLoading) {\n return (\n <DefaultSectionContainer>\n <Wrapper>\n <div>Loading project data...</div>\n </Wrapper>\n </DefaultSectionContainer>\n );\n }\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n <Flex flexDir={['column', null, null, 'row']} gap=\"4\" width=\"full\">\n <ProjectInfo project={enhancedProject} subtitles={slice} />\n <Flex flexDir=\"column\" gap=\"4\" width=\"full\">\n {slice.documentUrls && slice.documentUrls.length > 0 && (\n <DocumentsDownloadList documentUrls={slice.documentUrls} />\n )}\n {slice.batchId &&\n slice.pricePerKg &&\n slice.currency &&\n slice.initialContributionValue ? (\n <SmallCheckout\n batchId={slice.batchId}\n checkoutText={slice.checkoutText}\n currency={slice.currency}\n initialContributionValue={slice.initialContributionValue}\n pricePerKg={slice.pricePerKg}\n title={slice.customTitle}\n subtitle={slice.customSubtitle}\n button={slice.customButton}\n taxInPercent={slice.taxInPercent}\n />\n ) : (\n (slice.contactTitle ||\n slice.contactText ||\n slice.contactButton ||\n slice.contactAvatar) && (\n <Contact\n title={slice.contactTitle}\n text={slice.contactText}\n button={slice.contactButton}\n avatar={slice.contactAvatar}\n />\n )\n )}\n </Flex>\n </Flex>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import { Container, Center, Heading, Button, Box, Text, Flex } from 'boemly';\nimport React, { useContext } from 'react';\nimport { StrapiCustomerStory, strapiMediaUrl } from '../..';\nimport Image from 'next/image';\nimport { IntlContext } from '../../components/ContextProvider';\nimport Link from 'next/link';\n\nexport interface CustomerCardProps {\n customerStory: StrapiCustomerStory;\n}\nexport const CustomerCard = ({\n customerStory,\n}: CustomerCardProps): JSX.Element => {\n const { formatMessage } = useContext(IntlContext);\n\n return (\n <Container padding=\"none\" height=\"full\">\n <Flex flexDir=\"column\" height=\"full\">\n <Center height=\"24\" backgroundColor=\"primary.50\" borderTopRadius=\"xl\">\n {customerStory.cardImage && (\n <Box position=\"relative\" height=\"12\" width=\"12\">\n <Image\n src={strapiMediaUrl(customerStory.cardImage.img, 'medium')}\n alt={customerStory.cardImage.alt}\n fill\n style={{\n objectFit: customerStory.cardImage.objectFit,\n }}\n />\n </Box>\n )}\n </Center>\n <Box px=\"6\" pt=\"8\" pb=\"6\" mb=\"auto\">\n {customerStory.customerCardCustomerIndustry && (\n <Text size=\"xsMonoUppercase\" color=\"gray.500\" mb=\"2\">\n {customerStory.customerCardCustomerIndustry}\n </Text>\n )}\n {customerStory.title && (\n <Heading size=\"md\" fontWeight=\"500\">\n {customerStory.title}\n </Heading>\n )}\n </Box>\n <Box px=\"6\" pt=\"8\" pb=\"6\">\n <Button\n as={Link}\n href={`/customer-stories/${customerStory.slug}`}\n variant=\"outline\"\n size=\"sm\"\n >\n {formatMessage({ id: 'sections.customerCard.more' })}\n </Button>\n </Box>\n </Flex>\n </Container>\n );\n};\n","import { Container, Heading, Button, Box, Text } from 'boemly';\nimport React, { useContext } from 'react';\nimport { StrapiCustomerStory, strapiMediaUrl } from '../..';\nimport Image from 'next/image';\nimport { IntlContext } from '../../components/ContextProvider';\nimport Link from 'next/link';\n\nexport interface CustomerQuoteCardProps {\n customerStory: StrapiCustomerStory;\n}\n\nexport const CustomerQuoteCard = ({\n customerStory,\n}: CustomerQuoteCardProps): JSX.Element => {\n const { formatMessage } = useContext(IntlContext);\n\n return (\n <Container p=\"1\" backgroundColor=\"primary.100\" height=\"full\">\n {customerStory.cardImage ? (\n <Box\n position=\"relative\"\n height=\"12\"\n width=\"12\"\n borderRadius=\"full\"\n overflow=\"hidden\"\n >\n <Image\n src={strapiMediaUrl(customerStory.cardImage.img, 'medium')}\n alt={customerStory.cardImage.alt}\n fill\n style={{\n objectFit: customerStory.cardImage.objectFit,\n }}\n />\n </Box>\n ) : (\n <></>\n )}\n <Box>\n <Box my=\"8\">\n <Heading size=\"md\" fontWeight=\"500\">\n {customerStory.customerName}\n </Heading>\n <Text size=\"xs\">{customerStory.quoteCardCustomerTitle}</Text>\n </Box>\n <Text size=\"xs\" color=\"black\">\n {customerStory.quoteCardQuote}\n </Text>\n <Button\n href={`/customer-stories/${customerStory.slug}`}\n as={Link}\n variant=\"outline\"\n size=\"sm\"\n mt=\"8\"\n >\n {formatMessage({ id: 'sections.customerQuoteCard.more' })}\n </Button>\n </Box>\n </Container>\n );\n};\n","import { Box, Container, Flex } from 'boemly';\nimport { StrapiCustomerStory, strapiMediaUrl } from '../..';\nimport Image from 'next/image';\nimport React from 'react';\nimport Link from 'next/link';\n\nexport interface LogoCardProps {\n customerStory: StrapiCustomerStory;\n}\nexport const LogoCard = ({ customerStory }: LogoCardProps) => {\n if (customerStory.cardImage) {\n return (\n <Container height=\"full\" backgroundColor=\"primary.50\">\n <Flex justifyContent=\"center\" height=\"full\" padding=\"4\">\n <Box position=\"relative\" height=\"12\" width=\"36\" marginY=\"auto\">\n <Link href={`/customer-stories/${customerStory.slug}`}>\n <Image\n src={strapiMediaUrl(customerStory.cardImage.img, 'medium')}\n alt={customerStory.cardImage.alt}\n fill\n style={{\n objectFit: customerStory.cardImage.objectFit,\n }}\n />\n </Link>\n </Box>\n </Flex>\n </Container>\n );\n }\n return <></>;\n};\n","import React from 'react';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport StrapiCustomerStory from '../../models/strapi/StrapiCustomerStory';\nimport { Box, DefaultSectionContainer, SimpleGrid, Wrapper } from 'boemly';\nimport CustomerCard from '../../components/CustomerCard';\nimport CustomerQuoteCard from '../../components/CustomerQuoteCard';\nimport LogoCard from '../../components/LogoCard';\n\nexport interface CustomerStoriesProps {\n slice: {\n customer_stories: IStrapiData<StrapiCustomerStory>[];\n };\n customerStories: IStrapiData<StrapiCustomerStory>[];\n}\n\nexport const CustomerStories = ({\n slice,\n customerStories,\n}: CustomerStoriesProps): JSX.Element => {\n return (\n <DefaultSectionContainer>\n <Wrapper>\n <SimpleGrid columns={[1, null, null, 2, 3]} spacingX={6} spacingY={6}>\n {slice.customer_stories.map(({ attributes }) => {\n const customerStory: IStrapiData<StrapiCustomerStory> | undefined =\n customerStories.find(\n (cs) => cs.attributes.slug === attributes.slug\n );\n if (!customerStory) {\n return null;\n }\n return (\n <Box key={customerStory.id}>\n {attributes.variant === 'customerCard' && (\n <CustomerCard customerStory={customerStory.attributes} />\n )}\n {attributes.variant === 'quoteCard' && (\n <CustomerQuoteCard customerStory={customerStory.attributes} />\n )}\n {attributes.variant === 'logoCard' && (\n <LogoCard customerStory={customerStory.attributes} />\n )}\n </Box>\n );\n })}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","import React from 'react';\nimport { Check, X } from '@phosphor-icons/react';\nimport { Box } from 'boemly';\n\nexport interface IconProps {\n variant: 'gray' | 'green' | 'white';\n icon: string;\n}\n\nconst BULLET_POINT_VARIANTS = {\n gray: { bulletPointColor: 'black' },\n green: { bulletPointColor: 'white' },\n white: { bulletPointColor: 'black' },\n};\n\nexport const Icon = ({ variant, icon }: IconProps): JSX.Element => {\n switch (icon) {\n case 'check':\n return <Check size={20} color=\"var(--boemly-colors-primary-500)\" />;\n case 'cross':\n return <X size={20} color=\"var(--boemly-colors-red-500)\" />;\n default:\n return (\n <Box\n data-testid=\"bullet-point-box\"\n borderRadius=\"full\"\n backgroundColor={BULLET_POINT_VARIANTS[variant].bulletPointColor}\n width=\"2\"\n height=\"2\"\n margin=\"1.5\"\n />\n );\n }\n};\nexport default Icon;\n","import React, { useContext } from 'react';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport {\n Container,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Wrapper,\n Text,\n Flex,\n Box,\n Spacer,\n Divider,\n Heading,\n Badge,\n SimpleGrid,\n} from 'boemly';\nimport Image from 'next/image';\nimport { CaretRight } from '@phosphor-icons/react';\nimport { Icon } from './Icon';\nimport { CDN_URI } from '../../constants/api';\nimport { IntlContext } from '../../components/ContextProvider';\n\nexport interface ComparisonProps {\n slice: {\n title?: string;\n subTitle?: string;\n tagline?: string;\n\n comparisonCards: ComparisonCard[];\n };\n}\n\nexport interface ComparisonCard {\n id: number;\n title: string;\n subTitle: string;\n badge?: string;\n variant: 'gray' | 'green' | 'white';\n image?: StrapiImage;\n button?: StrapiLink;\n factTitle?: string;\n factSubtitle?: string;\n lists: {\n id: string;\n title: string;\n items: { id: string; text: string; icon: 'bullet' | 'check' | 'cross' }[];\n }[];\n}\n\nconst VARIANTS = {\n gray: {\n backgroundColor: 'primary.50',\n textColor: 'black',\n subTitleColor: 'gray.500',\n factColor: 'primary.800',\n dividerColor: 'gray.200',\n },\n green: {\n backgroundColor: 'primary.800',\n textColor: 'white',\n subTitleColor: 'whiteAlpha.900',\n factColor: 'white',\n dividerColor: 'whiteAlpha.200',\n },\n white: {\n backgroundColor: 'white',\n textColor: 'black',\n subTitleColor: 'gray.500',\n factColor: 'primary.800',\n dividerColor: 'gray.200',\n },\n};\n\nexport const Comparison: React.FC<ComparisonProps> = ({\n slice,\n}: ComparisonProps) => {\n const { formatMessage } = useContext(IntlContext);\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n {slice.title ? (\n <>\n <Flex alignItems=\"center\" flexDirection=\"column\">\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.subTitle}\n textProps={{ maxW: '2xl', textAlign: 'center' }}\n titleProps={{\n textAlign: 'center',\n maxWidth: '3xl',\n }}\n taglineProps={{ textAlign: 'center', maxWidth: '3xl' }}\n />\n </Flex>\n <Spacer height=\"12\" />\n </>\n ) : (\n <></>\n )}\n <SimpleGrid\n columns={[1, null, null, null, slice.comparisonCards.length]}\n spacing=\"4\"\n >\n {slice.comparisonCards.map((comparisonCard) => (\n <Container\n boxShadow={comparisonCard.variant === 'green' ? 'xl' : 'base'}\n border={\n comparisonCard.variant === 'green' ? 'primary.800' : undefined\n }\n zIndex=\"base\"\n key={comparisonCard.id}\n position=\"relative\"\n elevation=\"none\"\n p=\"3\"\n backgroundColor={VARIANTS[comparisonCard.variant].backgroundColor}\n >\n {comparisonCard.variant === 'green' ? (\n <Box\n position=\"absolute\"\n left=\"0\"\n top=\"0\"\n width=\"full\"\n height=\"full\"\n zIndex=\"-1\"\n >\n <Image\n src={`${CDN_URI}/assets/v3/strapi-slices/shapes-comparison.svg`}\n alt={formatMessage({\n id: 'sections.comparison.backgroundShapes',\n })}\n fill\n style={{\n objectFit: 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n ) : (\n <></>\n )}\n <Flex flexDir=\"column\" gap=\"4\">\n {comparisonCard.image && (\n <Box position=\"relative\" height=\"7\" width=\"100%\">\n <Image\n src={strapiMediaUrl(comparisonCard.image.img, 'small')}\n alt={comparisonCard.image.alt}\n fill\n style={{\n objectFit: comparisonCard.image.objectFit,\n }}\n />\n </Box>\n )}\n <Flex gap=\"2\" alignItems=\"center\" flexWrap=\"wrap\">\n <Heading\n size=\"xl\"\n color={VARIANTS[comparisonCard.variant].textColor}\n whiteSpace=\"pre-line\"\n >\n {comparisonCard.title}\n </Heading>\n {comparisonCard.badge && (\n <Badge\n backgroundColor=\"green.100\"\n borderRadius=\"md\"\n whiteSpace=\"pre-line\"\n >\n {comparisonCard.badge}\n </Badge>\n )}\n </Flex>\n </Flex>\n <Spacer height=\"4\" />\n <Text\n size=\"smRegularNormal\"\n color={VARIANTS[comparisonCard.variant].subTitleColor}\n >\n {comparisonCard.subTitle}\n </Text>\n\n {comparisonCard.factTitle ||\n comparisonCard.factSubtitle ||\n comparisonCard.button ? (\n <>\n <Spacer height=\"6\" />\n <Flex flexDir=\"column\">\n {comparisonCard.factTitle && (\n <>\n <Text\n color={VARIANTS[comparisonCard.variant].factColor}\n size=\"lgMonoNormal\"\n >\n {comparisonCard.factTitle}\n </Text>\n <Text\n color={VARIANTS[comparisonCard.variant].factColor}\n size=\"smLowNormal\"\n >\n {comparisonCard.factSubtitle}\n </Text>\n </>\n )}\n {comparisonCard.button && (\n <StrapiLinkButton\n mt=\"6\"\n link={comparisonCard.button}\n size=\"md\"\n variant=\"outline\"\n rightIcon={<CaretRight size={16} weight=\"bold\" />}\n component=\"Comparison\"\n />\n )}\n </Flex>\n </>\n ) : (\n <></>\n )}\n <>\n {comparisonCard.lists.map((list) => (\n <Box key={list.id}>\n <Divider\n my=\"8\"\n color={VARIANTS[comparisonCard.variant].dividerColor}\n />\n <Text\n size=\"smLowBold\"\n color={VARIANTS[comparisonCard.variant].textColor}\n >\n {list.title}\n </Text>\n <>\n {list.items.map((item) => (\n <Box key={item.id}>\n <Spacer height=\"4\" />\n <Flex gap=\"4\" alignItems=\"center\">\n <Box>\n <Icon\n variant={comparisonCard.variant}\n icon={item.icon}\n />\n </Box>\n <Text\n size=\"smLowNormal\"\n color={VARIANTS[comparisonCard.variant].textColor}\n >\n {item.text}\n </Text>\n </Flex>\n </Box>\n ))}\n </>\n </Box>\n ))}\n </>\n </Container>\n ))}\n </SimpleGrid>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\nexport default Comparison;\n","import { motion } from 'framer-motion';\nimport styled from '@emotion/styled';\nimport { BREAKPOINT_MD } from '../../constants/breakpoints';\n\ninterface CarouselInnerContainerProps {\n logoCount: number;\n}\n\nexport const CarouselInnerContainer = styled(\n motion.div\n)<CarouselInnerContainerProps>`\n display: flex;\n justify-content: ${(props) =>\n props.logoCount < 5 ? 'center' : 'flex-start'};\n gap: var(--boemly-space-24);\n padding-right: var(--boemly-space-24);\n padding-left: var(--boemly-space-24);\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n width: calc(\n ${(props) => props.logoCount} *\n (var(--boemly-sizes-16) + var(--boemly-space-6))\n );\n justify-content: ${(props) =>\n props.logoCount < 5 ? 'center' : 'flex-start'};\n }\n`;\n\nexport const LogoGrid = styled(motion.div)`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: var(--boemly-space-24);\n\n @media screen and (max-width: ${BREAKPOINT_MD}) {\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-gap: var(--boemly-space-6);\n }\n`;\n","import React, { useEffect, useState } from 'react';\nimport {\n DefaultSectionContainer,\n Flex,\n Heading,\n Spacer,\n Box,\n useMediaQuery,\n useToken,\n} from 'boemly';\nimport Image from 'next/image';\nimport useEmblaCarousel from 'embla-carousel-react';\nimport { useWindowSize } from 'react-use';\n\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport AutoScroll from 'embla-carousel-auto-scroll';\nimport { BREAKPOINT_MD_QUERY } from '../../constants/breakpoints';\nimport { getClosestRatio } from '../../utils/getClosestRatio';\nimport { CarouselInnerContainer, LogoGrid } from './styles';\n\nexport interface CarouselMarqueeBannerProps {\n slice: {\n title?: string;\n logos: StrapiImage[];\n };\n}\n\n// Separate component containing the actual logic\nconst CarouselMarqueeBannerContent: React.FC<CarouselMarqueeBannerProps> = ({\n slice,\n}) => {\n const [primary50] = useToken('colors', ['primary.50']);\n const { width: windowWidth } = useWindowSize();\n const hasEnoughLogosForLoop = slice.logos.length >= 5;\n const LOOP_ARRAY_LENGTH = windowWidth > 2000 ? 5 : 4;\n\n // Duplicate Logos to create a full loop\n const logosToRender = hasEnoughLogosForLoop\n ? Array.from({ length: LOOP_ARRAY_LENGTH }, () => slice.logos).flat()\n : slice.logos;\n\n const [isMobile] = useMediaQuery(BREAKPOINT_MD_QUERY);\n\n // Carousel setup\n const [emblaRef] = useEmblaCarousel(\n {\n loop: hasEnoughLogosForLoop,\n align: 'start',\n containScroll: 'trimSnaps',\n dragFree: true,\n },\n hasEnoughLogosForLoop\n ? [\n AutoScroll({\n playOnInit: true,\n speed: isMobile ? 0.5 : 1,\n stopOnInteraction: false,\n stopOnMouseEnter: false,\n stopOnFocusIn: false,\n }),\n ]\n : []\n );\n\n const renderLogos = (): React.ReactNode => {\n if (!hasEnoughLogosForLoop) {\n return (\n <LogoGrid>\n {slice.logos.map((logo, index) => (\n <Box\n key={`${logo.id}-${index}`}\n flexShrink={0}\n transform=\"translate3d(0, 0, 0)\"\n >\n <Flex\n height=\"full\"\n width=\"full\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <Box\n position=\"relative\"\n height={isMobile ? '16' : '36'}\n width={`calc(var(--boemly-sizes-10)\n * ${getClosestRatio(\n logo.img.data.attributes.width,\n logo.img.data.attributes.height\n )})`}\n >\n <Image\n src={strapiMediaUrl(logo.img, 'large')}\n alt={logo.alt}\n fill\n style={{\n objectFit: logo.objectFit || 'contain',\n filter: 'grayscale(100%)',\n }}\n />\n </Box>\n </Flex>\n </Box>\n ))}\n </LogoGrid>\n );\n }\n\n return (\n <Box width=\"full\" overflow=\"hidden\" ref={emblaRef} cursor=\"pointer\">\n <CarouselInnerContainer logoCount={slice.logos.length}>\n {logosToRender.map((logo, index) => (\n <Box\n key={`${logo.id}-${index}`}\n flexShrink={0}\n transform=\"translate3d(0, 0, 0)\"\n >\n <Flex\n height=\"full\"\n width=\"full\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <Box\n position=\"relative\"\n height={isMobile ? '16' : '36'}\n width={`calc(var(--boemly-sizes-10) * ${getClosestRatio(\n logo.img.data.attributes.width,\n logo.img.data.attributes.height\n )})`}\n >\n <Image\n src={strapiMediaUrl(logo.img, 'large')}\n alt={logo.alt}\n fill\n style={{\n objectFit: logo.objectFit || 'contain',\n filter: 'grayscale(100%)',\n }}\n />\n </Box>\n </Flex>\n </Box>\n ))}\n </CarouselInnerContainer>\n </Box>\n );\n };\n\n return (\n <DefaultSectionContainer backgroundColor={primary50}>\n <>\n {slice.title ? (\n <>\n <Flex alignItems=\"center\" flexDirection=\"column\">\n <Heading size=\"md\" fontWeight=\"500\">\n {slice.title}\n </Heading>\n </Flex>\n <Spacer height=\"12\" minHeight=\"12\" />\n </>\n ) : null}\n\n {renderLogos()}\n </>\n </DefaultSectionContainer>\n );\n};\n\n// Lazy-rendering the child component after client-side hydration\nexport const CarouselMarqueeBanner: React.FC<CarouselMarqueeBannerProps> = ({\n slice,\n}: CarouselMarqueeBannerProps) => {\n const [showChild, setShowChild] = useState(false);\n\n useEffect(() => {\n setShowChild(true); // Hydrate the component after the client-side is ready\n }, []);\n\n if (!showChild) {\n return <div />;\n }\n\n return <CarouselMarqueeBannerContent slice={slice} />;\n};\n\nexport default CarouselMarqueeBanner;\n","import React, { useContext } from 'react';\nimport {\n Button,\n Box,\n Container,\n DefaultSectionContainer,\n DefaultSectionHeader,\n Flex,\n Heading,\n RichText,\n SimpleGrid,\n Spacer,\n Tag,\n Text,\n Wrapper,\n useMediaQuery,\n} from 'boemly';\nimport Image from 'next/image';\nimport StrapiImage from '../../models/strapi/StrapiImage';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport StrapiLink from '../../models/strapi/StrapiLink';\nimport StrapiLinkButton from '../../components/StrapiLinkButton';\nimport { CDN_URI } from '../../constants/api';\nimport { IntlContext } from 'react-intl';\nimport { BREAKPOINT_MD_QUERY } from '../../constants/breakpoints';\nimport { useState } from 'react';\nimport FullScreenImage from '../../components/FullScreenImage';\n\nexport interface TimelineProps {\n slice: {\n title: string;\n text?: string;\n tagline?: string;\n\n timelineItems: TimelineItem[];\n };\n}\n\nexport interface TimelineItem {\n id: number;\n tagline?: string;\n title: string;\n text?: string;\n badge?: { text: string; variant: 'orange' | 'green' | 'red' | 'gray' };\n logo?: StrapiImage;\n icon?: StrapiImage;\n image?: StrapiImage;\n button?: StrapiLink;\n backgroundShapes?: boolean;\n}\n\nexport const Timeline: React.FC<TimelineProps> = ({ slice }: TimelineProps) => {\n const { formatMessage } = useContext(IntlContext);\n const [visibleItems, setVisibleItems] = useState(3);\n const [mobile] = useMediaQuery(BREAKPOINT_MD_QUERY);\n const [isOpen, setIsOpen] = useState(false);\n\n const showMoreItems = () => {\n setVisibleItems((prevVisibleItems) => prevVisibleItems + 3);\n };\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n <Flex flexDir={['column', null, null, 'row']}>\n <Box\n width={['full', null, null, '50%']}\n position={[null, null, null, 'sticky']}\n top={['16', null, null, '32']}\n height=\"full\"\n paddingRight={[null, null, null, '28']}\n >\n <DefaultSectionHeader\n tagline={slice.tagline}\n title={slice.title}\n text={slice.text}\n />\n {mobile && (\n <>\n <Spacer h=\"10\" />\n <Flex justifyContent=\"center\">\n <Box\n borderRadius=\"full\"\n width=\"3\"\n height=\"3\"\n margin=\"1.5\"\n backgroundColor=\"gray\"\n />\n </Flex>\n <Box\n overflow=\"visible\"\n borderRight=\"dashed 1px var(--boemly-colors-gray-200)\"\n transform=\"translateX(-50%)\"\n position=\"relative\"\n height=\"20\"\n />\n </>\n )}\n </Box>\n <Box\n overflow=\"visible\"\n maxWidth={['full', null, null, '50%']}\n borderLeft={[\n null,\n null,\n null,\n 'dashed 1px var(--boemly-colors-gray-200)',\n ]}\n position=\"relative\"\n width=\"full\"\n >\n <Flex\n flexDir=\"column\"\n overflow=\"visible\"\n gap={[null, null, null, '8']}\n >\n {slice.timelineItems.slice(0, visibleItems).map((item, index) => (\n <SimpleGrid\n gap={['none', null, null, '4']}\n key={item.id}\n columns={[1, null, null, 2]}\n alignContent=\"center\"\n gridTemplateColumns={[null, null, null, '1fr 16fr']}\n position=\"relative\"\n >\n <Flex\n alignItems=\"center\"\n justifyContent={['center', null, null, 'flex-start']}\n >\n <Box\n position=\"absolute\"\n transform={[null, null, null, 'translateX(-50%)']}\n backgroundColor=\"white\"\n >\n {item.icon ? (\n <Box padding=\"2\">\n <Image\n src={strapiMediaUrl(item.icon.img, 'xSmall')}\n alt={item.icon.alt}\n width=\"21\"\n height=\"21\"\n />\n </Box>\n ) : (\n <Box padding=\"2\">\n <Box\n borderRadius=\"full\"\n backgroundColor=\"primary.800\"\n width=\"2\"\n height=\"2\"\n />\n </Box>\n )}\n {mobile && (\n <Box\n overflow=\"visible\"\n borderRight=\"dashed 1px var(--boemly-colors-gray-200)\"\n transform=\"translateX(-50%)\"\n position=\"relative\"\n height=\"10\"\n />\n )}\n </Box>\n </Flex>\n <Container\n p={[null, null, null, '3']}\n zIndex=\"base\"\n position=\"relative\"\n elevation=\"none\"\n >\n {item.backgroundShapes ? (\n <Box\n position=\"absolute\"\n left=\"0\"\n top=\"0\"\n width=\"full\"\n height=\"full\"\n zIndex=\"-1\"\n >\n <Image\n src={`${CDN_URI}/assets/v3/strapi-slices/timeline-shapes.svg`}\n alt={formatMessage({\n id: 'sections.timeline.backgroundShapes',\n })}\n fill\n style={{\n objectFit: 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n />\n </Box>\n ) : (\n <></>\n )}\n\n <Flex flexDir=\"column\">\n <Flex\n alignItems=\"flex-start\"\n justifyContent=\"space-between\"\n >\n <Box>\n {item.tagline && (\n <>\n <Text color=\"primary.800\" size=\"smMonoUppercase\">\n {item.tagline}\n </Text>\n <Spacer h=\"2\" />\n </>\n )}\n </Box>\n <Flex>\n {item.badge && (\n <Tag\n colorScheme={item.badge.variant}\n borderRadius=\"md\"\n >\n {item.badge.text}\n </Tag>\n )}\n {item.logo && (\n <Box position=\"relative\" height=\"8\" width=\"16\">\n <Image\n src={strapiMediaUrl(item.logo.img, 'small')}\n alt={item.logo.alt}\n fill\n style={{\n objectFit: item.logo.objectFit,\n }}\n />\n </Box>\n )}\n </Flex>\n </Flex>\n <Heading\n size=\"lg\"\n mt={['6', null, null, '3']}\n maxWidth=\"xs\"\n >\n {item.title}\n </Heading>\n {item.text && (\n <Box mt=\"3\">\n <RichText content={item.text} />\n </Box>\n )}\n {item.button && (\n <Box textAlign=\"left\">\n <Spacer h=\"4\" />\n <StrapiLinkButton\n link={item.button}\n size=\"sm\"\n variant=\"outline\"\n component=\"Timeline\"\n />\n </Box>\n )}\n {item.image ? (\n <>\n <Box\n position=\"relative\"\n mt=\"4\"\n height={['2xs', null, null, null, '48']}\n minWidth={[null, null, null, null, '50%']}\n >\n <Image\n src={strapiMediaUrl(item.image.img, 'xLarge')}\n alt={item.image.alt}\n fill\n style={{\n cursor: mobile ? 'unset' : 'pointer',\n objectFit: item.image.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-xl)',\n }}\n onClick={() => !mobile && setIsOpen(true)}\n />\n <FullScreenImage\n images={[item.image]}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n />\n </Box>\n </>\n ) : (\n <></>\n )}\n </Flex>\n </Container>\n {mobile && index + 1 < slice.timelineItems.length && (\n <Box\n overflow=\"visible\"\n borderRight=\"dashed 1px var(--boemly-colors-gray-200)\"\n transform=\"translateX(-50%)\"\n position=\"relative\"\n height=\"20\"\n />\n )}\n </SimpleGrid>\n ))}\n </Flex>\n {visibleItems < slice.timelineItems.length && (\n <>\n <Box\n width=\"full\"\n height={['36', null, null, '64']}\n position=\"absolute\"\n bottom=\"0\"\n zIndex=\"1\"\n background=\"linear-gradient(180deg, rgba(255, 255, 255, 0.00) 0%, rgba(255, 255, 255, 0.98) 76.54%, #FFF 100%)\"\n />\n <Box\n bottom=\"0\"\n textAlign=\"center\"\n zIndex=\"overlay\"\n position=\"relative\"\n >\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={showMoreItems}\n m={[null, null, null, '8']}\n >\n {formatMessage({ id: 'sections.timeline.showMoreButton' })}\n </Button>\n </Box>\n </>\n )}\n </Box>\n </Flex>\n </Wrapper>\n </DefaultSectionContainer>\n );\n};\n","const isSameDate = (date1: Date, date2: Date): boolean => {\n return (\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n};\n\nexport default isSameDate;\n","import {\n DefaultSectionContainer,\n Wrapper,\n Spacer,\n DefaultSectionHeader,\n SimpleGrid,\n Box,\n Button,\n Flex,\n Center,\n Text,\n BoemlyTag,\n Select,\n} from 'boemly';\n\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport EventCard from '../../components/EventCard';\nimport { SWRInfiniteKeyLoader } from 'swr/infinite';\nimport useEvents from '../../models/hooks/useEvents';\nimport {\n STRAPI_DEFAULT_POPULATE_DEPTH,\n STRAPI_URI,\n} from '../../constants/strapi';\nimport { IntlContext } from '../../components/ContextProvider';\nimport { mutate } from 'swr/_internal';\nimport { EventType } from '@testing-library/react';\nimport StrapiEvent from '../../models/strapi/StrapiEvent';\nimport IStrapiData from '../../models/strapi/IStrapiData';\n\nconst UPCOMING_BATCH_SIZE = 6;\nconst PAST_BATCH_SIZE = 2;\n\ninterface FiltersProps {\n eventTypes: EventType[];\n languages: {\n id: number;\n language: string;\n countryCode: string;\n }[];\n}\n\nexport interface EventsProps {\n slice: {\n upcomingTitle?: string;\n upcomingDescription?: string;\n pastTitle: string;\n pastDescription?: string;\n filterSearch?: boolean;\n };\n}\n\nconst enum Sort {\n NEWEST_FIRST = 'newest',\n OLDEST_FIRST = 'oldest',\n}\n\ninterface EventOption {\n value: string;\n label: string;\n}\n\nexport const Events: React.FC<EventsProps> = ({ slice }: EventsProps) => {\n const { formatMessage, locale } = useContext(IntlContext);\n const [eventTypeFilter, setEventTypeFilter] = useState([] as string[]);\n const [languageFilter, setLanguageFilter] = useState([] as string[]);\n const [sort, setSort] = useState([Sort.NEWEST_FIRST] as string[]);\n\n const [allEventTypeOptions, setAllEventTypeOptions] = useState<EventOption[]>(\n []\n );\n const [allLanguageOptions, setAllLanguageOptions] = useState<EventOption[]>(\n []\n );\n\n const now = new Date().toISOString();\n\n const buildEventsUrl = (\n index: any,\n batchSize: number,\n startFilter: string\n ) => {\n const url = new URL(`/treely-events`, STRAPI_URI);\n url.searchParams.append(\n 'pagination[start]',\n (index * batchSize).toString()\n );\n url.searchParams.append('pagination[limit]', batchSize.toString());\n url.searchParams.append(startFilter, now);\n url.searchParams.append('locale', locale);\n url.searchParams.append('pLevel', STRAPI_DEFAULT_POPULATE_DEPTH);\n\n if (sort[0] === Sort.OLDEST_FIRST) {\n url.searchParams.append('sort', 'start:asc');\n } else {\n url.searchParams.append('sort', 'start:desc');\n }\n\n if (eventTypeFilter.length) {\n eventTypeFilter.forEach((filter, i) => {\n url.searchParams.append(\n `filters[$or][${i}][eventTypes][eventType]`,\n filter\n );\n });\n }\n\n if (languageFilter.length) {\n languageFilter.forEach((filter, i) => {\n url.searchParams.append(\n `filters[$or][${eventTypeFilter.length + i}][languages][language]`,\n filter\n );\n });\n }\n return `/treely-events` + url.search;\n };\n\n const getUpcomingKey: SWRInfiniteKeyLoader = useCallback(\n (index) =>\n buildEventsUrl(index, UPCOMING_BATCH_SIZE, 'filters[start][$gte]'),\n [eventTypeFilter, languageFilter, sort]\n );\n\n const getPastKey: SWRInfiniteKeyLoader = useCallback(\n (index) => buildEventsUrl(index, PAST_BATCH_SIZE, 'filters[start][$lt]'),\n [eventTypeFilter, languageFilter, sort]\n );\n\n const {\n data: upcomingData,\n isLoading: isLoadingUpcoming,\n isLoadingMore: isLoadingMoreUpcoming,\n canLoadMore: canLoadMoreUpcoming,\n loadMore: loadMoreUpcoming,\n } = useEvents({ getKey: getUpcomingKey, batchSize: UPCOMING_BATCH_SIZE });\n\n const {\n data: pastData,\n isLoading: isLoadingPast,\n isLoadingMore: isLoadingMorePast,\n canLoadMore: canLoadMorePast,\n loadMore: loadMorePast,\n } = useEvents({ getKey: getPastKey, batchSize: PAST_BATCH_SIZE });\n\n const processEvents = (data: any) => {\n return (\n data?.flatMap((d: any) => d?.body?.data)?.filter((t: any) => !!t) || []\n );\n };\n\n // Process upcoming events\n const upcomingEvents = useMemo(() => {\n return processEvents(upcomingData);\n }, [upcomingData]);\n\n // Process past events\n const pastEvents = useMemo(() => {\n return processEvents(pastData);\n }, [pastData]);\n\n // Function to fetch all possible options\n const fetchAllOptions = useCallback(async () => {\n const url = new URL(`/treely-events`, STRAPI_URI);\n url.searchParams.append('locale', locale);\n url.searchParams.append('pLevel', STRAPI_DEFAULT_POPULATE_DEPTH);\n\n const response = await fetch(\n `${STRAPI_URI}/api/treely-events${url.search}`,\n {\n headers: {\n 'Strapi-Response-Format': 'v4',\n },\n }\n );\n const data = await response.json();\n\n const events = data?.data || [];\n\n // Extract all event types\n const allEventTypes = new Set<string>();\n events.forEach((event: any) => {\n if (event?.attributes?.eventTypes) {\n event.attributes.eventTypes.forEach((item: any) => {\n allEventTypes.add(item.eventType);\n });\n }\n });\n\n // Extract all languages\n const allLanguages = new Set<string>();\n events.forEach((event: any) => {\n if (event?.attributes?.languages) {\n event.attributes.languages.forEach((item: any) => {\n allLanguages.add(item.language);\n });\n }\n });\n\n // Update state with all options\n setAllEventTypeOptions(\n Array.from(allEventTypes).map((value) => ({ value, label: value }))\n );\n\n setAllLanguageOptions(\n Array.from(allLanguages).map((value) => ({ value, label: value }))\n );\n }, [locale]);\n\n // Fetch all options when component mounts\n useEffect(() => {\n fetchAllOptions();\n }, [fetchAllOptions]);\n\n const removeFilter = (\n filterType: keyof FiltersProps,\n valueToRemove: string\n ) => {\n if (filterType === 'eventTypes') {\n setEventTypeFilter((prev) =>\n prev.filter((item) => item !== valueToRemove)\n );\n } else if (filterType === 'languages') {\n setLanguageFilter((prev) =>\n prev.filter((item) => item !== valueToRemove)\n );\n }\n };\n\n useEffect(() => {\n mutate(getUpcomingKey);\n }, [eventTypeFilter, languageFilter, sort]);\n\n return (\n <DefaultSectionContainer>\n <Wrapper>\n {slice.upcomingTitle ? (\n <>\n <DefaultSectionHeader\n title={slice.upcomingTitle}\n text={slice.upcomingDescription}\n titleProps={{ maxW: '3xl' }}\n textProps={{ maxW: '3xl' }}\n />\n <Spacer h=\"10\" />\n </>\n ) : (\n <></>\n )}\n {slice.filterSearch && (upcomingEvents || pastEvents) ? (\n <>\n <Flex\n justifyContent=\"space-between\"\n direction={['column-reverse', null, null, 'row']}\n alignItems=\"baseline\"\n gap=\"4\"\n >\n <Flex\n direction=\"column\"\n width=\"full\"\n justifyContent=\"start\"\n gap=\"4\"\n >\n {/* Filter section */}\n <Flex\n direction={['column', null, null, 'row']}\n gap=\"4\"\n justifyContent=\"start\"\n >\n <Box position=\"relative\" width={['full', null, null, '56']}>\n <Select\n isMultiple={true}\n isSearchable={true}\n id=\"eventTypeFilter\"\n size=\"md\"\n placeholder={formatMessage({\n id: 'sections.events.eventsFilter.eventType',\n })}\n searchPlaceholder={formatMessage({\n id: 'sections.events.eventsFilter.searchPlaceholder',\n })}\n options={allEventTypeOptions}\n value={eventTypeFilter ?? []}\n onChange={(selected: string[]) => {\n setEventTypeFilter(selected);\n }}\n />\n </Box>\n <Box position=\"relative\" width={['full', null, null, '56']}>\n <Select\n isMultiple={true}\n isSearchable={true}\n id=\"languageFilter\"\n size=\"md\"\n placeholder={formatMessage({\n id: 'sections.events.eventsFilter.language',\n })}\n searchPlaceholder={formatMessage({\n id: 'sections.events.eventsFilter.searchPlaceholder',\n })}\n options={allLanguageOptions}\n value={languageFilter ?? []}\n onChange={(selected: string[]) => {\n setLanguageFilter(selected);\n }}\n />\n </Box>\n </Flex>\n\n {/* Filter Tags */}\n <Box display=\"flex\" flexWrap=\"wrap\" minHeight=\"6\" gap=\"2\">\n {eventTypeFilter.map((eventType) => {\n const event = allEventTypeOptions.find(\n (option) => option.value === eventType\n );\n return (\n <BoemlyTag\n key={eventType}\n isClosable={true}\n onClose={() => removeFilter('eventTypes', eventType)}\n >\n {event?.label}\n </BoemlyTag>\n );\n })}\n\n {languageFilter.map((singleLanguage) => {\n const language = allLanguageOptions.find(\n (option) => option.value === singleLanguage\n );\n return (\n <BoemlyTag\n key={singleLanguage}\n isClosable={true}\n onClose={() =>\n removeFilter('languages', singleLanguage)\n }\n >\n {language?.label}\n </BoemlyTag>\n );\n })}\n </Box>\n </Flex>\n {/* Sort Section */}\n <Box display=\"flex\" gap=\"1px\" width=\"52\" alignItems=\"center\">\n <Text size=\"smLowNormal\" color=\"black\" width=\"20\">\n Sort by:\n </Text>\n <Select\n isMultiple={false}\n borderColor=\"white\"\n value={[sort[0]]}\n placeholder={sort[0]}\n onChange={(selected: string[]) => setSort(selected)}\n options={[\n {\n label: formatMessage({\n id: `sections.events.eventsFilter.sortBy.${Sort.NEWEST_FIRST}`,\n }),\n value: Sort.NEWEST_FIRST,\n },\n {\n label: formatMessage({\n id: `sections.events.eventsFilter.sortBy.${Sort.OLDEST_FIRST}`,\n }),\n value: Sort.OLDEST_FIRST,\n },\n ]}\n />\n </Box>\n </Flex>\n\n <Spacer h={['8', null, null, '16']} />\n </>\n ) : (\n <></>\n )}\n\n {(!upcomingEvents || upcomingEvents.length === 0) &&\n !isLoadingUpcoming ? (\n <Center>\n {formatMessage({ id: 'sections.events.noUpcomingEvents' })}\n </Center>\n ) : (\n // List of upcoming events\n <SimpleGrid\n columns={[1, null, null, null, null, 2]}\n spacingX=\"6\"\n gap=\"6\"\n flexShrink=\"0\"\n mb={['10', null, null, '20']}\n placeItems=\"center\"\n >\n {upcomingEvents.map((event: IStrapiData<StrapiEvent>) => (\n <Box key={event.id} width=\"full\" height=\"full\">\n <EventCard event={event.attributes} />\n </Box>\n ))}\n </SimpleGrid>\n )}\n <Flex justifyContent=\"center\">\n {!isLoadingUpcoming && canLoadMoreUpcoming && (\n <Button\n onClick={() => {\n loadMoreUpcoming();\n }}\n variant=\"solid\"\n isLoading={isLoadingMoreUpcoming}\n >\n {formatMessage({ id: 'sections.events.loadMore' })}\n </Button>\n )}\n </Flex>\n </Wrapper>\n\n <Spacer h={['10', null, null, '28']} />\n\n <Box background=\"primary.50\" pt={['8', null, null, '24']}>\n <Wrapper>\n <DefaultSectionHeader\n title={slice.pastTitle}\n text={slice.pastDescription}\n titleProps={{ maxW: '3xl' }}\n textProps={{ maxW: '3xl' }}\n />\n\n <Spacer h=\"10\" />\n\n {(!pastEvents || pastEvents.length === 0) && !isLoadingPast ? (\n <>\n <Center>\n {formatMessage({ id: 'sections.events.noPastEvents' })}\n </Center>\n <Spacer h=\"24\" />\n </>\n ) : (\n // List of past events\n <SimpleGrid\n columns={[1, null, null, null, null, 2]}\n spacingX=\"6\"\n gap=\"6\"\n flexShrink=\"0\"\n placeItems=\"center\"\n mb={['10', null, null, '20']}\n >\n {pastEvents.map((event: IStrapiData<StrapiEvent>) => (\n <Box key={event.id} height=\"full\" width=\"full\">\n <EventCard event={event.attributes} />\n </Box>\n ))}\n </SimpleGrid>\n )}\n <Flex justifyContent=\"center\">\n {!isLoadingPast && canLoadMorePast && (\n <Button\n mb=\"20\"\n onClick={() => {\n loadMorePast();\n }}\n variant=\"solid\"\n isLoading={isLoadingMorePast}\n >\n {formatMessage({ id: 'sections.events.loadMore' })}\n </Button>\n )}\n </Flex>\n </Wrapper>\n </Box>\n </DefaultSectionContainer>\n );\n};\n","import React, { useContext, useState } from 'react';\nimport {\n Text,\n Box,\n Flex,\n Heading,\n Tooltip,\n Tag,\n useMediaQuery,\n Button,\n} from 'boemly';\nimport { css } from '@emotion/react';\nimport Image from 'next/image';\nimport StrapiLinkButton from '../StrapiLinkButton';\nimport {\n BowlFood,\n CalendarBlank,\n CaretDown,\n CaretRight,\n CaretUp,\n ChalkboardTeacher,\n Confetti,\n Handshake,\n Headset,\n Info,\n Laptop,\n MapPinLine,\n PersonSimpleWalk,\n ProjectorScreenChart,\n Star,\n UsersThree,\n Webcam,\n} from '@phosphor-icons/react';\nimport getCountryFlag from '../../utils/getCountryFlag';\nimport { BREAKPOINT_MD_QUERY } from '../../constants/breakpoints';\nimport StrapiEvent, { EventType } from '../../models/strapi/StrapiEvent';\nimport { IntlContext } from '../ContextProvider';\nimport strapiMediaUrl from '../../utils/strapiMediaUrl';\nimport isSameDate from '../../utils/isSameDate';\n\nexport interface EventCardProps {\n event: StrapiEvent;\n}\n\nconst MAX_LENGTH = 120;\nconst LOCATION_MAX_LENGTH = 28;\n\nconst getEventIcon = (eventType: string): JSX.Element => {\n switch (eventType) {\n case EventType.WEBINAR:\n return <Webcam size={12} />;\n case EventType.CONFERENCE:\n return <Headset size={12} />;\n case EventType.MEET_UP:\n return <UsersThree size={12} />;\n case EventType.FOREST_WALK:\n return <PersonSimpleWalk size={12} />;\n case EventType.PARTNER_EVENT:\n return <Handshake size={12} />;\n case EventType.LUNCH_AND_LEARN:\n return <BowlFood size={12} />;\n case EventType.FAIR:\n return <ChalkboardTeacher size={12} />;\n case EventType.FESTIVAL:\n return <Confetti size={12} />;\n case EventType.ROADSHOW:\n return <ProjectorScreenChart size={12} />;\n default:\n return <Info size={12} weight=\"fill\" />;\n }\n};\n\nexport const EventCard = ({ event }: EventCardProps): JSX.Element => {\n const { formatDate, formatNumber, formatMessage } = useContext(IntlContext);\n const [isExpanded, setIsExpanded] = useState(false);\n const [mobile] = useMediaQuery(BREAKPOINT_MD_QUERY);\n\n const toggleText = () => {\n setIsExpanded(!isExpanded);\n };\n\n const isLocationTooLong =\n (event.location?.length ?? 0) >= LOCATION_MAX_LENGTH;\n\n return (\n <Box\n borderRadius={['xl', null, null, '2xl']}\n height=\"full\"\n width=\"full\"\n border=\"1px solid var(--boemly-colors-gray-200)\"\n background=\"white\"\n >\n <Box\n position=\"relative\"\n width=\"full\"\n height={['32', null, null, '44']}\n borderTopRadius={['xl', null, null, '2xl']}\n css={css`\n & span,\n div,\n img {\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n }\n `}\n >\n <Image\n src={strapiMediaUrl(event.image?.img, 'medium')}\n alt={event.image?.alt}\n fill\n style={{\n objectFit: event.image?.objectFit || 'cover',\n }}\n />\n\n <Box\n position=\"absolute\"\n top={['6', null, null, '8']}\n right={['6', null, null, '8']}\n zIndex=\"1\"\n width={['12', null, null, '16']}\n height={['12', null, null, '16']}\n >\n <Image\n src={strapiMediaUrl(event.logo.img, 'medium')}\n alt={event.logo.alt}\n fill\n style={{\n objectFit: event.logo.objectFit || 'contain',\n borderRadius: 'var(--boemly-radii-md)',\n border:\n '1px solid, var(--whiteAlpha-700, rgba(255, 255, 255, 0.64))',\n }}\n />\n </Box>\n </Box>\n <Flex\n flexDir=\"column\"\n p={['6', null, null, '8']}\n h=\"calc(var(--boemly-sizes-full) - var(--boemly-sizes-44))\"\n >\n <Flex flexDir=\"row\" mb=\"4\" gap=\"2\" flexWrap=\"wrap\">\n {event.recommended ? (\n <Flex mb={['2', null, null, '0']}>\n <Tag backgroundColor=\"green.600\">\n <Star size={12} weight=\"fill\" color=\"white\" />\n &nbsp;\n <Text size=\"xsLowBold\" color=\"white\">\n {formatMessage({\n id: 'sections.eventCard.recommendedEvent',\n })}\n </Text>\n </Tag>\n </Flex>\n ) : (\n <></>\n )}\n <Flex flexWrap=\"wrap\" gap=\"2\">\n {event.eventTypes.map((e) => (\n <Tag key={e.id}>\n {getEventIcon(e.eventType)}&nbsp;\n <Text size=\"xsLowBold\" color=\"gray.800\">\n {formatMessage({\n id: `sections.eventCard.eventType.${e.eventType\n .toLowerCase()\n .replace(/\\s+/g, '')}`,\n })}\n </Text>\n </Tag>\n ))}\n {event.languages.map(({ id, language, countryCode }) => (\n <Tag key={id}>\n {getCountryFlag(countryCode)}&nbsp;\n <Text size=\"xsLowBold\" color=\"gray.800\">\n {language}\n </Text>\n </Tag>\n ))}\n </Flex>\n </Flex>\n <Heading>{event.title}</Heading>\n <Flex\n gap={isLocationTooLong ? '2' : ['2', null, null, '6']}\n alignItems={mobile || isLocationTooLong ? 'flex-start' : 'center'}\n my=\"4\"\n flexDir={mobile || isLocationTooLong ? 'column' : 'row'}\n >\n {event.online && (\n <Flex gap=\"2\" alignItems=\"center\">\n <Laptop size={20} color={'var(--boemly-colors-primary-700)'} />\n <Text size={['xsLowBold', null, null, 'smLowBold']}>Online</Text>\n </Flex>\n )}\n {event.location && (\n <Flex gap=\"2\" alignItems=\"center\">\n <MapPinLine\n size={20}\n color={'var(--boemly-colors-primary-700)'}\n weight=\"fill\"\n />\n <Text size={['xsLowBold', null, null, 'smLowBold']}>\n {event.location}\n </Text>\n </Flex>\n )}\n <Flex alignItems=\"center\" gap=\"2\">\n <CalendarBlank\n size={20}\n color={'var(--boemly-colors-primary-700)'}\n />\n <Text size={['xsLowBold', null, null, 'smLowBold']}>\n {formatDate(event.start, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n })}\n\n {!event.allDay &&\n ` | ${formatNumber(new Date(event.start).getUTCHours(), {\n minimumIntegerDigits: 2,\n })}:${formatNumber(new Date(event.start).getUTCMinutes(), {\n minimumIntegerDigits: 2,\n })}`}\n\n {event.end &&\n !isSameDate(new Date(event.start), new Date(event.end)) && (\n <>\n {' - '}\n {formatDate(event.end, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n })}\n\n {!event.allDay &&\n ` | ${formatNumber(new Date(event.end).getUTCHours(), {\n minimumIntegerDigits: 2,\n })}:${formatNumber(new Date(event.end).getUTCMinutes(), {\n minimumIntegerDigits: 2,\n })}`}\n </>\n )}\n\n {event.end &&\n !event.allDay &&\n isSameDate(new Date(event.start), new Date(event.end)) &&\n ` - ${formatNumber(new Date(event.end).getUTCHours(), {\n minimumIntegerDigits: 2,\n })}:${formatNumber(new Date(event.end).getUTCMinutes(), {\n minimumIntegerDigits: 2,\n })}`}\n </Text>\n </Flex>\n </Flex>\n <Text\n mb={mobile ? '0' : '7'}\n size={['xsRegularNormal', null, null, 'smRegularNormal']}\n >\n {isExpanded || !mobile\n ? event.description\n : `${event.description.substring(0, MAX_LENGTH)}...`}\n </Text>\n {event.description.length > MAX_LENGTH && mobile && (\n <Flex justifyContent=\"flex-start\">\n <Button\n mt=\"2\"\n onClick={toggleText}\n variant=\"link\"\n rightIcon={\n isExpanded ? <CaretUp size=\"12\" /> : <CaretDown size=\"12\" />\n }\n >\n {formatMessage(\n isExpanded\n ? {\n id: 'sections.eventCard.buttonShowLess',\n }\n : { id: 'sections.eventCard.buttonShowMore' }\n )}\n </Button>\n </Flex>\n )}\n <Flex\n mt={mobile ? '7' : 'auto'}\n justifyContent={mobile ? undefined : 'space-between'}\n flexDir={mobile ? 'column-reverse' : 'row'}\n gap={mobile ? '4' : '0'}\n >\n {event.button && (\n <Flex width={mobile ? 'full' : 'auto'}>\n <StrapiLinkButton\n key={event.button.id}\n size=\"md\"\n variant={event.buttonVariant}\n link={event.button}\n rightIcon={<CaretRight size=\"10\" />}\n width=\"full\"\n component=\"EventCard\"\n />\n </Flex>\n )}\n {event.speakers && event.speakers.length > 0 && (\n <Flex flexDir=\"row\" gap=\"2\">\n {event.speakers.map((speaker) => (\n <Box key={speaker.id}>\n <Box\n width={['10', null, null, '12']}\n height={['10', null, null, '12']}\n position=\"relative\"\n borderRadius=\"2xl\"\n >\n <Tooltip label={speaker.name}>\n <Image\n src={strapiMediaUrl(speaker.image.img, 'medium')}\n alt={speaker.image.alt}\n fill\n style={{\n objectFit: speaker.image.objectFit || 'cover',\n borderRadius: 'var(--boemly-radii-md)',\n border:\n '1px solid, var(--whiteAlpha-700, rgba(255, 255, 255, 0.64))',\n }}\n />\n </Tooltip>\n </Box>\n </Box>\n ))}\n </Flex>\n )}\n </Flex>\n </Flex>\n </Box>\n );\n};\n","const getCountryFlag = (countryCode: string): string => {\n return countryCode\n .toUpperCase()\n .replace(/./g, (char) => String.fromCodePoint(char.charCodeAt(0) + 127397));\n};\nexport default getCountryFlag;\n","import useSWRInfinite, { SWRInfiniteKeyLoader } from 'swr/infinite';\nimport { useCallback, useMemo } from 'react';\nimport UseInfiniteDataHookProps from './UseInfiniteDataHookProps';\nimport SWRData from '../SWRData';\nimport IStrapiResponse from '../../models/strapi/IStrapiResponse';\nimport StrapiEvent from '../strapi/StrapiEvent';\n\nconst useEvents = ({\n getKey,\n batchSize,\n}: {\n getKey: SWRInfiniteKeyLoader;\n batchSize: number;\n}): UseInfiniteDataHookProps<IStrapiResponse<StrapiEvent[]>[]> => {\n const { data, isLoading, setSize, size, mutate } = useSWRInfinite<\n SWRData<IStrapiResponse<StrapiEvent[]>>\n >(getKey, { revalidateFirstPage: false, revalidateAll: false });\n\n const count: number | undefined = useMemo(() => {\n return data?.[0]?.body?.meta?.pagination?.total || 0;\n }, [data]);\n\n const isLoadingMore = useMemo(\n () => !!(size > 0 && data && typeof data[size - 1] === 'undefined'),\n [size, data]\n );\n\n const loadMore = useCallback(() => setSize(size + 1), [setSize, size]);\n\n const canLoadMore = useMemo(\n () => count !== undefined && size * batchSize < count,\n [count, size, batchSize]\n );\n\n return {\n data: data as any,\n isLoading,\n isLoadingMore,\n canLoadMore,\n refetch: mutate,\n loadMore,\n count,\n };\n};\n\nexport default useEvents;\n","import { useRouter } from 'next/router';\nimport React, { useEffect } from 'react';\nimport { buildRedirectUrl } from '../../utils/buildRedirectUrl';\n\nexport interface RedirectProps {\n slice: {\n url: string;\n };\n}\n\nexport const Redirect = ({ slice }: RedirectProps): JSX.Element => {\n const router = useRouter();\n\n useEffect(() => {\n if (!slice.url) return;\n\n // Build redirect URL\n const redirectUrl = buildRedirectUrl(\n slice.url,\n router.asPath,\n router.query\n );\n\n // Redirect\n router.replace(redirectUrl);\n }, [slice.url, router]);\n\n return <></>;\n};\n","import type { ParsedUrlQuery } from 'querystring';\n\nexport function buildRedirectUrl(\n url: string,\n asPath: string,\n query: ParsedUrlQuery\n): string {\n if (!url) return '';\n\n // Parse the base target URL\n const target = new URL(url, window.location.origin);\n\n // Merge existing params from the target\n const mergedParams = new URLSearchParams(target.search);\n\n // Add absolute source\n const absoluteSource = `${window.location.origin}${asPath}`;\n mergedParams.set('source', absoluteSource);\n\n // Forward utm_* params from the current page\n for (const [key, value] of Object.entries(query)) {\n if (key.startsWith('utm_') && typeof value === 'string') {\n mergedParams.set(key, value);\n }\n }\n\n // Add timestamp\n mergedParams.set('ts', Date.now().toString());\n\n // Build final merged URL\n target.search = mergedParams.toString();\n\n return target.toString();\n}\n","import React from 'react';\nimport { BoemlyAlert, Box } from 'boemly';\n\nexport const PreviewAlert = (): JSX.Element => {\n return (\n <Box position=\"fixed\" top=\"4\" left=\"4\">\n <BoemlyAlert text=\"Preview\" status=\"error\" />\n </Box>\n );\n};\n","import React from 'react';\nimport FullWidthImage from '../../slices/FullWidthImage';\nimport Hero from '../../slices/Hero';\nimport IconGrid from '../../slices/IconGrid';\nimport ImageGrid from '../../slices/ImageGrid';\nimport ImageTextSequence from '../../slices/ImageTextSequence';\nimport LeftTextRightCard from '../../slices/LeftTextRightCard';\nimport LogoGridWithText from '../../slices/LogoGridWithText';\nimport MapHero from '../../slices/MapHero';\nimport QAndA from '../../slices/QAndA';\nimport QuoteCards from '../../slices/QuoteCards';\nimport RichTextSection from '../../slices/RichTextSection';\nimport Steps from '../../slices/Steps';\nimport TextCardGrid from '../../slices/TextCardGrid';\nimport TextCarousel from '../../slices/TextCarousel';\nimport TextWithTextCards from '../../slices/TextWithTextCards';\nimport TextWithCard from '../../slices/TextWithCard';\nimport LinkCardsGrid from '../../slices/LinkCardsGrid';\nimport SmallHero from '../../slices/SmallHero';\nimport Blog from '../../slices/Blog';\nimport StrapiBlogPost from '../../models/strapi/StrapiBlogPost';\nimport ProjectsGrid from '../../slices/ProjectsGrid';\nimport ProjectsMap from '../../slices/ProjectsMap';\nimport Video from '../../slices/Video';\nimport FullWidthHighlightQuote from '../../slices/FullWidthHighlightQuote';\nimport FullWidthImageSlider from '../../slices/FullWidthImageSlider';\nimport SideBySideImages from '../../slices/SideBySideImages';\nimport IStrapiData from '../../models/strapi/IStrapiData';\nimport Cta from '../../slices/Cta';\nimport CtaOnly from '../../slices/CtaOnly';\nimport Glossary from '../../slices/Glossary';\nimport ShopCheckout from '../../slices/ShopCheckout';\nimport Facts from '../../slices/Facts';\nimport BlogCards from '../../slices/BlogCards';\nimport PortfolioProject from '../../models/PortfolioProject';\nimport ProjectFacts from '../../slices/ProjectFacts';\nimport CustomerStories from '../../slices/CustomerStories';\nimport StrapiCustomerStory from '../../models/strapi/StrapiCustomerStory';\nimport Comparison from '../../slices/Comparison';\nimport CarouselMarqueeBanner from '../../slices/CarouselMarqueeBanner';\nimport Locale from '../../models/Locale';\nimport { ContextProvider } from '../ContextProvider';\nimport Timeline from '../../slices/Timeline';\nimport Events from '../../slices/Events';\nimport Redirect from '../../slices/Redirect';\nimport { AnalyticsFunction } from '../ContextProvider/ContextProvider';\n\nexport interface CustomSliceProps {\n slice: any;\n id: string;\n}\n\nexport interface SliceRendererProps {\n slices: any;\n blogPosts: IStrapiData<StrapiBlogPost>[];\n projects: PortfolioProject[];\n customerStories: IStrapiData<StrapiCustomerStory>[];\n locale?: Locale;\n CustomSlice?: ({ slice, id }: CustomSliceProps) => JSX.Element;\n analyticsFunction?: AnalyticsFunction;\n}\n\nexport const SliceRenderer = ({\n slices,\n blogPosts,\n projects,\n customerStories,\n locale = 'en',\n CustomSlice,\n analyticsFunction,\n}: SliceRendererProps): JSX.Element => (\n <ContextProvider locale={locale} analyticsFunction={analyticsFunction}>\n {slices.map((slice: any) => {\n switch (slice.__component) {\n case 'sections.hero':\n return (\n <Hero key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.map-hero':\n return (\n <MapHero key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.rich-text':\n return (\n <RichTextSection\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.left-text-right-card':\n return (\n <LeftTextRightCard\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.text-with-card':\n return (\n <TextWithCard\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n projects={projects}\n />\n );\n case 'sections.logo-grid-with-text':\n return (\n <LogoGridWithText\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.quote-cards':\n return (\n <QuoteCards\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.q-and-a':\n return (\n <QAndA key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.image-grid':\n return (\n <ImageGrid key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.full-width-image':\n return (\n <FullWidthImage\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.text-with-text-cards':\n return (\n <TextWithTextCards\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.text-card-grid':\n return (\n <TextCardGrid\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.icon-grid':\n return (\n <IconGrid key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.image-text-sequence':\n return (\n <ImageTextSequence\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.steps':\n return (\n <Steps key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.text-carousel':\n return (\n <TextCarousel\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.link-cards-grid':\n return (\n <LinkCardsGrid\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.small-hero':\n return (\n <SmallHero\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n theme=\"dark\"\n />\n );\n case 'sections.small-hero-light':\n return (\n <SmallHero\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n theme=\"light\"\n />\n );\n case 'sections.project-facts':\n return (\n <ProjectFacts\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n project={projects.find((p) => p.id === slice.projectId)}\n />\n );\n case 'sections.projects-grid':\n return (\n <ProjectsGrid\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n projects={projects}\n />\n );\n case 'sections.projects-map':\n return (\n <ProjectsMap\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.video':\n return (\n <Video key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.full-width-highlight-quote':\n return (\n <FullWidthHighlightQuote\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.full-width-image-slider':\n return (\n <FullWidthImageSlider\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.side-by-side-images':\n return (\n <SideBySideImages\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.cta-only':\n return (\n <CtaOnly key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.cta':\n return <Cta key={`${slice.__component}-${slice.id}`} slice={slice} />;\n case 'sections.shop-checkout':\n return (\n <ShopCheckout\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.facts':\n return (\n <Facts key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.blog-cards':\n return (\n <BlogCards\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n blogPosts={blogPosts}\n />\n );\n case 'sections.blog':\n return (\n <Blog\n key={`${slice.__component}-${slice.id}`}\n slice={{\n ...slice,\n blog_posts: slice.blog_posts.data,\n }}\n blogPosts={blogPosts}\n />\n );\n case 'sections.glossary':\n return (\n <Glossary\n key={`${slice.__component}-${slice.id}`}\n slice={{\n ...slice,\n glossary_items: slice.glossary_items.data,\n }}\n />\n );\n case 'sections.customer-stories':\n return (\n <CustomerStories\n key={`${slice.__component}-${slice.id}`}\n slice={{\n ...slice,\n customer_stories: slice.customer_stories.data,\n }}\n customerStories={customerStories}\n />\n );\n case 'sections.comparison':\n return (\n <Comparison\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.timeline':\n return (\n <Timeline key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.carousel-marquee-banner':\n return (\n <CarouselMarqueeBanner\n key={`${slice.__component}-${slice.id}`}\n slice={slice}\n />\n );\n case 'sections.events':\n return (\n <Events key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n case 'sections.redirect':\n return (\n <Redirect key={`${slice.__component}-${slice.id}`} slice={slice} />\n );\n default:\n if (CustomSlice) {\n return (\n <CustomSlice\n key={`${slice.__component}-${slice.id}`}\n id={slice.__component}\n slice={slice}\n />\n );\n }\n\n return (\n <div key={`${slice.__component}-${slice.id}`}>\n Slice component not supported\n </div>\n );\n }\n })}\n </ContextProvider>\n);\n","import { GetStaticPropsContext } from 'next';\nimport strapiMediaUrl from './strapiMediaUrl';\nimport {\n IStrapiData,\n StrapiBlogPost,\n StrapiBlogPostProps,\n StrapiGlobal,\n} from '..';\nimport PortfolioProject from '../models/PortfolioProject';\nimport { DEFAULT_SHARE_ALT, DEFAULT_SHARE_IMAGE } from '../constants/metadata';\nimport {\n SLICES_WITH_BLOG_POSTS,\n SLICES_WITH_PROJECTS,\n} from '../constants/slicesConfig';\n\nconst mergeGlobalAndStrapiBlogPostData = (\n context: GetStaticPropsContext,\n global: IStrapiData<StrapiGlobal>,\n post: IStrapiData<StrapiBlogPost>,\n blog: IStrapiData<StrapiBlogPost>[],\n projects: PortfolioProject[]\n): StrapiBlogPostProps => {\n const metaShareImageUrl = post.attributes.metadata?.shareImage\n ? strapiMediaUrl(\n post.attributes.metadata?.shareImage.media ??\n global.attributes.metadata.shareImage?.media,\n 'large'\n )\n : DEFAULT_SHARE_IMAGE;\n\n const schemaMarkupTypes =\n post.attributes.metadata?.schemaMarkupTypes ??\n global.attributes.metadata?.schemaMarkupTypes ??\n [];\n\n const returnBlog = post.attributes.slices.some((slice) =>\n SLICES_WITH_BLOG_POSTS.includes(slice.__component)\n );\n const returnProjects = post.attributes.slices.some((slice) =>\n SLICES_WITH_PROJECTS.includes(slice.__component)\n );\n\n return {\n ...post,\n // Portfolio Projects\n projects: returnProjects ? projects : [],\n // StrapiBlogPost\n attributes: {\n ...post?.attributes,\n metadata: post?.attributes?.metadata || global.attributes.metadata,\n },\n // PageProps\n headerType: {\n extendable: true,\n theme: 'light',\n },\n headerNavMenus: global.attributes.navbar.navMenus || [],\n headerButtons: global.attributes.navbar.buttons || [],\n footerLinks: global.attributes.footer.links || [],\n metadata: {\n title:\n post.attributes.metadata?.title ?? global.attributes.metadata.title,\n description:\n post.attributes.metadata?.description ??\n global.attributes.metadata.description,\n shareImage: {\n url: metaShareImageUrl,\n alt:\n post.attributes.metadata?.shareImage?.alt ??\n global.attributes.metadata.shareImage?.alt ??\n DEFAULT_SHARE_ALT,\n },\n metaTitleSuffix: global.attributes.metaTitleSuffix,\n favicon: strapiMediaUrl(global.attributes.favicon, 'thumbnail'),\n schemaMarkupTypes,\n },\n slices: post?.attributes.slices,\n blogPosts: returnBlog ? blog : [],\n banner: global.attributes.banner,\n topBanner: post?.attributes.topBanner || global.attributes.topBanner,\n customerStories: [],\n preview: !!context.preview,\n isFallbackLocale: context.locale !== post.attributes.locale,\n };\n};\n\nexport default mergeGlobalAndStrapiBlogPostData;\n","import { GetStaticPropsContext } from 'next';\nimport strapiMediaUrl from './strapiMediaUrl';\nimport {\n IStrapiData,\n StrapiCustomerStory,\n StrapiCustomerStoryProps,\n StrapiGlobal,\n} from '..';\nimport { DEFAULT_SHARE_ALT, DEFAULT_SHARE_IMAGE } from '../constants/metadata';\nimport { SLICES_WITH_CUSTOMER_STORIES } from '../constants/slicesConfig';\n\nconst mergeGlobalAndStrapiCustomerStoryData = (\n context: GetStaticPropsContext,\n global: IStrapiData<StrapiGlobal>,\n customerStory: IStrapiData<StrapiCustomerStory>,\n customerStories: IStrapiData<StrapiCustomerStory>[]\n): StrapiCustomerStoryProps => {\n const metaShareImageUrl = customerStory.attributes.metadata?.shareImage\n ? strapiMediaUrl(\n customerStory.attributes.metadata?.shareImage.media ??\n global.attributes.metadata.shareImage?.media,\n 'large'\n )\n : DEFAULT_SHARE_IMAGE;\n\n const schemaMarkupTypes =\n customerStory.attributes.metadata?.schemaMarkupTypes ??\n global.attributes.metadata?.schemaMarkupTypes ??\n [];\n\n const returnCustomerStories = customerStory.attributes.slices.some((slice) =>\n SLICES_WITH_CUSTOMER_STORIES.includes(slice.__component)\n );\n\n return {\n ...customerStory,\n // Portfolio Projects\n projects: [],\n attributes: {\n ...customerStory?.attributes,\n metadata:\n customerStory?.attributes?.metadata || global.attributes.metadata,\n },\n // PageProps\n headerType: {\n extendable: true,\n theme: 'light',\n },\n headerNavMenus: global.attributes.navbar.navMenus || [],\n headerButtons: global.attributes.navbar.buttons || [],\n footerLinks: global.attributes.footer.links || [],\n metadata: {\n title:\n customerStory.attributes.metadata?.title ??\n global.attributes.metadata.title,\n description:\n customerStory.attributes.metadata?.description ??\n global.attributes.metadata.description,\n shareImage: {\n url: metaShareImageUrl,\n alt:\n customerStory.attributes.metadata?.shareImage?.alt ??\n global.attributes.metadata.shareImage?.alt ??\n DEFAULT_SHARE_ALT,\n },\n metaTitleSuffix: global.attributes.metaTitleSuffix,\n favicon: strapiMediaUrl(global.attributes.favicon, 'thumbnail'),\n schemaMarkupTypes,\n },\n slices: customerStory?.attributes.slices,\n customerStories: returnCustomerStories ? customerStories : [],\n banner: global.attributes.banner,\n topBanner:\n customerStory?.attributes.topBanner || global.attributes.topBanner,\n blogPosts: [],\n preview: !!context.preview,\n isFallbackLocale: context.locale !== customerStory.attributes.locale,\n };\n};\n\nexport default mergeGlobalAndStrapiCustomerStoryData;\n","import { GetStaticPropsContext } from 'next';\nimport strapiMediaUrl from './strapiMediaUrl';\nimport {\n IStrapiData,\n StrapiBlogPost,\n StrapiCustomerStory,\n StrapiGlobal,\n StrapiPage,\n StrapiPageProps,\n} from '..';\nimport PortfolioProject from '../models/PortfolioProject';\nimport {\n DARK_THEME_HEADER_SECTIONS,\n EXTENDABLE_HEADER_SECTIONS,\n SLICES_WITH_BLOG_POSTS,\n SLICES_WITH_CUSTOMER_STORIES,\n SLICES_WITH_PROJECTS,\n} from '../constants/slicesConfig';\nimport { DEFAULT_SHARE_ALT, DEFAULT_SHARE_IMAGE } from '../constants/metadata';\n\nconst mergeGlobalAndStrapiPageData = (\n context: GetStaticPropsContext,\n global: IStrapiData<StrapiGlobal>,\n page: IStrapiData<StrapiPage>,\n blogPosts: IStrapiData<StrapiBlogPost>[],\n customerStories: IStrapiData<StrapiCustomerStory>[],\n projects: PortfolioProject[]\n): StrapiPageProps => {\n const metaShareImageUrl = page.attributes.metadata?.shareImage\n ? strapiMediaUrl(\n page.attributes.metadata?.shareImage.media ??\n global.attributes.metadata.shareImage?.media,\n 'large'\n )\n : DEFAULT_SHARE_IMAGE;\n\n const schemaMarkupTypes =\n page.attributes.metadata?.schemaMarkupTypes ??\n global.attributes.metadata?.schemaMarkupTypes ??\n [];\n\n const returnBlogPosts = page.attributes.slices.some((slice) =>\n SLICES_WITH_BLOG_POSTS.includes(slice.__component)\n );\n const returnCustomerStories = page.attributes.slices.some((slice) =>\n SLICES_WITH_CUSTOMER_STORIES.includes(slice.__component)\n );\n const returnProjects = page.attributes.slices.some((slice) =>\n SLICES_WITH_PROJECTS.includes(slice.__component)\n );\n\n return {\n ...page,\n // Portfolio Projects\n projects: returnProjects ? projects : [],\n // StrapiPage\n attributes: {\n ...page?.attributes,\n metadata: page?.attributes?.metadata ?? global.attributes.metadata,\n },\n // PageProps\n headerType: {\n extendable: EXTENDABLE_HEADER_SECTIONS.includes(\n page.attributes.slices[0]?.__component\n ),\n theme: DARK_THEME_HEADER_SECTIONS.includes(\n page.attributes.slices[0]?.__component\n )\n ? 'dark'\n : 'light',\n },\n headerNavMenus: global.attributes.navbar.navMenus || [],\n headerButtons: global.attributes.navbar.buttons || [],\n footerLinks: global.attributes.footer.links || [],\n metadata: {\n title:\n page.attributes.metadata?.title ?? global.attributes.metadata.title,\n description:\n page.attributes.metadata?.description ??\n global.attributes.metadata.description,\n shareImage: {\n url: metaShareImageUrl,\n alt:\n page.attributes.metadata?.shareImage?.alt ??\n global.attributes.metadata.shareImage?.alt ??\n DEFAULT_SHARE_ALT,\n },\n metaTitleSuffix: global.attributes.metaTitleSuffix,\n favicon: strapiMediaUrl(global.attributes.favicon, 'thumbnail'),\n schemaMarkupTypes,\n },\n slices: page?.attributes.slices,\n blogPosts: returnBlogPosts ? blogPosts : [],\n banner: global.attributes.banner,\n topBanner: page?.attributes.topBanner || global.attributes.topBanner,\n customerStories: returnCustomerStories ? customerStories : [],\n preview: !!context.preview,\n isFallbackLocale: context.locale !== page.attributes.locale,\n };\n};\n\nexport default mergeGlobalAndStrapiPageData;\n","import { GetStaticPropsContext } from 'next';\nimport strapiMediaUrl from './strapiMediaUrl';\nimport {\n IStrapiData,\n StrapiBlogPost,\n StrapiGlobal,\n StrapiProject,\n StrapiProjectProps,\n} from '..';\nimport PortfolioProject from '../models/PortfolioProject';\nimport {\n DARK_THEME_HEADER_SECTIONS,\n EXTENDABLE_HEADER_SECTIONS,\n SLICES_WITH_BLOG_POSTS,\n SLICES_WITH_PROJECTS,\n} from '../constants/slicesConfig';\nimport { DEFAULT_SHARE_ALT, DEFAULT_SHARE_IMAGE } from '../constants/metadata';\n\nconst mergeGlobalAndStrapiProject = (\n context: GetStaticPropsContext,\n global: IStrapiData<StrapiGlobal>,\n project: IStrapiData<StrapiProject>,\n blogPosts: IStrapiData<StrapiBlogPost>[],\n projects: PortfolioProject[]\n): StrapiProjectProps => {\n const metaShareImageUrl = project.attributes.metadata?.shareImage\n ? strapiMediaUrl(\n project.attributes.metadata?.shareImage.media ??\n global.attributes.metadata.shareImage?.media,\n 'large'\n )\n : DEFAULT_SHARE_IMAGE;\n\n const schemaMarkupTypes =\n project.attributes.metadata?.schemaMarkupTypes ??\n global.attributes.metadata?.schemaMarkupTypes ??\n [];\n\n const returnBlogPosts = project.attributes.slices.some((slice) =>\n SLICES_WITH_BLOG_POSTS.includes(slice.__component)\n );\n const returnProjects = project.attributes.slices.some((slice) =>\n SLICES_WITH_PROJECTS.includes(slice.__component)\n );\n\n return {\n ...project,\n // Portfolio Projects\n projects: returnProjects ? projects : [],\n // StrapiProject\n attributes: {\n ...project.attributes,\n metadata: project?.attributes?.metadata || global.attributes.metadata,\n },\n headerType: {\n extendable: EXTENDABLE_HEADER_SECTIONS.includes(\n project.attributes.slices[0]?.__component\n ),\n theme: DARK_THEME_HEADER_SECTIONS.includes(\n project.attributes.slices[0]?.__component\n )\n ? 'dark'\n : 'light',\n },\n // PageProps\n headerNavMenus: global.attributes.navbar.navMenus || [],\n headerButtons: global.attributes.navbar.buttons || [],\n footerLinks: global.attributes.footer.links || [],\n metadata: {\n title:\n project.attributes.metadata?.title ?? global.attributes.metadata.title,\n description:\n project.attributes.metadata?.description ??\n global.attributes.metadata.description,\n shareImage: {\n url: metaShareImageUrl,\n alt:\n project.attributes.metadata?.shareImage?.alt ??\n global.attributes.metadata.shareImage?.alt ??\n DEFAULT_SHARE_ALT,\n },\n metaTitleSuffix: global.attributes.metaTitleSuffix,\n favicon: strapiMediaUrl(global.attributes.favicon, 'thumbnail'),\n schemaMarkupTypes,\n },\n slices: project.attributes.slices,\n blogPosts: returnBlogPosts ? blogPosts : [],\n banner: global.attributes.banner,\n topBanner: project?.attributes.topBanner || global.attributes.topBanner,\n customerStories: [],\n preview: !!context.preview,\n isFallbackLocale: context.locale !== project.attributes.locale,\n };\n};\n\nexport default mergeGlobalAndStrapiProject;\n"],"names":["STRAPI_URI","process","env","NEXT_PUBLIC_STRAPI_URI","STRAPI_DEFAULT_PAGE_SIZE","STRAPI_DEFAULT_POPULATE_DEPTH","STRAPI_FALLBACK_LOCALE","strapiClient","setupCache","axios","default","create","baseURL","headers","paramsSerializer","p","qs","stringify","encodeValuesOnly","timeout","ttl","includes","getAllSlugsFromStrapi","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","path","locales","_temp","_ref2$filters","filters","slugPromises","allSlugs","missingLocales","wrap","_context","prev","next","map","locale","get","params","then","response","data","page","slug","attributes","error","_error$response","status","Promise","all","sent","flat","flatMap","filter","fallbackSlug","some","_extends","abrupt","concat","stop","_x","_x2","_x3","apply","this","arguments","ShapePosition","FPM_API_URI","NEXT_PUBLIC_FPM_API_URI","CDN_URI","fpmClient","getStrapiProjects","pLevel","preview","cache","strapiParams","strapiProjects","_yield$Promise$all","_i","_arr","project","undefined","Map","length","fpmProjectId","set","t0","console","warn","getPortfolioProjects","fpmProjects","fpmProject","_strapiProject$attrib","strapiProject","id","toReturn","thumbnail","portfolio","host","portfolioHost","getStrapiCollectionType","_ref2","key","_ref$locale","_ref$preview","_ref$filters","sharedParams","requestedLocaleData","results","_error$response2","fallbackLocaleDataEntry","find","localized","getStrapiSingleType","isAxiosError","strapiMediaUrl","media","preferredSize","_media$data$attribute","url","ext","formats","indexOf","DEFAULT_SHARE_IMAGE","DEFAULT_SHARE_ALT","EXTENDABLE_HEADER_SECTIONS","DARK_THEME_HEADER_SECTIONS","SLICES_WITH_BLOG_POSTS","SLICES_WITH_CUSTOMER_STORIES","SLICES_WITH_PROJECTS","strapiLinkUrl","strapiLink","_strapiLink","_strapiLink2","getSchemaProperty","schema","property","value","text","ZoomableImage","image","_ref$zoom","zoom","_useState","useState","isZoomed","setIsZoomed","_useState2","backgroundPos","setBackgroundPos","imageSrc","img","zoomInPosition","e","zoomer","currentTarget","getBoundingClientRect","clientX","x","width","y","clientY","height","React","createElement","Fragment","Head","rel","as","href","Box","position","display","overflow","flexShrink","scrollSnapAlign","scrollSnapStop","draggable","cursor","backgroundImage","backgroundSize","backgroundPosition","onClick","toggleZoomImage","handleClick","onMouseMove","handleMove","Image","src","alt","fill","style","visibility","objectFit","FullScreenImage","images","isOpen","onClose","_ref$currentIndex","currentIndex","setCurrentIndex","containerRef","useRef","useLockBodyScroll","canMoveRight","useMemo","canMoveLeft","onRight","useCallback","c","onLeft","useKey","useEffect","setTimeout","_containerRef$current","current","scrollTo","left","clientWidth","behavior","BoemlyModal","title","trigger","size","content","Flex","insetY","insetX","alignItems","justifyContent","ref","flexGrow","flexBasis","gap","marginX","scrollSnapType","inset","pointerEvents","IconButton","icon","CaretLeft","variant","mr","CaretRight","ml","BREAKPOINT_MD","BREAKPOINT_LG","BREAKPOINT_MD_QUERY","BREAKPOINT_LG_QUERY","FullWidthImage","slice","setIsOpen","isMobile","useMediaQuery","DefaultSectionContainer","Wrapper","DefaultSectionHeader","isHero","tagline","taglineProps","textAlign","mt","titleProps","maxW","textProps","borderRadius","GLOBAL_STYLE","css","_templateObject","_taggedTemplateLiteralLoose","rootMessagesDe","creditsAvailableBadgeMessagesDe","messages","en","creditsAvailableBadgeMessagesEn","de","getMessages","messagesLocale","Object","keys","AnalyticsContext","createContext","createIntlCache","intlFactory","createIntl","IntlContext","ContextProvider","children","analyticsFunction","fetcher","resource","init","errorData","message","Error","t1","t2","body","SWRConfig","Global","styles","Provider","StrapiLinkButton","link","_ref$component","component","buttonProps","_objectWithoutPropertiesLoose","_excluded","adBlockDetected","useDetectAdBlock","useContext","buttonUrl","intercomLauncher","type","props","action","buttonText","Button","Link","w","window","HubSpotConversations","widget","open","hsConversationsOnReady","Hero","minHeight","backgroundColor","overflowX","Gradient","shape","bottom","borderTopRightRadius","right","top","transform","subTitle","color","mx","button","additionalButtons","IconGrid","flexDirection","Spacer","h","SimpleGrid","columns","iconsWithTextAndButton","rowGap","iconWithTextAndButton","margin","Heading","mb","Text","LinkedInIcon","viewBox","xmlns","clipPath","d","StrapiLinkButtonWithIcon","rightIcon","destination","Globe","getLinkIcon","ImageGrid","_useToken","useToken","minChildWidth","links","flexDir","flexWrap","ImageTextSequence","oneColumnGrid","primary50","gray700","background","imageTextRows","index","imageBox","LeftTextRightCard","push","useRouter","Grid","templateColumns","templateRows","GridItem","colSpan","rowSpan","pr","checkMarkLabels","BoemlyList","listItems","colorScheme","ArrowRight","card","PortfolioCard","_slice$card","_slice$card5","_slice$card2","_slice$card3","_slice$card4","cardTitle","facts","portfolioNumber","LogoGridWithText","RichText","logos","logo","MapHeroContainer","styled","MapHeroTextContainer","_templateObject2","ShapeContainer","_templateObject3","MapContainer","_templateObject4","MapGradient","_templateObject5","MapHero","belowBreakpoint","maxWidth","buttons","mobileMap","convertToKebabCase","str","matches","match","toLowerCase","join","VARIANTS","gray","tagLineColor","textColor","accordionVariant","otherQuestionsBackground","green","white","QAndA","_slice$variant","pb","hero","paddingY","maxHeight","paddingTop","paddingRight","overflowY","BoemlyAccordion","rows","questionsAndAnswers","defaultIndex","padding","otherQuestions","HeroCard","_slice$hero","section","QuoteCards","paddingBottom","shapes","Shape","radius","cards","QuoteCard","avatar","name","description","marginTop","RichTextSection","Steps","_slice$card$shapes","gray900","Array","steps","stepRefs","setStepRefs","stepProgress","setStepProgress","offsetY","useWindowScroll","windowHeight","useWindowSize","createRef","containerOffsetTop","offsetTop","_ref$current","currentItemOffsetTop","Center","step","options","forceBlock","marginBottom","borderLeft","opacity","borderRight","transition","ShapesCard","CreditAvailability","shapePositions","topLeft","bottomRight","topRight","bottomLeft","oppositesOfCorners","_oppositesOfCorners","unset","variants","positionIcon","TextCardGrid","justifyItems","zIndex","boxShadow","borderBottomRightRadius","borderBottomLeftRadius","borderTopLeftRadius","listProps","textSize","buttonIndex","weight","CarouselContainer","CarouselInnerContainer","motion","div","numberOfItems","CardContainer","TextCarousel","_useMeasure","useMeasure","itemRef","itemWidth","formatMessage","windowWidth","slides","displaySlides","setDisplaySlides","sliderIndex","setSliderIndex","sliderItemsWidth","offsetLeft","allowScroll","ITEM_GAP","_slice$isShuffled","isShuffled","slidesCopy","i","j","Math","floor","random","shuffleElements","animate","duration","ease","TextCardWithIcon","handleSlidesButtonClick","displayAs","py","px","AnimatePresence","initial","exit","ArrowLeft","TextWithTextCards","handleContactButtonClick","_slice$contact","contact","ContactArea","FORMAT_AS_HECTARE_CONFIG","unit","unitDisplay","maximumFractionDigits","FORMAT_AS_PERCENT_CONFIG","MapBoxStyle","CreditsAvailableBadge","_variants","CREDITS_AVAILABLE","NO_CREDITS_AVAILABLE","SOME_CREDITS_AVAILABLE","SOON_CREDITS_AVAILABLE","NextLink","Tag","ProjectGridCard","_project$thumbnail","_project$thumbnail2","_project$thumbnail3","_useContext","formatNumber","Container","my","friendlyName","area","location","certificationDate","year","Date","getFullYear","creditAvailability","TextWithCard","portfolioProject","projects","_slice$project","cardPosition","ProjectCard","footerSubTitle","footerTitle","columnGap","LinkCardsGrid","borderStyle","borderWidth","borderColor","transitionDuration","MEDIUM_TRANSITION_DURATION","_hover","minWidth","colors","dark","light","SmallHero","theme","gradient","tags","direction","justify","BlogItemContainer","ImageContainer","Blog","blogPosts","formatDate","sortedBlogPosts","blog_posts","sort","a","b","createdAt","getTime","spacingX","spacingY","blogPost","bp","category","teaser","DatePersonPair","date","person","author","ConditionalWrapper","condition","wrapper","ProjectsGrid","filteredProjects","passHref","legacyBehavior","mapboxStyle","getFpmProjectsByBbox","bbox","_bbox$split$map","west","south","east","north","split","Number","fpmResponse","mergeProjectData","featureCollection","features","feature","_feature$properties","properties","mapboxgl","accessToken","CtaCardType","FALLBACK_BBOX","ProjectsMap","mapContainer","animationIntervalRef","setFeatureCollection","isLoading","setIsLoading","initialBboxRef","_useState3","isMapReady","setIsMapReady","_useState4","setStrapiProjects","isBboxContained","innerBbox","outerBbox","_innerBbox$split$map","innerWest","innerSouth","innerEast","innerNorth","_outerBbox$split$map","fetchStrapiData","fetchProjectsData","_ref3","_callee2","fpmData","mergedData","_context2","finish","debouncedUpdateBbox","debounce","bounds","getBounds","newBbox","getWest","getSouth","getEast","getNorth","addProjectsLayer","isStyleLoaded","filteredFeatureCollection","isPublic","source","getSource","setData","addSource","cluster","clusterMaxZoom","clusterRadius","addLayer","paint","clearInterval","setInterval","now","pulseFactor","sin","PI","setPaintProperty","layout","fetch","svgText","modifiedSvg","replace","btoa","resolve","reject","onload","onerror","canvas","document","ctx","getContext","drawImage","pngImg","toDataURL","_map$current","_map$current2","addImage","pixelRatio","popup","Popup","closeButton","closeOnClick","className","offset","textContent","head","appendChild","on","getCanvas","coordinates","geometry","_e$features$0$propert","projectDeveloper","developer","_JSON$parse$name","_JSON$parse","JSON","parse","_unused","projectUrl","badgeColor","getBadgeColor","badgeMessage","getBadgeMessage","abs","lngLat","lng","setOffset","setLngLat","setHTML","addTo","_map$current3","_map$current4","queryRenderedFeatures","point","layers","clusterId","cluster_id","getClusterExpansionZoom","err","easeTo","center","initialCenter","initialZoom","defaultCenterCoordinates","defaultZoomLevel","longitude","latitude","LngLatBounds","getCenter","lat","container","maxZoom","addControl","NavigationControl","_map$current5","_bbox$split$map2","fitBounds","_map$current6","cancel","remove","_slice$defaultCenterC","navigator","geolocation","getCurrentPosition","userLoc","coords","lon","_map$current7","Video","youTubeID","frameBorder","allow","allowFullScreen","FullWidthHighlightQuote","quote","AvatarWithName","avatarWithName","orientation","SliderContainer","SliderInnerContainer","ItemContainer","aspectRatio","ALLOWED_RATIOS","getClosestRatio","ratio","minDiff","posMinDiff","forEach","allowedRatio","FullWidthImageSlider","imageRef","imageWidth","imageCount","noOfLines","fontSize","caption","SideBySideImages","EventType","STATES","paddingTagline","paddingTitle","buttonJustifyContent","textMarginLeft","textMarginRight","centerWithoutImage","centerWithImage","taglineColor","titleColor","subTitleColor","Cta","ctaCards","ctaCard","ctaCardType","CenterWithImage","CenterWithoutImage","Left","Right","getTypeOfCard","elevation","backgroundShape","marginLeft","marginRight","paddingX","fontFamily","fontWeight","lineHeight","CtaOnly","Glossary","copyToClipboard","useCopyToClipboard","grouped","copiedItem","setCopiedItem","glossary_items","localeCompare","curr","_curr$attributes$titl","at","toUpperCase","handleAnchorClick","_window","currentUrl","entries","letter","items","placeSelf","spacing","item","wordBreak","scrollMarginTop","Check","LinkIcon","_onClick","Divider","ShopCheckout","validateForm","values","errors","contributionValue","currency","shadow","badge","Badge","textTransform","whiteSpace","checkoutText","LabelNumberPair","label","number","pricePerKg","Formik","initialValues","initialContributionValue","validate","onSubmit","checkoutURL","URL","currentURL","searchParams","append","batchId","toString","pathname","couponId","touched","handleSubmit","summaryPrice","Form","Field","_ref4","BoemlyFormControl","inputProps","field","rightAddonsOrElements","InputRightAddon","isInvalid","errorMessage","minimumFractionDigits","taxInPercent","factKeyColor","factValueColor","Facts","fact","sortByCreatedAt","BlogCards","mobile","blogPostsToDisplay","_slice$blogPostCatego","blogPostCategory","_blogPost$attributes$","_slice$blogPostCatego2","_blogPost$attributes$2","calculateTaxIncludedValue","parseInt","contributionValueCurrency","isNaN","SmallCheckout","subtitle","contributionValueTons","setValues","_ref5","onChange","target","valueAsNumber","_ref6","ProjectInfo","amount","start","end","monthsDifference","yearsDifference","areaInM2","subtitles","LabelTextPair","areaSubtitle","locationSubtitle","month","startSubtitle","years","getMonth","timeSpanSubtitle","projectType","verificationStandard","projectTypeSubtitle","projectDeveloperSubtitle","defaultMessage","verificationStandardSubtitle","defaultIssuer","logoUrl","averageSellableAmountPerYear","riskBuffer","Tooltip","averageSellableAmountPerYearSubtitle","riskBufferSubtitle","DocumentsDownloadList","documentUrls","documentUrl","FilePdf","DownloadSimple","Contact","border","getFpmProjectById","projectId","ProjectFacts","enhancedProject","setEnhancedProject","fetchCompleteProjectData","mergedProject","customTitle","customSubtitle","customButton","contactTitle","contactText","contactButton","contactAvatar","CustomerCard","customerStory","borderTopRadius","cardImage","pt","customerCardCustomerIndustry","CustomerQuoteCard","customerName","quoteCardCustomerTitle","quoteCardQuote","LogoCard","marginY","CustomerStories","customerStories","customer_stories","cs","BULLET_POINT_VARIANTS","bulletPointColor","Icon","X","factColor","dividerColor","Comparison","comparisonCards","comparisonCard","factTitle","factSubtitle","lists","list","logoCount","LogoGrid","CarouselMarqueeBannerContent","_useWindowSize","hasEnoughLogosForLoop","logosToRender","from","emblaRef","useEmblaCarousel","loop","align","containScroll","dragFree","AutoScroll","playOnInit","speed","stopOnInteraction","stopOnMouseEnter","stopOnFocusIn","CarouselMarqueeBanner","showChild","setShowChild","Timeline","visibleItems","setVisibleItems","timelineItems","alignContent","gridTemplateColumns","backgroundShapes","prevVisibleItems","m","Sort","isSameDate","date1","date2","getDate","EventCard","_event$location$lengt","_event$location","_event$image","_event$image2","_event$image3","event","isExpanded","setIsExpanded","isLocationTooLong","recommended","Star","eventTypes","eventType","WEBINAR","Webcam","CONFERENCE","Headset","MEET_UP","UsersThree","FOREST_WALK","PersonSimpleWalk","PARTNER_EVENT","Handshake","LUNCH_AND_LEARN","BowlFood","FAIR","ChalkboardTeacher","FESTIVAL","Confetti","ROADSHOW","ProjectorScreenChart","Info","getEventIcon","languages","language","countryCode","char","String","fromCodePoint","charCodeAt","online","Laptop","MapPinLine","CalendarBlank","day","allDay","getUTCHours","minimumIntegerDigits","getUTCMinutes","substring","CaretUp","CaretDown","buttonVariant","speakers","speaker","useEvents","batchSize","_useSWRInfinite","useSWRInfinite","getKey","revalidateFirstPage","revalidateAll","setSize","mutate","count","_data$","meta","pagination","total","isLoadingMore","loadMore","canLoadMore","refetch","Events","eventTypeFilter","setEventTypeFilter","languageFilter","setLanguageFilter","NEWEST_FIRST","setSort","allEventTypeOptions","setAllEventTypeOptions","_useState5","allLanguageOptions","setAllLanguageOptions","toISOString","buildEventsUrl","startFilter","OLDEST_FIRST","search","getUpcomingKey","getPastKey","_useEvents","upcomingData","isLoadingUpcoming","isLoadingMoreUpcoming","canLoadMoreUpcoming","loadMoreUpcoming","_useEvents2","pastData","isLoadingPast","isLoadingMorePast","canLoadMorePast","loadMorePast","processEvents","_data$flatMap","_d$body","t","upcomingEvents","pastEvents","fetchAllOptions","events","allEventTypes","allLanguages","json","Set","_event$attributes","add","_event$attributes2","removeFilter","filterType","valueToRemove","upcomingTitle","upcomingDescription","filterSearch","Select","isMultiple","isSearchable","placeholder","searchPlaceholder","selected","option","BoemlyTag","isClosable","singleLanguage","placeItems","pastTitle","pastDescription","Redirect","router","redirectUrl","asPath","query","origin","mergedParams","URLSearchParams","absoluteSource","_Object$entries","_Object$entries$_i","startsWith","buildRedirectUrl","BoemlyAlert","_shareImage$url","_shareImage$alt","shareImage","_ref$metaTitleSuffix","metaTitleSuffix","_ref$favicon","favicon","_ref$domain","domain","schemaMarkup","shareImageUrl","shareImageAlt","schemas","isValidSchema","isArray","every","schemaArray","getSchemaKey","identifier","_offer$price","price","getSchemaIdentifier","dangerouslySetInnerHTML","__html","CustomSlice","slices","__component","context","global","post","blog","_post$attributes$meta","_post$attributes$meta2","_post$attributes$meta3","_global$attributes$me","_post$attributes$meta4","_post$attributes$meta5","_global$attributes$me2","_post$attributes","_post$attributes$meta6","_post$attributes$meta7","_post$attributes$meta8","_post$attributes$meta9","_post$attributes$meta10","_post$attributes$meta11","_global$attributes$me3","metaShareImageUrl","metadata","schemaMarkupTypes","returnBlog","returnProjects","headerType","extendable","headerNavMenus","navbar","navMenus","headerButtons","footerLinks","footer","banner","topBanner","isFallbackLocale","_customerStory$attrib","_customerStory$attrib2","_customerStory$attrib3","_customerStory$attrib4","_customerStory$attrib5","_customerStory$attrib6","_customerStory$attrib7","_customerStory$attrib8","_customerStory$attrib9","_customerStory$attrib10","_customerStory$attrib11","_customerStory$attrib12","returnCustomerStories","_page$attributes$meta","_page$attributes$meta2","_page$attributes$meta3","_page$attributes$meta4","_page$attributes$meta5","_page$attributes$meta6","_page$attributes","_page$attributes$slic","_page$attributes$slic2","_page$attributes$meta7","_page$attributes$meta8","_page$attributes$meta9","_page$attributes$meta10","_page$attributes$meta11","_page$attributes$meta12","returnBlogPosts","_project$attributes$m","_project$attributes$m2","_project$attributes$m3","_project$attributes$m4","_project$attributes$m5","_project$attributes","_project$attributes$s","_project$attributes$s2","_project$attributes$m6","_project$attributes$m7","_project$attributes$m8","_project$attributes$m9","_project$attributes$m10","_project$attributes$m11"],"mappings":"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"}