diff --git a/web/package-lock.json b/web/package-lock.json index 2188d98..fde2256 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -21,6 +21,7 @@ "react-dom": "^18", "react-intersection-observer": "^9.10.2", "sass": "^1.77.2", + "swiper": "^11.1.3", "urql": "^4.1.0" }, "devDependencies": { @@ -8026,6 +8027,24 @@ "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": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", diff --git a/web/package.json b/web/package.json index 3349c1d..7e509e0 100644 --- a/web/package.json +++ b/web/package.json @@ -23,6 +23,7 @@ "react-dom": "^18", "react-intersection-observer": "^9.10.2", "sass": "^1.77.2", + "swiper": "^11.1.3", "urql": "^4.1.0" }, "devDependencies": { diff --git a/web/src/components/blocks/ImageSliderBlock.tsx b/web/src/components/blocks/ImageSliderBlock.tsx index 9ba141b..d425d03 100644 --- a/web/src/components/blocks/ImageSliderBlock.tsx +++ b/web/src/components/blocks/ImageSliderBlock.tsx @@ -1,7 +1,16 @@ +"use client"; import { ImageSliderBlock as ImageSliderBlockType } from "@/gql/graphql"; import Image from "../general/Image"; 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 = ({ block, }: { @@ -9,13 +18,32 @@ export const ImageSliderBlock = ({ }) => { return (
- {block.images && - block.images.map((imageItem: any) => ( -
-
{imageItem.image.url}
-
{imageItem.text}
-
- ))} + + {block.images && + block.images.map((imageItem: any, index: number) => ( + +
+ {imageItem.image.alt + {imageItem.text &&
{imageItem.text}
} +
+
+ ))} +
); }; diff --git a/web/src/components/blocks/imageSliderBlock.module.scss b/web/src/components/blocks/imageSliderBlock.module.scss index e69de29..00597a5 100644 --- a/web/src/components/blocks/imageSliderBlock.module.scss +++ b/web/src/components/blocks/imageSliderBlock.module.scss @@ -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); + } + } +} \ No newline at end of file diff --git a/web/src/components/blocks/imageWithTextBlock.module.scss b/web/src/components/blocks/imageWithTextBlock.module.scss index f52524a..f01a36d 100644 --- a/web/src/components/blocks/imageWithTextBlock.module.scss +++ b/web/src/components/blocks/imageWithTextBlock.module.scss @@ -3,6 +3,7 @@ margin: 0; img { + display: block; max-width: 100%; height: auto; } @@ -11,7 +12,7 @@ width: 100%; max-width: var(--size-width-p); margin: 0 auto; - padding: .5rem 0 1rem; + padding: 1rem 0; font-size: var(--font-size-caption); line-height: 1.4; opacity: .8; diff --git a/web/src/components/blocks/swiper.scss b/web/src/components/blocks/swiper.scss new file mode 100644 index 0000000..bc4e972 --- /dev/null +++ b/web/src/components/blocks/swiper.scss @@ -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; + } + } + } +} \ No newline at end of file