feat: Add comprehensive documentation suite and reorganize project structure
- Created complete documentation in docs/ directory - Added PROJECT_OVERVIEW.md with feature highlights and getting started guide - Added ARCHITECTURE.md with system design and technical details - Added SECURITY.md with comprehensive security implementation guide - Added DEVELOPMENT.md with development workflows and best practices - Added DEPLOYMENT.md with production deployment instructions - Added API.md with complete REST API documentation - Added CONTRIBUTING.md with contribution guidelines - Added CHANGELOG.md with version history and migration notes - Reorganized all documentation files into docs/ directory for better organization - Updated README.md with proper documentation links and quick navigation - Enhanced project structure with professional documentation standards
This commit is contained in:
1
f_scripts/shared/swiper/modules/scrollbar/scrollbar-element.min.css
vendored
Normal file
1
f_scripts/shared/swiper/modules/scrollbar/scrollbar-element.min.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.swiper-scrollbar{border-radius:var(--swiper-scrollbar-border-radius,10px);position:relative;-ms-touch-action:none;background:var(--swiper-scrollbar-bg-color,rgba(0,0,0,.1))}.swiper-scrollbar-disabled>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-disabled{display:none!important}.swiper-horizontal>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-horizontal{position:absolute;left:var(--swiper-scrollbar-sides-offset,1%);bottom:var(--swiper-scrollbar-bottom,4px);top:var(--swiper-scrollbar-top,auto);z-index:50;height:var(--swiper-scrollbar-size,4px);width:calc(100% - 2 * var(--swiper-scrollbar-sides-offset,1%))}.swiper-scrollbar.swiper-scrollbar-vertical,.swiper-vertical>.swiper-scrollbar{position:absolute;left:var(--swiper-scrollbar-left,auto);right:var(--swiper-scrollbar-right,4px);top:var(--swiper-scrollbar-sides-offset,1%);z-index:50;width:var(--swiper-scrollbar-size,4px);height:calc(100% - 2 * var(--swiper-scrollbar-sides-offset,1%))}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:var(--swiper-scrollbar-drag-bg-color,rgba(0,0,0,.5));border-radius:var(--swiper-scrollbar-border-radius,10px);left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-scrollbar-lock{display:none}
|
||||
348
f_scripts/shared/swiper/modules/scrollbar/scrollbar.js
Normal file
348
f_scripts/shared/swiper/modules/scrollbar/scrollbar.js
Normal file
@@ -0,0 +1,348 @@
|
||||
import { getDocument } from 'ssr-window';
|
||||
import { createElement, elementOffset, nextTick } from '../../shared/utils.js';
|
||||
import createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';
|
||||
export default function Scrollbar({
|
||||
swiper,
|
||||
extendParams,
|
||||
on,
|
||||
emit
|
||||
}) {
|
||||
const document = getDocument();
|
||||
let isTouched = false;
|
||||
let timeout = null;
|
||||
let dragTimeout = null;
|
||||
let dragStartPos;
|
||||
let dragSize;
|
||||
let trackSize;
|
||||
let divider;
|
||||
extendParams({
|
||||
scrollbar: {
|
||||
el: null,
|
||||
dragSize: 'auto',
|
||||
hide: false,
|
||||
draggable: false,
|
||||
snapOnRelease: true,
|
||||
lockClass: 'swiper-scrollbar-lock',
|
||||
dragClass: 'swiper-scrollbar-drag',
|
||||
scrollbarDisabledClass: 'swiper-scrollbar-disabled',
|
||||
horizontalClass: `swiper-scrollbar-horizontal`,
|
||||
verticalClass: `swiper-scrollbar-vertical`
|
||||
}
|
||||
});
|
||||
swiper.scrollbar = {
|
||||
el: null,
|
||||
dragEl: null
|
||||
};
|
||||
function setTranslate() {
|
||||
if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
|
||||
const {
|
||||
scrollbar,
|
||||
rtlTranslate: rtl
|
||||
} = swiper;
|
||||
const {
|
||||
dragEl,
|
||||
el
|
||||
} = scrollbar;
|
||||
const params = swiper.params.scrollbar;
|
||||
const progress = swiper.params.loop ? swiper.progressLoop : swiper.progress;
|
||||
let newSize = dragSize;
|
||||
let newPos = (trackSize - dragSize) * progress;
|
||||
if (rtl) {
|
||||
newPos = -newPos;
|
||||
if (newPos > 0) {
|
||||
newSize = dragSize - newPos;
|
||||
newPos = 0;
|
||||
} else if (-newPos + dragSize > trackSize) {
|
||||
newSize = trackSize + newPos;
|
||||
}
|
||||
} else if (newPos < 0) {
|
||||
newSize = dragSize + newPos;
|
||||
newPos = 0;
|
||||
} else if (newPos + dragSize > trackSize) {
|
||||
newSize = trackSize - newPos;
|
||||
}
|
||||
if (swiper.isHorizontal()) {
|
||||
dragEl.style.transform = `translate3d(${newPos}px, 0, 0)`;
|
||||
dragEl.style.width = `${newSize}px`;
|
||||
} else {
|
||||
dragEl.style.transform = `translate3d(0px, ${newPos}px, 0)`;
|
||||
dragEl.style.height = `${newSize}px`;
|
||||
}
|
||||
if (params.hide) {
|
||||
clearTimeout(timeout);
|
||||
el.style.opacity = 1;
|
||||
timeout = setTimeout(() => {
|
||||
el.style.opacity = 0;
|
||||
el.style.transitionDuration = '400ms';
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
function setTransition(duration) {
|
||||
if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
|
||||
swiper.scrollbar.dragEl.style.transitionDuration = `${duration}ms`;
|
||||
}
|
||||
function updateSize() {
|
||||
if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
|
||||
const {
|
||||
scrollbar
|
||||
} = swiper;
|
||||
const {
|
||||
dragEl,
|
||||
el
|
||||
} = scrollbar;
|
||||
dragEl.style.width = '';
|
||||
dragEl.style.height = '';
|
||||
trackSize = swiper.isHorizontal() ? el.offsetWidth : el.offsetHeight;
|
||||
divider = swiper.size / (swiper.virtualSize + swiper.params.slidesOffsetBefore - (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));
|
||||
if (swiper.params.scrollbar.dragSize === 'auto') {
|
||||
dragSize = trackSize * divider;
|
||||
} else {
|
||||
dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);
|
||||
}
|
||||
if (swiper.isHorizontal()) {
|
||||
dragEl.style.width = `${dragSize}px`;
|
||||
} else {
|
||||
dragEl.style.height = `${dragSize}px`;
|
||||
}
|
||||
if (divider >= 1) {
|
||||
el.style.display = 'none';
|
||||
} else {
|
||||
el.style.display = '';
|
||||
}
|
||||
if (swiper.params.scrollbar.hide) {
|
||||
el.style.opacity = 0;
|
||||
}
|
||||
if (swiper.params.watchOverflow && swiper.enabled) {
|
||||
scrollbar.el.classList[swiper.isLocked ? 'add' : 'remove'](swiper.params.scrollbar.lockClass);
|
||||
}
|
||||
}
|
||||
function getPointerPosition(e) {
|
||||
return swiper.isHorizontal() ? e.clientX : e.clientY;
|
||||
}
|
||||
function setDragPosition(e) {
|
||||
const {
|
||||
scrollbar,
|
||||
rtlTranslate: rtl
|
||||
} = swiper;
|
||||
const {
|
||||
el
|
||||
} = scrollbar;
|
||||
let positionRatio;
|
||||
positionRatio = (getPointerPosition(e) - elementOffset(el)[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);
|
||||
positionRatio = Math.max(Math.min(positionRatio, 1), 0);
|
||||
if (rtl) {
|
||||
positionRatio = 1 - positionRatio;
|
||||
}
|
||||
const position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;
|
||||
swiper.updateProgress(position);
|
||||
swiper.setTranslate(position);
|
||||
swiper.updateActiveIndex();
|
||||
swiper.updateSlidesClasses();
|
||||
}
|
||||
function onDragStart(e) {
|
||||
const params = swiper.params.scrollbar;
|
||||
const {
|
||||
scrollbar,
|
||||
wrapperEl
|
||||
} = swiper;
|
||||
const {
|
||||
el,
|
||||
dragEl
|
||||
} = scrollbar;
|
||||
isTouched = true;
|
||||
dragStartPos = e.target === dragEl ? getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
wrapperEl.style.transitionDuration = '100ms';
|
||||
dragEl.style.transitionDuration = '100ms';
|
||||
setDragPosition(e);
|
||||
clearTimeout(dragTimeout);
|
||||
el.style.transitionDuration = '0ms';
|
||||
if (params.hide) {
|
||||
el.style.opacity = 1;
|
||||
}
|
||||
if (swiper.params.cssMode) {
|
||||
swiper.wrapperEl.style['scroll-snap-type'] = 'none';
|
||||
}
|
||||
emit('scrollbarDragStart', e);
|
||||
}
|
||||
function onDragMove(e) {
|
||||
const {
|
||||
scrollbar,
|
||||
wrapperEl
|
||||
} = swiper;
|
||||
const {
|
||||
el,
|
||||
dragEl
|
||||
} = scrollbar;
|
||||
if (!isTouched) return;
|
||||
if (e.preventDefault) e.preventDefault();else e.returnValue = false;
|
||||
setDragPosition(e);
|
||||
wrapperEl.style.transitionDuration = '0ms';
|
||||
el.style.transitionDuration = '0ms';
|
||||
dragEl.style.transitionDuration = '0ms';
|
||||
emit('scrollbarDragMove', e);
|
||||
}
|
||||
function onDragEnd(e) {
|
||||
const params = swiper.params.scrollbar;
|
||||
const {
|
||||
scrollbar,
|
||||
wrapperEl
|
||||
} = swiper;
|
||||
const {
|
||||
el
|
||||
} = scrollbar;
|
||||
if (!isTouched) return;
|
||||
isTouched = false;
|
||||
if (swiper.params.cssMode) {
|
||||
swiper.wrapperEl.style['scroll-snap-type'] = '';
|
||||
wrapperEl.style.transitionDuration = '';
|
||||
}
|
||||
if (params.hide) {
|
||||
clearTimeout(dragTimeout);
|
||||
dragTimeout = nextTick(() => {
|
||||
el.style.opacity = 0;
|
||||
el.style.transitionDuration = '400ms';
|
||||
}, 1000);
|
||||
}
|
||||
emit('scrollbarDragEnd', e);
|
||||
if (params.snapOnRelease) {
|
||||
swiper.slideToClosest();
|
||||
}
|
||||
}
|
||||
function events(method) {
|
||||
const {
|
||||
scrollbar,
|
||||
params
|
||||
} = swiper;
|
||||
const el = scrollbar.el;
|
||||
if (!el) return;
|
||||
const target = el;
|
||||
const activeListener = params.passiveListeners ? {
|
||||
passive: false,
|
||||
capture: false
|
||||
} : false;
|
||||
const passiveListener = params.passiveListeners ? {
|
||||
passive: true,
|
||||
capture: false
|
||||
} : false;
|
||||
if (!target) return;
|
||||
const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';
|
||||
target[eventMethod]('pointerdown', onDragStart, activeListener);
|
||||
document[eventMethod]('pointermove', onDragMove, activeListener);
|
||||
document[eventMethod]('pointerup', onDragEnd, passiveListener);
|
||||
}
|
||||
function enableDraggable() {
|
||||
if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
|
||||
events('on');
|
||||
}
|
||||
function disableDraggable() {
|
||||
if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
|
||||
events('off');
|
||||
}
|
||||
function init() {
|
||||
const {
|
||||
scrollbar,
|
||||
el: swiperEl
|
||||
} = swiper;
|
||||
swiper.params.scrollbar = createElementIfNotDefined(swiper, swiper.originalParams.scrollbar, swiper.params.scrollbar, {
|
||||
el: 'swiper-scrollbar'
|
||||
});
|
||||
const params = swiper.params.scrollbar;
|
||||
if (!params.el) return;
|
||||
let el;
|
||||
if (typeof params.el === 'string' && swiper.isElement) {
|
||||
el = swiper.el.shadowRoot.querySelector(params.el);
|
||||
}
|
||||
if (!el && typeof params.el === 'string') {
|
||||
el = document.querySelectorAll(params.el);
|
||||
} else if (!el) {
|
||||
el = params.el;
|
||||
}
|
||||
if (swiper.params.uniqueNavElements && typeof params.el === 'string' && el.length > 1 && swiperEl.querySelectorAll(params.el).length === 1) {
|
||||
el = swiperEl.querySelector(params.el);
|
||||
}
|
||||
if (el.length > 0) el = el[0];
|
||||
el.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
|
||||
let dragEl;
|
||||
if (el) {
|
||||
dragEl = el.querySelector(`.${swiper.params.scrollbar.dragClass}`);
|
||||
if (!dragEl) {
|
||||
dragEl = createElement('div', swiper.params.scrollbar.dragClass);
|
||||
el.append(dragEl);
|
||||
}
|
||||
}
|
||||
Object.assign(scrollbar, {
|
||||
el,
|
||||
dragEl
|
||||
});
|
||||
if (params.draggable) {
|
||||
enableDraggable();
|
||||
}
|
||||
if (el) {
|
||||
el.classList[swiper.enabled ? 'remove' : 'add'](swiper.params.scrollbar.lockClass);
|
||||
}
|
||||
}
|
||||
function destroy() {
|
||||
const params = swiper.params.scrollbar;
|
||||
const el = swiper.scrollbar.el;
|
||||
if (el) {
|
||||
el.classList.remove(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
|
||||
}
|
||||
disableDraggable();
|
||||
}
|
||||
on('init', () => {
|
||||
if (swiper.params.scrollbar.enabled === false) {
|
||||
// eslint-disable-next-line
|
||||
disable();
|
||||
} else {
|
||||
init();
|
||||
updateSize();
|
||||
setTranslate();
|
||||
}
|
||||
});
|
||||
on('update resize observerUpdate lock unlock', () => {
|
||||
updateSize();
|
||||
});
|
||||
on('setTranslate', () => {
|
||||
setTranslate();
|
||||
});
|
||||
on('setTransition', (_s, duration) => {
|
||||
setTransition(duration);
|
||||
});
|
||||
on('enable disable', () => {
|
||||
const {
|
||||
el
|
||||
} = swiper.scrollbar;
|
||||
if (el) {
|
||||
el.classList[swiper.enabled ? 'remove' : 'add'](swiper.params.scrollbar.lockClass);
|
||||
}
|
||||
});
|
||||
on('destroy', () => {
|
||||
destroy();
|
||||
});
|
||||
const enable = () => {
|
||||
swiper.el.classList.remove(swiper.params.scrollbar.scrollbarDisabledClass);
|
||||
if (swiper.scrollbar.el) {
|
||||
swiper.scrollbar.el.classList.remove(swiper.params.scrollbar.scrollbarDisabledClass);
|
||||
}
|
||||
init();
|
||||
updateSize();
|
||||
setTranslate();
|
||||
};
|
||||
const disable = () => {
|
||||
swiper.el.classList.add(swiper.params.scrollbar.scrollbarDisabledClass);
|
||||
if (swiper.scrollbar.el) {
|
||||
swiper.scrollbar.el.classList.add(swiper.params.scrollbar.scrollbarDisabledClass);
|
||||
}
|
||||
destroy();
|
||||
};
|
||||
Object.assign(swiper.scrollbar, {
|
||||
enable,
|
||||
disable,
|
||||
updateSize,
|
||||
setTranslate,
|
||||
init,
|
||||
destroy
|
||||
});
|
||||
}
|
||||
58
f_scripts/shared/swiper/modules/scrollbar/scrollbar.less
Normal file
58
f_scripts/shared/swiper/modules/scrollbar/scrollbar.less
Normal file
@@ -0,0 +1,58 @@
|
||||
:root {
|
||||
/*
|
||||
--swiper-scrollbar-border-radius: 10px;
|
||||
--swiper-scrollbar-top: auto;
|
||||
--swiper-scrollbar-bottom: 4px;
|
||||
--swiper-scrollbar-left: auto;
|
||||
--swiper-scrollbar-right: 4px;
|
||||
--swiper-scrollbar-sides-offset: 1%;
|
||||
--swiper-scrollbar-bg-color: rgba(0, 0, 0, 0.1);
|
||||
--swiper-scrollbar-drag-bg-color: rgba(0, 0, 0, 0.5);
|
||||
--swiper-scrollbar-size: 4px;
|
||||
*/
|
||||
}
|
||||
.swiper-scrollbar {
|
||||
border-radius: var(--swiper-scrollbar-border-radius, 10px);
|
||||
position: relative;
|
||||
-ms-touch-action: none;
|
||||
background: var(--swiper-scrollbar-bg-color, rgba(0, 0, 0, 0.1));
|
||||
.swiper-scrollbar-disabled > &,
|
||||
&.swiper-scrollbar-disabled {
|
||||
display: none !important;
|
||||
}
|
||||
.swiper-horizontal > &,
|
||||
&.swiper-scrollbar-horizontal {
|
||||
position: absolute;
|
||||
left: var(--swiper-scrollbar-sides-offset, 1%);
|
||||
bottom: var(--swiper-scrollbar-bottom, 4px);
|
||||
top: var(--swiper-scrollbar-top, auto);
|
||||
z-index: 50;
|
||||
height: var(--swiper-scrollbar-size, 4px);
|
||||
width: calc(100% - 2 * var(--swiper-scrollbar-sides-offset, 1%));
|
||||
}
|
||||
.swiper-vertical > &,
|
||||
&.swiper-scrollbar-vertical {
|
||||
position: absolute;
|
||||
left: var(--swiper-scrollbar-left, auto);
|
||||
right: var(--swiper-scrollbar-right, 4px);
|
||||
top: var(--swiper-scrollbar-sides-offset, 1%);
|
||||
z-index: 50;
|
||||
width: var(--swiper-scrollbar-size, 4px);
|
||||
height: calc(100% - 2 * var(--swiper-scrollbar-sides-offset, 1%));
|
||||
}
|
||||
}
|
||||
.swiper-scrollbar-drag {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
background: var(--swiper-scrollbar-drag-bg-color, rgba(0, 0, 0, 0.5));
|
||||
border-radius: var(--swiper-scrollbar-border-radius, 10px);
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
.swiper-scrollbar-cursor-drag {
|
||||
cursor: move;
|
||||
}
|
||||
.swiper-scrollbar-lock {
|
||||
display: none;
|
||||
}
|
||||
1
f_scripts/shared/swiper/modules/scrollbar/scrollbar.min.css
vendored
Normal file
1
f_scripts/shared/swiper/modules/scrollbar/scrollbar.min.css
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.swiper-scrollbar{border-radius:var(--swiper-scrollbar-border-radius,10px);position:relative;-ms-touch-action:none;background:var(--swiper-scrollbar-bg-color,rgba(0,0,0,.1))}.swiper-scrollbar-disabled>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-disabled{display:none!important}.swiper-horizontal>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-horizontal{position:absolute;left:var(--swiper-scrollbar-sides-offset,1%);bottom:var(--swiper-scrollbar-bottom,4px);top:var(--swiper-scrollbar-top,auto);z-index:50;height:var(--swiper-scrollbar-size,4px);width:calc(100% - 2 * var(--swiper-scrollbar-sides-offset,1%))}.swiper-scrollbar.swiper-scrollbar-vertical,.swiper-vertical>.swiper-scrollbar{position:absolute;left:var(--swiper-scrollbar-left,auto);right:var(--swiper-scrollbar-right,4px);top:var(--swiper-scrollbar-sides-offset,1%);z-index:50;width:var(--swiper-scrollbar-size,4px);height:calc(100% - 2 * var(--swiper-scrollbar-sides-offset,1%))}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:var(--swiper-scrollbar-drag-bg-color,rgba(0,0,0,.5));border-radius:var(--swiper-scrollbar-border-radius,10px);left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-scrollbar-lock{display:none}
|
||||
60
f_scripts/shared/swiper/modules/scrollbar/scrollbar.scss
Normal file
60
f_scripts/shared/swiper/modules/scrollbar/scrollbar.scss
Normal file
@@ -0,0 +1,60 @@
|
||||
@at-root {
|
||||
:root {
|
||||
/*
|
||||
--swiper-scrollbar-border-radius: 10px;
|
||||
--swiper-scrollbar-top: auto;
|
||||
--swiper-scrollbar-bottom: 4px;
|
||||
--swiper-scrollbar-left: auto;
|
||||
--swiper-scrollbar-right: 4px;
|
||||
--swiper-scrollbar-sides-offset: 1%;
|
||||
--swiper-scrollbar-bg-color: rgba(0, 0, 0, 0.1);
|
||||
--swiper-scrollbar-drag-bg-color: rgba(0, 0, 0, 0.5);
|
||||
--swiper-scrollbar-size: 4px;
|
||||
*/
|
||||
}
|
||||
}
|
||||
.swiper-scrollbar {
|
||||
border-radius: var(--swiper-scrollbar-border-radius, 10px);
|
||||
position: relative;
|
||||
-ms-touch-action: none;
|
||||
background: var(--swiper-scrollbar-bg-color, rgba(0, 0, 0, 0.1));
|
||||
.swiper-scrollbar-disabled > &,
|
||||
&.swiper-scrollbar-disabled {
|
||||
display: none !important;
|
||||
}
|
||||
.swiper-horizontal > &,
|
||||
&.swiper-scrollbar-horizontal {
|
||||
position: absolute;
|
||||
left: var(--swiper-scrollbar-sides-offset, 1%);
|
||||
bottom: var(--swiper-scrollbar-bottom, 4px);
|
||||
top: var(--swiper-scrollbar-top, auto);
|
||||
z-index: 50;
|
||||
height: var(--swiper-scrollbar-size, 4px);
|
||||
width: calc(100% - 2 * var(--swiper-scrollbar-sides-offset, 1%));
|
||||
}
|
||||
.swiper-vertical > &,
|
||||
&.swiper-scrollbar-vertical {
|
||||
position: absolute;
|
||||
left: var(--swiper-scrollbar-left, auto);
|
||||
right: var(--swiper-scrollbar-right, 4px);
|
||||
top: var(--swiper-scrollbar-sides-offset, 1%);
|
||||
z-index: 50;
|
||||
width: var(--swiper-scrollbar-size, 4px);
|
||||
height: calc(100% - 2 * var(--swiper-scrollbar-sides-offset, 1%));
|
||||
}
|
||||
}
|
||||
.swiper-scrollbar-drag {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
background: var(--swiper-scrollbar-drag-bg-color, rgba(0, 0, 0, 0.5));
|
||||
border-radius: var(--swiper-scrollbar-border-radius, 10px);
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
.swiper-scrollbar-cursor-drag {
|
||||
cursor: move;
|
||||
}
|
||||
.swiper-scrollbar-lock {
|
||||
display: none;
|
||||
}
|
||||
Reference in New Issue
Block a user