foundry-component-library 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/lib/components/CaseStudyTeaser/styles.module.scss +1 -1
  2. package/lib/components/ContactTeaser/index.tsx +52 -15
  3. package/lib/components/ContactTeaser/styles.module.scss +23 -0
  4. package/lib/components/Container/styles.module.scss +1 -1
  5. package/lib/components/Footer/index.tsx +9 -3
  6. package/lib/components/Footer/styles.module.scss +6 -3
  7. package/lib/components/Header/index.tsx +8 -3
  8. package/lib/components/Header/styles.module.scss +5 -4
  9. package/lib/components/Hero/Video.tsx +43 -0
  10. package/lib/components/Hero/index.tsx +28 -19
  11. package/lib/components/Hero/styles.module.scss +12 -0
  12. package/lib/components/HubsAccordion/Hub.tsx +98 -82
  13. package/lib/components/HubsAccordion/styles.module.scss +4 -10
  14. package/lib/components/QuoteSection/index.tsx +27 -7
  15. package/lib/components/QuoteSection/styles.module.scss +13 -2
  16. package/lib/components/ServiceHubsTeaser/Tile.tsx +3 -21
  17. package/lib/components/ServiceHubsTeaser/index.tsx +38 -9
  18. package/lib/components/ServiceHubsTeaser/styles.module.scss +6 -0
  19. package/lib/components/TeamPhotos/Item.tsx +2 -2
  20. package/lib/components/TeamPhotos/styles.module.scss +2 -1
  21. package/lib/components/TextSection/index.tsx +5 -9
  22. package/lib/components/Tiles/Tile.tsx +2 -19
  23. package/lib/components/VideoTeaser/index.tsx +31 -83
  24. package/lib/components/VideoTeaser/styles.module.scss +3 -11
  25. package/lib/components/case/Content/styles.module.scss +7 -7
  26. package/lib/components/cases/Pagination/index.tsx +3 -5
  27. package/lib/queries/getAboutPage.ts +6 -0
  28. package/lib/queries/getCaseById.ts +3 -0
  29. package/lib/queries/getCaseBySlug.ts +3 -0
  30. package/lib/queries/getCasesPage.ts +3 -0
  31. package/lib/queries/getContactPage.ts +6 -0
  32. package/lib/queries/getHomePage.ts +6 -0
  33. package/lib/queries/getHubBySlug.ts +6 -0
  34. package/lib/queries/getHubsPage.ts +3 -0
  35. package/lib/queries/getNewsPage.ts +3 -0
  36. package/lib/queries/getPeoplePage.ts +6 -0
  37. package/lib/queries/getPerformanceHubPage.ts +6 -0
  38. package/lib/queries/getPostBySlug.ts +3 -0
  39. package/lib/types/index.ts +3 -0
  40. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { useState } from "react";
2
+ import { useState, useEffect } from "react";
3
3
  import styles from "./styles.module.scss";
4
4
  import Container from "../Container";
5
5
 
@@ -13,6 +13,20 @@ const QuoteSection = ({
13
13
  }[];
14
14
  }) => {
15
15
  const [active, setActive] = useState(0);
16
+ const [paused, setPaused] = useState(false);
17
+
18
+ useEffect(() => {
19
+ if (!items || items.length <= 1) return;
20
+
21
+ const interval = setInterval(() => {
22
+ if (!paused) {
23
+ setActive((prev) => (prev + 1) % items.length);
24
+ }
25
+ }, 3000);
26
+
27
+ return () => clearInterval(interval);
28
+ }, [items, paused]);
29
+
16
30
  if (!items || (items.length === 1 && !items[0].text)) return;
17
31
 
18
32
  return (
@@ -24,18 +38,24 @@ const QuoteSection = ({
24
38
  key={item?.name || i}
25
39
  className={`${styles.content} ${
26
40
  active === i ? styles.active : ""
27
- }`}
28
- >
41
+ }`}>
29
42
  <div className={styles.person}>
30
- <div className={styles.name}>{item.name}</div>
31
- <div className={styles.position}>{item.position}</div>
43
+ <div>
44
+ <div className={styles.name}>{item.name}</div>
45
+ <div className={styles.position}>{item.position}</div>
46
+ </div>
47
+ </div>
48
+ <div
49
+ className={styles.text}
50
+ onMouseEnter={() => setPaused(true)}
51
+ onMouseLeave={() => setPaused(false)}>
52
+ {item.text}
32
53
  </div>
33
- <div className={styles.text}>{item.text}</div>
34
54
  </div>
35
55
  );
36
56
  })}
37
57
  {items.length > 1 && (
38
- <div className={styles.indicators}>
58
+ <div className={`${styles.indicators} ${styles.desktop}}`}>
39
59
  {items.map((el, i) => {
40
60
  return (
41
61
  <div
@@ -63,6 +63,7 @@
63
63
 
64
64
  @media #{$QUERY-sm} {
65
65
  font-size: 14px;
66
+ min-height: 40px;
66
67
  }
67
68
  }
68
69
 
@@ -71,6 +72,7 @@
71
72
  width: 800px;
72
73
  max-width: 100%;
73
74
  font-family: $font-secondary;
75
+ min-height: 300px;
74
76
 
75
77
  @media screen and (max-width: $screen-md) {
76
78
  font-size: 25px;
@@ -78,15 +80,19 @@
78
80
 
79
81
  @media #{$QUERY-sm} {
80
82
  font-size: 16px;
83
+ min-height: 200px;
81
84
  }
82
85
  }
83
86
 
84
87
  .indicators {
85
88
  display: flex;
86
89
  align-items: center;
87
- justify-content: center;
90
+ justify-content: flex-start;
88
91
  gap: 16px;
89
- padding-top: 64px;
92
+
93
+ @media #{$QUERY-sm} {
94
+ padding-top: 30px;
95
+ }
90
96
  }
91
97
 
92
98
  .indicator {
@@ -96,6 +102,11 @@
96
102
  border-radius: 50%;
97
103
  cursor: pointer;
98
104
 
105
+ @media #{$QUERY-sm} {
106
+ width: 11px;
107
+ height: 11px;
108
+ }
109
+
99
110
  &.active {
100
111
  background-color: $color-pink;
101
112
  }
@@ -2,14 +2,12 @@ import { MouseEventHandler } from "react";
2
2
  import styles from "./styles.module.scss";
3
3
  import Plus from "../../assets/svg/plus.svg";
4
4
  import { NextLink } from "../../types";
5
- import { motion } from "framer-motion";
6
5
  import Arrow from "../../assets/svg/arrow.svg";
7
6
 
8
7
  const Tile = ({
9
8
  text,
10
9
  background,
11
10
  href,
12
- i,
13
11
  onClick,
14
12
  Link,
15
13
  hoverText,
@@ -23,28 +21,12 @@ const Tile = ({
23
21
  hoverText: string;
24
22
  }) => {
25
23
  return (
26
- <motion.div
27
- className={styles.tileWrapper}
28
- whileHover={{
29
- scale: 1.08,
30
- rotate: i % 2 === 0 ? -3 : 3,
31
- boxShadow: "0px 10px 20px rgba(0,0,0,0.2)",
32
- y: [0, Math.random() * 12 - 6, 0],
33
- transition: {
34
- y: {
35
- duration: 2,
36
- repeat: Infinity,
37
- ease: "easeInOut",
38
- },
39
- },
40
- }}
41
- >
24
+ <div className={styles.tileWrapper}>
42
25
  <Link
43
26
  href={href}
44
27
  onClick={onClick}
45
28
  draggable="false"
46
- className={`${styles.tile} ${styles[background]}`}
47
- >
29
+ className={`${styles.tile} ${styles[background]}`}>
48
30
  <div className={styles.face}>
49
31
  <div className={styles.text}>{text}</div>
50
32
  <div>
@@ -58,7 +40,7 @@ const Tile = ({
58
40
  </div>
59
41
  </div>
60
42
  </Link>
61
- </motion.div>
43
+ </div>
62
44
  );
63
45
  };
64
46
 
@@ -1,11 +1,13 @@
1
1
  "use client";
2
- import { useRef } from "react";
2
+ import { useRef, useEffect } from "react";
3
3
  import Container from "../Container";
4
4
  import styles from "./styles.module.scss";
5
5
  import TextSection from "../TextSection";
6
6
  import Tile from "./Tile";
7
7
  import { NextLink } from "../../types";
8
- import { motion } from "framer-motion";
8
+ import { motion, useScroll, useMotionValue, useSpring } from "framer-motion";
9
+
10
+ const SCROLL_DISTANCE = -500;
9
11
 
10
12
  const ServiceHubsTeaser = ({
11
13
  caption,
@@ -27,9 +29,32 @@ const ServiceHubsTeaser = ({
27
29
  }[];
28
30
  Link: NextLink;
29
31
  }) => {
30
- const wrapperRef = useRef(null);
32
+ const wrapperRef = useRef<HTMLDivElement>(null);
31
33
  const dragStarted = useRef(false);
32
34
 
35
+ const x = useMotionValue(0);
36
+
37
+ const smoothX = useSpring(x, {
38
+ stiffness: 120,
39
+ damping: 20,
40
+ mass: 0.1,
41
+ });
42
+
43
+ const { scrollYProgress } = useScroll({
44
+ target: wrapperRef,
45
+ offset: ["start end", "end start"],
46
+ });
47
+
48
+ useEffect(() => {
49
+ const unsubscribe = scrollYProgress.on("change", (latest) => {
50
+ const scrollOffset = latest * SCROLL_DISTANCE;
51
+ if (!dragStarted.current) {
52
+ x.set(scrollOffset);
53
+ }
54
+ });
55
+ return () => unsubscribe();
56
+ }, [scrollYProgress, x]);
57
+
33
58
  return (
34
59
  <div className={styles.benefits}>
35
60
  <TextSection caption={caption} heading={heading} text={text} isSmall />
@@ -39,18 +64,22 @@ const ServiceHubsTeaser = ({
39
64
  className={styles.tiles}
40
65
  drag="x"
41
66
  dragConstraints={wrapperRef}
67
+ style={{ x: smoothX }}
68
+ dragMomentum={true}
42
69
  onDragStart={() => (dragStarted.current = true)}
43
70
  onDragEnd={() => {
44
71
  setTimeout(() => {
45
72
  dragStarted.current = false;
46
73
  }, 0);
47
- }}
48
- >
74
+ }}>
49
75
  {tiles.map((tile, i) => {
50
- let background: "pink" | "yellow" | "brown" | "blue" = "pink";
51
- if (i % 4 === 1) background = "yellow";
52
- if (i % 4 === 2) background = "brown";
53
- if (i % 4 === 3) background = "blue";
76
+ const colors: Array<"pink" | "yellow" | "brown" | "blue"> = [
77
+ "pink",
78
+ "yellow",
79
+ "brown",
80
+ "blue",
81
+ ];
82
+ const background = colors[i % colors.length];
54
83
 
55
84
  return (
56
85
  <Tile
@@ -7,6 +7,7 @@
7
7
  .wrapper {
8
8
  width: 100%;
9
9
  // overflow-x: scroll;
10
+ user-select: none;
10
11
  }
11
12
 
12
13
  .tiles {
@@ -65,6 +66,10 @@
65
66
  height: 100%;
66
67
  font-family: $font-secondary;
67
68
 
69
+ path {
70
+ stroke: $color-brown;
71
+ }
72
+
68
73
  &.yellow {
69
74
  background-color: $color-yellow;
70
75
  color: $color-blue;
@@ -113,6 +118,7 @@
113
118
 
114
119
  .face {
115
120
  display: block;
121
+ font-size: 42px;
116
122
  }
117
123
 
118
124
  .tails {
@@ -11,9 +11,9 @@ const Item = ({ person, Image }: { person: Person; Image: NextImage }) => {
11
11
  <div
12
12
  className={styles.person}
13
13
  onMouseEnter={() => setIsHovered(true)}
14
- onMouseLeave={() => setIsHovered(false)}
15
- >
14
+ onMouseLeave={() => setIsHovered(false)}>
16
15
  <div className={styles.image}>
16
+ {video && <div>{video.sourceUrl}</div>}
17
17
  {image && (
18
18
  <Image
19
19
  src={isHovered && video ? video.sourceUrl : image.sourceUrl}
@@ -87,7 +87,8 @@
87
87
  }
88
88
 
89
89
  img {
90
- object-fit: contain;
90
+ object-fit: cover;
91
+ object-position: center;
91
92
  pointer-events: none;
92
93
  }
93
94
 
@@ -1,9 +1,6 @@
1
1
  "use client";
2
2
  import styles from "./styles.module.scss";
3
3
  import Container from "../Container";
4
- import PopInText from "../TextAnimations/PopInText";
5
- import WavyText from "../TextAnimations/WavyText";
6
- import FadeInText from "../TextAnimations/FadeInText";
7
4
 
8
5
  const TextSection = ({
9
6
  caption,
@@ -28,15 +25,14 @@ const TextSection = ({
28
25
  return (
29
26
  <Container>
30
27
  <div className={`${styles.section} ${alignStyle} ${themeStyle}`}>
31
- {caption && <PopInText className={styles.caption} text={caption} />}
28
+ {caption && <div className={styles.caption}>{caption}</div>}
32
29
  {heading && (
33
- <WavyText
34
- className={`${styles.heading} ${isSmall ? styles.small : ""}`}
35
- text={heading}
36
- />
30
+ <div className={`${styles.heading} ${isSmall ? styles.small : ""}`}>
31
+ {heading}
32
+ </div>
37
33
  )}
38
34
  {subheading && <div className={styles.subheading}>{subheading}</div>}
39
- {text && <FadeInText className={styles.text} text={text} />}
35
+ {text && <div className={styles.text}>{text}</div>}
40
36
  </div>
41
37
  </Container>
42
38
  );
@@ -1,12 +1,10 @@
1
1
  import styles from "./styles.module.scss";
2
2
  import Plus from "../../assets/svg/plus.svg";
3
- import { motion } from "framer-motion";
4
3
 
5
4
  const Tile = ({
6
5
  text,
7
6
  background,
8
7
  hoverText,
9
- i,
10
8
  }: {
11
9
  text: string;
12
10
  hoverText: string;
@@ -14,22 +12,7 @@ const Tile = ({
14
12
  i: number;
15
13
  }) => {
16
14
  return (
17
- <motion.div
18
- className={`${styles.tile} ${styles[background]}`}
19
- whileHover={{
20
- scale: 1.08,
21
- rotate: i % 2 === 0 ? -3 : 3,
22
- boxShadow: "0px 10px 20px rgba(0,0,0,0.2)",
23
- y: [0, Math.random() * 12 - 6, 0],
24
- transition: {
25
- y: {
26
- duration: 2,
27
- repeat: Infinity,
28
- ease: "easeInOut",
29
- },
30
- },
31
- }}
32
- >
15
+ <div className={`${styles.tile} ${styles[background]}`}>
33
16
  <div className={styles.face}>
34
17
  <div className={styles.text}>{text}</div>
35
18
  <div>
@@ -39,7 +22,7 @@ const Tile = ({
39
22
  <div className={styles.tails}>
40
23
  <div className={styles.tailsText}>{hoverText}</div>
41
24
  </div>
42
- </motion.div>
25
+ </div>
43
26
  );
44
27
  };
45
28
 
@@ -5,107 +5,55 @@ import styles from "./styles.module.scss";
5
5
  import Mute from "../../assets/svg/mute.svg";
6
6
  import Muted from "../../assets/svg/muted.svg";
7
7
  import PlayButton from "../../assets/svg/play-button.svg";
8
- import {
9
- motion,
10
- useScroll,
11
- useMotionValueEvent,
12
- useTransform,
13
- } from "motion/react";
14
8
  import Logo from "../../assets/svg/footer-logo.svg";
15
9
 
16
10
  function VideoTeaser({ url }: { url: string }) {
17
- const [playing, setPlaying] = useState(false);
18
- const [hasWindow, setHasWindow] = useState(false);
11
+ const [playing, setPlaying] = useState(true);
19
12
  const [isMuted, setIsMuted] = useState(true);
20
- const [isAnimated, setIsAnimated] = useState(false);
21
- const { scrollY } = useScroll();
22
- const [path, setPath] = useState(
23
- `polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%)`
24
- );
25
-
26
- const progress = useTransform(scrollY, [100, 300], [0, 1]);
13
+ const [hasWindow, setHasWindow] = useState(false);
27
14
 
28
- const lerp = (a: number, b: number, t: number) => {
29
- return a + (b - a) * t;
15
+ const handleClick = () => {
16
+ setPlaying(!playing);
30
17
  };
31
18
 
32
- useMotionValueEvent(scrollY, "change", () => {
33
- setPath(
34
- `polygon(
35
- ${lerp(50, 0, progress.get())}%
36
- ${lerp(50, 0, progress.get())}%,
37
- ${lerp(50, 100, progress.get())}%
38
- ${lerp(50, 0, progress.get())}%,
39
- ${lerp(50, 100, progress.get())}%
40
- ${lerp(50, 100, progress.get())}%,
41
- ${lerp(50, 0, progress.get())}%
42
- ${lerp(50, 100, progress.get())}%)`
43
- );
44
-
45
- if (progress.get() >= 1) {
46
- setIsAnimated(true);
47
- } else {
48
- setIsAnimated(false);
49
- }
50
- });
51
-
52
19
  useEffect(() => {
53
20
  if (typeof window !== "undefined") {
54
21
  setHasWindow(true);
55
22
  }
56
23
  }, []);
57
24
 
58
- const handleClick = () => {
59
- setPlaying(!playing);
60
- };
61
-
62
25
  if (!url) return;
63
26
 
64
27
  return (
65
28
  <>
66
- <div style={{ height: "1100px" }}>
67
- <div className={styles.logoWrapper}>
68
- <Logo />
69
- </div>
70
- <motion.div
71
- // eslint-disable-next-line no-extra-boolean-cast
72
- className={`${styles.wrapper} ${!!url ? styles.playCursor : ""} ${
73
- playing ? styles.playing : ""
74
- }`}
75
- style={{
76
- clipPath: path,
77
- }}
78
- >
79
- {/* <Mask isAnimated={isAnimated} setIsAnimated={setIsAnimated} /> */}
80
-
81
- <button
82
- className={styles.btnMute}
83
- onClick={() => setIsMuted(!isMuted)}
84
- >
85
- {isMuted ? <Muted /> : <Mute />}
86
- </button>
87
- <div className={styles.video} onClick={handleClick}>
88
- <div
89
- className={`${styles.playButton} ${
90
- playing ? styles.playing : ""
91
- } ${isAnimated ? styles.isAnimated : ""}`}
92
- >
93
- <PlayButton />
94
- </div>
95
- {hasWindow && (
96
- <ReactPlayer
97
- playing={playing}
98
- url={url}
99
- width="100%"
100
- height="100%"
101
- muted={isMuted}
102
- config={{
103
- file: { attributes: { poster: "/video-poster.jpg" } },
104
- }}
105
- />
106
- )}
29
+ <div className={styles.logoWrapper}>
30
+ <Logo />
31
+ </div>
32
+ <div
33
+ className={`${styles.wrapper} ${url ? styles.playCursor : ""} ${
34
+ playing ? styles.playing : ""
35
+ }`}>
36
+ <button className={styles.btnMute} onClick={() => setIsMuted(!isMuted)}>
37
+ {isMuted ? <Muted /> : <Mute />}
38
+ </button>
39
+ <div className={styles.video} onClick={handleClick}>
40
+ <div
41
+ className={`${styles.playButton} ${playing ? styles.playing : ""}`}>
42
+ <PlayButton />
107
43
  </div>
108
- </motion.div>
44
+ {hasWindow && (
45
+ <ReactPlayer
46
+ playing={playing}
47
+ url={url}
48
+ width="100%"
49
+ height="100%"
50
+ muted={isMuted}
51
+ config={{
52
+ file: { attributes: { poster: "/video-poster.jpg" } },
53
+ }}
54
+ />
55
+ )}
56
+ </div>
109
57
  </div>
110
58
  </>
111
59
  );
@@ -2,19 +2,16 @@
2
2
 
3
3
  .wrapper {
4
4
  background-color: $color-white;
5
- background-size: cover;
6
- background-position: center;
7
5
  width: 100%;
8
6
  height: 790px;
9
- max-height: calc(100vh - 75px);
7
+ max-height: calc(100vh - 79px);
10
8
  text-align: center;
11
9
  box-sizing: border-box;
12
10
  display: flex;
13
11
  align-items: center;
14
- position: sticky;
15
- top: 79px;
12
+ padding-top: 79px;
16
13
  overflow: hidden;
17
- clip-path: polygon(10% 5%, 90% 5%, 90% 95%, 10% 95%);
14
+ position: relative;
18
15
 
19
16
  @media #{$QUERY-md} {
20
17
  padding: 100px 50px;
@@ -90,11 +87,6 @@
90
87
  justify-content: center;
91
88
  cursor: pointer;
92
89
  transition: opacity 0.3s;
93
- opacity: 0;
94
-
95
- &.isAnimated {
96
- opacity: 1;
97
- }
98
90
 
99
91
  &.playing {
100
92
  opacity: 0;
@@ -33,13 +33,6 @@
33
33
  width: 620px;
34
34
  max-width: 100%;
35
35
  margin: 0 auto;
36
- }
37
-
38
- .text {
39
- max-width: 100%;
40
- min-height: 350px;
41
- font-size: 18px;
42
- line-height: 1.4;
43
36
 
44
37
  h1,
45
38
  h2,
@@ -58,6 +51,13 @@
58
51
  }
59
52
  }
60
53
 
54
+ .text {
55
+ max-width: 100%;
56
+ min-height: 350px;
57
+ font-size: 18px;
58
+ line-height: 1.4;
59
+ }
60
+
61
61
  .twoColumns {
62
62
  display: flex;
63
63
  justify-content: space-between;
@@ -23,7 +23,7 @@ const Pagination = ({
23
23
  const handleClick = (page: number) => {
24
24
  const params = new URLSearchParams(searchParams);
25
25
  params.set("page", String(page));
26
- router.push(`?${params.toString()}`, { scroll: false });
26
+ router.push(`?${params.toString()}`, { scroll: true });
27
27
  };
28
28
 
29
29
  return (
@@ -34,8 +34,7 @@ const Pagination = ({
34
34
  return (
35
35
  <span
36
36
  key={page + 1}
37
- className={`${styles.indicator} ${styles.current}`}
38
- >
37
+ className={`${styles.indicator} ${styles.current}`}>
39
38
  {page + 1}
40
39
  </span>
41
40
  );
@@ -47,8 +46,7 @@ const Pagination = ({
47
46
  className={styles.indicator}
48
47
  onClick={() => {
49
48
  handleClick(page + 1);
50
- }}
51
- >
49
+ }}>
52
50
  {page + 1}
53
51
  </button>
54
52
  );
@@ -64,6 +64,9 @@ type AboutPage = {
64
64
  };
65
65
  contactPage: {
66
66
  customFieldsContact: {
67
+ facebook: string;
68
+ instagram: string;
69
+ linkedin: string;
67
70
  berlinImage?: {
68
71
  sourceUrl: string;
69
72
  };
@@ -165,6 +168,9 @@ export default async function getAboutPage({
165
168
  }
166
169
  contactPage: page(id: "${contactPage}", idType: URI) {
167
170
  customFieldsContact {
171
+ facebook
172
+ instagram
173
+ linkedin
168
174
  berlinImage {
169
175
  sourceUrl
170
176
  }
@@ -232,6 +232,9 @@ export default async function getCaseBySlug({
232
232
  }
233
233
  contactPage: page(id: "${contactPage}", idType: URI) {
234
234
  customFieldsContact {
235
+ facebook
236
+ instagram
237
+ linkedin
235
238
  berlinImage {
236
239
  sourceUrl
237
240
  }
@@ -231,6 +231,9 @@ export default async function getCaseBySlug({
231
231
  }
232
232
  contactPage: page(id: "${contactPage}", idType: URI) {
233
233
  customFieldsContact {
234
+ facebook
235
+ instagram
236
+ linkedin
234
237
  berlinImage {
235
238
  sourceUrl
236
239
  }
@@ -164,6 +164,9 @@ export default async function getCasesPage({
164
164
  }
165
165
  contactPage: page(id: "${contactPage}", idType: URI) {
166
166
  customFieldsContact {
167
+ facebook
168
+ instagram
169
+ linkedin
167
170
  berlinImage {
168
171
  sourceUrl
169
172
  }
@@ -4,6 +4,9 @@ import client from "./client";
4
4
  export type ContactPage = {
5
5
  title: string;
6
6
  customFieldsContact: {
7
+ facebook: string;
8
+ instagram: string;
9
+ linkedin: string;
7
10
  topCaption: string;
8
11
  topHeading: string;
9
12
  berlinImage: {
@@ -57,6 +60,9 @@ export default async function getContactPage({
57
60
  page(id: $slug, idType: URI) {
58
61
  title
59
62
  customFieldsContact {
63
+ facebook
64
+ instagram
65
+ linkedin
60
66
  topCaption
61
67
  topHeading
62
68
  berlinImage {