Set up home style and Splide carousel
This commit is contained in:
parent
750f457488
commit
9afaa44c4b
14 changed files with 222 additions and 232 deletions
5
assets/css/abstracts/_index.scss
Normal file
5
assets/css/abstracts/_index.scss
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
// --------------------------------------------------
|
||||||
|
// ABSTRACTS (INDEX)
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
@forward 'variables';
|
|
@ -1,6 +1,6 @@
|
||||||
// ----------------------------------------------------------------------------
|
// --------------------------------------------------
|
||||||
// VARIABLES
|
// VARIABLES
|
||||||
// ----------------------------------------------------------------------------
|
// --------------------------------------------------
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
|
|
80
assets/css/base/_base.scss
Normal file
80
assets/css/base/_base.scss
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
@use '../abstracts' as *;
|
||||||
|
|
||||||
|
// --------------------------------------------------
|
||||||
|
// BASE STYLE
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
// Fonts and colors
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: var(--text-font-family);
|
||||||
|
font-size: var(--text-font-size);
|
||||||
|
line-height: var(--text-line-height);
|
||||||
|
color: var(--black);
|
||||||
|
}
|
||||||
|
|
||||||
|
strong {
|
||||||
|
font-weight: var(--bold-font-weight);
|
||||||
|
}
|
||||||
|
|
||||||
|
em {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Link style
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: var(--black);
|
||||||
|
text-decoration: none;
|
||||||
|
transition: text-decoration 200ms ease-in-out;
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:focus,
|
||||||
|
&:active {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus-visible {
|
||||||
|
outline: 1px dashed var(--black);
|
||||||
|
outline-offset: 2px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// General layout
|
||||||
|
|
||||||
|
body {
|
||||||
|
min-height: 100vh !important;
|
||||||
|
|
||||||
|
header {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
|
||||||
|
.header__logo {
|
||||||
|
width: 5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main {}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: flex-end;
|
||||||
|
gap: 0.8rem;
|
||||||
|
|
||||||
|
.footer__link {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
width: var(--icon-size);
|
||||||
|
height: var(--icon-size);
|
||||||
|
|
||||||
|
svg {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
6
assets/css/base/_index.scss
Normal file
6
assets/css/base/_index.scss
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
// --------------------------------------------------
|
||||||
|
// BASE (INDEX)
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
@forward 'minireset';
|
||||||
|
@forward 'base';
|
|
@ -1,6 +1,6 @@
|
||||||
/* ----------------------------------------------------------------------------
|
/* --------------------------------------------------
|
||||||
MINIRESET V0.0.6
|
MINIRESET V0.0.6
|
||||||
---------------------------------------------------------------------------- */
|
-------------------------------------------------- */
|
||||||
|
|
||||||
html,
|
html,
|
||||||
body,
|
body,
|
|
@ -1,128 +1,7 @@
|
||||||
@use 'utils/minireset';
|
// --------------------------------------------------
|
||||||
@use '@splidejs/splide/dist/css/splide-core.min';
|
|
||||||
@use 'partials/variables' as *;
|
|
||||||
@use 'partials/animations';
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// GENERALITIES
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Fonts and colors
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: var(--text-font-family);
|
|
||||||
font-size: var(--text-font-size);
|
|
||||||
line-height: var(--text-line-height);
|
|
||||||
color: var(--black);
|
|
||||||
}
|
|
||||||
|
|
||||||
strong {
|
|
||||||
font-weight: var(--bold-font-weight);
|
|
||||||
}
|
|
||||||
|
|
||||||
em {
|
|
||||||
font-style: italic;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Link style
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: var(--black);
|
|
||||||
text-decoration: none;
|
|
||||||
transition: text-decoration 200ms ease-in-out;
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus,
|
|
||||||
&:active {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:focus-visible {
|
|
||||||
outline: 1px dashed var(--black);
|
|
||||||
outline-offset: 2px;
|
|
||||||
animation: expand-outline 200ms ease-in-out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// General layout
|
|
||||||
|
|
||||||
body {
|
|
||||||
min-height: 100vh;
|
|
||||||
overflow-x: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// MAIN
|
// MAIN
|
||||||
// ----------------------------------------------------------------------------
|
// --------------------------------------------------
|
||||||
|
|
||||||
// Home section
|
@use '@splidejs/splide/dist/css/splide-core.min';
|
||||||
|
@use "base" as *;
|
||||||
.home-section {
|
@use "pages" as *;
|
||||||
position: relative;
|
|
||||||
z-index: 1;
|
|
||||||
width: 100%;
|
|
||||||
min-height: 100vh;
|
|
||||||
padding: var(--sidebar-padding);
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: flex-start;
|
|
||||||
}
|
|
||||||
|
|
||||||
.social {
|
|
||||||
width: 100%;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
margin: 0.8rem 0 0 0;
|
|
||||||
|
|
||||||
&__link {
|
|
||||||
width: var(--icon-size);
|
|
||||||
height: var(--icon-size);
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
+ .social__link {
|
|
||||||
margin: 0 0 0 0.8rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
svg {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
&--white {
|
|
||||||
|
|
||||||
&:focus-visible {
|
|
||||||
outline: 1px dashed var(--white);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (min-width: $tablet-media-query) {
|
|
||||||
|
|
||||||
.social {
|
|
||||||
justify-content: flex-start;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (min-width: $desktop-media-query) {}
|
|
||||||
|
|
||||||
// Slider section
|
|
||||||
|
|
||||||
.slider-section {
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.splide {
|
|
||||||
|
|
||||||
&__image {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
object-fit: cover;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
58
assets/css/pages/_home.scss
Normal file
58
assets/css/pages/_home.scss
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
@use '../abstracts' as *;
|
||||||
|
|
||||||
|
// --------------------------------------------------
|
||||||
|
// HOME STYLE
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
.home {
|
||||||
|
|
||||||
|
.home__gallery {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
gap: 1rem;
|
||||||
|
|
||||||
|
.home__gallery-item {
|
||||||
|
display: table;
|
||||||
|
max-width: min(1280px, 100%);
|
||||||
|
|
||||||
|
.home__carousel {
|
||||||
|
|
||||||
|
&:where(.splide) {
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
.splide__track {
|
||||||
|
|
||||||
|
.splide__list {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.splide__slide {
|
||||||
|
transform: none !important;
|
||||||
|
|
||||||
|
&:not(.is-active) {
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.splide__image {
|
||||||
|
max-height: 80vh;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.home__main-image {
|
||||||
|
max-height: 80vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.home__image-caption {
|
||||||
|
display: table-caption;
|
||||||
|
caption-side: bottom;
|
||||||
|
width: fit-content;
|
||||||
|
margin: 0.5rem auto 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
5
assets/css/pages/_index.scss
Normal file
5
assets/css/pages/_index.scss
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
// --------------------------------------------------
|
||||||
|
// PAGES (INDEX)
|
||||||
|
// --------------------------------------------------
|
||||||
|
|
||||||
|
@forward 'home';
|
|
@ -1,9 +1,8 @@
|
||||||
// ----------------------------------------------------------------------------
|
// --------------------------------------------------
|
||||||
// KIRBY PANEL CUSTOMIZATION
|
// KIRBY PANEL CUSTOMIZATION
|
||||||
// ----------------------------------------------------------------------------
|
// --------------------------------------------------
|
||||||
|
|
||||||
// Image gallery structure field gallery
|
|
||||||
|
|
||||||
|
// Image gallery structure field
|
||||||
.k-field-name-image_gallery {
|
.k-field-name-image_gallery {
|
||||||
|
|
||||||
table {
|
table {
|
||||||
|
@ -16,7 +15,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
// CV writer field
|
// CV writer field
|
||||||
|
|
||||||
.k-field-name-cv {
|
.k-field-name-cv {
|
||||||
|
|
||||||
.k-text {
|
.k-text {
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// ANIMATIONS
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
@keyframes expand-outline {
|
|
||||||
0% {
|
|
||||||
outline-offset: 0;
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
outline-offset: 2px;
|
|
||||||
}
|
|
||||||
}
|
|
106
assets/js/app.js
106
assets/js/app.js
|
@ -5,81 +5,42 @@ import create from 'swiped-events';
|
||||||
// DATA
|
// DATA
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
// UTILS
|
// const body = document.body;
|
||||||
|
const homeCarousels = document.querySelectorAll('.home__carousel');
|
||||||
const body = document.body;
|
|
||||||
|
|
||||||
// SLIDER
|
|
||||||
|
|
||||||
const homeSection = document.querySelector('.home-section');
|
|
||||||
const sliderSection = document.querySelector('.slider-section');
|
|
||||||
let slider;
|
|
||||||
const slides = document.querySelectorAll('.splide__slide');
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// LOGIC
|
// LOGIC
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
// UTILS
|
|
||||||
|
|
||||||
// Enable CSS :active pseudo-class in Safari Mobile
|
|
||||||
function enableActivePseudoClass() {
|
|
||||||
document.addEventListener("touchstart", function() {},false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert rem to pixels by getting font-size CSS property
|
// Convert rem to pixels by getting font-size CSS property
|
||||||
function convertRemToPixels(rem) {
|
// function convertRemToPixels(rem) {
|
||||||
let fontSize = parseFloat(window.getComputedStyle(body).getPropertyValue('font-size'));
|
// let fontSize = parseFloat(window.getComputedStyle(body).getPropertyValue('font-size'));
|
||||||
return rem * fontSize;
|
// return rem * fontSize;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// SLIDER
|
// Set up multiple Splide carousels
|
||||||
|
function setUpCarousels() {
|
||||||
function setUpSlider() {
|
if (homeCarousels.length) {
|
||||||
if (sliderSection) {
|
homeCarousels.forEach((item) => {
|
||||||
slider = new Splide('.splide', {
|
// Create Splide instance
|
||||||
type: 'fade',
|
let slider = new Splide(item, {
|
||||||
rewind: true,
|
arrows: false,
|
||||||
rewindByDrag: true,
|
drag: true,
|
||||||
speed: 400,
|
easing: 'ease-in-out',
|
||||||
width: '100vw',
|
pagination: false,
|
||||||
height: '100vh',
|
rewind: true,
|
||||||
arrows: false,
|
rewindByDrag: true,
|
||||||
pagination: false,
|
role: 'undefined',
|
||||||
easing: 'ease-in-out',
|
speed: 250,
|
||||||
drag: true
|
type: 'fade',
|
||||||
});
|
width: 'auto',
|
||||||
}
|
});
|
||||||
}
|
// Mount slider
|
||||||
|
slider.mount();
|
||||||
function mountSlider() {
|
// Change slide on click
|
||||||
if (slider) {
|
slider.on('click', () => {
|
||||||
slider.mount();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function changeSlideOnClick() {
|
|
||||||
if (homeSection && slider) {
|
|
||||||
homeSection.addEventListener('click', function(e) {
|
|
||||||
if (!e.target.closest('.navigation__link') && !e.target.closest('.social__link')) {
|
|
||||||
if (e.clientX >= window.innerWidth / 2) {
|
|
||||||
slider.go('>');
|
|
||||||
} else {
|
|
||||||
slider.go('<');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function changeSlideOnSwipe() {
|
|
||||||
if (homeSection && slider) {
|
|
||||||
homeSection.addEventListener('swiped', function(e) {
|
|
||||||
if (e.detail.dir === 'left') {
|
|
||||||
slider.go('>');
|
slider.go('>');
|
||||||
} else if (e.detail.dir === 'right') {
|
});
|
||||||
slider.go('<');
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -88,13 +49,4 @@ function changeSlideOnSwipe() {
|
||||||
// PROGRAM
|
// PROGRAM
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
// UTILS
|
setUpCarousels();
|
||||||
|
|
||||||
enableActivePseudoClass();
|
|
||||||
|
|
||||||
// SLIDER
|
|
||||||
|
|
||||||
setUpSlider();
|
|
||||||
mountSlider();
|
|
||||||
changeSlideOnClick();
|
|
||||||
changeSlideOnSwipe();
|
|
||||||
|
|
6
public/icons/logo.svg
Normal file
6
public/icons/logo.svg
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<svg viewBox="0 0 3814 1912" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(1, 0, 0, -1, 1426.537109, 1153.771606)">
|
||||||
|
<path style="fill:none;stroke:#000;stroke-width:93.54299927;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" d="m 0,0 c -290.833,17.312 -697.633,-243.443 -961.355,-441.732 -463.22,-348.289 -491.716,-401.405 -327.464,98.265 42.11,128.104 133.935,713.436 134.825,1065.798 1.49,589.899 147.634,423.095 319.826,16.386 C -107.247,-978.225 558.099,-596.729 789.55,-160.404 800.123,-140.473 836,-55 836,-55 c 0,0 25.705,-95.875 94.192,-196.312 C 1081.909,-473.805 1640,-308 1770,-260 c 53.364,19.704 261,-145 571,-221"/>
|
||||||
|
<path style="fill:none;stroke:#fff;stroke-width:8.50399971;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" d="m 0,0 c -290.833,17.312 -697.633,-243.443 -961.355,-441.732 -463.22,-348.289 -491.716,-401.405 -327.464,98.265 42.11,128.104 133.935,713.436 134.825,1065.798 1.49,589.899 147.634,423.095 319.826,16.386 C -107.247,-978.225 558.099,-596.729 789.55,-160.404 800.123,-140.473 836,-55 836,-55 c 0,0 25.705,-95.875 94.192,-196.312 C 1081.909,-473.805 1640,-308 1770,-260 c 53.364,19.704 261,-145 571,-221"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
|
@ -32,6 +32,9 @@
|
||||||
|
|
||||||
{% block header %}
|
{% block header %}
|
||||||
<header>
|
<header>
|
||||||
|
<div class="header__logo">
|
||||||
|
{{ svg('icons/logo.svg') | raw }}
|
||||||
|
</div>
|
||||||
</header>
|
</header>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
|
@ -1,33 +1,43 @@
|
||||||
{% extends "base.twig" %}
|
{% extends "base.twig" %}
|
||||||
|
|
||||||
{% block main %}
|
{% block main %}
|
||||||
<main>
|
<main class="home">
|
||||||
|
|
||||||
<section class="gallery" aria-label="{{ site.title }}'s artwork gallery">
|
<section class="home__gallery"
|
||||||
|
aria-label="{{ site.title }}'s artwork gallery">
|
||||||
{% for galleryItem in galleryItems %}
|
{% for galleryItem in galleryItems %}
|
||||||
{% if galleryItem.main_image().isNotEmpty %}
|
{% if galleryItem.main_image().isNotEmpty %}
|
||||||
{% set mainImage = galleryItem.main_image().toFile() %}
|
{% set mainImage = galleryItem.main_image().toFile() %}
|
||||||
<figure class="gallery__item">
|
<figure class="home__gallery-item">
|
||||||
{% if galleryItem.related_image().isNotEmpty %}
|
{% if galleryItem.related_image().isNotEmpty %}
|
||||||
{% set relatedImage = galleryItem.related_image().toFile() %}
|
{% set relatedImage = galleryItem.related_image().toFile() %}
|
||||||
<div class="splide">
|
<div class="home__carousel splide">
|
||||||
<div class="splide__track">
|
<div class="splide__track">
|
||||||
<ul class="splide__list">
|
<ul class="splide__list">
|
||||||
<li class="splide__slide">
|
<li class="splide__slide">
|
||||||
<img class="splide__image" src="{{ mainImage.url }}" srcset="{{ mainImage.srcset() }}" alt="{{ mainImage.alt_text }}">
|
<img class="splide__image"
|
||||||
|
src="{{ mainImage.url }}"
|
||||||
|
srcset="{{ mainImage.srcset() }}"
|
||||||
|
alt="{{ mainImage.alt_text }}">
|
||||||
</li>
|
</li>
|
||||||
<li class="splide__slide">
|
<li class="splide__slide">
|
||||||
<img class="splide__image" src="{{ relatedImage.url }}" srcset="{{ relatedImage.srcset() }}" alt="{{ relatedImage.alt_text }}">
|
<img class="splide__image"
|
||||||
|
src="{{ relatedImage.url }}"
|
||||||
|
srcset="{{ relatedImage.srcset() }}"
|
||||||
|
alt="{{ relatedImage.alt_text }}">
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<img class="gallery__main-image" src="{{ mainImage.url }}" srcset="{{ mainImage.srcset() }}" alt="{{ mainImage.alt_text }}">
|
<img class="home__main-image"
|
||||||
|
src="{{ mainImage.url }}"
|
||||||
|
srcset="{{ mainImage.srcset() }}"
|
||||||
|
alt="{{ mainImage.alt_text }}">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if galleryItem.caption().isNotEmpty %}
|
{% if galleryItem.caption().isNotEmpty %}
|
||||||
{% set caption = galleryItem.caption() %}
|
{% set caption = galleryItem.caption() %}
|
||||||
<figcaption class="gallery__caption">{{ caption | raw }}</figcaption>
|
<figcaption class="home__image-caption">{{ caption | raw }}</figcaption>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</figure>
|
</figure>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue