xtendui
Version:
Xtend UI is a powerful frontend library of Tailwind CSS components enhanced by vanilla js. It helps you build interfaces with advanced interactions and animations.
135 lines (121 loc) • 2.67 kB
JavaScript
/*!
* Xtend UI (https://xtendui.github.io/xtendui/)
* @copyright (c) 2017-2026 Riccardo Caroli
* @license MIT (https://github.com/xtendui/xtendui/blob/master/LICENSE.txt)
*/
import { Xt } from './xt.mjs'
import './toggle.mjs'
import RJSON from 'relaxed-json'
Xt.JSON = RJSON
/**
* Slider
*/
class Slider extends Xt.Toggle {
/**
* constructor
* @param {Node|HTMLElement|EventTarget|Window} object Base node
* @param {Object} optionsCustom User options
* @constructor
*/
constructor(object, optionsCustom = {}) {
super(object, optionsCustom)
}
}
//
// options
//
Slider.constructorName = 'Slider'
Slider.componentName = 'xt-slider'
Slider.optionsDefault = {
// slider
mode: 'relative',
group: false,
groupSame: true,
align: 'center',
contain: true,
wrap: false,
free: false,
dragposition: false,
nooverflow: '!transform-none justify-center',
autoHeight: false,
keepHeight: false,
pagination: '[data-xt-slider-pagination]',
hideDisable: '[data-xt-slider-pagination], [data-xt-nav], [data-xt-slider-hide-disabled]',
drag: {
dragger: '[data-xt-slider-dragger]',
threshold: 30,
factor: 1,
overflow: ({ overflow }) => {
return Math.min(overflow, Math.log(1 + Math.pow(overflow, 10)))
},
noMouse: false,
},
// element
elementsTemplate: 'hidden',
elements: '[data-xt-slider-element]',
targets: '[data-xt-slider-target]',
// quantity
min: 1,
max: 1,
// event
on: 'click',
off: 'click',
mouseParent: false,
// timing
queue: false,
// other
noobserver: false,
visibleReinit: true,
jump: false,
navigation: '[data-xt-nav]',
zIndex: {
targets: {
start: 200, // same as options.zIndex.targets.start
factor: -1,
},
},
a11y: {
role: 'carousel',
labelElements: false,
labelTargets: true,
hiddenTargets: false,
controls: true,
selected: false,
expanded: false,
hidden: true,
live: true,
disabled: true,
keyboard: true,
vertical: false,
items: false,
},
}
//
// export
//
Xt.Slider = Slider
//
// observe
//
if (typeof window !== 'undefined') {
Xt.mount({
matches: `[data-${Xt.Slider.componentName}]`,
mount: ({ ref }) => {
// vars
const optionsMarkup = ref.getAttribute(`data-${Xt.Slider.componentName}`)
const options = optionsMarkup ? RJSON.parse(optionsMarkup) : {}
// init
let selfDestroy = () => {}
new Xt.Slider(ref, options).then(self => {
selfDestroy = () => {
self.destroy()
self = null
}
})
// unmount
return () => {
selfDestroy()
}
},
})
}