install swiper, start styling image gallery
This commit is contained in:
19
web/package-lock.json
generated
19
web/package-lock.json
generated
@ -21,6 +21,7 @@
|
|||||||
"react-dom": "^18",
|
"react-dom": "^18",
|
||||||
"react-intersection-observer": "^9.10.2",
|
"react-intersection-observer": "^9.10.2",
|
||||||
"sass": "^1.77.2",
|
"sass": "^1.77.2",
|
||||||
|
"swiper": "^11.1.3",
|
||||||
"urql": "^4.1.0"
|
"urql": "^4.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@ -8026,6 +8027,24 @@
|
|||||||
"tslib": "^2.0.3"
|
"tslib": "^2.0.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/swiper": {
|
||||||
|
"version": "11.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/swiper/-/swiper-11.1.3.tgz",
|
||||||
|
"integrity": "sha512-80MSxonyTxrGcaWj9YgvvhD8OG0B9/9IVZP33vhIEvyWvmKjnQDBieO+29wKvMx285sAtvZyrWBdkxaw6+D3aw==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "patreon",
|
||||||
|
"url": "https://www.patreon.com/swiperjs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "open_collective",
|
||||||
|
"url": "http://opencollective.com/swiper"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 4.7.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/tapable": {
|
"node_modules/tapable": {
|
||||||
"version": "2.2.1",
|
"version": "2.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
"react-dom": "^18",
|
"react-dom": "^18",
|
||||||
"react-intersection-observer": "^9.10.2",
|
"react-intersection-observer": "^9.10.2",
|
||||||
"sass": "^1.77.2",
|
"sass": "^1.77.2",
|
||||||
|
"swiper": "^11.1.3",
|
||||||
"urql": "^4.1.0"
|
"urql": "^4.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
@ -1,7 +1,16 @@
|
|||||||
|
"use client";
|
||||||
import { ImageSliderBlock as ImageSliderBlockType } from "@/gql/graphql";
|
import { ImageSliderBlock as ImageSliderBlockType } from "@/gql/graphql";
|
||||||
import Image from "../general/Image";
|
import Image from "../general/Image";
|
||||||
import styles from "./imageSliderBlock.module.scss";
|
import styles from "./imageSliderBlock.module.scss";
|
||||||
|
|
||||||
|
// import swiper modules & styles
|
||||||
|
import { Swiper, SwiperSlide } from "swiper/react";
|
||||||
|
import { Pagination, Navigation } from "swiper/modules";
|
||||||
|
import "swiper/css";
|
||||||
|
import "swiper/css/pagination";
|
||||||
|
import "swiper/css/navigation";
|
||||||
|
import "./swiper.scss";
|
||||||
|
|
||||||
export const ImageSliderBlock = ({
|
export const ImageSliderBlock = ({
|
||||||
block,
|
block,
|
||||||
}: {
|
}: {
|
||||||
@ -9,13 +18,32 @@ export const ImageSliderBlock = ({
|
|||||||
}) => {
|
}) => {
|
||||||
return (
|
return (
|
||||||
<div className={styles.imageSliderBlock}>
|
<div className={styles.imageSliderBlock}>
|
||||||
|
<Swiper
|
||||||
|
pagination={{
|
||||||
|
type: "fraction",
|
||||||
|
}}
|
||||||
|
navigation={true}
|
||||||
|
modules={[Pagination, Navigation]}
|
||||||
|
className="mySwiper"
|
||||||
|
>
|
||||||
{block.images &&
|
{block.images &&
|
||||||
block.images.map((imageItem: any) => (
|
block.images.map((imageItem: any, index: number) => (
|
||||||
<div key={imageItem.image.id}>
|
<SwiperSlide key={index}>
|
||||||
<div>{imageItem.image.url}</div>
|
<figure key={imageItem.image.id}>
|
||||||
<div>{imageItem.text}</div>
|
<Image
|
||||||
</div>
|
src={imageItem.image.url}
|
||||||
|
alt={imageItem.image.alt ?? ""}
|
||||||
|
width={imageItem.image.width}
|
||||||
|
height={imageItem.image.height}
|
||||||
|
// width={0}
|
||||||
|
// height={0}
|
||||||
|
// sizes="20vw"
|
||||||
|
/>
|
||||||
|
{imageItem.text && <figcaption>{imageItem.text}</figcaption>}
|
||||||
|
</figure>
|
||||||
|
</SwiperSlide>
|
||||||
))}
|
))}
|
||||||
|
</Swiper>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -0,0 +1,35 @@
|
|||||||
|
.imageSliderBlock {
|
||||||
|
height: 90vh;
|
||||||
|
background: var(--color-black);
|
||||||
|
color: var(--color-goldenBeige);
|
||||||
|
margin: calc(var(--spacing-sitepadding)*2) calc(var(--spacing-sitepadding)*-1);
|
||||||
|
|
||||||
|
figure {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: block;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
object-fit: contain;
|
||||||
|
min-height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
figcaption {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
max-width: var(--size-width-p);
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: .75rem 1rem;
|
||||||
|
font-size: var(--font-size-caption);
|
||||||
|
line-height: 1.4;
|
||||||
|
background: rgba(0, 0, 0, .6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -3,6 +3,7 @@
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
|
|
||||||
img {
|
img {
|
||||||
|
display: block;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
height: auto;
|
height: auto;
|
||||||
}
|
}
|
||||||
@ -11,7 +12,7 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: var(--size-width-p);
|
max-width: var(--size-width-p);
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
padding: .5rem 0 1rem;
|
padding: 1rem 0;
|
||||||
font-size: var(--font-size-caption);
|
font-size: var(--font-size-caption);
|
||||||
line-height: 1.4;
|
line-height: 1.4;
|
||||||
opacity: .8;
|
opacity: .8;
|
||||||
|
98
web/src/components/blocks/swiper.scss
Normal file
98
web/src/components/blocks/swiper.scss
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
.swiper {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper-slide {}
|
||||||
|
|
||||||
|
.swiper-button-next,
|
||||||
|
.swiper-button-prev {
|
||||||
|
&:before {
|
||||||
|
content: "→";
|
||||||
|
display: block;
|
||||||
|
padding: var(--spacing-sitepadding-inline);
|
||||||
|
font-size: var(--font-size-h3);
|
||||||
|
position: absolute;
|
||||||
|
color: var(--color-goldenBeige);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper-button-next {
|
||||||
|
&:before {
|
||||||
|
content: "→";
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
content: "Neste";
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper-button-prev {
|
||||||
|
&:before {
|
||||||
|
content: "←";
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
content: "Forrige";
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper-pagination {
|
||||||
|
padding-top: var(--spacing-sitepadding-inline);
|
||||||
|
padding-left: calc(var(--spacing-sitepadding-inline) + var(--size-col-1));
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: auto;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 1100px) {
|
||||||
|
|
||||||
|
.swiper-button-next,
|
||||||
|
.swiper-button-prev {
|
||||||
|
&:before {
|
||||||
|
padding: 1rem;
|
||||||
|
font-size: var(--font-size-h5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 800px) {
|
||||||
|
|
||||||
|
.swiper-button-next,
|
||||||
|
.swiper-button-prev {
|
||||||
|
bottom: 1rem;
|
||||||
|
top: auto;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
padding: 1rem;
|
||||||
|
font-size: var(--font-size-h5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper-pagination {
|
||||||
|
padding-top: 1.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper-slide {
|
||||||
|
|
||||||
|
figure {
|
||||||
|
width: 100vw;
|
||||||
|
height: 60vh;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
|
||||||
|
figcaption {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 5rem;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
width: 100%;
|
||||||
|
padding: 0 2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user