From c349069311626477a42cfc26dd66c13812faafe1 Mon Sep 17 00:00:00 2001 From: Teemu Suoranta Date: Fri, 23 Feb 2024 07:51:18 +0200 Subject: [PATCH] Separate core and plugins into separate files --- dist/arrows.esm.js | 74 + dist/arrows.min.js | 1 + dist/core/details.esm.js | 34 + dist/core/details.js | 34 + dist/core/details.min.js | 1 + dist/core/slider.esm.js | 218 ++ dist/core/slider.js | 218 ++ dist/core/slider.min.js | 1 + dist/core/utils.esm.js | 22 + dist/core/utils.js | 22 + dist/core/utils.min.js | 1 + dist/dots.esm.js | 99 + dist/dots.min.js | 1 + dist/drag-scrolling.esm.js | 72 + dist/drag-scrolling.min.js | 1 + dist/index.esm.js | 705 +---- dist/index.js | 725 +---- dist/index.min.js | 3 +- dist/overflow-slider.esm.js | 25 + dist/overflow-slider.js | 25 + dist/overflow-slider.min.js | 1 + dist/plugins/arrows.esm.js | 74 + dist/plugins/arrows.js | 74 + dist/plugins/arrows.min.js | 1 + dist/plugins/core/utils.esm.js | 9 + dist/plugins/core/utils.js | 9 + dist/plugins/core/utils.min.js | 1 + dist/plugins/dots.esm.js | 99 + dist/plugins/dots.js | 99 + dist/plugins/dots.min.js | 1 + dist/plugins/drag-scrolling.esm.js | 72 + dist/plugins/drag-scrolling.js | 72 + dist/plugins/drag-scrolling.min.js | 1 + dist/plugins/scroll-indicator.esm.js | 133 + dist/plugins/scroll-indicator.js | 133 + dist/plugins/scroll-indicator.min.js | 1 + dist/plugins/skip-links.esm.js | 42 + dist/plugins/skip-links.js | 42 + dist/plugins/skip-links.min.js | 1 + dist/scroll-indicator.esm.js | 133 + dist/scroll-indicator.min.js | 1 + dist/skip-links.esm.js | 42 + dist/skip-links.min.js | 1 + docs/assets/demo.js | 23 +- docs/dist/arrows.esm.js | 74 + docs/dist/arrows.min.js | 1 + docs/dist/core/details.esm.js | 34 + docs/dist/core/details.js | 34 + docs/dist/core/details.min.js | 1 + docs/dist/core/slider.esm.js | 218 ++ docs/dist/core/slider.js | 218 ++ docs/dist/core/slider.min.js | 1 + docs/dist/core/utils.esm.js | 22 + docs/dist/core/utils.js | 22 + docs/dist/core/utils.min.js | 1 + docs/dist/dots.esm.js | 99 + docs/dist/dots.min.js | 1 + docs/dist/drag-scrolling.esm.js | 72 + docs/dist/drag-scrolling.min.js | 1 + docs/dist/index.esm.js | 1 + docs/dist/index.esm.min.js | 2 + docs/dist/index.js | 6 + docs/dist/index.min.js | 1 + docs/dist/overflow-slider.esm.js | 683 +---- docs/dist/overflow-slider.js | 25 + docs/dist/overflow-slider.min.js | 1 + docs/dist/plugins/arrows.esm.js | 74 + docs/dist/plugins/arrows.js | 74 + docs/dist/plugins/arrows.min.js | 1 + docs/dist/plugins/core/utils.esm.js | 9 + docs/dist/plugins/core/utils.js | 9 + docs/dist/plugins/core/utils.min.js | 1 + docs/dist/plugins/dots.esm.js | 99 + docs/dist/plugins/dots.js | 99 + docs/dist/plugins/dots.min.js | 1 + docs/dist/plugins/drag-scrolling.esm.js | 72 + docs/dist/plugins/drag-scrolling.js | 72 + docs/dist/plugins/drag-scrolling.min.js | 1 + docs/dist/plugins/scroll-indicator.esm.js | 133 + docs/dist/plugins/scroll-indicator.js | 133 + docs/dist/plugins/scroll-indicator.min.js | 1 + docs/dist/plugins/skip-links.esm.js | 42 + docs/dist/plugins/skip-links.js | 42 + docs/dist/plugins/skip-links.min.js | 1 + docs/dist/scroll-indicator.esm.js | 133 + docs/dist/scroll-indicator.min.js | 1 + docs/dist/skip-links.esm.js | 42 + docs/dist/skip-links.min.js | 1 + package-lock.json | 3406 +++++++++++---------- package.json | 13 +- rollup.config.js | 90 +- src/index.ts | 11 - tsconfig.json | 16 +- 93 files changed, 5595 insertions(+), 3847 deletions(-) create mode 100644 dist/arrows.esm.js create mode 100644 dist/arrows.min.js create mode 100644 dist/core/details.esm.js create mode 100644 dist/core/details.js create mode 100644 dist/core/details.min.js create mode 100644 dist/core/slider.esm.js create mode 100644 dist/core/slider.js create mode 100644 dist/core/slider.min.js create mode 100644 dist/core/utils.esm.js create mode 100644 dist/core/utils.js create mode 100644 dist/core/utils.min.js create mode 100644 dist/dots.esm.js create mode 100644 dist/dots.min.js create mode 100644 dist/drag-scrolling.esm.js create mode 100644 dist/drag-scrolling.min.js create mode 100644 dist/overflow-slider.esm.js create mode 100644 dist/overflow-slider.js create mode 100644 dist/overflow-slider.min.js create mode 100644 dist/plugins/arrows.esm.js create mode 100644 dist/plugins/arrows.js create mode 100644 dist/plugins/arrows.min.js create mode 100644 dist/plugins/core/utils.esm.js create mode 100644 dist/plugins/core/utils.js create mode 100644 dist/plugins/core/utils.min.js create mode 100644 dist/plugins/dots.esm.js create mode 100644 dist/plugins/dots.js create mode 100644 dist/plugins/dots.min.js create mode 100644 dist/plugins/drag-scrolling.esm.js create mode 100644 dist/plugins/drag-scrolling.js create mode 100644 dist/plugins/drag-scrolling.min.js create mode 100644 dist/plugins/scroll-indicator.esm.js create mode 100644 dist/plugins/scroll-indicator.js create mode 100644 dist/plugins/scroll-indicator.min.js create mode 100644 dist/plugins/skip-links.esm.js create mode 100644 dist/plugins/skip-links.js create mode 100644 dist/plugins/skip-links.min.js create mode 100644 dist/scroll-indicator.esm.js create mode 100644 dist/scroll-indicator.min.js create mode 100644 dist/skip-links.esm.js create mode 100644 dist/skip-links.min.js create mode 100644 docs/dist/arrows.esm.js create mode 100644 docs/dist/arrows.min.js create mode 100644 docs/dist/core/details.esm.js create mode 100644 docs/dist/core/details.js create mode 100644 docs/dist/core/details.min.js create mode 100644 docs/dist/core/slider.esm.js create mode 100644 docs/dist/core/slider.js create mode 100644 docs/dist/core/slider.min.js create mode 100644 docs/dist/core/utils.esm.js create mode 100644 docs/dist/core/utils.js create mode 100644 docs/dist/core/utils.min.js create mode 100644 docs/dist/dots.esm.js create mode 100644 docs/dist/dots.min.js create mode 100644 docs/dist/drag-scrolling.esm.js create mode 100644 docs/dist/drag-scrolling.min.js create mode 100644 docs/dist/index.esm.js create mode 100644 docs/dist/index.esm.min.js create mode 100644 docs/dist/index.js create mode 100644 docs/dist/index.min.js create mode 100644 docs/dist/overflow-slider.js create mode 100644 docs/dist/overflow-slider.min.js create mode 100644 docs/dist/plugins/arrows.esm.js create mode 100644 docs/dist/plugins/arrows.js create mode 100644 docs/dist/plugins/arrows.min.js create mode 100644 docs/dist/plugins/core/utils.esm.js create mode 100644 docs/dist/plugins/core/utils.js create mode 100644 docs/dist/plugins/core/utils.min.js create mode 100644 docs/dist/plugins/dots.esm.js create mode 100644 docs/dist/plugins/dots.js create mode 100644 docs/dist/plugins/dots.min.js create mode 100644 docs/dist/plugins/drag-scrolling.esm.js create mode 100644 docs/dist/plugins/drag-scrolling.js create mode 100644 docs/dist/plugins/drag-scrolling.min.js create mode 100644 docs/dist/plugins/scroll-indicator.esm.js create mode 100644 docs/dist/plugins/scroll-indicator.js create mode 100644 docs/dist/plugins/scroll-indicator.min.js create mode 100644 docs/dist/plugins/skip-links.esm.js create mode 100644 docs/dist/plugins/skip-links.js create mode 100644 docs/dist/plugins/skip-links.min.js create mode 100644 docs/dist/scroll-indicator.esm.js create mode 100644 docs/dist/scroll-indicator.min.js create mode 100644 docs/dist/skip-links.esm.js create mode 100644 docs/dist/skip-links.min.js diff --git a/dist/arrows.esm.js b/dist/arrows.esm.js new file mode 100644 index 0000000..584926b --- /dev/null +++ b/dist/arrows.esm.js @@ -0,0 +1,74 @@ +const DEFAULT_TEXTS = { + buttonPrevious: 'Previous items', + buttonNext: 'Next items', +}; +const DEFAULT_ICONS = { + prev: '', + next: '', +}; +const DEFAULT_CLASS_NAMES = { + navContainer: 'overflow-slider__arrows', + prevButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--prev', + nextButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--next', +}; +function ArrowsPlugin(args) { + return (slider) => { + var _a, _b, _c, _d; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + icons: Object.assign(Object.assign({}, DEFAULT_ICONS), (args === null || args === void 0 ? void 0 : args.icons) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const nav = document.createElement('div'); + nav.classList.add(options.classNames.navContainer); + const prev = document.createElement('button'); + prev.setAttribute('class', options.classNames.prevButton); + prev.setAttribute('type', 'button'); + prev.setAttribute('aria-label', options.texts.buttonPrevious); + prev.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); + prev.setAttribute('data-type', 'prev'); + prev.innerHTML = options.icons.prev; + prev.addEventListener('click', () => slider.moveToDirection('prev')); + const next = document.createElement('button'); + next.setAttribute('class', options.classNames.nextButton); + next.setAttribute('type', 'button'); + next.setAttribute('aria-label', options.texts.buttonNext); + next.setAttribute('aria-controls', (_c = slider.container.getAttribute('id')) !== null && _c !== void 0 ? _c : ''); + next.setAttribute('data-type', 'next'); + next.innerHTML = options.icons.next; + next.addEventListener('click', () => slider.moveToDirection('next')); + // insert buttons to the nav + nav.appendChild(prev); + nav.appendChild(next); + const update = () => { + const scrollLeft = slider.container.scrollLeft; + const scrollWidth = slider.container.scrollWidth; + const clientWidth = slider.container.clientWidth; + if (scrollLeft === 0) { + prev.setAttribute('data-has-content', 'false'); + } + else { + prev.setAttribute('data-has-content', 'true'); + } + if (scrollLeft + clientWidth >= scrollWidth) { + next.setAttribute('data-has-content', 'false'); + } + else { + next.setAttribute('data-has-content', 'true'); + } + }; + if (options.container) { + options.container.appendChild(nav); + } + else { + (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(nav, slider.container.nextSibling); + } + update(); + slider.on('scroll', update); + slider.on('contentsChanged', update); + slider.on('containerSizeChanged', update); + }; +} + +export { ArrowsPlugin as default }; diff --git a/dist/arrows.min.js b/dist/arrows.min.js new file mode 100644 index 0000000..384e17a --- /dev/null +++ b/dist/arrows.min.js @@ -0,0 +1 @@ +const t={buttonPrevious:"Previous items",buttonNext:"Next items"},e={prev:'',next:''},n={navContainer:"overflow-slider__arrows",prevButton:"overflow-slider__arrows-button overflow-slider__arrows-button--prev",nextButton:"overflow-slider__arrows-button overflow-slider__arrows-button--next"};function s(s){return o=>{var i,r,a,l;const c={texts:Object.assign(Object.assign({},t),(null==s?void 0:s.texts)||[]),icons:Object.assign(Object.assign({},e),(null==s?void 0:s.icons)||[]),classNames:Object.assign(Object.assign({},n),(null==s?void 0:s.classNames)||[]),container:null!==(i=null==s?void 0:s.container)&&void 0!==i?i:null},u=document.createElement("div");u.classList.add(c.classNames.navContainer);const d=document.createElement("button");d.setAttribute("class",c.classNames.prevButton),d.setAttribute("type","button"),d.setAttribute("aria-label",c.texts.buttonPrevious),d.setAttribute("aria-controls",null!==(r=o.container.getAttribute("id"))&&void 0!==r?r:""),d.setAttribute("data-type","prev"),d.innerHTML=c.icons.prev,d.addEventListener("click",(()=>o.moveToDirection("prev")));const v=document.createElement("button");v.setAttribute("class",c.classNames.nextButton),v.setAttribute("type","button"),v.setAttribute("aria-label",c.texts.buttonNext),v.setAttribute("aria-controls",null!==(a=o.container.getAttribute("id"))&&void 0!==a?a:""),v.setAttribute("data-type","next"),v.innerHTML=c.icons.next,v.addEventListener("click",(()=>o.moveToDirection("next"))),u.appendChild(d),u.appendChild(v);const b=()=>{const t=o.container.scrollLeft,e=o.container.scrollWidth,n=o.container.clientWidth;0===t?d.setAttribute("data-has-content","false"):d.setAttribute("data-has-content","true"),t+n>=e?v.setAttribute("data-has-content","false"):v.setAttribute("data-has-content","true")};c.container?c.container.appendChild(u):null===(l=o.container.parentNode)||void 0===l||l.insertBefore(u,o.container.nextSibling),b(),o.on("scroll",b),o.on("contentsChanged",b),o.on("containerSizeChanged",b)}}export{s as default}; diff --git a/dist/core/details.esm.js b/dist/core/details.esm.js new file mode 100644 index 0000000..2eee8ef --- /dev/null +++ b/dist/core/details.esm.js @@ -0,0 +1,34 @@ +function details(slider) { + let instance; + let hasOverflow = false; + let slideCount = 0; + let containerWidth = 0; + let scrollableAreaWidth = 0; + let amountOfPages = 0; + let currentPage = 1; + if (slider.container.scrollWidth > slider.container.clientWidth) { + hasOverflow = true; + } + slideCount = Array.from(slider.container.querySelectorAll(':scope > *')).length; + containerWidth = slider.container.offsetWidth; + scrollableAreaWidth = slider.container.scrollWidth; + amountOfPages = Math.ceil(scrollableAreaWidth / containerWidth); + if (slider.container.scrollLeft >= 0) { + currentPage = Math.floor(slider.container.scrollLeft / containerWidth); + // consider as last page if the scrollLeft + containerWidth is equal to scrollWidth + if (slider.container.scrollLeft + containerWidth === scrollableAreaWidth) { + currentPage = amountOfPages - 1; + } + } + instance = { + hasOverflow, + slideCount, + containerWidth, + scrollableAreaWidth, + amountOfPages, + currentPage, + }; + return instance; +} + +export { details as default }; diff --git a/dist/core/details.js b/dist/core/details.js new file mode 100644 index 0000000..2eee8ef --- /dev/null +++ b/dist/core/details.js @@ -0,0 +1,34 @@ +function details(slider) { + let instance; + let hasOverflow = false; + let slideCount = 0; + let containerWidth = 0; + let scrollableAreaWidth = 0; + let amountOfPages = 0; + let currentPage = 1; + if (slider.container.scrollWidth > slider.container.clientWidth) { + hasOverflow = true; + } + slideCount = Array.from(slider.container.querySelectorAll(':scope > *')).length; + containerWidth = slider.container.offsetWidth; + scrollableAreaWidth = slider.container.scrollWidth; + amountOfPages = Math.ceil(scrollableAreaWidth / containerWidth); + if (slider.container.scrollLeft >= 0) { + currentPage = Math.floor(slider.container.scrollLeft / containerWidth); + // consider as last page if the scrollLeft + containerWidth is equal to scrollWidth + if (slider.container.scrollLeft + containerWidth === scrollableAreaWidth) { + currentPage = amountOfPages - 1; + } + } + instance = { + hasOverflow, + slideCount, + containerWidth, + scrollableAreaWidth, + amountOfPages, + currentPage, + }; + return instance; +} + +export { details as default }; diff --git a/dist/core/details.min.js b/dist/core/details.min.js new file mode 100644 index 0000000..82cca30 --- /dev/null +++ b/dist/core/details.min.js @@ -0,0 +1 @@ +function t(t){let e,r=!1,n=0,o=0,l=0,c=0,a=1;return t.container.scrollWidth>t.container.clientWidth&&(r=!0),n=Array.from(t.container.querySelectorAll(":scope > *")).length,o=t.container.offsetWidth,l=t.container.scrollWidth,c=Math.ceil(l/o),t.container.scrollLeft>=0&&(a=Math.floor(t.container.scrollLeft/o),t.container.scrollLeft+o===l&&(a=c-1)),e={hasOverflow:r,slideCount:n,containerWidth:o,scrollableAreaWidth:l,amountOfPages:c,currentPage:a},e}export{t as default}; diff --git a/dist/core/slider.esm.js b/dist/core/slider.esm.js new file mode 100644 index 0000000..608e79d --- /dev/null +++ b/dist/core/slider.esm.js @@ -0,0 +1,218 @@ +import details from './details.esm.js'; +import { generateId, objectsAreEqual } from './utils.esm.js'; + +function Slider(container, options, plugins) { + let slider; + let subs = {}; + function init() { + slider.container = container; + // ensure container has id + let containerId = container.getAttribute('id'); + if (containerId === null) { + containerId = generateId('overflow-slider'); + container.setAttribute('id', containerId); + } + setDetails(true); + slider.on('contentsChanged', () => setDetails()); + slider.on('containerSizeChanged', () => setDetails()); + let requestId = 0; + const setDetailsDebounce = () => { + if (requestId) { + window.cancelAnimationFrame(requestId); + } + requestId = window.requestAnimationFrame(() => { + setDetails(); + }); + }; + slider.on('scroll', setDetailsDebounce); + addEventListeners(); + setDataAttributes(); + setCSSVariables(); + if (plugins) { + for (const plugin of plugins) { + plugin(slider); + } + } + slider.on('detailsChanged', () => { + setDataAttributes(); + setCSSVariables(); + }); + slider.emit('created'); + } + function setDetails(isInit = false) { + const oldDetails = slider.details; + const newDetails = details(slider); + slider.details = newDetails; + if (!isInit && !objectsAreEqual(oldDetails, newDetails)) { + slider.emit('detailsChanged'); + } + else if (isInit) { + slider.emit('detailsChanged'); + } + } + function addEventListeners() { + // changes to DOM + const observer = new MutationObserver(() => slider.emit('contentsChanged')); + observer.observe(slider.container, { childList: true }); + // container size changes + const resizeObserver = new ResizeObserver(() => slider.emit('containerSizeChanged')); + resizeObserver.observe(slider.container); + // scroll event with debouncing + slider.container.addEventListener('scroll', () => slider.emit('scroll')); + // Listen for mouse down and touch start events on the document + // This handles both mouse clicks and touch interactions + let wasInteractedWith = false; + slider.container.addEventListener('mousedown', () => { + wasInteractedWith = true; + }); + slider.container.addEventListener('touchstart', () => { + wasInteractedWith = true; + }, { passive: true }); + slider.container.addEventListener('focusin', (e) => { + // move target parents as long as they are not the container + // but only if focus didn't start from mouse or touch + if (!wasInteractedWith) { + let target = e.target; + while (target.parentElement !== slider.container) { + if (target.parentElement) { + target = target.parentElement; + } + else { + break; + } + } + ensureSlideIsInView(target); + } + wasInteractedWith = false; + }); + } + function setCSSVariables() { + slider.container.style.setProperty('--slider-container-width', `${slider.details.containerWidth}px`); + slider.container.style.setProperty('--slider-scrollable-width', `${slider.details.scrollableAreaWidth}px`); + slider.container.style.setProperty('--slider-slides-count', `${slider.details.slideCount}`); + } + function setDataAttributes() { + slider.container.setAttribute('data-has-overflow', slider.details.hasOverflow ? 'true' : 'false'); + } + function ensureSlideIsInView(slide) { + const slideRect = slide.getBoundingClientRect(); + const sliderRect = slider.container.getBoundingClientRect(); + const containerWidth = slider.container.offsetWidth; + const scrollLeft = slider.container.scrollLeft; + const slideStart = slideRect.left - sliderRect.left + scrollLeft; + const slideEnd = slideStart + slideRect.width; + let scrollTarget = null; + if (slideStart < scrollLeft) { + scrollTarget = slideStart; + } + else if (slideEnd > scrollLeft + containerWidth) { + scrollTarget = slideEnd - containerWidth; + } + if (scrollTarget) { + slider.container.style.scrollSnapType = 'none'; + slider.container.scrollLeft = scrollTarget; + // @todo resume scroll snapping but at least proximity gives a lot of trouble + // and it's not really needed for this use case but it would be nice to have + // it back in case it's needed. We need to calculate scrollLeft some other way + } + } + function moveToDirection(direction = "prev") { + const scrollStrategy = slider.options.scrollStrategy; + const scrollLeft = slider.container.scrollLeft; + const sliderRect = slider.container.getBoundingClientRect(); + const containerWidth = slider.container.offsetWidth; + let targetScrollPosition = scrollLeft; + if (direction === 'prev') { + targetScrollPosition = Math.max(0, scrollLeft - slider.container.offsetWidth); + } + else if (direction === 'next') { + targetScrollPosition = Math.min(slider.container.scrollWidth, scrollLeft + slider.container.offsetWidth); + } + if (scrollStrategy === 'fullSlide') { + let fullSldeTargetScrollPosition = null; + const slides = Array.from(slider.container.querySelectorAll(':scope > *')); + let gapSize = 0; + if (slides.length > 1) { + const firstSlideRect = slides[0].getBoundingClientRect(); + const secondSlideRect = slides[1].getBoundingClientRect(); + gapSize = secondSlideRect.left - firstSlideRect.right; + } + // extend targetScrollPosition to include gap + if (direction === 'prev') { + fullSldeTargetScrollPosition = Math.max(0, targetScrollPosition - gapSize); + } + else { + fullSldeTargetScrollPosition = Math.min(slider.container.scrollWidth, targetScrollPosition + gapSize); + } + if (direction === 'next') { + let partialSlideFound = false; + for (let slide of slides) { + const slideRect = slide.getBoundingClientRect(); + const slideStart = slideRect.left - sliderRect.left + scrollLeft; + const slideEnd = slideStart + slideRect.width; + if (slideStart < targetScrollPosition && slideEnd > targetScrollPosition) { + fullSldeTargetScrollPosition = slideStart; + partialSlideFound = true; + break; + } + } + if (!partialSlideFound) { + fullSldeTargetScrollPosition = Math.min(targetScrollPosition, slider.container.scrollWidth - slider.container.offsetWidth); + } + if (fullSldeTargetScrollPosition && fullSldeTargetScrollPosition > scrollLeft) { + targetScrollPosition = fullSldeTargetScrollPosition; + } + } + else { + let partialSlideFound = false; + for (let slide of slides) { + const slideRect = slide.getBoundingClientRect(); + const slideStart = slideRect.left - sliderRect.left + scrollLeft; + const slideEnd = slideStart + slideRect.width; + if (slideStart < scrollLeft && slideEnd > scrollLeft) { + fullSldeTargetScrollPosition = slideEnd - containerWidth; + partialSlideFound = true; + break; + } + } + if (!partialSlideFound) { + fullSldeTargetScrollPosition = Math.max(0, scrollLeft - containerWidth); + } + if (fullSldeTargetScrollPosition && fullSldeTargetScrollPosition < scrollLeft) { + targetScrollPosition = fullSldeTargetScrollPosition; + } + } + } + slider.container.style.scrollBehavior = slider.options.scrollBehavior; + slider.container.scrollLeft = targetScrollPosition; + setTimeout(() => slider.container.style.scrollBehavior = '', 50); + } + function on(name, cb) { + if (!subs[name]) { + subs[name] = []; + } + subs[name].push(cb); + } + function emit(name) { + var _a; + if (subs && subs[name]) { + subs[name].forEach(cb => { + cb(slider); + }); + } + const optionCallBack = (_a = slider === null || slider === void 0 ? void 0 : slider.options) === null || _a === void 0 ? void 0 : _a[name]; + if (typeof optionCallBack === 'function') { + optionCallBack(slider); + } + } + slider = { + emit, + moveToDirection, + on, + options, + }; + init(); + return slider; +} + +export { Slider as default }; diff --git a/dist/core/slider.js b/dist/core/slider.js new file mode 100644 index 0000000..23d9a88 --- /dev/null +++ b/dist/core/slider.js @@ -0,0 +1,218 @@ +import details from './details.js'; +import { generateId, objectsAreEqual } from './utils.js'; + +function Slider(container, options, plugins) { + let slider; + let subs = {}; + function init() { + slider.container = container; + // ensure container has id + let containerId = container.getAttribute('id'); + if (containerId === null) { + containerId = generateId('overflow-slider'); + container.setAttribute('id', containerId); + } + setDetails(true); + slider.on('contentsChanged', () => setDetails()); + slider.on('containerSizeChanged', () => setDetails()); + let requestId = 0; + const setDetailsDebounce = () => { + if (requestId) { + window.cancelAnimationFrame(requestId); + } + requestId = window.requestAnimationFrame(() => { + setDetails(); + }); + }; + slider.on('scroll', setDetailsDebounce); + addEventListeners(); + setDataAttributes(); + setCSSVariables(); + if (plugins) { + for (const plugin of plugins) { + plugin(slider); + } + } + slider.on('detailsChanged', () => { + setDataAttributes(); + setCSSVariables(); + }); + slider.emit('created'); + } + function setDetails(isInit = false) { + const oldDetails = slider.details; + const newDetails = details(slider); + slider.details = newDetails; + if (!isInit && !objectsAreEqual(oldDetails, newDetails)) { + slider.emit('detailsChanged'); + } + else if (isInit) { + slider.emit('detailsChanged'); + } + } + function addEventListeners() { + // changes to DOM + const observer = new MutationObserver(() => slider.emit('contentsChanged')); + observer.observe(slider.container, { childList: true }); + // container size changes + const resizeObserver = new ResizeObserver(() => slider.emit('containerSizeChanged')); + resizeObserver.observe(slider.container); + // scroll event with debouncing + slider.container.addEventListener('scroll', () => slider.emit('scroll')); + // Listen for mouse down and touch start events on the document + // This handles both mouse clicks and touch interactions + let wasInteractedWith = false; + slider.container.addEventListener('mousedown', () => { + wasInteractedWith = true; + }); + slider.container.addEventListener('touchstart', () => { + wasInteractedWith = true; + }, { passive: true }); + slider.container.addEventListener('focusin', (e) => { + // move target parents as long as they are not the container + // but only if focus didn't start from mouse or touch + if (!wasInteractedWith) { + let target = e.target; + while (target.parentElement !== slider.container) { + if (target.parentElement) { + target = target.parentElement; + } + else { + break; + } + } + ensureSlideIsInView(target); + } + wasInteractedWith = false; + }); + } + function setCSSVariables() { + slider.container.style.setProperty('--slider-container-width', `${slider.details.containerWidth}px`); + slider.container.style.setProperty('--slider-scrollable-width', `${slider.details.scrollableAreaWidth}px`); + slider.container.style.setProperty('--slider-slides-count', `${slider.details.slideCount}`); + } + function setDataAttributes() { + slider.container.setAttribute('data-has-overflow', slider.details.hasOverflow ? 'true' : 'false'); + } + function ensureSlideIsInView(slide) { + const slideRect = slide.getBoundingClientRect(); + const sliderRect = slider.container.getBoundingClientRect(); + const containerWidth = slider.container.offsetWidth; + const scrollLeft = slider.container.scrollLeft; + const slideStart = slideRect.left - sliderRect.left + scrollLeft; + const slideEnd = slideStart + slideRect.width; + let scrollTarget = null; + if (slideStart < scrollLeft) { + scrollTarget = slideStart; + } + else if (slideEnd > scrollLeft + containerWidth) { + scrollTarget = slideEnd - containerWidth; + } + if (scrollTarget) { + slider.container.style.scrollSnapType = 'none'; + slider.container.scrollLeft = scrollTarget; + // @todo resume scroll snapping but at least proximity gives a lot of trouble + // and it's not really needed for this use case but it would be nice to have + // it back in case it's needed. We need to calculate scrollLeft some other way + } + } + function moveToDirection(direction = "prev") { + const scrollStrategy = slider.options.scrollStrategy; + const scrollLeft = slider.container.scrollLeft; + const sliderRect = slider.container.getBoundingClientRect(); + const containerWidth = slider.container.offsetWidth; + let targetScrollPosition = scrollLeft; + if (direction === 'prev') { + targetScrollPosition = Math.max(0, scrollLeft - slider.container.offsetWidth); + } + else if (direction === 'next') { + targetScrollPosition = Math.min(slider.container.scrollWidth, scrollLeft + slider.container.offsetWidth); + } + if (scrollStrategy === 'fullSlide') { + let fullSldeTargetScrollPosition = null; + const slides = Array.from(slider.container.querySelectorAll(':scope > *')); + let gapSize = 0; + if (slides.length > 1) { + const firstSlideRect = slides[0].getBoundingClientRect(); + const secondSlideRect = slides[1].getBoundingClientRect(); + gapSize = secondSlideRect.left - firstSlideRect.right; + } + // extend targetScrollPosition to include gap + if (direction === 'prev') { + fullSldeTargetScrollPosition = Math.max(0, targetScrollPosition - gapSize); + } + else { + fullSldeTargetScrollPosition = Math.min(slider.container.scrollWidth, targetScrollPosition + gapSize); + } + if (direction === 'next') { + let partialSlideFound = false; + for (let slide of slides) { + const slideRect = slide.getBoundingClientRect(); + const slideStart = slideRect.left - sliderRect.left + scrollLeft; + const slideEnd = slideStart + slideRect.width; + if (slideStart < targetScrollPosition && slideEnd > targetScrollPosition) { + fullSldeTargetScrollPosition = slideStart; + partialSlideFound = true; + break; + } + } + if (!partialSlideFound) { + fullSldeTargetScrollPosition = Math.min(targetScrollPosition, slider.container.scrollWidth - slider.container.offsetWidth); + } + if (fullSldeTargetScrollPosition && fullSldeTargetScrollPosition > scrollLeft) { + targetScrollPosition = fullSldeTargetScrollPosition; + } + } + else { + let partialSlideFound = false; + for (let slide of slides) { + const slideRect = slide.getBoundingClientRect(); + const slideStart = slideRect.left - sliderRect.left + scrollLeft; + const slideEnd = slideStart + slideRect.width; + if (slideStart < scrollLeft && slideEnd > scrollLeft) { + fullSldeTargetScrollPosition = slideEnd - containerWidth; + partialSlideFound = true; + break; + } + } + if (!partialSlideFound) { + fullSldeTargetScrollPosition = Math.max(0, scrollLeft - containerWidth); + } + if (fullSldeTargetScrollPosition && fullSldeTargetScrollPosition < scrollLeft) { + targetScrollPosition = fullSldeTargetScrollPosition; + } + } + } + slider.container.style.scrollBehavior = slider.options.scrollBehavior; + slider.container.scrollLeft = targetScrollPosition; + setTimeout(() => slider.container.style.scrollBehavior = '', 50); + } + function on(name, cb) { + if (!subs[name]) { + subs[name] = []; + } + subs[name].push(cb); + } + function emit(name) { + var _a; + if (subs && subs[name]) { + subs[name].forEach(cb => { + cb(slider); + }); + } + const optionCallBack = (_a = slider === null || slider === void 0 ? void 0 : slider.options) === null || _a === void 0 ? void 0 : _a[name]; + if (typeof optionCallBack === 'function') { + optionCallBack(slider); + } + } + slider = { + emit, + moveToDirection, + on, + options, + }; + init(); + return slider; +} + +export { Slider as default }; diff --git a/dist/core/slider.min.js b/dist/core/slider.min.js new file mode 100644 index 0000000..4357cee --- /dev/null +++ b/dist/core/slider.min.js @@ -0,0 +1 @@ +import t from"./details.min.js";import{generateId as e,objectsAreEqual as n}from"./utils.min.js";function i(i,o,r){let l,a={};function s(e=!1){const i=l.details,o=t(l);l.details=o,e||n(i,o)?e&&l.emit("detailsChanged"):l.emit("detailsChanged")}function c(){l.container.style.setProperty("--slider-container-width",`${l.details.containerWidth}px`),l.container.style.setProperty("--slider-scrollable-width",`${l.details.scrollableAreaWidth}px`),l.container.style.setProperty("--slider-slides-count",`${l.details.slideCount}`)}function d(){l.container.setAttribute("data-has-overflow",l.details.hasOverflow?"true":"false")}return l={emit:function(t){var e;a&&a[t]&&a[t].forEach((t=>{t(l)}));const n=null===(e=null==l?void 0:l.options)||void 0===e?void 0:e[t];"function"==typeof n&&n(l)},moveToDirection:function(t="prev"){const e=l.options.scrollStrategy,n=l.container.scrollLeft,i=l.container.getBoundingClientRect(),o=l.container.offsetWidth;let r=n;if("prev"===t?r=Math.max(0,n-l.container.offsetWidth):"next"===t&&(r=Math.min(l.container.scrollWidth,n+l.container.offsetWidth)),"fullSlide"===e){let e=null;const a=Array.from(l.container.querySelectorAll(":scope > *"));let s=0;if(a.length>1){const t=a[0].getBoundingClientRect();s=a[1].getBoundingClientRect().left-t.right}if(e="prev"===t?Math.max(0,r-s):Math.min(l.container.scrollWidth,r+s),"next"===t){let t=!1;for(let o of a){const l=o.getBoundingClientRect(),a=l.left-i.left+n,s=a+l.width;if(ar){e=a,t=!0;break}}t||(e=Math.min(r,l.container.scrollWidth-l.container.offsetWidth)),e&&e>n&&(r=e)}else{let t=!1;for(let r of a){const l=r.getBoundingClientRect(),a=l.left-i.left+n,s=a+l.width;if(an){e=s-o,t=!0;break}}t||(e=Math.max(0,n-o)),e&&el.container.style.scrollBehavior=""),50)},on:function(t,e){a[t]||(a[t]=[]),a[t].push(e)},options:o},function(){l.container=i;let t=i.getAttribute("id");null===t&&(t=e("overflow-slider"),i.setAttribute("id",t)),s(!0),l.on("contentsChanged",(()=>s())),l.on("containerSizeChanged",(()=>s()));let n=0;if(l.on("scroll",(()=>{n&&window.cancelAnimationFrame(n),n=window.requestAnimationFrame((()=>{s()}))})),function(){new MutationObserver((()=>l.emit("contentsChanged"))).observe(l.container,{childList:!0});new ResizeObserver((()=>l.emit("containerSizeChanged"))).observe(l.container),l.container.addEventListener("scroll",(()=>l.emit("scroll")));let t=!1;l.container.addEventListener("mousedown",(()=>{t=!0})),l.container.addEventListener("touchstart",(()=>{t=!0}),{passive:!0}),l.container.addEventListener("focusin",(e=>{if(!t){let t=e.target;for(;t.parentElement!==l.container&&t.parentElement;)t=t.parentElement;!function(t){const e=t.getBoundingClientRect(),n=l.container.getBoundingClientRect(),i=l.container.offsetWidth,o=l.container.scrollLeft,r=e.left-n.left+o,a=r+e.width;let s=null;ro+i&&(s=a-i);s&&(l.container.style.scrollSnapType="none",l.container.scrollLeft=s)}(t)}t=!1}))}(),d(),c(),r)for(const t of r)t(l);l.on("detailsChanged",(()=>{d(),c()})),l.emit("created")}(),l}export{i as default}; diff --git a/dist/core/utils.esm.js b/dist/core/utils.esm.js new file mode 100644 index 0000000..623a337 --- /dev/null +++ b/dist/core/utils.esm.js @@ -0,0 +1,22 @@ +function generateId(prefix, i = 1) { + const id = `${prefix}-${i}`; + if (document.getElementById(id)) { + return generateId(prefix, i + 1); + } + return id; +} +function objectsAreEqual(obj1, obj2) { + const keys1 = Object.keys(obj1); + const keys2 = Object.keys(obj2); + if (keys1.length !== keys2.length) { + return false; + } + for (let key of keys1) { + if (obj2.hasOwnProperty(key) === false || obj1[key] !== obj2[key]) { + return false; + } + } + return true; +} + +export { generateId, objectsAreEqual }; diff --git a/dist/core/utils.js b/dist/core/utils.js new file mode 100644 index 0000000..623a337 --- /dev/null +++ b/dist/core/utils.js @@ -0,0 +1,22 @@ +function generateId(prefix, i = 1) { + const id = `${prefix}-${i}`; + if (document.getElementById(id)) { + return generateId(prefix, i + 1); + } + return id; +} +function objectsAreEqual(obj1, obj2) { + const keys1 = Object.keys(obj1); + const keys2 = Object.keys(obj2); + if (keys1.length !== keys2.length) { + return false; + } + for (let key of keys1) { + if (obj2.hasOwnProperty(key) === false || obj1[key] !== obj2[key]) { + return false; + } + } + return true; +} + +export { generateId, objectsAreEqual }; diff --git a/dist/core/utils.min.js b/dist/core/utils.min.js new file mode 100644 index 0000000..3ce8f13 --- /dev/null +++ b/dist/core/utils.min.js @@ -0,0 +1 @@ +function t(e,n=1){const r=`${e}-${n}`;return document.getElementById(r)?t(e,n+1):r}function e(t,e){const n=Object.keys(t),r=Object.keys(e);if(n.length!==r.length)return!1;for(let r of n)if(!1===e.hasOwnProperty(r)||t[r]!==e[r])return!1;return!0}export{t as generateId,e as objectsAreEqual}; diff --git a/dist/dots.esm.js b/dist/dots.esm.js new file mode 100644 index 0000000..75b1175 --- /dev/null +++ b/dist/dots.esm.js @@ -0,0 +1,99 @@ +const DEFAULT_TEXTS = { + dotDescription: 'Page %d of %d', +}; +const DEFAULT_CLASS_NAMES = { + dotsContainer: 'overflow-slider__dots', + dotsItem: 'overflow-slider__dot-item', +}; +function DotsPlugin(args) { + return (slider) => { + var _a, _b; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const dots = document.createElement('div'); + dots.classList.add(options.classNames.dotsContainer); + let pageFocused = null; + const buildDots = () => { + dots.setAttribute('data-has-content', slider.details.hasOverflow.toString()); + dots.innerHTML = ''; + const dotsList = document.createElement('ul'); + const pages = slider.details.amountOfPages; + const currentPage = slider.details.currentPage; + if (pages <= 1) { + return; + } + for (let i = 0; i < pages; i++) { + const dotListItem = document.createElement('li'); + const dot = document.createElement('button'); + dot.setAttribute('type', 'button'); + dot.setAttribute('class', options.classNames.dotsItem); + dot.setAttribute('aria-label', options.texts.dotDescription.replace('%d', (i + 1).toString()).replace('%d', pages.toString())); + dot.setAttribute('aria-pressed', (i === currentPage).toString()); + dot.setAttribute('data-page', (i + 1).toString()); + dotListItem.appendChild(dot); + dotsList.appendChild(dotListItem); + dot.addEventListener('click', () => activateDot(i + 1)); + dot.addEventListener('focus', () => pageFocused = i + 1); + dot.addEventListener('keydown', (e) => { + var _a; + const currentPageItem = dots.querySelector(`[aria-pressed="true"]`); + if (!currentPageItem) { + return; + } + const currentPage = parseInt((_a = currentPageItem.getAttribute('data-page')) !== null && _a !== void 0 ? _a : '1'); + if (e.key === 'ArrowLeft') { + const previousPage = currentPage - 1; + if (previousPage > 0) { + const matchingDot = dots.querySelector(`[data-page="${previousPage}"]`); + if (matchingDot) { + matchingDot.focus(); + } + activateDot(previousPage); + } + } + if (e.key === 'ArrowRight') { + const nextPage = currentPage + 1; + if (nextPage <= pages) { + const matchingDot = dots.querySelector(`[data-page="${nextPage}"]`); + if (matchingDot) { + matchingDot.focus(); + } + activateDot(nextPage); + } + } + }); + } + dots.appendChild(dotsList); + // return focus to same page after rebuild + if (pageFocused) { + const matchingDot = dots.querySelector(`[data-page="${pageFocused}"]`); + if (matchingDot) { + matchingDot.focus(); + } + } + }; + const activateDot = (page) => { + const scrollTargetPosition = slider.details.containerWidth * (page - 1); + slider.container.style.scrollBehavior = slider.options.scrollBehavior; + slider.container.style.scrollSnapType = 'none'; + slider.container.scrollLeft = scrollTargetPosition; + slider.container.style.scrollBehavior = ''; + slider.container.style.scrollSnapType = ''; + }; + buildDots(); + if (options.container) { + options.container.appendChild(dots); + } + else { + (_b = slider.container.parentNode) === null || _b === void 0 ? void 0 : _b.insertBefore(dots, slider.container.nextSibling); + } + slider.on('detailsChanged', () => { + buildDots(); + }); + }; +} + +export { DotsPlugin as default }; diff --git a/dist/dots.min.js b/dist/dots.min.js new file mode 100644 index 0000000..e2d62e3 --- /dev/null +++ b/dist/dots.min.js @@ -0,0 +1 @@ +const t={dotDescription:"Page %d of %d"},e={dotsContainer:"overflow-slider__dots",dotsItem:"overflow-slider__dot-item"};function n(n){return o=>{var a,s;const r={texts:Object.assign(Object.assign({},t),(null==n?void 0:n.texts)||[]),classNames:Object.assign(Object.assign({},e),(null==n?void 0:n.classNames)||[]),container:null!==(a=null==n?void 0:n.container)&&void 0!==a?a:null},i=document.createElement("div");i.classList.add(r.classNames.dotsContainer);let l=null;const c=()=>{i.setAttribute("data-has-content",o.details.hasOverflow.toString()),i.innerHTML="";const t=document.createElement("ul"),e=o.details.amountOfPages,n=o.details.currentPage;if(!(e<=1)){for(let o=0;od(o+1))),s.addEventListener("focus",(()=>l=o+1)),s.addEventListener("keydown",(t=>{var n;const o=i.querySelector('[aria-pressed="true"]');if(!o)return;const a=parseInt(null!==(n=o.getAttribute("data-page"))&&void 0!==n?n:"1");if("ArrowLeft"===t.key){const t=a-1;if(t>0){const e=i.querySelector(`[data-page="${t}"]`);e&&e.focus(),d(t)}}if("ArrowRight"===t.key){const t=a+1;if(t<=e){const e=i.querySelector(`[data-page="${t}"]`);e&&e.focus(),d(t)}}}))}if(i.appendChild(t),l){const t=i.querySelector(`[data-page="${l}"]`);t&&t.focus()}}},d=t=>{const e=o.details.containerWidth*(t-1);o.container.style.scrollBehavior=o.options.scrollBehavior,o.container.style.scrollSnapType="none",o.container.scrollLeft=e,o.container.style.scrollBehavior="",o.container.style.scrollSnapType=""};c(),r.container?r.container.appendChild(i):null===(s=o.container.parentNode)||void 0===s||s.insertBefore(i,o.container.nextSibling),o.on("detailsChanged",(()=>{c()}))}}export{n as default}; diff --git a/dist/drag-scrolling.esm.js b/dist/drag-scrolling.esm.js new file mode 100644 index 0000000..ed7117b --- /dev/null +++ b/dist/drag-scrolling.esm.js @@ -0,0 +1,72 @@ +const DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK = 20; +function DragScrollingPlugin(args) { + var _a; + const options = { + draggedDistanceThatPreventsClick: (_a = args === null || args === void 0 ? void 0 : args.draggedDistanceThatPreventsClick) !== null && _a !== void 0 ? _a : DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK, + }; + return (slider) => { + let isMouseDown = false; + let startX = 0; + let scrollLeft = 0; + // add data attribute to container + slider.container.setAttribute('data-has-drag-scrolling', 'true'); + slider.container.addEventListener('mousedown', (e) => { + if (!slider.details.hasOverflow) { + return; + } + isMouseDown = true; + startX = e.pageX - slider.container.offsetLeft; + scrollLeft = slider.container.scrollLeft; + // change cursor to grabbing + slider.container.style.cursor = 'grabbing'; + slider.container.style.scrollSnapType = 'none'; + slider.container.style.scrollBehavior = 'auto'; + // prevent pointer events on the slides + // const slides = slider.container.querySelectorAll( ':scope > *' ); + // slides.forEach((slide) => { + // (slide).style.pointerEvents = 'none'; + // }); + // prevent focus going to the slides + // e.preventDefault(); + // e.stopPropagation(); + }); + window.addEventListener('mouseup', () => { + if (!slider.details.hasOverflow) { + return; + } + isMouseDown = false; + slider.container.style.cursor = ''; + // slider.container.style.scrollBehavior = slider.options.scrollBehavior; + setTimeout(() => { + slider.container.style.scrollSnapType = ''; + slider.container.style.scrollBehavior = ''; + const slides = slider.container.querySelectorAll(':scope > *'); + slides.forEach((slide) => { + slide.style.pointerEvents = ''; + }); + }, 50); + }); + window.addEventListener('mousemove', (e) => { + if (!slider.details.hasOverflow) { + return; + } + if (!isMouseDown) { + return; + } + e.preventDefault(); + const x = e.pageX - slider.container.offsetLeft; + const walk = (x - startX); + slider.container.scrollLeft = scrollLeft - walk; + // if walk is more than 30px, don't allow click event + // e.preventDefault(); + const absWalk = Math.abs(walk); + const slides = slider.container.querySelectorAll(':scope > *'); + const pointerEvents = absWalk > options.draggedDistanceThatPreventsClick ? 'none' : ''; + slides.forEach((slide) => { + slide.style.pointerEvents = pointerEvents; + }); + }); + }; +} + +export { DragScrollingPlugin as default }; diff --git a/dist/drag-scrolling.min.js b/dist/drag-scrolling.min.js new file mode 100644 index 0000000..2f3fd1d --- /dev/null +++ b/dist/drag-scrolling.min.js @@ -0,0 +1 @@ +function e(e){var t;const n=null!==(t=null==e?void 0:e.draggedDistanceThatPreventsClick)&&void 0!==t?t:20;return e=>{let t=!1,o=0,r=0;e.container.setAttribute("data-has-drag-scrolling","true"),e.container.addEventListener("mousedown",(n=>{e.details.hasOverflow&&(t=!0,o=n.pageX-e.container.offsetLeft,r=e.container.scrollLeft,e.container.style.cursor="grabbing",e.container.style.scrollSnapType="none",e.container.style.scrollBehavior="auto")})),window.addEventListener("mouseup",(()=>{e.details.hasOverflow&&(t=!1,e.container.style.cursor="",setTimeout((()=>{e.container.style.scrollSnapType="",e.container.style.scrollBehavior="";e.container.querySelectorAll(":scope > *").forEach((e=>{e.style.pointerEvents=""}))}),50))})),window.addEventListener("mousemove",(a=>{if(!e.details.hasOverflow)return;if(!t)return;a.preventDefault();const s=a.pageX-e.container.offsetLeft-o;e.container.scrollLeft=r-s;const l=Math.abs(s),i=e.container.querySelectorAll(":scope > *"),c=l>n?"none":"";i.forEach((e=>{e.style.pointerEvents=c}))}))}}export{e as default}; diff --git a/dist/index.esm.js b/dist/index.esm.js index 99041b4..2f1c75b 100644 --- a/dist/index.esm.js +++ b/dist/index.esm.js @@ -1,704 +1 @@ -function details(slider) { - let instance; - let hasOverflow = false; - let slideCount = 0; - let containerWidth = 0; - let scrollableAreaWidth = 0; - let amountOfPages = 0; - let currentPage = 1; - if (slider.container.scrollWidth > slider.container.clientWidth) { - hasOverflow = true; - } - slideCount = Array.from(slider.container.querySelectorAll(':scope > *')).length; - containerWidth = slider.container.offsetWidth; - scrollableAreaWidth = slider.container.scrollWidth; - amountOfPages = Math.ceil(scrollableAreaWidth / containerWidth); - if (slider.container.scrollLeft >= 0) { - currentPage = Math.floor(slider.container.scrollLeft / containerWidth); - // consider as last page if the scrollLeft + containerWidth is equal to scrollWidth - if (slider.container.scrollLeft + containerWidth === scrollableAreaWidth) { - currentPage = amountOfPages - 1; - } - } - instance = { - hasOverflow, - slideCount, - containerWidth, - scrollableAreaWidth, - amountOfPages, - currentPage, - }; - return instance; -} - -function generateId(prefix, i = 1) { - const id = `${prefix}-${i}`; - if (document.getElementById(id)) { - return generateId(prefix, i + 1); - } - return id; -} -function objectsAreEqual(obj1, obj2) { - const keys1 = Object.keys(obj1); - const keys2 = Object.keys(obj2); - if (keys1.length !== keys2.length) { - return false; - } - for (let key of keys1) { - if (obj2.hasOwnProperty(key) === false || obj1[key] !== obj2[key]) { - return false; - } - } - return true; -} - -function Slider(container, options, plugins) { - let slider; - let subs = {}; - function init() { - slider.container = container; - // ensure container has id - let containerId = container.getAttribute('id'); - if (containerId === null) { - containerId = generateId('overflow-slider'); - container.setAttribute('id', containerId); - } - setDetails(true); - slider.on('contentsChanged', () => setDetails()); - slider.on('containerSizeChanged', () => setDetails()); - let requestId = 0; - const setDetailsDebounce = () => { - if (requestId) { - window.cancelAnimationFrame(requestId); - } - requestId = window.requestAnimationFrame(() => { - setDetails(); - }); - }; - slider.on('scroll', setDetailsDebounce); - addEventListeners(); - setDataAttributes(); - setCSSVariables(); - if (plugins) { - for (const plugin of plugins) { - plugin(slider); - } - } - slider.on('detailsChanged', () => { - setDataAttributes(); - setCSSVariables(); - }); - slider.emit('created'); - } - function setDetails(isInit = false) { - const oldDetails = slider.details; - const newDetails = details(slider); - slider.details = newDetails; - if (!isInit && !objectsAreEqual(oldDetails, newDetails)) { - slider.emit('detailsChanged'); - } - else if (isInit) { - slider.emit('detailsChanged'); - } - } - function addEventListeners() { - // changes to DOM - const observer = new MutationObserver(() => slider.emit('contentsChanged')); - observer.observe(slider.container, { childList: true }); - // container size changes - const resizeObserver = new ResizeObserver(() => slider.emit('containerSizeChanged')); - resizeObserver.observe(slider.container); - // scroll event with debouncing - slider.container.addEventListener('scroll', () => slider.emit('scroll')); - // Listen for mouse down and touch start events on the document - // This handles both mouse clicks and touch interactions - let wasInteractedWith = false; - slider.container.addEventListener('mousedown', () => { - wasInteractedWith = true; - }); - slider.container.addEventListener('touchstart', () => { - wasInteractedWith = true; - }, { passive: true }); - slider.container.addEventListener('focusin', (e) => { - // move target parents as long as they are not the container - // but only if focus didn't start from mouse or touch - if (!wasInteractedWith) { - let target = e.target; - while (target.parentElement !== slider.container) { - if (target.parentElement) { - target = target.parentElement; - } - else { - break; - } - } - ensureSlideIsInView(target); - } - wasInteractedWith = false; - }); - } - function setCSSVariables() { - slider.container.style.setProperty('--slider-container-width', `${slider.details.containerWidth}px`); - slider.container.style.setProperty('--slider-scrollable-width', `${slider.details.scrollableAreaWidth}px`); - slider.container.style.setProperty('--slider-slides-count', `${slider.details.slideCount}`); - } - function setDataAttributes() { - slider.container.setAttribute('data-has-overflow', slider.details.hasOverflow ? 'true' : 'false'); - } - function ensureSlideIsInView(slide) { - const slideRect = slide.getBoundingClientRect(); - const sliderRect = slider.container.getBoundingClientRect(); - const containerWidth = slider.container.offsetWidth; - const scrollLeft = slider.container.scrollLeft; - const slideStart = slideRect.left - sliderRect.left + scrollLeft; - const slideEnd = slideStart + slideRect.width; - let scrollTarget = null; - if (slideStart < scrollLeft) { - scrollTarget = slideStart; - } - else if (slideEnd > scrollLeft + containerWidth) { - scrollTarget = slideEnd - containerWidth; - } - if (scrollTarget) { - slider.container.style.scrollSnapType = 'none'; - slider.container.scrollLeft = scrollTarget; - // @todo resume scroll snapping but at least proximity gives a lot of trouble - // and it's not really needed for this use case but it would be nice to have - // it back in case it's needed. We need to calculate scrollLeft some other way - } - } - function moveToDirection(direction = "prev") { - const scrollStrategy = slider.options.scrollStrategy; - const scrollLeft = slider.container.scrollLeft; - const sliderRect = slider.container.getBoundingClientRect(); - const containerWidth = slider.container.offsetWidth; - let targetScrollPosition = scrollLeft; - if (direction === 'prev') { - targetScrollPosition = Math.max(0, scrollLeft - slider.container.offsetWidth); - } - else if (direction === 'next') { - targetScrollPosition = Math.min(slider.container.scrollWidth, scrollLeft + slider.container.offsetWidth); - } - if (scrollStrategy === 'fullSlide') { - let fullSldeTargetScrollPosition = null; - const slides = Array.from(slider.container.querySelectorAll(':scope > *')); - let gapSize = 0; - if (slides.length > 1) { - const firstSlideRect = slides[0].getBoundingClientRect(); - const secondSlideRect = slides[1].getBoundingClientRect(); - gapSize = secondSlideRect.left - firstSlideRect.right; - } - // extend targetScrollPosition to include gap - if (direction === 'prev') { - fullSldeTargetScrollPosition = Math.max(0, targetScrollPosition - gapSize); - } - else { - fullSldeTargetScrollPosition = Math.min(slider.container.scrollWidth, targetScrollPosition + gapSize); - } - if (direction === 'next') { - let partialSlideFound = false; - for (let slide of slides) { - const slideRect = slide.getBoundingClientRect(); - const slideStart = slideRect.left - sliderRect.left + scrollLeft; - const slideEnd = slideStart + slideRect.width; - if (slideStart < targetScrollPosition && slideEnd > targetScrollPosition) { - fullSldeTargetScrollPosition = slideStart; - partialSlideFound = true; - break; - } - } - if (!partialSlideFound) { - fullSldeTargetScrollPosition = Math.min(targetScrollPosition, slider.container.scrollWidth - slider.container.offsetWidth); - } - if (fullSldeTargetScrollPosition && fullSldeTargetScrollPosition > scrollLeft) { - targetScrollPosition = fullSldeTargetScrollPosition; - } - } - else { - let partialSlideFound = false; - for (let slide of slides) { - const slideRect = slide.getBoundingClientRect(); - const slideStart = slideRect.left - sliderRect.left + scrollLeft; - const slideEnd = slideStart + slideRect.width; - if (slideStart < scrollLeft && slideEnd > scrollLeft) { - fullSldeTargetScrollPosition = slideEnd - containerWidth; - partialSlideFound = true; - break; - } - } - if (!partialSlideFound) { - fullSldeTargetScrollPosition = Math.max(0, scrollLeft - containerWidth); - } - if (fullSldeTargetScrollPosition && fullSldeTargetScrollPosition < scrollLeft) { - targetScrollPosition = fullSldeTargetScrollPosition; - } - } - } - slider.container.style.scrollBehavior = slider.options.scrollBehavior; - slider.container.scrollLeft = targetScrollPosition; - setTimeout(() => slider.container.style.scrollBehavior = '', 50); - } - function on(name, cb) { - if (!subs[name]) { - subs[name] = []; - } - subs[name].push(cb); - } - function emit(name) { - var _a; - if (subs && subs[name]) { - subs[name].forEach(cb => { - cb(slider); - }); - } - const optionCallBack = (_a = slider === null || slider === void 0 ? void 0 : slider.options) === null || _a === void 0 ? void 0 : _a[name]; - if (typeof optionCallBack === 'function') { - optionCallBack(slider); - } - } - slider = { - emit, - moveToDirection, - on, - options, - }; - init(); - return slider; -} - -function OverflowSlider(container, options, plugins) { - try { - // check that container HTML element - if (!(container instanceof Element)) { - throw new Error(`Container must be HTML element, found ${typeof container}`); - } - const defaults = { - scrollBehavior: "smooth", - scrollStrategy: "fullSlide", - }; - const sliderOptions = Object.assign(Object.assign({}, defaults), options); - // disable smooth scrolling if user prefers reduced motion - if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) { - sliderOptions.scrollBehavior = "auto"; - } - return Slider(container, sliderOptions, plugins); - } - catch (e) { - console.error(e); - } -} - -const DEFAULT_TEXTS$2 = { - skipList: 'Skip list' -}; -const DEFAULT_CLASS_NAMES$3 = { - skipLink: 'screen-reader-text', - skipLinkTarget: 'overflow-slider__skip-link-target', -}; -function SkipLinksPlugin(args) { - return (slider) => { - var _a, _b, _c, _d, _e, _f; - const options = { - texts: Object.assign(Object.assign({}, DEFAULT_TEXTS$2), (args === null || args === void 0 ? void 0 : args.texts) || []), - classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES$3), (args === null || args === void 0 ? void 0 : args.classNames) || []), - containerBefore: (_a = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _a !== void 0 ? _a : null, - containerAfter: (_b = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _b !== void 0 ? _b : null, - }; - const skipId = generateId('overflow-slider-skip'); - const skipLinkEl = document.createElement('a'); - skipLinkEl.setAttribute('href', `#${skipId}`); - skipLinkEl.textContent = options.texts.skipList; - skipLinkEl.classList.add(options.classNames.skipLink); - const skipTargetEl = document.createElement('div'); - skipTargetEl.setAttribute('id', skipId); - skipTargetEl.setAttribute('tabindex', '-1'); - if (options.containerBefore) { - (_c = options.containerBefore.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(skipLinkEl, options.containerBefore); - } - else { - (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(skipLinkEl, slider.container); - } - if (options.containerAfter) { - (_e = options.containerAfter.parentNode) === null || _e === void 0 ? void 0 : _e.insertBefore(skipTargetEl, options.containerAfter.nextSibling); - } - else { - (_f = slider.container.parentNode) === null || _f === void 0 ? void 0 : _f.insertBefore(skipTargetEl, slider.container.nextSibling); - } - }; -} - -const DEFAULT_TEXTS$1 = { - buttonPrevious: 'Previous items', - buttonNext: 'Next items', -}; -const DEFAULT_ICONS = { - prev: '', - next: '', -}; -const DEFAULT_CLASS_NAMES$2 = { - navContainer: 'overflow-slider__arrows', - prevButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--prev', - nextButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--next', -}; -function ArrowsPlugin(args) { - return (slider) => { - var _a, _b, _c, _d; - const options = { - texts: Object.assign(Object.assign({}, DEFAULT_TEXTS$1), (args === null || args === void 0 ? void 0 : args.texts) || []), - icons: Object.assign(Object.assign({}, DEFAULT_ICONS), (args === null || args === void 0 ? void 0 : args.icons) || []), - classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES$2), (args === null || args === void 0 ? void 0 : args.classNames) || []), - container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, - }; - const nav = document.createElement('div'); - nav.classList.add(options.classNames.navContainer); - const prev = document.createElement('button'); - prev.setAttribute('class', options.classNames.prevButton); - prev.setAttribute('type', 'button'); - prev.setAttribute('aria-label', options.texts.buttonPrevious); - prev.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); - prev.setAttribute('data-type', 'prev'); - prev.innerHTML = options.icons.prev; - prev.addEventListener('click', () => slider.moveToDirection('prev')); - const next = document.createElement('button'); - next.setAttribute('class', options.classNames.nextButton); - next.setAttribute('type', 'button'); - next.setAttribute('aria-label', options.texts.buttonNext); - next.setAttribute('aria-controls', (_c = slider.container.getAttribute('id')) !== null && _c !== void 0 ? _c : ''); - next.setAttribute('data-type', 'next'); - next.innerHTML = options.icons.next; - next.addEventListener('click', () => slider.moveToDirection('next')); - // insert buttons to the nav - nav.appendChild(prev); - nav.appendChild(next); - const update = () => { - const scrollLeft = slider.container.scrollLeft; - const scrollWidth = slider.container.scrollWidth; - const clientWidth = slider.container.clientWidth; - if (scrollLeft === 0) { - prev.setAttribute('data-has-content', 'false'); - } - else { - prev.setAttribute('data-has-content', 'true'); - } - if (scrollLeft + clientWidth >= scrollWidth) { - next.setAttribute('data-has-content', 'false'); - } - else { - next.setAttribute('data-has-content', 'true'); - } - }; - if (options.container) { - options.container.appendChild(nav); - } - else { - (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(nav, slider.container.nextSibling); - } - update(); - slider.on('scroll', update); - slider.on('contentsChanged', update); - slider.on('containerSizeChanged', update); - }; -} - -const DEFAULT_CLASS_NAMES$1 = { - scrollIndicator: 'overflow-slider__scroll-indicator', - scrollIndicatorBar: 'overflow-slider__scroll-indicator-bar', - scrollIndicatorButton: 'overflow-slider__scroll-indicator-button', -}; -function ScrollIndicatorPlugin(args) { - return (slider) => { - var _a, _b, _c; - const options = { - classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES$1), (args === null || args === void 0 ? void 0 : args.classNames) || []), - container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, - }; - const scrollbarContainer = document.createElement('div'); - scrollbarContainer.setAttribute('class', options.classNames.scrollIndicator); - scrollbarContainer.setAttribute('tabindex', '0'); - scrollbarContainer.setAttribute('role', 'scrollbar'); - scrollbarContainer.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); - scrollbarContainer.setAttribute('aria-orientation', 'horizontal'); - scrollbarContainer.setAttribute('aria-valuemax', '100'); - scrollbarContainer.setAttribute('aria-valuemin', '0'); - scrollbarContainer.setAttribute('aria-valuenow', '0'); - const scrollbar = document.createElement('div'); - scrollbar.setAttribute('class', options.classNames.scrollIndicatorBar); - const scrollbarButton = document.createElement('div'); - scrollbarButton.setAttribute('class', options.classNames.scrollIndicatorButton); - scrollbarButton.setAttribute('data-is-grabbed', 'false'); - scrollbar.appendChild(scrollbarButton); - scrollbarContainer.appendChild(scrollbar); - const setDataAttributes = () => { - scrollbarContainer.setAttribute('data-has-overflow', slider.details.hasOverflow.toString()); - }; - setDataAttributes(); - const getScrollbarButtonLeftOffset = () => { - const scrollbarRatio = slider.container.offsetWidth / slider.container.scrollWidth; - return slider.container.scrollLeft * scrollbarRatio; - }; - // scrollbarbutton width and position is calculated based on the scroll position and available width - let requestId = 0; - const update = () => { - if (requestId) { - window.cancelAnimationFrame(requestId); - } - requestId = window.requestAnimationFrame(() => { - const scrollbarButtonWidth = (slider.container.offsetWidth / slider.container.scrollWidth) * 100; - const scrollLeftInPortion = getScrollbarButtonLeftOffset(); - scrollbarButton.style.width = `${scrollbarButtonWidth}%`; - scrollbarButton.style.transform = `translateX(${scrollLeftInPortion}px)`; - // aria-valuenow - const scrollLeft = slider.container.scrollLeft; - const scrollWidth = slider.container.scrollWidth; - const containerWidth = slider.container.offsetWidth; - const scrollPercentage = (scrollLeft / (scrollWidth - containerWidth)) * 100; - scrollbarContainer.setAttribute('aria-valuenow', Math.round(Number.isNaN(scrollPercentage) ? 0 : scrollPercentage).toString()); - }); - }; - // insert to DOM - if (options.container) { - options.container.appendChild(scrollbarContainer); - } - else { - (_c = slider.container.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(scrollbarContainer, slider.container.nextSibling); - } - // update the scrollbar when the slider is scrolled - update(); - slider.on('scroll', update); - slider.on('contentsChanged', update); - slider.on('containerSizeChanged', update); - slider.on('detailsChanged', setDataAttributes); - // handle arrow keys while focused - scrollbarContainer.addEventListener('keydown', (e) => { - if (e.key === 'ArrowLeft') { - slider.moveToDirection('prev'); - } - else if (e.key === 'ArrowRight') { - slider.moveToDirection('next'); - } - }); - // handle click to before or after the scrollbar button - scrollbarContainer.addEventListener('click', (e) => { - const scrollbarButtonWidth = scrollbarButton.offsetWidth; - const scrollbarButtonLeft = getScrollbarButtonLeftOffset(); - const scrollbarButtonRight = scrollbarButtonLeft + scrollbarButtonWidth; - const clickX = e.pageX - scrollbarContainer.offsetLeft; - if (clickX < scrollbarButtonLeft) { - slider.moveToDirection('prev'); - } - else if (clickX > scrollbarButtonRight) { - slider.moveToDirection('next'); - } - }); - // make scrollbar button draggable via mouse/touch and update the scroll position - let isInteractionDown = false; - let startX = 0; - let scrollLeft = 0; - const onInteractionDown = (e) => { - isInteractionDown = true; - const pageX = e.pageX || e.touches[0].pageX; - startX = pageX - scrollbarContainer.offsetLeft; - scrollLeft = slider.container.scrollLeft; - // change cursor to grabbing - scrollbarButton.style.cursor = 'grabbing'; - slider.container.style.scrollSnapType = 'none'; - scrollbarButton.setAttribute('data-is-grabbed', 'true'); - e.preventDefault(); - e.stopPropagation(); - }; - const onInteractionMove = (e) => { - if (!isInteractionDown) { - return; - } - e.preventDefault(); - const pageX = e.pageX || e.touches[0].pageX; - const x = pageX - scrollbarContainer.offsetLeft; - const scrollingFactor = slider.container.scrollWidth / scrollbarContainer.offsetWidth; - const walk = (x - startX) * scrollingFactor; - slider.container.scrollLeft = scrollLeft + walk; - }; - const onInteractionUp = () => { - isInteractionDown = false; - scrollbarButton.style.cursor = ''; - slider.container.style.scrollSnapType = ''; - scrollbarButton.setAttribute('data-is-grabbed', 'false'); - }; - scrollbarButton.addEventListener('mousedown', onInteractionDown); - scrollbarButton.addEventListener('touchstart', onInteractionDown); - window.addEventListener('mousemove', onInteractionMove); - window.addEventListener('touchmove', onInteractionMove, { passive: false }); - window.addEventListener('mouseup', onInteractionUp); - window.addEventListener('touchend', onInteractionUp); - }; -} - -const DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK = 20; -function DragScrollingPlugin(args) { - var _a; - const options = { - draggedDistanceThatPreventsClick: (_a = args === null || args === void 0 ? void 0 : args.draggedDistanceThatPreventsClick) !== null && _a !== void 0 ? _a : DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK, - }; - return (slider) => { - let isMouseDown = false; - let startX = 0; - let scrollLeft = 0; - // add data attribute to container - slider.container.setAttribute('data-has-drag-scrolling', 'true'); - slider.container.addEventListener('mousedown', (e) => { - if (!slider.details.hasOverflow) { - return; - } - isMouseDown = true; - startX = e.pageX - slider.container.offsetLeft; - scrollLeft = slider.container.scrollLeft; - // change cursor to grabbing - slider.container.style.cursor = 'grabbing'; - slider.container.style.scrollSnapType = 'none'; - slider.container.style.scrollBehavior = 'auto'; - // prevent pointer events on the slides - // const slides = slider.container.querySelectorAll( ':scope > *' ); - // slides.forEach((slide) => { - // (slide).style.pointerEvents = 'none'; - // }); - // prevent focus going to the slides - // e.preventDefault(); - // e.stopPropagation(); - }); - window.addEventListener('mouseup', () => { - if (!slider.details.hasOverflow) { - return; - } - isMouseDown = false; - slider.container.style.cursor = ''; - // slider.container.style.scrollBehavior = slider.options.scrollBehavior; - setTimeout(() => { - slider.container.style.scrollSnapType = ''; - slider.container.style.scrollBehavior = ''; - const slides = slider.container.querySelectorAll(':scope > *'); - slides.forEach((slide) => { - slide.style.pointerEvents = ''; - }); - }, 50); - }); - window.addEventListener('mousemove', (e) => { - if (!slider.details.hasOverflow) { - return; - } - if (!isMouseDown) { - return; - } - e.preventDefault(); - const x = e.pageX - slider.container.offsetLeft; - const walk = (x - startX); - slider.container.scrollLeft = scrollLeft - walk; - // if walk is more than 30px, don't allow click event - // e.preventDefault(); - const absWalk = Math.abs(walk); - const slides = slider.container.querySelectorAll(':scope > *'); - const pointerEvents = absWalk > options.draggedDistanceThatPreventsClick ? 'none' : ''; - slides.forEach((slide) => { - slide.style.pointerEvents = pointerEvents; - }); - }); - }; -} - -const DEFAULT_TEXTS = { - dotDescription: 'Page %d of %d', -}; -const DEFAULT_CLASS_NAMES = { - dotsContainer: 'overflow-slider__dots', - dotsItem: 'overflow-slider__dot-item', -}; -function DotsPlugin(args) { - return (slider) => { - var _a, _b; - const options = { - texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), - classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), - container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, - }; - const dots = document.createElement('div'); - dots.classList.add(options.classNames.dotsContainer); - let pageFocused = null; - const buildDots = () => { - dots.setAttribute('data-has-content', slider.details.hasOverflow.toString()); - dots.innerHTML = ''; - const dotsList = document.createElement('ul'); - const pages = slider.details.amountOfPages; - const currentPage = slider.details.currentPage; - if (pages <= 1) { - return; - } - for (let i = 0; i < pages; i++) { - const dotListItem = document.createElement('li'); - const dot = document.createElement('button'); - dot.setAttribute('type', 'button'); - dot.setAttribute('class', options.classNames.dotsItem); - dot.setAttribute('aria-label', options.texts.dotDescription.replace('%d', (i + 1).toString()).replace('%d', pages.toString())); - dot.setAttribute('aria-pressed', (i === currentPage).toString()); - dot.setAttribute('data-page', (i + 1).toString()); - dotListItem.appendChild(dot); - dotsList.appendChild(dotListItem); - dot.addEventListener('click', () => activateDot(i + 1)); - dot.addEventListener('focus', () => pageFocused = i + 1); - dot.addEventListener('keydown', (e) => { - var _a; - const currentPageItem = dots.querySelector(`[aria-pressed="true"]`); - if (!currentPageItem) { - return; - } - const currentPage = parseInt((_a = currentPageItem.getAttribute('data-page')) !== null && _a !== void 0 ? _a : '1'); - if (e.key === 'ArrowLeft') { - const previousPage = currentPage - 1; - if (previousPage > 0) { - const matchingDot = dots.querySelector(`[data-page="${previousPage}"]`); - if (matchingDot) { - matchingDot.focus(); - } - activateDot(previousPage); - } - } - if (e.key === 'ArrowRight') { - const nextPage = currentPage + 1; - if (nextPage <= pages) { - const matchingDot = dots.querySelector(`[data-page="${nextPage}"]`); - if (matchingDot) { - matchingDot.focus(); - } - activateDot(nextPage); - } - } - }); - } - dots.appendChild(dotsList); - // return focus to same page after rebuild - if (pageFocused) { - const matchingDot = dots.querySelector(`[data-page="${pageFocused}"]`); - if (matchingDot) { - matchingDot.focus(); - } - } - }; - const activateDot = (page) => { - const scrollTargetPosition = slider.details.containerWidth * (page - 1); - slider.container.style.scrollBehavior = slider.options.scrollBehavior; - slider.container.style.scrollSnapType = 'none'; - slider.container.scrollLeft = scrollTargetPosition; - slider.container.style.scrollBehavior = ''; - slider.container.style.scrollSnapType = ''; - }; - buildDots(); - if (options.container) { - options.container.appendChild(dots); - } - else { - (_b = slider.container.parentNode) === null || _b === void 0 ? void 0 : _b.insertBefore(dots, slider.container.nextSibling); - } - slider.on('detailsChanged', () => { - buildDots(); - }); - }; -} - -export { ArrowsPlugin, DotsPlugin, DragScrollingPlugin, OverflowSlider, ScrollIndicatorPlugin, SkipLinksPlugin }; +export { default as OverflowSlider } from './overflow-slider.esm.js'; diff --git a/dist/index.js b/dist/index.js index 96b79d9..dc8dd86 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,719 +1,6 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.OverflowSlider = {})); -})(this, (function (exports) { 'use strict'; - - function details(slider) { - let instance; - let hasOverflow = false; - let slideCount = 0; - let containerWidth = 0; - let scrollableAreaWidth = 0; - let amountOfPages = 0; - let currentPage = 1; - if (slider.container.scrollWidth > slider.container.clientWidth) { - hasOverflow = true; - } - slideCount = Array.from(slider.container.querySelectorAll(':scope > *')).length; - containerWidth = slider.container.offsetWidth; - scrollableAreaWidth = slider.container.scrollWidth; - amountOfPages = Math.ceil(scrollableAreaWidth / containerWidth); - if (slider.container.scrollLeft >= 0) { - currentPage = Math.floor(slider.container.scrollLeft / containerWidth); - // consider as last page if the scrollLeft + containerWidth is equal to scrollWidth - if (slider.container.scrollLeft + containerWidth === scrollableAreaWidth) { - currentPage = amountOfPages - 1; - } - } - instance = { - hasOverflow, - slideCount, - containerWidth, - scrollableAreaWidth, - amountOfPages, - currentPage, - }; - return instance; - } - - function generateId(prefix, i = 1) { - const id = `${prefix}-${i}`; - if (document.getElementById(id)) { - return generateId(prefix, i + 1); - } - return id; - } - function objectsAreEqual(obj1, obj2) { - const keys1 = Object.keys(obj1); - const keys2 = Object.keys(obj2); - if (keys1.length !== keys2.length) { - return false; - } - for (let key of keys1) { - if (obj2.hasOwnProperty(key) === false || obj1[key] !== obj2[key]) { - return false; - } - } - return true; - } - - function Slider(container, options, plugins) { - let slider; - let subs = {}; - function init() { - slider.container = container; - // ensure container has id - let containerId = container.getAttribute('id'); - if (containerId === null) { - containerId = generateId('overflow-slider'); - container.setAttribute('id', containerId); - } - setDetails(true); - slider.on('contentsChanged', () => setDetails()); - slider.on('containerSizeChanged', () => setDetails()); - let requestId = 0; - const setDetailsDebounce = () => { - if (requestId) { - window.cancelAnimationFrame(requestId); - } - requestId = window.requestAnimationFrame(() => { - setDetails(); - }); - }; - slider.on('scroll', setDetailsDebounce); - addEventListeners(); - setDataAttributes(); - setCSSVariables(); - if (plugins) { - for (const plugin of plugins) { - plugin(slider); - } - } - slider.on('detailsChanged', () => { - setDataAttributes(); - setCSSVariables(); - }); - slider.emit('created'); - } - function setDetails(isInit = false) { - const oldDetails = slider.details; - const newDetails = details(slider); - slider.details = newDetails; - if (!isInit && !objectsAreEqual(oldDetails, newDetails)) { - slider.emit('detailsChanged'); - } - else if (isInit) { - slider.emit('detailsChanged'); - } - } - function addEventListeners() { - // changes to DOM - const observer = new MutationObserver(() => slider.emit('contentsChanged')); - observer.observe(slider.container, { childList: true }); - // container size changes - const resizeObserver = new ResizeObserver(() => slider.emit('containerSizeChanged')); - resizeObserver.observe(slider.container); - // scroll event with debouncing - slider.container.addEventListener('scroll', () => slider.emit('scroll')); - // Listen for mouse down and touch start events on the document - // This handles both mouse clicks and touch interactions - let wasInteractedWith = false; - slider.container.addEventListener('mousedown', () => { - wasInteractedWith = true; - }); - slider.container.addEventListener('touchstart', () => { - wasInteractedWith = true; - }, { passive: true }); - slider.container.addEventListener('focusin', (e) => { - // move target parents as long as they are not the container - // but only if focus didn't start from mouse or touch - if (!wasInteractedWith) { - let target = e.target; - while (target.parentElement !== slider.container) { - if (target.parentElement) { - target = target.parentElement; - } - else { - break; - } - } - ensureSlideIsInView(target); - } - wasInteractedWith = false; - }); - } - function setCSSVariables() { - slider.container.style.setProperty('--slider-container-width', `${slider.details.containerWidth}px`); - slider.container.style.setProperty('--slider-scrollable-width', `${slider.details.scrollableAreaWidth}px`); - slider.container.style.setProperty('--slider-slides-count', `${slider.details.slideCount}`); - } - function setDataAttributes() { - slider.container.setAttribute('data-has-overflow', slider.details.hasOverflow ? 'true' : 'false'); - } - function ensureSlideIsInView(slide) { - const slideRect = slide.getBoundingClientRect(); - const sliderRect = slider.container.getBoundingClientRect(); - const containerWidth = slider.container.offsetWidth; - const scrollLeft = slider.container.scrollLeft; - const slideStart = slideRect.left - sliderRect.left + scrollLeft; - const slideEnd = slideStart + slideRect.width; - let scrollTarget = null; - if (slideStart < scrollLeft) { - scrollTarget = slideStart; - } - else if (slideEnd > scrollLeft + containerWidth) { - scrollTarget = slideEnd - containerWidth; - } - if (scrollTarget) { - slider.container.style.scrollSnapType = 'none'; - slider.container.scrollLeft = scrollTarget; - // @todo resume scroll snapping but at least proximity gives a lot of trouble - // and it's not really needed for this use case but it would be nice to have - // it back in case it's needed. We need to calculate scrollLeft some other way - } - } - function moveToDirection(direction = "prev") { - const scrollStrategy = slider.options.scrollStrategy; - const scrollLeft = slider.container.scrollLeft; - const sliderRect = slider.container.getBoundingClientRect(); - const containerWidth = slider.container.offsetWidth; - let targetScrollPosition = scrollLeft; - if (direction === 'prev') { - targetScrollPosition = Math.max(0, scrollLeft - slider.container.offsetWidth); - } - else if (direction === 'next') { - targetScrollPosition = Math.min(slider.container.scrollWidth, scrollLeft + slider.container.offsetWidth); - } - if (scrollStrategy === 'fullSlide') { - let fullSldeTargetScrollPosition = null; - const slides = Array.from(slider.container.querySelectorAll(':scope > *')); - let gapSize = 0; - if (slides.length > 1) { - const firstSlideRect = slides[0].getBoundingClientRect(); - const secondSlideRect = slides[1].getBoundingClientRect(); - gapSize = secondSlideRect.left - firstSlideRect.right; - } - // extend targetScrollPosition to include gap - if (direction === 'prev') { - fullSldeTargetScrollPosition = Math.max(0, targetScrollPosition - gapSize); - } - else { - fullSldeTargetScrollPosition = Math.min(slider.container.scrollWidth, targetScrollPosition + gapSize); - } - if (direction === 'next') { - let partialSlideFound = false; - for (let slide of slides) { - const slideRect = slide.getBoundingClientRect(); - const slideStart = slideRect.left - sliderRect.left + scrollLeft; - const slideEnd = slideStart + slideRect.width; - if (slideStart < targetScrollPosition && slideEnd > targetScrollPosition) { - fullSldeTargetScrollPosition = slideStart; - partialSlideFound = true; - break; - } - } - if (!partialSlideFound) { - fullSldeTargetScrollPosition = Math.min(targetScrollPosition, slider.container.scrollWidth - slider.container.offsetWidth); - } - if (fullSldeTargetScrollPosition && fullSldeTargetScrollPosition > scrollLeft) { - targetScrollPosition = fullSldeTargetScrollPosition; - } - } - else { - let partialSlideFound = false; - for (let slide of slides) { - const slideRect = slide.getBoundingClientRect(); - const slideStart = slideRect.left - sliderRect.left + scrollLeft; - const slideEnd = slideStart + slideRect.width; - if (slideStart < scrollLeft && slideEnd > scrollLeft) { - fullSldeTargetScrollPosition = slideEnd - containerWidth; - partialSlideFound = true; - break; - } - } - if (!partialSlideFound) { - fullSldeTargetScrollPosition = Math.max(0, scrollLeft - containerWidth); - } - if (fullSldeTargetScrollPosition && fullSldeTargetScrollPosition < scrollLeft) { - targetScrollPosition = fullSldeTargetScrollPosition; - } - } - } - slider.container.style.scrollBehavior = slider.options.scrollBehavior; - slider.container.scrollLeft = targetScrollPosition; - setTimeout(() => slider.container.style.scrollBehavior = '', 50); - } - function on(name, cb) { - if (!subs[name]) { - subs[name] = []; - } - subs[name].push(cb); - } - function emit(name) { - var _a; - if (subs && subs[name]) { - subs[name].forEach(cb => { - cb(slider); - }); - } - const optionCallBack = (_a = slider === null || slider === void 0 ? void 0 : slider.options) === null || _a === void 0 ? void 0 : _a[name]; - if (typeof optionCallBack === 'function') { - optionCallBack(slider); - } - } - slider = { - emit, - moveToDirection, - on, - options, - }; - init(); - return slider; - } - - function OverflowSlider(container, options, plugins) { - try { - // check that container HTML element - if (!(container instanceof Element)) { - throw new Error(`Container must be HTML element, found ${typeof container}`); - } - const defaults = { - scrollBehavior: "smooth", - scrollStrategy: "fullSlide", - }; - const sliderOptions = Object.assign(Object.assign({}, defaults), options); - // disable smooth scrolling if user prefers reduced motion - if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) { - sliderOptions.scrollBehavior = "auto"; - } - return Slider(container, sliderOptions, plugins); - } - catch (e) { - console.error(e); - } - } - - const DEFAULT_TEXTS$2 = { - skipList: 'Skip list' - }; - const DEFAULT_CLASS_NAMES$3 = { - skipLink: 'screen-reader-text', - skipLinkTarget: 'overflow-slider__skip-link-target', - }; - function SkipLinksPlugin(args) { - return (slider) => { - var _a, _b, _c, _d, _e, _f; - const options = { - texts: Object.assign(Object.assign({}, DEFAULT_TEXTS$2), (args === null || args === void 0 ? void 0 : args.texts) || []), - classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES$3), (args === null || args === void 0 ? void 0 : args.classNames) || []), - containerBefore: (_a = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _a !== void 0 ? _a : null, - containerAfter: (_b = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _b !== void 0 ? _b : null, - }; - const skipId = generateId('overflow-slider-skip'); - const skipLinkEl = document.createElement('a'); - skipLinkEl.setAttribute('href', `#${skipId}`); - skipLinkEl.textContent = options.texts.skipList; - skipLinkEl.classList.add(options.classNames.skipLink); - const skipTargetEl = document.createElement('div'); - skipTargetEl.setAttribute('id', skipId); - skipTargetEl.setAttribute('tabindex', '-1'); - if (options.containerBefore) { - (_c = options.containerBefore.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(skipLinkEl, options.containerBefore); - } - else { - (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(skipLinkEl, slider.container); - } - if (options.containerAfter) { - (_e = options.containerAfter.parentNode) === null || _e === void 0 ? void 0 : _e.insertBefore(skipTargetEl, options.containerAfter.nextSibling); - } - else { - (_f = slider.container.parentNode) === null || _f === void 0 ? void 0 : _f.insertBefore(skipTargetEl, slider.container.nextSibling); - } - }; - } - - const DEFAULT_TEXTS$1 = { - buttonPrevious: 'Previous items', - buttonNext: 'Next items', - }; - const DEFAULT_ICONS = { - prev: '', - next: '', - }; - const DEFAULT_CLASS_NAMES$2 = { - navContainer: 'overflow-slider__arrows', - prevButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--prev', - nextButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--next', - }; - function ArrowsPlugin(args) { - return (slider) => { - var _a, _b, _c, _d; - const options = { - texts: Object.assign(Object.assign({}, DEFAULT_TEXTS$1), (args === null || args === void 0 ? void 0 : args.texts) || []), - icons: Object.assign(Object.assign({}, DEFAULT_ICONS), (args === null || args === void 0 ? void 0 : args.icons) || []), - classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES$2), (args === null || args === void 0 ? void 0 : args.classNames) || []), - container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, - }; - const nav = document.createElement('div'); - nav.classList.add(options.classNames.navContainer); - const prev = document.createElement('button'); - prev.setAttribute('class', options.classNames.prevButton); - prev.setAttribute('type', 'button'); - prev.setAttribute('aria-label', options.texts.buttonPrevious); - prev.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); - prev.setAttribute('data-type', 'prev'); - prev.innerHTML = options.icons.prev; - prev.addEventListener('click', () => slider.moveToDirection('prev')); - const next = document.createElement('button'); - next.setAttribute('class', options.classNames.nextButton); - next.setAttribute('type', 'button'); - next.setAttribute('aria-label', options.texts.buttonNext); - next.setAttribute('aria-controls', (_c = slider.container.getAttribute('id')) !== null && _c !== void 0 ? _c : ''); - next.setAttribute('data-type', 'next'); - next.innerHTML = options.icons.next; - next.addEventListener('click', () => slider.moveToDirection('next')); - // insert buttons to the nav - nav.appendChild(prev); - nav.appendChild(next); - const update = () => { - const scrollLeft = slider.container.scrollLeft; - const scrollWidth = slider.container.scrollWidth; - const clientWidth = slider.container.clientWidth; - if (scrollLeft === 0) { - prev.setAttribute('data-has-content', 'false'); - } - else { - prev.setAttribute('data-has-content', 'true'); - } - if (scrollLeft + clientWidth >= scrollWidth) { - next.setAttribute('data-has-content', 'false'); - } - else { - next.setAttribute('data-has-content', 'true'); - } - }; - if (options.container) { - options.container.appendChild(nav); - } - else { - (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(nav, slider.container.nextSibling); - } - update(); - slider.on('scroll', update); - slider.on('contentsChanged', update); - slider.on('containerSizeChanged', update); - }; - } - - const DEFAULT_CLASS_NAMES$1 = { - scrollIndicator: 'overflow-slider__scroll-indicator', - scrollIndicatorBar: 'overflow-slider__scroll-indicator-bar', - scrollIndicatorButton: 'overflow-slider__scroll-indicator-button', - }; - function ScrollIndicatorPlugin(args) { - return (slider) => { - var _a, _b, _c; - const options = { - classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES$1), (args === null || args === void 0 ? void 0 : args.classNames) || []), - container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, - }; - const scrollbarContainer = document.createElement('div'); - scrollbarContainer.setAttribute('class', options.classNames.scrollIndicator); - scrollbarContainer.setAttribute('tabindex', '0'); - scrollbarContainer.setAttribute('role', 'scrollbar'); - scrollbarContainer.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); - scrollbarContainer.setAttribute('aria-orientation', 'horizontal'); - scrollbarContainer.setAttribute('aria-valuemax', '100'); - scrollbarContainer.setAttribute('aria-valuemin', '0'); - scrollbarContainer.setAttribute('aria-valuenow', '0'); - const scrollbar = document.createElement('div'); - scrollbar.setAttribute('class', options.classNames.scrollIndicatorBar); - const scrollbarButton = document.createElement('div'); - scrollbarButton.setAttribute('class', options.classNames.scrollIndicatorButton); - scrollbarButton.setAttribute('data-is-grabbed', 'false'); - scrollbar.appendChild(scrollbarButton); - scrollbarContainer.appendChild(scrollbar); - const setDataAttributes = () => { - scrollbarContainer.setAttribute('data-has-overflow', slider.details.hasOverflow.toString()); - }; - setDataAttributes(); - const getScrollbarButtonLeftOffset = () => { - const scrollbarRatio = slider.container.offsetWidth / slider.container.scrollWidth; - return slider.container.scrollLeft * scrollbarRatio; - }; - // scrollbarbutton width and position is calculated based on the scroll position and available width - let requestId = 0; - const update = () => { - if (requestId) { - window.cancelAnimationFrame(requestId); - } - requestId = window.requestAnimationFrame(() => { - const scrollbarButtonWidth = (slider.container.offsetWidth / slider.container.scrollWidth) * 100; - const scrollLeftInPortion = getScrollbarButtonLeftOffset(); - scrollbarButton.style.width = `${scrollbarButtonWidth}%`; - scrollbarButton.style.transform = `translateX(${scrollLeftInPortion}px)`; - // aria-valuenow - const scrollLeft = slider.container.scrollLeft; - const scrollWidth = slider.container.scrollWidth; - const containerWidth = slider.container.offsetWidth; - const scrollPercentage = (scrollLeft / (scrollWidth - containerWidth)) * 100; - scrollbarContainer.setAttribute('aria-valuenow', Math.round(Number.isNaN(scrollPercentage) ? 0 : scrollPercentage).toString()); - }); - }; - // insert to DOM - if (options.container) { - options.container.appendChild(scrollbarContainer); - } - else { - (_c = slider.container.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(scrollbarContainer, slider.container.nextSibling); - } - // update the scrollbar when the slider is scrolled - update(); - slider.on('scroll', update); - slider.on('contentsChanged', update); - slider.on('containerSizeChanged', update); - slider.on('detailsChanged', setDataAttributes); - // handle arrow keys while focused - scrollbarContainer.addEventListener('keydown', (e) => { - if (e.key === 'ArrowLeft') { - slider.moveToDirection('prev'); - } - else if (e.key === 'ArrowRight') { - slider.moveToDirection('next'); - } - }); - // handle click to before or after the scrollbar button - scrollbarContainer.addEventListener('click', (e) => { - const scrollbarButtonWidth = scrollbarButton.offsetWidth; - const scrollbarButtonLeft = getScrollbarButtonLeftOffset(); - const scrollbarButtonRight = scrollbarButtonLeft + scrollbarButtonWidth; - const clickX = e.pageX - scrollbarContainer.offsetLeft; - if (clickX < scrollbarButtonLeft) { - slider.moveToDirection('prev'); - } - else if (clickX > scrollbarButtonRight) { - slider.moveToDirection('next'); - } - }); - // make scrollbar button draggable via mouse/touch and update the scroll position - let isInteractionDown = false; - let startX = 0; - let scrollLeft = 0; - const onInteractionDown = (e) => { - isInteractionDown = true; - const pageX = e.pageX || e.touches[0].pageX; - startX = pageX - scrollbarContainer.offsetLeft; - scrollLeft = slider.container.scrollLeft; - // change cursor to grabbing - scrollbarButton.style.cursor = 'grabbing'; - slider.container.style.scrollSnapType = 'none'; - scrollbarButton.setAttribute('data-is-grabbed', 'true'); - e.preventDefault(); - e.stopPropagation(); - }; - const onInteractionMove = (e) => { - if (!isInteractionDown) { - return; - } - e.preventDefault(); - const pageX = e.pageX || e.touches[0].pageX; - const x = pageX - scrollbarContainer.offsetLeft; - const scrollingFactor = slider.container.scrollWidth / scrollbarContainer.offsetWidth; - const walk = (x - startX) * scrollingFactor; - slider.container.scrollLeft = scrollLeft + walk; - }; - const onInteractionUp = () => { - isInteractionDown = false; - scrollbarButton.style.cursor = ''; - slider.container.style.scrollSnapType = ''; - scrollbarButton.setAttribute('data-is-grabbed', 'false'); - }; - scrollbarButton.addEventListener('mousedown', onInteractionDown); - scrollbarButton.addEventListener('touchstart', onInteractionDown); - window.addEventListener('mousemove', onInteractionMove); - window.addEventListener('touchmove', onInteractionMove, { passive: false }); - window.addEventListener('mouseup', onInteractionUp); - window.addEventListener('touchend', onInteractionUp); - }; - } - - const DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK = 20; - function DragScrollingPlugin(args) { - var _a; - const options = { - draggedDistanceThatPreventsClick: (_a = args === null || args === void 0 ? void 0 : args.draggedDistanceThatPreventsClick) !== null && _a !== void 0 ? _a : DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK, - }; - return (slider) => { - let isMouseDown = false; - let startX = 0; - let scrollLeft = 0; - // add data attribute to container - slider.container.setAttribute('data-has-drag-scrolling', 'true'); - slider.container.addEventListener('mousedown', (e) => { - if (!slider.details.hasOverflow) { - return; - } - isMouseDown = true; - startX = e.pageX - slider.container.offsetLeft; - scrollLeft = slider.container.scrollLeft; - // change cursor to grabbing - slider.container.style.cursor = 'grabbing'; - slider.container.style.scrollSnapType = 'none'; - slider.container.style.scrollBehavior = 'auto'; - // prevent pointer events on the slides - // const slides = slider.container.querySelectorAll( ':scope > *' ); - // slides.forEach((slide) => { - // (slide).style.pointerEvents = 'none'; - // }); - // prevent focus going to the slides - // e.preventDefault(); - // e.stopPropagation(); - }); - window.addEventListener('mouseup', () => { - if (!slider.details.hasOverflow) { - return; - } - isMouseDown = false; - slider.container.style.cursor = ''; - // slider.container.style.scrollBehavior = slider.options.scrollBehavior; - setTimeout(() => { - slider.container.style.scrollSnapType = ''; - slider.container.style.scrollBehavior = ''; - const slides = slider.container.querySelectorAll(':scope > *'); - slides.forEach((slide) => { - slide.style.pointerEvents = ''; - }); - }, 50); - }); - window.addEventListener('mousemove', (e) => { - if (!slider.details.hasOverflow) { - return; - } - if (!isMouseDown) { - return; - } - e.preventDefault(); - const x = e.pageX - slider.container.offsetLeft; - const walk = (x - startX); - slider.container.scrollLeft = scrollLeft - walk; - // if walk is more than 30px, don't allow click event - // e.preventDefault(); - const absWalk = Math.abs(walk); - const slides = slider.container.querySelectorAll(':scope > *'); - const pointerEvents = absWalk > options.draggedDistanceThatPreventsClick ? 'none' : ''; - slides.forEach((slide) => { - slide.style.pointerEvents = pointerEvents; - }); - }); - }; - } - - const DEFAULT_TEXTS = { - dotDescription: 'Page %d of %d', - }; - const DEFAULT_CLASS_NAMES = { - dotsContainer: 'overflow-slider__dots', - dotsItem: 'overflow-slider__dot-item', - }; - function DotsPlugin(args) { - return (slider) => { - var _a, _b; - const options = { - texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), - classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), - container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, - }; - const dots = document.createElement('div'); - dots.classList.add(options.classNames.dotsContainer); - let pageFocused = null; - const buildDots = () => { - dots.setAttribute('data-has-content', slider.details.hasOverflow.toString()); - dots.innerHTML = ''; - const dotsList = document.createElement('ul'); - const pages = slider.details.amountOfPages; - const currentPage = slider.details.currentPage; - if (pages <= 1) { - return; - } - for (let i = 0; i < pages; i++) { - const dotListItem = document.createElement('li'); - const dot = document.createElement('button'); - dot.setAttribute('type', 'button'); - dot.setAttribute('class', options.classNames.dotsItem); - dot.setAttribute('aria-label', options.texts.dotDescription.replace('%d', (i + 1).toString()).replace('%d', pages.toString())); - dot.setAttribute('aria-pressed', (i === currentPage).toString()); - dot.setAttribute('data-page', (i + 1).toString()); - dotListItem.appendChild(dot); - dotsList.appendChild(dotListItem); - dot.addEventListener('click', () => activateDot(i + 1)); - dot.addEventListener('focus', () => pageFocused = i + 1); - dot.addEventListener('keydown', (e) => { - var _a; - const currentPageItem = dots.querySelector(`[aria-pressed="true"]`); - if (!currentPageItem) { - return; - } - const currentPage = parseInt((_a = currentPageItem.getAttribute('data-page')) !== null && _a !== void 0 ? _a : '1'); - if (e.key === 'ArrowLeft') { - const previousPage = currentPage - 1; - if (previousPage > 0) { - const matchingDot = dots.querySelector(`[data-page="${previousPage}"]`); - if (matchingDot) { - matchingDot.focus(); - } - activateDot(previousPage); - } - } - if (e.key === 'ArrowRight') { - const nextPage = currentPage + 1; - if (nextPage <= pages) { - const matchingDot = dots.querySelector(`[data-page="${nextPage}"]`); - if (matchingDot) { - matchingDot.focus(); - } - activateDot(nextPage); - } - } - }); - } - dots.appendChild(dotsList); - // return focus to same page after rebuild - if (pageFocused) { - const matchingDot = dots.querySelector(`[data-page="${pageFocused}"]`); - if (matchingDot) { - matchingDot.focus(); - } - } - }; - const activateDot = (page) => { - const scrollTargetPosition = slider.details.containerWidth * (page - 1); - slider.container.style.scrollBehavior = slider.options.scrollBehavior; - slider.container.style.scrollSnapType = 'none'; - slider.container.scrollLeft = scrollTargetPosition; - slider.container.style.scrollBehavior = ''; - slider.container.style.scrollSnapType = ''; - }; - buildDots(); - if (options.container) { - options.container.appendChild(dots); - } - else { - (_b = slider.container.parentNode) === null || _b === void 0 ? void 0 : _b.insertBefore(dots, slider.container.nextSibling); - } - slider.on('detailsChanged', () => { - buildDots(); - }); - }; - } - - exports.ArrowsPlugin = ArrowsPlugin; - exports.DotsPlugin = DotsPlugin; - exports.DragScrollingPlugin = DragScrollingPlugin; - exports.OverflowSlider = OverflowSlider; - exports.ScrollIndicatorPlugin = ScrollIndicatorPlugin; - exports.SkipLinksPlugin = SkipLinksPlugin; - - Object.defineProperty(exports, '__esModule', { value: true }); - -})); +export { default as OverflowSlider } from './overflow-slider.js'; +export { default as SkipLinksPlugin } from './plugins/plugins/skip-links.js'; +export { default as ArrowsPlugin } from './plugins/plugins/arrows.js'; +export { default as ScrollIndicatorPlugin } from './plugins/plugins/scroll-indicator.js'; +export { default as DragScrollingPlugin } from './plugins/plugins/drag-scrolling.js'; +export { default as DotsPlugin } from './plugins/plugins/dots.js'; diff --git a/dist/index.min.js b/dist/index.min.js index ef6ed70..9b0a681 100644 --- a/dist/index.min.js +++ b/dist/index.min.js @@ -1,2 +1 @@ -/*! @evermade/overflow-slider 1.1.0 */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).OverflowSlider={})}(this,(function(t){"use strict";function e(t,n=1){const o=`${t}-${n}`;return document.getElementById(o)?e(t,n+1):o}function n(t,n,o){let r,i={};function s(t=!1){const e=r.details,n=function(t){let e,n=!1,o=0,r=0,i=0,s=0,a=1;return t.container.scrollWidth>t.container.clientWidth&&(n=!0),o=Array.from(t.container.querySelectorAll(":scope > *")).length,r=t.container.offsetWidth,i=t.container.scrollWidth,s=Math.ceil(i/r),t.container.scrollLeft>=0&&(a=Math.floor(t.container.scrollLeft/r),t.container.scrollLeft+r===i&&(a=s-1)),e={hasOverflow:n,slideCount:o,containerWidth:r,scrollableAreaWidth:i,amountOfPages:s,currentPage:a},e}(r);r.details=n,t||function(t,e){const n=Object.keys(t),o=Object.keys(e);if(n.length!==o.length)return!1;for(let o of n)if(!1===e.hasOwnProperty(o)||t[o]!==e[o])return!1;return!0}(e,n)?t&&r.emit("detailsChanged"):r.emit("detailsChanged")}function a(){r.container.style.setProperty("--slider-container-width",`${r.details.containerWidth}px`),r.container.style.setProperty("--slider-scrollable-width",`${r.details.scrollableAreaWidth}px`),r.container.style.setProperty("--slider-slides-count",`${r.details.slideCount}`)}function l(){r.container.setAttribute("data-has-overflow",r.details.hasOverflow?"true":"false")}return r={emit:function(t){var e;i&&i[t]&&i[t].forEach((t=>{t(r)}));const n=null===(e=null==r?void 0:r.options)||void 0===e?void 0:e[t];"function"==typeof n&&n(r)},moveToDirection:function(t="prev"){const e=r.options.scrollStrategy,n=r.container.scrollLeft,o=r.container.getBoundingClientRect(),i=r.container.offsetWidth;let s=n;if("prev"===t?s=Math.max(0,n-r.container.offsetWidth):"next"===t&&(s=Math.min(r.container.scrollWidth,n+r.container.offsetWidth)),"fullSlide"===e){let e=null;const a=Array.from(r.container.querySelectorAll(":scope > *"));let l=0;if(a.length>1){const t=a[0].getBoundingClientRect();l=a[1].getBoundingClientRect().left-t.right}if(e="prev"===t?Math.max(0,s-l):Math.min(r.container.scrollWidth,s+l),"next"===t){let t=!1;for(let r of a){const i=r.getBoundingClientRect(),a=i.left-o.left+n,l=a+i.width;if(as){e=a,t=!0;break}}t||(e=Math.min(s,r.container.scrollWidth-r.container.offsetWidth)),e&&e>n&&(s=e)}else{let t=!1;for(let r of a){const s=r.getBoundingClientRect(),a=s.left-o.left+n,l=a+s.width;if(an){e=l-i,t=!0;break}}t||(e=Math.max(0,n-i)),e&&er.container.style.scrollBehavior=""),50)},on:function(t,e){i[t]||(i[t]=[]),i[t].push(e)},options:n},function(){r.container=t;let n=t.getAttribute("id");null===n&&(n=e("overflow-slider"),t.setAttribute("id",n)),s(!0),r.on("contentsChanged",(()=>s())),r.on("containerSizeChanged",(()=>s()));let i=0;if(r.on("scroll",(()=>{i&&window.cancelAnimationFrame(i),i=window.requestAnimationFrame((()=>{s()}))})),function(){new MutationObserver((()=>r.emit("contentsChanged"))).observe(r.container,{childList:!0});new ResizeObserver((()=>r.emit("containerSizeChanged"))).observe(r.container),r.container.addEventListener("scroll",(()=>r.emit("scroll")));let t=!1;r.container.addEventListener("mousedown",(()=>{t=!0})),r.container.addEventListener("touchstart",(()=>{t=!0}),{passive:!0}),r.container.addEventListener("focusin",(e=>{if(!t){let t=e.target;for(;t.parentElement!==r.container&&t.parentElement;)t=t.parentElement;!function(t){const e=t.getBoundingClientRect(),n=r.container.getBoundingClientRect(),o=r.container.offsetWidth,i=r.container.scrollLeft,s=e.left-n.left+i,a=s+e.width;let l=null;si+o&&(l=a-o);l&&(r.container.style.scrollSnapType="none",r.container.scrollLeft=l)}(t)}t=!1}))}(),l(),a(),o)for(const t of o)t(r);r.on("detailsChanged",(()=>{l(),a()})),r.emit("created")}(),r}const o={skipList:"Skip list"},r={skipLink:"screen-reader-text",skipLinkTarget:"overflow-slider__skip-link-target"};const i={buttonPrevious:"Previous items",buttonNext:"Next items"},s={prev:'',next:''},a={navContainer:"overflow-slider__arrows",prevButton:"overflow-slider__arrows-button overflow-slider__arrows-button--prev",nextButton:"overflow-slider__arrows-button overflow-slider__arrows-button--next"};const l={scrollIndicator:"overflow-slider__scroll-indicator",scrollIndicatorBar:"overflow-slider__scroll-indicator-bar",scrollIndicatorButton:"overflow-slider__scroll-indicator-button"};const c={dotDescription:"Page %d of %d"},d={dotsContainer:"overflow-slider__dots",dotsItem:"overflow-slider__dot-item"};t.ArrowsPlugin=function(t){return e=>{var n,o,r,l;const c={texts:Object.assign(Object.assign({},i),(null==t?void 0:t.texts)||[]),icons:Object.assign(Object.assign({},s),(null==t?void 0:t.icons)||[]),classNames:Object.assign(Object.assign({},a),(null==t?void 0:t.classNames)||[]),container:null!==(n=null==t?void 0:t.container)&&void 0!==n?n:null},d=document.createElement("div");d.classList.add(c.classNames.navContainer);const u=document.createElement("button");u.setAttribute("class",c.classNames.prevButton),u.setAttribute("type","button"),u.setAttribute("aria-label",c.texts.buttonPrevious),u.setAttribute("aria-controls",null!==(o=e.container.getAttribute("id"))&&void 0!==o?o:""),u.setAttribute("data-type","prev"),u.innerHTML=c.icons.prev,u.addEventListener("click",(()=>e.moveToDirection("prev")));const f=document.createElement("button");f.setAttribute("class",c.classNames.nextButton),f.setAttribute("type","button"),f.setAttribute("aria-label",c.texts.buttonNext),f.setAttribute("aria-controls",null!==(r=e.container.getAttribute("id"))&&void 0!==r?r:""),f.setAttribute("data-type","next"),f.innerHTML=c.icons.next,f.addEventListener("click",(()=>e.moveToDirection("next"))),d.appendChild(u),d.appendChild(f);const v=()=>{const t=e.container.scrollLeft,n=e.container.scrollWidth,o=e.container.clientWidth;0===t?u.setAttribute("data-has-content","false"):u.setAttribute("data-has-content","true"),t+o>=n?f.setAttribute("data-has-content","false"):f.setAttribute("data-has-content","true")};c.container?c.container.appendChild(d):null===(l=e.container.parentNode)||void 0===l||l.insertBefore(d,e.container.nextSibling),v(),e.on("scroll",v),e.on("contentsChanged",v),e.on("containerSizeChanged",v)}},t.DotsPlugin=function(t){return e=>{var n,o;const r={texts:Object.assign(Object.assign({},c),(null==t?void 0:t.texts)||[]),classNames:Object.assign(Object.assign({},d),(null==t?void 0:t.classNames)||[]),container:null!==(n=null==t?void 0:t.container)&&void 0!==n?n:null},i=document.createElement("div");i.classList.add(r.classNames.dotsContainer);let s=null;const a=()=>{i.setAttribute("data-has-content",e.details.hasOverflow.toString()),i.innerHTML="";const t=document.createElement("ul"),n=e.details.amountOfPages,o=e.details.currentPage;if(!(n<=1)){for(let e=0;el(e+1))),c.addEventListener("focus",(()=>s=e+1)),c.addEventListener("keydown",(t=>{var e;const o=i.querySelector('[aria-pressed="true"]');if(!o)return;const r=parseInt(null!==(e=o.getAttribute("data-page"))&&void 0!==e?e:"1");if("ArrowLeft"===t.key){const t=r-1;if(t>0){const e=i.querySelector(`[data-page="${t}"]`);e&&e.focus(),l(t)}}if("ArrowRight"===t.key){const t=r+1;if(t<=n){const e=i.querySelector(`[data-page="${t}"]`);e&&e.focus(),l(t)}}}))}if(i.appendChild(t),s){const t=i.querySelector(`[data-page="${s}"]`);t&&t.focus()}}},l=t=>{const n=e.details.containerWidth*(t-1);e.container.style.scrollBehavior=e.options.scrollBehavior,e.container.style.scrollSnapType="none",e.container.scrollLeft=n,e.container.style.scrollBehavior="",e.container.style.scrollSnapType=""};a(),r.container?r.container.appendChild(i):null===(o=e.container.parentNode)||void 0===o||o.insertBefore(i,e.container.nextSibling),e.on("detailsChanged",(()=>{a()}))}},t.DragScrollingPlugin=function(t){var e;const n=null!==(e=null==t?void 0:t.draggedDistanceThatPreventsClick)&&void 0!==e?e:20;return t=>{let e=!1,o=0,r=0;t.container.setAttribute("data-has-drag-scrolling","true"),t.container.addEventListener("mousedown",(n=>{t.details.hasOverflow&&(e=!0,o=n.pageX-t.container.offsetLeft,r=t.container.scrollLeft,t.container.style.cursor="grabbing",t.container.style.scrollSnapType="none",t.container.style.scrollBehavior="auto")})),window.addEventListener("mouseup",(()=>{t.details.hasOverflow&&(e=!1,t.container.style.cursor="",setTimeout((()=>{t.container.style.scrollSnapType="",t.container.style.scrollBehavior="";t.container.querySelectorAll(":scope > *").forEach((t=>{t.style.pointerEvents=""}))}),50))})),window.addEventListener("mousemove",(i=>{if(!t.details.hasOverflow)return;if(!e)return;i.preventDefault();const s=i.pageX-t.container.offsetLeft-o;t.container.scrollLeft=r-s;const a=Math.abs(s),l=t.container.querySelectorAll(":scope > *"),c=a>n?"none":"";l.forEach((t=>{t.style.pointerEvents=c}))}))}},t.OverflowSlider=function(t,e,o){try{if(!(t instanceof Element))throw new Error("Container must be HTML element, found "+typeof t);const r={scrollBehavior:"smooth",scrollStrategy:"fullSlide"},i=Object.assign(Object.assign({},r),e);return window.matchMedia("(prefers-reduced-motion: reduce)").matches&&(i.scrollBehavior="auto"),n(t,i,o)}catch(t){console.error(t)}},t.ScrollIndicatorPlugin=function(t){return e=>{var n,o,r;const i={classNames:Object.assign(Object.assign({},l),(null==t?void 0:t.classNames)||[]),container:null!==(n=null==t?void 0:t.container)&&void 0!==n?n:null},s=document.createElement("div");s.setAttribute("class",i.classNames.scrollIndicator),s.setAttribute("tabindex","0"),s.setAttribute("role","scrollbar"),s.setAttribute("aria-controls",null!==(o=e.container.getAttribute("id"))&&void 0!==o?o:""),s.setAttribute("aria-orientation","horizontal"),s.setAttribute("aria-valuemax","100"),s.setAttribute("aria-valuemin","0"),s.setAttribute("aria-valuenow","0");const a=document.createElement("div");a.setAttribute("class",i.classNames.scrollIndicatorBar);const c=document.createElement("div");c.setAttribute("class",i.classNames.scrollIndicatorButton),c.setAttribute("data-is-grabbed","false"),a.appendChild(c),s.appendChild(a);const d=()=>{s.setAttribute("data-has-overflow",e.details.hasOverflow.toString())};d();const u=()=>{const t=e.container.offsetWidth/e.container.scrollWidth;return e.container.scrollLeft*t};let f=0;const v=()=>{f&&window.cancelAnimationFrame(f),f=window.requestAnimationFrame((()=>{const t=e.container.offsetWidth/e.container.scrollWidth*100,n=u();c.style.width=`${t}%`,c.style.transform=`translateX(${n}px)`;const o=e.container.scrollLeft/(e.container.scrollWidth-e.container.offsetWidth)*100;s.setAttribute("aria-valuenow",Math.round(Number.isNaN(o)?0:o).toString())}))};i.container?i.container.appendChild(s):null===(r=e.container.parentNode)||void 0===r||r.insertBefore(s,e.container.nextSibling),v(),e.on("scroll",v),e.on("contentsChanged",v),e.on("containerSizeChanged",v),e.on("detailsChanged",d),s.addEventListener("keydown",(t=>{"ArrowLeft"===t.key?e.moveToDirection("prev"):"ArrowRight"===t.key&&e.moveToDirection("next")})),s.addEventListener("click",(t=>{const n=c.offsetWidth,o=u(),r=o+n,i=t.pageX-s.offsetLeft;ir&&e.moveToDirection("next")}));let p=!1,h=0,g=0;const b=t=>{p=!0;const n=t.pageX||t.touches[0].pageX;h=n-s.offsetLeft,g=e.container.scrollLeft,c.style.cursor="grabbing",e.container.style.scrollSnapType="none",c.setAttribute("data-is-grabbed","true"),t.preventDefault(),t.stopPropagation()},m=t=>{if(!p)return;t.preventDefault();const n=(t.pageX||t.touches[0].pageX)-s.offsetLeft,o=e.container.scrollWidth/s.offsetWidth,r=(n-h)*o;e.container.scrollLeft=g+r},w=()=>{p=!1,c.style.cursor="",e.container.style.scrollSnapType="",c.setAttribute("data-is-grabbed","false")};c.addEventListener("mousedown",b),c.addEventListener("touchstart",b),window.addEventListener("mousemove",m),window.addEventListener("touchmove",m,{passive:!1}),window.addEventListener("mouseup",w),window.addEventListener("touchend",w)}},t.SkipLinksPlugin=function(t){return n=>{var i,s,a,l,c,d;const u={texts:Object.assign(Object.assign({},o),(null==t?void 0:t.texts)||[]),classNames:Object.assign(Object.assign({},r),(null==t?void 0:t.classNames)||[]),containerBefore:null!==(i=null==t?void 0:t.containerAfter)&&void 0!==i?i:null,containerAfter:null!==(s=null==t?void 0:t.containerAfter)&&void 0!==s?s:null},f=e("overflow-slider-skip"),v=document.createElement("a");v.setAttribute("href",`#${f}`),v.textContent=u.texts.skipList,v.classList.add(u.classNames.skipLink);const p=document.createElement("div");p.setAttribute("id",f),p.setAttribute("tabindex","-1"),u.containerBefore?null===(a=u.containerBefore.parentNode)||void 0===a||a.insertBefore(v,u.containerBefore):null===(l=n.container.parentNode)||void 0===l||l.insertBefore(v,n.container),u.containerAfter?null===(c=u.containerAfter.parentNode)||void 0===c||c.insertBefore(p,u.containerAfter.nextSibling):null===(d=n.container.parentNode)||void 0===d||d.insertBefore(p,n.container.nextSibling)}},Object.defineProperty(t,"__esModule",{value:!0})})); +export{default as OverflowSlider}from"./overflow-slider.min.js"; diff --git a/dist/overflow-slider.esm.js b/dist/overflow-slider.esm.js new file mode 100644 index 0000000..c87fe45 --- /dev/null +++ b/dist/overflow-slider.esm.js @@ -0,0 +1,25 @@ +import Slider from './core/slider.esm.js'; + +function OverflowSlider(container, options, plugins) { + try { + // check that container HTML element + if (!(container instanceof Element)) { + throw new Error(`Container must be HTML element, found ${typeof container}`); + } + const defaults = { + scrollBehavior: "smooth", + scrollStrategy: "fullSlide", + }; + const sliderOptions = Object.assign(Object.assign({}, defaults), options); + // disable smooth scrolling if user prefers reduced motion + if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) { + sliderOptions.scrollBehavior = "auto"; + } + return Slider(container, sliderOptions, plugins); + } + catch (e) { + console.error(e); + } +} + +export { OverflowSlider as default }; diff --git a/dist/overflow-slider.js b/dist/overflow-slider.js new file mode 100644 index 0000000..21d59bd --- /dev/null +++ b/dist/overflow-slider.js @@ -0,0 +1,25 @@ +import Slider from './core/slider.js'; + +function OverflowSlider(container, options, plugins) { + try { + // check that container HTML element + if (!(container instanceof Element)) { + throw new Error(`Container must be HTML element, found ${typeof container}`); + } + const defaults = { + scrollBehavior: "smooth", + scrollStrategy: "fullSlide", + }; + const sliderOptions = Object.assign(Object.assign({}, defaults), options); + // disable smooth scrolling if user prefers reduced motion + if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) { + sliderOptions.scrollBehavior = "auto"; + } + return Slider(container, sliderOptions, plugins); + } + catch (e) { + console.error(e); + } +} + +export { OverflowSlider as default }; diff --git a/dist/overflow-slider.min.js b/dist/overflow-slider.min.js new file mode 100644 index 0000000..de4233a --- /dev/null +++ b/dist/overflow-slider.min.js @@ -0,0 +1 @@ +import e from"./core/slider.min.js";function o(o,r,t){try{if(!(o instanceof Element))throw new Error("Container must be HTML element, found "+typeof o);const n={scrollBehavior:"smooth",scrollStrategy:"fullSlide"},s=Object.assign(Object.assign({},n),r);return window.matchMedia("(prefers-reduced-motion: reduce)").matches&&(s.scrollBehavior="auto"),e(o,s,t)}catch(e){console.error(e)}}export{o as default}; diff --git a/dist/plugins/arrows.esm.js b/dist/plugins/arrows.esm.js new file mode 100644 index 0000000..584926b --- /dev/null +++ b/dist/plugins/arrows.esm.js @@ -0,0 +1,74 @@ +const DEFAULT_TEXTS = { + buttonPrevious: 'Previous items', + buttonNext: 'Next items', +}; +const DEFAULT_ICONS = { + prev: '', + next: '', +}; +const DEFAULT_CLASS_NAMES = { + navContainer: 'overflow-slider__arrows', + prevButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--prev', + nextButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--next', +}; +function ArrowsPlugin(args) { + return (slider) => { + var _a, _b, _c, _d; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + icons: Object.assign(Object.assign({}, DEFAULT_ICONS), (args === null || args === void 0 ? void 0 : args.icons) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const nav = document.createElement('div'); + nav.classList.add(options.classNames.navContainer); + const prev = document.createElement('button'); + prev.setAttribute('class', options.classNames.prevButton); + prev.setAttribute('type', 'button'); + prev.setAttribute('aria-label', options.texts.buttonPrevious); + prev.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); + prev.setAttribute('data-type', 'prev'); + prev.innerHTML = options.icons.prev; + prev.addEventListener('click', () => slider.moveToDirection('prev')); + const next = document.createElement('button'); + next.setAttribute('class', options.classNames.nextButton); + next.setAttribute('type', 'button'); + next.setAttribute('aria-label', options.texts.buttonNext); + next.setAttribute('aria-controls', (_c = slider.container.getAttribute('id')) !== null && _c !== void 0 ? _c : ''); + next.setAttribute('data-type', 'next'); + next.innerHTML = options.icons.next; + next.addEventListener('click', () => slider.moveToDirection('next')); + // insert buttons to the nav + nav.appendChild(prev); + nav.appendChild(next); + const update = () => { + const scrollLeft = slider.container.scrollLeft; + const scrollWidth = slider.container.scrollWidth; + const clientWidth = slider.container.clientWidth; + if (scrollLeft === 0) { + prev.setAttribute('data-has-content', 'false'); + } + else { + prev.setAttribute('data-has-content', 'true'); + } + if (scrollLeft + clientWidth >= scrollWidth) { + next.setAttribute('data-has-content', 'false'); + } + else { + next.setAttribute('data-has-content', 'true'); + } + }; + if (options.container) { + options.container.appendChild(nav); + } + else { + (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(nav, slider.container.nextSibling); + } + update(); + slider.on('scroll', update); + slider.on('contentsChanged', update); + slider.on('containerSizeChanged', update); + }; +} + +export { ArrowsPlugin as default }; diff --git a/dist/plugins/arrows.js b/dist/plugins/arrows.js new file mode 100644 index 0000000..584926b --- /dev/null +++ b/dist/plugins/arrows.js @@ -0,0 +1,74 @@ +const DEFAULT_TEXTS = { + buttonPrevious: 'Previous items', + buttonNext: 'Next items', +}; +const DEFAULT_ICONS = { + prev: '', + next: '', +}; +const DEFAULT_CLASS_NAMES = { + navContainer: 'overflow-slider__arrows', + prevButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--prev', + nextButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--next', +}; +function ArrowsPlugin(args) { + return (slider) => { + var _a, _b, _c, _d; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + icons: Object.assign(Object.assign({}, DEFAULT_ICONS), (args === null || args === void 0 ? void 0 : args.icons) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const nav = document.createElement('div'); + nav.classList.add(options.classNames.navContainer); + const prev = document.createElement('button'); + prev.setAttribute('class', options.classNames.prevButton); + prev.setAttribute('type', 'button'); + prev.setAttribute('aria-label', options.texts.buttonPrevious); + prev.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); + prev.setAttribute('data-type', 'prev'); + prev.innerHTML = options.icons.prev; + prev.addEventListener('click', () => slider.moveToDirection('prev')); + const next = document.createElement('button'); + next.setAttribute('class', options.classNames.nextButton); + next.setAttribute('type', 'button'); + next.setAttribute('aria-label', options.texts.buttonNext); + next.setAttribute('aria-controls', (_c = slider.container.getAttribute('id')) !== null && _c !== void 0 ? _c : ''); + next.setAttribute('data-type', 'next'); + next.innerHTML = options.icons.next; + next.addEventListener('click', () => slider.moveToDirection('next')); + // insert buttons to the nav + nav.appendChild(prev); + nav.appendChild(next); + const update = () => { + const scrollLeft = slider.container.scrollLeft; + const scrollWidth = slider.container.scrollWidth; + const clientWidth = slider.container.clientWidth; + if (scrollLeft === 0) { + prev.setAttribute('data-has-content', 'false'); + } + else { + prev.setAttribute('data-has-content', 'true'); + } + if (scrollLeft + clientWidth >= scrollWidth) { + next.setAttribute('data-has-content', 'false'); + } + else { + next.setAttribute('data-has-content', 'true'); + } + }; + if (options.container) { + options.container.appendChild(nav); + } + else { + (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(nav, slider.container.nextSibling); + } + update(); + slider.on('scroll', update); + slider.on('contentsChanged', update); + slider.on('containerSizeChanged', update); + }; +} + +export { ArrowsPlugin as default }; diff --git a/dist/plugins/arrows.min.js b/dist/plugins/arrows.min.js new file mode 100644 index 0000000..384e17a --- /dev/null +++ b/dist/plugins/arrows.min.js @@ -0,0 +1 @@ +const t={buttonPrevious:"Previous items",buttonNext:"Next items"},e={prev:'',next:''},n={navContainer:"overflow-slider__arrows",prevButton:"overflow-slider__arrows-button overflow-slider__arrows-button--prev",nextButton:"overflow-slider__arrows-button overflow-slider__arrows-button--next"};function s(s){return o=>{var i,r,a,l;const c={texts:Object.assign(Object.assign({},t),(null==s?void 0:s.texts)||[]),icons:Object.assign(Object.assign({},e),(null==s?void 0:s.icons)||[]),classNames:Object.assign(Object.assign({},n),(null==s?void 0:s.classNames)||[]),container:null!==(i=null==s?void 0:s.container)&&void 0!==i?i:null},u=document.createElement("div");u.classList.add(c.classNames.navContainer);const d=document.createElement("button");d.setAttribute("class",c.classNames.prevButton),d.setAttribute("type","button"),d.setAttribute("aria-label",c.texts.buttonPrevious),d.setAttribute("aria-controls",null!==(r=o.container.getAttribute("id"))&&void 0!==r?r:""),d.setAttribute("data-type","prev"),d.innerHTML=c.icons.prev,d.addEventListener("click",(()=>o.moveToDirection("prev")));const v=document.createElement("button");v.setAttribute("class",c.classNames.nextButton),v.setAttribute("type","button"),v.setAttribute("aria-label",c.texts.buttonNext),v.setAttribute("aria-controls",null!==(a=o.container.getAttribute("id"))&&void 0!==a?a:""),v.setAttribute("data-type","next"),v.innerHTML=c.icons.next,v.addEventListener("click",(()=>o.moveToDirection("next"))),u.appendChild(d),u.appendChild(v);const b=()=>{const t=o.container.scrollLeft,e=o.container.scrollWidth,n=o.container.clientWidth;0===t?d.setAttribute("data-has-content","false"):d.setAttribute("data-has-content","true"),t+n>=e?v.setAttribute("data-has-content","false"):v.setAttribute("data-has-content","true")};c.container?c.container.appendChild(u):null===(l=o.container.parentNode)||void 0===l||l.insertBefore(u,o.container.nextSibling),b(),o.on("scroll",b),o.on("contentsChanged",b),o.on("containerSizeChanged",b)}}export{s as default}; diff --git a/dist/plugins/core/utils.esm.js b/dist/plugins/core/utils.esm.js new file mode 100644 index 0000000..9be1ea0 --- /dev/null +++ b/dist/plugins/core/utils.esm.js @@ -0,0 +1,9 @@ +function generateId(prefix, i = 1) { + const id = `${prefix}-${i}`; + if (document.getElementById(id)) { + return generateId(prefix, i + 1); + } + return id; +} + +export { generateId }; diff --git a/dist/plugins/core/utils.js b/dist/plugins/core/utils.js new file mode 100644 index 0000000..9be1ea0 --- /dev/null +++ b/dist/plugins/core/utils.js @@ -0,0 +1,9 @@ +function generateId(prefix, i = 1) { + const id = `${prefix}-${i}`; + if (document.getElementById(id)) { + return generateId(prefix, i + 1); + } + return id; +} + +export { generateId }; diff --git a/dist/plugins/core/utils.min.js b/dist/plugins/core/utils.min.js new file mode 100644 index 0000000..0e46d13 --- /dev/null +++ b/dist/plugins/core/utils.min.js @@ -0,0 +1 @@ +function t(e,n=1){const o=`${e}-${n}`;return document.getElementById(o)?t(e,n+1):o}export{t as generateId}; diff --git a/dist/plugins/dots.esm.js b/dist/plugins/dots.esm.js new file mode 100644 index 0000000..75b1175 --- /dev/null +++ b/dist/plugins/dots.esm.js @@ -0,0 +1,99 @@ +const DEFAULT_TEXTS = { + dotDescription: 'Page %d of %d', +}; +const DEFAULT_CLASS_NAMES = { + dotsContainer: 'overflow-slider__dots', + dotsItem: 'overflow-slider__dot-item', +}; +function DotsPlugin(args) { + return (slider) => { + var _a, _b; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const dots = document.createElement('div'); + dots.classList.add(options.classNames.dotsContainer); + let pageFocused = null; + const buildDots = () => { + dots.setAttribute('data-has-content', slider.details.hasOverflow.toString()); + dots.innerHTML = ''; + const dotsList = document.createElement('ul'); + const pages = slider.details.amountOfPages; + const currentPage = slider.details.currentPage; + if (pages <= 1) { + return; + } + for (let i = 0; i < pages; i++) { + const dotListItem = document.createElement('li'); + const dot = document.createElement('button'); + dot.setAttribute('type', 'button'); + dot.setAttribute('class', options.classNames.dotsItem); + dot.setAttribute('aria-label', options.texts.dotDescription.replace('%d', (i + 1).toString()).replace('%d', pages.toString())); + dot.setAttribute('aria-pressed', (i === currentPage).toString()); + dot.setAttribute('data-page', (i + 1).toString()); + dotListItem.appendChild(dot); + dotsList.appendChild(dotListItem); + dot.addEventListener('click', () => activateDot(i + 1)); + dot.addEventListener('focus', () => pageFocused = i + 1); + dot.addEventListener('keydown', (e) => { + var _a; + const currentPageItem = dots.querySelector(`[aria-pressed="true"]`); + if (!currentPageItem) { + return; + } + const currentPage = parseInt((_a = currentPageItem.getAttribute('data-page')) !== null && _a !== void 0 ? _a : '1'); + if (e.key === 'ArrowLeft') { + const previousPage = currentPage - 1; + if (previousPage > 0) { + const matchingDot = dots.querySelector(`[data-page="${previousPage}"]`); + if (matchingDot) { + matchingDot.focus(); + } + activateDot(previousPage); + } + } + if (e.key === 'ArrowRight') { + const nextPage = currentPage + 1; + if (nextPage <= pages) { + const matchingDot = dots.querySelector(`[data-page="${nextPage}"]`); + if (matchingDot) { + matchingDot.focus(); + } + activateDot(nextPage); + } + } + }); + } + dots.appendChild(dotsList); + // return focus to same page after rebuild + if (pageFocused) { + const matchingDot = dots.querySelector(`[data-page="${pageFocused}"]`); + if (matchingDot) { + matchingDot.focus(); + } + } + }; + const activateDot = (page) => { + const scrollTargetPosition = slider.details.containerWidth * (page - 1); + slider.container.style.scrollBehavior = slider.options.scrollBehavior; + slider.container.style.scrollSnapType = 'none'; + slider.container.scrollLeft = scrollTargetPosition; + slider.container.style.scrollBehavior = ''; + slider.container.style.scrollSnapType = ''; + }; + buildDots(); + if (options.container) { + options.container.appendChild(dots); + } + else { + (_b = slider.container.parentNode) === null || _b === void 0 ? void 0 : _b.insertBefore(dots, slider.container.nextSibling); + } + slider.on('detailsChanged', () => { + buildDots(); + }); + }; +} + +export { DotsPlugin as default }; diff --git a/dist/plugins/dots.js b/dist/plugins/dots.js new file mode 100644 index 0000000..75b1175 --- /dev/null +++ b/dist/plugins/dots.js @@ -0,0 +1,99 @@ +const DEFAULT_TEXTS = { + dotDescription: 'Page %d of %d', +}; +const DEFAULT_CLASS_NAMES = { + dotsContainer: 'overflow-slider__dots', + dotsItem: 'overflow-slider__dot-item', +}; +function DotsPlugin(args) { + return (slider) => { + var _a, _b; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const dots = document.createElement('div'); + dots.classList.add(options.classNames.dotsContainer); + let pageFocused = null; + const buildDots = () => { + dots.setAttribute('data-has-content', slider.details.hasOverflow.toString()); + dots.innerHTML = ''; + const dotsList = document.createElement('ul'); + const pages = slider.details.amountOfPages; + const currentPage = slider.details.currentPage; + if (pages <= 1) { + return; + } + for (let i = 0; i < pages; i++) { + const dotListItem = document.createElement('li'); + const dot = document.createElement('button'); + dot.setAttribute('type', 'button'); + dot.setAttribute('class', options.classNames.dotsItem); + dot.setAttribute('aria-label', options.texts.dotDescription.replace('%d', (i + 1).toString()).replace('%d', pages.toString())); + dot.setAttribute('aria-pressed', (i === currentPage).toString()); + dot.setAttribute('data-page', (i + 1).toString()); + dotListItem.appendChild(dot); + dotsList.appendChild(dotListItem); + dot.addEventListener('click', () => activateDot(i + 1)); + dot.addEventListener('focus', () => pageFocused = i + 1); + dot.addEventListener('keydown', (e) => { + var _a; + const currentPageItem = dots.querySelector(`[aria-pressed="true"]`); + if (!currentPageItem) { + return; + } + const currentPage = parseInt((_a = currentPageItem.getAttribute('data-page')) !== null && _a !== void 0 ? _a : '1'); + if (e.key === 'ArrowLeft') { + const previousPage = currentPage - 1; + if (previousPage > 0) { + const matchingDot = dots.querySelector(`[data-page="${previousPage}"]`); + if (matchingDot) { + matchingDot.focus(); + } + activateDot(previousPage); + } + } + if (e.key === 'ArrowRight') { + const nextPage = currentPage + 1; + if (nextPage <= pages) { + const matchingDot = dots.querySelector(`[data-page="${nextPage}"]`); + if (matchingDot) { + matchingDot.focus(); + } + activateDot(nextPage); + } + } + }); + } + dots.appendChild(dotsList); + // return focus to same page after rebuild + if (pageFocused) { + const matchingDot = dots.querySelector(`[data-page="${pageFocused}"]`); + if (matchingDot) { + matchingDot.focus(); + } + } + }; + const activateDot = (page) => { + const scrollTargetPosition = slider.details.containerWidth * (page - 1); + slider.container.style.scrollBehavior = slider.options.scrollBehavior; + slider.container.style.scrollSnapType = 'none'; + slider.container.scrollLeft = scrollTargetPosition; + slider.container.style.scrollBehavior = ''; + slider.container.style.scrollSnapType = ''; + }; + buildDots(); + if (options.container) { + options.container.appendChild(dots); + } + else { + (_b = slider.container.parentNode) === null || _b === void 0 ? void 0 : _b.insertBefore(dots, slider.container.nextSibling); + } + slider.on('detailsChanged', () => { + buildDots(); + }); + }; +} + +export { DotsPlugin as default }; diff --git a/dist/plugins/dots.min.js b/dist/plugins/dots.min.js new file mode 100644 index 0000000..e2d62e3 --- /dev/null +++ b/dist/plugins/dots.min.js @@ -0,0 +1 @@ +const t={dotDescription:"Page %d of %d"},e={dotsContainer:"overflow-slider__dots",dotsItem:"overflow-slider__dot-item"};function n(n){return o=>{var a,s;const r={texts:Object.assign(Object.assign({},t),(null==n?void 0:n.texts)||[]),classNames:Object.assign(Object.assign({},e),(null==n?void 0:n.classNames)||[]),container:null!==(a=null==n?void 0:n.container)&&void 0!==a?a:null},i=document.createElement("div");i.classList.add(r.classNames.dotsContainer);let l=null;const c=()=>{i.setAttribute("data-has-content",o.details.hasOverflow.toString()),i.innerHTML="";const t=document.createElement("ul"),e=o.details.amountOfPages,n=o.details.currentPage;if(!(e<=1)){for(let o=0;od(o+1))),s.addEventListener("focus",(()=>l=o+1)),s.addEventListener("keydown",(t=>{var n;const o=i.querySelector('[aria-pressed="true"]');if(!o)return;const a=parseInt(null!==(n=o.getAttribute("data-page"))&&void 0!==n?n:"1");if("ArrowLeft"===t.key){const t=a-1;if(t>0){const e=i.querySelector(`[data-page="${t}"]`);e&&e.focus(),d(t)}}if("ArrowRight"===t.key){const t=a+1;if(t<=e){const e=i.querySelector(`[data-page="${t}"]`);e&&e.focus(),d(t)}}}))}if(i.appendChild(t),l){const t=i.querySelector(`[data-page="${l}"]`);t&&t.focus()}}},d=t=>{const e=o.details.containerWidth*(t-1);o.container.style.scrollBehavior=o.options.scrollBehavior,o.container.style.scrollSnapType="none",o.container.scrollLeft=e,o.container.style.scrollBehavior="",o.container.style.scrollSnapType=""};c(),r.container?r.container.appendChild(i):null===(s=o.container.parentNode)||void 0===s||s.insertBefore(i,o.container.nextSibling),o.on("detailsChanged",(()=>{c()}))}}export{n as default}; diff --git a/dist/plugins/drag-scrolling.esm.js b/dist/plugins/drag-scrolling.esm.js new file mode 100644 index 0000000..ed7117b --- /dev/null +++ b/dist/plugins/drag-scrolling.esm.js @@ -0,0 +1,72 @@ +const DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK = 20; +function DragScrollingPlugin(args) { + var _a; + const options = { + draggedDistanceThatPreventsClick: (_a = args === null || args === void 0 ? void 0 : args.draggedDistanceThatPreventsClick) !== null && _a !== void 0 ? _a : DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK, + }; + return (slider) => { + let isMouseDown = false; + let startX = 0; + let scrollLeft = 0; + // add data attribute to container + slider.container.setAttribute('data-has-drag-scrolling', 'true'); + slider.container.addEventListener('mousedown', (e) => { + if (!slider.details.hasOverflow) { + return; + } + isMouseDown = true; + startX = e.pageX - slider.container.offsetLeft; + scrollLeft = slider.container.scrollLeft; + // change cursor to grabbing + slider.container.style.cursor = 'grabbing'; + slider.container.style.scrollSnapType = 'none'; + slider.container.style.scrollBehavior = 'auto'; + // prevent pointer events on the slides + // const slides = slider.container.querySelectorAll( ':scope > *' ); + // slides.forEach((slide) => { + // (slide).style.pointerEvents = 'none'; + // }); + // prevent focus going to the slides + // e.preventDefault(); + // e.stopPropagation(); + }); + window.addEventListener('mouseup', () => { + if (!slider.details.hasOverflow) { + return; + } + isMouseDown = false; + slider.container.style.cursor = ''; + // slider.container.style.scrollBehavior = slider.options.scrollBehavior; + setTimeout(() => { + slider.container.style.scrollSnapType = ''; + slider.container.style.scrollBehavior = ''; + const slides = slider.container.querySelectorAll(':scope > *'); + slides.forEach((slide) => { + slide.style.pointerEvents = ''; + }); + }, 50); + }); + window.addEventListener('mousemove', (e) => { + if (!slider.details.hasOverflow) { + return; + } + if (!isMouseDown) { + return; + } + e.preventDefault(); + const x = e.pageX - slider.container.offsetLeft; + const walk = (x - startX); + slider.container.scrollLeft = scrollLeft - walk; + // if walk is more than 30px, don't allow click event + // e.preventDefault(); + const absWalk = Math.abs(walk); + const slides = slider.container.querySelectorAll(':scope > *'); + const pointerEvents = absWalk > options.draggedDistanceThatPreventsClick ? 'none' : ''; + slides.forEach((slide) => { + slide.style.pointerEvents = pointerEvents; + }); + }); + }; +} + +export { DragScrollingPlugin as default }; diff --git a/dist/plugins/drag-scrolling.js b/dist/plugins/drag-scrolling.js new file mode 100644 index 0000000..ed7117b --- /dev/null +++ b/dist/plugins/drag-scrolling.js @@ -0,0 +1,72 @@ +const DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK = 20; +function DragScrollingPlugin(args) { + var _a; + const options = { + draggedDistanceThatPreventsClick: (_a = args === null || args === void 0 ? void 0 : args.draggedDistanceThatPreventsClick) !== null && _a !== void 0 ? _a : DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK, + }; + return (slider) => { + let isMouseDown = false; + let startX = 0; + let scrollLeft = 0; + // add data attribute to container + slider.container.setAttribute('data-has-drag-scrolling', 'true'); + slider.container.addEventListener('mousedown', (e) => { + if (!slider.details.hasOverflow) { + return; + } + isMouseDown = true; + startX = e.pageX - slider.container.offsetLeft; + scrollLeft = slider.container.scrollLeft; + // change cursor to grabbing + slider.container.style.cursor = 'grabbing'; + slider.container.style.scrollSnapType = 'none'; + slider.container.style.scrollBehavior = 'auto'; + // prevent pointer events on the slides + // const slides = slider.container.querySelectorAll( ':scope > *' ); + // slides.forEach((slide) => { + // (slide).style.pointerEvents = 'none'; + // }); + // prevent focus going to the slides + // e.preventDefault(); + // e.stopPropagation(); + }); + window.addEventListener('mouseup', () => { + if (!slider.details.hasOverflow) { + return; + } + isMouseDown = false; + slider.container.style.cursor = ''; + // slider.container.style.scrollBehavior = slider.options.scrollBehavior; + setTimeout(() => { + slider.container.style.scrollSnapType = ''; + slider.container.style.scrollBehavior = ''; + const slides = slider.container.querySelectorAll(':scope > *'); + slides.forEach((slide) => { + slide.style.pointerEvents = ''; + }); + }, 50); + }); + window.addEventListener('mousemove', (e) => { + if (!slider.details.hasOverflow) { + return; + } + if (!isMouseDown) { + return; + } + e.preventDefault(); + const x = e.pageX - slider.container.offsetLeft; + const walk = (x - startX); + slider.container.scrollLeft = scrollLeft - walk; + // if walk is more than 30px, don't allow click event + // e.preventDefault(); + const absWalk = Math.abs(walk); + const slides = slider.container.querySelectorAll(':scope > *'); + const pointerEvents = absWalk > options.draggedDistanceThatPreventsClick ? 'none' : ''; + slides.forEach((slide) => { + slide.style.pointerEvents = pointerEvents; + }); + }); + }; +} + +export { DragScrollingPlugin as default }; diff --git a/dist/plugins/drag-scrolling.min.js b/dist/plugins/drag-scrolling.min.js new file mode 100644 index 0000000..2f3fd1d --- /dev/null +++ b/dist/plugins/drag-scrolling.min.js @@ -0,0 +1 @@ +function e(e){var t;const n=null!==(t=null==e?void 0:e.draggedDistanceThatPreventsClick)&&void 0!==t?t:20;return e=>{let t=!1,o=0,r=0;e.container.setAttribute("data-has-drag-scrolling","true"),e.container.addEventListener("mousedown",(n=>{e.details.hasOverflow&&(t=!0,o=n.pageX-e.container.offsetLeft,r=e.container.scrollLeft,e.container.style.cursor="grabbing",e.container.style.scrollSnapType="none",e.container.style.scrollBehavior="auto")})),window.addEventListener("mouseup",(()=>{e.details.hasOverflow&&(t=!1,e.container.style.cursor="",setTimeout((()=>{e.container.style.scrollSnapType="",e.container.style.scrollBehavior="";e.container.querySelectorAll(":scope > *").forEach((e=>{e.style.pointerEvents=""}))}),50))})),window.addEventListener("mousemove",(a=>{if(!e.details.hasOverflow)return;if(!t)return;a.preventDefault();const s=a.pageX-e.container.offsetLeft-o;e.container.scrollLeft=r-s;const l=Math.abs(s),i=e.container.querySelectorAll(":scope > *"),c=l>n?"none":"";i.forEach((e=>{e.style.pointerEvents=c}))}))}}export{e as default}; diff --git a/dist/plugins/scroll-indicator.esm.js b/dist/plugins/scroll-indicator.esm.js new file mode 100644 index 0000000..c743c15 --- /dev/null +++ b/dist/plugins/scroll-indicator.esm.js @@ -0,0 +1,133 @@ +const DEFAULT_CLASS_NAMES = { + scrollIndicator: 'overflow-slider__scroll-indicator', + scrollIndicatorBar: 'overflow-slider__scroll-indicator-bar', + scrollIndicatorButton: 'overflow-slider__scroll-indicator-button', +}; +function ScrollIndicatorPlugin(args) { + return (slider) => { + var _a, _b, _c; + const options = { + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const scrollbarContainer = document.createElement('div'); + scrollbarContainer.setAttribute('class', options.classNames.scrollIndicator); + scrollbarContainer.setAttribute('tabindex', '0'); + scrollbarContainer.setAttribute('role', 'scrollbar'); + scrollbarContainer.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); + scrollbarContainer.setAttribute('aria-orientation', 'horizontal'); + scrollbarContainer.setAttribute('aria-valuemax', '100'); + scrollbarContainer.setAttribute('aria-valuemin', '0'); + scrollbarContainer.setAttribute('aria-valuenow', '0'); + const scrollbar = document.createElement('div'); + scrollbar.setAttribute('class', options.classNames.scrollIndicatorBar); + const scrollbarButton = document.createElement('div'); + scrollbarButton.setAttribute('class', options.classNames.scrollIndicatorButton); + scrollbarButton.setAttribute('data-is-grabbed', 'false'); + scrollbar.appendChild(scrollbarButton); + scrollbarContainer.appendChild(scrollbar); + const setDataAttributes = () => { + scrollbarContainer.setAttribute('data-has-overflow', slider.details.hasOverflow.toString()); + }; + setDataAttributes(); + const getScrollbarButtonLeftOffset = () => { + const scrollbarRatio = slider.container.offsetWidth / slider.container.scrollWidth; + return slider.container.scrollLeft * scrollbarRatio; + }; + // scrollbarbutton width and position is calculated based on the scroll position and available width + let requestId = 0; + const update = () => { + if (requestId) { + window.cancelAnimationFrame(requestId); + } + requestId = window.requestAnimationFrame(() => { + const scrollbarButtonWidth = (slider.container.offsetWidth / slider.container.scrollWidth) * 100; + const scrollLeftInPortion = getScrollbarButtonLeftOffset(); + scrollbarButton.style.width = `${scrollbarButtonWidth}%`; + scrollbarButton.style.transform = `translateX(${scrollLeftInPortion}px)`; + // aria-valuenow + const scrollLeft = slider.container.scrollLeft; + const scrollWidth = slider.container.scrollWidth; + const containerWidth = slider.container.offsetWidth; + const scrollPercentage = (scrollLeft / (scrollWidth - containerWidth)) * 100; + scrollbarContainer.setAttribute('aria-valuenow', Math.round(Number.isNaN(scrollPercentage) ? 0 : scrollPercentage).toString()); + }); + }; + // insert to DOM + if (options.container) { + options.container.appendChild(scrollbarContainer); + } + else { + (_c = slider.container.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(scrollbarContainer, slider.container.nextSibling); + } + // update the scrollbar when the slider is scrolled + update(); + slider.on('scroll', update); + slider.on('contentsChanged', update); + slider.on('containerSizeChanged', update); + slider.on('detailsChanged', setDataAttributes); + // handle arrow keys while focused + scrollbarContainer.addEventListener('keydown', (e) => { + if (e.key === 'ArrowLeft') { + slider.moveToDirection('prev'); + } + else if (e.key === 'ArrowRight') { + slider.moveToDirection('next'); + } + }); + // handle click to before or after the scrollbar button + scrollbarContainer.addEventListener('click', (e) => { + const scrollbarButtonWidth = scrollbarButton.offsetWidth; + const scrollbarButtonLeft = getScrollbarButtonLeftOffset(); + const scrollbarButtonRight = scrollbarButtonLeft + scrollbarButtonWidth; + const clickX = e.pageX - scrollbarContainer.offsetLeft; + if (clickX < scrollbarButtonLeft) { + slider.moveToDirection('prev'); + } + else if (clickX > scrollbarButtonRight) { + slider.moveToDirection('next'); + } + }); + // make scrollbar button draggable via mouse/touch and update the scroll position + let isInteractionDown = false; + let startX = 0; + let scrollLeft = 0; + const onInteractionDown = (e) => { + isInteractionDown = true; + const pageX = e.pageX || e.touches[0].pageX; + startX = pageX - scrollbarContainer.offsetLeft; + scrollLeft = slider.container.scrollLeft; + // change cursor to grabbing + scrollbarButton.style.cursor = 'grabbing'; + slider.container.style.scrollSnapType = 'none'; + scrollbarButton.setAttribute('data-is-grabbed', 'true'); + e.preventDefault(); + e.stopPropagation(); + }; + const onInteractionMove = (e) => { + if (!isInteractionDown) { + return; + } + e.preventDefault(); + const pageX = e.pageX || e.touches[0].pageX; + const x = pageX - scrollbarContainer.offsetLeft; + const scrollingFactor = slider.container.scrollWidth / scrollbarContainer.offsetWidth; + const walk = (x - startX) * scrollingFactor; + slider.container.scrollLeft = scrollLeft + walk; + }; + const onInteractionUp = () => { + isInteractionDown = false; + scrollbarButton.style.cursor = ''; + slider.container.style.scrollSnapType = ''; + scrollbarButton.setAttribute('data-is-grabbed', 'false'); + }; + scrollbarButton.addEventListener('mousedown', onInteractionDown); + scrollbarButton.addEventListener('touchstart', onInteractionDown); + window.addEventListener('mousemove', onInteractionMove); + window.addEventListener('touchmove', onInteractionMove, { passive: false }); + window.addEventListener('mouseup', onInteractionUp); + window.addEventListener('touchend', onInteractionUp); + }; +} + +export { ScrollIndicatorPlugin as default }; diff --git a/dist/plugins/scroll-indicator.js b/dist/plugins/scroll-indicator.js new file mode 100644 index 0000000..c743c15 --- /dev/null +++ b/dist/plugins/scroll-indicator.js @@ -0,0 +1,133 @@ +const DEFAULT_CLASS_NAMES = { + scrollIndicator: 'overflow-slider__scroll-indicator', + scrollIndicatorBar: 'overflow-slider__scroll-indicator-bar', + scrollIndicatorButton: 'overflow-slider__scroll-indicator-button', +}; +function ScrollIndicatorPlugin(args) { + return (slider) => { + var _a, _b, _c; + const options = { + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const scrollbarContainer = document.createElement('div'); + scrollbarContainer.setAttribute('class', options.classNames.scrollIndicator); + scrollbarContainer.setAttribute('tabindex', '0'); + scrollbarContainer.setAttribute('role', 'scrollbar'); + scrollbarContainer.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); + scrollbarContainer.setAttribute('aria-orientation', 'horizontal'); + scrollbarContainer.setAttribute('aria-valuemax', '100'); + scrollbarContainer.setAttribute('aria-valuemin', '0'); + scrollbarContainer.setAttribute('aria-valuenow', '0'); + const scrollbar = document.createElement('div'); + scrollbar.setAttribute('class', options.classNames.scrollIndicatorBar); + const scrollbarButton = document.createElement('div'); + scrollbarButton.setAttribute('class', options.classNames.scrollIndicatorButton); + scrollbarButton.setAttribute('data-is-grabbed', 'false'); + scrollbar.appendChild(scrollbarButton); + scrollbarContainer.appendChild(scrollbar); + const setDataAttributes = () => { + scrollbarContainer.setAttribute('data-has-overflow', slider.details.hasOverflow.toString()); + }; + setDataAttributes(); + const getScrollbarButtonLeftOffset = () => { + const scrollbarRatio = slider.container.offsetWidth / slider.container.scrollWidth; + return slider.container.scrollLeft * scrollbarRatio; + }; + // scrollbarbutton width and position is calculated based on the scroll position and available width + let requestId = 0; + const update = () => { + if (requestId) { + window.cancelAnimationFrame(requestId); + } + requestId = window.requestAnimationFrame(() => { + const scrollbarButtonWidth = (slider.container.offsetWidth / slider.container.scrollWidth) * 100; + const scrollLeftInPortion = getScrollbarButtonLeftOffset(); + scrollbarButton.style.width = `${scrollbarButtonWidth}%`; + scrollbarButton.style.transform = `translateX(${scrollLeftInPortion}px)`; + // aria-valuenow + const scrollLeft = slider.container.scrollLeft; + const scrollWidth = slider.container.scrollWidth; + const containerWidth = slider.container.offsetWidth; + const scrollPercentage = (scrollLeft / (scrollWidth - containerWidth)) * 100; + scrollbarContainer.setAttribute('aria-valuenow', Math.round(Number.isNaN(scrollPercentage) ? 0 : scrollPercentage).toString()); + }); + }; + // insert to DOM + if (options.container) { + options.container.appendChild(scrollbarContainer); + } + else { + (_c = slider.container.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(scrollbarContainer, slider.container.nextSibling); + } + // update the scrollbar when the slider is scrolled + update(); + slider.on('scroll', update); + slider.on('contentsChanged', update); + slider.on('containerSizeChanged', update); + slider.on('detailsChanged', setDataAttributes); + // handle arrow keys while focused + scrollbarContainer.addEventListener('keydown', (e) => { + if (e.key === 'ArrowLeft') { + slider.moveToDirection('prev'); + } + else if (e.key === 'ArrowRight') { + slider.moveToDirection('next'); + } + }); + // handle click to before or after the scrollbar button + scrollbarContainer.addEventListener('click', (e) => { + const scrollbarButtonWidth = scrollbarButton.offsetWidth; + const scrollbarButtonLeft = getScrollbarButtonLeftOffset(); + const scrollbarButtonRight = scrollbarButtonLeft + scrollbarButtonWidth; + const clickX = e.pageX - scrollbarContainer.offsetLeft; + if (clickX < scrollbarButtonLeft) { + slider.moveToDirection('prev'); + } + else if (clickX > scrollbarButtonRight) { + slider.moveToDirection('next'); + } + }); + // make scrollbar button draggable via mouse/touch and update the scroll position + let isInteractionDown = false; + let startX = 0; + let scrollLeft = 0; + const onInteractionDown = (e) => { + isInteractionDown = true; + const pageX = e.pageX || e.touches[0].pageX; + startX = pageX - scrollbarContainer.offsetLeft; + scrollLeft = slider.container.scrollLeft; + // change cursor to grabbing + scrollbarButton.style.cursor = 'grabbing'; + slider.container.style.scrollSnapType = 'none'; + scrollbarButton.setAttribute('data-is-grabbed', 'true'); + e.preventDefault(); + e.stopPropagation(); + }; + const onInteractionMove = (e) => { + if (!isInteractionDown) { + return; + } + e.preventDefault(); + const pageX = e.pageX || e.touches[0].pageX; + const x = pageX - scrollbarContainer.offsetLeft; + const scrollingFactor = slider.container.scrollWidth / scrollbarContainer.offsetWidth; + const walk = (x - startX) * scrollingFactor; + slider.container.scrollLeft = scrollLeft + walk; + }; + const onInteractionUp = () => { + isInteractionDown = false; + scrollbarButton.style.cursor = ''; + slider.container.style.scrollSnapType = ''; + scrollbarButton.setAttribute('data-is-grabbed', 'false'); + }; + scrollbarButton.addEventListener('mousedown', onInteractionDown); + scrollbarButton.addEventListener('touchstart', onInteractionDown); + window.addEventListener('mousemove', onInteractionMove); + window.addEventListener('touchmove', onInteractionMove, { passive: false }); + window.addEventListener('mouseup', onInteractionUp); + window.addEventListener('touchend', onInteractionUp); + }; +} + +export { ScrollIndicatorPlugin as default }; diff --git a/dist/plugins/scroll-indicator.min.js b/dist/plugins/scroll-indicator.min.js new file mode 100644 index 0000000..ee9525d --- /dev/null +++ b/dist/plugins/scroll-indicator.min.js @@ -0,0 +1 @@ +const t={scrollIndicator:"overflow-slider__scroll-indicator",scrollIndicatorBar:"overflow-slider__scroll-indicator-bar",scrollIndicatorButton:"overflow-slider__scroll-indicator-button"};function e(e){return n=>{var o,r,i;const a={classNames:Object.assign(Object.assign({},t),(null==e?void 0:e.classNames)||[]),container:null!==(o=null==e?void 0:e.container)&&void 0!==o?o:null},s=document.createElement("div");s.setAttribute("class",a.classNames.scrollIndicator),s.setAttribute("tabindex","0"),s.setAttribute("role","scrollbar"),s.setAttribute("aria-controls",null!==(r=n.container.getAttribute("id"))&&void 0!==r?r:""),s.setAttribute("aria-orientation","horizontal"),s.setAttribute("aria-valuemax","100"),s.setAttribute("aria-valuemin","0"),s.setAttribute("aria-valuenow","0");const l=document.createElement("div");l.setAttribute("class",a.classNames.scrollIndicatorBar);const c=document.createElement("div");c.setAttribute("class",a.classNames.scrollIndicatorButton),c.setAttribute("data-is-grabbed","false"),l.appendChild(c),s.appendChild(l);const d=()=>{s.setAttribute("data-has-overflow",n.details.hasOverflow.toString())};d();const u=()=>{const t=n.container.offsetWidth/n.container.scrollWidth;return n.container.scrollLeft*t};let f=0;const v=()=>{f&&window.cancelAnimationFrame(f),f=window.requestAnimationFrame((()=>{const t=n.container.offsetWidth/n.container.scrollWidth*100,e=u();c.style.width=`${t}%`,c.style.transform=`translateX(${e}px)`;const o=n.container.scrollLeft/(n.container.scrollWidth-n.container.offsetWidth)*100;s.setAttribute("aria-valuenow",Math.round(Number.isNaN(o)?0:o).toString())}))};a.container?a.container.appendChild(s):null===(i=n.container.parentNode)||void 0===i||i.insertBefore(s,n.container.nextSibling),v(),n.on("scroll",v),n.on("contentsChanged",v),n.on("containerSizeChanged",v),n.on("detailsChanged",d),s.addEventListener("keydown",(t=>{"ArrowLeft"===t.key?n.moveToDirection("prev"):"ArrowRight"===t.key&&n.moveToDirection("next")})),s.addEventListener("click",(t=>{const e=c.offsetWidth,o=u(),r=o+e,i=t.pageX-s.offsetLeft;ir&&n.moveToDirection("next")}));let b=!1,m=0,h=0;const p=t=>{b=!0;const e=t.pageX||t.touches[0].pageX;m=e-s.offsetLeft,h=n.container.scrollLeft,c.style.cursor="grabbing",n.container.style.scrollSnapType="none",c.setAttribute("data-is-grabbed","true"),t.preventDefault(),t.stopPropagation()},w=t=>{if(!b)return;t.preventDefault();const e=(t.pageX||t.touches[0].pageX)-s.offsetLeft,o=n.container.scrollWidth/s.offsetWidth,r=(e-m)*o;n.container.scrollLeft=h+r},g=()=>{b=!1,c.style.cursor="",n.container.style.scrollSnapType="",c.setAttribute("data-is-grabbed","false")};c.addEventListener("mousedown",p),c.addEventListener("touchstart",p),window.addEventListener("mousemove",w),window.addEventListener("touchmove",w,{passive:!1}),window.addEventListener("mouseup",g),window.addEventListener("touchend",g)}}export{e as default}; diff --git a/dist/plugins/skip-links.esm.js b/dist/plugins/skip-links.esm.js new file mode 100644 index 0000000..8ef9fa3 --- /dev/null +++ b/dist/plugins/skip-links.esm.js @@ -0,0 +1,42 @@ +import { generateId } from './core/utils.esm.js'; + +const DEFAULT_TEXTS = { + skipList: 'Skip list' +}; +const DEFAULT_CLASS_NAMES = { + skipLink: 'screen-reader-text', + skipLinkTarget: 'overflow-slider__skip-link-target', +}; +function SkipLinksPlugin(args) { + return (slider) => { + var _a, _b, _c, _d, _e, _f; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + containerBefore: (_a = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _a !== void 0 ? _a : null, + containerAfter: (_b = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _b !== void 0 ? _b : null, + }; + const skipId = generateId('overflow-slider-skip'); + const skipLinkEl = document.createElement('a'); + skipLinkEl.setAttribute('href', `#${skipId}`); + skipLinkEl.textContent = options.texts.skipList; + skipLinkEl.classList.add(options.classNames.skipLink); + const skipTargetEl = document.createElement('div'); + skipTargetEl.setAttribute('id', skipId); + skipTargetEl.setAttribute('tabindex', '-1'); + if (options.containerBefore) { + (_c = options.containerBefore.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(skipLinkEl, options.containerBefore); + } + else { + (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(skipLinkEl, slider.container); + } + if (options.containerAfter) { + (_e = options.containerAfter.parentNode) === null || _e === void 0 ? void 0 : _e.insertBefore(skipTargetEl, options.containerAfter.nextSibling); + } + else { + (_f = slider.container.parentNode) === null || _f === void 0 ? void 0 : _f.insertBefore(skipTargetEl, slider.container.nextSibling); + } + }; +} + +export { SkipLinksPlugin as default }; diff --git a/dist/plugins/skip-links.js b/dist/plugins/skip-links.js new file mode 100644 index 0000000..72516c1 --- /dev/null +++ b/dist/plugins/skip-links.js @@ -0,0 +1,42 @@ +import { generateId } from './core/utils.js'; + +const DEFAULT_TEXTS = { + skipList: 'Skip list' +}; +const DEFAULT_CLASS_NAMES = { + skipLink: 'screen-reader-text', + skipLinkTarget: 'overflow-slider__skip-link-target', +}; +function SkipLinksPlugin(args) { + return (slider) => { + var _a, _b, _c, _d, _e, _f; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + containerBefore: (_a = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _a !== void 0 ? _a : null, + containerAfter: (_b = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _b !== void 0 ? _b : null, + }; + const skipId = generateId('overflow-slider-skip'); + const skipLinkEl = document.createElement('a'); + skipLinkEl.setAttribute('href', `#${skipId}`); + skipLinkEl.textContent = options.texts.skipList; + skipLinkEl.classList.add(options.classNames.skipLink); + const skipTargetEl = document.createElement('div'); + skipTargetEl.setAttribute('id', skipId); + skipTargetEl.setAttribute('tabindex', '-1'); + if (options.containerBefore) { + (_c = options.containerBefore.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(skipLinkEl, options.containerBefore); + } + else { + (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(skipLinkEl, slider.container); + } + if (options.containerAfter) { + (_e = options.containerAfter.parentNode) === null || _e === void 0 ? void 0 : _e.insertBefore(skipTargetEl, options.containerAfter.nextSibling); + } + else { + (_f = slider.container.parentNode) === null || _f === void 0 ? void 0 : _f.insertBefore(skipTargetEl, slider.container.nextSibling); + } + }; +} + +export { SkipLinksPlugin as default }; diff --git a/dist/plugins/skip-links.min.js b/dist/plugins/skip-links.min.js new file mode 100644 index 0000000..c85a7df --- /dev/null +++ b/dist/plugins/skip-links.min.js @@ -0,0 +1 @@ +import{generateId as e}from"./core/utils.min.js";const t={skipList:"Skip list"},n={skipLink:"screen-reader-text",skipLinkTarget:"overflow-slider__skip-link-target"};function i(i){return r=>{var o,s,a,l,c,d;const u={texts:Object.assign(Object.assign({},t),(null==i?void 0:i.texts)||[]),classNames:Object.assign(Object.assign({},n),(null==i?void 0:i.classNames)||[]),containerBefore:null!==(o=null==i?void 0:i.containerAfter)&&void 0!==o?o:null,containerAfter:null!==(s=null==i?void 0:i.containerAfter)&&void 0!==s?s:null},f=e("overflow-slider-skip"),p=document.createElement("a");p.setAttribute("href",`#${f}`),p.textContent=u.texts.skipList,p.classList.add(u.classNames.skipLink);const v=document.createElement("div");v.setAttribute("id",f),v.setAttribute("tabindex","-1"),u.containerBefore?null===(a=u.containerBefore.parentNode)||void 0===a||a.insertBefore(p,u.containerBefore):null===(l=r.container.parentNode)||void 0===l||l.insertBefore(p,r.container),u.containerAfter?null===(c=u.containerAfter.parentNode)||void 0===c||c.insertBefore(v,u.containerAfter.nextSibling):null===(d=r.container.parentNode)||void 0===d||d.insertBefore(v,r.container.nextSibling)}}export{i as default}; diff --git a/dist/scroll-indicator.esm.js b/dist/scroll-indicator.esm.js new file mode 100644 index 0000000..c743c15 --- /dev/null +++ b/dist/scroll-indicator.esm.js @@ -0,0 +1,133 @@ +const DEFAULT_CLASS_NAMES = { + scrollIndicator: 'overflow-slider__scroll-indicator', + scrollIndicatorBar: 'overflow-slider__scroll-indicator-bar', + scrollIndicatorButton: 'overflow-slider__scroll-indicator-button', +}; +function ScrollIndicatorPlugin(args) { + return (slider) => { + var _a, _b, _c; + const options = { + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const scrollbarContainer = document.createElement('div'); + scrollbarContainer.setAttribute('class', options.classNames.scrollIndicator); + scrollbarContainer.setAttribute('tabindex', '0'); + scrollbarContainer.setAttribute('role', 'scrollbar'); + scrollbarContainer.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); + scrollbarContainer.setAttribute('aria-orientation', 'horizontal'); + scrollbarContainer.setAttribute('aria-valuemax', '100'); + scrollbarContainer.setAttribute('aria-valuemin', '0'); + scrollbarContainer.setAttribute('aria-valuenow', '0'); + const scrollbar = document.createElement('div'); + scrollbar.setAttribute('class', options.classNames.scrollIndicatorBar); + const scrollbarButton = document.createElement('div'); + scrollbarButton.setAttribute('class', options.classNames.scrollIndicatorButton); + scrollbarButton.setAttribute('data-is-grabbed', 'false'); + scrollbar.appendChild(scrollbarButton); + scrollbarContainer.appendChild(scrollbar); + const setDataAttributes = () => { + scrollbarContainer.setAttribute('data-has-overflow', slider.details.hasOverflow.toString()); + }; + setDataAttributes(); + const getScrollbarButtonLeftOffset = () => { + const scrollbarRatio = slider.container.offsetWidth / slider.container.scrollWidth; + return slider.container.scrollLeft * scrollbarRatio; + }; + // scrollbarbutton width and position is calculated based on the scroll position and available width + let requestId = 0; + const update = () => { + if (requestId) { + window.cancelAnimationFrame(requestId); + } + requestId = window.requestAnimationFrame(() => { + const scrollbarButtonWidth = (slider.container.offsetWidth / slider.container.scrollWidth) * 100; + const scrollLeftInPortion = getScrollbarButtonLeftOffset(); + scrollbarButton.style.width = `${scrollbarButtonWidth}%`; + scrollbarButton.style.transform = `translateX(${scrollLeftInPortion}px)`; + // aria-valuenow + const scrollLeft = slider.container.scrollLeft; + const scrollWidth = slider.container.scrollWidth; + const containerWidth = slider.container.offsetWidth; + const scrollPercentage = (scrollLeft / (scrollWidth - containerWidth)) * 100; + scrollbarContainer.setAttribute('aria-valuenow', Math.round(Number.isNaN(scrollPercentage) ? 0 : scrollPercentage).toString()); + }); + }; + // insert to DOM + if (options.container) { + options.container.appendChild(scrollbarContainer); + } + else { + (_c = slider.container.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(scrollbarContainer, slider.container.nextSibling); + } + // update the scrollbar when the slider is scrolled + update(); + slider.on('scroll', update); + slider.on('contentsChanged', update); + slider.on('containerSizeChanged', update); + slider.on('detailsChanged', setDataAttributes); + // handle arrow keys while focused + scrollbarContainer.addEventListener('keydown', (e) => { + if (e.key === 'ArrowLeft') { + slider.moveToDirection('prev'); + } + else if (e.key === 'ArrowRight') { + slider.moveToDirection('next'); + } + }); + // handle click to before or after the scrollbar button + scrollbarContainer.addEventListener('click', (e) => { + const scrollbarButtonWidth = scrollbarButton.offsetWidth; + const scrollbarButtonLeft = getScrollbarButtonLeftOffset(); + const scrollbarButtonRight = scrollbarButtonLeft + scrollbarButtonWidth; + const clickX = e.pageX - scrollbarContainer.offsetLeft; + if (clickX < scrollbarButtonLeft) { + slider.moveToDirection('prev'); + } + else if (clickX > scrollbarButtonRight) { + slider.moveToDirection('next'); + } + }); + // make scrollbar button draggable via mouse/touch and update the scroll position + let isInteractionDown = false; + let startX = 0; + let scrollLeft = 0; + const onInteractionDown = (e) => { + isInteractionDown = true; + const pageX = e.pageX || e.touches[0].pageX; + startX = pageX - scrollbarContainer.offsetLeft; + scrollLeft = slider.container.scrollLeft; + // change cursor to grabbing + scrollbarButton.style.cursor = 'grabbing'; + slider.container.style.scrollSnapType = 'none'; + scrollbarButton.setAttribute('data-is-grabbed', 'true'); + e.preventDefault(); + e.stopPropagation(); + }; + const onInteractionMove = (e) => { + if (!isInteractionDown) { + return; + } + e.preventDefault(); + const pageX = e.pageX || e.touches[0].pageX; + const x = pageX - scrollbarContainer.offsetLeft; + const scrollingFactor = slider.container.scrollWidth / scrollbarContainer.offsetWidth; + const walk = (x - startX) * scrollingFactor; + slider.container.scrollLeft = scrollLeft + walk; + }; + const onInteractionUp = () => { + isInteractionDown = false; + scrollbarButton.style.cursor = ''; + slider.container.style.scrollSnapType = ''; + scrollbarButton.setAttribute('data-is-grabbed', 'false'); + }; + scrollbarButton.addEventListener('mousedown', onInteractionDown); + scrollbarButton.addEventListener('touchstart', onInteractionDown); + window.addEventListener('mousemove', onInteractionMove); + window.addEventListener('touchmove', onInteractionMove, { passive: false }); + window.addEventListener('mouseup', onInteractionUp); + window.addEventListener('touchend', onInteractionUp); + }; +} + +export { ScrollIndicatorPlugin as default }; diff --git a/dist/scroll-indicator.min.js b/dist/scroll-indicator.min.js new file mode 100644 index 0000000..ee9525d --- /dev/null +++ b/dist/scroll-indicator.min.js @@ -0,0 +1 @@ +const t={scrollIndicator:"overflow-slider__scroll-indicator",scrollIndicatorBar:"overflow-slider__scroll-indicator-bar",scrollIndicatorButton:"overflow-slider__scroll-indicator-button"};function e(e){return n=>{var o,r,i;const a={classNames:Object.assign(Object.assign({},t),(null==e?void 0:e.classNames)||[]),container:null!==(o=null==e?void 0:e.container)&&void 0!==o?o:null},s=document.createElement("div");s.setAttribute("class",a.classNames.scrollIndicator),s.setAttribute("tabindex","0"),s.setAttribute("role","scrollbar"),s.setAttribute("aria-controls",null!==(r=n.container.getAttribute("id"))&&void 0!==r?r:""),s.setAttribute("aria-orientation","horizontal"),s.setAttribute("aria-valuemax","100"),s.setAttribute("aria-valuemin","0"),s.setAttribute("aria-valuenow","0");const l=document.createElement("div");l.setAttribute("class",a.classNames.scrollIndicatorBar);const c=document.createElement("div");c.setAttribute("class",a.classNames.scrollIndicatorButton),c.setAttribute("data-is-grabbed","false"),l.appendChild(c),s.appendChild(l);const d=()=>{s.setAttribute("data-has-overflow",n.details.hasOverflow.toString())};d();const u=()=>{const t=n.container.offsetWidth/n.container.scrollWidth;return n.container.scrollLeft*t};let f=0;const v=()=>{f&&window.cancelAnimationFrame(f),f=window.requestAnimationFrame((()=>{const t=n.container.offsetWidth/n.container.scrollWidth*100,e=u();c.style.width=`${t}%`,c.style.transform=`translateX(${e}px)`;const o=n.container.scrollLeft/(n.container.scrollWidth-n.container.offsetWidth)*100;s.setAttribute("aria-valuenow",Math.round(Number.isNaN(o)?0:o).toString())}))};a.container?a.container.appendChild(s):null===(i=n.container.parentNode)||void 0===i||i.insertBefore(s,n.container.nextSibling),v(),n.on("scroll",v),n.on("contentsChanged",v),n.on("containerSizeChanged",v),n.on("detailsChanged",d),s.addEventListener("keydown",(t=>{"ArrowLeft"===t.key?n.moveToDirection("prev"):"ArrowRight"===t.key&&n.moveToDirection("next")})),s.addEventListener("click",(t=>{const e=c.offsetWidth,o=u(),r=o+e,i=t.pageX-s.offsetLeft;ir&&n.moveToDirection("next")}));let b=!1,m=0,h=0;const p=t=>{b=!0;const e=t.pageX||t.touches[0].pageX;m=e-s.offsetLeft,h=n.container.scrollLeft,c.style.cursor="grabbing",n.container.style.scrollSnapType="none",c.setAttribute("data-is-grabbed","true"),t.preventDefault(),t.stopPropagation()},w=t=>{if(!b)return;t.preventDefault();const e=(t.pageX||t.touches[0].pageX)-s.offsetLeft,o=n.container.scrollWidth/s.offsetWidth,r=(e-m)*o;n.container.scrollLeft=h+r},g=()=>{b=!1,c.style.cursor="",n.container.style.scrollSnapType="",c.setAttribute("data-is-grabbed","false")};c.addEventListener("mousedown",p),c.addEventListener("touchstart",p),window.addEventListener("mousemove",w),window.addEventListener("touchmove",w,{passive:!1}),window.addEventListener("mouseup",g),window.addEventListener("touchend",g)}}export{e as default}; diff --git a/dist/skip-links.esm.js b/dist/skip-links.esm.js new file mode 100644 index 0000000..8ef9fa3 --- /dev/null +++ b/dist/skip-links.esm.js @@ -0,0 +1,42 @@ +import { generateId } from './core/utils.esm.js'; + +const DEFAULT_TEXTS = { + skipList: 'Skip list' +}; +const DEFAULT_CLASS_NAMES = { + skipLink: 'screen-reader-text', + skipLinkTarget: 'overflow-slider__skip-link-target', +}; +function SkipLinksPlugin(args) { + return (slider) => { + var _a, _b, _c, _d, _e, _f; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + containerBefore: (_a = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _a !== void 0 ? _a : null, + containerAfter: (_b = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _b !== void 0 ? _b : null, + }; + const skipId = generateId('overflow-slider-skip'); + const skipLinkEl = document.createElement('a'); + skipLinkEl.setAttribute('href', `#${skipId}`); + skipLinkEl.textContent = options.texts.skipList; + skipLinkEl.classList.add(options.classNames.skipLink); + const skipTargetEl = document.createElement('div'); + skipTargetEl.setAttribute('id', skipId); + skipTargetEl.setAttribute('tabindex', '-1'); + if (options.containerBefore) { + (_c = options.containerBefore.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(skipLinkEl, options.containerBefore); + } + else { + (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(skipLinkEl, slider.container); + } + if (options.containerAfter) { + (_e = options.containerAfter.parentNode) === null || _e === void 0 ? void 0 : _e.insertBefore(skipTargetEl, options.containerAfter.nextSibling); + } + else { + (_f = slider.container.parentNode) === null || _f === void 0 ? void 0 : _f.insertBefore(skipTargetEl, slider.container.nextSibling); + } + }; +} + +export { SkipLinksPlugin as default }; diff --git a/dist/skip-links.min.js b/dist/skip-links.min.js new file mode 100644 index 0000000..c85a7df --- /dev/null +++ b/dist/skip-links.min.js @@ -0,0 +1 @@ +import{generateId as e}from"./core/utils.min.js";const t={skipList:"Skip list"},n={skipLink:"screen-reader-text",skipLinkTarget:"overflow-slider__skip-link-target"};function i(i){return r=>{var o,s,a,l,c,d;const u={texts:Object.assign(Object.assign({},t),(null==i?void 0:i.texts)||[]),classNames:Object.assign(Object.assign({},n),(null==i?void 0:i.classNames)||[]),containerBefore:null!==(o=null==i?void 0:i.containerAfter)&&void 0!==o?o:null,containerAfter:null!==(s=null==i?void 0:i.containerAfter)&&void 0!==s?s:null},f=e("overflow-slider-skip"),p=document.createElement("a");p.setAttribute("href",`#${f}`),p.textContent=u.texts.skipList,p.classList.add(u.classNames.skipLink);const v=document.createElement("div");v.setAttribute("id",f),v.setAttribute("tabindex","-1"),u.containerBefore?null===(a=u.containerBefore.parentNode)||void 0===a||a.insertBefore(p,u.containerBefore):null===(l=r.container.parentNode)||void 0===l||l.insertBefore(p,r.container),u.containerAfter?null===(c=u.containerAfter.parentNode)||void 0===c||c.insertBefore(v,u.containerAfter.nextSibling):null===(d=r.container.parentNode)||void 0===d||d.insertBefore(v,r.container.nextSibling)}}export{i as default}; diff --git a/docs/assets/demo.js b/docs/assets/demo.js index 46f05aa..218a09a 100644 --- a/docs/assets/demo.js +++ b/docs/assets/demo.js @@ -1,11 +1,18 @@ -import { - OverflowSlider, - DragScrollingPlugin, - SkipLinksPlugin, - ArrowsPlugin, - ScrollIndicatorPlugin, - DotsPlugin -} from '../dist/overflow-slider.esm.js'; +// import { +// OverflowSlider, +// DragScrollingPlugin, +// SkipLinksPlugin, +// ArrowsPlugin, +// ScrollIndicatorPlugin, +// DotsPlugin +// } from '../dist/overflow-slider.esm.js'; + +import { OverflowSlider } from '../dist/index.esm.js'; +import DragScrollingPlugin from '../dist/plugins/drag-scrolling.esm.js'; +import SkipLinksPlugin from '../dist/plugins/skip-links.esm.js'; +import ArrowsPlugin from '../dist/plugins/arrows.esm.js'; +import ScrollIndicatorPlugin from '../dist/plugins/scroll-indicator.esm.js'; +import DotsPlugin from '../dist/plugins/dots.esm.js'; (function () { const init = () => { diff --git a/docs/dist/arrows.esm.js b/docs/dist/arrows.esm.js new file mode 100644 index 0000000..584926b --- /dev/null +++ b/docs/dist/arrows.esm.js @@ -0,0 +1,74 @@ +const DEFAULT_TEXTS = { + buttonPrevious: 'Previous items', + buttonNext: 'Next items', +}; +const DEFAULT_ICONS = { + prev: '', + next: '', +}; +const DEFAULT_CLASS_NAMES = { + navContainer: 'overflow-slider__arrows', + prevButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--prev', + nextButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--next', +}; +function ArrowsPlugin(args) { + return (slider) => { + var _a, _b, _c, _d; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + icons: Object.assign(Object.assign({}, DEFAULT_ICONS), (args === null || args === void 0 ? void 0 : args.icons) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const nav = document.createElement('div'); + nav.classList.add(options.classNames.navContainer); + const prev = document.createElement('button'); + prev.setAttribute('class', options.classNames.prevButton); + prev.setAttribute('type', 'button'); + prev.setAttribute('aria-label', options.texts.buttonPrevious); + prev.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); + prev.setAttribute('data-type', 'prev'); + prev.innerHTML = options.icons.prev; + prev.addEventListener('click', () => slider.moveToDirection('prev')); + const next = document.createElement('button'); + next.setAttribute('class', options.classNames.nextButton); + next.setAttribute('type', 'button'); + next.setAttribute('aria-label', options.texts.buttonNext); + next.setAttribute('aria-controls', (_c = slider.container.getAttribute('id')) !== null && _c !== void 0 ? _c : ''); + next.setAttribute('data-type', 'next'); + next.innerHTML = options.icons.next; + next.addEventListener('click', () => slider.moveToDirection('next')); + // insert buttons to the nav + nav.appendChild(prev); + nav.appendChild(next); + const update = () => { + const scrollLeft = slider.container.scrollLeft; + const scrollWidth = slider.container.scrollWidth; + const clientWidth = slider.container.clientWidth; + if (scrollLeft === 0) { + prev.setAttribute('data-has-content', 'false'); + } + else { + prev.setAttribute('data-has-content', 'true'); + } + if (scrollLeft + clientWidth >= scrollWidth) { + next.setAttribute('data-has-content', 'false'); + } + else { + next.setAttribute('data-has-content', 'true'); + } + }; + if (options.container) { + options.container.appendChild(nav); + } + else { + (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(nav, slider.container.nextSibling); + } + update(); + slider.on('scroll', update); + slider.on('contentsChanged', update); + slider.on('containerSizeChanged', update); + }; +} + +export { ArrowsPlugin as default }; diff --git a/docs/dist/arrows.min.js b/docs/dist/arrows.min.js new file mode 100644 index 0000000..384e17a --- /dev/null +++ b/docs/dist/arrows.min.js @@ -0,0 +1 @@ +const t={buttonPrevious:"Previous items",buttonNext:"Next items"},e={prev:'',next:''},n={navContainer:"overflow-slider__arrows",prevButton:"overflow-slider__arrows-button overflow-slider__arrows-button--prev",nextButton:"overflow-slider__arrows-button overflow-slider__arrows-button--next"};function s(s){return o=>{var i,r,a,l;const c={texts:Object.assign(Object.assign({},t),(null==s?void 0:s.texts)||[]),icons:Object.assign(Object.assign({},e),(null==s?void 0:s.icons)||[]),classNames:Object.assign(Object.assign({},n),(null==s?void 0:s.classNames)||[]),container:null!==(i=null==s?void 0:s.container)&&void 0!==i?i:null},u=document.createElement("div");u.classList.add(c.classNames.navContainer);const d=document.createElement("button");d.setAttribute("class",c.classNames.prevButton),d.setAttribute("type","button"),d.setAttribute("aria-label",c.texts.buttonPrevious),d.setAttribute("aria-controls",null!==(r=o.container.getAttribute("id"))&&void 0!==r?r:""),d.setAttribute("data-type","prev"),d.innerHTML=c.icons.prev,d.addEventListener("click",(()=>o.moveToDirection("prev")));const v=document.createElement("button");v.setAttribute("class",c.classNames.nextButton),v.setAttribute("type","button"),v.setAttribute("aria-label",c.texts.buttonNext),v.setAttribute("aria-controls",null!==(a=o.container.getAttribute("id"))&&void 0!==a?a:""),v.setAttribute("data-type","next"),v.innerHTML=c.icons.next,v.addEventListener("click",(()=>o.moveToDirection("next"))),u.appendChild(d),u.appendChild(v);const b=()=>{const t=o.container.scrollLeft,e=o.container.scrollWidth,n=o.container.clientWidth;0===t?d.setAttribute("data-has-content","false"):d.setAttribute("data-has-content","true"),t+n>=e?v.setAttribute("data-has-content","false"):v.setAttribute("data-has-content","true")};c.container?c.container.appendChild(u):null===(l=o.container.parentNode)||void 0===l||l.insertBefore(u,o.container.nextSibling),b(),o.on("scroll",b),o.on("contentsChanged",b),o.on("containerSizeChanged",b)}}export{s as default}; diff --git a/docs/dist/core/details.esm.js b/docs/dist/core/details.esm.js new file mode 100644 index 0000000..2eee8ef --- /dev/null +++ b/docs/dist/core/details.esm.js @@ -0,0 +1,34 @@ +function details(slider) { + let instance; + let hasOverflow = false; + let slideCount = 0; + let containerWidth = 0; + let scrollableAreaWidth = 0; + let amountOfPages = 0; + let currentPage = 1; + if (slider.container.scrollWidth > slider.container.clientWidth) { + hasOverflow = true; + } + slideCount = Array.from(slider.container.querySelectorAll(':scope > *')).length; + containerWidth = slider.container.offsetWidth; + scrollableAreaWidth = slider.container.scrollWidth; + amountOfPages = Math.ceil(scrollableAreaWidth / containerWidth); + if (slider.container.scrollLeft >= 0) { + currentPage = Math.floor(slider.container.scrollLeft / containerWidth); + // consider as last page if the scrollLeft + containerWidth is equal to scrollWidth + if (slider.container.scrollLeft + containerWidth === scrollableAreaWidth) { + currentPage = amountOfPages - 1; + } + } + instance = { + hasOverflow, + slideCount, + containerWidth, + scrollableAreaWidth, + amountOfPages, + currentPage, + }; + return instance; +} + +export { details as default }; diff --git a/docs/dist/core/details.js b/docs/dist/core/details.js new file mode 100644 index 0000000..2eee8ef --- /dev/null +++ b/docs/dist/core/details.js @@ -0,0 +1,34 @@ +function details(slider) { + let instance; + let hasOverflow = false; + let slideCount = 0; + let containerWidth = 0; + let scrollableAreaWidth = 0; + let amountOfPages = 0; + let currentPage = 1; + if (slider.container.scrollWidth > slider.container.clientWidth) { + hasOverflow = true; + } + slideCount = Array.from(slider.container.querySelectorAll(':scope > *')).length; + containerWidth = slider.container.offsetWidth; + scrollableAreaWidth = slider.container.scrollWidth; + amountOfPages = Math.ceil(scrollableAreaWidth / containerWidth); + if (slider.container.scrollLeft >= 0) { + currentPage = Math.floor(slider.container.scrollLeft / containerWidth); + // consider as last page if the scrollLeft + containerWidth is equal to scrollWidth + if (slider.container.scrollLeft + containerWidth === scrollableAreaWidth) { + currentPage = amountOfPages - 1; + } + } + instance = { + hasOverflow, + slideCount, + containerWidth, + scrollableAreaWidth, + amountOfPages, + currentPage, + }; + return instance; +} + +export { details as default }; diff --git a/docs/dist/core/details.min.js b/docs/dist/core/details.min.js new file mode 100644 index 0000000..82cca30 --- /dev/null +++ b/docs/dist/core/details.min.js @@ -0,0 +1 @@ +function t(t){let e,r=!1,n=0,o=0,l=0,c=0,a=1;return t.container.scrollWidth>t.container.clientWidth&&(r=!0),n=Array.from(t.container.querySelectorAll(":scope > *")).length,o=t.container.offsetWidth,l=t.container.scrollWidth,c=Math.ceil(l/o),t.container.scrollLeft>=0&&(a=Math.floor(t.container.scrollLeft/o),t.container.scrollLeft+o===l&&(a=c-1)),e={hasOverflow:r,slideCount:n,containerWidth:o,scrollableAreaWidth:l,amountOfPages:c,currentPage:a},e}export{t as default}; diff --git a/docs/dist/core/slider.esm.js b/docs/dist/core/slider.esm.js new file mode 100644 index 0000000..608e79d --- /dev/null +++ b/docs/dist/core/slider.esm.js @@ -0,0 +1,218 @@ +import details from './details.esm.js'; +import { generateId, objectsAreEqual } from './utils.esm.js'; + +function Slider(container, options, plugins) { + let slider; + let subs = {}; + function init() { + slider.container = container; + // ensure container has id + let containerId = container.getAttribute('id'); + if (containerId === null) { + containerId = generateId('overflow-slider'); + container.setAttribute('id', containerId); + } + setDetails(true); + slider.on('contentsChanged', () => setDetails()); + slider.on('containerSizeChanged', () => setDetails()); + let requestId = 0; + const setDetailsDebounce = () => { + if (requestId) { + window.cancelAnimationFrame(requestId); + } + requestId = window.requestAnimationFrame(() => { + setDetails(); + }); + }; + slider.on('scroll', setDetailsDebounce); + addEventListeners(); + setDataAttributes(); + setCSSVariables(); + if (plugins) { + for (const plugin of plugins) { + plugin(slider); + } + } + slider.on('detailsChanged', () => { + setDataAttributes(); + setCSSVariables(); + }); + slider.emit('created'); + } + function setDetails(isInit = false) { + const oldDetails = slider.details; + const newDetails = details(slider); + slider.details = newDetails; + if (!isInit && !objectsAreEqual(oldDetails, newDetails)) { + slider.emit('detailsChanged'); + } + else if (isInit) { + slider.emit('detailsChanged'); + } + } + function addEventListeners() { + // changes to DOM + const observer = new MutationObserver(() => slider.emit('contentsChanged')); + observer.observe(slider.container, { childList: true }); + // container size changes + const resizeObserver = new ResizeObserver(() => slider.emit('containerSizeChanged')); + resizeObserver.observe(slider.container); + // scroll event with debouncing + slider.container.addEventListener('scroll', () => slider.emit('scroll')); + // Listen for mouse down and touch start events on the document + // This handles both mouse clicks and touch interactions + let wasInteractedWith = false; + slider.container.addEventListener('mousedown', () => { + wasInteractedWith = true; + }); + slider.container.addEventListener('touchstart', () => { + wasInteractedWith = true; + }, { passive: true }); + slider.container.addEventListener('focusin', (e) => { + // move target parents as long as they are not the container + // but only if focus didn't start from mouse or touch + if (!wasInteractedWith) { + let target = e.target; + while (target.parentElement !== slider.container) { + if (target.parentElement) { + target = target.parentElement; + } + else { + break; + } + } + ensureSlideIsInView(target); + } + wasInteractedWith = false; + }); + } + function setCSSVariables() { + slider.container.style.setProperty('--slider-container-width', `${slider.details.containerWidth}px`); + slider.container.style.setProperty('--slider-scrollable-width', `${slider.details.scrollableAreaWidth}px`); + slider.container.style.setProperty('--slider-slides-count', `${slider.details.slideCount}`); + } + function setDataAttributes() { + slider.container.setAttribute('data-has-overflow', slider.details.hasOverflow ? 'true' : 'false'); + } + function ensureSlideIsInView(slide) { + const slideRect = slide.getBoundingClientRect(); + const sliderRect = slider.container.getBoundingClientRect(); + const containerWidth = slider.container.offsetWidth; + const scrollLeft = slider.container.scrollLeft; + const slideStart = slideRect.left - sliderRect.left + scrollLeft; + const slideEnd = slideStart + slideRect.width; + let scrollTarget = null; + if (slideStart < scrollLeft) { + scrollTarget = slideStart; + } + else if (slideEnd > scrollLeft + containerWidth) { + scrollTarget = slideEnd - containerWidth; + } + if (scrollTarget) { + slider.container.style.scrollSnapType = 'none'; + slider.container.scrollLeft = scrollTarget; + // @todo resume scroll snapping but at least proximity gives a lot of trouble + // and it's not really needed for this use case but it would be nice to have + // it back in case it's needed. We need to calculate scrollLeft some other way + } + } + function moveToDirection(direction = "prev") { + const scrollStrategy = slider.options.scrollStrategy; + const scrollLeft = slider.container.scrollLeft; + const sliderRect = slider.container.getBoundingClientRect(); + const containerWidth = slider.container.offsetWidth; + let targetScrollPosition = scrollLeft; + if (direction === 'prev') { + targetScrollPosition = Math.max(0, scrollLeft - slider.container.offsetWidth); + } + else if (direction === 'next') { + targetScrollPosition = Math.min(slider.container.scrollWidth, scrollLeft + slider.container.offsetWidth); + } + if (scrollStrategy === 'fullSlide') { + let fullSldeTargetScrollPosition = null; + const slides = Array.from(slider.container.querySelectorAll(':scope > *')); + let gapSize = 0; + if (slides.length > 1) { + const firstSlideRect = slides[0].getBoundingClientRect(); + const secondSlideRect = slides[1].getBoundingClientRect(); + gapSize = secondSlideRect.left - firstSlideRect.right; + } + // extend targetScrollPosition to include gap + if (direction === 'prev') { + fullSldeTargetScrollPosition = Math.max(0, targetScrollPosition - gapSize); + } + else { + fullSldeTargetScrollPosition = Math.min(slider.container.scrollWidth, targetScrollPosition + gapSize); + } + if (direction === 'next') { + let partialSlideFound = false; + for (let slide of slides) { + const slideRect = slide.getBoundingClientRect(); + const slideStart = slideRect.left - sliderRect.left + scrollLeft; + const slideEnd = slideStart + slideRect.width; + if (slideStart < targetScrollPosition && slideEnd > targetScrollPosition) { + fullSldeTargetScrollPosition = slideStart; + partialSlideFound = true; + break; + } + } + if (!partialSlideFound) { + fullSldeTargetScrollPosition = Math.min(targetScrollPosition, slider.container.scrollWidth - slider.container.offsetWidth); + } + if (fullSldeTargetScrollPosition && fullSldeTargetScrollPosition > scrollLeft) { + targetScrollPosition = fullSldeTargetScrollPosition; + } + } + else { + let partialSlideFound = false; + for (let slide of slides) { + const slideRect = slide.getBoundingClientRect(); + const slideStart = slideRect.left - sliderRect.left + scrollLeft; + const slideEnd = slideStart + slideRect.width; + if (slideStart < scrollLeft && slideEnd > scrollLeft) { + fullSldeTargetScrollPosition = slideEnd - containerWidth; + partialSlideFound = true; + break; + } + } + if (!partialSlideFound) { + fullSldeTargetScrollPosition = Math.max(0, scrollLeft - containerWidth); + } + if (fullSldeTargetScrollPosition && fullSldeTargetScrollPosition < scrollLeft) { + targetScrollPosition = fullSldeTargetScrollPosition; + } + } + } + slider.container.style.scrollBehavior = slider.options.scrollBehavior; + slider.container.scrollLeft = targetScrollPosition; + setTimeout(() => slider.container.style.scrollBehavior = '', 50); + } + function on(name, cb) { + if (!subs[name]) { + subs[name] = []; + } + subs[name].push(cb); + } + function emit(name) { + var _a; + if (subs && subs[name]) { + subs[name].forEach(cb => { + cb(slider); + }); + } + const optionCallBack = (_a = slider === null || slider === void 0 ? void 0 : slider.options) === null || _a === void 0 ? void 0 : _a[name]; + if (typeof optionCallBack === 'function') { + optionCallBack(slider); + } + } + slider = { + emit, + moveToDirection, + on, + options, + }; + init(); + return slider; +} + +export { Slider as default }; diff --git a/docs/dist/core/slider.js b/docs/dist/core/slider.js new file mode 100644 index 0000000..23d9a88 --- /dev/null +++ b/docs/dist/core/slider.js @@ -0,0 +1,218 @@ +import details from './details.js'; +import { generateId, objectsAreEqual } from './utils.js'; + +function Slider(container, options, plugins) { + let slider; + let subs = {}; + function init() { + slider.container = container; + // ensure container has id + let containerId = container.getAttribute('id'); + if (containerId === null) { + containerId = generateId('overflow-slider'); + container.setAttribute('id', containerId); + } + setDetails(true); + slider.on('contentsChanged', () => setDetails()); + slider.on('containerSizeChanged', () => setDetails()); + let requestId = 0; + const setDetailsDebounce = () => { + if (requestId) { + window.cancelAnimationFrame(requestId); + } + requestId = window.requestAnimationFrame(() => { + setDetails(); + }); + }; + slider.on('scroll', setDetailsDebounce); + addEventListeners(); + setDataAttributes(); + setCSSVariables(); + if (plugins) { + for (const plugin of plugins) { + plugin(slider); + } + } + slider.on('detailsChanged', () => { + setDataAttributes(); + setCSSVariables(); + }); + slider.emit('created'); + } + function setDetails(isInit = false) { + const oldDetails = slider.details; + const newDetails = details(slider); + slider.details = newDetails; + if (!isInit && !objectsAreEqual(oldDetails, newDetails)) { + slider.emit('detailsChanged'); + } + else if (isInit) { + slider.emit('detailsChanged'); + } + } + function addEventListeners() { + // changes to DOM + const observer = new MutationObserver(() => slider.emit('contentsChanged')); + observer.observe(slider.container, { childList: true }); + // container size changes + const resizeObserver = new ResizeObserver(() => slider.emit('containerSizeChanged')); + resizeObserver.observe(slider.container); + // scroll event with debouncing + slider.container.addEventListener('scroll', () => slider.emit('scroll')); + // Listen for mouse down and touch start events on the document + // This handles both mouse clicks and touch interactions + let wasInteractedWith = false; + slider.container.addEventListener('mousedown', () => { + wasInteractedWith = true; + }); + slider.container.addEventListener('touchstart', () => { + wasInteractedWith = true; + }, { passive: true }); + slider.container.addEventListener('focusin', (e) => { + // move target parents as long as they are not the container + // but only if focus didn't start from mouse or touch + if (!wasInteractedWith) { + let target = e.target; + while (target.parentElement !== slider.container) { + if (target.parentElement) { + target = target.parentElement; + } + else { + break; + } + } + ensureSlideIsInView(target); + } + wasInteractedWith = false; + }); + } + function setCSSVariables() { + slider.container.style.setProperty('--slider-container-width', `${slider.details.containerWidth}px`); + slider.container.style.setProperty('--slider-scrollable-width', `${slider.details.scrollableAreaWidth}px`); + slider.container.style.setProperty('--slider-slides-count', `${slider.details.slideCount}`); + } + function setDataAttributes() { + slider.container.setAttribute('data-has-overflow', slider.details.hasOverflow ? 'true' : 'false'); + } + function ensureSlideIsInView(slide) { + const slideRect = slide.getBoundingClientRect(); + const sliderRect = slider.container.getBoundingClientRect(); + const containerWidth = slider.container.offsetWidth; + const scrollLeft = slider.container.scrollLeft; + const slideStart = slideRect.left - sliderRect.left + scrollLeft; + const slideEnd = slideStart + slideRect.width; + let scrollTarget = null; + if (slideStart < scrollLeft) { + scrollTarget = slideStart; + } + else if (slideEnd > scrollLeft + containerWidth) { + scrollTarget = slideEnd - containerWidth; + } + if (scrollTarget) { + slider.container.style.scrollSnapType = 'none'; + slider.container.scrollLeft = scrollTarget; + // @todo resume scroll snapping but at least proximity gives a lot of trouble + // and it's not really needed for this use case but it would be nice to have + // it back in case it's needed. We need to calculate scrollLeft some other way + } + } + function moveToDirection(direction = "prev") { + const scrollStrategy = slider.options.scrollStrategy; + const scrollLeft = slider.container.scrollLeft; + const sliderRect = slider.container.getBoundingClientRect(); + const containerWidth = slider.container.offsetWidth; + let targetScrollPosition = scrollLeft; + if (direction === 'prev') { + targetScrollPosition = Math.max(0, scrollLeft - slider.container.offsetWidth); + } + else if (direction === 'next') { + targetScrollPosition = Math.min(slider.container.scrollWidth, scrollLeft + slider.container.offsetWidth); + } + if (scrollStrategy === 'fullSlide') { + let fullSldeTargetScrollPosition = null; + const slides = Array.from(slider.container.querySelectorAll(':scope > *')); + let gapSize = 0; + if (slides.length > 1) { + const firstSlideRect = slides[0].getBoundingClientRect(); + const secondSlideRect = slides[1].getBoundingClientRect(); + gapSize = secondSlideRect.left - firstSlideRect.right; + } + // extend targetScrollPosition to include gap + if (direction === 'prev') { + fullSldeTargetScrollPosition = Math.max(0, targetScrollPosition - gapSize); + } + else { + fullSldeTargetScrollPosition = Math.min(slider.container.scrollWidth, targetScrollPosition + gapSize); + } + if (direction === 'next') { + let partialSlideFound = false; + for (let slide of slides) { + const slideRect = slide.getBoundingClientRect(); + const slideStart = slideRect.left - sliderRect.left + scrollLeft; + const slideEnd = slideStart + slideRect.width; + if (slideStart < targetScrollPosition && slideEnd > targetScrollPosition) { + fullSldeTargetScrollPosition = slideStart; + partialSlideFound = true; + break; + } + } + if (!partialSlideFound) { + fullSldeTargetScrollPosition = Math.min(targetScrollPosition, slider.container.scrollWidth - slider.container.offsetWidth); + } + if (fullSldeTargetScrollPosition && fullSldeTargetScrollPosition > scrollLeft) { + targetScrollPosition = fullSldeTargetScrollPosition; + } + } + else { + let partialSlideFound = false; + for (let slide of slides) { + const slideRect = slide.getBoundingClientRect(); + const slideStart = slideRect.left - sliderRect.left + scrollLeft; + const slideEnd = slideStart + slideRect.width; + if (slideStart < scrollLeft && slideEnd > scrollLeft) { + fullSldeTargetScrollPosition = slideEnd - containerWidth; + partialSlideFound = true; + break; + } + } + if (!partialSlideFound) { + fullSldeTargetScrollPosition = Math.max(0, scrollLeft - containerWidth); + } + if (fullSldeTargetScrollPosition && fullSldeTargetScrollPosition < scrollLeft) { + targetScrollPosition = fullSldeTargetScrollPosition; + } + } + } + slider.container.style.scrollBehavior = slider.options.scrollBehavior; + slider.container.scrollLeft = targetScrollPosition; + setTimeout(() => slider.container.style.scrollBehavior = '', 50); + } + function on(name, cb) { + if (!subs[name]) { + subs[name] = []; + } + subs[name].push(cb); + } + function emit(name) { + var _a; + if (subs && subs[name]) { + subs[name].forEach(cb => { + cb(slider); + }); + } + const optionCallBack = (_a = slider === null || slider === void 0 ? void 0 : slider.options) === null || _a === void 0 ? void 0 : _a[name]; + if (typeof optionCallBack === 'function') { + optionCallBack(slider); + } + } + slider = { + emit, + moveToDirection, + on, + options, + }; + init(); + return slider; +} + +export { Slider as default }; diff --git a/docs/dist/core/slider.min.js b/docs/dist/core/slider.min.js new file mode 100644 index 0000000..4357cee --- /dev/null +++ b/docs/dist/core/slider.min.js @@ -0,0 +1 @@ +import t from"./details.min.js";import{generateId as e,objectsAreEqual as n}from"./utils.min.js";function i(i,o,r){let l,a={};function s(e=!1){const i=l.details,o=t(l);l.details=o,e||n(i,o)?e&&l.emit("detailsChanged"):l.emit("detailsChanged")}function c(){l.container.style.setProperty("--slider-container-width",`${l.details.containerWidth}px`),l.container.style.setProperty("--slider-scrollable-width",`${l.details.scrollableAreaWidth}px`),l.container.style.setProperty("--slider-slides-count",`${l.details.slideCount}`)}function d(){l.container.setAttribute("data-has-overflow",l.details.hasOverflow?"true":"false")}return l={emit:function(t){var e;a&&a[t]&&a[t].forEach((t=>{t(l)}));const n=null===(e=null==l?void 0:l.options)||void 0===e?void 0:e[t];"function"==typeof n&&n(l)},moveToDirection:function(t="prev"){const e=l.options.scrollStrategy,n=l.container.scrollLeft,i=l.container.getBoundingClientRect(),o=l.container.offsetWidth;let r=n;if("prev"===t?r=Math.max(0,n-l.container.offsetWidth):"next"===t&&(r=Math.min(l.container.scrollWidth,n+l.container.offsetWidth)),"fullSlide"===e){let e=null;const a=Array.from(l.container.querySelectorAll(":scope > *"));let s=0;if(a.length>1){const t=a[0].getBoundingClientRect();s=a[1].getBoundingClientRect().left-t.right}if(e="prev"===t?Math.max(0,r-s):Math.min(l.container.scrollWidth,r+s),"next"===t){let t=!1;for(let o of a){const l=o.getBoundingClientRect(),a=l.left-i.left+n,s=a+l.width;if(ar){e=a,t=!0;break}}t||(e=Math.min(r,l.container.scrollWidth-l.container.offsetWidth)),e&&e>n&&(r=e)}else{let t=!1;for(let r of a){const l=r.getBoundingClientRect(),a=l.left-i.left+n,s=a+l.width;if(an){e=s-o,t=!0;break}}t||(e=Math.max(0,n-o)),e&&el.container.style.scrollBehavior=""),50)},on:function(t,e){a[t]||(a[t]=[]),a[t].push(e)},options:o},function(){l.container=i;let t=i.getAttribute("id");null===t&&(t=e("overflow-slider"),i.setAttribute("id",t)),s(!0),l.on("contentsChanged",(()=>s())),l.on("containerSizeChanged",(()=>s()));let n=0;if(l.on("scroll",(()=>{n&&window.cancelAnimationFrame(n),n=window.requestAnimationFrame((()=>{s()}))})),function(){new MutationObserver((()=>l.emit("contentsChanged"))).observe(l.container,{childList:!0});new ResizeObserver((()=>l.emit("containerSizeChanged"))).observe(l.container),l.container.addEventListener("scroll",(()=>l.emit("scroll")));let t=!1;l.container.addEventListener("mousedown",(()=>{t=!0})),l.container.addEventListener("touchstart",(()=>{t=!0}),{passive:!0}),l.container.addEventListener("focusin",(e=>{if(!t){let t=e.target;for(;t.parentElement!==l.container&&t.parentElement;)t=t.parentElement;!function(t){const e=t.getBoundingClientRect(),n=l.container.getBoundingClientRect(),i=l.container.offsetWidth,o=l.container.scrollLeft,r=e.left-n.left+o,a=r+e.width;let s=null;ro+i&&(s=a-i);s&&(l.container.style.scrollSnapType="none",l.container.scrollLeft=s)}(t)}t=!1}))}(),d(),c(),r)for(const t of r)t(l);l.on("detailsChanged",(()=>{d(),c()})),l.emit("created")}(),l}export{i as default}; diff --git a/docs/dist/core/utils.esm.js b/docs/dist/core/utils.esm.js new file mode 100644 index 0000000..623a337 --- /dev/null +++ b/docs/dist/core/utils.esm.js @@ -0,0 +1,22 @@ +function generateId(prefix, i = 1) { + const id = `${prefix}-${i}`; + if (document.getElementById(id)) { + return generateId(prefix, i + 1); + } + return id; +} +function objectsAreEqual(obj1, obj2) { + const keys1 = Object.keys(obj1); + const keys2 = Object.keys(obj2); + if (keys1.length !== keys2.length) { + return false; + } + for (let key of keys1) { + if (obj2.hasOwnProperty(key) === false || obj1[key] !== obj2[key]) { + return false; + } + } + return true; +} + +export { generateId, objectsAreEqual }; diff --git a/docs/dist/core/utils.js b/docs/dist/core/utils.js new file mode 100644 index 0000000..623a337 --- /dev/null +++ b/docs/dist/core/utils.js @@ -0,0 +1,22 @@ +function generateId(prefix, i = 1) { + const id = `${prefix}-${i}`; + if (document.getElementById(id)) { + return generateId(prefix, i + 1); + } + return id; +} +function objectsAreEqual(obj1, obj2) { + const keys1 = Object.keys(obj1); + const keys2 = Object.keys(obj2); + if (keys1.length !== keys2.length) { + return false; + } + for (let key of keys1) { + if (obj2.hasOwnProperty(key) === false || obj1[key] !== obj2[key]) { + return false; + } + } + return true; +} + +export { generateId, objectsAreEqual }; diff --git a/docs/dist/core/utils.min.js b/docs/dist/core/utils.min.js new file mode 100644 index 0000000..3ce8f13 --- /dev/null +++ b/docs/dist/core/utils.min.js @@ -0,0 +1 @@ +function t(e,n=1){const r=`${e}-${n}`;return document.getElementById(r)?t(e,n+1):r}function e(t,e){const n=Object.keys(t),r=Object.keys(e);if(n.length!==r.length)return!1;for(let r of n)if(!1===e.hasOwnProperty(r)||t[r]!==e[r])return!1;return!0}export{t as generateId,e as objectsAreEqual}; diff --git a/docs/dist/dots.esm.js b/docs/dist/dots.esm.js new file mode 100644 index 0000000..75b1175 --- /dev/null +++ b/docs/dist/dots.esm.js @@ -0,0 +1,99 @@ +const DEFAULT_TEXTS = { + dotDescription: 'Page %d of %d', +}; +const DEFAULT_CLASS_NAMES = { + dotsContainer: 'overflow-slider__dots', + dotsItem: 'overflow-slider__dot-item', +}; +function DotsPlugin(args) { + return (slider) => { + var _a, _b; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const dots = document.createElement('div'); + dots.classList.add(options.classNames.dotsContainer); + let pageFocused = null; + const buildDots = () => { + dots.setAttribute('data-has-content', slider.details.hasOverflow.toString()); + dots.innerHTML = ''; + const dotsList = document.createElement('ul'); + const pages = slider.details.amountOfPages; + const currentPage = slider.details.currentPage; + if (pages <= 1) { + return; + } + for (let i = 0; i < pages; i++) { + const dotListItem = document.createElement('li'); + const dot = document.createElement('button'); + dot.setAttribute('type', 'button'); + dot.setAttribute('class', options.classNames.dotsItem); + dot.setAttribute('aria-label', options.texts.dotDescription.replace('%d', (i + 1).toString()).replace('%d', pages.toString())); + dot.setAttribute('aria-pressed', (i === currentPage).toString()); + dot.setAttribute('data-page', (i + 1).toString()); + dotListItem.appendChild(dot); + dotsList.appendChild(dotListItem); + dot.addEventListener('click', () => activateDot(i + 1)); + dot.addEventListener('focus', () => pageFocused = i + 1); + dot.addEventListener('keydown', (e) => { + var _a; + const currentPageItem = dots.querySelector(`[aria-pressed="true"]`); + if (!currentPageItem) { + return; + } + const currentPage = parseInt((_a = currentPageItem.getAttribute('data-page')) !== null && _a !== void 0 ? _a : '1'); + if (e.key === 'ArrowLeft') { + const previousPage = currentPage - 1; + if (previousPage > 0) { + const matchingDot = dots.querySelector(`[data-page="${previousPage}"]`); + if (matchingDot) { + matchingDot.focus(); + } + activateDot(previousPage); + } + } + if (e.key === 'ArrowRight') { + const nextPage = currentPage + 1; + if (nextPage <= pages) { + const matchingDot = dots.querySelector(`[data-page="${nextPage}"]`); + if (matchingDot) { + matchingDot.focus(); + } + activateDot(nextPage); + } + } + }); + } + dots.appendChild(dotsList); + // return focus to same page after rebuild + if (pageFocused) { + const matchingDot = dots.querySelector(`[data-page="${pageFocused}"]`); + if (matchingDot) { + matchingDot.focus(); + } + } + }; + const activateDot = (page) => { + const scrollTargetPosition = slider.details.containerWidth * (page - 1); + slider.container.style.scrollBehavior = slider.options.scrollBehavior; + slider.container.style.scrollSnapType = 'none'; + slider.container.scrollLeft = scrollTargetPosition; + slider.container.style.scrollBehavior = ''; + slider.container.style.scrollSnapType = ''; + }; + buildDots(); + if (options.container) { + options.container.appendChild(dots); + } + else { + (_b = slider.container.parentNode) === null || _b === void 0 ? void 0 : _b.insertBefore(dots, slider.container.nextSibling); + } + slider.on('detailsChanged', () => { + buildDots(); + }); + }; +} + +export { DotsPlugin as default }; diff --git a/docs/dist/dots.min.js b/docs/dist/dots.min.js new file mode 100644 index 0000000..e2d62e3 --- /dev/null +++ b/docs/dist/dots.min.js @@ -0,0 +1 @@ +const t={dotDescription:"Page %d of %d"},e={dotsContainer:"overflow-slider__dots",dotsItem:"overflow-slider__dot-item"};function n(n){return o=>{var a,s;const r={texts:Object.assign(Object.assign({},t),(null==n?void 0:n.texts)||[]),classNames:Object.assign(Object.assign({},e),(null==n?void 0:n.classNames)||[]),container:null!==(a=null==n?void 0:n.container)&&void 0!==a?a:null},i=document.createElement("div");i.classList.add(r.classNames.dotsContainer);let l=null;const c=()=>{i.setAttribute("data-has-content",o.details.hasOverflow.toString()),i.innerHTML="";const t=document.createElement("ul"),e=o.details.amountOfPages,n=o.details.currentPage;if(!(e<=1)){for(let o=0;od(o+1))),s.addEventListener("focus",(()=>l=o+1)),s.addEventListener("keydown",(t=>{var n;const o=i.querySelector('[aria-pressed="true"]');if(!o)return;const a=parseInt(null!==(n=o.getAttribute("data-page"))&&void 0!==n?n:"1");if("ArrowLeft"===t.key){const t=a-1;if(t>0){const e=i.querySelector(`[data-page="${t}"]`);e&&e.focus(),d(t)}}if("ArrowRight"===t.key){const t=a+1;if(t<=e){const e=i.querySelector(`[data-page="${t}"]`);e&&e.focus(),d(t)}}}))}if(i.appendChild(t),l){const t=i.querySelector(`[data-page="${l}"]`);t&&t.focus()}}},d=t=>{const e=o.details.containerWidth*(t-1);o.container.style.scrollBehavior=o.options.scrollBehavior,o.container.style.scrollSnapType="none",o.container.scrollLeft=e,o.container.style.scrollBehavior="",o.container.style.scrollSnapType=""};c(),r.container?r.container.appendChild(i):null===(s=o.container.parentNode)||void 0===s||s.insertBefore(i,o.container.nextSibling),o.on("detailsChanged",(()=>{c()}))}}export{n as default}; diff --git a/docs/dist/drag-scrolling.esm.js b/docs/dist/drag-scrolling.esm.js new file mode 100644 index 0000000..ed7117b --- /dev/null +++ b/docs/dist/drag-scrolling.esm.js @@ -0,0 +1,72 @@ +const DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK = 20; +function DragScrollingPlugin(args) { + var _a; + const options = { + draggedDistanceThatPreventsClick: (_a = args === null || args === void 0 ? void 0 : args.draggedDistanceThatPreventsClick) !== null && _a !== void 0 ? _a : DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK, + }; + return (slider) => { + let isMouseDown = false; + let startX = 0; + let scrollLeft = 0; + // add data attribute to container + slider.container.setAttribute('data-has-drag-scrolling', 'true'); + slider.container.addEventListener('mousedown', (e) => { + if (!slider.details.hasOverflow) { + return; + } + isMouseDown = true; + startX = e.pageX - slider.container.offsetLeft; + scrollLeft = slider.container.scrollLeft; + // change cursor to grabbing + slider.container.style.cursor = 'grabbing'; + slider.container.style.scrollSnapType = 'none'; + slider.container.style.scrollBehavior = 'auto'; + // prevent pointer events on the slides + // const slides = slider.container.querySelectorAll( ':scope > *' ); + // slides.forEach((slide) => { + // (slide).style.pointerEvents = 'none'; + // }); + // prevent focus going to the slides + // e.preventDefault(); + // e.stopPropagation(); + }); + window.addEventListener('mouseup', () => { + if (!slider.details.hasOverflow) { + return; + } + isMouseDown = false; + slider.container.style.cursor = ''; + // slider.container.style.scrollBehavior = slider.options.scrollBehavior; + setTimeout(() => { + slider.container.style.scrollSnapType = ''; + slider.container.style.scrollBehavior = ''; + const slides = slider.container.querySelectorAll(':scope > *'); + slides.forEach((slide) => { + slide.style.pointerEvents = ''; + }); + }, 50); + }); + window.addEventListener('mousemove', (e) => { + if (!slider.details.hasOverflow) { + return; + } + if (!isMouseDown) { + return; + } + e.preventDefault(); + const x = e.pageX - slider.container.offsetLeft; + const walk = (x - startX); + slider.container.scrollLeft = scrollLeft - walk; + // if walk is more than 30px, don't allow click event + // e.preventDefault(); + const absWalk = Math.abs(walk); + const slides = slider.container.querySelectorAll(':scope > *'); + const pointerEvents = absWalk > options.draggedDistanceThatPreventsClick ? 'none' : ''; + slides.forEach((slide) => { + slide.style.pointerEvents = pointerEvents; + }); + }); + }; +} + +export { DragScrollingPlugin as default }; diff --git a/docs/dist/drag-scrolling.min.js b/docs/dist/drag-scrolling.min.js new file mode 100644 index 0000000..2f3fd1d --- /dev/null +++ b/docs/dist/drag-scrolling.min.js @@ -0,0 +1 @@ +function e(e){var t;const n=null!==(t=null==e?void 0:e.draggedDistanceThatPreventsClick)&&void 0!==t?t:20;return e=>{let t=!1,o=0,r=0;e.container.setAttribute("data-has-drag-scrolling","true"),e.container.addEventListener("mousedown",(n=>{e.details.hasOverflow&&(t=!0,o=n.pageX-e.container.offsetLeft,r=e.container.scrollLeft,e.container.style.cursor="grabbing",e.container.style.scrollSnapType="none",e.container.style.scrollBehavior="auto")})),window.addEventListener("mouseup",(()=>{e.details.hasOverflow&&(t=!1,e.container.style.cursor="",setTimeout((()=>{e.container.style.scrollSnapType="",e.container.style.scrollBehavior="";e.container.querySelectorAll(":scope > *").forEach((e=>{e.style.pointerEvents=""}))}),50))})),window.addEventListener("mousemove",(a=>{if(!e.details.hasOverflow)return;if(!t)return;a.preventDefault();const s=a.pageX-e.container.offsetLeft-o;e.container.scrollLeft=r-s;const l=Math.abs(s),i=e.container.querySelectorAll(":scope > *"),c=l>n?"none":"";i.forEach((e=>{e.style.pointerEvents=c}))}))}}export{e as default}; diff --git a/docs/dist/index.esm.js b/docs/dist/index.esm.js new file mode 100644 index 0000000..2f1c75b --- /dev/null +++ b/docs/dist/index.esm.js @@ -0,0 +1 @@ +export { default as OverflowSlider } from './overflow-slider.esm.js'; diff --git a/docs/dist/index.esm.min.js b/docs/dist/index.esm.min.js new file mode 100644 index 0000000..435646d --- /dev/null +++ b/docs/dist/index.esm.min.js @@ -0,0 +1,2 @@ +/*! @evermade/overflow-slider 1.1.0 */ +function t(e,n=1){const o=`${e}-${n}`;return document.getElementById(o)?t(e,n+1):o}function e(e,n,o){let r,i={};function s(t=!1){const e=r.details,n=function(t){let e,n=!1,o=0,r=0,i=0,s=0,a=1;return t.container.scrollWidth>t.container.clientWidth&&(n=!0),o=Array.from(t.container.querySelectorAll(":scope > *")).length,r=t.container.offsetWidth,i=t.container.scrollWidth,s=Math.ceil(i/r),t.container.scrollLeft>=0&&(a=Math.floor(t.container.scrollLeft/r),t.container.scrollLeft+r===i&&(a=s-1)),e={hasOverflow:n,slideCount:o,containerWidth:r,scrollableAreaWidth:i,amountOfPages:s,currentPage:a},e}(r);r.details=n,t||function(t,e){const n=Object.keys(t),o=Object.keys(e);if(n.length!==o.length)return!1;for(let o of n)if(!1===e.hasOwnProperty(o)||t[o]!==e[o])return!1;return!0}(e,n)?t&&r.emit("detailsChanged"):r.emit("detailsChanged")}function a(){r.container.style.setProperty("--slider-container-width",`${r.details.containerWidth}px`),r.container.style.setProperty("--slider-scrollable-width",`${r.details.scrollableAreaWidth}px`),r.container.style.setProperty("--slider-slides-count",`${r.details.slideCount}`)}function l(){r.container.setAttribute("data-has-overflow",r.details.hasOverflow?"true":"false")}return r={emit:function(t){var e;i&&i[t]&&i[t].forEach((t=>{t(r)}));const n=null===(e=null==r?void 0:r.options)||void 0===e?void 0:e[t];"function"==typeof n&&n(r)},moveToDirection:function(t="prev"){const e=r.options.scrollStrategy,n=r.container.scrollLeft,o=r.container.getBoundingClientRect(),i=r.container.offsetWidth;let s=n;if("prev"===t?s=Math.max(0,n-r.container.offsetWidth):"next"===t&&(s=Math.min(r.container.scrollWidth,n+r.container.offsetWidth)),"fullSlide"===e){let e=null;const a=Array.from(r.container.querySelectorAll(":scope > *"));let l=0;if(a.length>1){const t=a[0].getBoundingClientRect();l=a[1].getBoundingClientRect().left-t.right}if(e="prev"===t?Math.max(0,s-l):Math.min(r.container.scrollWidth,s+l),"next"===t){let t=!1;for(let r of a){const i=r.getBoundingClientRect(),a=i.left-o.left+n,l=a+i.width;if(as){e=a,t=!0;break}}t||(e=Math.min(s,r.container.scrollWidth-r.container.offsetWidth)),e&&e>n&&(s=e)}else{let t=!1;for(let r of a){const s=r.getBoundingClientRect(),a=s.left-o.left+n,l=a+s.width;if(an){e=l-i,t=!0;break}}t||(e=Math.max(0,n-i)),e&&er.container.style.scrollBehavior=""),50)},on:function(t,e){i[t]||(i[t]=[]),i[t].push(e)},options:n},function(){r.container=e;let n=e.getAttribute("id");null===n&&(n=t("overflow-slider"),e.setAttribute("id",n)),s(!0),r.on("contentsChanged",(()=>s())),r.on("containerSizeChanged",(()=>s()));let i=0;if(r.on("scroll",(()=>{i&&window.cancelAnimationFrame(i),i=window.requestAnimationFrame((()=>{s()}))})),function(){new MutationObserver((()=>r.emit("contentsChanged"))).observe(r.container,{childList:!0});new ResizeObserver((()=>r.emit("containerSizeChanged"))).observe(r.container),r.container.addEventListener("scroll",(()=>r.emit("scroll")));let t=!1;r.container.addEventListener("mousedown",(()=>{t=!0})),r.container.addEventListener("touchstart",(()=>{t=!0}),{passive:!0}),r.container.addEventListener("focusin",(e=>{if(!t){let t=e.target;for(;t.parentElement!==r.container&&t.parentElement;)t=t.parentElement;!function(t){const e=t.getBoundingClientRect(),n=r.container.getBoundingClientRect(),o=r.container.offsetWidth,i=r.container.scrollLeft,s=e.left-n.left+i,a=s+e.width;let l=null;si+o&&(l=a-o);l&&(r.container.style.scrollSnapType="none",r.container.scrollLeft=l)}(t)}t=!1}))}(),l(),a(),o)for(const t of o)t(r);r.on("detailsChanged",(()=>{l(),a()})),r.emit("created")}(),r}function n(t,n,o){try{if(!(t instanceof Element))throw new Error("Container must be HTML element, found "+typeof t);const r={scrollBehavior:"smooth",scrollStrategy:"fullSlide"},i=Object.assign(Object.assign({},r),n);return window.matchMedia("(prefers-reduced-motion: reduce)").matches&&(i.scrollBehavior="auto"),e(t,i,o)}catch(t){console.error(t)}}const o={skipList:"Skip list"},r={skipLink:"screen-reader-text",skipLinkTarget:"overflow-slider__skip-link-target"};function i(e){return n=>{var i,s,a,l,c,d;const u={texts:Object.assign(Object.assign({},o),(null==e?void 0:e.texts)||[]),classNames:Object.assign(Object.assign({},r),(null==e?void 0:e.classNames)||[]),containerBefore:null!==(i=null==e?void 0:e.containerAfter)&&void 0!==i?i:null,containerAfter:null!==(s=null==e?void 0:e.containerAfter)&&void 0!==s?s:null},f=t("overflow-slider-skip"),v=document.createElement("a");v.setAttribute("href",`#${f}`),v.textContent=u.texts.skipList,v.classList.add(u.classNames.skipLink);const h=document.createElement("div");h.setAttribute("id",f),h.setAttribute("tabindex","-1"),u.containerBefore?null===(a=u.containerBefore.parentNode)||void 0===a||a.insertBefore(v,u.containerBefore):null===(l=n.container.parentNode)||void 0===l||l.insertBefore(v,n.container),u.containerAfter?null===(c=u.containerAfter.parentNode)||void 0===c||c.insertBefore(h,u.containerAfter.nextSibling):null===(d=n.container.parentNode)||void 0===d||d.insertBefore(h,n.container.nextSibling)}}const s={buttonPrevious:"Previous items",buttonNext:"Next items"},a={prev:'',next:''},l={navContainer:"overflow-slider__arrows",prevButton:"overflow-slider__arrows-button overflow-slider__arrows-button--prev",nextButton:"overflow-slider__arrows-button overflow-slider__arrows-button--next"};function c(t){return e=>{var n,o,r,i;const c={texts:Object.assign(Object.assign({},s),(null==t?void 0:t.texts)||[]),icons:Object.assign(Object.assign({},a),(null==t?void 0:t.icons)||[]),classNames:Object.assign(Object.assign({},l),(null==t?void 0:t.classNames)||[]),container:null!==(n=null==t?void 0:t.container)&&void 0!==n?n:null},d=document.createElement("div");d.classList.add(c.classNames.navContainer);const u=document.createElement("button");u.setAttribute("class",c.classNames.prevButton),u.setAttribute("type","button"),u.setAttribute("aria-label",c.texts.buttonPrevious),u.setAttribute("aria-controls",null!==(o=e.container.getAttribute("id"))&&void 0!==o?o:""),u.setAttribute("data-type","prev"),u.innerHTML=c.icons.prev,u.addEventListener("click",(()=>e.moveToDirection("prev")));const f=document.createElement("button");f.setAttribute("class",c.classNames.nextButton),f.setAttribute("type","button"),f.setAttribute("aria-label",c.texts.buttonNext),f.setAttribute("aria-controls",null!==(r=e.container.getAttribute("id"))&&void 0!==r?r:""),f.setAttribute("data-type","next"),f.innerHTML=c.icons.next,f.addEventListener("click",(()=>e.moveToDirection("next"))),d.appendChild(u),d.appendChild(f);const v=()=>{const t=e.container.scrollLeft,n=e.container.scrollWidth,o=e.container.clientWidth;0===t?u.setAttribute("data-has-content","false"):u.setAttribute("data-has-content","true"),t+o>=n?f.setAttribute("data-has-content","false"):f.setAttribute("data-has-content","true")};c.container?c.container.appendChild(d):null===(i=e.container.parentNode)||void 0===i||i.insertBefore(d,e.container.nextSibling),v(),e.on("scroll",v),e.on("contentsChanged",v),e.on("containerSizeChanged",v)}}const d={scrollIndicator:"overflow-slider__scroll-indicator",scrollIndicatorBar:"overflow-slider__scroll-indicator-bar",scrollIndicatorButton:"overflow-slider__scroll-indicator-button"};function u(t){return e=>{var n,o,r;const i={classNames:Object.assign(Object.assign({},d),(null==t?void 0:t.classNames)||[]),container:null!==(n=null==t?void 0:t.container)&&void 0!==n?n:null},s=document.createElement("div");s.setAttribute("class",i.classNames.scrollIndicator),s.setAttribute("tabindex","0"),s.setAttribute("role","scrollbar"),s.setAttribute("aria-controls",null!==(o=e.container.getAttribute("id"))&&void 0!==o?o:""),s.setAttribute("aria-orientation","horizontal"),s.setAttribute("aria-valuemax","100"),s.setAttribute("aria-valuemin","0"),s.setAttribute("aria-valuenow","0");const a=document.createElement("div");a.setAttribute("class",i.classNames.scrollIndicatorBar);const l=document.createElement("div");l.setAttribute("class",i.classNames.scrollIndicatorButton),l.setAttribute("data-is-grabbed","false"),a.appendChild(l),s.appendChild(a);const c=()=>{s.setAttribute("data-has-overflow",e.details.hasOverflow.toString())};c();const u=()=>{const t=e.container.offsetWidth/e.container.scrollWidth;return e.container.scrollLeft*t};let f=0;const v=()=>{f&&window.cancelAnimationFrame(f),f=window.requestAnimationFrame((()=>{const t=e.container.offsetWidth/e.container.scrollWidth*100,n=u();l.style.width=`${t}%`,l.style.transform=`translateX(${n}px)`;const o=e.container.scrollLeft/(e.container.scrollWidth-e.container.offsetWidth)*100;s.setAttribute("aria-valuenow",Math.round(Number.isNaN(o)?0:o).toString())}))};i.container?i.container.appendChild(s):null===(r=e.container.parentNode)||void 0===r||r.insertBefore(s,e.container.nextSibling),v(),e.on("scroll",v),e.on("contentsChanged",v),e.on("containerSizeChanged",v),e.on("detailsChanged",c),s.addEventListener("keydown",(t=>{"ArrowLeft"===t.key?e.moveToDirection("prev"):"ArrowRight"===t.key&&e.moveToDirection("next")})),s.addEventListener("click",(t=>{const n=l.offsetWidth,o=u(),r=o+n,i=t.pageX-s.offsetLeft;ir&&e.moveToDirection("next")}));let h=!1,p=0,b=0;const g=t=>{h=!0;const n=t.pageX||t.touches[0].pageX;p=n-s.offsetLeft,b=e.container.scrollLeft,l.style.cursor="grabbing",e.container.style.scrollSnapType="none",l.setAttribute("data-is-grabbed","true"),t.preventDefault(),t.stopPropagation()},m=t=>{if(!h)return;t.preventDefault();const n=(t.pageX||t.touches[0].pageX)-s.offsetLeft,o=e.container.scrollWidth/s.offsetWidth,r=(n-p)*o;e.container.scrollLeft=b+r},w=()=>{h=!1,l.style.cursor="",e.container.style.scrollSnapType="",l.setAttribute("data-is-grabbed","false")};l.addEventListener("mousedown",g),l.addEventListener("touchstart",g),window.addEventListener("mousemove",m),window.addEventListener("touchmove",m,{passive:!1}),window.addEventListener("mouseup",w),window.addEventListener("touchend",w)}}function f(t){var e;const n=null!==(e=null==t?void 0:t.draggedDistanceThatPreventsClick)&&void 0!==e?e:20;return t=>{let e=!1,o=0,r=0;t.container.setAttribute("data-has-drag-scrolling","true"),t.container.addEventListener("mousedown",(n=>{t.details.hasOverflow&&(e=!0,o=n.pageX-t.container.offsetLeft,r=t.container.scrollLeft,t.container.style.cursor="grabbing",t.container.style.scrollSnapType="none",t.container.style.scrollBehavior="auto")})),window.addEventListener("mouseup",(()=>{t.details.hasOverflow&&(e=!1,t.container.style.cursor="",setTimeout((()=>{t.container.style.scrollSnapType="",t.container.style.scrollBehavior="";t.container.querySelectorAll(":scope > *").forEach((t=>{t.style.pointerEvents=""}))}),50))})),window.addEventListener("mousemove",(i=>{if(!t.details.hasOverflow)return;if(!e)return;i.preventDefault();const s=i.pageX-t.container.offsetLeft-o;t.container.scrollLeft=r-s;const a=Math.abs(s),l=t.container.querySelectorAll(":scope > *"),c=a>n?"none":"";l.forEach((t=>{t.style.pointerEvents=c}))}))}}const v={dotDescription:"Page %d of %d"},h={dotsContainer:"overflow-slider__dots",dotsItem:"overflow-slider__dot-item"};function p(t){return e=>{var n,o;const r={texts:Object.assign(Object.assign({},v),(null==t?void 0:t.texts)||[]),classNames:Object.assign(Object.assign({},h),(null==t?void 0:t.classNames)||[]),container:null!==(n=null==t?void 0:t.container)&&void 0!==n?n:null},i=document.createElement("div");i.classList.add(r.classNames.dotsContainer);let s=null;const a=()=>{i.setAttribute("data-has-content",e.details.hasOverflow.toString()),i.innerHTML="";const t=document.createElement("ul"),n=e.details.amountOfPages,o=e.details.currentPage;if(!(n<=1)){for(let e=0;el(e+1))),c.addEventListener("focus",(()=>s=e+1)),c.addEventListener("keydown",(t=>{var e;const o=i.querySelector('[aria-pressed="true"]');if(!o)return;const r=parseInt(null!==(e=o.getAttribute("data-page"))&&void 0!==e?e:"1");if("ArrowLeft"===t.key){const t=r-1;if(t>0){const e=i.querySelector(`[data-page="${t}"]`);e&&e.focus(),l(t)}}if("ArrowRight"===t.key){const t=r+1;if(t<=n){const e=i.querySelector(`[data-page="${t}"]`);e&&e.focus(),l(t)}}}))}if(i.appendChild(t),s){const t=i.querySelector(`[data-page="${s}"]`);t&&t.focus()}}},l=t=>{const n=e.details.containerWidth*(t-1);e.container.style.scrollBehavior=e.options.scrollBehavior,e.container.style.scrollSnapType="none",e.container.scrollLeft=n,e.container.style.scrollBehavior="",e.container.style.scrollSnapType=""};a(),r.container?r.container.appendChild(i):null===(o=e.container.parentNode)||void 0===o||o.insertBefore(i,e.container.nextSibling),e.on("detailsChanged",(()=>{a()}))}}export{c as ArrowsPlugin,p as DotsPlugin,f as DragScrollingPlugin,n as OverflowSlider,u as ScrollIndicatorPlugin,i as SkipLinksPlugin}; diff --git a/docs/dist/index.js b/docs/dist/index.js new file mode 100644 index 0000000..dc8dd86 --- /dev/null +++ b/docs/dist/index.js @@ -0,0 +1,6 @@ +export { default as OverflowSlider } from './overflow-slider.js'; +export { default as SkipLinksPlugin } from './plugins/plugins/skip-links.js'; +export { default as ArrowsPlugin } from './plugins/plugins/arrows.js'; +export { default as ScrollIndicatorPlugin } from './plugins/plugins/scroll-indicator.js'; +export { default as DragScrollingPlugin } from './plugins/plugins/drag-scrolling.js'; +export { default as DotsPlugin } from './plugins/plugins/dots.js'; diff --git a/docs/dist/index.min.js b/docs/dist/index.min.js new file mode 100644 index 0000000..9b0a681 --- /dev/null +++ b/docs/dist/index.min.js @@ -0,0 +1 @@ +export{default as OverflowSlider}from"./overflow-slider.min.js"; diff --git a/docs/dist/overflow-slider.esm.js b/docs/dist/overflow-slider.esm.js index 99041b4..c87fe45 100644 --- a/docs/dist/overflow-slider.esm.js +++ b/docs/dist/overflow-slider.esm.js @@ -1,270 +1,4 @@ -function details(slider) { - let instance; - let hasOverflow = false; - let slideCount = 0; - let containerWidth = 0; - let scrollableAreaWidth = 0; - let amountOfPages = 0; - let currentPage = 1; - if (slider.container.scrollWidth > slider.container.clientWidth) { - hasOverflow = true; - } - slideCount = Array.from(slider.container.querySelectorAll(':scope > *')).length; - containerWidth = slider.container.offsetWidth; - scrollableAreaWidth = slider.container.scrollWidth; - amountOfPages = Math.ceil(scrollableAreaWidth / containerWidth); - if (slider.container.scrollLeft >= 0) { - currentPage = Math.floor(slider.container.scrollLeft / containerWidth); - // consider as last page if the scrollLeft + containerWidth is equal to scrollWidth - if (slider.container.scrollLeft + containerWidth === scrollableAreaWidth) { - currentPage = amountOfPages - 1; - } - } - instance = { - hasOverflow, - slideCount, - containerWidth, - scrollableAreaWidth, - amountOfPages, - currentPage, - }; - return instance; -} - -function generateId(prefix, i = 1) { - const id = `${prefix}-${i}`; - if (document.getElementById(id)) { - return generateId(prefix, i + 1); - } - return id; -} -function objectsAreEqual(obj1, obj2) { - const keys1 = Object.keys(obj1); - const keys2 = Object.keys(obj2); - if (keys1.length !== keys2.length) { - return false; - } - for (let key of keys1) { - if (obj2.hasOwnProperty(key) === false || obj1[key] !== obj2[key]) { - return false; - } - } - return true; -} - -function Slider(container, options, plugins) { - let slider; - let subs = {}; - function init() { - slider.container = container; - // ensure container has id - let containerId = container.getAttribute('id'); - if (containerId === null) { - containerId = generateId('overflow-slider'); - container.setAttribute('id', containerId); - } - setDetails(true); - slider.on('contentsChanged', () => setDetails()); - slider.on('containerSizeChanged', () => setDetails()); - let requestId = 0; - const setDetailsDebounce = () => { - if (requestId) { - window.cancelAnimationFrame(requestId); - } - requestId = window.requestAnimationFrame(() => { - setDetails(); - }); - }; - slider.on('scroll', setDetailsDebounce); - addEventListeners(); - setDataAttributes(); - setCSSVariables(); - if (plugins) { - for (const plugin of plugins) { - plugin(slider); - } - } - slider.on('detailsChanged', () => { - setDataAttributes(); - setCSSVariables(); - }); - slider.emit('created'); - } - function setDetails(isInit = false) { - const oldDetails = slider.details; - const newDetails = details(slider); - slider.details = newDetails; - if (!isInit && !objectsAreEqual(oldDetails, newDetails)) { - slider.emit('detailsChanged'); - } - else if (isInit) { - slider.emit('detailsChanged'); - } - } - function addEventListeners() { - // changes to DOM - const observer = new MutationObserver(() => slider.emit('contentsChanged')); - observer.observe(slider.container, { childList: true }); - // container size changes - const resizeObserver = new ResizeObserver(() => slider.emit('containerSizeChanged')); - resizeObserver.observe(slider.container); - // scroll event with debouncing - slider.container.addEventListener('scroll', () => slider.emit('scroll')); - // Listen for mouse down and touch start events on the document - // This handles both mouse clicks and touch interactions - let wasInteractedWith = false; - slider.container.addEventListener('mousedown', () => { - wasInteractedWith = true; - }); - slider.container.addEventListener('touchstart', () => { - wasInteractedWith = true; - }, { passive: true }); - slider.container.addEventListener('focusin', (e) => { - // move target parents as long as they are not the container - // but only if focus didn't start from mouse or touch - if (!wasInteractedWith) { - let target = e.target; - while (target.parentElement !== slider.container) { - if (target.parentElement) { - target = target.parentElement; - } - else { - break; - } - } - ensureSlideIsInView(target); - } - wasInteractedWith = false; - }); - } - function setCSSVariables() { - slider.container.style.setProperty('--slider-container-width', `${slider.details.containerWidth}px`); - slider.container.style.setProperty('--slider-scrollable-width', `${slider.details.scrollableAreaWidth}px`); - slider.container.style.setProperty('--slider-slides-count', `${slider.details.slideCount}`); - } - function setDataAttributes() { - slider.container.setAttribute('data-has-overflow', slider.details.hasOverflow ? 'true' : 'false'); - } - function ensureSlideIsInView(slide) { - const slideRect = slide.getBoundingClientRect(); - const sliderRect = slider.container.getBoundingClientRect(); - const containerWidth = slider.container.offsetWidth; - const scrollLeft = slider.container.scrollLeft; - const slideStart = slideRect.left - sliderRect.left + scrollLeft; - const slideEnd = slideStart + slideRect.width; - let scrollTarget = null; - if (slideStart < scrollLeft) { - scrollTarget = slideStart; - } - else if (slideEnd > scrollLeft + containerWidth) { - scrollTarget = slideEnd - containerWidth; - } - if (scrollTarget) { - slider.container.style.scrollSnapType = 'none'; - slider.container.scrollLeft = scrollTarget; - // @todo resume scroll snapping but at least proximity gives a lot of trouble - // and it's not really needed for this use case but it would be nice to have - // it back in case it's needed. We need to calculate scrollLeft some other way - } - } - function moveToDirection(direction = "prev") { - const scrollStrategy = slider.options.scrollStrategy; - const scrollLeft = slider.container.scrollLeft; - const sliderRect = slider.container.getBoundingClientRect(); - const containerWidth = slider.container.offsetWidth; - let targetScrollPosition = scrollLeft; - if (direction === 'prev') { - targetScrollPosition = Math.max(0, scrollLeft - slider.container.offsetWidth); - } - else if (direction === 'next') { - targetScrollPosition = Math.min(slider.container.scrollWidth, scrollLeft + slider.container.offsetWidth); - } - if (scrollStrategy === 'fullSlide') { - let fullSldeTargetScrollPosition = null; - const slides = Array.from(slider.container.querySelectorAll(':scope > *')); - let gapSize = 0; - if (slides.length > 1) { - const firstSlideRect = slides[0].getBoundingClientRect(); - const secondSlideRect = slides[1].getBoundingClientRect(); - gapSize = secondSlideRect.left - firstSlideRect.right; - } - // extend targetScrollPosition to include gap - if (direction === 'prev') { - fullSldeTargetScrollPosition = Math.max(0, targetScrollPosition - gapSize); - } - else { - fullSldeTargetScrollPosition = Math.min(slider.container.scrollWidth, targetScrollPosition + gapSize); - } - if (direction === 'next') { - let partialSlideFound = false; - for (let slide of slides) { - const slideRect = slide.getBoundingClientRect(); - const slideStart = slideRect.left - sliderRect.left + scrollLeft; - const slideEnd = slideStart + slideRect.width; - if (slideStart < targetScrollPosition && slideEnd > targetScrollPosition) { - fullSldeTargetScrollPosition = slideStart; - partialSlideFound = true; - break; - } - } - if (!partialSlideFound) { - fullSldeTargetScrollPosition = Math.min(targetScrollPosition, slider.container.scrollWidth - slider.container.offsetWidth); - } - if (fullSldeTargetScrollPosition && fullSldeTargetScrollPosition > scrollLeft) { - targetScrollPosition = fullSldeTargetScrollPosition; - } - } - else { - let partialSlideFound = false; - for (let slide of slides) { - const slideRect = slide.getBoundingClientRect(); - const slideStart = slideRect.left - sliderRect.left + scrollLeft; - const slideEnd = slideStart + slideRect.width; - if (slideStart < scrollLeft && slideEnd > scrollLeft) { - fullSldeTargetScrollPosition = slideEnd - containerWidth; - partialSlideFound = true; - break; - } - } - if (!partialSlideFound) { - fullSldeTargetScrollPosition = Math.max(0, scrollLeft - containerWidth); - } - if (fullSldeTargetScrollPosition && fullSldeTargetScrollPosition < scrollLeft) { - targetScrollPosition = fullSldeTargetScrollPosition; - } - } - } - slider.container.style.scrollBehavior = slider.options.scrollBehavior; - slider.container.scrollLeft = targetScrollPosition; - setTimeout(() => slider.container.style.scrollBehavior = '', 50); - } - function on(name, cb) { - if (!subs[name]) { - subs[name] = []; - } - subs[name].push(cb); - } - function emit(name) { - var _a; - if (subs && subs[name]) { - subs[name].forEach(cb => { - cb(slider); - }); - } - const optionCallBack = (_a = slider === null || slider === void 0 ? void 0 : slider.options) === null || _a === void 0 ? void 0 : _a[name]; - if (typeof optionCallBack === 'function') { - optionCallBack(slider); - } - } - slider = { - emit, - moveToDirection, - on, - options, - }; - init(); - return slider; -} +import Slider from './core/slider.esm.js'; function OverflowSlider(container, options, plugins) { try { @@ -288,417 +22,4 @@ function OverflowSlider(container, options, plugins) { } } -const DEFAULT_TEXTS$2 = { - skipList: 'Skip list' -}; -const DEFAULT_CLASS_NAMES$3 = { - skipLink: 'screen-reader-text', - skipLinkTarget: 'overflow-slider__skip-link-target', -}; -function SkipLinksPlugin(args) { - return (slider) => { - var _a, _b, _c, _d, _e, _f; - const options = { - texts: Object.assign(Object.assign({}, DEFAULT_TEXTS$2), (args === null || args === void 0 ? void 0 : args.texts) || []), - classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES$3), (args === null || args === void 0 ? void 0 : args.classNames) || []), - containerBefore: (_a = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _a !== void 0 ? _a : null, - containerAfter: (_b = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _b !== void 0 ? _b : null, - }; - const skipId = generateId('overflow-slider-skip'); - const skipLinkEl = document.createElement('a'); - skipLinkEl.setAttribute('href', `#${skipId}`); - skipLinkEl.textContent = options.texts.skipList; - skipLinkEl.classList.add(options.classNames.skipLink); - const skipTargetEl = document.createElement('div'); - skipTargetEl.setAttribute('id', skipId); - skipTargetEl.setAttribute('tabindex', '-1'); - if (options.containerBefore) { - (_c = options.containerBefore.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(skipLinkEl, options.containerBefore); - } - else { - (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(skipLinkEl, slider.container); - } - if (options.containerAfter) { - (_e = options.containerAfter.parentNode) === null || _e === void 0 ? void 0 : _e.insertBefore(skipTargetEl, options.containerAfter.nextSibling); - } - else { - (_f = slider.container.parentNode) === null || _f === void 0 ? void 0 : _f.insertBefore(skipTargetEl, slider.container.nextSibling); - } - }; -} - -const DEFAULT_TEXTS$1 = { - buttonPrevious: 'Previous items', - buttonNext: 'Next items', -}; -const DEFAULT_ICONS = { - prev: '', - next: '', -}; -const DEFAULT_CLASS_NAMES$2 = { - navContainer: 'overflow-slider__arrows', - prevButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--prev', - nextButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--next', -}; -function ArrowsPlugin(args) { - return (slider) => { - var _a, _b, _c, _d; - const options = { - texts: Object.assign(Object.assign({}, DEFAULT_TEXTS$1), (args === null || args === void 0 ? void 0 : args.texts) || []), - icons: Object.assign(Object.assign({}, DEFAULT_ICONS), (args === null || args === void 0 ? void 0 : args.icons) || []), - classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES$2), (args === null || args === void 0 ? void 0 : args.classNames) || []), - container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, - }; - const nav = document.createElement('div'); - nav.classList.add(options.classNames.navContainer); - const prev = document.createElement('button'); - prev.setAttribute('class', options.classNames.prevButton); - prev.setAttribute('type', 'button'); - prev.setAttribute('aria-label', options.texts.buttonPrevious); - prev.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); - prev.setAttribute('data-type', 'prev'); - prev.innerHTML = options.icons.prev; - prev.addEventListener('click', () => slider.moveToDirection('prev')); - const next = document.createElement('button'); - next.setAttribute('class', options.classNames.nextButton); - next.setAttribute('type', 'button'); - next.setAttribute('aria-label', options.texts.buttonNext); - next.setAttribute('aria-controls', (_c = slider.container.getAttribute('id')) !== null && _c !== void 0 ? _c : ''); - next.setAttribute('data-type', 'next'); - next.innerHTML = options.icons.next; - next.addEventListener('click', () => slider.moveToDirection('next')); - // insert buttons to the nav - nav.appendChild(prev); - nav.appendChild(next); - const update = () => { - const scrollLeft = slider.container.scrollLeft; - const scrollWidth = slider.container.scrollWidth; - const clientWidth = slider.container.clientWidth; - if (scrollLeft === 0) { - prev.setAttribute('data-has-content', 'false'); - } - else { - prev.setAttribute('data-has-content', 'true'); - } - if (scrollLeft + clientWidth >= scrollWidth) { - next.setAttribute('data-has-content', 'false'); - } - else { - next.setAttribute('data-has-content', 'true'); - } - }; - if (options.container) { - options.container.appendChild(nav); - } - else { - (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(nav, slider.container.nextSibling); - } - update(); - slider.on('scroll', update); - slider.on('contentsChanged', update); - slider.on('containerSizeChanged', update); - }; -} - -const DEFAULT_CLASS_NAMES$1 = { - scrollIndicator: 'overflow-slider__scroll-indicator', - scrollIndicatorBar: 'overflow-slider__scroll-indicator-bar', - scrollIndicatorButton: 'overflow-slider__scroll-indicator-button', -}; -function ScrollIndicatorPlugin(args) { - return (slider) => { - var _a, _b, _c; - const options = { - classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES$1), (args === null || args === void 0 ? void 0 : args.classNames) || []), - container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, - }; - const scrollbarContainer = document.createElement('div'); - scrollbarContainer.setAttribute('class', options.classNames.scrollIndicator); - scrollbarContainer.setAttribute('tabindex', '0'); - scrollbarContainer.setAttribute('role', 'scrollbar'); - scrollbarContainer.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); - scrollbarContainer.setAttribute('aria-orientation', 'horizontal'); - scrollbarContainer.setAttribute('aria-valuemax', '100'); - scrollbarContainer.setAttribute('aria-valuemin', '0'); - scrollbarContainer.setAttribute('aria-valuenow', '0'); - const scrollbar = document.createElement('div'); - scrollbar.setAttribute('class', options.classNames.scrollIndicatorBar); - const scrollbarButton = document.createElement('div'); - scrollbarButton.setAttribute('class', options.classNames.scrollIndicatorButton); - scrollbarButton.setAttribute('data-is-grabbed', 'false'); - scrollbar.appendChild(scrollbarButton); - scrollbarContainer.appendChild(scrollbar); - const setDataAttributes = () => { - scrollbarContainer.setAttribute('data-has-overflow', slider.details.hasOverflow.toString()); - }; - setDataAttributes(); - const getScrollbarButtonLeftOffset = () => { - const scrollbarRatio = slider.container.offsetWidth / slider.container.scrollWidth; - return slider.container.scrollLeft * scrollbarRatio; - }; - // scrollbarbutton width and position is calculated based on the scroll position and available width - let requestId = 0; - const update = () => { - if (requestId) { - window.cancelAnimationFrame(requestId); - } - requestId = window.requestAnimationFrame(() => { - const scrollbarButtonWidth = (slider.container.offsetWidth / slider.container.scrollWidth) * 100; - const scrollLeftInPortion = getScrollbarButtonLeftOffset(); - scrollbarButton.style.width = `${scrollbarButtonWidth}%`; - scrollbarButton.style.transform = `translateX(${scrollLeftInPortion}px)`; - // aria-valuenow - const scrollLeft = slider.container.scrollLeft; - const scrollWidth = slider.container.scrollWidth; - const containerWidth = slider.container.offsetWidth; - const scrollPercentage = (scrollLeft / (scrollWidth - containerWidth)) * 100; - scrollbarContainer.setAttribute('aria-valuenow', Math.round(Number.isNaN(scrollPercentage) ? 0 : scrollPercentage).toString()); - }); - }; - // insert to DOM - if (options.container) { - options.container.appendChild(scrollbarContainer); - } - else { - (_c = slider.container.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(scrollbarContainer, slider.container.nextSibling); - } - // update the scrollbar when the slider is scrolled - update(); - slider.on('scroll', update); - slider.on('contentsChanged', update); - slider.on('containerSizeChanged', update); - slider.on('detailsChanged', setDataAttributes); - // handle arrow keys while focused - scrollbarContainer.addEventListener('keydown', (e) => { - if (e.key === 'ArrowLeft') { - slider.moveToDirection('prev'); - } - else if (e.key === 'ArrowRight') { - slider.moveToDirection('next'); - } - }); - // handle click to before or after the scrollbar button - scrollbarContainer.addEventListener('click', (e) => { - const scrollbarButtonWidth = scrollbarButton.offsetWidth; - const scrollbarButtonLeft = getScrollbarButtonLeftOffset(); - const scrollbarButtonRight = scrollbarButtonLeft + scrollbarButtonWidth; - const clickX = e.pageX - scrollbarContainer.offsetLeft; - if (clickX < scrollbarButtonLeft) { - slider.moveToDirection('prev'); - } - else if (clickX > scrollbarButtonRight) { - slider.moveToDirection('next'); - } - }); - // make scrollbar button draggable via mouse/touch and update the scroll position - let isInteractionDown = false; - let startX = 0; - let scrollLeft = 0; - const onInteractionDown = (e) => { - isInteractionDown = true; - const pageX = e.pageX || e.touches[0].pageX; - startX = pageX - scrollbarContainer.offsetLeft; - scrollLeft = slider.container.scrollLeft; - // change cursor to grabbing - scrollbarButton.style.cursor = 'grabbing'; - slider.container.style.scrollSnapType = 'none'; - scrollbarButton.setAttribute('data-is-grabbed', 'true'); - e.preventDefault(); - e.stopPropagation(); - }; - const onInteractionMove = (e) => { - if (!isInteractionDown) { - return; - } - e.preventDefault(); - const pageX = e.pageX || e.touches[0].pageX; - const x = pageX - scrollbarContainer.offsetLeft; - const scrollingFactor = slider.container.scrollWidth / scrollbarContainer.offsetWidth; - const walk = (x - startX) * scrollingFactor; - slider.container.scrollLeft = scrollLeft + walk; - }; - const onInteractionUp = () => { - isInteractionDown = false; - scrollbarButton.style.cursor = ''; - slider.container.style.scrollSnapType = ''; - scrollbarButton.setAttribute('data-is-grabbed', 'false'); - }; - scrollbarButton.addEventListener('mousedown', onInteractionDown); - scrollbarButton.addEventListener('touchstart', onInteractionDown); - window.addEventListener('mousemove', onInteractionMove); - window.addEventListener('touchmove', onInteractionMove, { passive: false }); - window.addEventListener('mouseup', onInteractionUp); - window.addEventListener('touchend', onInteractionUp); - }; -} - -const DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK = 20; -function DragScrollingPlugin(args) { - var _a; - const options = { - draggedDistanceThatPreventsClick: (_a = args === null || args === void 0 ? void 0 : args.draggedDistanceThatPreventsClick) !== null && _a !== void 0 ? _a : DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK, - }; - return (slider) => { - let isMouseDown = false; - let startX = 0; - let scrollLeft = 0; - // add data attribute to container - slider.container.setAttribute('data-has-drag-scrolling', 'true'); - slider.container.addEventListener('mousedown', (e) => { - if (!slider.details.hasOverflow) { - return; - } - isMouseDown = true; - startX = e.pageX - slider.container.offsetLeft; - scrollLeft = slider.container.scrollLeft; - // change cursor to grabbing - slider.container.style.cursor = 'grabbing'; - slider.container.style.scrollSnapType = 'none'; - slider.container.style.scrollBehavior = 'auto'; - // prevent pointer events on the slides - // const slides = slider.container.querySelectorAll( ':scope > *' ); - // slides.forEach((slide) => { - // (slide).style.pointerEvents = 'none'; - // }); - // prevent focus going to the slides - // e.preventDefault(); - // e.stopPropagation(); - }); - window.addEventListener('mouseup', () => { - if (!slider.details.hasOverflow) { - return; - } - isMouseDown = false; - slider.container.style.cursor = ''; - // slider.container.style.scrollBehavior = slider.options.scrollBehavior; - setTimeout(() => { - slider.container.style.scrollSnapType = ''; - slider.container.style.scrollBehavior = ''; - const slides = slider.container.querySelectorAll(':scope > *'); - slides.forEach((slide) => { - slide.style.pointerEvents = ''; - }); - }, 50); - }); - window.addEventListener('mousemove', (e) => { - if (!slider.details.hasOverflow) { - return; - } - if (!isMouseDown) { - return; - } - e.preventDefault(); - const x = e.pageX - slider.container.offsetLeft; - const walk = (x - startX); - slider.container.scrollLeft = scrollLeft - walk; - // if walk is more than 30px, don't allow click event - // e.preventDefault(); - const absWalk = Math.abs(walk); - const slides = slider.container.querySelectorAll(':scope > *'); - const pointerEvents = absWalk > options.draggedDistanceThatPreventsClick ? 'none' : ''; - slides.forEach((slide) => { - slide.style.pointerEvents = pointerEvents; - }); - }); - }; -} - -const DEFAULT_TEXTS = { - dotDescription: 'Page %d of %d', -}; -const DEFAULT_CLASS_NAMES = { - dotsContainer: 'overflow-slider__dots', - dotsItem: 'overflow-slider__dot-item', -}; -function DotsPlugin(args) { - return (slider) => { - var _a, _b; - const options = { - texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), - classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), - container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, - }; - const dots = document.createElement('div'); - dots.classList.add(options.classNames.dotsContainer); - let pageFocused = null; - const buildDots = () => { - dots.setAttribute('data-has-content', slider.details.hasOverflow.toString()); - dots.innerHTML = ''; - const dotsList = document.createElement('ul'); - const pages = slider.details.amountOfPages; - const currentPage = slider.details.currentPage; - if (pages <= 1) { - return; - } - for (let i = 0; i < pages; i++) { - const dotListItem = document.createElement('li'); - const dot = document.createElement('button'); - dot.setAttribute('type', 'button'); - dot.setAttribute('class', options.classNames.dotsItem); - dot.setAttribute('aria-label', options.texts.dotDescription.replace('%d', (i + 1).toString()).replace('%d', pages.toString())); - dot.setAttribute('aria-pressed', (i === currentPage).toString()); - dot.setAttribute('data-page', (i + 1).toString()); - dotListItem.appendChild(dot); - dotsList.appendChild(dotListItem); - dot.addEventListener('click', () => activateDot(i + 1)); - dot.addEventListener('focus', () => pageFocused = i + 1); - dot.addEventListener('keydown', (e) => { - var _a; - const currentPageItem = dots.querySelector(`[aria-pressed="true"]`); - if (!currentPageItem) { - return; - } - const currentPage = parseInt((_a = currentPageItem.getAttribute('data-page')) !== null && _a !== void 0 ? _a : '1'); - if (e.key === 'ArrowLeft') { - const previousPage = currentPage - 1; - if (previousPage > 0) { - const matchingDot = dots.querySelector(`[data-page="${previousPage}"]`); - if (matchingDot) { - matchingDot.focus(); - } - activateDot(previousPage); - } - } - if (e.key === 'ArrowRight') { - const nextPage = currentPage + 1; - if (nextPage <= pages) { - const matchingDot = dots.querySelector(`[data-page="${nextPage}"]`); - if (matchingDot) { - matchingDot.focus(); - } - activateDot(nextPage); - } - } - }); - } - dots.appendChild(dotsList); - // return focus to same page after rebuild - if (pageFocused) { - const matchingDot = dots.querySelector(`[data-page="${pageFocused}"]`); - if (matchingDot) { - matchingDot.focus(); - } - } - }; - const activateDot = (page) => { - const scrollTargetPosition = slider.details.containerWidth * (page - 1); - slider.container.style.scrollBehavior = slider.options.scrollBehavior; - slider.container.style.scrollSnapType = 'none'; - slider.container.scrollLeft = scrollTargetPosition; - slider.container.style.scrollBehavior = ''; - slider.container.style.scrollSnapType = ''; - }; - buildDots(); - if (options.container) { - options.container.appendChild(dots); - } - else { - (_b = slider.container.parentNode) === null || _b === void 0 ? void 0 : _b.insertBefore(dots, slider.container.nextSibling); - } - slider.on('detailsChanged', () => { - buildDots(); - }); - }; -} - -export { ArrowsPlugin, DotsPlugin, DragScrollingPlugin, OverflowSlider, ScrollIndicatorPlugin, SkipLinksPlugin }; +export { OverflowSlider as default }; diff --git a/docs/dist/overflow-slider.js b/docs/dist/overflow-slider.js new file mode 100644 index 0000000..21d59bd --- /dev/null +++ b/docs/dist/overflow-slider.js @@ -0,0 +1,25 @@ +import Slider from './core/slider.js'; + +function OverflowSlider(container, options, plugins) { + try { + // check that container HTML element + if (!(container instanceof Element)) { + throw new Error(`Container must be HTML element, found ${typeof container}`); + } + const defaults = { + scrollBehavior: "smooth", + scrollStrategy: "fullSlide", + }; + const sliderOptions = Object.assign(Object.assign({}, defaults), options); + // disable smooth scrolling if user prefers reduced motion + if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) { + sliderOptions.scrollBehavior = "auto"; + } + return Slider(container, sliderOptions, plugins); + } + catch (e) { + console.error(e); + } +} + +export { OverflowSlider as default }; diff --git a/docs/dist/overflow-slider.min.js b/docs/dist/overflow-slider.min.js new file mode 100644 index 0000000..de4233a --- /dev/null +++ b/docs/dist/overflow-slider.min.js @@ -0,0 +1 @@ +import e from"./core/slider.min.js";function o(o,r,t){try{if(!(o instanceof Element))throw new Error("Container must be HTML element, found "+typeof o);const n={scrollBehavior:"smooth",scrollStrategy:"fullSlide"},s=Object.assign(Object.assign({},n),r);return window.matchMedia("(prefers-reduced-motion: reduce)").matches&&(s.scrollBehavior="auto"),e(o,s,t)}catch(e){console.error(e)}}export{o as default}; diff --git a/docs/dist/plugins/arrows.esm.js b/docs/dist/plugins/arrows.esm.js new file mode 100644 index 0000000..584926b --- /dev/null +++ b/docs/dist/plugins/arrows.esm.js @@ -0,0 +1,74 @@ +const DEFAULT_TEXTS = { + buttonPrevious: 'Previous items', + buttonNext: 'Next items', +}; +const DEFAULT_ICONS = { + prev: '', + next: '', +}; +const DEFAULT_CLASS_NAMES = { + navContainer: 'overflow-slider__arrows', + prevButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--prev', + nextButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--next', +}; +function ArrowsPlugin(args) { + return (slider) => { + var _a, _b, _c, _d; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + icons: Object.assign(Object.assign({}, DEFAULT_ICONS), (args === null || args === void 0 ? void 0 : args.icons) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const nav = document.createElement('div'); + nav.classList.add(options.classNames.navContainer); + const prev = document.createElement('button'); + prev.setAttribute('class', options.classNames.prevButton); + prev.setAttribute('type', 'button'); + prev.setAttribute('aria-label', options.texts.buttonPrevious); + prev.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); + prev.setAttribute('data-type', 'prev'); + prev.innerHTML = options.icons.prev; + prev.addEventListener('click', () => slider.moveToDirection('prev')); + const next = document.createElement('button'); + next.setAttribute('class', options.classNames.nextButton); + next.setAttribute('type', 'button'); + next.setAttribute('aria-label', options.texts.buttonNext); + next.setAttribute('aria-controls', (_c = slider.container.getAttribute('id')) !== null && _c !== void 0 ? _c : ''); + next.setAttribute('data-type', 'next'); + next.innerHTML = options.icons.next; + next.addEventListener('click', () => slider.moveToDirection('next')); + // insert buttons to the nav + nav.appendChild(prev); + nav.appendChild(next); + const update = () => { + const scrollLeft = slider.container.scrollLeft; + const scrollWidth = slider.container.scrollWidth; + const clientWidth = slider.container.clientWidth; + if (scrollLeft === 0) { + prev.setAttribute('data-has-content', 'false'); + } + else { + prev.setAttribute('data-has-content', 'true'); + } + if (scrollLeft + clientWidth >= scrollWidth) { + next.setAttribute('data-has-content', 'false'); + } + else { + next.setAttribute('data-has-content', 'true'); + } + }; + if (options.container) { + options.container.appendChild(nav); + } + else { + (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(nav, slider.container.nextSibling); + } + update(); + slider.on('scroll', update); + slider.on('contentsChanged', update); + slider.on('containerSizeChanged', update); + }; +} + +export { ArrowsPlugin as default }; diff --git a/docs/dist/plugins/arrows.js b/docs/dist/plugins/arrows.js new file mode 100644 index 0000000..584926b --- /dev/null +++ b/docs/dist/plugins/arrows.js @@ -0,0 +1,74 @@ +const DEFAULT_TEXTS = { + buttonPrevious: 'Previous items', + buttonNext: 'Next items', +}; +const DEFAULT_ICONS = { + prev: '', + next: '', +}; +const DEFAULT_CLASS_NAMES = { + navContainer: 'overflow-slider__arrows', + prevButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--prev', + nextButton: 'overflow-slider__arrows-button overflow-slider__arrows-button--next', +}; +function ArrowsPlugin(args) { + return (slider) => { + var _a, _b, _c, _d; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + icons: Object.assign(Object.assign({}, DEFAULT_ICONS), (args === null || args === void 0 ? void 0 : args.icons) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const nav = document.createElement('div'); + nav.classList.add(options.classNames.navContainer); + const prev = document.createElement('button'); + prev.setAttribute('class', options.classNames.prevButton); + prev.setAttribute('type', 'button'); + prev.setAttribute('aria-label', options.texts.buttonPrevious); + prev.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); + prev.setAttribute('data-type', 'prev'); + prev.innerHTML = options.icons.prev; + prev.addEventListener('click', () => slider.moveToDirection('prev')); + const next = document.createElement('button'); + next.setAttribute('class', options.classNames.nextButton); + next.setAttribute('type', 'button'); + next.setAttribute('aria-label', options.texts.buttonNext); + next.setAttribute('aria-controls', (_c = slider.container.getAttribute('id')) !== null && _c !== void 0 ? _c : ''); + next.setAttribute('data-type', 'next'); + next.innerHTML = options.icons.next; + next.addEventListener('click', () => slider.moveToDirection('next')); + // insert buttons to the nav + nav.appendChild(prev); + nav.appendChild(next); + const update = () => { + const scrollLeft = slider.container.scrollLeft; + const scrollWidth = slider.container.scrollWidth; + const clientWidth = slider.container.clientWidth; + if (scrollLeft === 0) { + prev.setAttribute('data-has-content', 'false'); + } + else { + prev.setAttribute('data-has-content', 'true'); + } + if (scrollLeft + clientWidth >= scrollWidth) { + next.setAttribute('data-has-content', 'false'); + } + else { + next.setAttribute('data-has-content', 'true'); + } + }; + if (options.container) { + options.container.appendChild(nav); + } + else { + (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(nav, slider.container.nextSibling); + } + update(); + slider.on('scroll', update); + slider.on('contentsChanged', update); + slider.on('containerSizeChanged', update); + }; +} + +export { ArrowsPlugin as default }; diff --git a/docs/dist/plugins/arrows.min.js b/docs/dist/plugins/arrows.min.js new file mode 100644 index 0000000..384e17a --- /dev/null +++ b/docs/dist/plugins/arrows.min.js @@ -0,0 +1 @@ +const t={buttonPrevious:"Previous items",buttonNext:"Next items"},e={prev:'',next:''},n={navContainer:"overflow-slider__arrows",prevButton:"overflow-slider__arrows-button overflow-slider__arrows-button--prev",nextButton:"overflow-slider__arrows-button overflow-slider__arrows-button--next"};function s(s){return o=>{var i,r,a,l;const c={texts:Object.assign(Object.assign({},t),(null==s?void 0:s.texts)||[]),icons:Object.assign(Object.assign({},e),(null==s?void 0:s.icons)||[]),classNames:Object.assign(Object.assign({},n),(null==s?void 0:s.classNames)||[]),container:null!==(i=null==s?void 0:s.container)&&void 0!==i?i:null},u=document.createElement("div");u.classList.add(c.classNames.navContainer);const d=document.createElement("button");d.setAttribute("class",c.classNames.prevButton),d.setAttribute("type","button"),d.setAttribute("aria-label",c.texts.buttonPrevious),d.setAttribute("aria-controls",null!==(r=o.container.getAttribute("id"))&&void 0!==r?r:""),d.setAttribute("data-type","prev"),d.innerHTML=c.icons.prev,d.addEventListener("click",(()=>o.moveToDirection("prev")));const v=document.createElement("button");v.setAttribute("class",c.classNames.nextButton),v.setAttribute("type","button"),v.setAttribute("aria-label",c.texts.buttonNext),v.setAttribute("aria-controls",null!==(a=o.container.getAttribute("id"))&&void 0!==a?a:""),v.setAttribute("data-type","next"),v.innerHTML=c.icons.next,v.addEventListener("click",(()=>o.moveToDirection("next"))),u.appendChild(d),u.appendChild(v);const b=()=>{const t=o.container.scrollLeft,e=o.container.scrollWidth,n=o.container.clientWidth;0===t?d.setAttribute("data-has-content","false"):d.setAttribute("data-has-content","true"),t+n>=e?v.setAttribute("data-has-content","false"):v.setAttribute("data-has-content","true")};c.container?c.container.appendChild(u):null===(l=o.container.parentNode)||void 0===l||l.insertBefore(u,o.container.nextSibling),b(),o.on("scroll",b),o.on("contentsChanged",b),o.on("containerSizeChanged",b)}}export{s as default}; diff --git a/docs/dist/plugins/core/utils.esm.js b/docs/dist/plugins/core/utils.esm.js new file mode 100644 index 0000000..9be1ea0 --- /dev/null +++ b/docs/dist/plugins/core/utils.esm.js @@ -0,0 +1,9 @@ +function generateId(prefix, i = 1) { + const id = `${prefix}-${i}`; + if (document.getElementById(id)) { + return generateId(prefix, i + 1); + } + return id; +} + +export { generateId }; diff --git a/docs/dist/plugins/core/utils.js b/docs/dist/plugins/core/utils.js new file mode 100644 index 0000000..9be1ea0 --- /dev/null +++ b/docs/dist/plugins/core/utils.js @@ -0,0 +1,9 @@ +function generateId(prefix, i = 1) { + const id = `${prefix}-${i}`; + if (document.getElementById(id)) { + return generateId(prefix, i + 1); + } + return id; +} + +export { generateId }; diff --git a/docs/dist/plugins/core/utils.min.js b/docs/dist/plugins/core/utils.min.js new file mode 100644 index 0000000..0e46d13 --- /dev/null +++ b/docs/dist/plugins/core/utils.min.js @@ -0,0 +1 @@ +function t(e,n=1){const o=`${e}-${n}`;return document.getElementById(o)?t(e,n+1):o}export{t as generateId}; diff --git a/docs/dist/plugins/dots.esm.js b/docs/dist/plugins/dots.esm.js new file mode 100644 index 0000000..75b1175 --- /dev/null +++ b/docs/dist/plugins/dots.esm.js @@ -0,0 +1,99 @@ +const DEFAULT_TEXTS = { + dotDescription: 'Page %d of %d', +}; +const DEFAULT_CLASS_NAMES = { + dotsContainer: 'overflow-slider__dots', + dotsItem: 'overflow-slider__dot-item', +}; +function DotsPlugin(args) { + return (slider) => { + var _a, _b; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const dots = document.createElement('div'); + dots.classList.add(options.classNames.dotsContainer); + let pageFocused = null; + const buildDots = () => { + dots.setAttribute('data-has-content', slider.details.hasOverflow.toString()); + dots.innerHTML = ''; + const dotsList = document.createElement('ul'); + const pages = slider.details.amountOfPages; + const currentPage = slider.details.currentPage; + if (pages <= 1) { + return; + } + for (let i = 0; i < pages; i++) { + const dotListItem = document.createElement('li'); + const dot = document.createElement('button'); + dot.setAttribute('type', 'button'); + dot.setAttribute('class', options.classNames.dotsItem); + dot.setAttribute('aria-label', options.texts.dotDescription.replace('%d', (i + 1).toString()).replace('%d', pages.toString())); + dot.setAttribute('aria-pressed', (i === currentPage).toString()); + dot.setAttribute('data-page', (i + 1).toString()); + dotListItem.appendChild(dot); + dotsList.appendChild(dotListItem); + dot.addEventListener('click', () => activateDot(i + 1)); + dot.addEventListener('focus', () => pageFocused = i + 1); + dot.addEventListener('keydown', (e) => { + var _a; + const currentPageItem = dots.querySelector(`[aria-pressed="true"]`); + if (!currentPageItem) { + return; + } + const currentPage = parseInt((_a = currentPageItem.getAttribute('data-page')) !== null && _a !== void 0 ? _a : '1'); + if (e.key === 'ArrowLeft') { + const previousPage = currentPage - 1; + if (previousPage > 0) { + const matchingDot = dots.querySelector(`[data-page="${previousPage}"]`); + if (matchingDot) { + matchingDot.focus(); + } + activateDot(previousPage); + } + } + if (e.key === 'ArrowRight') { + const nextPage = currentPage + 1; + if (nextPage <= pages) { + const matchingDot = dots.querySelector(`[data-page="${nextPage}"]`); + if (matchingDot) { + matchingDot.focus(); + } + activateDot(nextPage); + } + } + }); + } + dots.appendChild(dotsList); + // return focus to same page after rebuild + if (pageFocused) { + const matchingDot = dots.querySelector(`[data-page="${pageFocused}"]`); + if (matchingDot) { + matchingDot.focus(); + } + } + }; + const activateDot = (page) => { + const scrollTargetPosition = slider.details.containerWidth * (page - 1); + slider.container.style.scrollBehavior = slider.options.scrollBehavior; + slider.container.style.scrollSnapType = 'none'; + slider.container.scrollLeft = scrollTargetPosition; + slider.container.style.scrollBehavior = ''; + slider.container.style.scrollSnapType = ''; + }; + buildDots(); + if (options.container) { + options.container.appendChild(dots); + } + else { + (_b = slider.container.parentNode) === null || _b === void 0 ? void 0 : _b.insertBefore(dots, slider.container.nextSibling); + } + slider.on('detailsChanged', () => { + buildDots(); + }); + }; +} + +export { DotsPlugin as default }; diff --git a/docs/dist/plugins/dots.js b/docs/dist/plugins/dots.js new file mode 100644 index 0000000..75b1175 --- /dev/null +++ b/docs/dist/plugins/dots.js @@ -0,0 +1,99 @@ +const DEFAULT_TEXTS = { + dotDescription: 'Page %d of %d', +}; +const DEFAULT_CLASS_NAMES = { + dotsContainer: 'overflow-slider__dots', + dotsItem: 'overflow-slider__dot-item', +}; +function DotsPlugin(args) { + return (slider) => { + var _a, _b; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const dots = document.createElement('div'); + dots.classList.add(options.classNames.dotsContainer); + let pageFocused = null; + const buildDots = () => { + dots.setAttribute('data-has-content', slider.details.hasOverflow.toString()); + dots.innerHTML = ''; + const dotsList = document.createElement('ul'); + const pages = slider.details.amountOfPages; + const currentPage = slider.details.currentPage; + if (pages <= 1) { + return; + } + for (let i = 0; i < pages; i++) { + const dotListItem = document.createElement('li'); + const dot = document.createElement('button'); + dot.setAttribute('type', 'button'); + dot.setAttribute('class', options.classNames.dotsItem); + dot.setAttribute('aria-label', options.texts.dotDescription.replace('%d', (i + 1).toString()).replace('%d', pages.toString())); + dot.setAttribute('aria-pressed', (i === currentPage).toString()); + dot.setAttribute('data-page', (i + 1).toString()); + dotListItem.appendChild(dot); + dotsList.appendChild(dotListItem); + dot.addEventListener('click', () => activateDot(i + 1)); + dot.addEventListener('focus', () => pageFocused = i + 1); + dot.addEventListener('keydown', (e) => { + var _a; + const currentPageItem = dots.querySelector(`[aria-pressed="true"]`); + if (!currentPageItem) { + return; + } + const currentPage = parseInt((_a = currentPageItem.getAttribute('data-page')) !== null && _a !== void 0 ? _a : '1'); + if (e.key === 'ArrowLeft') { + const previousPage = currentPage - 1; + if (previousPage > 0) { + const matchingDot = dots.querySelector(`[data-page="${previousPage}"]`); + if (matchingDot) { + matchingDot.focus(); + } + activateDot(previousPage); + } + } + if (e.key === 'ArrowRight') { + const nextPage = currentPage + 1; + if (nextPage <= pages) { + const matchingDot = dots.querySelector(`[data-page="${nextPage}"]`); + if (matchingDot) { + matchingDot.focus(); + } + activateDot(nextPage); + } + } + }); + } + dots.appendChild(dotsList); + // return focus to same page after rebuild + if (pageFocused) { + const matchingDot = dots.querySelector(`[data-page="${pageFocused}"]`); + if (matchingDot) { + matchingDot.focus(); + } + } + }; + const activateDot = (page) => { + const scrollTargetPosition = slider.details.containerWidth * (page - 1); + slider.container.style.scrollBehavior = slider.options.scrollBehavior; + slider.container.style.scrollSnapType = 'none'; + slider.container.scrollLeft = scrollTargetPosition; + slider.container.style.scrollBehavior = ''; + slider.container.style.scrollSnapType = ''; + }; + buildDots(); + if (options.container) { + options.container.appendChild(dots); + } + else { + (_b = slider.container.parentNode) === null || _b === void 0 ? void 0 : _b.insertBefore(dots, slider.container.nextSibling); + } + slider.on('detailsChanged', () => { + buildDots(); + }); + }; +} + +export { DotsPlugin as default }; diff --git a/docs/dist/plugins/dots.min.js b/docs/dist/plugins/dots.min.js new file mode 100644 index 0000000..e2d62e3 --- /dev/null +++ b/docs/dist/plugins/dots.min.js @@ -0,0 +1 @@ +const t={dotDescription:"Page %d of %d"},e={dotsContainer:"overflow-slider__dots",dotsItem:"overflow-slider__dot-item"};function n(n){return o=>{var a,s;const r={texts:Object.assign(Object.assign({},t),(null==n?void 0:n.texts)||[]),classNames:Object.assign(Object.assign({},e),(null==n?void 0:n.classNames)||[]),container:null!==(a=null==n?void 0:n.container)&&void 0!==a?a:null},i=document.createElement("div");i.classList.add(r.classNames.dotsContainer);let l=null;const c=()=>{i.setAttribute("data-has-content",o.details.hasOverflow.toString()),i.innerHTML="";const t=document.createElement("ul"),e=o.details.amountOfPages,n=o.details.currentPage;if(!(e<=1)){for(let o=0;od(o+1))),s.addEventListener("focus",(()=>l=o+1)),s.addEventListener("keydown",(t=>{var n;const o=i.querySelector('[aria-pressed="true"]');if(!o)return;const a=parseInt(null!==(n=o.getAttribute("data-page"))&&void 0!==n?n:"1");if("ArrowLeft"===t.key){const t=a-1;if(t>0){const e=i.querySelector(`[data-page="${t}"]`);e&&e.focus(),d(t)}}if("ArrowRight"===t.key){const t=a+1;if(t<=e){const e=i.querySelector(`[data-page="${t}"]`);e&&e.focus(),d(t)}}}))}if(i.appendChild(t),l){const t=i.querySelector(`[data-page="${l}"]`);t&&t.focus()}}},d=t=>{const e=o.details.containerWidth*(t-1);o.container.style.scrollBehavior=o.options.scrollBehavior,o.container.style.scrollSnapType="none",o.container.scrollLeft=e,o.container.style.scrollBehavior="",o.container.style.scrollSnapType=""};c(),r.container?r.container.appendChild(i):null===(s=o.container.parentNode)||void 0===s||s.insertBefore(i,o.container.nextSibling),o.on("detailsChanged",(()=>{c()}))}}export{n as default}; diff --git a/docs/dist/plugins/drag-scrolling.esm.js b/docs/dist/plugins/drag-scrolling.esm.js new file mode 100644 index 0000000..ed7117b --- /dev/null +++ b/docs/dist/plugins/drag-scrolling.esm.js @@ -0,0 +1,72 @@ +const DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK = 20; +function DragScrollingPlugin(args) { + var _a; + const options = { + draggedDistanceThatPreventsClick: (_a = args === null || args === void 0 ? void 0 : args.draggedDistanceThatPreventsClick) !== null && _a !== void 0 ? _a : DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK, + }; + return (slider) => { + let isMouseDown = false; + let startX = 0; + let scrollLeft = 0; + // add data attribute to container + slider.container.setAttribute('data-has-drag-scrolling', 'true'); + slider.container.addEventListener('mousedown', (e) => { + if (!slider.details.hasOverflow) { + return; + } + isMouseDown = true; + startX = e.pageX - slider.container.offsetLeft; + scrollLeft = slider.container.scrollLeft; + // change cursor to grabbing + slider.container.style.cursor = 'grabbing'; + slider.container.style.scrollSnapType = 'none'; + slider.container.style.scrollBehavior = 'auto'; + // prevent pointer events on the slides + // const slides = slider.container.querySelectorAll( ':scope > *' ); + // slides.forEach((slide) => { + // (slide).style.pointerEvents = 'none'; + // }); + // prevent focus going to the slides + // e.preventDefault(); + // e.stopPropagation(); + }); + window.addEventListener('mouseup', () => { + if (!slider.details.hasOverflow) { + return; + } + isMouseDown = false; + slider.container.style.cursor = ''; + // slider.container.style.scrollBehavior = slider.options.scrollBehavior; + setTimeout(() => { + slider.container.style.scrollSnapType = ''; + slider.container.style.scrollBehavior = ''; + const slides = slider.container.querySelectorAll(':scope > *'); + slides.forEach((slide) => { + slide.style.pointerEvents = ''; + }); + }, 50); + }); + window.addEventListener('mousemove', (e) => { + if (!slider.details.hasOverflow) { + return; + } + if (!isMouseDown) { + return; + } + e.preventDefault(); + const x = e.pageX - slider.container.offsetLeft; + const walk = (x - startX); + slider.container.scrollLeft = scrollLeft - walk; + // if walk is more than 30px, don't allow click event + // e.preventDefault(); + const absWalk = Math.abs(walk); + const slides = slider.container.querySelectorAll(':scope > *'); + const pointerEvents = absWalk > options.draggedDistanceThatPreventsClick ? 'none' : ''; + slides.forEach((slide) => { + slide.style.pointerEvents = pointerEvents; + }); + }); + }; +} + +export { DragScrollingPlugin as default }; diff --git a/docs/dist/plugins/drag-scrolling.js b/docs/dist/plugins/drag-scrolling.js new file mode 100644 index 0000000..ed7117b --- /dev/null +++ b/docs/dist/plugins/drag-scrolling.js @@ -0,0 +1,72 @@ +const DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK = 20; +function DragScrollingPlugin(args) { + var _a; + const options = { + draggedDistanceThatPreventsClick: (_a = args === null || args === void 0 ? void 0 : args.draggedDistanceThatPreventsClick) !== null && _a !== void 0 ? _a : DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK, + }; + return (slider) => { + let isMouseDown = false; + let startX = 0; + let scrollLeft = 0; + // add data attribute to container + slider.container.setAttribute('data-has-drag-scrolling', 'true'); + slider.container.addEventListener('mousedown', (e) => { + if (!slider.details.hasOverflow) { + return; + } + isMouseDown = true; + startX = e.pageX - slider.container.offsetLeft; + scrollLeft = slider.container.scrollLeft; + // change cursor to grabbing + slider.container.style.cursor = 'grabbing'; + slider.container.style.scrollSnapType = 'none'; + slider.container.style.scrollBehavior = 'auto'; + // prevent pointer events on the slides + // const slides = slider.container.querySelectorAll( ':scope > *' ); + // slides.forEach((slide) => { + // (slide).style.pointerEvents = 'none'; + // }); + // prevent focus going to the slides + // e.preventDefault(); + // e.stopPropagation(); + }); + window.addEventListener('mouseup', () => { + if (!slider.details.hasOverflow) { + return; + } + isMouseDown = false; + slider.container.style.cursor = ''; + // slider.container.style.scrollBehavior = slider.options.scrollBehavior; + setTimeout(() => { + slider.container.style.scrollSnapType = ''; + slider.container.style.scrollBehavior = ''; + const slides = slider.container.querySelectorAll(':scope > *'); + slides.forEach((slide) => { + slide.style.pointerEvents = ''; + }); + }, 50); + }); + window.addEventListener('mousemove', (e) => { + if (!slider.details.hasOverflow) { + return; + } + if (!isMouseDown) { + return; + } + e.preventDefault(); + const x = e.pageX - slider.container.offsetLeft; + const walk = (x - startX); + slider.container.scrollLeft = scrollLeft - walk; + // if walk is more than 30px, don't allow click event + // e.preventDefault(); + const absWalk = Math.abs(walk); + const slides = slider.container.querySelectorAll(':scope > *'); + const pointerEvents = absWalk > options.draggedDistanceThatPreventsClick ? 'none' : ''; + slides.forEach((slide) => { + slide.style.pointerEvents = pointerEvents; + }); + }); + }; +} + +export { DragScrollingPlugin as default }; diff --git a/docs/dist/plugins/drag-scrolling.min.js b/docs/dist/plugins/drag-scrolling.min.js new file mode 100644 index 0000000..2f3fd1d --- /dev/null +++ b/docs/dist/plugins/drag-scrolling.min.js @@ -0,0 +1 @@ +function e(e){var t;const n=null!==(t=null==e?void 0:e.draggedDistanceThatPreventsClick)&&void 0!==t?t:20;return e=>{let t=!1,o=0,r=0;e.container.setAttribute("data-has-drag-scrolling","true"),e.container.addEventListener("mousedown",(n=>{e.details.hasOverflow&&(t=!0,o=n.pageX-e.container.offsetLeft,r=e.container.scrollLeft,e.container.style.cursor="grabbing",e.container.style.scrollSnapType="none",e.container.style.scrollBehavior="auto")})),window.addEventListener("mouseup",(()=>{e.details.hasOverflow&&(t=!1,e.container.style.cursor="",setTimeout((()=>{e.container.style.scrollSnapType="",e.container.style.scrollBehavior="";e.container.querySelectorAll(":scope > *").forEach((e=>{e.style.pointerEvents=""}))}),50))})),window.addEventListener("mousemove",(a=>{if(!e.details.hasOverflow)return;if(!t)return;a.preventDefault();const s=a.pageX-e.container.offsetLeft-o;e.container.scrollLeft=r-s;const l=Math.abs(s),i=e.container.querySelectorAll(":scope > *"),c=l>n?"none":"";i.forEach((e=>{e.style.pointerEvents=c}))}))}}export{e as default}; diff --git a/docs/dist/plugins/scroll-indicator.esm.js b/docs/dist/plugins/scroll-indicator.esm.js new file mode 100644 index 0000000..c743c15 --- /dev/null +++ b/docs/dist/plugins/scroll-indicator.esm.js @@ -0,0 +1,133 @@ +const DEFAULT_CLASS_NAMES = { + scrollIndicator: 'overflow-slider__scroll-indicator', + scrollIndicatorBar: 'overflow-slider__scroll-indicator-bar', + scrollIndicatorButton: 'overflow-slider__scroll-indicator-button', +}; +function ScrollIndicatorPlugin(args) { + return (slider) => { + var _a, _b, _c; + const options = { + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const scrollbarContainer = document.createElement('div'); + scrollbarContainer.setAttribute('class', options.classNames.scrollIndicator); + scrollbarContainer.setAttribute('tabindex', '0'); + scrollbarContainer.setAttribute('role', 'scrollbar'); + scrollbarContainer.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); + scrollbarContainer.setAttribute('aria-orientation', 'horizontal'); + scrollbarContainer.setAttribute('aria-valuemax', '100'); + scrollbarContainer.setAttribute('aria-valuemin', '0'); + scrollbarContainer.setAttribute('aria-valuenow', '0'); + const scrollbar = document.createElement('div'); + scrollbar.setAttribute('class', options.classNames.scrollIndicatorBar); + const scrollbarButton = document.createElement('div'); + scrollbarButton.setAttribute('class', options.classNames.scrollIndicatorButton); + scrollbarButton.setAttribute('data-is-grabbed', 'false'); + scrollbar.appendChild(scrollbarButton); + scrollbarContainer.appendChild(scrollbar); + const setDataAttributes = () => { + scrollbarContainer.setAttribute('data-has-overflow', slider.details.hasOverflow.toString()); + }; + setDataAttributes(); + const getScrollbarButtonLeftOffset = () => { + const scrollbarRatio = slider.container.offsetWidth / slider.container.scrollWidth; + return slider.container.scrollLeft * scrollbarRatio; + }; + // scrollbarbutton width and position is calculated based on the scroll position and available width + let requestId = 0; + const update = () => { + if (requestId) { + window.cancelAnimationFrame(requestId); + } + requestId = window.requestAnimationFrame(() => { + const scrollbarButtonWidth = (slider.container.offsetWidth / slider.container.scrollWidth) * 100; + const scrollLeftInPortion = getScrollbarButtonLeftOffset(); + scrollbarButton.style.width = `${scrollbarButtonWidth}%`; + scrollbarButton.style.transform = `translateX(${scrollLeftInPortion}px)`; + // aria-valuenow + const scrollLeft = slider.container.scrollLeft; + const scrollWidth = slider.container.scrollWidth; + const containerWidth = slider.container.offsetWidth; + const scrollPercentage = (scrollLeft / (scrollWidth - containerWidth)) * 100; + scrollbarContainer.setAttribute('aria-valuenow', Math.round(Number.isNaN(scrollPercentage) ? 0 : scrollPercentage).toString()); + }); + }; + // insert to DOM + if (options.container) { + options.container.appendChild(scrollbarContainer); + } + else { + (_c = slider.container.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(scrollbarContainer, slider.container.nextSibling); + } + // update the scrollbar when the slider is scrolled + update(); + slider.on('scroll', update); + slider.on('contentsChanged', update); + slider.on('containerSizeChanged', update); + slider.on('detailsChanged', setDataAttributes); + // handle arrow keys while focused + scrollbarContainer.addEventListener('keydown', (e) => { + if (e.key === 'ArrowLeft') { + slider.moveToDirection('prev'); + } + else if (e.key === 'ArrowRight') { + slider.moveToDirection('next'); + } + }); + // handle click to before or after the scrollbar button + scrollbarContainer.addEventListener('click', (e) => { + const scrollbarButtonWidth = scrollbarButton.offsetWidth; + const scrollbarButtonLeft = getScrollbarButtonLeftOffset(); + const scrollbarButtonRight = scrollbarButtonLeft + scrollbarButtonWidth; + const clickX = e.pageX - scrollbarContainer.offsetLeft; + if (clickX < scrollbarButtonLeft) { + slider.moveToDirection('prev'); + } + else if (clickX > scrollbarButtonRight) { + slider.moveToDirection('next'); + } + }); + // make scrollbar button draggable via mouse/touch and update the scroll position + let isInteractionDown = false; + let startX = 0; + let scrollLeft = 0; + const onInteractionDown = (e) => { + isInteractionDown = true; + const pageX = e.pageX || e.touches[0].pageX; + startX = pageX - scrollbarContainer.offsetLeft; + scrollLeft = slider.container.scrollLeft; + // change cursor to grabbing + scrollbarButton.style.cursor = 'grabbing'; + slider.container.style.scrollSnapType = 'none'; + scrollbarButton.setAttribute('data-is-grabbed', 'true'); + e.preventDefault(); + e.stopPropagation(); + }; + const onInteractionMove = (e) => { + if (!isInteractionDown) { + return; + } + e.preventDefault(); + const pageX = e.pageX || e.touches[0].pageX; + const x = pageX - scrollbarContainer.offsetLeft; + const scrollingFactor = slider.container.scrollWidth / scrollbarContainer.offsetWidth; + const walk = (x - startX) * scrollingFactor; + slider.container.scrollLeft = scrollLeft + walk; + }; + const onInteractionUp = () => { + isInteractionDown = false; + scrollbarButton.style.cursor = ''; + slider.container.style.scrollSnapType = ''; + scrollbarButton.setAttribute('data-is-grabbed', 'false'); + }; + scrollbarButton.addEventListener('mousedown', onInteractionDown); + scrollbarButton.addEventListener('touchstart', onInteractionDown); + window.addEventListener('mousemove', onInteractionMove); + window.addEventListener('touchmove', onInteractionMove, { passive: false }); + window.addEventListener('mouseup', onInteractionUp); + window.addEventListener('touchend', onInteractionUp); + }; +} + +export { ScrollIndicatorPlugin as default }; diff --git a/docs/dist/plugins/scroll-indicator.js b/docs/dist/plugins/scroll-indicator.js new file mode 100644 index 0000000..c743c15 --- /dev/null +++ b/docs/dist/plugins/scroll-indicator.js @@ -0,0 +1,133 @@ +const DEFAULT_CLASS_NAMES = { + scrollIndicator: 'overflow-slider__scroll-indicator', + scrollIndicatorBar: 'overflow-slider__scroll-indicator-bar', + scrollIndicatorButton: 'overflow-slider__scroll-indicator-button', +}; +function ScrollIndicatorPlugin(args) { + return (slider) => { + var _a, _b, _c; + const options = { + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const scrollbarContainer = document.createElement('div'); + scrollbarContainer.setAttribute('class', options.classNames.scrollIndicator); + scrollbarContainer.setAttribute('tabindex', '0'); + scrollbarContainer.setAttribute('role', 'scrollbar'); + scrollbarContainer.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); + scrollbarContainer.setAttribute('aria-orientation', 'horizontal'); + scrollbarContainer.setAttribute('aria-valuemax', '100'); + scrollbarContainer.setAttribute('aria-valuemin', '0'); + scrollbarContainer.setAttribute('aria-valuenow', '0'); + const scrollbar = document.createElement('div'); + scrollbar.setAttribute('class', options.classNames.scrollIndicatorBar); + const scrollbarButton = document.createElement('div'); + scrollbarButton.setAttribute('class', options.classNames.scrollIndicatorButton); + scrollbarButton.setAttribute('data-is-grabbed', 'false'); + scrollbar.appendChild(scrollbarButton); + scrollbarContainer.appendChild(scrollbar); + const setDataAttributes = () => { + scrollbarContainer.setAttribute('data-has-overflow', slider.details.hasOverflow.toString()); + }; + setDataAttributes(); + const getScrollbarButtonLeftOffset = () => { + const scrollbarRatio = slider.container.offsetWidth / slider.container.scrollWidth; + return slider.container.scrollLeft * scrollbarRatio; + }; + // scrollbarbutton width and position is calculated based on the scroll position and available width + let requestId = 0; + const update = () => { + if (requestId) { + window.cancelAnimationFrame(requestId); + } + requestId = window.requestAnimationFrame(() => { + const scrollbarButtonWidth = (slider.container.offsetWidth / slider.container.scrollWidth) * 100; + const scrollLeftInPortion = getScrollbarButtonLeftOffset(); + scrollbarButton.style.width = `${scrollbarButtonWidth}%`; + scrollbarButton.style.transform = `translateX(${scrollLeftInPortion}px)`; + // aria-valuenow + const scrollLeft = slider.container.scrollLeft; + const scrollWidth = slider.container.scrollWidth; + const containerWidth = slider.container.offsetWidth; + const scrollPercentage = (scrollLeft / (scrollWidth - containerWidth)) * 100; + scrollbarContainer.setAttribute('aria-valuenow', Math.round(Number.isNaN(scrollPercentage) ? 0 : scrollPercentage).toString()); + }); + }; + // insert to DOM + if (options.container) { + options.container.appendChild(scrollbarContainer); + } + else { + (_c = slider.container.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(scrollbarContainer, slider.container.nextSibling); + } + // update the scrollbar when the slider is scrolled + update(); + slider.on('scroll', update); + slider.on('contentsChanged', update); + slider.on('containerSizeChanged', update); + slider.on('detailsChanged', setDataAttributes); + // handle arrow keys while focused + scrollbarContainer.addEventListener('keydown', (e) => { + if (e.key === 'ArrowLeft') { + slider.moveToDirection('prev'); + } + else if (e.key === 'ArrowRight') { + slider.moveToDirection('next'); + } + }); + // handle click to before or after the scrollbar button + scrollbarContainer.addEventListener('click', (e) => { + const scrollbarButtonWidth = scrollbarButton.offsetWidth; + const scrollbarButtonLeft = getScrollbarButtonLeftOffset(); + const scrollbarButtonRight = scrollbarButtonLeft + scrollbarButtonWidth; + const clickX = e.pageX - scrollbarContainer.offsetLeft; + if (clickX < scrollbarButtonLeft) { + slider.moveToDirection('prev'); + } + else if (clickX > scrollbarButtonRight) { + slider.moveToDirection('next'); + } + }); + // make scrollbar button draggable via mouse/touch and update the scroll position + let isInteractionDown = false; + let startX = 0; + let scrollLeft = 0; + const onInteractionDown = (e) => { + isInteractionDown = true; + const pageX = e.pageX || e.touches[0].pageX; + startX = pageX - scrollbarContainer.offsetLeft; + scrollLeft = slider.container.scrollLeft; + // change cursor to grabbing + scrollbarButton.style.cursor = 'grabbing'; + slider.container.style.scrollSnapType = 'none'; + scrollbarButton.setAttribute('data-is-grabbed', 'true'); + e.preventDefault(); + e.stopPropagation(); + }; + const onInteractionMove = (e) => { + if (!isInteractionDown) { + return; + } + e.preventDefault(); + const pageX = e.pageX || e.touches[0].pageX; + const x = pageX - scrollbarContainer.offsetLeft; + const scrollingFactor = slider.container.scrollWidth / scrollbarContainer.offsetWidth; + const walk = (x - startX) * scrollingFactor; + slider.container.scrollLeft = scrollLeft + walk; + }; + const onInteractionUp = () => { + isInteractionDown = false; + scrollbarButton.style.cursor = ''; + slider.container.style.scrollSnapType = ''; + scrollbarButton.setAttribute('data-is-grabbed', 'false'); + }; + scrollbarButton.addEventListener('mousedown', onInteractionDown); + scrollbarButton.addEventListener('touchstart', onInteractionDown); + window.addEventListener('mousemove', onInteractionMove); + window.addEventListener('touchmove', onInteractionMove, { passive: false }); + window.addEventListener('mouseup', onInteractionUp); + window.addEventListener('touchend', onInteractionUp); + }; +} + +export { ScrollIndicatorPlugin as default }; diff --git a/docs/dist/plugins/scroll-indicator.min.js b/docs/dist/plugins/scroll-indicator.min.js new file mode 100644 index 0000000..ee9525d --- /dev/null +++ b/docs/dist/plugins/scroll-indicator.min.js @@ -0,0 +1 @@ +const t={scrollIndicator:"overflow-slider__scroll-indicator",scrollIndicatorBar:"overflow-slider__scroll-indicator-bar",scrollIndicatorButton:"overflow-slider__scroll-indicator-button"};function e(e){return n=>{var o,r,i;const a={classNames:Object.assign(Object.assign({},t),(null==e?void 0:e.classNames)||[]),container:null!==(o=null==e?void 0:e.container)&&void 0!==o?o:null},s=document.createElement("div");s.setAttribute("class",a.classNames.scrollIndicator),s.setAttribute("tabindex","0"),s.setAttribute("role","scrollbar"),s.setAttribute("aria-controls",null!==(r=n.container.getAttribute("id"))&&void 0!==r?r:""),s.setAttribute("aria-orientation","horizontal"),s.setAttribute("aria-valuemax","100"),s.setAttribute("aria-valuemin","0"),s.setAttribute("aria-valuenow","0");const l=document.createElement("div");l.setAttribute("class",a.classNames.scrollIndicatorBar);const c=document.createElement("div");c.setAttribute("class",a.classNames.scrollIndicatorButton),c.setAttribute("data-is-grabbed","false"),l.appendChild(c),s.appendChild(l);const d=()=>{s.setAttribute("data-has-overflow",n.details.hasOverflow.toString())};d();const u=()=>{const t=n.container.offsetWidth/n.container.scrollWidth;return n.container.scrollLeft*t};let f=0;const v=()=>{f&&window.cancelAnimationFrame(f),f=window.requestAnimationFrame((()=>{const t=n.container.offsetWidth/n.container.scrollWidth*100,e=u();c.style.width=`${t}%`,c.style.transform=`translateX(${e}px)`;const o=n.container.scrollLeft/(n.container.scrollWidth-n.container.offsetWidth)*100;s.setAttribute("aria-valuenow",Math.round(Number.isNaN(o)?0:o).toString())}))};a.container?a.container.appendChild(s):null===(i=n.container.parentNode)||void 0===i||i.insertBefore(s,n.container.nextSibling),v(),n.on("scroll",v),n.on("contentsChanged",v),n.on("containerSizeChanged",v),n.on("detailsChanged",d),s.addEventListener("keydown",(t=>{"ArrowLeft"===t.key?n.moveToDirection("prev"):"ArrowRight"===t.key&&n.moveToDirection("next")})),s.addEventListener("click",(t=>{const e=c.offsetWidth,o=u(),r=o+e,i=t.pageX-s.offsetLeft;ir&&n.moveToDirection("next")}));let b=!1,m=0,h=0;const p=t=>{b=!0;const e=t.pageX||t.touches[0].pageX;m=e-s.offsetLeft,h=n.container.scrollLeft,c.style.cursor="grabbing",n.container.style.scrollSnapType="none",c.setAttribute("data-is-grabbed","true"),t.preventDefault(),t.stopPropagation()},w=t=>{if(!b)return;t.preventDefault();const e=(t.pageX||t.touches[0].pageX)-s.offsetLeft,o=n.container.scrollWidth/s.offsetWidth,r=(e-m)*o;n.container.scrollLeft=h+r},g=()=>{b=!1,c.style.cursor="",n.container.style.scrollSnapType="",c.setAttribute("data-is-grabbed","false")};c.addEventListener("mousedown",p),c.addEventListener("touchstart",p),window.addEventListener("mousemove",w),window.addEventListener("touchmove",w,{passive:!1}),window.addEventListener("mouseup",g),window.addEventListener("touchend",g)}}export{e as default}; diff --git a/docs/dist/plugins/skip-links.esm.js b/docs/dist/plugins/skip-links.esm.js new file mode 100644 index 0000000..8ef9fa3 --- /dev/null +++ b/docs/dist/plugins/skip-links.esm.js @@ -0,0 +1,42 @@ +import { generateId } from './core/utils.esm.js'; + +const DEFAULT_TEXTS = { + skipList: 'Skip list' +}; +const DEFAULT_CLASS_NAMES = { + skipLink: 'screen-reader-text', + skipLinkTarget: 'overflow-slider__skip-link-target', +}; +function SkipLinksPlugin(args) { + return (slider) => { + var _a, _b, _c, _d, _e, _f; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + containerBefore: (_a = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _a !== void 0 ? _a : null, + containerAfter: (_b = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _b !== void 0 ? _b : null, + }; + const skipId = generateId('overflow-slider-skip'); + const skipLinkEl = document.createElement('a'); + skipLinkEl.setAttribute('href', `#${skipId}`); + skipLinkEl.textContent = options.texts.skipList; + skipLinkEl.classList.add(options.classNames.skipLink); + const skipTargetEl = document.createElement('div'); + skipTargetEl.setAttribute('id', skipId); + skipTargetEl.setAttribute('tabindex', '-1'); + if (options.containerBefore) { + (_c = options.containerBefore.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(skipLinkEl, options.containerBefore); + } + else { + (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(skipLinkEl, slider.container); + } + if (options.containerAfter) { + (_e = options.containerAfter.parentNode) === null || _e === void 0 ? void 0 : _e.insertBefore(skipTargetEl, options.containerAfter.nextSibling); + } + else { + (_f = slider.container.parentNode) === null || _f === void 0 ? void 0 : _f.insertBefore(skipTargetEl, slider.container.nextSibling); + } + }; +} + +export { SkipLinksPlugin as default }; diff --git a/docs/dist/plugins/skip-links.js b/docs/dist/plugins/skip-links.js new file mode 100644 index 0000000..72516c1 --- /dev/null +++ b/docs/dist/plugins/skip-links.js @@ -0,0 +1,42 @@ +import { generateId } from './core/utils.js'; + +const DEFAULT_TEXTS = { + skipList: 'Skip list' +}; +const DEFAULT_CLASS_NAMES = { + skipLink: 'screen-reader-text', + skipLinkTarget: 'overflow-slider__skip-link-target', +}; +function SkipLinksPlugin(args) { + return (slider) => { + var _a, _b, _c, _d, _e, _f; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + containerBefore: (_a = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _a !== void 0 ? _a : null, + containerAfter: (_b = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _b !== void 0 ? _b : null, + }; + const skipId = generateId('overflow-slider-skip'); + const skipLinkEl = document.createElement('a'); + skipLinkEl.setAttribute('href', `#${skipId}`); + skipLinkEl.textContent = options.texts.skipList; + skipLinkEl.classList.add(options.classNames.skipLink); + const skipTargetEl = document.createElement('div'); + skipTargetEl.setAttribute('id', skipId); + skipTargetEl.setAttribute('tabindex', '-1'); + if (options.containerBefore) { + (_c = options.containerBefore.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(skipLinkEl, options.containerBefore); + } + else { + (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(skipLinkEl, slider.container); + } + if (options.containerAfter) { + (_e = options.containerAfter.parentNode) === null || _e === void 0 ? void 0 : _e.insertBefore(skipTargetEl, options.containerAfter.nextSibling); + } + else { + (_f = slider.container.parentNode) === null || _f === void 0 ? void 0 : _f.insertBefore(skipTargetEl, slider.container.nextSibling); + } + }; +} + +export { SkipLinksPlugin as default }; diff --git a/docs/dist/plugins/skip-links.min.js b/docs/dist/plugins/skip-links.min.js new file mode 100644 index 0000000..c85a7df --- /dev/null +++ b/docs/dist/plugins/skip-links.min.js @@ -0,0 +1 @@ +import{generateId as e}from"./core/utils.min.js";const t={skipList:"Skip list"},n={skipLink:"screen-reader-text",skipLinkTarget:"overflow-slider__skip-link-target"};function i(i){return r=>{var o,s,a,l,c,d;const u={texts:Object.assign(Object.assign({},t),(null==i?void 0:i.texts)||[]),classNames:Object.assign(Object.assign({},n),(null==i?void 0:i.classNames)||[]),containerBefore:null!==(o=null==i?void 0:i.containerAfter)&&void 0!==o?o:null,containerAfter:null!==(s=null==i?void 0:i.containerAfter)&&void 0!==s?s:null},f=e("overflow-slider-skip"),p=document.createElement("a");p.setAttribute("href",`#${f}`),p.textContent=u.texts.skipList,p.classList.add(u.classNames.skipLink);const v=document.createElement("div");v.setAttribute("id",f),v.setAttribute("tabindex","-1"),u.containerBefore?null===(a=u.containerBefore.parentNode)||void 0===a||a.insertBefore(p,u.containerBefore):null===(l=r.container.parentNode)||void 0===l||l.insertBefore(p,r.container),u.containerAfter?null===(c=u.containerAfter.parentNode)||void 0===c||c.insertBefore(v,u.containerAfter.nextSibling):null===(d=r.container.parentNode)||void 0===d||d.insertBefore(v,r.container.nextSibling)}}export{i as default}; diff --git a/docs/dist/scroll-indicator.esm.js b/docs/dist/scroll-indicator.esm.js new file mode 100644 index 0000000..c743c15 --- /dev/null +++ b/docs/dist/scroll-indicator.esm.js @@ -0,0 +1,133 @@ +const DEFAULT_CLASS_NAMES = { + scrollIndicator: 'overflow-slider__scroll-indicator', + scrollIndicatorBar: 'overflow-slider__scroll-indicator-bar', + scrollIndicatorButton: 'overflow-slider__scroll-indicator-button', +}; +function ScrollIndicatorPlugin(args) { + return (slider) => { + var _a, _b, _c; + const options = { + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + container: (_a = args === null || args === void 0 ? void 0 : args.container) !== null && _a !== void 0 ? _a : null, + }; + const scrollbarContainer = document.createElement('div'); + scrollbarContainer.setAttribute('class', options.classNames.scrollIndicator); + scrollbarContainer.setAttribute('tabindex', '0'); + scrollbarContainer.setAttribute('role', 'scrollbar'); + scrollbarContainer.setAttribute('aria-controls', (_b = slider.container.getAttribute('id')) !== null && _b !== void 0 ? _b : ''); + scrollbarContainer.setAttribute('aria-orientation', 'horizontal'); + scrollbarContainer.setAttribute('aria-valuemax', '100'); + scrollbarContainer.setAttribute('aria-valuemin', '0'); + scrollbarContainer.setAttribute('aria-valuenow', '0'); + const scrollbar = document.createElement('div'); + scrollbar.setAttribute('class', options.classNames.scrollIndicatorBar); + const scrollbarButton = document.createElement('div'); + scrollbarButton.setAttribute('class', options.classNames.scrollIndicatorButton); + scrollbarButton.setAttribute('data-is-grabbed', 'false'); + scrollbar.appendChild(scrollbarButton); + scrollbarContainer.appendChild(scrollbar); + const setDataAttributes = () => { + scrollbarContainer.setAttribute('data-has-overflow', slider.details.hasOverflow.toString()); + }; + setDataAttributes(); + const getScrollbarButtonLeftOffset = () => { + const scrollbarRatio = slider.container.offsetWidth / slider.container.scrollWidth; + return slider.container.scrollLeft * scrollbarRatio; + }; + // scrollbarbutton width and position is calculated based on the scroll position and available width + let requestId = 0; + const update = () => { + if (requestId) { + window.cancelAnimationFrame(requestId); + } + requestId = window.requestAnimationFrame(() => { + const scrollbarButtonWidth = (slider.container.offsetWidth / slider.container.scrollWidth) * 100; + const scrollLeftInPortion = getScrollbarButtonLeftOffset(); + scrollbarButton.style.width = `${scrollbarButtonWidth}%`; + scrollbarButton.style.transform = `translateX(${scrollLeftInPortion}px)`; + // aria-valuenow + const scrollLeft = slider.container.scrollLeft; + const scrollWidth = slider.container.scrollWidth; + const containerWidth = slider.container.offsetWidth; + const scrollPercentage = (scrollLeft / (scrollWidth - containerWidth)) * 100; + scrollbarContainer.setAttribute('aria-valuenow', Math.round(Number.isNaN(scrollPercentage) ? 0 : scrollPercentage).toString()); + }); + }; + // insert to DOM + if (options.container) { + options.container.appendChild(scrollbarContainer); + } + else { + (_c = slider.container.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(scrollbarContainer, slider.container.nextSibling); + } + // update the scrollbar when the slider is scrolled + update(); + slider.on('scroll', update); + slider.on('contentsChanged', update); + slider.on('containerSizeChanged', update); + slider.on('detailsChanged', setDataAttributes); + // handle arrow keys while focused + scrollbarContainer.addEventListener('keydown', (e) => { + if (e.key === 'ArrowLeft') { + slider.moveToDirection('prev'); + } + else if (e.key === 'ArrowRight') { + slider.moveToDirection('next'); + } + }); + // handle click to before or after the scrollbar button + scrollbarContainer.addEventListener('click', (e) => { + const scrollbarButtonWidth = scrollbarButton.offsetWidth; + const scrollbarButtonLeft = getScrollbarButtonLeftOffset(); + const scrollbarButtonRight = scrollbarButtonLeft + scrollbarButtonWidth; + const clickX = e.pageX - scrollbarContainer.offsetLeft; + if (clickX < scrollbarButtonLeft) { + slider.moveToDirection('prev'); + } + else if (clickX > scrollbarButtonRight) { + slider.moveToDirection('next'); + } + }); + // make scrollbar button draggable via mouse/touch and update the scroll position + let isInteractionDown = false; + let startX = 0; + let scrollLeft = 0; + const onInteractionDown = (e) => { + isInteractionDown = true; + const pageX = e.pageX || e.touches[0].pageX; + startX = pageX - scrollbarContainer.offsetLeft; + scrollLeft = slider.container.scrollLeft; + // change cursor to grabbing + scrollbarButton.style.cursor = 'grabbing'; + slider.container.style.scrollSnapType = 'none'; + scrollbarButton.setAttribute('data-is-grabbed', 'true'); + e.preventDefault(); + e.stopPropagation(); + }; + const onInteractionMove = (e) => { + if (!isInteractionDown) { + return; + } + e.preventDefault(); + const pageX = e.pageX || e.touches[0].pageX; + const x = pageX - scrollbarContainer.offsetLeft; + const scrollingFactor = slider.container.scrollWidth / scrollbarContainer.offsetWidth; + const walk = (x - startX) * scrollingFactor; + slider.container.scrollLeft = scrollLeft + walk; + }; + const onInteractionUp = () => { + isInteractionDown = false; + scrollbarButton.style.cursor = ''; + slider.container.style.scrollSnapType = ''; + scrollbarButton.setAttribute('data-is-grabbed', 'false'); + }; + scrollbarButton.addEventListener('mousedown', onInteractionDown); + scrollbarButton.addEventListener('touchstart', onInteractionDown); + window.addEventListener('mousemove', onInteractionMove); + window.addEventListener('touchmove', onInteractionMove, { passive: false }); + window.addEventListener('mouseup', onInteractionUp); + window.addEventListener('touchend', onInteractionUp); + }; +} + +export { ScrollIndicatorPlugin as default }; diff --git a/docs/dist/scroll-indicator.min.js b/docs/dist/scroll-indicator.min.js new file mode 100644 index 0000000..ee9525d --- /dev/null +++ b/docs/dist/scroll-indicator.min.js @@ -0,0 +1 @@ +const t={scrollIndicator:"overflow-slider__scroll-indicator",scrollIndicatorBar:"overflow-slider__scroll-indicator-bar",scrollIndicatorButton:"overflow-slider__scroll-indicator-button"};function e(e){return n=>{var o,r,i;const a={classNames:Object.assign(Object.assign({},t),(null==e?void 0:e.classNames)||[]),container:null!==(o=null==e?void 0:e.container)&&void 0!==o?o:null},s=document.createElement("div");s.setAttribute("class",a.classNames.scrollIndicator),s.setAttribute("tabindex","0"),s.setAttribute("role","scrollbar"),s.setAttribute("aria-controls",null!==(r=n.container.getAttribute("id"))&&void 0!==r?r:""),s.setAttribute("aria-orientation","horizontal"),s.setAttribute("aria-valuemax","100"),s.setAttribute("aria-valuemin","0"),s.setAttribute("aria-valuenow","0");const l=document.createElement("div");l.setAttribute("class",a.classNames.scrollIndicatorBar);const c=document.createElement("div");c.setAttribute("class",a.classNames.scrollIndicatorButton),c.setAttribute("data-is-grabbed","false"),l.appendChild(c),s.appendChild(l);const d=()=>{s.setAttribute("data-has-overflow",n.details.hasOverflow.toString())};d();const u=()=>{const t=n.container.offsetWidth/n.container.scrollWidth;return n.container.scrollLeft*t};let f=0;const v=()=>{f&&window.cancelAnimationFrame(f),f=window.requestAnimationFrame((()=>{const t=n.container.offsetWidth/n.container.scrollWidth*100,e=u();c.style.width=`${t}%`,c.style.transform=`translateX(${e}px)`;const o=n.container.scrollLeft/(n.container.scrollWidth-n.container.offsetWidth)*100;s.setAttribute("aria-valuenow",Math.round(Number.isNaN(o)?0:o).toString())}))};a.container?a.container.appendChild(s):null===(i=n.container.parentNode)||void 0===i||i.insertBefore(s,n.container.nextSibling),v(),n.on("scroll",v),n.on("contentsChanged",v),n.on("containerSizeChanged",v),n.on("detailsChanged",d),s.addEventListener("keydown",(t=>{"ArrowLeft"===t.key?n.moveToDirection("prev"):"ArrowRight"===t.key&&n.moveToDirection("next")})),s.addEventListener("click",(t=>{const e=c.offsetWidth,o=u(),r=o+e,i=t.pageX-s.offsetLeft;ir&&n.moveToDirection("next")}));let b=!1,m=0,h=0;const p=t=>{b=!0;const e=t.pageX||t.touches[0].pageX;m=e-s.offsetLeft,h=n.container.scrollLeft,c.style.cursor="grabbing",n.container.style.scrollSnapType="none",c.setAttribute("data-is-grabbed","true"),t.preventDefault(),t.stopPropagation()},w=t=>{if(!b)return;t.preventDefault();const e=(t.pageX||t.touches[0].pageX)-s.offsetLeft,o=n.container.scrollWidth/s.offsetWidth,r=(e-m)*o;n.container.scrollLeft=h+r},g=()=>{b=!1,c.style.cursor="",n.container.style.scrollSnapType="",c.setAttribute("data-is-grabbed","false")};c.addEventListener("mousedown",p),c.addEventListener("touchstart",p),window.addEventListener("mousemove",w),window.addEventListener("touchmove",w,{passive:!1}),window.addEventListener("mouseup",g),window.addEventListener("touchend",g)}}export{e as default}; diff --git a/docs/dist/skip-links.esm.js b/docs/dist/skip-links.esm.js new file mode 100644 index 0000000..8ef9fa3 --- /dev/null +++ b/docs/dist/skip-links.esm.js @@ -0,0 +1,42 @@ +import { generateId } from './core/utils.esm.js'; + +const DEFAULT_TEXTS = { + skipList: 'Skip list' +}; +const DEFAULT_CLASS_NAMES = { + skipLink: 'screen-reader-text', + skipLinkTarget: 'overflow-slider__skip-link-target', +}; +function SkipLinksPlugin(args) { + return (slider) => { + var _a, _b, _c, _d, _e, _f; + const options = { + texts: Object.assign(Object.assign({}, DEFAULT_TEXTS), (args === null || args === void 0 ? void 0 : args.texts) || []), + classNames: Object.assign(Object.assign({}, DEFAULT_CLASS_NAMES), (args === null || args === void 0 ? void 0 : args.classNames) || []), + containerBefore: (_a = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _a !== void 0 ? _a : null, + containerAfter: (_b = args === null || args === void 0 ? void 0 : args.containerAfter) !== null && _b !== void 0 ? _b : null, + }; + const skipId = generateId('overflow-slider-skip'); + const skipLinkEl = document.createElement('a'); + skipLinkEl.setAttribute('href', `#${skipId}`); + skipLinkEl.textContent = options.texts.skipList; + skipLinkEl.classList.add(options.classNames.skipLink); + const skipTargetEl = document.createElement('div'); + skipTargetEl.setAttribute('id', skipId); + skipTargetEl.setAttribute('tabindex', '-1'); + if (options.containerBefore) { + (_c = options.containerBefore.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(skipLinkEl, options.containerBefore); + } + else { + (_d = slider.container.parentNode) === null || _d === void 0 ? void 0 : _d.insertBefore(skipLinkEl, slider.container); + } + if (options.containerAfter) { + (_e = options.containerAfter.parentNode) === null || _e === void 0 ? void 0 : _e.insertBefore(skipTargetEl, options.containerAfter.nextSibling); + } + else { + (_f = slider.container.parentNode) === null || _f === void 0 ? void 0 : _f.insertBefore(skipTargetEl, slider.container.nextSibling); + } + }; +} + +export { SkipLinksPlugin as default }; diff --git a/docs/dist/skip-links.min.js b/docs/dist/skip-links.min.js new file mode 100644 index 0000000..c85a7df --- /dev/null +++ b/docs/dist/skip-links.min.js @@ -0,0 +1 @@ +import{generateId as e}from"./core/utils.min.js";const t={skipList:"Skip list"},n={skipLink:"screen-reader-text",skipLinkTarget:"overflow-slider__skip-link-target"};function i(i){return r=>{var o,s,a,l,c,d;const u={texts:Object.assign(Object.assign({},t),(null==i?void 0:i.texts)||[]),classNames:Object.assign(Object.assign({},n),(null==i?void 0:i.classNames)||[]),containerBefore:null!==(o=null==i?void 0:i.containerAfter)&&void 0!==o?o:null,containerAfter:null!==(s=null==i?void 0:i.containerAfter)&&void 0!==s?s:null},f=e("overflow-slider-skip"),p=document.createElement("a");p.setAttribute("href",`#${f}`),p.textContent=u.texts.skipList,p.classList.add(u.classNames.skipLink);const v=document.createElement("div");v.setAttribute("id",f),v.setAttribute("tabindex","-1"),u.containerBefore?null===(a=u.containerBefore.parentNode)||void 0===a||a.insertBefore(p,u.containerBefore):null===(l=r.container.parentNode)||void 0===l||l.insertBefore(p,r.container),u.containerAfter?null===(c=u.containerAfter.parentNode)||void 0===c||c.insertBefore(v,u.containerAfter.nextSibling):null===(d=r.container.parentNode)||void 0===d||d.insertBefore(v,r.container.nextSibling)}}export{i as default}; diff --git a/package-lock.json b/package-lock.json index 8cd1439..735e4b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,13 @@ { "name": "@evermade/overflow-slider", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@evermade/overflow-slider", - "version": "1.0.0", + "version": "1.1.0", "license": "MIT", - "dependencies": { - "resize-observer-polyfill": "^1.5.1", - "scrollbooster": "^3.0.2", - "simplebar": "^6.2.5" - }, "devDependencies": { "@rollup/plugin-commonjs": "^24.0.0", "@rollup/plugin-node-resolve": "^15.0.0", @@ -54,12 +49,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -67,30 +62,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -106,9 +101,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz", - "integrity": "sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==", + "version": "7.23.10", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.10.tgz", + "integrity": "sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -124,12 +119,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -163,14 +158,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -179,17 +174,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "version": "7.23.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz", + "integrity": "sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" @@ -219,9 +214,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -293,9 +288,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -403,9 +398,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -421,9 +416,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -444,23 +439,23 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", @@ -472,9 +467,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -484,9 +479,9 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -499,14 +494,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" + "@babel/plugin-transform-optional-chaining": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -515,6 +510,22 @@ "@babel/core": "^7.13.0" } }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", @@ -591,9 +602,9 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -606,9 +617,9 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -645,9 +656,9 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -762,9 +773,9 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -793,9 +804,9 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -808,9 +819,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", - "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -826,14 +837,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" + "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -843,9 +854,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -858,9 +869,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", - "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -873,12 +884,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -889,12 +900,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -906,18 +917,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -929,13 +939,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" + "@babel/template": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -945,9 +955,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", - "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -960,12 +970,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -976,9 +986,9 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -991,9 +1001,9 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1007,12 +1017,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1023,9 +1033,9 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1039,12 +1049,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1054,13 +1065,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1071,9 +1082,9 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1087,9 +1098,9 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1102,9 +1113,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1118,9 +1129,9 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1133,12 +1144,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", - "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1149,12 +1160,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", - "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -1166,13 +1177,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", - "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", + "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20" }, @@ -1184,12 +1195,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1216,9 +1227,9 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1231,9 +1242,9 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1247,9 +1258,9 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1263,16 +1274,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", + "@babel/compat-data": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" + "@babel/plugin-transform-parameters": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1282,13 +1293,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" + "@babel/helper-replace-supers": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1298,9 +1309,9 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1314,9 +1325,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", - "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1331,9 +1342,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1346,12 +1357,12 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1362,13 +1373,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, @@ -1380,9 +1391,9 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1395,16 +1406,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", - "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.15" + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" }, "engines": { "node": ">=6.9.0" @@ -1414,9 +1425,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1430,9 +1441,9 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1445,16 +1456,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz", - "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz", + "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", "semver": "^6.3.1" }, "engines": { @@ -1465,9 +1476,9 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1480,9 +1491,9 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1496,9 +1507,9 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1511,9 +1522,9 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1526,9 +1537,9 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1541,15 +1552,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", - "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", + "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-create-class-features-plugin": "^7.23.6", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.22.5" + "@babel/plugin-syntax-typescript": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1559,9 +1570,9 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1574,12 +1585,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1590,12 +1601,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1606,12 +1617,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1622,25 +1633,26 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", - "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", + "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.2", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1652,59 +1664,58 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.23.2", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.23.0", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.23.0", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-modules-systemjs": "^7.23.0", - "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.8", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.9", + "@babel/plugin-transform-modules-umd": "^7.23.3", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.23.0", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -1730,16 +1741,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz", - "integrity": "sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", + "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-typescript": "^7.22.15" + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1755,9 +1766,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1767,34 +1778,34 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -1802,12 +1813,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -1866,9 +1877,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -1889,9 +1900,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -1904,22 +1915,22 @@ } }, "node_modules/@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -1940,9 +1951,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@jridgewell/gen-mapping": { @@ -1960,9 +1971,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1994,9 +2005,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2098,12 +2109,12 @@ } }, "node_modules/@rollup/plugin-typescript": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.5.tgz", - "integrity": "sha512-rnMHrGBB0IUEv69Q8/JGRD/n4/n6b3nfpufUu26axhUcboUzv/twfZU8fIBbTOphRAe0v8EyxzeDpKXqGHfyDA==", + "version": "11.1.6", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", + "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", "dev": true, "dependencies": { - "@rollup/pluginutils": "^5.0.1", + "@rollup/pluginutils": "^5.1.0", "resolve": "^1.22.1" }, "engines": { @@ -2124,9 +2135,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz", - "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", @@ -2161,9 +2172,9 @@ "dev": true }, "node_modules/@types/estree": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz", - "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/fs-extra": { @@ -2186,9 +2197,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { @@ -2197,19 +2208,6 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "node_modules/@types/lodash": { - "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" - }, - "node_modules/@types/lodash-es": { - "version": "4.17.12", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", - "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", - "dependencies": { - "@types/lodash": "*" - } - }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", @@ -2217,18 +2215,18 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.8.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", - "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "version": "20.11.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", + "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/parse-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", - "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "dev": true }, "node_modules/@types/resolve": { @@ -2238,9 +2236,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", + "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { @@ -2290,9 +2288,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -2434,9 +2432,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -2493,9 +2491,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -2549,9 +2547,9 @@ "dev": true }, "node_modules/@wordpress/babel-plugin-import-jsx-pragma": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/babel-plugin-import-jsx-pragma/-/babel-plugin-import-jsx-pragma-4.27.0.tgz", - "integrity": "sha512-bq/lwaDn39MrSqlrQhXiMz6gRkqlFQAXzCbZ5Q1CL6NJ+/P5tiWRTTt/oHbC/rdItm1K4XVmscobG1Rhhyc6ZA==", + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-plugin-import-jsx-pragma/-/babel-plugin-import-jsx-pragma-4.34.0.tgz", + "integrity": "sha512-DOoUJKvfUc8rdiGqcZND5lauoY4B5+cCuuHLh9AztE1t2DlQJBy6DtP6t1bUZb7BYUWOoWgRflMLtOK3ZTf0cg==", "dev": true, "engines": { "node": ">=14" @@ -2561,9 +2559,9 @@ } }, "node_modules/@wordpress/babel-preset-default": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-7.28.0.tgz", - "integrity": "sha512-ItWr4JtUbPv8HKiI8cEoakQVgB81sahhZawCVDtiNWMCuVAELk4quQibDDigljfmLCywq3rZtSwKyC/KbVnGBw==", + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-7.35.0.tgz", + "integrity": "sha512-wgZOezNvzbrJTHn0Cyt8+Si7sb5aJJ+akHOrEgvUUv576LfgWUKHPRz8Ecu1fFlupEp35r1uoQ5J+UviLWrvEg==", "dev": true, "dependencies": { "@babel/core": "^7.16.0", @@ -2572,9 +2570,9 @@ "@babel/preset-env": "^7.16.0", "@babel/preset-typescript": "^7.16.0", "@babel/runtime": "^7.16.0", - "@wordpress/babel-plugin-import-jsx-pragma": "^4.27.0", - "@wordpress/browserslist-config": "^5.27.0", - "@wordpress/warning": "^2.44.0", + "@wordpress/babel-plugin-import-jsx-pragma": "^4.34.0", + "@wordpress/browserslist-config": "^5.34.0", + "@wordpress/warning": "^2.51.0", "browserslist": "^4.21.10", "core-js": "^3.31.0", "react": "^18.2.0" @@ -2584,9 +2582,9 @@ } }, "node_modules/@wordpress/browserslist-config": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-5.27.0.tgz", - "integrity": "sha512-PDLOrlhcTPwhyMrhTy9ULoClFV0rFAoGUtXl9eXjd51U20ebvJxZzvmeGP6bfl8WkxWYyyZKeC14mjD6Yck7+A==", + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-5.34.0.tgz", + "integrity": "sha512-LafF3XoetOAN99bktOzc9hSOv7cPoQEe0/KPgiw24t77xvRqLuWww+zYbiHAHYSzdBGngrlNwRLgloSifnp+hg==", "dev": true, "engines": { "node": ">=14" @@ -2635,9 +2633,9 @@ } }, "node_modules/@wordpress/eslint-plugin/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2650,9 +2648,9 @@ } }, "node_modules/@wordpress/prettier-config": { - "version": "2.25.10", - "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-2.25.10.tgz", - "integrity": "sha512-hK9wsyKvZd/gTBbc4fl7hMGICkeAjPzIoQAcz8o1AN1eXL2uJKpgmXvxwoTfjGKNbrfQfwRkL/XGJEx426MY9w==", + "version": "2.25.13", + "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-2.25.13.tgz", + "integrity": "sha512-iz58o0X91E24j0VFtzwn5qG84w+s4VlRCuZWa/lPL6pfGtOSw30c60wCrYKCA1IWIIAWdpRAYfEh7errPyKiPQ==", "dev": true, "engines": { "node": ">=14" @@ -2662,18 +2660,18 @@ } }, "node_modules/@wordpress/warning": { - "version": "2.44.0", - "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-2.44.0.tgz", - "integrity": "sha512-ZtLmd0NbPoXAMgB356ERTULx6LhHfkhyWai4/u9I3pZdt8cbhRHBXV7lBB580+wN7otyD1IHiC3dzYlg/9ByyA==", + "version": "2.51.0", + "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-2.51.0.tgz", + "integrity": "sha512-e+YbsQY4o/nTY0gT5Rr5766wU2xzwL5m/8S1HET9wBaeCRoZR/0IKyTOvPfihW13uT6FayBne3rqwT/h6F8w6Q==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2757,13 +2755,16 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2797,17 +2798,36 @@ "node": ">=8" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "node_modules/array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2853,30 +2873,31 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -2887,9 +2908,9 @@ } }, "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, "node_modules/asynciterator.prototype": { @@ -2939,10 +2960,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -2951,9 +2975,9 @@ } }, "node_modules/axe-core": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", - "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "dev": true, "engines": { "node": ">=4" @@ -2969,13 +2993,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", + "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", + "@babel/helper-define-polyfill-provider": "^0.5.0", "semver": "^6.3.1" }, "peerDependencies": { @@ -2983,25 +3007,25 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", - "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.33.1" + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3" + "@babel/helper-define-polyfill-provider": "^0.5.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3051,9 +3075,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -3070,8 +3094,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -3101,14 +3125,19 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3123,11 +3152,6 @@ "node": ">=6" } }, - "node_modules/can-use-dom": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz", - "integrity": "sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ==" - }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -3141,9 +3165,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001583", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001583.tgz", - "integrity": "sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q==", + "version": "1.0.30001588", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz", + "integrity": "sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==", "dev": true, "funding": [ { @@ -3175,16 +3199,10 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -3197,6 +3215,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -3241,10 +3262,13 @@ "dev": true }, "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } }, "node_modules/comment-parser": { "version": "1.3.1", @@ -3283,9 +3307,9 @@ "dev": true }, "node_modules/core-js": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz", - "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz", + "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==", "dev": true, "hasInstallScript": true, "funding": { @@ -3294,12 +3318,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", - "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", + "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", "dev": true, "dependencies": { - "browserslist": "^4.22.1" + "browserslist": "^4.22.3" }, "funding": { "type": "opencollective", @@ -3548,17 +3572,20 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -3667,9 +3694,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.655", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.655.tgz", - "integrity": "sha512-2yszojF7vIZ68adIOvzV4bku8OZad9w5H9xF3ZAMZjPuOjBarlflUkjN6DggdV+L71WZuKUfKUhov/34+G5QHg==", + "version": "1.4.676", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.676.tgz", + "integrity": "sha512-uHt4FB8SeYdhcOsj2ix/C39S7sPSNFJpzShjxGOm1KdF4MHyGqGi389+T5cErsodsijojXilYaHIKKqJfqh7uQ==", "dev": true }, "node_modules/emoji-regex": { @@ -3700,50 +3727,52 @@ } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", + "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", + "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.8", "string.prototype.trimend": "^1.0.7", "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", + "typed-array-buffer": "^1.0.1", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -3752,26 +3781,57 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", "dev": true, "dependencies": { "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", + "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", + "internal-slot": "^1.0.7", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "safe-array-concat": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-set-tostringtag": { @@ -3815,9 +3875,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -3833,15 +3893,15 @@ } }, "node_modules/eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -3946,9 +4006,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { "array-includes": "^3.1.7", @@ -3967,7 +4027,7 @@ "object.groupby": "^1.0.1", "object.values": "^1.1.7", "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -3998,9 +4058,9 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "27.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz", - "integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==", + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", "dev": true, "dependencies": { "@typescript-eslint/utils": "^5.10.0" @@ -4009,7 +4069,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0", + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", "eslint": "^7.0.0 || ^8.0.0", "jest": "*" }, @@ -4068,9 +4128,9 @@ } }, "node_modules/eslint-plugin-jsdoc/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4089,27 +4149,27 @@ "dev": true }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", "dev": true, "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" }, "engines": { "node": ">=4.0" @@ -4331,9 +4391,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -4462,9 +4522,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -4502,9 +4562,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -4551,9 +4611,9 @@ } }, "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { "flatted": "^3.2.9", @@ -4561,13 +4621,13 @@ "rimraf": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.0.tgz", + "integrity": "sha512-noqGuLw158+DuD9UPRKHpJ2hGxpFyDlYYrfM0mWt4XhT4n0lwzTLh70Tkdyy4kyTmyTT9Bv7bWAJqw7cgkEXDg==", "dev": true }, "node_modules/for-each": { @@ -4681,28 +4741,33 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -4831,15 +4896,6 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -4859,21 +4915,21 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -4895,12 +4951,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -4910,9 +4966,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", "dev": true, "dependencies": { "function-bind": "^1.1.2" @@ -4940,9 +4996,9 @@ } }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -5029,12 +5085,12 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -5043,14 +5099,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5235,9 +5293,9 @@ "dev": true }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -5365,12 +5423,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -5588,12 +5646,15 @@ "dev": true }, "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, "dependencies": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/levn": { @@ -5610,12 +5671,15 @@ } }, "node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", "dev": true, "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/lines-and-columns": { @@ -5648,16 +5712,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -5889,13 +5943,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -5938,15 +5992,16 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" } }, "node_modules/object.hasown": { @@ -6174,10 +6229,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, "funding": [ { @@ -6755,9 +6819,9 @@ } }, "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "peer": true, "bin": { @@ -6871,15 +6935,16 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -6909,9 +6974,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "dev": true }, "node_modules/regenerator-transform": { @@ -6924,14 +6989,15 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -6987,11 +7053,6 @@ "node": ">=0.10.5" } }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -7209,15 +7270,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/rollup-plugin-postcss/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/rollup-plugin-postcss/node_modules/css-declaration-sorter": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", @@ -7932,13 +7984,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -7976,23 +8028,26 @@ "dev": true }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/sass": { - "version": "1.70.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", - "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==", + "version": "1.71.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.0.tgz", + "integrity": "sha512-HKKIKf49Vkxlrav3F/w6qRuPcmImGVbIXJ2I3Kg0VMA+3Bav+8yE9G5XmP5lMj6nl4OlqbPftGAscNaNu28b8w==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -8006,11 +8061,6 @@ "node": ">=14.0.0" } }, - "node_modules/scrollbooster": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/scrollbooster/-/scrollbooster-3.0.2.tgz", - "integrity": "sha512-WZjvtSxCgCEbfc+9DmxfhuK6ACOqQr3jymniIp4I9Hh0mIEK1CKS4t+d7iPdeuILP5Q/we13h4YUHD0o+gPiRg==" - }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -8030,29 +8080,32 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", "dev": true, "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -8080,39 +8133,23 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/simplebar": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/simplebar/-/simplebar-6.2.5.tgz", - "integrity": "sha512-vfxKR6KNBsPx7+sZnqO7T8VuCvi4px6OlycrrkNgyjvoHhRW7LIyVkHhUfXxbz33Gw99Wb9UMMsnEZv35wtLSw==", - "dependencies": { - "can-use-dom": "^0.1.0", - "simplebar-core": "^1.2.4" - } - }, - "node_modules/simplebar-core": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/simplebar-core/-/simplebar-core-1.2.4.tgz", - "integrity": "sha512-P+Sqshef4fq3++gQ82TgNYcgl3qZFSCP5jS2/8NMmw18oagXOijMzs1G+vm6RUY3oMvpwH3wGoqh9u6SyDjHfQ==", - "dependencies": { - "@types/lodash-es": "^4.17.6", - "can-use-dom": "^0.1.0", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -8151,9 +8188,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true }, "node_modules/spdx-expression-parse": { @@ -8167,9 +8204,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", "dev": true }, "node_modules/stable": { @@ -8354,19 +8391,10 @@ "url": "https://opencollective.com/svgo" } }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", + "version": "5.27.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.2.tgz", + "integrity": "sha512-sHXmLSkImesJ4p5apTeT63DsV4Obe1s37qT8qvwHRmVxKTBH7Rv9Wr26VcAMmLbmk9UliiwK8z+657NyJHHy/w==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -8381,6 +8409,12 @@ "node": ">=10" } }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -8409,9 +8443,9 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", @@ -8478,14 +8512,14 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -8510,16 +8544,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -8529,23 +8564,29 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -8743,16 +8784,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -8813,37 +8854,37 @@ } }, "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "requires": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" } }, "@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true }, "@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -8852,9 +8893,9 @@ } }, "@babel/eslint-parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz", - "integrity": "sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==", + "version": "7.23.10", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.10.tgz", + "integrity": "sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw==", "dev": true, "requires": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -8863,12 +8904,12 @@ } }, "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "requires": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -8893,30 +8934,30 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "version": "7.23.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz", + "integrity": "sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" @@ -8934,9 +8975,9 @@ } }, "@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.22.6", @@ -8990,9 +9031,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.22.20", @@ -9067,9 +9108,9 @@ } }, "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true }, "@babel/helper-validator-identifier": { @@ -9079,9 +9120,9 @@ "dev": true }, "@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true }, "@babel/helper-wrap-function": { @@ -9096,20 +9137,20 @@ } }, "@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, "requires": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" } }, "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.22.20", @@ -9118,29 +9159,39 @@ } }, "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" + "@babel/plugin-transform-optional-chaining": "^7.23.3" + } + }, + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-proposal-private-property-in-object": { @@ -9196,18 +9247,18 @@ } }, "@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" @@ -9232,9 +9283,9 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" @@ -9313,9 +9364,9 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" @@ -9332,18 +9383,18 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", - "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.22.20", @@ -9353,114 +9404,113 @@ } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" + "@babel/helper-remap-async-to-generator": "^7.22.20" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", - "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" + "@babel/template": "^7.22.15" } }, "@babel/plugin-transform-destructuring": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", - "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -9468,19 +9518,19 @@ } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -9488,29 +9538,30 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" } }, "@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -9518,18 +9569,18 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -9537,54 +9588,54 @@ } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", - "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", - "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", - "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", + "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" } }, @@ -9599,18 +9650,18 @@ } }, "@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -9618,9 +9669,9 @@ } }, "@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -9628,32 +9679,32 @@ } }, "@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", "dev": true, "requires": { - "@babel/compat-data": "^7.22.9", + "@babel/compat-data": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" + "@babel/plugin-transform-parameters": "^7.23.3" } }, "@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" + "@babel/helper-replace-supers": "^7.22.20" } }, "@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -9661,9 +9712,9 @@ } }, "@babel/plugin-transform-optional-chaining": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", - "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -9672,62 +9723,62 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", - "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.15" + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" } }, "@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -9735,41 +9786,41 @@ } }, "@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz", - "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz", + "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", "semver": "^6.3.1" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", @@ -9777,103 +9828,104 @@ } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-typescript": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", - "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", + "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-create-class-features-plugin": "^7.23.6", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.22.5" + "@babel/plugin-syntax-typescript": "^7.23.3" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/preset-env": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", - "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", + "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", "dev": true, "requires": { - "@babel/compat-data": "^7.23.2", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -9885,59 +9937,58 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.23.2", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.23.0", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.23.0", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-modules-systemjs": "^7.23.0", - "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.8", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.9", + "@babel/plugin-transform-modules-umd": "^7.23.3", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.23.0", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", "core-js-compat": "^3.31.0", "semver": "^6.3.1" } @@ -9954,16 +10005,16 @@ } }, "@babel/preset-typescript": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz", - "integrity": "sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", + "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-typescript": "^7.22.15" + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" } }, "@babel/regjsgen": { @@ -9973,50 +10024,50 @@ "dev": true }, "@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", "dev": true, "requires": { "regenerator-runtime": "^0.14.0" } }, "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" } }, "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } @@ -10056,9 +10107,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -10073,9 +10124,9 @@ }, "dependencies": { "globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -10084,19 +10135,19 @@ } }, "@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true }, "@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" } }, @@ -10107,9 +10158,9 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "@jridgewell/gen-mapping": { @@ -10124,9 +10175,9 @@ } }, "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true }, "@jridgewell/set-array": { @@ -10152,9 +10203,9 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.1.0", @@ -10225,19 +10276,19 @@ } }, "@rollup/plugin-typescript": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.5.tgz", - "integrity": "sha512-rnMHrGBB0IUEv69Q8/JGRD/n4/n6b3nfpufUu26axhUcboUzv/twfZU8fIBbTOphRAe0v8EyxzeDpKXqGHfyDA==", + "version": "11.1.6", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", + "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", "dev": true, "requires": { - "@rollup/pluginutils": "^5.0.1", + "@rollup/pluginutils": "^5.1.0", "resolve": "^1.22.1" } }, "@rollup/pluginutils": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz", - "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", "dev": true, "requires": { "@types/estree": "^1.0.0", @@ -10258,9 +10309,9 @@ "dev": true }, "@types/estree": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz", - "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "@types/fs-extra": { @@ -10283,9 +10334,9 @@ } }, "@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "@types/json5": { @@ -10294,19 +10345,6 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "@types/lodash": { - "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" - }, - "@types/lodash-es": { - "version": "4.17.12", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", - "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", - "requires": { - "@types/lodash": "*" - } - }, "@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", @@ -10314,18 +10352,18 @@ "dev": true }, "@types/node": { - "version": "20.8.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", - "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "version": "20.11.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", + "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", "dev": true, "requires": { "undici-types": "~5.26.4" } }, "@types/parse-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", - "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "dev": true }, "@types/resolve": { @@ -10335,9 +10373,9 @@ "dev": true }, "@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", + "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", "dev": true }, "@typescript-eslint/eslint-plugin": { @@ -10368,9 +10406,9 @@ } }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -10449,9 +10487,9 @@ } }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -10491,9 +10529,9 @@ } }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -10532,16 +10570,16 @@ "dev": true }, "@wordpress/babel-plugin-import-jsx-pragma": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/babel-plugin-import-jsx-pragma/-/babel-plugin-import-jsx-pragma-4.27.0.tgz", - "integrity": "sha512-bq/lwaDn39MrSqlrQhXiMz6gRkqlFQAXzCbZ5Q1CL6NJ+/P5tiWRTTt/oHbC/rdItm1K4XVmscobG1Rhhyc6ZA==", + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-plugin-import-jsx-pragma/-/babel-plugin-import-jsx-pragma-4.34.0.tgz", + "integrity": "sha512-DOoUJKvfUc8rdiGqcZND5lauoY4B5+cCuuHLh9AztE1t2DlQJBy6DtP6t1bUZb7BYUWOoWgRflMLtOK3ZTf0cg==", "dev": true, "requires": {} }, "@wordpress/babel-preset-default": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-7.28.0.tgz", - "integrity": "sha512-ItWr4JtUbPv8HKiI8cEoakQVgB81sahhZawCVDtiNWMCuVAELk4quQibDDigljfmLCywq3rZtSwKyC/KbVnGBw==", + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-7.35.0.tgz", + "integrity": "sha512-wgZOezNvzbrJTHn0Cyt8+Si7sb5aJJ+akHOrEgvUUv576LfgWUKHPRz8Ecu1fFlupEp35r1uoQ5J+UviLWrvEg==", "dev": true, "requires": { "@babel/core": "^7.16.0", @@ -10550,18 +10588,18 @@ "@babel/preset-env": "^7.16.0", "@babel/preset-typescript": "^7.16.0", "@babel/runtime": "^7.16.0", - "@wordpress/babel-plugin-import-jsx-pragma": "^4.27.0", - "@wordpress/browserslist-config": "^5.27.0", - "@wordpress/warning": "^2.44.0", + "@wordpress/babel-plugin-import-jsx-pragma": "^4.34.0", + "@wordpress/browserslist-config": "^5.34.0", + "@wordpress/warning": "^2.51.0", "browserslist": "^4.21.10", "core-js": "^3.31.0", "react": "^18.2.0" } }, "@wordpress/browserslist-config": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-5.27.0.tgz", - "integrity": "sha512-PDLOrlhcTPwhyMrhTy9ULoClFV0rFAoGUtXl9eXjd51U20ebvJxZzvmeGP6bfl8WkxWYyyZKeC14mjD6Yck7+A==", + "version": "5.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-5.34.0.tgz", + "integrity": "sha512-LafF3XoetOAN99bktOzc9hSOv7cPoQEe0/KPgiw24t77xvRqLuWww+zYbiHAHYSzdBGngrlNwRLgloSifnp+hg==", "dev": true }, "@wordpress/eslint-plugin": { @@ -10589,9 +10627,9 @@ }, "dependencies": { "globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -10600,22 +10638,22 @@ } }, "@wordpress/prettier-config": { - "version": "2.25.10", - "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-2.25.10.tgz", - "integrity": "sha512-hK9wsyKvZd/gTBbc4fl7hMGICkeAjPzIoQAcz8o1AN1eXL2uJKpgmXvxwoTfjGKNbrfQfwRkL/XGJEx426MY9w==", + "version": "2.25.13", + "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-2.25.13.tgz", + "integrity": "sha512-iz58o0X91E24j0VFtzwn5qG84w+s4VlRCuZWa/lPL6pfGtOSw30c60wCrYKCA1IWIIAWdpRAYfEh7errPyKiPQ==", "dev": true, "requires": {} }, "@wordpress/warning": { - "version": "2.44.0", - "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-2.44.0.tgz", - "integrity": "sha512-ZtLmd0NbPoXAMgB356ERTULx6LhHfkhyWai4/u9I3pZdt8cbhRHBXV7lBB580+wN7otyD1IHiC3dzYlg/9ByyA==", + "version": "2.51.0", + "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-2.51.0.tgz", + "integrity": "sha512-e+YbsQY4o/nTY0gT5Rr5766wU2xzwL5m/8S1HET9wBaeCRoZR/0IKyTOvPfihW13uT6FayBne3rqwT/h6F8w6Q==", "dev": true }, "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true }, "acorn-jsx": { @@ -10678,13 +10716,13 @@ } }, "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" } }, "array-includes": { @@ -10706,17 +10744,30 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" } }, "array.prototype.flat": { @@ -10744,37 +10795,38 @@ } }, "array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" } }, "arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" } }, "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, "asynciterator.prototype": { @@ -10801,15 +10853,18 @@ } }, "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } }, "axe-core": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", - "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "dev": true }, "axobject-query": { @@ -10822,33 +10877,33 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", + "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", "dev": true, "requires": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", + "@babel/helper-define-polyfill-provider": "^0.5.0", "semver": "^6.3.1" } }, "babel-plugin-polyfill-corejs3": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", - "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.33.1" + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.3" + "@babel/helper-define-polyfill-provider": "^0.5.0" } }, "balanced-match": { @@ -10889,13 +10944,13 @@ } }, "browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" } @@ -10913,14 +10968,16 @@ "dev": true }, "call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "callsites": { @@ -10929,11 +10986,6 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "can-use-dom": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz", - "integrity": "sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ==" - }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -10947,9 +10999,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001583", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001583.tgz", - "integrity": "sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q==", + "version": "1.0.30001588", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz", + "integrity": "sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==", "dev": true }, "chalk": { @@ -10964,9 +11016,9 @@ } }, "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "requires": { "anymatch": "~3.1.2", @@ -11018,9 +11070,9 @@ "dev": true }, "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true }, "comment-parser": { @@ -11057,18 +11109,18 @@ "dev": true }, "core-js": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz", - "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz", + "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==", "dev": true }, "core-js-compat": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", - "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", + "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", "dev": true, "requires": { - "browserslist": "^4.22.1" + "browserslist": "^4.22.3" } }, "cosmiconfig": { @@ -11246,14 +11298,14 @@ "dev": true }, "define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" } }, "define-properties": { @@ -11329,9 +11381,9 @@ } }, "electron-to-chromium": { - "version": "1.4.655", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.655.tgz", - "integrity": "sha512-2yszojF7vIZ68adIOvzV4bku8OZad9w5H9xF3ZAMZjPuOjBarlflUkjN6DggdV+L71WZuKUfKUhov/34+G5QHg==", + "version": "1.4.676", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.676.tgz", + "integrity": "sha512-uHt4FB8SeYdhcOsj2ix/C39S7sPSNFJpzShjxGOm1KdF4MHyGqGi389+T5cErsodsijojXilYaHIKKqJfqh7uQ==", "dev": true }, "emoji-regex": { @@ -11356,72 +11408,96 @@ } }, "es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", + "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", + "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.8", "string.prototype.trimend": "^1.0.7", "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", + "typed-array-buffer": "^1.0.1", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.14" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" } }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, "es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", "dev": true, "requires": { "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", + "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", + "internal-slot": "^1.0.7", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "safe-array-concat": "^1.1.0" } }, "es-set-tostringtag": { @@ -11456,9 +11532,9 @@ } }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true }, "escape-string-regexp": { @@ -11468,15 +11544,15 @@ "dev": true }, "eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -11570,9 +11646,9 @@ "dev": true }, "globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -11645,9 +11721,9 @@ } }, "eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "requires": { "array-includes": "^3.1.7", @@ -11666,7 +11742,7 @@ "object.groupby": "^1.0.1", "object.values": "^1.1.7", "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "tsconfig-paths": "^3.15.0" }, "dependencies": { "debug": { @@ -11690,9 +11766,9 @@ } }, "eslint-plugin-jest": { - "version": "27.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz", - "integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==", + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", "dev": true, "requires": { "@typescript-eslint/utils": "^5.10.0" @@ -11729,9 +11805,9 @@ } }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -11746,27 +11822,27 @@ } }, "eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", "dev": true, "requires": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" } }, "eslint-plugin-prettier": { @@ -11929,9 +12005,9 @@ "dev": true }, "fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -11965,9 +12041,9 @@ "dev": true }, "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -12002,9 +12078,9 @@ } }, "flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "requires": { "flatted": "^3.2.9", @@ -12013,9 +12089,9 @@ } }, "flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.0.tgz", + "integrity": "sha512-noqGuLw158+DuD9UPRKHpJ2hGxpFyDlYYrfM0mWt4XhT4n0lwzTLh70Tkdyy4kyTmyTT9Bv7bWAJqw7cgkEXDg==", "dev": true }, "for-each": { @@ -12097,11 +12173,12 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "requires": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", @@ -12109,13 +12186,14 @@ } }, "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" } }, "glob": { @@ -12210,12 +12288,6 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true - }, "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -12229,18 +12301,18 @@ "dev": true }, "has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "requires": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" } }, "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true }, "has-symbols": { @@ -12250,18 +12322,18 @@ "dev": true }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" } }, "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", "dev": true, "requires": { "function-bind": "^1.1.2" @@ -12281,9 +12353,9 @@ "requires": {} }, "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true }, "immutable": { @@ -12351,25 +12423,24 @@ "dev": true }, "internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "requires": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" } }, "is-arrayish": { @@ -12494,9 +12565,9 @@ "dev": true }, "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true }, "is-number": { @@ -12579,12 +12650,12 @@ } }, "is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "requires": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" } }, "is-weakmap": { @@ -12759,12 +12830,12 @@ "dev": true }, "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, "requires": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" } }, "levn": { @@ -12778,9 +12849,9 @@ } }, "lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", "dev": true }, "lines-and-columns": { @@ -12804,16 +12875,6 @@ "p-locate": "^5.0.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -12991,13 +13052,13 @@ "dev": true }, "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } @@ -13025,15 +13086,16 @@ } }, "object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" } }, "object.hasown": { @@ -13192,10 +13254,16 @@ "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "dev": true }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, "postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, "peer": true, "requires": { @@ -13547,9 +13615,9 @@ "dev": true }, "prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "peer": true }, @@ -13625,15 +13693,16 @@ } }, "reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" } @@ -13654,9 +13723,9 @@ } }, "regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "dev": true }, "regenerator-transform": { @@ -13669,14 +13738,15 @@ } }, "regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" } }, "regexpu-core": { @@ -13716,11 +13786,6 @@ "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", "dev": true }, - "resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, "resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -13878,12 +13943,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, "css-declaration-sorter": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", @@ -14359,13 +14418,13 @@ } }, "safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "has-symbols": "^1.0.3", "isarray": "^2.0.5" } @@ -14383,20 +14442,20 @@ "dev": true }, "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" } }, "sass": { - "version": "1.70.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", - "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==", + "version": "1.71.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.0.tgz", + "integrity": "sha512-HKKIKf49Vkxlrav3F/w6qRuPcmImGVbIXJ2I3Kg0VMA+3Bav+8yE9G5XmP5lMj6nl4OlqbPftGAscNaNu28b8w==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -14404,11 +14463,6 @@ "source-map-js": ">=0.6.2 <2.0.0" } }, - "scrollbooster": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/scrollbooster/-/scrollbooster-3.0.2.tgz", - "integrity": "sha512-WZjvtSxCgCEbfc+9DmxfhuK6ACOqQr3jymniIp4I9Hh0mIEK1CKS4t+d7iPdeuILP5Q/we13h4YUHD0o+gPiRg==" - }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -14425,26 +14479,29 @@ } }, "set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", "dev": true, "requires": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" } }, "set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "requires": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" } }, "shebang-command": { @@ -14463,34 +14520,15 @@ "dev": true }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "simplebar": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/simplebar/-/simplebar-6.2.5.tgz", - "integrity": "sha512-vfxKR6KNBsPx7+sZnqO7T8VuCvi4px6OlycrrkNgyjvoHhRW7LIyVkHhUfXxbz33Gw99Wb9UMMsnEZv35wtLSw==", - "requires": { - "can-use-dom": "^0.1.0", - "simplebar-core": "^1.2.4" - } - }, - "simplebar-core": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/simplebar-core/-/simplebar-core-1.2.4.tgz", - "integrity": "sha512-P+Sqshef4fq3++gQ82TgNYcgl3qZFSCP5jS2/8NMmw18oagXOijMzs1G+vm6RUY3oMvpwH3wGoqh9u6SyDjHfQ==", - "requires": { - "@types/lodash-es": "^4.17.6", - "can-use-dom": "^0.1.0", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "slash": { @@ -14522,9 +14560,9 @@ } }, "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true }, "spdx-expression-parse": { @@ -14538,9 +14576,9 @@ } }, "spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", "dev": true }, "stable": { @@ -14670,26 +14708,26 @@ "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.0.0" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } } }, "terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", + "version": "5.27.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.2.tgz", + "integrity": "sha512-sHXmLSkImesJ4p5apTeT63DsV4Obe1s37qT8qvwHRmVxKTBH7Rv9Wr26VcAMmLbmk9UliiwK8z+657NyJHHy/w==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } } }, "text-table": { @@ -14714,9 +14752,9 @@ } }, "tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "requires": { "@types/json5": "^0.0.29", @@ -14767,14 +14805,14 @@ "dev": true }, "typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" } }, "typed-array-byte-length": { @@ -14790,33 +14828,37 @@ } }, "typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" } }, "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", "dev": true, "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" } }, "typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true }, "unbox-primitive": { @@ -14951,16 +14993,16 @@ } }, "which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.1" } }, "wrappy": { diff --git a/package.json b/package.json index 98c6fc1..5fe0d0c 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,17 @@ { "name": "@evermade/overflow-slider", - "version": "1.1.0", + "version": "2.0.0", "description": "Accessible slider tha works with overflow: auto.", "type": "module", "main": "dist/index.js", "module": "dist/index.esm.js", "types": "dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.esm.js", + "require": "./dist/index.js" + } + }, "repository": { "type": "git", "url": "git+https://github.com/evermade/overflow-slider.git" @@ -46,10 +52,5 @@ "homepage": "https://github.com/evermade/overflow-slider#readme", "publishConfig": { "access": "public" - }, - "dependencies": { - "resize-observer-polyfill": "^1.5.1", - "scrollbooster": "^3.0.2", - "simplebar": "^6.2.5" } } diff --git a/rollup.config.js b/rollup.config.js index 5fced08..83a5e0e 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,45 +1,71 @@ import { terser } from 'rollup-plugin-terser'; -import pkg from './package.json'; import { nodeResolve } from '@rollup/plugin-node-resolve'; import commonjs from '@rollup/plugin-commonjs'; import typescript from '@rollup/plugin-typescript'; import postcss from 'rollup-plugin-postcss'; import copy from 'rollup-plugin-copy'; +import glob from 'glob'; -const umd = { format: 'umd', name: 'OverflowSlider', exports: 'named' }; -const es = { format: 'es' }; -const minify = { - plugins: [terser()], - banner: () => `/*! ${pkg.name} ${pkg.version} */`, -}; - -export default { - input: 'src/index.ts', - output: [ - // Main files - { file: 'dist/index.js', ...umd }, - { file: 'dist/index.esm.js', ...es }, - { file: 'docs/dist/overflow-slider.esm.js', ...es }, - // Minified versions - { file: 'dist/index.min.js', ...umd, ...minify }, - { file: 'dist/index.esm.min.js', ...es, ...minify }, - ], - plugins: [ +const plugins = [ typescript(), nodeResolve(), commonjs({ include: 'node_modules/**' }), postcss({ - extract: true, - extract: 'overflow-slider.css', - plugins: [ - require('autoprefixer'), - require('cssnano')({ - preset: 'default', - }), - ], - minimize: true, - sourceMap: false, - extensions: ['.scss', '.css'], + extract: 'overflow-slider.css', + plugins: [ + require('autoprefixer'), + require('cssnano')({ preset: 'default', }), + ], + minimize: true, + sourceMap: false, + extensions: ['.scss', '.css'], }), - ], + copy({ + targets: [ + { + src: 'dist/*', + dest: 'docs/dist', + }, + ], + hook: 'writeBundle' + }) +]; + +// Adjusting here to include the core file +const pluginEntries = { + index: 'src/index.ts', // Adding the core file + ...glob.sync('src/plugins/**/*.ts').reduce((entries, path) => { + const name = path.replace(/^src\/plugins\//, '').replace(/\.ts$/, ''); + entries[name] = path; + return entries; + }, {}), }; + +const baseOutput = { + preserveModules: true, + preserveModulesRoot: 'src/plugins', +}; + +export default [ + { + input: pluginEntries, + output: { + ...baseOutput, + dir: 'dist', + format: 'es', + entryFileNames: '[name].esm.js', + }, + plugins, + }, + { + input: pluginEntries, + output: { + ...baseOutput, + dir: 'dist', + format: 'es', + entryFileNames: '[name].min.js', + plugins: [terser()], + }, + plugins, + }, +]; diff --git a/src/index.ts b/src/index.ts index 32c0596..a13d146 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,17 +2,6 @@ import './overflow-slider.scss'; import OverflowSlider from './overflow-slider'; -import SkipLinksPlugin from './plugins/skip-links'; -import ArrowsPlugin from './plugins/arrows'; -import ScrollIndicatorPlugin from './plugins/scroll-indicator'; -import DragScrollingPlugin from './plugins/drag-scrolling'; -import DotsPlugin from './plugins/dots'; - export { OverflowSlider, - DragScrollingPlugin, - SkipLinksPlugin, - ArrowsPlugin, - ScrollIndicatorPlugin, - DotsPlugin }; diff --git a/tsconfig.json b/tsconfig.json index f04f142..4c52864 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,18 @@ { "extends": "@tsconfig/recommended/tsconfig.json", "compilerOptions": { - "jsx": "react" - } + "target": "es6", + "module": "ESNext", + "jsx": "react", + "moduleResolution": "node", + "sourceMap": false + }, + "include": [ + "src/**/*" + ], + "exclude": [ + "node_modules", + "dist", + "**/*.spec.ts" + ] }