UNPKG

@exadel/esl

Version:

Exadel Smart Library (ESL) is the lightweight custom elements library that provide a set of super-flexible components

288 lines (287 loc) 8.35 kB
:root { --esl-slide-initial-size: 100%; --esl-carousel-side-space: 5px; --esl-carousel-step-duration: 250ms; } esl-carousel { position: relative; display: block; max-width: 100%; box-sizing: content-box; margin: calc(var(--esl-carousel-side-space, 0) * -1); padding: var(--esl-carousel-side-space, 0); /* stylelint-disable */ overflow: hidden; overflow: clip; /* stylelint-enable */ } esl-carousel:not(.esl-carousel) [esl-carousel-slide] { max-width: 100%; max-height: 100%; } esl-carousel.esl-carousel-vertical { touch-action: pan-x; } esl-carousel.esl-carousel-vertical [esl-carousel-slides] { flex-direction: column; } esl-carousel.esl-carousel-horizontal { touch-action: pan-y; } esl-carousel.esl-carousel-horizontal [esl-carousel-slides] { flex-direction: row; } esl-carousel[dragging] { cursor: grabbing; } esl-carousel[animating] { padding-inline: 0; margin-inline: 0; } esl-carousel[dragging] [esl-carousel-slides], esl-carousel[animating] [esl-carousel-slides] { user-select: none; pointer-events: none; } esl-carousel[empty] { --esl-carousel-side-space: 0; } esl-carousel[empty] [esl-carousel-slides] { display: none; } /* Default carousel area styles */ [esl-carousel-slides] { position: relative; width: 100%; margin: 0; display: flex; gap: 20px; z-index: 0; transform: translate3d(0px, 0px, 0px); } /* Default carousel slide styles */ [esl-carousel-slide] { flex: 0 0 auto; margin: 0; padding: 0; position: relative; z-index: 1; list-style: none; } .esl-carousel-no-extra-space { --esl-carousel-side-space: 0; } .esl-carousel-default-renderer [esl-carousel-slides] { display: flex; flex-wrap: nowrap; transition: none; max-width: 100%; max-height: 100%; } .esl-carousel-default-renderer.esl-carousel-horizontal [esl-carousel-slide] { width: var(--esl-slide-size, var(--esl-slide-initial-size)); } .esl-carousel-default-renderer.esl-carousel-vertical [esl-carousel-slide] { height: var(--esl-slide-size, var(--esl-slide-initial-size)); } .esl-carousel-grid-renderer { /* stylelint-disable-next-line */ /* stylelint-disable-next-line */ } .esl-carousel-grid-renderer [esl-carousel-slides] { display: grid; grid-template-rows: 1fr 1fr; grid-auto-columns: auto; grid-auto-flow: column; transition: none; max-width: 100%; max-height: 100%; } .esl-carousel-grid-renderer.esl-carousel-vertical [esl-carousel-slides] { grid-template-columns: 1fr 1fr; grid-auto-rows: auto; grid-auto-flow: row; } .esl-carousel-grid-renderer.esl-carousel-horizontal :is([esl-carousel-slide], [esl-carousel-fake-slide]) { width: var(--esl-slide-size, --esl-slide-initial-size, 100%); } .esl-carousel-grid-renderer.esl-carousel-vertical :is([esl-carousel-slide], [esl-carousel-fake-slide]) { height: var(--esl-slide-size, --esl-slide-initial-size, 100%); } .esl-carousel-css-renderer [esl-carousel-slides] { display: grid; grid-template-areas: 'slide'; position: relative; width: 100%; } .esl-carousel-css-renderer [esl-carousel-slide] { grid-area: slide; z-index: 0; position: relative; backface-visibility: hidden; top: 100%; visibility: hidden; } .esl-carousel-css-renderer [esl-carousel-slide]:is([active], [pre-active]) { top: 0; visibility: visible; } .esl-carousel-css-renderer [esl-carousel-slide][active] { z-index: 1; } .esl-carousel-css-renderer.esl-carousel-css-fade[animating] [esl-carousel-slide] { transition: opacity var(--esl-carousel-step-duration) linear; } .esl-carousel-css-renderer.esl-carousel-css-fade [esl-carousel-slide] { opacity: 0; } .esl-carousel-css-renderer.esl-carousel-css-fade [esl-carousel-slide][active] { opacity: 1; } .esl-carousel-css-renderer.esl-carousel-css-fade[animating] [esl-carousel-slide][pre-active] { z-index: 2; opacity: 1; } .esl-carousel-css-renderer.esl-carousel-css-fade[shifted] [esl-carousel-slide][pre-active] { z-index: 2; opacity: var(--esl-carousel-offset-ratio, 0); } .esl-carousel-css-renderer.esl-carousel-css-slide[animating] :is([esl-carousel-slide], [esl-carousel-slides]) { transition: transform var(--esl-carousel-step-duration) linear; } .esl-carousel-css-renderer.esl-carousel-css-slide.esl-carousel-horizontal [esl-carousel-slides] { transform: translate3d(var(--esl-carousel-offset, 0), 0, 0); } .esl-carousel-css-renderer.esl-carousel-css-slide.esl-carousel-horizontal [esl-carousel-slides].forward { transform: translate3d(-100%, 0, 0); } .esl-carousel-css-renderer.esl-carousel-css-slide.esl-carousel-horizontal [esl-carousel-slides].backward { transform: translate3d(100%, 0, 0); } .esl-carousel-css-renderer.esl-carousel-css-slide.esl-carousel-horizontal [esl-carousel-slide] { top: 0; left: 100%; } .esl-carousel-css-renderer.esl-carousel-css-slide.esl-carousel-horizontal [esl-carousel-slide][pre-active][next] { left: 100%; } .esl-carousel-css-renderer.esl-carousel-css-slide.esl-carousel-horizontal [esl-carousel-slide][active] { left: 0; } .esl-carousel-css-renderer.esl-carousel-css-slide.esl-carousel-horizontal [esl-carousel-slide][pre-active][prev] { left: -100%; } .esl-carousel-css-renderer.esl-carousel-css-slide.esl-carousel-vertical [esl-carousel-slides] { transform: translate3d(0, var(--esl-carousel-offset, 0), 0); } .esl-carousel-css-renderer.esl-carousel-css-slide.esl-carousel-vertical [esl-carousel-slides].forward { transform: translate3d(0, -100%, 0); } .esl-carousel-css-renderer.esl-carousel-css-slide.esl-carousel-vertical [esl-carousel-slides].backward { transform: translate3d(0, 100%, 0); } .esl-carousel-css-renderer.esl-carousel-css-slide.esl-carousel-vertical [esl-carousel-slide][pre-active][next] { top: 100%; } .esl-carousel-css-renderer.esl-carousel-css-slide.esl-carousel-vertical [esl-carousel-slide][active] { top: 0; } .esl-carousel-css-renderer.esl-carousel-css-slide.esl-carousel-vertical [esl-carousel-slide][pre-active][prev] { top: -100%; } /** Nav control mixin defaults */ [esl-carousel-nav]:not([active]) { display: none; } [esl-carousel-nav][disabled] { pointer-events: none; } :root { --esl-carousel-arrow-size: 40px; --esl-carousel-arrow-padding: 0px; --esl-carousel-arrow-bg: grey; } /** Arrow navigation styles */ .esl-carousel-nav-container { position: relative; /* stylelint-disable-next-line */ --esl-carousel-arrow-offset: calc((var(--esl-carousel-arrow-size) + var(--esl-carousel-arrow-padding) + var(--esl-carousel-side-space)) * -1); } .esl-carousel-arrow { position: absolute; z-index: 3; top: 50%; transform: translateY(-50%); padding: var(--esl-carousel-arrow-padding); display: grid; place-content: center; background: none; border: none; cursor: pointer; appearance: none; filter: drop-shadow(0 0 4px var(--esl-carousel-arrow-bg)); opacity: 0.75; } .esl-carousel-arrow:hover { opacity: 1; } .esl-carousel-arrow[disabled] { opacity: 0.25; } .esl-carousel-arrow.prev { left: var(--esl-carousel-arrow-offset); } .esl-carousel-arrow.prev.inner { left: 0; } .esl-carousel-arrow.next { right: var(--esl-carousel-arrow-offset); } .esl-carousel-arrow.next.inner { right: 0; } .esl-carousel-arrow::before { content: ''; display: block; width: var(--esl-carousel-arrow-size); height: var(--esl-carousel-arrow-size); background: var(--esl-carousel-arrow-bg); clip-path: polygon(20% 50%, 70% 0%, 80% 5%, 35% 50%, 80% 95%, 70% 100%); } .esl-carousel-arrow.next::before { transform: scaleX(-1); } /* ESLCarouselNavDots default styles */ .esl-carousel-dots { display: flex; align-items: center; width: fit-content; gap: 0.5rem; margin: 1rem auto; } .esl-carousel-dots:empty { display: none; } .esl-carousel-dot { margin: 0; padding: 0; flex: 0 0 auto; min-width: 9px; box-sizing: content-box; aspect-ratio: 1; border-radius: 100%; text-align: center; vertical-align: middle; cursor: pointer; appearance: none; } .esl-carousel-dot:is(*, :focus, :active, :hover) { border: var(--esl-carousel-dot-border, 1px solid transparent); background: var(--esl-carousel-dot-color, rgba(118, 118, 118, 0.5)); background-clip: content-box; } .esl-carousel-dot[active] { border: var(--esl-carousel-dot-active-border, 1px solid #bababa); background: var(--esl-carousel-dot-active-color, rgba(255, 255, 255, 0.5)); background-clip: content-box; }