diff --git a/.eslintrc.json b/.eslintrc.json index 122076d..222d475 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,23 +1,54 @@ { - "env": { - "browser": true, - "es2021": true - }, - "extends": [ - "standard-with-typescript", - "prettier" + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "standard-with-typescript", + "prettier", + "eslint:recommended", + "plugin:prettier/recommended", + "plugin:@typescript-eslint/recommended" + ], + "overrides": [], + "plugins": ["prettier", "@typescript-eslint"], + "parserOptions": { + "ecmaVersion": "latest", + "project": "./tsconfig.json", + "sourceType": "module" + }, + "rules": { + "prettier/prettier": "error", + "arrow-body-style": "off", + "prefer-arrow-callback": "off", + "sort-imports": [ + "error", + { + "ignoreCase": false, + "ignoreDeclarationSort": true, + "ignoreMemberSort": false, + "memberSyntaxSortOrder": ["none", "all", "multiple", "single"], + "allowSeparatedGroups": true + } ], - "overrides": [ - ], - "plugins": ["prettier"], - "parserOptions": { - "ecmaVersion": "latest", - "project": "./tsconfig.json", - "sourceType": "module" - }, - "rules": { - "prettier/prettier": "error", - "arrow-body-style": "off", - "prefer-arrow-callback": "off" + "import/no-unresolved": "error", + "import/order": [ + "error", + { + "groups": ["builtin", "external", "internal", "parent", "sibling", "index"], + "newlines-between": "always", + "alphabetize": { + "order": "asc", + "caseInsensitive": true + } + } + ] + }, + "settings": { + "import/resolver": { + "typescript": { + "project": "./tsconfig.json" + } } + } } diff --git a/.prettierrc.json b/.prettierrc.json index 263da8b..78d451e 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -6,7 +6,7 @@ "trailingComma": "none", "bracketSpacing": true, "semi": false, - "plugins": ["prettier-plugin-go-template"], + "plugins": ["prettier-plugin-go-template", "prettier-plugin-organize-imports"], "overrides": [ { "files": ["*.html"], diff --git a/assets/css/_partial/_customCursor.scss b/assets/css/_partial/_customCursor.scss deleted file mode 100644 index 591c8f5..0000000 --- a/assets/css/_partial/_customCursor.scss +++ /dev/null @@ -1,21 +0,0 @@ -.cursor { - position: fixed; - z-index: var(--z-cursor); - top: 0; - left: 0; - - display: none; - cursor: none; - pointer-events: none; - - color: white; - mix-blend-mode: difference; -} - -.active { - display: block; -} - -.cursorInner { - transform: translate3d(-50%, -50%, 0); -} diff --git a/assets/css/_core/_base.scss b/assets/scss/_core/_base.scss similarity index 100% rename from assets/css/_core/_base.scss rename to assets/scss/_core/_base.scss diff --git a/assets/scss/_core/_font.scss b/assets/scss/_core/_font.scss new file mode 100644 index 0000000..397038e --- /dev/null +++ b/assets/scss/_core/_font.scss @@ -0,0 +1,6 @@ +@font-face { + font-family: HelveticaNow; + src: url('/fonts/HelveticaNowText-Regular.woff') format('woff'); + font-weight: 400; + font-style: normal; +} diff --git a/assets/scss/_core/_mixins.scss b/assets/scss/_core/_mixins.scss new file mode 100644 index 0000000..d818128 --- /dev/null +++ b/assets/scss/_core/_mixins.scss @@ -0,0 +1,28 @@ +$breakpoints: ( + 'mobile': 375px, + 'tablet': 768px, + 'laptop': 1024px, + 'desktop': 1440px +) !default; + +// Breakpoints + +@mixin min-width($breakpoint) { + @if map-has-key($breakpoints, $breakpoint) { + @media (min-width: map-get($breakpoints, $breakpoint)) { + @content; + } + } @else { + @error "Unfortunately, no value could be retrieved from `#{$breakpoint}`. " + "Available breakpoints are: #{map-keys($breakpoints)}."; + } +} + +@mixin max-width($breakpoint) { + @if map-has-key($breakpoints, $breakpoint) { + @media (max-width: (map-get($breakpoints, $breakpoint) - 1px)) { + @content; + } + } @else { + @error "Unfortunately, no value could be retrieved from `#{$breakpoint}`. " + "Available breakpoints are: #{map-keys($breakpoints)}."; + } +} diff --git a/assets/scss/_core/_reset.scss b/assets/scss/_core/_reset.scss new file mode 100644 index 0000000..4070fab --- /dev/null +++ b/assets/scss/_core/_reset.scss @@ -0,0 +1,109 @@ +/*** + The new CSS reset - version 1.11.1 (last updated 24.10.2023) + GitHub page: https://github.com/elad2412/the-new-css-reset +***/ + +/* + Remove all the styles of the "User-Agent-Stylesheet", except for the 'display' property + - The "symbol *" part is to solve Firefox SVG sprite bug + - The "html" element is excluded, otherwise a bug in Chrome breaks the CSS hyphens property (https://github.com/elad2412/the-new-css-reset/issues/36) + */ +*:where(:not(html, iframe, canvas, img, svg, video, audio):not(svg *, symbol *)) { + all: unset; + display: revert; +} + +/* Preferred box-sizing value */ +*, +*::before, +*::after { + box-sizing: border-box; +} + +/* Fix mobile Safari increase font-size on landscape mode */ +html { + -moz-text-size-adjust: none; + -webkit-text-size-adjust: none; + text-size-adjust: none; +} + +/* Reapply the pointer cursor for anchor tags */ +a, +button { + cursor: revert; +} + +/* Remove list styles (bullets/numbers) */ +ol, +ul, +menu, +summary { + list-style: none; +} + +/* For images to not be able to exceed their container */ +img { + max-inline-size: 100%; + max-block-size: 100%; +} + +/* removes spacing between cells in tables */ +table { + border-collapse: collapse; +} + +/* Safari - solving issue when using user-select:none on the text input doesn't working */ +input, +textarea { + -webkit-user-select: auto; +} + +/* revert the 'white-space' property for textarea elements on Safari */ +textarea { + white-space: revert; +} + +/* minimum style to allow to style meter element */ +meter { + -webkit-appearance: revert; + appearance: revert; +} + +/* preformatted text - use only for this feature */ +:where(pre) { + all: revert; + box-sizing: border-box; +} + +/* reset default text opacity of input placeholder */ +::placeholder { + color: unset; +} + +/* fix the feature of 'hidden' attribute. + display:revert; revert to element instead of attribute */ +:where([hidden]) { + display: none; +} + +/* revert for bug in Chromium browsers + - fix for the content editable attribute will work properly. + - webkit-user-select: auto; added for Safari in case of using user-select:none on wrapper element*/ +:where([contenteditable]:not([contenteditable='false'])) { + -moz-user-modify: read-write; + -webkit-user-modify: read-write; + overflow-wrap: break-word; + -webkit-line-break: after-white-space; + -webkit-user-select: auto; +} + +/* apply back the draggable feature - exist only in Chromium and Safari */ +:where([draggable='true']) { + -webkit-user-drag: element; +} + +/* Revert Modal native behavior */ +:where(dialog:modal) { + all: revert; + box-sizing: border-box; +} diff --git a/assets/scss/_core/_typography.scss b/assets/scss/_core/_typography.scss new file mode 100644 index 0000000..00d5d55 --- /dev/null +++ b/assets/scss/_core/_typography.scss @@ -0,0 +1,14 @@ +@import 'mixins'; + +body { + line-height: 1.2; + font-size: 16px; + font-family: HelveticaNow, helvetica, arial, sans-serif; + + @include min-width('tablet') { + font-size: 18px; + } + @include min-width('laptop') { + font-size: 19px; + } +} diff --git a/assets/scss/_partial/_collection.scss b/assets/scss/_partial/_collection.scss new file mode 100644 index 0000000..ec63f67 --- /dev/null +++ b/assets/scss/_partial/_collection.scss @@ -0,0 +1,29 @@ +.collection { + display: flex; + flex-direction: column; + gap: 20vh; + + padding-top: 50vh; + margin-top: calc(var(--nav-height) * -1); + + img { + position: sticky; + top: 50vh; + + width: 60vw; + height: 20vh; + + object-fit: contain; + + transform: translate3d(0, -50%, 0); + align-self: center; + + &:last-child { + margin-bottom: 20vh; + } + } +} + +.hidden { + display: none; +} diff --git a/assets/scss/_partial/_container.scss b/assets/scss/_partial/_container.scss new file mode 100644 index 0000000..330d239 --- /dev/null +++ b/assets/scss/_partial/_container.scss @@ -0,0 +1,19 @@ +.container { + position: fixed; + top: 0; + z-index: 0; + + width: 100vw; + height: var(--window-height); + + overflow-y: scroll; + overflow-x: hidden; + background: white; + + overscroll-behavior: none; + -webkit-overflow-scrolling: none; +} + +.disableScroll { + pointer-events: none; +} diff --git a/assets/scss/_partial/_gallery.scss b/assets/scss/_partial/_gallery.scss new file mode 100644 index 0000000..1d82815 --- /dev/null +++ b/assets/scss/_partial/_gallery.scss @@ -0,0 +1,56 @@ +.gallery { + pointer-events: all; + + position: fixed; + top: var(--nav-height); + z-index: var(--z-nav-gallery); + + display: flex; + flex-direction: column; + + width: 100vw; + height: calc(var(--window-height) - var(--nav-height)); + background: white; + transform: translate3d(0, 100%, 0); + + .galleryInner { + flex: 1; + height: 0; + + .swiper-slide { + display: flex; + align-items: center; + justify-content: center; + + img { + width: 100%; + height: 100%; + object-fit: contain; + } + } + } + + .nav { + height: var(--nav-height); + padding: var(--space-standard); + + display: flex; + justify-content: space-between; + align-items: center; + } +} + +.curtain { + position: fixed; + top: 0; + left: 0; + z-index: var(--z-curtain); + + width: 100vw; + height: var(--window-height); + + background: rgba(0, 0, 0, 0.5); + opacity: 0; + + pointer-events: none; +} diff --git a/assets/scss/_partial/_nav.scss b/assets/scss/_partial/_nav.scss new file mode 100644 index 0000000..586b3d9 --- /dev/null +++ b/assets/scss/_partial/_nav.scss @@ -0,0 +1,43 @@ +@import '../_core/mixins'; +$tablet: map-get($breakpoints, 'tablet') - 1; + +nav { + display: flex; + justify-content: space-between; + align-items: center; + + width: 100%; + height: var(--nav-height); + padding: 0 var(--space-standard); + + position: fixed; + bottom: 0; + background: white; + + z-index: var(--z-nav); + + // Maintain functionality while container is locked + pointer-events: all; +} + +.num { + width: 0.625em; + display: inline-block; + text-align: center; +} + +.current { + font-style: italic; + text-decoration: underline; +} + +@media (max-width: $tablet), (hover: none) { + nav { + top: 0; + } + + .index, + .threshold { + display: none; + } +} diff --git a/assets/scss/_partial/_stage.scss b/assets/scss/_partial/_stage.scss new file mode 100644 index 0000000..ef53850 --- /dev/null +++ b/assets/scss/_partial/_stage.scss @@ -0,0 +1,22 @@ +.stage { + position: relative; + overflow: hidden; + width: 100vw; + height: calc(var(--window-height) - var(--nav-height)); + + cursor: pointer; + + img { + position: absolute; + top: 0; + left: 0; + + width: 100vw; + height: var(--window-height); + object-fit: contain; + + transform: scale(0.6); + opacity: 0; + pointer-events: none; + } +} diff --git a/assets/scss/_partial/_stageNav.scss b/assets/scss/_partial/_stageNav.scss new file mode 100644 index 0000000..c347049 --- /dev/null +++ b/assets/scss/_partial/_stageNav.scss @@ -0,0 +1,21 @@ +.navOverlay { + position: fixed; + top: 0; + left: 0; + z-index: var(--z-nav-gallery); + + width: 100vw; + height: calc(var(--window-height) - var(--nav-height)); + + display: flex; + cursor: none; + + &:not(.active) { + pointer-events: none; + display: none; + } + + .overlay { + flex: 1; + } +} diff --git a/assets/css/_variables.scss b/assets/scss/_variables.scss similarity index 100% rename from assets/css/_variables.scss rename to assets/scss/_variables.scss diff --git a/assets/css/style.scss b/assets/scss/style.scss similarity index 81% rename from assets/css/style.scss rename to assets/scss/style.scss index 96c8842..8e8e9e8 100644 --- a/assets/css/style.scss +++ b/assets/scss/style.scss @@ -7,7 +7,11 @@ @import '_variables'; @import '_core/base'; -@import '_partial/customCursor'; @import '_partial/nav'; + +@import '_partial/customCursor'; @import '_partial/stage'; @import '_partial/stageNav'; + +@import '_partial/collection'; +@import '_partial/gallery'; diff --git a/assets/ts/container.ts b/assets/ts/container.ts new file mode 100644 index 0000000..8dd3c99 --- /dev/null +++ b/assets/ts/container.ts @@ -0,0 +1,14 @@ +import { scrollable } from './mobile/scroll' + +export let container: HTMLDivElement + +export function initContainer(): void { + container = document.getElementsByClassName('container').item(0) as HTMLDivElement + scrollable.addWatcher(() => { + if (scrollable.get()) { + container.classList.remove('disableScroll') + } else { + container.classList.add('disableScroll') + } + }) +} diff --git a/assets/ts/desktop/customCursor.ts b/assets/ts/desktop/customCursor.ts new file mode 100644 index 0000000..8d91739 --- /dev/null +++ b/assets/ts/desktop/customCursor.ts @@ -0,0 +1,47 @@ +import { active } from './stage' +import { container } from '../container' + +/** + * variables + */ + +const cursor = document.createElement('div') +const cursorInner = document.createElement('div') + +/** + * main functions + */ + +function onMouse(e: MouseEvent) { + const x = e.clientX + const y = e.clientY + cursor.style.transform = `translate3d(${x}px, ${y}px, 0)` +} + +export function setCustomCursor(text: string): void { + cursorInner.innerText = text +} + +/** + * init + */ +export function initCustomCursor(): void { + // cursor class name + cursor.className = 'cursor' + // cursor inner class name + cursorInner.className = 'cursorInner' + // append cursor inner to cursor + cursor.append(cursorInner) + // append cursor to main + container.append(cursor) + // bind mousemove event to window + window.addEventListener('mousemove', onMouse) + // add active callback + active.addWatcher(() => { + if (active.get()) { + cursor.classList.add('active') + } else { + cursor.classList.remove('active') + } + }) +} diff --git a/assets/ts/desktop/stage.ts b/assets/ts/desktop/stage.ts new file mode 100644 index 0000000..0400671 --- /dev/null +++ b/assets/ts/desktop/stage.ts @@ -0,0 +1,197 @@ +import { incIndex, state } from '../state' +import { gsap, Power3 } from 'gsap' +import { ImageJSON } from '../resources' +import { Watchable } from '../utils' +import { container } from '../container' + +/** + * types + */ + +export type HistoryItem = { i: number; x: number; y: number } + +/** + * variables + */ + +let imgs: HTMLImageElement[] = [] +let last = { x: 0, y: 0 } +export const cordHist = new Watchable([]) +export const isOpen = new Watchable(false) +export const isAnimating = new Watchable(false) +export const active = new Watchable(false) + +/** + * getter + */ + +function getElTrail(): HTMLImageElement[] { + return cordHist.get().map((item) => imgs[item.i]) +} + +function getElTrailCurrent(): HTMLImageElement[] { + return getElTrail().slice(-state.get().trailLength) +} + +function getElTrailInactive(): HTMLImageElement[] { + const elTrailCurrent = getElTrailCurrent() + return elTrailCurrent.slice(0, elTrailCurrent.length - 1) +} + +function getElCurrent(): HTMLImageElement { + const elTrail = getElTrail() + return elTrail[elTrail.length - 1] +} + +/** + * main functions + */ + +// on mouse +function onMouse(e: MouseEvent): void { + if (isOpen.get() || isAnimating.get()) return + const cord = { x: e.clientX, y: e.clientY } + const travelDist = Math.hypot(cord.x - last.x, cord.y - last.y) + + if (travelDist > state.get().threshold) { + last = cord + incIndex() + + const newHist = { i: state.get().index, ...cord } + cordHist.set([...cordHist.get(), newHist].slice(-state.get().length)) + } +} + +// set image position with gsap +function setPositions(): void { + const elTrail = getElTrail() + if (!elTrail.length) return + + gsap.set(elTrail, { + x: (i: number) => cordHist.get()[i].x - window.innerWidth / 2, + y: (i: number) => cordHist.get()[i].y - window.innerHeight / 2, + opacity: (i: number) => + i + 1 + state.get().trailLength <= cordHist.get().length ? 0 : 1, + zIndex: (i: number) => i, + scale: 0.6 + }) + + if (isOpen.get()) { + gsap.set(imgs, { opacity: 0 }) + gsap.set(getElCurrent(), { opacity: 1, x: 0, y: 0, scale: 1 }) + } +} + +// open image into navigation +function expandImage(): void { + if (isAnimating.get()) return + + isOpen.set(true) + isAnimating.set(true) + + const tl = gsap.timeline() + // move down and hide trail inactive + tl.to(getElTrailInactive(), { + y: '+=20', + ease: Power3.easeIn, + stagger: 0.075, + duration: 0.3, + delay: 0.1, + opacity: 0 + }) + // current move to center + tl.to(getElCurrent(), { + x: 0, + y: 0, + ease: Power3.easeInOut, + duration: 0.7, + delay: 0.3 + }) + // current expand + tl.to(getElCurrent(), { + delay: 0.1, + scale: 1, + ease: Power3.easeInOut + }) + // finished + tl.then(() => { + isAnimating.set(false) + }) +} + +// close navigation and back to stage +export function minimizeImage(): void { + if (isAnimating.get()) return + + isOpen.set(false) + isAnimating.set(true) + + const tl = gsap.timeline() + // shrink current + tl.to(getElCurrent(), { + scale: 0.6, + duration: 0.6, + ease: Power3.easeInOut + }) + // move current to original position + tl.to(getElCurrent(), { + delay: 0.3, + duration: 0.7, + ease: Power3.easeInOut, + x: cordHist.get()[cordHist.get().length - 1].x - window.innerWidth / 2, + y: cordHist.get()[cordHist.get().length - 1].y - window.innerHeight / 2 + }) + // show trail inactive + tl.to(getElTrailInactive(), { + y: '-=20', + ease: Power3.easeOut, + stagger: -0.1, + duration: 0.3, + opacity: 1 + }) + // finished + tl.then(() => { + isAnimating.set(false) + }) +} + +/** + * init + */ + +export function initStage(ijs: ImageJSON[]): void { + // create stage element + createStage(ijs) + // get stage + const stage = document.getElementsByClassName('stage').item(0) as HTMLDivElement + // get image elements + imgs = Array.from(stage.getElementsByTagName('img')) + // event listeners + stage.addEventListener('click', () => expandImage()) + stage.addEventListener('keydown', () => expandImage()) + window.addEventListener('mousemove', onMouse) + // watchers + isOpen.addWatcher(() => active.set(isOpen.get() && !isAnimating.get())) + isAnimating.addWatcher(() => active.set(isOpen.get() && !isAnimating.get())) + cordHist.addWatcher(() => setPositions()) +} + +/** + * hepler + */ + +function createStage(ijs: ImageJSON[]): void { + // create container for images + const stage: HTMLDivElement = document.createElement('div') + stage.className = 'stage' + // append images to container + for (let ij of ijs) { + const e = document.createElement('img') + e.src = ij.url + e.height = ij.imgH + e.width = ij.imgW + e.alt = 'image' + stage.append(e) + } + container.append(stage) +} diff --git a/assets/ts/desktop/stageNav.ts b/assets/ts/desktop/stageNav.ts new file mode 100644 index 0000000..61e42b7 --- /dev/null +++ b/assets/ts/desktop/stageNav.ts @@ -0,0 +1,103 @@ +import { setCustomCursor } from './customCursor' +import { decIndex, incIndex, state } from '../state' +import { increment, decrement } from '../utils' +import { cordHist, isOpen, isAnimating, active, minimizeImage } from './stage' +import { container } from '../container' + +/** + * types + */ + +type NavItem = (typeof navItems)[number] + +/** + * variables + */ + +const navItems = ['prev', 'close', 'next'] as const + +/** + * main functions + */ + +function handleClick(type: NavItem) { + switch (type) { + case 'prev': + prevImage() + break + case 'close': + minimizeImage() + break + case 'next': + nextImage() + break + } +} + +function handleKey(e: KeyboardEvent) { + if (isOpen.get() || isAnimating.get()) return + switch (e.key) { + case 'ArrowLeft': + prevImage() + break + case 'Escape': + minimizeImage() + break + case 'ArrowRight': + nextImage() + break + } +} + +/** + * init + */ + +export function initStageNav() { + const navOverlay = document.createElement('div') + navOverlay.className = 'navOverlay' + for (let navItem of navItems) { + const overlay = document.createElement('div') + overlay.className = 'overlay' + overlay.addEventListener('click', () => handleClick(navItem)) + overlay.addEventListener('keydown', () => handleClick(navItem)) + overlay.addEventListener('mouseover', () => setCustomCursor(navItem)) + overlay.addEventListener('focus', () => setCustomCursor(navItem)) + navOverlay.append(overlay) + } + active.addWatcher(() => { + if (active.get()) { + navOverlay.classList.add('active') + } else { + navOverlay.classList.remove('active') + } + }) + container.append(navOverlay) + window.addEventListener('keydown', handleKey) +} + +/** + * hepler + */ + +function nextImage() { + if (isAnimating.get()) return + cordHist.set( + cordHist.get().map((item) => { + return { ...item, i: increment(item.i, state.get().length) } + }) + ) + + incIndex() +} + +function prevImage() { + if (isAnimating.get()) return + cordHist.set( + cordHist.get().map((item) => { + return { ...item, i: decrement(item.i, state.get().length) } + }) + ) + + decIndex() +} diff --git a/assets/ts/main.ts b/assets/ts/main.ts index 2d58579..5e82b59 100644 --- a/assets/ts/main.ts +++ b/assets/ts/main.ts @@ -1,13 +1,25 @@ +import { initContainer } from './container' +import { initCustomCursor } from './desktop/customCursor' +import { initStage } from './desktop/stage' +import { initStageNav } from './desktop/stageNav' +import { initCollection } from './mobile/collection' +import { initGallery } from './mobile/gallery' +import { initNav } from './nav' import { initResources } from './resources' import { initState } from './state' -import { initCustomCursor } from './customCursor' -import { initNav } from './nav' -import { initStage } from './stage' -import { initStageNav } from './stageNav' +import { isMobile } from './utils' +initContainer() initCustomCursor() const ijs = initResources() initState(ijs.length) -initStage(ijs) -initStageNav() + initNav() + +if (!isMobile()) { + initStage(ijs) + initStageNav() +} else { + initCollection(ijs) + initGallery(ijs) +} diff --git a/assets/ts/mobile/collection.ts b/assets/ts/mobile/collection.ts new file mode 100644 index 0000000..a661bc2 --- /dev/null +++ b/assets/ts/mobile/collection.ts @@ -0,0 +1,73 @@ +import { container } from '../container' +import { ImageJSON } from '../resources' +import { setIndex } from '../state' +import { getRandom, Watchable } from '../utils' +import { slideUp } from './gallery' + +/** + * variables + */ + +export let imgs: HTMLImageElement[] = [] +export const mounted = new Watchable(false) + +/** + * main functions + */ + +function handleClick(i: number): void { + setIndex(i) + slideUp() +} + +/** + * init + */ + +export function initCollection(ijs: ImageJSON[]): void { + createCollection(ijs) + // get container + const container = document + .getElementsByClassName('collection') + .item(0) as HTMLDivElement + // add watcher + mounted.addWatcher(() => { + if (mounted.get()) { + container.classList.remove('hidden') + } else { + container.classList.add('hidden') + } + }) + // get image elements + imgs = Array.from(container.getElementsByTagName('img')) + // add event listeners + imgs.forEach((img, i) => { + img.addEventListener('click', () => handleClick(i)) + img.addEventListener('keydown', () => handleClick(i)) + }) +} + +/** + * helper + */ + +function createCollection(ijs: ImageJSON[]): void { + // create container for images + const collection: HTMLDivElement = document.createElement('div') + collection.className = 'collection' + // append images to container + for (let [i, ij] of ijs.entries()) { + // random x and y + const x = i !== 0 ? getRandom(-25, 25) : 0 + const y = i !== 0 ? getRandom(-30, 30) : 0 + // element + const e = document.createElement('img') + e.src = ij.url + e.height = ij.imgH + e.width = ij.imgW + e.alt = 'image' + e.style.transform = `translate3d(${x}%, ${y - 50}%, 0)` + collection.append(e) + } + container.append(collection) +} diff --git a/assets/ts/mobile/gallery.ts b/assets/ts/mobile/gallery.ts new file mode 100644 index 0000000..a9167ae --- /dev/null +++ b/assets/ts/mobile/gallery.ts @@ -0,0 +1,198 @@ +import { Power3, gsap } from 'gsap' +import Swiper from 'swiper' +import { container } from '../container' +import { ImageJSON } from '../resources' +import { setIndex, state } from '../state' +import { Watchable, expand } from '../utils' +import { imgs, mounted } from './collection' +import { scrollable } from './scroll' + +/** + * variables + */ + +let swiperNode: HTMLDivElement +let gallery: HTMLDivElement +let curtain: HTMLDivElement +let swiper: Swiper +const isAnimating = new Watchable(false) +let lastIndex = -1 +let indexDispNums: HTMLSpanElement[] = [] + +/** + * main functions + */ + +export function slideUp(): void { + if (isAnimating.get()) return + isAnimating.set(true) + + gsap.to(curtain, { + opacity: 1, + duration: 1 + }) + + gsap.to(gallery, { + y: 0, + ease: Power3.easeInOut, + duration: 1, + delay: 0.4 + }) + + setTimeout(() => { + scrollable.set(false) + isAnimating.set(false) + }, 1200) +} + +function slideDown(): void { + scrollable.set(true) + scrollToActive() + + gsap.to(gallery, { + y: '100%', + ease: Power3.easeInOut, + duration: 1 + }) + + gsap.to(curtain, { + opacity: 0, + duration: 1.2, + delay: 0.4 + }) +} + +/** + * init + */ + +export function initGallery(ijs: ImageJSON[]): void { + // create gallery + createGallery(ijs) + // get elements + indexDispNums = Array.from( + document.getElementsByClassName('nav').item(0)!.getElementsByClassName('num') + ) as HTMLSpanElement[] + swiperNode = document.getElementsByClassName('galleryInner').item(0) as HTMLDivElement + gallery = document.getElementsByClassName('gallery').item(0) as HTMLDivElement + curtain = document.getElementsByClassName('curtain').item(0) as HTMLDivElement + // state watcher + state.addWatcher(() => { + const s = state.get() + // change slide only when index is changed + if (s.index === lastIndex) return + changeSlide(s.index) + updateIndexText() + lastIndex = s.index + }) + // mounted watcher + mounted.addWatcher(() => { + if (!mounted.get()) return + scrollable.set(true) + swiper = new Swiper(swiperNode, { spaceBetween: 20 }) + swiper.on('slideChange', ({ realIndex }) => { + setIndex(realIndex) + }) + }) + + // mounted + mounted.set(true) +} + +/** + * helper + */ + +function changeSlide(slide: number): void { + console.log(slide) + swiper?.slideTo(slide, 0) +} + +function scrollToActive(): void { + imgs[state.get().index].scrollIntoView({ + block: 'center', + behavior: 'auto' + }) +} + +function updateIndexText(): void { + const indexValue: string = expand(state.get().index + 1) + const indexLength: string = expand(state.get().length) + indexDispNums.forEach((e: HTMLSpanElement, i: number) => { + if (i < 4) { + e.innerText = indexValue[i] + } else { + e.innerText = indexLength[i - 4] + } + }) +} + +function createGallery(ijs: ImageJSON[]): void { + /** + * gallery + * |- galleryInner + * |- swiper-wrapper + * |- swiper-slide + * |- img + * |- swiper-slide + * |- img + * |- ... + * |- nav + * |- index + * |- close + */ + // swiper wrapper + const _swiperWrapper = document.createElement('div') + _swiperWrapper.className = 'swiper-wrapper' + // swiper slide + for (let ij of ijs) { + const _swiperSlide = document.createElement('div') + _swiperSlide.className = 'swiper-slide' + // img + const e = document.createElement('img') + e.src = ij.url + e.alt = 'image' + // append + _swiperSlide.append(e) + _swiperWrapper.append(_swiperSlide) + } + // swiper node + const _swiperNode = document.createElement('div') + _swiperNode.className = 'galleryInner' + _swiperNode.append(_swiperWrapper) + // index + const _index = document.createElement('div') + _index.insertAdjacentHTML( + 'afterbegin', + ` + / + ` + ) + // close + const _close = document.createElement('div') + _close.innerText = 'Close' + _close.addEventListener('click', () => slideDown()) + _close.addEventListener('keydown', () => slideDown()) + // nav + const _navDiv = document.createElement('div') + _navDiv.className = 'nav' + _navDiv.append(_index, _close) + // gallery + const _gallery = document.createElement('div') + _gallery.className = 'gallery' + _gallery.append(_swiperNode) + _gallery.append(_navDiv) + + /** + * curtain + */ + const _curtain = document.createElement('div') + _curtain.className = 'curtain' + + /** + * container + * |- gallery + * |- curtain + */ + container.append(_gallery, _curtain) +} diff --git a/assets/ts/mobile/scroll.ts b/assets/ts/mobile/scroll.ts new file mode 100644 index 0000000..46ecb41 --- /dev/null +++ b/assets/ts/mobile/scroll.ts @@ -0,0 +1,3 @@ +import { Watchable } from '../utils' + +export const scrollable = new Watchable(true) diff --git a/assets/ts/nav.ts b/assets/ts/nav.ts index 6a8b235..25282d4 100644 --- a/assets/ts/nav.ts +++ b/assets/ts/nav.ts @@ -1,6 +1,10 @@ -import { getState, incThreshold, decThreshold } from './state' +import { decThreshold, incThreshold, state } from './state' import { expand } from './utils' +/** + * variables + */ + // threshold div const thresholdDiv = document .getElementsByClassName('threshold') @@ -27,6 +31,10 @@ const indexDispNums = Array.from( indexDiv.getElementsByClassName('num') ) as HTMLSpanElement[] +/** + * init + */ + export function initNav() { // init threshold text updateThresholdText() @@ -40,15 +48,15 @@ export function initNav() { // helper export function updateThresholdText(): void { - const thresholdValue: string = expand(getState().threshold) + const thresholdValue: string = expand(state.get().threshold) thresholdDispNums.forEach((e: HTMLSpanElement, i: number) => { e.innerText = thresholdValue[i] }) } export function updateIndexText(): void { - const indexValue: string = expand(getState().index + 1) - const indexLength: string = expand(getState().length) + const indexValue: string = expand(state.get().index + 1) + const indexLength: string = expand(state.get().length) indexDispNums.forEach((e: HTMLSpanElement, i: number) => { if (i < 4) { e.innerText = indexValue[i] diff --git a/assets/ts/state.ts b/assets/ts/state.ts index 4aebfe9..482f215 100644 --- a/assets/ts/state.ts +++ b/assets/ts/state.ts @@ -1,5 +1,5 @@ -import { increment, decrement } from './utils' import { updateIndexText, updateThresholdText } from './nav' +import { Watchable, decrement, increment } from './utils' const thresholds = [ { threshold: 20, trailLength: 20 }, @@ -18,43 +18,46 @@ const defaultState = { export type State = typeof defaultState -let state = defaultState - -export function getState(): State { - // return a copy of state - return Object.create( - Object.getPrototypeOf(state), - Object.getOwnPropertyDescriptors(state) - ) -} +export const state = new Watchable(defaultState) export function initState(length: number): void { - state.length = length + const s = state.get() + s.length = length + state.set(s) + state.addWatcher(() => { + updateIndexText() + updateThresholdText() + }) } export function setIndex(index: number): void { - state.index = index - updateIndexText() + const s = state.get() + s.index = index + state.set(s) } export function incIndex(): void { - state.index = increment(state.index, state.length) - updateIndexText() + const s = state.get() + s.index = increment(s.index, s.length) + state.set(s) } export function decIndex(): void { - state.index = decrement(state.index, state.length) - updateIndexText() + const s = state.get() + s.index = decrement(s.index, s.length) + state.set(s) } export function incThreshold(): void { - state = updateThreshold(state, 1) - updateThresholdText() + let s = state.get() + s = updateThreshold(s, 1) + state.set(s) } export function decThreshold(): void { - state = updateThreshold(state, -1) - updateThresholdText() + let s = state.get() + s = updateThreshold(s, 1) + state.set(s) } // helper diff --git a/assets/ts/utils.ts b/assets/ts/utils.ts index e2e21e7..9717d03 100644 --- a/assets/ts/utils.ts +++ b/assets/ts/utils.ts @@ -1,3 +1,7 @@ +/** + * custom helpers + */ + export function increment(num: number, length: number): number { return (num + 1) % length } @@ -14,6 +18,14 @@ export function isMobile(): boolean { return window.matchMedia('(hover: none)').matches } +export function getRandom(min: number, max: number) { + return Math.floor(Math.random() * (max - min + 1)) + min +} + +/** + * custom types + */ + export class Watchable { constructor(private obj: T) {} private watchers: (() => void)[] = [] diff --git a/layouts/index.html b/layouts/index.html index 9fe8cfc..5e9a693 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -37,6 +37,6 @@ {{ end }} - {{ partial "nav.html" . }} +
{{ partial "nav.html" . }}
diff --git a/layouts/partials/head.html b/layouts/partials/head.html index c3d84e6..44d92c6 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -1,9 +1,13 @@ {{- $fingerprint := .Scratch.Get "fingerprint" | default "" -}} -{{- $style := dict "Source" "css/style.scss" "Fingerprint" $fingerprint -}} +{{- $style := dict "Source" "scss/style.scss" "Fingerprint" $fingerprint -}} {{- $options := dict "targetPath" "css/style.min.css" "enableSourceMap" true -}} {{- $style = dict "Context" . "ToCSS" $options | merge $style -}} {{- partial "plugin/style.html" $style -}} {{- $esBuildOpts := dict "minify" hugo.IsProduction -}} {{- $script := resources.Get "ts/main.ts" | js.Build $esBuildOpts -}} + diff --git a/package.json b/package.json index 99b5cf5..e5696c1 100644 --- a/package.json +++ b/package.json @@ -32,15 +32,18 @@ "eslint-config-prettier": "^9.0.0", "eslint-config-standard": "^17.1.0", "eslint-config-standard-with-typescript": "^39.1.1", + "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.0", "eslint-plugin-n": "^16.2.0", "eslint-plugin-prettier": "^5.0.1", "eslint-plugin-promise": "^6.1.1", "prettier": "3.0.3", "prettier-plugin-go-template": "^0.0.15", + "prettier-plugin-organize-imports": "^3.2.3", "typescript": "^5.2.2" }, "dependencies": { - "gsap": "^3.12.2" + "gsap": "^3.12.2", + "swiper": "^11.0.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7e4ecca..762beac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,47 +8,56 @@ dependencies: gsap: specifier: ^3.12.2 version: 3.12.2 + swiper: + specifier: ^11.0.3 + version: 11.0.3 devDependencies: '@typescript-eslint/eslint-plugin': - specifier: ^6.3.0 - version: 6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.47.0)(typescript@5.1.6) + specifier: ^6.9.0 + version: 6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.52.0)(typescript@5.2.2) '@typescript-eslint/parser': - specifier: ^6.3.0 - version: 6.3.0(eslint@8.47.0)(typescript@5.1.6) + specifier: ^6.9.0 + version: 6.9.0(eslint@8.52.0)(typescript@5.2.2) eslint: - specifier: ^8.47.0 - version: 8.47.0 + specifier: ^8.52.0 + version: 8.52.0 eslint-config-prettier: specifier: ^9.0.0 - version: 9.0.0(eslint@8.47.0) + version: 9.0.0(eslint@8.52.0) eslint-config-standard: specifier: ^17.1.0 - version: 17.1.0(eslint-plugin-import@2.28.0)(eslint-plugin-n@16.0.1)(eslint-plugin-promise@6.1.1)(eslint@8.47.0) + version: 17.1.0(eslint-plugin-import@2.29.0)(eslint-plugin-n@16.2.0)(eslint-plugin-promise@6.1.1)(eslint@8.52.0) eslint-config-standard-with-typescript: - specifier: ^37.0.0 - version: 37.0.0(@typescript-eslint/eslint-plugin@6.3.0)(eslint-plugin-import@2.28.0)(eslint-plugin-n@16.0.1)(eslint-plugin-promise@6.1.1)(eslint@8.47.0)(typescript@5.1.6) + specifier: ^39.1.1 + version: 39.1.1(@typescript-eslint/eslint-plugin@6.9.0)(eslint-plugin-import@2.29.0)(eslint-plugin-n@16.2.0)(eslint-plugin-promise@6.1.1)(eslint@8.52.0)(typescript@5.2.2) + eslint-import-resolver-typescript: + specifier: ^3.6.1 + version: 3.6.1(@typescript-eslint/parser@6.9.0)(eslint-plugin-import@2.29.0)(eslint@8.52.0) eslint-plugin-import: - specifier: ^2.28.0 - version: 2.28.0(@typescript-eslint/parser@6.3.0)(eslint@8.47.0) + specifier: ^2.29.0 + version: 2.29.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.52.0) eslint-plugin-n: - specifier: ^16.0.1 - version: 16.0.1(eslint@8.47.0) + specifier: ^16.2.0 + version: 16.2.0(eslint@8.52.0) eslint-plugin-prettier: - specifier: ^5.0.0 - version: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.47.0)(prettier@3.0.1) + specifier: ^5.0.1 + version: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.52.0)(prettier@3.0.3) eslint-plugin-promise: specifier: ^6.1.1 - version: 6.1.1(eslint@8.47.0) + version: 6.1.1(eslint@8.52.0) prettier: - specifier: 3.0.1 - version: 3.0.1 + specifier: 3.0.3 + version: 3.0.3 prettier-plugin-go-template: specifier: ^0.0.15 - version: 0.0.15(prettier@3.0.1) + version: 0.0.15(prettier@3.0.3) + prettier-plugin-organize-imports: + specifier: ^3.2.3 + version: 3.2.3(prettier@3.0.3)(typescript@5.2.2) typescript: - specifier: ^5.1.6 - version: 5.1.6 + specifier: ^5.2.2 + version: 5.2.2 packages: @@ -57,13 +66,13 @@ packages: engines: {node: '>=0.10.0'} dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.52.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.47.0 + eslint: 8.52.0 eslint-visitor-keys: 3.4.3 dev: true @@ -89,16 +98,16 @@ packages: - supports-color dev: true - /@eslint/js@8.47.0: - resolution: {integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==} + /@eslint/js@8.52.0: + resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 1.2.1 + '@humanwhocodes/object-schema': 2.0.1 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -110,8 +119,8 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} dev: true /@nodelib/fs.scandir@2.1.5: @@ -159,8 +168,8 @@ packages: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true - /@typescript-eslint/eslint-plugin@6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.47.0)(typescript@5.1.6): - resolution: {integrity: sha512-IZYjYZ0ifGSLZbwMqIip/nOamFiWJ9AH+T/GYNZBWkVcyNQOFGtSMoWV7RvY4poYCMZ/4lHzNl796WOSNxmk8A==} + /@typescript-eslint/eslint-plugin@6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -171,46 +180,25 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.3.0(eslint@8.47.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 6.3.0 - '@typescript-eslint/type-utils': 6.3.0(eslint@8.47.0)(typescript@5.1.6) - '@typescript-eslint/utils': 6.3.0(eslint@8.47.0)(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.3.0 + '@typescript-eslint/parser': 6.9.0(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.9.0 + '@typescript-eslint/type-utils': 6.9.0(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.9.0(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.9.0 debug: 4.3.4 - eslint: 8.47.0 + eslint: 8.52.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 - natural-compare-lite: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.1.6) - typescript: 5.1.6 + ts-api-utils: 1.0.1(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.47.0)(typescript@5.1.6): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) - debug: 4.3.4 - eslint: 8.47.0 - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@6.3.0(eslint@8.47.0)(typescript@5.1.6): - resolution: {integrity: sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==} + /@typescript-eslint/parser@6.9.0(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -219,35 +207,27 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.3.0 - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 6.3.0 + '@typescript-eslint/scope-manager': 6.9.0 + '@typescript-eslint/types': 6.9.0 + '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.9.0 debug: 4.3.4 - eslint: 8.47.0 - typescript: 5.1.6 + eslint: 8.52.0 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - dev: true - - /@typescript-eslint/scope-manager@6.3.0: - resolution: {integrity: sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==} + /@typescript-eslint/scope-manager@6.9.0: + resolution: {integrity: sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/visitor-keys': 6.3.0 + '@typescript-eslint/types': 6.9.0 + '@typescript-eslint/visitor-keys': 6.9.0 dev: true - /@typescript-eslint/type-utils@6.3.0(eslint@8.47.0)(typescript@5.1.6): - resolution: {integrity: sha512-7Oj+1ox1T2Yc8PKpBvOKWhoI/4rWFd1j7FA/rPE0lbBPXTKjdbtC+7Ev0SeBjEKkIhKWVeZSP+mR7y1Db1CdfQ==} + /@typescript-eslint/type-utils@6.9.0(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -256,101 +236,71 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.1.6) - '@typescript-eslint/utils': 6.3.0(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2) + '@typescript-eslint/utils': 6.9.0(eslint@8.52.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.47.0 - ts-api-utils: 1.0.1(typescript@5.1.6) - typescript: 5.1.6 + eslint: 8.52.0 + ts-api-utils: 1.0.1(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@typescript-eslint/types@6.3.0: - resolution: {integrity: sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==} + /@typescript-eslint/types@6.9.0: + resolution: {integrity: sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.6): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/typescript-estree@6.9.0(typescript@5.2.2): + resolution: {integrity: sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/types': 6.9.0 + '@typescript-eslint/visitor-keys': 6.9.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - tsutils: 3.21.0(typescript@5.1.6) - typescript: 5.1.6 + ts-api-utils: 1.0.1(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@6.3.0(typescript@5.1.6): - resolution: {integrity: sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/visitor-keys': 6.3.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.1.6) - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@6.3.0(eslint@8.47.0)(typescript@5.1.6): - resolution: {integrity: sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==} + /@typescript-eslint/utils@6.9.0(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 6.3.0 - '@typescript-eslint/types': 6.3.0 - '@typescript-eslint/typescript-estree': 6.3.0(typescript@5.1.6) - eslint: 8.47.0 + '@typescript-eslint/scope-manager': 6.9.0 + '@typescript-eslint/types': 6.9.0 + '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2) + eslint: 8.52.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/visitor-keys@6.9.0: + resolution: {integrity: sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/types': 6.9.0 eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@6.3.0: - resolution: {integrity: sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.3.0 - eslint-visitor-keys: 3.4.3 + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true /acorn-jsx@5.3.2(acorn@8.10.0): @@ -399,8 +349,8 @@ packages: is-array-buffer: 3.0.2 dev: true - /array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + /array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -415,8 +365,8 @@ packages: engines: {node: '>=8'} dev: true - /array.prototype.findlastindex@1.2.2: - resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} + /array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -426,8 +376,8 @@ packages: get-intrinsic: 1.2.1 dev: true - /array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -436,8 +386,8 @@ packages: es-shim-unscopables: 1.0.0 dev: true - /array.prototype.flatmap@1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -629,6 +579,14 @@ packages: esutils: 2.0.3 dev: true + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + /es-abstract@1.22.1: resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} engines: {node: '>= 0.4'} @@ -703,38 +661,38 @@ packages: engines: {node: '>=10'} dev: true - /eslint-config-prettier@9.0.0(eslint@8.47.0): + /eslint-config-prettier@9.0.0(eslint@8.52.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.47.0 + eslint: 8.52.0 dev: true - /eslint-config-standard-with-typescript@37.0.0(@typescript-eslint/eslint-plugin@6.3.0)(eslint-plugin-import@2.28.0)(eslint-plugin-n@16.0.1)(eslint-plugin-promise@6.1.1)(eslint@8.47.0)(typescript@5.1.6): - resolution: {integrity: sha512-V8I/Q1eFf9tiOuFHkbksUdWO3p1crFmewecfBtRxXdnvb71BCJx+1xAknlIRZMwZioMX3/bPtMVCZsf1+AjjOw==} + /eslint-config-standard-with-typescript@39.1.1(@typescript-eslint/eslint-plugin@6.9.0)(eslint-plugin-import@2.29.0)(eslint-plugin-n@16.2.0)(eslint-plugin-promise@6.1.1)(eslint@8.52.0)(typescript@5.2.2): + resolution: {integrity: sha512-t6B5Ep8E4I18uuoYeYxINyqcXb2UbC0SOOTxRtBSt2JUs+EzeXbfe2oaiPs71AIdnoWhXDO2fYOHz8df3kV84A==} peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.52.0 + '@typescript-eslint/eslint-plugin': ^6.4.0 eslint: ^8.0.1 eslint-plugin-import: ^2.25.2 eslint-plugin-n: '^15.0.0 || ^16.0.0 ' eslint-plugin-promise: ^6.0.0 typescript: '*' dependencies: - '@typescript-eslint/eslint-plugin': 6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.47.0)(typescript@5.1.6) - '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@5.1.6) - eslint: 8.47.0 - eslint-config-standard: 17.1.0(eslint-plugin-import@2.28.0)(eslint-plugin-n@16.0.1)(eslint-plugin-promise@6.1.1)(eslint@8.47.0) - eslint-plugin-import: 2.28.0(@typescript-eslint/parser@6.3.0)(eslint@8.47.0) - eslint-plugin-n: 16.0.1(eslint@8.47.0) - eslint-plugin-promise: 6.1.1(eslint@8.47.0) - typescript: 5.1.6 + '@typescript-eslint/eslint-plugin': 6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.52.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.9.0(eslint@8.52.0)(typescript@5.2.2) + eslint: 8.52.0 + eslint-config-standard: 17.1.0(eslint-plugin-import@2.29.0)(eslint-plugin-n@16.2.0)(eslint-plugin-promise@6.1.1)(eslint@8.52.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.52.0) + eslint-plugin-n: 16.2.0(eslint@8.52.0) + eslint-plugin-promise: 6.1.1(eslint@8.52.0) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: true - /eslint-config-standard@17.1.0(eslint-plugin-import@2.28.0)(eslint-plugin-n@16.0.1)(eslint-plugin-promise@6.1.1)(eslint@8.47.0): + /eslint-config-standard@17.1.0(eslint-plugin-import@2.29.0)(eslint-plugin-n@16.2.0)(eslint-plugin-promise@6.1.1)(eslint@8.52.0): resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} engines: {node: '>=12.0.0'} peerDependencies: @@ -743,23 +701,46 @@ packages: eslint-plugin-n: '^15.0.0 || ^16.0.0 ' eslint-plugin-promise: ^6.0.0 dependencies: - eslint: 8.47.0 - eslint-plugin-import: 2.28.0(@typescript-eslint/parser@6.3.0)(eslint@8.47.0) - eslint-plugin-n: 16.0.1(eslint@8.47.0) - eslint-plugin-promise: 6.1.1(eslint@8.47.0) + eslint: 8.52.0 + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.52.0) + eslint-plugin-n: 16.2.0(eslint@8.52.0) + eslint-plugin-promise: 6.1.1(eslint@8.52.0) dev: true /eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: debug: 3.2.7 - is-core-module: 2.13.0 + is-core-module: 2.13.1 resolve: 1.22.4 transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-node@0.3.9)(eslint@8.47.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.9.0)(eslint-plugin-import@2.29.0)(eslint@8.52.0): + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.4 + enhanced-resolve: 5.15.0 + eslint: 8.52.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.52.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.52.0) + fast-glob: 3.3.1 + get-tsconfig: 4.7.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.52.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -780,27 +761,28 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.3.0(eslint@8.47.0)(typescript@5.1.6) + '@typescript-eslint/parser': 6.9.0(eslint@8.52.0)(typescript@5.2.2) debug: 3.2.7 - eslint: 8.47.0 + eslint: 8.52.0 eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.9.0)(eslint-plugin-import@2.29.0)(eslint@8.52.0) transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-es-x@7.2.0(eslint@8.47.0): + /eslint-plugin-es-x@7.2.0(eslint@8.52.0): resolution: {integrity: sha512-9dvv5CcvNjSJPqnS5uZkqb3xmbeqRLnvXKK7iI5+oK/yTusyc46zbBZKENGsOfojm/mKfszyZb+wNqNPAPeGXA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) '@eslint-community/regexpp': 4.6.2 - eslint: 8.47.0 + eslint: 8.52.0 dev: true - /eslint-plugin-import@2.28.0(@typescript-eslint/parser@6.3.0)(eslint@8.47.0): - resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==} + /eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.52.0): + resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -809,24 +791,23 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.3.0(eslint@8.47.0)(typescript@5.1.6) - array-includes: 3.1.6 - array.prototype.findlastindex: 1.2.2 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 + '@typescript-eslint/parser': 6.9.0(eslint@8.52.0)(typescript@5.2.2) + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.47.0 + eslint: 8.52.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-node@0.3.9)(eslint@8.47.0) - has: 1.0.3 - is-core-module: 2.13.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.9.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.52.0) + hasown: 2.0.0 + is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.6 - object.groupby: 1.0.0 - object.values: 1.1.6 - resolve: 1.22.4 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 semver: 6.3.1 tsconfig-paths: 3.14.2 transitivePeerDependencies: @@ -835,16 +816,17 @@ packages: - supports-color dev: true - /eslint-plugin-n@16.0.1(eslint@8.47.0): - resolution: {integrity: sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==} + /eslint-plugin-n@16.2.0(eslint@8.52.0): + resolution: {integrity: sha512-AQER2jEyQOt1LG6JkGJCCIFotzmlcCZFur2wdKrp1JX2cNotC7Ae0BcD/4lLv3lUAArM9uNS8z/fsvXTd0L71g==} engines: {node: '>=16.0.0'} peerDependencies: eslint: '>=7.0.0' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) builtins: 5.0.1 - eslint: 8.47.0 - eslint-plugin-es-x: 7.2.0(eslint@8.47.0) + eslint: 8.52.0 + eslint-plugin-es-x: 7.2.0(eslint@8.52.0) + get-tsconfig: 4.7.2 ignore: 5.2.4 is-core-module: 2.13.0 minimatch: 3.1.2 @@ -852,8 +834,8 @@ packages: semver: 7.5.4 dev: true - /eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.47.0)(prettier@3.0.1): - resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} + /eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.0.0)(eslint@8.52.0)(prettier@3.0.3): + resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -866,20 +848,20 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.47.0 - eslint-config-prettier: 9.0.0(eslint@8.47.0) - prettier: 3.0.1 + eslint: 8.52.0 + eslint-config-prettier: 9.0.0(eslint@8.52.0) + prettier: 3.0.3 prettier-linter-helpers: 1.0.0 synckit: 0.8.5 dev: true - /eslint-plugin-promise@6.1.1(eslint@8.47.0): + /eslint-plugin-promise@6.1.1(eslint@8.52.0): resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.47.0 + eslint: 8.52.0 dev: true /eslint-scope@7.2.2: @@ -895,18 +877,19 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.47.0: - resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==} + /eslint@8.52.0: + resolution: {integrity: sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) '@eslint-community/regexpp': 4.6.2 '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.47.0 - '@humanwhocodes/config-array': 0.11.10 + '@eslint/js': 8.52.0 + '@humanwhocodes/config-array': 0.11.13 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -1085,6 +1068,10 @@ packages: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + /function.prototype.name@1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} @@ -1121,6 +1108,12 @@ packages: get-intrinsic: 1.2.1 dev: true + /get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1178,6 +1171,10 @@ packages: get-intrinsic: 1.2.1 dev: true + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true @@ -1225,6 +1222,13 @@ packages: function-bind: 1.1.1 dev: true + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -1306,6 +1310,12 @@ packages: has: 1.0.3 dev: true + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + dev: true + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -1526,10 +1536,6 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -1567,8 +1573,8 @@ packages: object-keys: 1.1.1 dev: true - /object.fromentries@2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + /object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -1576,8 +1582,8 @@ packages: es-abstract: 1.22.1 dev: true - /object.groupby@1.0.0: - resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==} + /object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -1585,8 +1591,8 @@ packages: get-intrinsic: 1.2.1 dev: true - /object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -1707,18 +1713,35 @@ packages: fast-diff: 1.3.0 dev: true - /prettier-plugin-go-template@0.0.15(prettier@3.0.1): + /prettier-plugin-go-template@0.0.15(prettier@3.0.3): resolution: {integrity: sha512-WqU92E1NokWYNZ9mLE6ijoRg6LtIGdLMePt2C7UBDjXeDH9okcRI3zRqtnWR4s5AloiqyvZ66jNBAa9tmRY5EQ==} engines: {node: '>=14.0.0'} peerDependencies: prettier: ^3.0.0 dependencies: - prettier: 3.0.1 + prettier: 3.0.3 ulid: 2.3.0 dev: true - /prettier@3.0.1: - resolution: {integrity: sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==} + /prettier-plugin-organize-imports@3.2.3(prettier@3.0.3)(typescript@5.2.2): + resolution: {integrity: sha512-KFvk8C/zGyvUaE3RvxN2MhCLwzV6OBbFSkwZ2OamCrs9ZY4i5L77jQ/w4UmUr+lqX8qbaqVq6bZZkApn+IgJSg==} + peerDependencies: + '@volar/vue-language-plugin-pug': ^1.0.4 + '@volar/vue-typescript': ^1.0.4 + prettier: '>=2.0' + typescript: '>=2.9' + peerDependenciesMeta: + '@volar/vue-language-plugin-pug': + optional: true + '@volar/vue-typescript': + optional: true + dependencies: + prettier: 3.0.3 + typescript: 5.2.2 + dev: true + + /prettier@3.0.3: + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} engines: {node: '>=14'} hasBin: true dev: true @@ -1746,6 +1769,10 @@ packages: engines: {node: '>=4'} dev: true + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + /resolve@1.22.4: resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} hasBin: true @@ -1904,6 +1931,11 @@ packages: engines: {node: '>= 0.4'} dev: true + /swiper@11.0.3: + resolution: {integrity: sha512-MyV9ooQsriAe2EibeamqewLjgCfSvl2xoyratl6S3ln5BXDL4BzlO6mxcbLMCzQL6Z60b/u0AS/nKrepL0+TAg==} + engines: {node: '>= 4.7.0'} + dev: false + /synckit@0.8.5: resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} engines: {node: ^14.18.0 || >=16.0.0} @@ -1912,6 +1944,11 @@ packages: tslib: 2.6.1 dev: true + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -1928,13 +1965,13 @@ packages: is-number: 7.0.0 dev: true - /ts-api-utils@1.0.1(typescript@5.1.6): + /ts-api-utils@1.0.1(typescript@5.2.2): resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.1.6 + typescript: 5.2.2 dev: true /tsconfig-paths@3.14.2: @@ -1946,24 +1983,10 @@ packages: strip-bom: 3.0.0 dev: true - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - /tslib@2.6.1: resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} dev: true - /tsutils@3.21.0(typescript@5.1.6): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.1.6 - dev: true - /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -2014,8 +2037,8 @@ packages: is-typed-array: 1.1.12 dev: true - /typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} hasBin: true dev: true