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.
- package/lib/components/CaseStudyTeaser/styles.module.scss +1 -1
- package/lib/components/ContactTeaser/index.tsx +52 -15
- package/lib/components/ContactTeaser/styles.module.scss +23 -0
- package/lib/components/Container/styles.module.scss +1 -1
- package/lib/components/Footer/index.tsx +9 -3
- package/lib/components/Footer/styles.module.scss +6 -3
- package/lib/components/Header/index.tsx +8 -3
- package/lib/components/Header/styles.module.scss +5 -4
- package/lib/components/Hero/Video.tsx +43 -0
- package/lib/components/Hero/index.tsx +28 -19
- package/lib/components/Hero/styles.module.scss +12 -0
- package/lib/components/HubsAccordion/Hub.tsx +98 -82
- package/lib/components/HubsAccordion/styles.module.scss +4 -10
- package/lib/components/QuoteSection/index.tsx +27 -7
- package/lib/components/QuoteSection/styles.module.scss +13 -2
- package/lib/components/ServiceHubsTeaser/Tile.tsx +3 -21
- package/lib/components/ServiceHubsTeaser/index.tsx +38 -9
- package/lib/components/ServiceHubsTeaser/styles.module.scss +6 -0
- package/lib/components/TeamPhotos/Item.tsx +2 -2
- package/lib/components/TeamPhotos/styles.module.scss +2 -1
- package/lib/components/TextSection/index.tsx +5 -9
- package/lib/components/Tiles/Tile.tsx +2 -19
- package/lib/components/VideoTeaser/index.tsx +31 -83
- package/lib/components/VideoTeaser/styles.module.scss +3 -11
- package/lib/components/case/Content/styles.module.scss +7 -7
- package/lib/components/cases/Pagination/index.tsx +3 -5
- package/lib/queries/getAboutPage.ts +6 -0
- package/lib/queries/getCaseById.ts +3 -0
- package/lib/queries/getCaseBySlug.ts +3 -0
- package/lib/queries/getCasesPage.ts +3 -0
- package/lib/queries/getContactPage.ts +6 -0
- package/lib/queries/getHomePage.ts +6 -0
- package/lib/queries/getHubBySlug.ts +6 -0
- package/lib/queries/getHubsPage.ts +3 -0
- package/lib/queries/getNewsPage.ts +3 -0
- package/lib/queries/getPeoplePage.ts +6 -0
- package/lib/queries/getPerformanceHubPage.ts +6 -0
- package/lib/queries/getPostBySlug.ts +3 -0
- package/lib/types/index.ts +3 -0
- 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
|
|
31
|
-
|
|
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:
|
|
90
|
+
justify-content: flex-start;
|
|
88
91
|
gap: 16px;
|
|
89
|
-
|
|
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
|
-
<
|
|
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
|
-
</
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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}
|
|
@@ -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 && <
|
|
28
|
+
{caption && <div className={styles.caption}>{caption}</div>}
|
|
32
29
|
{heading && (
|
|
33
|
-
<
|
|
34
|
-
|
|
35
|
-
|
|
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 && <
|
|
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
|
-
<
|
|
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
|
-
</
|
|
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(
|
|
18
|
-
const [hasWindow, setHasWindow] = useState(false);
|
|
11
|
+
const [playing, setPlaying] = useState(true);
|
|
19
12
|
const [isMuted, setIsMuted] = useState(true);
|
|
20
|
-
const [
|
|
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
|
|
29
|
-
|
|
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
|
|
67
|
-
<
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
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 -
|
|
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
|
-
|
|
15
|
-
top: 79px;
|
|
12
|
+
padding-top: 79px;
|
|
16
13
|
overflow: hidden;
|
|
17
|
-
|
|
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:
|
|
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
|
}
|
|
@@ -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 {
|