├── .docs ├── .gitignore ├── public │ ├── cactus.jpg │ ├── logo.svg │ ├── layers-black.svg │ ├── layers-white.svg │ ├── mix-black.svg │ ├── mix-white.svg │ ├── spartial-black.svg │ └── spartial-white.svg ├── .vitepress │ ├── theme │ │ ├── Layout.vue │ │ ├── custom.css │ │ └── index.js │ ├── components │ │ ├── examples │ │ │ ├── BasicCarousel.vue │ │ │ ├── ImageCarousel.vue │ │ │ ├── MultipleCarousel.vue │ │ │ ├── RandomCarousel.vue │ │ │ ├── AutoplayCarousel.vue │ │ │ └── PreviewCarousel.vue │ │ └── HeroCarousel.vue │ └── config.js ├── package.json ├── getting-started.md ├── index.md ├── api.md └── examples.md ├── static ├── snap.jpg ├── cactus.jpg ├── logo-snap.jpg └── snap.svg ├── examples ├── nuxt-app │ ├── server │ │ └── tsconfig.json │ ├── tsconfig.json │ ├── plugins │ │ └── vue-snap.ts │ ├── nuxt.config.ts │ ├── .gitignore │ ├── package.json │ ├── app.vue │ └── README.md └── vite │ ├── main.js │ ├── index.html │ ├── vite.config.js │ ├── package.json │ └── App.vue ├── tea.yaml ├── tsconfig.json ├── .npmignore ├── .gitignore ├── .editorconfig ├── src ├── entry.ts ├── components │ ├── Slide.vue │ └── Carousel.vue ├── utils │ └── helpers.ts └── hooks │ └── useCarousel.ts ├── tsconfig.app.json ├── dist ├── vue-snap.css ├── vue-snap.js ├── vue-snap.umd.js └── vue-snap.es.js ├── config └── vite.config.ts ├── .github └── workflows │ └── main.yml ├── tsconfig.node.json ├── LICENSE.md ├── eslint.config.js ├── package.json ├── README.md ├── CHANGELOG.md └── pnpm-lock.yaml /.docs/.gitignore: -------------------------------------------------------------------------------- 1 | .vercel 2 | .vitepress/cache 3 | .vitepress/dist 4 | -------------------------------------------------------------------------------- /static/snap.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartdominiak/vue-snap/HEAD/static/snap.jpg -------------------------------------------------------------------------------- /static/cactus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartdominiak/vue-snap/HEAD/static/cactus.jpg -------------------------------------------------------------------------------- /static/logo-snap.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartdominiak/vue-snap/HEAD/static/logo-snap.jpg -------------------------------------------------------------------------------- /.docs/public/cactus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartdominiak/vue-snap/HEAD/.docs/public/cactus.jpg -------------------------------------------------------------------------------- /examples/nuxt-app/server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../.nuxt/tsconfig.server.json" 3 | } 4 | -------------------------------------------------------------------------------- /examples/nuxt-app/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // https://nuxt.com/docs/guide/concepts/typescript 3 | "extends": "./.nuxt/tsconfig.json" 4 | } 5 | -------------------------------------------------------------------------------- /tea.yaml: -------------------------------------------------------------------------------- 1 | # https://tea.xyz/what-is-this-file 2 | --- 3 | version: 1.0.0 4 | codeOwners: 5 | - '0x3093770c121DB913F50758a167C31F786D270CB3' 6 | quorum: 1 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /examples/nuxt-app/plugins/vue-snap.ts: -------------------------------------------------------------------------------- 1 | import VueSnap from 'vue-snap' 2 | 3 | export default defineNuxtPlugin((nuxtApp) => { 4 | nuxtApp.vueApp.use(VueSnap); 5 | }) 6 | -------------------------------------------------------------------------------- /examples/nuxt-app/nuxt.config.ts: -------------------------------------------------------------------------------- 1 | // https://nuxt.com/docs/api/configuration/nuxt-config 2 | export default defineNuxtConfig({ 3 | css: [ 'vue-snap/dist/vue-snap.css'] 4 | }) 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | scripts 2 | static 3 | config 4 | storybook-static 5 | examples 6 | .travis.yml 7 | .eslintrc 8 | .editorconfig 9 | .gitignore 10 | .docs 11 | .github 12 | .husky 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | // Common 2 | node_modules 3 | .DS_Store 4 | 5 | // Analyser 6 | dist/stats.json 7 | dist/report.html 8 | 9 | .vercel 10 | .docs/.vitepress/dist 11 | .docs/.vitepress/cache 12 | -------------------------------------------------------------------------------- /examples/vite/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | 4 | import VueSnap from 'vue-snap' 5 | import 'vue-snap/dist/vue-snap.css' 6 | 7 | const myApp = createApp(App) 8 | 9 | myApp.use(VueSnap) 10 | myApp.mount('#app') 11 | -------------------------------------------------------------------------------- /examples/vite/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Vite App 6 | 7 | 8 |
9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | charset = utf-8 6 | trim_trailing_whitespace = true 7 | insert_final_newline = true 8 | 9 | [*.{css,scss}] 10 | indent_style = space 11 | indent_size = 4 12 | 13 | [*.{js,json,vue}] 14 | indent_style = space 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /examples/nuxt-app/.gitignore: -------------------------------------------------------------------------------- 1 | # Nuxt dev/build outputs 2 | .output 3 | .data 4 | .nuxt 5 | .nitro 6 | .cache 7 | dist 8 | 9 | # Node dependencies 10 | node_modules 11 | 12 | # Logs 13 | logs 14 | *.log 15 | 16 | # Misc 17 | .DS_Store 18 | .fleet 19 | .idea 20 | 21 | # Local env files 22 | .env 23 | .env.* 24 | !.env.example 25 | -------------------------------------------------------------------------------- /examples/vite/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import vue from "@vitejs/plugin-vue"; 3 | import vueDevTools from "vite-plugin-vue-devtools"; 4 | import { createHtmlPlugin } from "vite-plugin-html"; 5 | 6 | // https://vite.dev/config/ 7 | export default defineConfig({ 8 | plugins: [ vue(), vueDevTools(), createHtmlPlugin({} )], 9 | }); 10 | -------------------------------------------------------------------------------- /src/entry.ts: -------------------------------------------------------------------------------- 1 | import type { App } from 'vue' 2 | import Carousel from './components/Carousel.vue' 3 | import Slide from './components/Slide.vue' 4 | 5 | export const VueSnap = { 6 | install: (app: App) => { 7 | app.component('Carousel', Carousel) 8 | app.component('Slide', Slide) 9 | } 10 | } 11 | 12 | export { Carousel, Slide }; 13 | 14 | export default VueSnap; 15 | -------------------------------------------------------------------------------- /.docs/.vitepress/theme/Layout.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | 15 | 20 | -------------------------------------------------------------------------------- /src/components/Slide.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 25 | -------------------------------------------------------------------------------- /examples/vite/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite", 3 | "version": "0.1.0", 4 | "scripts": { 5 | "dev": "vite", 6 | "build": "vite build" 7 | }, 8 | "dependencies": { 9 | "vue": "^3.5.16", 10 | "vue-snap": "^1.1.0" 11 | }, 12 | "devDependencies": { 13 | "@vitejs/plugin-vue": "^5.2.4", 14 | "vite": "^6.3.5", 15 | "vite-plugin-html": "^3.2.2", 16 | "vite-plugin-vue-devtools": "^7.7.7" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /examples/nuxt-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nuxt-app", 3 | "private": true, 4 | "type": "module", 5 | "scripts": { 6 | "build": "nuxt build", 7 | "dev": "nuxt dev", 8 | "generate": "nuxt generate", 9 | "preview": "nuxt preview", 10 | "postinstall": "nuxt prepare" 11 | }, 12 | "dependencies": { 13 | "nuxt": "^3.17.5", 14 | "vue": "^3.5.16", 15 | "vue-router": "^4.5.1", 16 | "vue-snap": "^1.1.0" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.dom.json", 3 | "compilerOptions": { 4 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 5 | 6 | /* Linting */ 7 | "strict": true, 8 | "noUnusedLocals": true, 9 | "noUnusedParameters": true, 10 | "erasableSyntaxOnly": true, 11 | "noFallthroughCasesInSwitch": true, 12 | "noUncheckedSideEffectImports": true 13 | }, 14 | "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] 15 | } 16 | -------------------------------------------------------------------------------- /.docs/.vitepress/theme/custom.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --vp-c-brand-1: var(--vp-c-green-1); 3 | --vp-c-brand-2: var(--vp-c-green-2); 4 | --vp-c-brand-3: var(--vp-c-green-3); 5 | } 6 | 7 | .image-container { 8 | all: unset!important; 9 | } 10 | 11 | /* .image { 12 | all: unset!important; 13 | } 14 | 15 | @media (min-width: 960px) { 16 | .image { 17 | flex-grow: 1; 18 | order: 2; 19 | margin: 0; 20 | min-height: 100%; 21 | } 22 | } */ 23 | 24 | .image { 25 | margin: 20px auto!important; 26 | } 27 | 28 | .image-bg { 29 | all: unset!important; 30 | } 31 | -------------------------------------------------------------------------------- /dist/vue-snap.css: -------------------------------------------------------------------------------- 1 | .vs-carousel{position:relative}.vs-carousel__wrapper{display:flex;overflow-x:scroll;overflow-y:hidden;scroll-snap-type:x mandatory;scroll-behavior:smooth;scrollbar-width:none;margin:0;padding:0;list-style:none}.vs-carousel__slide{flex:0 0 100%;height:100%;scroll-snap-align:start;display:flex;justify-content:center;align-items:center;outline:none;margin:0;padding:0}.vs-carousel__arrows{position:absolute;top:0;bottom:0;margin:auto;width:48px;height:48px;padding:0;cursor:pointer;border:0}.vs-carousel__arrows:disabled{cursor:not-allowed}.vs-carousel__arrows--left{left:0}.vs-carousel__arrows--right{right:0} 2 | -------------------------------------------------------------------------------- /.docs/public/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /.docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docs", 3 | "version": "0.7.1", 4 | "description": "Vue Snap documentation site", 5 | "type": "module", 6 | "engines": { 7 | "node": ">=18" 8 | }, 9 | "devDependencies": { 10 | "lodash": "^4.17.21", 11 | "sass-embedded": "^1.89.2", 12 | "vite": "^6.3.5", 13 | "vite-plugin-html": "^3.2.2", 14 | "vite-plugin-vue-devtools": "^7.7.7", 15 | "vitepress": "^1.6.3" 16 | }, 17 | "scripts": { 18 | "docs:dev": "vitepress dev", 19 | "docs:build": "vitepress build", 20 | "docs:preview": "vitepress preview" 21 | }, 22 | "dependencies": { 23 | "vitepress-plugin-group-icons": "^1.6.0", 24 | "vue-snap": "^1.1.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /config/vite.config.ts: -------------------------------------------------------------------------------- 1 | import vue from '@vitejs/plugin-vue'; 2 | import { resolve } from 'path'; 3 | 4 | import { defineConfig } from 'vite' 5 | 6 | export default defineConfig({ 7 | plugins: [ vue() ], 8 | build: { 9 | minify: true, 10 | lib: { 11 | entry: resolve(__dirname, '../src/entry.ts'), 12 | name: 'VueSnap', 13 | formats: ['es', 'umd', 'iife'], 14 | fileName: (format) => { 15 | if (format === 'iife') return 'vue-snap.js'; 16 | return `vue-snap.${format}.js`; 17 | } 18 | }, 19 | rollupOptions: { 20 | external: ['vue'], 21 | output: { 22 | globals: { 23 | vue: 'Vue', 24 | } 25 | } 26 | } 27 | } 28 | }); 29 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: [push] 4 | 5 | jobs: 6 | test: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - name: Checkout 10 | uses: actions/checkout@v4 11 | 12 | - uses: pnpm/action-setup@v4 13 | name: Install pnpm 14 | with: 15 | version: 10 16 | run_install: false 17 | 18 | - name: Install Node.js 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version: '22.16' 22 | cache: 'pnpm' 23 | 24 | - name: Install dependencies 25 | run: pnpm install 26 | 27 | - name: Run linter 28 | run: pnpm lint 29 | 30 | - name: Run tests 31 | run: pnpm test 32 | 33 | - name: Run release 34 | run: pnpm release 35 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 | "target": "ES2022", 5 | "lib": ["dom", "ES2023"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "verbatimModuleSyntax": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | 16 | /* Linting */ 17 | "strict": true, 18 | "noUnusedLocals": true, 19 | "noUnusedParameters": true, 20 | "erasableSyntaxOnly": true, 21 | "noFallthroughCasesInSwitch": true, 22 | "noUncheckedSideEffectImports": true 23 | }, 24 | "include": ["vite.config.ts", "src/**/*.ts", "src/**/*.vue"] 25 | } 26 | -------------------------------------------------------------------------------- /.docs/.vitepress/components/examples/BasicCarousel.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 12 | 13 | 14 | 38 | -------------------------------------------------------------------------------- /static/snap.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/utils/helpers.ts: -------------------------------------------------------------------------------- 1 | export const isClient = typeof window !== 'undefined' 2 | 3 | export const approximatelyEqual = (v1: number, v2: number, epsilon = 5): boolean => { 4 | return Math.abs(v1 - v2) <= epsilon 5 | } 6 | 7 | export function debounce void>( 8 | fn: T, 9 | wait: number 10 | ): { 11 | (...args: Parameters): void; 12 | cancel: () => void; 13 | } { 14 | let timeoutId: ReturnType | null = null; 15 | 16 | const debounced = (...args: Parameters) => { 17 | if (timeoutId) clearTimeout(timeoutId); 18 | timeoutId = setTimeout(() => { 19 | fn(...args); 20 | }, wait); 21 | }; 22 | 23 | debounced.cancel = () => { 24 | if (timeoutId) clearTimeout(timeoutId); 25 | timeoutId = null; 26 | }; 27 | 28 | return debounced; 29 | } 30 | -------------------------------------------------------------------------------- /.docs/.vitepress/components/examples/ImageCarousel.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 12 | 13 | 39 | -------------------------------------------------------------------------------- /examples/vite/App.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 12 | 13 | 45 | -------------------------------------------------------------------------------- /.docs/.vitepress/components/examples/MultipleCarousel.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 12 | 13 | 47 | -------------------------------------------------------------------------------- /examples/nuxt-app/app.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 51 | -------------------------------------------------------------------------------- /.docs/public/layers-black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | layers 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.docs/public/layers-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | layers 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 brt 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /examples/nuxt-app/README.md: -------------------------------------------------------------------------------- 1 | # Nuxt Minimal Starter 2 | 3 | Look at the [Nuxt documentation](https://nuxt.com/docs/getting-started/introduction) to learn more. 4 | 5 | ## Setup 6 | 7 | Make sure to install dependencies: 8 | 9 | ```bash 10 | # npm 11 | npm install 12 | 13 | # pnpm 14 | pnpm install 15 | 16 | # yarn 17 | yarn install 18 | 19 | # bun 20 | bun install 21 | ``` 22 | 23 | ## Development Server 24 | 25 | Start the development server on `http://localhost:3000`: 26 | 27 | ```bash 28 | # npm 29 | npm run dev 30 | 31 | # pnpm 32 | pnpm dev 33 | 34 | # yarn 35 | yarn dev 36 | 37 | # bun 38 | bun run dev 39 | ``` 40 | 41 | ## Production 42 | 43 | Build the application for production: 44 | 45 | ```bash 46 | # npm 47 | npm run build 48 | 49 | # pnpm 50 | pnpm build 51 | 52 | # yarn 53 | yarn build 54 | 55 | # bun 56 | bun run build 57 | ``` 58 | 59 | Locally preview production build: 60 | 61 | ```bash 62 | # npm 63 | npm run preview 64 | 65 | # pnpm 66 | pnpm preview 67 | 68 | # yarn 69 | yarn preview 70 | 71 | # bun 72 | bun run preview 73 | ``` 74 | 75 | Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information. 76 | -------------------------------------------------------------------------------- /.docs/getting-started.md: -------------------------------------------------------------------------------- 1 | # Getting started 2 | 3 | ## Requirements 4 | - **Vue 3** 5 | - **Node.js v20+** 6 | 7 | ## Installation 8 | 9 | ::: code-group 10 | 11 | ```bash [npm] 12 | npm install vue-snap 13 | ``` 14 | 15 | ```bash [pnpm] 16 | pnpm install vue-snap 17 | ``` 18 | 19 | ```bash [yarn] 20 | yarn install vue-snap 21 | ``` 22 | 23 | ::: 24 | 25 | ## Global Registration 26 | ```js 27 | import { createApp } from 'vue'; 28 | import VueSnap from 'vue-snap'; 29 | import 'vue-snap/dist/vue-snap.css'; 30 | 31 | const myApp = createApp(App); 32 | 33 | myApp.use(VueSnap); 34 | ``` 35 | 36 | ## Local Registration 37 | ```js 38 | import { Carousel, Slide } from 'vue-snap'; 39 | import 'vue-snap/dist/vue-snap.css'; 40 | 41 | export default { 42 | components: { 43 | Carousel, 44 | Slide 45 | } 46 | }; 47 | ``` 48 | 49 | ## Nuxt 50 | 51 | ### 1. Create a plugin 52 | 53 | `plugins/vue-snap.ts` 54 | 55 | ```ts 56 | import VueSnap from 'vue-snap' 57 | 58 | export default defineNuxtPlugin((nuxtApp) => { 59 | nuxtApp.vueApp.use(VueSnap); 60 | }); 61 | ``` 62 | 63 | ### 2. Import Styles 64 | 65 | `nuxt.config.ts` 66 | 67 | ```ts 68 | export default defineNuxtConfig({ 69 | css: ['vue-snap/dist/vue-snap.css'] 70 | }); 71 | ``` 72 | -------------------------------------------------------------------------------- /.docs/public/mix-black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | mix 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.docs/public/mix-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | mix 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.docs/public/spartial-black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | spatial 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.docs/public/spartial-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | spatial 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.docs/.vitepress/components/examples/RandomCarousel.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 25 | 26 | 60 | -------------------------------------------------------------------------------- /.docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: home 3 | 4 | hero: 5 | name: "Vue Snap" 6 | text: "Scroll Snap Carousel" 7 | actions: 8 | - theme: brand 9 | text: Getting started 10 | link: /getting-started 11 | - theme: alt 12 | text: Examples 13 | link: /examples 14 | features: 15 | - icon: 16 | light: /mix-black.svg 17 | dark: /mix-white.svg 18 | title: Lightweight 19 | details: Just 4KB, fast and efficient. 20 | - icon: 21 | light: /layers-black.svg 22 | dark: /layers-white.svg 23 | title: Modern 24 | details: Built with native CSS Scroll Snapping. 25 | - icon: 26 | light: /spartial-black.svg 27 | dark: /spartial-white.svg 28 | title: Modular 29 | details: Easily customizable, with minimal effort. 30 | --- 31 | 32 | ### About 33 | The idea behind this plugin is to create a fully responsive and well-optimized carousel. We’ve used modern CSS features like [Scroll Snapping](https://developers.google.com/web/updates/2018/07/css-scroll-snap), which allows the carousel wrapper to lock onto specific slides or positions after the user finishes scrolling. This approach helps us minimize the library size by including only the essential parts, and it avoids heavy JavaScript computations or CSS hacks. 34 | 35 | 36 | ### Examples 37 | 38 | 39 | -------------------------------------------------------------------------------- /.docs/.vitepress/config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitepress' 2 | import { groupIconMdPlugin, groupIconVitePlugin } from 'vitepress-plugin-group-icons' 3 | 4 | // https://vitepress.dev/reference/site-config 5 | export default defineConfig({ 6 | lang: 'en-US', 7 | title: "VueSnap", 8 | description: "CSS Scroll Snap Carousel", 9 | themeConfig: { 10 | logo: '/logo.svg', 11 | nav: [ 12 | { text: 'Home', link: '/' }, 13 | { text: 'Getting Started', link: '/getting-started' }, 14 | { text: 'Examples', link: '/examples' }, 15 | { text: 'API', link: '/api' }, 16 | ], 17 | 18 | sidebar: [ 19 | { 20 | text: 'VueSnap', 21 | items: [ 22 | { text: 'Getting Started', link: '/getting-started' }, 23 | { text: 'Examples', link: '/examples' }, 24 | { text: 'API', link: '/api' }, 25 | ] 26 | }, 27 | ], 28 | 29 | socialLinks: [ 30 | { icon: 'github', link: 'https://github.com/bartdominiak/vue-snap' } 31 | ], 32 | footer: { 33 | // message: 'Released under the MIT License', 34 | copyright: 'Copyright © 2025' 35 | } 36 | }, 37 | markdown: { 38 | config(md) { 39 | md.use(groupIconMdPlugin) 40 | }, 41 | }, 42 | vite: { 43 | plugins: [ 44 | groupIconVitePlugin(), 45 | ], 46 | } 47 | }) 48 | -------------------------------------------------------------------------------- /.docs/.vitepress/theme/index.js: -------------------------------------------------------------------------------- 1 | // .vitepress/theme/index.js 2 | import MyLayout from './Layout.vue'; 3 | import HeroCarousel from '../components/HeroCarousel.vue'; 4 | import BasicCarousel from '../components/examples/BasicCarousel.vue'; 5 | import MultipleCarousel from '../components/examples/MultipleCarousel.vue'; 6 | import ImageCarousel from '../components/examples/ImageCarousel.vue'; 7 | import PreviewCarousel from '../components/examples/PreviewCarousel.vue'; 8 | import AutoplayCarousel from '../components/examples/AutoplayCarousel.vue'; 9 | import RandomCarousel from '../components/examples/RandomCarousel.vue'; 10 | import DefaultTheme from 'vitepress/theme'; 11 | import VueSnap from 'vue-snap'; 12 | import 'vue-snap/dist/vue-snap.css'; 13 | import './custom.css'; 14 | import 'virtual:group-icons.css'; 15 | 16 | export default { 17 | extends: DefaultTheme, 18 | Layout: MyLayout, 19 | enhanceApp({ app }) { 20 | app.component('HeroCarousel', HeroCarousel); 21 | app.component('BasicCarousel', BasicCarousel); 22 | app.component('MultipleCarousel', MultipleCarousel); 23 | app.component('ImageCarousel', ImageCarousel); 24 | app.component('PreviewCarousel', PreviewCarousel); 25 | app.component('AutoplayCarousel', AutoplayCarousel); 26 | app.component('RandomCarousel', RandomCarousel); 27 | app.use(VueSnap); 28 | }, 29 | } 30 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import globals from "globals"; 2 | import pluginVue from "eslint-plugin-vue"; 3 | import pluginTS from "@typescript-eslint/eslint-plugin"; 4 | import tsParser from "@typescript-eslint/parser"; 5 | import vueParser from "vue-eslint-parser"; 6 | import { defineConfig } from "eslint/config"; 7 | 8 | export default defineConfig([ 9 | { 10 | files: ["**/*.js"], 11 | languageOptions: { 12 | sourceType: "script", 13 | globals: globals.browser, 14 | }, 15 | }, 16 | 17 | { 18 | files: ["**/*.{ts}"], 19 | languageOptions: { 20 | globals: globals.browser, 21 | parser: tsParser, 22 | parserOptions: { 23 | ecmaVersion: 2023, 24 | sourceType: "module", 25 | ecmaFeatures: { 26 | jsx: true, 27 | }, 28 | }, 29 | }, 30 | plugins: { 31 | "@typescript-eslint": pluginTS, 32 | } 33 | }, 34 | 35 | { 36 | files: ["**/*.vue"], 37 | languageOptions: { 38 | globals: globals.browser, 39 | parser: vueParser, 40 | parserOptions: { 41 | parser: tsParser, 42 | ecmaVersion: 2023, 43 | sourceType: "module", 44 | extraFileExtensions: [".vue"], 45 | }, 46 | }, 47 | plugins: { 48 | vue: pluginVue, 49 | "@typescript-eslint": pluginTS, 50 | }, 51 | }, 52 | 53 | pluginVue.configs["flat/recommended"], 54 | { 55 | rules: { 56 | 'vue/multi-word-component-names': 'off', 57 | }, 58 | }, 59 | ]); 60 | -------------------------------------------------------------------------------- /.docs/.vitepress/components/examples/AutoplayCarousel.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 35 | 36 | 70 | -------------------------------------------------------------------------------- /.docs/.vitepress/components/HeroCarousel.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 35 | 36 | 68 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-snap", 3 | "version": "1.1.0", 4 | "type": "module", 5 | "description": "Lightweight Carousel based on CSS Scroll Snap", 6 | "main": "dist/vue-snap.umd.js", 7 | "module": "dist/vue-snap.es.js", 8 | "unpkg": "dist/vue-snap.js", 9 | "engines": { 10 | "node": ">=20" 11 | }, 12 | "exports": { 13 | ".": { 14 | "import": "./dist/vue-snap.es.js", 15 | "require": "./dist/vue-snap.umd.js" 16 | }, 17 | "./dist/vue-snap.css": "./dist/vue-snap.css" 18 | }, 19 | "scripts": { 20 | "release": "vue-tsc -b && vite build -c ./config/vite.config.ts", 21 | "lint": "eslint 'src/**/*.{ts,vue}'", 22 | "test": "test --passWithNoTests" 23 | }, 24 | "repository": { 25 | "type": "git", 26 | "url": "https://github.com/bartdominiak/vue-snap.git" 27 | }, 28 | "keywords": [ 29 | "vue", 30 | "vue-snap", 31 | "carousel", 32 | "slider", 33 | "scroll-snap" 34 | ], 35 | "author": "smugers@gmail.com", 36 | "license": "MIT", 37 | "bugs": { 38 | "url": "https://github.com/bartdominiak/vue-snap/issues" 39 | }, 40 | "homepage": "https://github.com/bartdominiak/vue-snap#README", 41 | "peerDependencies": { 42 | "vue": "^3.5.16" 43 | }, 44 | "devDependencies": { 45 | "@eslint/eslintrc": "^3.3.1", 46 | "@eslint/js": "^9.29.0", 47 | "@typescript-eslint/eslint-plugin": "^8.34.1", 48 | "@typescript-eslint/parser": "^8.34.1", 49 | "@vitejs/plugin-vue": "^5.2.4", 50 | "@vue/tsconfig": "^0.7.0", 51 | "eslint": "^9.29.0", 52 | "eslint-plugin-vue": "^10.2.0", 53 | "globals": "^16.2.0", 54 | "lodash": "^4.17.21", 55 | "sass-embedded": "^1.89.2", 56 | "typescript": "~5.8.3", 57 | "vite": "^6.3.5", 58 | "vue-eslint-parser": "^10.1.3", 59 | "vue-tsc": "^2.2.10" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /.docs/api.md: -------------------------------------------------------------------------------- 1 | # API 2 | 3 | # Vue Snap Carousel – API 4 | 5 | ## Props 6 | 7 | | Prop | Type | Default | Description | 8 | |---------------------|---------|-------------------------------------------------------|----------------------------------------------------| 9 | | `hideArrows` | Boolean | `false` | Hides navigation arrows | 10 | | `hideArrowsOnBound` | Boolean | `false` | Hides arrows when at the first or last slide | 11 | | `tag` | String | `'ul'` | HTML tag used for the slide container | 12 | | `i18n` | Object | `{ slideLeft: 'Slide left', slideRight: 'Slide right' }` | Translations for accessibility and tooltips | 13 | 14 | ## Events 15 | 16 | | Event | Payload | Description | 17 | |----------------|------------|------------------------------------------| 18 | | `mounted` | - | Emitted when the carousel is mounted | 19 | | `slide-change` | `Number` | Emitted on slide change (new index) | 20 | | `left-bound` | `Boolean` | Emitted when the first slide is reached | 21 | | `right-bound` | `Boolean` | Emitted when the last slide is reached | 22 | 23 | ## Slots 24 | 25 | | Slot | Description | 26 | |-----------|--------------------------------| 27 | | `default` | Slot for slide content | 28 | | `arrows` | Slot for custom arrow controls | 29 | 30 | ## Functions 31 | 32 | | Method | Parameters | Description | 33 | |---------------|-------------------------------|-----------------------------------------------| 34 | | `goToSlide` | `index: Number` | Navigates to a specific slide by index | 35 | | `changeSlide` | `direction: Number (1 or -1)` | Moves forward (1) or backward (-1) one slide | 36 | -------------------------------------------------------------------------------- /dist/vue-snap.js: -------------------------------------------------------------------------------- 1 | var VueSnap=function(c,e){"use strict";const b=typeof window<"u",C=(l,t,n=5)=>Math.abs(l-t)<=n;function k(l,t){let n=null;const i=(...d)=>{n&&clearTimeout(n),n=setTimeout(()=>{l(...d)},t)};return i.cancel=()=>{n&&clearTimeout(n),n=null},i}const E=100;function T(l,t){const n=e.ref(!0),i=e.ref(!1),d=e.ref(0),a=()=>t.value?Array.from(t.value.children??[]).map(o=>({offsetLeft:o.offsetLeft,offsetWidth:o.offsetWidth})):[],S=o=>t.value?o.findIndex(({offsetLeft:s})=>C(s,t.value.scrollLeft,10)):-1,h=o=>{if(!t.value)return;const{scrollLeft:s,offsetWidth:f,scrollWidth:B}=t.value;o!==d.value&&l("slideChange",o),d.value=o;const _=o===0,O=C(s+f,B,10);_?(n.value=!0,l("leftBound",!0)):n.value=!1,O?(i.value=!0,l("rightBound",!0)):i.value=!1},m=o=>{const s=a(),f=S(s);if(f===-1)return;const B=f+o,_=s[B];!_||!t.value||t.value.scrollTo({left:_.offsetLeft,behavior:"smooth"})},r=o=>{const f=a()[o];!f||!t.value||t.value.scrollTo({left:f.offsetLeft,behavior:"smooth"})},u=()=>{const o=a(),s=S(o);s!==-1&&h(s)},g=k(u,E);return e.onMounted(()=>{!b||!t.value||(u(),t.value.addEventListener("scroll",g),l("mounted",!0))}),e.onBeforeUnmount(()=>{!b||!t.value||t.value.removeEventListener("scroll",g)}),{goToSlide:r,changeSlide:m,isBoundLeft:n,isBoundRight:i}}const I={class:"vs-carousel"},R=["aria-label","disabled"],p=["aria-label","disabled"],w=e.defineComponent({__name:"Carousel",props:{tag:{default:"ul"},hideArrowsOnBound:{type:Boolean,default:!1},i18n:{default:()=>({slideLeft:"Slide left",slideRight:"Slide right"})}},emits:["mounted","slideChange","leftBound","rightBound"],setup(l,{expose:t,emit:n}){const i=n,d=e.ref(null),{changeSlide:a,goToSlide:S,isBoundLeft:h,isBoundRight:m}=T(i,d);return t({changeSlide:a,goToSlide:S}),(r,u)=>(e.openBlock(),e.createElementBlock("div",I,[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(r.tag),{ref_key:"vsWrapper",ref:d,class:"vs-carousel__wrapper"},{default:e.withCtx(()=>[e.renderSlot(r.$slots,"default")]),_:3},512)),e.renderSlot(r.$slots,"arrows",e.normalizeProps(e.guardReactiveProps({changeSlide:e.unref(a),isBoundLeft:e.unref(h),isBoundRight:e.unref(m)})),()=>[e.withDirectives(e.createElementVNode("button",{type:"button","aria-label":r.i18n.slideLeft,disabled:e.unref(h),class:"vs-carousel__arrows vs-carousel__arrows--left",onClick:u[0]||(u[0]=g=>e.unref(a)(-1))}," ← ",8,R),[[e.vShow,r.hideArrowsOnBound?!e.unref(h):!0]]),e.withDirectives(e.createElementVNode("button",{type:"button","aria-label":r.i18n.slideRight,disabled:e.unref(m),class:"vs-carousel__arrows vs-carousel__arrows--right",onClick:u[1]||(u[1]=g=>e.unref(a)(1))}," → ",8,p),[[e.vShow,r.hideArrowsOnBound?!e.unref(m):!0]])])]))}}),L=e.defineComponent({__name:"Slide",props:{tag:{type:String,default:"li"}},setup(l){return(t,n)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(l.tag),{ref:"vsSlide",class:"vs-carousel__slide",tabindex:"0"},{default:e.withCtx(()=>[e.renderSlot(t.$slots,"default")]),_:3},512))}}),y={install:l=>{l.component("Carousel",w),l.component("Slide",L)}};return c.Carousel=w,c.Slide=L,c.VueSnap=y,c.default=y,Object.defineProperties(c,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),c}({},Vue); 2 | -------------------------------------------------------------------------------- /src/components/Carousel.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 74 | 75 | 128 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vue-snap 2 | 3 | > 🌿 Modern, lightweight Vue 3 Carousel powered by CSS Scroll Snap. 4 | 5 |
6 | vue-snap logo 7 |
8 | 9 | [![npm version](https://badge.fury.io/js/vue-snap.svg?icon=si%3Anpm)](https://badge.fury.io/js/vue-snap) 10 | ![npm bundle size](https://img.shields.io/bundlephobia/minzip/vue-snap) 11 | [![license](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/bartdominiak/vue-snap/blob/master/LICENSE.md) 12 | [![MadeWithVueJs.com shield](https://madewithvuejs.com/storage/repo-shields/5792-shield.svg)](https://madewithvuejs.com/p/vuesnap/shield-link) 13 | 14 | ## Table of Contents 15 | - [Docs](https://vue-snap.vercel.app/) 16 | - [About](#about) 17 | - [Examples/Stories](#examplesstories) 18 | - [Installation & Usage](#installation--usage) 19 | - [Examples Usage](#examples-usage) 20 | - [Contribution](#contribution) 21 | - [License](#license) 22 | 23 | ## About 24 | The idea behind this plugin is to create a fully responsive and well-optimized carousel. We’ve used modern CSS features like [Scroll Snapping](https://developers.google.com/web/updates/2018/07/css-scroll-snap), which allows the carousel wrapper to lock onto specific slides or positions after the user finishes scrolling. This approach helps us minimize the library size by including only the essential parts, and it avoids heavy JavaScript computations or CSS hacks. 25 | 26 | ## Examples/Stories 27 | - 📕 [Example](https://vue-snap.vercel.app/examples.html) 28 | - 📺 [Props/Events/Slots](https://vue-snap.vercel.app/api.html) 29 | 30 | - **Lightweight** – Only 4KB, fast and efficient. 31 | - **No calculations or heavy logic** – performance-first approach 32 | - **Fully responsive** – most customization is handled via CSS (e.g. number of visible slides) 33 | - **ESM bundle with tree-shaking** – dead code is automatically eliminated 34 | - **SSR support** – works with frameworks like Nuxt.js 🎉 [More here](https://github.com/bartdominiak/vue-snap/tree/master/examples) 35 | - **Vue 3 support** 🎉 [More here](#installation--usage) 36 | - **Modern browser support** – compatible with all common browsers [More here](https://caniuse.com/css-snappoints) 37 | 38 | ## Installation & Usage 39 | ### Installation 40 | 41 | ```terminal 42 | pnpm add vue-snap 43 | yarn add vue-snap 44 | npm install vue-snap 45 | ``` 46 | 47 | ### Usage - Globally 48 | 49 | ```js 50 | import { createApp } from 'vue' 51 | import App from './App.vue' 52 | 53 | import VueSnap from 'vue-snap' 54 | import 'vue-snap/dist/vue-snap.css' 55 | 56 | const myApp = createApp(App) 57 | 58 | myApp.use(VueSnap) 59 | myApp.mount('#app') 60 | ``` 61 | 62 | ### Usage - Locally 63 | 64 | ```js 65 | import { Carousel, Slide } from 'vue-snap' 66 | import 'vue-snap/dist/vue-snap.css' 67 | 68 | export default { 69 | components: { 70 | Carousel, 71 | Slide 72 | } 73 | } 74 | ``` 75 | 76 | ## Examples usage 77 | Check out [examples](https://github.com/bartdominiak/vue-snap/tree/master/examples) folder for more details or [documentation](https://vue-snap.vercel.app/) 78 | 79 | ## Contribution 80 | If you have a feature request then feel free to start a new issue, or just grab existing one. 81 | 82 | ## License 83 | MIT 84 | -------------------------------------------------------------------------------- /dist/vue-snap.umd.js: -------------------------------------------------------------------------------- 1 | (function(s,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(s=typeof globalThis<"u"?globalThis:s||self,e(s.VueSnap={},s.Vue))})(this,function(s,e){"use strict";const b=typeof window<"u",C=(l,t,n=5)=>Math.abs(l-t)<=n;function y(l,t){let n=null;const a=(...u)=>{n&&clearTimeout(n),n=setTimeout(()=>{l(...u)},t)};return a.cancel=()=>{n&&clearTimeout(n),n=null},a}const T=100;function k(l,t){const n=e.ref(!0),a=e.ref(!1),u=e.ref(0),d=()=>t.value?Array.from(t.value.children??[]).map(o=>({offsetLeft:o.offsetLeft,offsetWidth:o.offsetWidth})):[],S=o=>t.value?o.findIndex(({offsetLeft:r})=>C(r,t.value.scrollLeft,10)):-1,h=o=>{if(!t.value)return;const{scrollLeft:r,offsetWidth:c,scrollWidth:B}=t.value;o!==u.value&&l("slideChange",o),u.value=o;const _=o===0,O=C(r+c,B,10);_?(n.value=!0,l("leftBound",!0)):n.value=!1,O?(a.value=!0,l("rightBound",!0)):a.value=!1},m=o=>{const r=d(),c=S(r);if(c===-1)return;const B=c+o,_=r[B];!_||!t.value||t.value.scrollTo({left:_.offsetLeft,behavior:"smooth"})},i=o=>{const c=d()[o];!c||!t.value||t.value.scrollTo({left:c.offsetLeft,behavior:"smooth"})},f=()=>{const o=d(),r=S(o);r!==-1&&h(r)},g=y(f,T);return e.onMounted(()=>{!b||!t.value||(f(),t.value.addEventListener("scroll",g),l("mounted",!0))}),e.onBeforeUnmount(()=>{!b||!t.value||t.value.removeEventListener("scroll",g)}),{goToSlide:i,changeSlide:m,isBoundLeft:n,isBoundRight:a}}const E={class:"vs-carousel"},I=["aria-label","disabled"],R=["aria-label","disabled"],w=e.defineComponent({__name:"Carousel",props:{tag:{default:"ul"},hideArrowsOnBound:{type:Boolean,default:!1},i18n:{default:()=>({slideLeft:"Slide left",slideRight:"Slide right"})}},emits:["mounted","slideChange","leftBound","rightBound"],setup(l,{expose:t,emit:n}){const a=n,u=e.ref(null),{changeSlide:d,goToSlide:S,isBoundLeft:h,isBoundRight:m}=k(a,u);return t({changeSlide:d,goToSlide:S}),(i,f)=>(e.openBlock(),e.createElementBlock("div",E,[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(i.tag),{ref_key:"vsWrapper",ref:u,class:"vs-carousel__wrapper"},{default:e.withCtx(()=>[e.renderSlot(i.$slots,"default")]),_:3},512)),e.renderSlot(i.$slots,"arrows",e.normalizeProps(e.guardReactiveProps({changeSlide:e.unref(d),isBoundLeft:e.unref(h),isBoundRight:e.unref(m)})),()=>[e.withDirectives(e.createElementVNode("button",{type:"button","aria-label":i.i18n.slideLeft,disabled:e.unref(h),class:"vs-carousel__arrows vs-carousel__arrows--left",onClick:f[0]||(f[0]=g=>e.unref(d)(-1))}," ← ",8,I),[[e.vShow,i.hideArrowsOnBound?!e.unref(h):!0]]),e.withDirectives(e.createElementVNode("button",{type:"button","aria-label":i.i18n.slideRight,disabled:e.unref(m),class:"vs-carousel__arrows vs-carousel__arrows--right",onClick:f[1]||(f[1]=g=>e.unref(d)(1))}," → ",8,R),[[e.vShow,i.hideArrowsOnBound?!e.unref(m):!0]])])]))}}),L=e.defineComponent({__name:"Slide",props:{tag:{type:String,default:"li"}},setup(l){return(t,n)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(l.tag),{ref:"vsSlide",class:"vs-carousel__slide",tabindex:"0"},{default:e.withCtx(()=>[e.renderSlot(t.$slots,"default")]),_:3},512))}}),p={install:l=>{l.component("Carousel",w),l.component("Slide",L)}};s.Carousel=w,s.Slide=L,s.VueSnap=p,s.default=p,Object.defineProperties(s,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}); 2 | -------------------------------------------------------------------------------- /.docs/.vitepress/components/examples/PreviewCarousel.vue: -------------------------------------------------------------------------------- 1 | 35 | 36 | 61 | 62 | 163 | -------------------------------------------------------------------------------- /src/hooks/useCarousel.ts: -------------------------------------------------------------------------------- 1 | import { ref, onMounted, onBeforeUnmount } from 'vue'; 2 | import { isClient, approximatelyEqual, debounce } from '../utils/helpers'; 3 | import type { Ref } from 'vue'; 4 | 5 | const SCROLL_DEBOUNCE = 100; 6 | 7 | type CarouselEmits = { 8 | (e: 'mounted', value: boolean): void; 9 | (e: 'slideChange', index: number): void; 10 | (e: 'leftBound', value: boolean): void; 11 | (e: 'rightBound', value: boolean): void; 12 | }; 13 | 14 | type Slide = { 15 | offsetLeft: number; 16 | offsetWidth: number; 17 | }; 18 | 19 | export function useCarousel(emit: CarouselEmits, vsWrapper: Ref) { 20 | const isBoundLeft = ref(true); 21 | const isBoundRight = ref(false); 22 | const currentIndex = ref(0); 23 | 24 | const getSlides = (): Slide[] => { 25 | if (!vsWrapper.value) return []; 26 | 27 | return Array.from(vsWrapper.value.children ?? []).map( 28 | (child: Element): Slide => ({ 29 | offsetLeft: (child as HTMLElement).offsetLeft, 30 | offsetWidth: (child as HTMLElement).offsetWidth, 31 | }) 32 | ); 33 | }; 34 | 35 | const getCurrentIndex = (slides: Slide[]) => { 36 | if (!vsWrapper.value) return -1; 37 | return slides.findIndex(({ offsetLeft }) => approximatelyEqual(offsetLeft, vsWrapper.value!.scrollLeft, 10)); 38 | } 39 | 40 | const updateBoundaries = (index: number) => { 41 | if (!vsWrapper.value) return; 42 | 43 | const { scrollLeft, offsetWidth, scrollWidth } = vsWrapper.value; 44 | 45 | if (index !== currentIndex.value) { 46 | emit('slideChange', index); 47 | } 48 | 49 | currentIndex.value = index; 50 | 51 | const atStart = index === 0; 52 | const atEnd = approximatelyEqual(scrollLeft + offsetWidth, scrollWidth, 10); 53 | 54 | if (atStart) { 55 | isBoundLeft.value = true; 56 | emit('leftBound', true); 57 | } else { 58 | isBoundLeft.value = false; 59 | } 60 | 61 | if (atEnd) { 62 | isBoundRight.value = true; 63 | emit('rightBound', true); 64 | } else { 65 | isBoundRight.value = false; 66 | } 67 | }; 68 | 69 | const changeSlide = (direction: number) => { 70 | const slides = getSlides(); 71 | const currentIndex = getCurrentIndex(slides); 72 | 73 | if (currentIndex === -1) return; 74 | 75 | const nextIndex = currentIndex + direction; 76 | const targetSlide = slides[nextIndex]; 77 | 78 | if (!targetSlide || !vsWrapper.value) return; 79 | 80 | vsWrapper.value.scrollTo({ left: targetSlide.offsetLeft, behavior: 'smooth' }); 81 | // emit('slideChange', nextIndex); 82 | }; 83 | 84 | const goToSlide = (index: number) => { 85 | const slides = getSlides(); 86 | const targetSlide = slides[index]; 87 | 88 | if (!targetSlide || !vsWrapper.value) return; 89 | 90 | vsWrapper.value.scrollTo({ left: targetSlide.offsetLeft, behavior: 'smooth' }); 91 | // emit('slideChange', index); 92 | }; 93 | 94 | const refreshSlideState = () => { 95 | const slides = getSlides(); 96 | const currentIndex = getCurrentIndex(slides); 97 | 98 | if (currentIndex === -1) return; 99 | 100 | updateBoundaries(currentIndex); 101 | }; 102 | 103 | const handleScroll = debounce(refreshSlideState, SCROLL_DEBOUNCE); 104 | 105 | onMounted(() => { 106 | if (!isClient || !vsWrapper.value) return; 107 | 108 | refreshSlideState(); 109 | vsWrapper.value.addEventListener('scroll', handleScroll); 110 | emit('mounted', true); 111 | }); 112 | 113 | onBeforeUnmount(() => { 114 | if (!isClient || !vsWrapper.value) return; 115 | 116 | vsWrapper.value.removeEventListener('scroll', handleScroll); 117 | }); 118 | 119 | return { 120 | goToSlide, 121 | changeSlide, 122 | isBoundLeft, 123 | isBoundRight, 124 | }; 125 | } 126 | -------------------------------------------------------------------------------- /dist/vue-snap.es.js: -------------------------------------------------------------------------------- 1 | import { ref as _, onMounted as $, onBeforeUnmount as O, defineComponent as I, createElementBlock as A, openBlock as B, createBlock as R, renderSlot as b, resolveDynamicComponent as T, withCtx as k, normalizeProps as x, guardReactiveProps as D, unref as r, withDirectives as C, createElementVNode as L, vShow as w } from "vue"; 2 | const y = typeof window < "u", E = (n, e, t = 5) => Math.abs(n - e) <= t; 3 | function M(n, e) { 4 | let t = null; 5 | const u = (...a) => { 6 | t && clearTimeout(t), t = setTimeout(() => { 7 | n(...a); 8 | }, e); 9 | }; 10 | return u.cancel = () => { 11 | t && clearTimeout(t), t = null; 12 | }, u; 13 | } 14 | const N = 100; 15 | function P(n, e) { 16 | const t = _(!0), u = _(!1), a = _(0), i = () => e.value ? Array.from(e.value.children ?? []).map( 17 | (o) => ({ 18 | offsetLeft: o.offsetLeft, 19 | offsetWidth: o.offsetWidth 20 | }) 21 | ) : [], v = (o) => e.value ? o.findIndex(({ offsetLeft: l }) => E(l, e.value.scrollLeft, 10)) : -1, c = (o) => { 22 | if (!e.value) return; 23 | const { scrollLeft: l, offsetWidth: f, scrollWidth: S } = e.value; 24 | o !== a.value && n("slideChange", o), a.value = o; 25 | const g = o === 0, p = E(l + f, S, 10); 26 | g ? (t.value = !0, n("leftBound", !0)) : t.value = !1, p ? (u.value = !0, n("rightBound", !0)) : u.value = !1; 27 | }, h = (o) => { 28 | const l = i(), f = v(l); 29 | if (f === -1) return; 30 | const S = f + o, g = l[S]; 31 | !g || !e.value || e.value.scrollTo({ left: g.offsetLeft, behavior: "smooth" }); 32 | }, s = (o) => { 33 | const f = i()[o]; 34 | !f || !e.value || e.value.scrollTo({ left: f.offsetLeft, behavior: "smooth" }); 35 | }, d = () => { 36 | const o = i(), l = v(o); 37 | l !== -1 && c(l); 38 | }, m = M(d, N); 39 | return $(() => { 40 | !y || !e.value || (d(), e.value.addEventListener("scroll", m), n("mounted", !0)); 41 | }), O(() => { 42 | !y || !e.value || e.value.removeEventListener("scroll", m); 43 | }), { 44 | goToSlide: s, 45 | changeSlide: h, 46 | isBoundLeft: t, 47 | isBoundRight: u 48 | }; 49 | } 50 | const U = { class: "vs-carousel" }, V = ["aria-label", "disabled"], q = ["aria-label", "disabled"], z = /* @__PURE__ */ I({ 51 | __name: "Carousel", 52 | props: { 53 | tag: { default: "ul" }, 54 | hideArrowsOnBound: { type: Boolean, default: !1 }, 55 | i18n: { default: () => ({ 56 | slideLeft: "Slide left", 57 | slideRight: "Slide right" 58 | }) } 59 | }, 60 | emits: ["mounted", "slideChange", "leftBound", "rightBound"], 61 | setup(n, { expose: e, emit: t }) { 62 | const u = t, a = _(null), { changeSlide: i, goToSlide: v, isBoundLeft: c, isBoundRight: h } = P(u, a); 63 | return e({ 64 | changeSlide: i, 65 | goToSlide: v 66 | }), (s, d) => (B(), A("div", U, [ 67 | (B(), R(T(s.tag), { 68 | ref_key: "vsWrapper", 69 | ref: a, 70 | class: "vs-carousel__wrapper" 71 | }, { 72 | default: k(() => [ 73 | b(s.$slots, "default") 74 | ]), 75 | _: 3 76 | }, 512)), 77 | b(s.$slots, "arrows", x(D({ changeSlide: r(i), isBoundLeft: r(c), isBoundRight: r(h) })), () => [ 78 | C(L("button", { 79 | type: "button", 80 | "aria-label": s.i18n.slideLeft, 81 | disabled: r(c), 82 | class: "vs-carousel__arrows vs-carousel__arrows--left", 83 | onClick: d[0] || (d[0] = (m) => r(i)(-1)) 84 | }, " ← ", 8, V), [ 85 | [w, s.hideArrowsOnBound ? !r(c) : !0] 86 | ]), 87 | C(L("button", { 88 | type: "button", 89 | "aria-label": s.i18n.slideRight, 90 | disabled: r(h), 91 | class: "vs-carousel__arrows vs-carousel__arrows--right", 92 | onClick: d[1] || (d[1] = (m) => r(i)(1)) 93 | }, " → ", 8, q), [ 94 | [w, s.hideArrowsOnBound ? !r(h) : !0] 95 | ]) 96 | ]) 97 | ])); 98 | } 99 | }), j = /* @__PURE__ */ I({ 100 | __name: "Slide", 101 | props: { 102 | /** 103 | * Custom tag 104 | */ 105 | tag: { 106 | type: String, 107 | default: "li" 108 | } 109 | }, 110 | setup(n) { 111 | return (e, t) => (B(), R(T(n.tag), { 112 | ref: "vsSlide", 113 | class: "vs-carousel__slide", 114 | tabindex: "0" 115 | }, { 116 | default: k(() => [ 117 | b(e.$slots, "default") 118 | ]), 119 | _: 3 120 | }, 512)); 121 | } 122 | }), G = { 123 | install: (n) => { 124 | n.component("Carousel", z), n.component("Slide", j); 125 | } 126 | }; 127 | export { 128 | z as Carousel, 129 | j as Slide, 130 | G as VueSnap, 131 | G as default 132 | }; 133 | -------------------------------------------------------------------------------- /.docs/examples.md: -------------------------------------------------------------------------------- 1 | # Examples 2 | This page demonstrates some of the examples of vue-snap usage. 3 | 4 | ## Basic 5 | 6 | 7 | 8 | ::: code-group 9 | 10 | ```html [App.vue] 11 | 12 | 13 | Slide {{ slide + 1 }} 14 | 15 | 16 | 17 | 20 | ``` 21 | 22 | ```scss [styles.scss] 23 | .my-carousel { 24 | .vs-carousel__wrapper { 25 | height: 200px; 26 | } 27 | } 28 | ``` 29 | 30 | ```css [styles.css] 31 | .my-carousel .vs-carousel__wrapper { 32 | height: 200px; 33 | } 34 | ``` 35 | 36 | ::: 37 | 38 | ## Multiple Slides 39 | 40 | 41 | 42 | ::: code-group 43 | 44 | ```html [App.vue] 45 | 46 | 47 | Slide {{ slide + 1 }} 48 | 49 | 50 | 51 | 54 | ``` 55 | 56 | ```scss [styles.scss] 57 | .my-carousel { 58 | .vs-carousel__wrapper { 59 | height: 200px; 60 | } 61 | 62 | .vs-carousel__slide { 63 | flex: 0 0 100%; 64 | 65 | @media (min-width: 500px) { 66 | flex: 0 0 50%; 67 | } 68 | 69 | @media (min-width: 768px) { 70 | flex: 0 0 33.33%; 71 | } 72 | } 73 | } 74 | ``` 75 | 76 | ```css [styles.css] 77 | .my-carousel .vs-carousel__wrapper { 78 | height: 200px; 79 | } 80 | 81 | .my-carousel .vs-carousel__slide { 82 | flex: 0 0 100%; 83 | } 84 | 85 | @media (min-width: 500px) { 86 | .my-carousel .vs-carousel__slide { 87 | flex: 0 0 50%; 88 | } 89 | } 90 | 91 | @media (min-width: 768px) { 92 | .my-carousel .vs-carousel__slide { 93 | flex: 0 0 33.33%; 94 | } 95 | } 96 | ``` 97 | 98 | ::: 99 | 100 | ## Multiple Images 101 | 102 | 103 | 104 | ::: code-group 105 | 106 | ```html [App.vue] 107 | 108 | 109 | Example slide description 110 | 111 | 112 | 113 | 116 | ``` 117 | 118 | ```scss [styles.scss] 119 | .my-carousel-images { 120 | .vs-carousel__wrapper { 121 | height: 200px; 122 | } 123 | 124 | .vs-carousel__slide { 125 | flex: 0 0 100%; 126 | 127 | @media (min-width: 500px) { 128 | flex: 0 0 50%; 129 | } 130 | 131 | @media (min-width: 768px) { 132 | flex: 0 0 33.33%; 133 | } 134 | 135 | @media (min-width: 1024px) { 136 | flex: 0 0 25%; 137 | } 138 | } 139 | } 140 | ``` 141 | 142 | ```css [styles.css] 143 | .my-carousel-images .vs-carousel__wrapper { 144 | height: 200px; 145 | } 146 | 147 | .my-carousel-images .vs-carousel__slide { 148 | flex: 0 0 100%; 149 | } 150 | 151 | @media (min-width: 500px) { 152 | .my-carousel-images .vs-carousel__slide { 153 | flex: 0 0 50%; 154 | } 155 | } 156 | 157 | @media (min-width: 768px) { 158 | .my-carousel-images .vs-carousel__slide { 159 | flex: 0 0 33.33%; 160 | } 161 | } 162 | 163 | @media (min-width: 1024px) { 164 | .my-carousel-images .vs-carousel__slide { 165 | flex: 0 0 25%; 166 | } 167 | } 168 | ``` 169 | 170 | ::: 171 | 172 | ## Autoplay 173 | 174 | 175 | ::: code-group 176 | 177 | ```html [App.vue] 178 | 190 | 191 | 212 | ``` 213 | 214 | ```scss [styles.scss] 215 | .my-carousel { 216 | .vs-carousel__wrapper { 217 | height: 200px; 218 | } 219 | 220 | .vs-carousel__slide { 221 | flex: 0 0 100%; 222 | 223 | @media (min-width: 500px) { 224 | flex: 0 0 50%; 225 | } 226 | 227 | @media (min-width: 768px) { 228 | flex: 0 0 33.33%; 229 | } 230 | } 231 | } 232 | ``` 233 | 234 | ```css [styles.css] 235 | .my-carousel .vs-carousel__wrapper { 236 | height: 200px; 237 | } 238 | 239 | .my-carousel .vs-carousel__slide { 240 | flex: 0 0 100%; 241 | } 242 | 243 | @media (min-width: 500px) { 244 | .my-carousel .vs-carousel__slide { 245 | flex: 0 0 50%; 246 | } 247 | } 248 | 249 | @media (min-width: 768px) { 250 | .my-carousel .vs-carousel__slide { 251 | flex: 0 0 33.33%; 252 | } 253 | } 254 | ``` 255 | 256 | ::: 257 | 258 | ## Slide to X 259 | 260 | 261 | ::: code-group 262 | 263 | ```html [App.vue] 264 | 276 | 277 | 290 | ``` 291 | 292 | ```scss [styles.scss] 293 | .my-carousel { 294 | .vs-carousel__wrapper { 295 | height: 200px; 296 | } 297 | 298 | .vs-carousel__slide { 299 | flex: 0 0 100%; 300 | 301 | @media (min-width: 500px) { 302 | flex: 0 0 50%; 303 | } 304 | 305 | @media (min-width: 768px) { 306 | flex: 0 0 33.33%; 307 | } 308 | } 309 | } 310 | ``` 311 | 312 | ```css [styles.css] 313 | .my-carousel .vs-carousel__wrapper { 314 | height: 200px; 315 | } 316 | 317 | .my-carousel .vs-carousel__slide { 318 | flex: 0 0 100%; 319 | } 320 | 321 | @media (min-width: 500px) { 322 | .my-carousel .vs-carousel__slide { 323 | flex: 0 0 50%; 324 | } 325 | } 326 | 327 | @media (min-width: 768px) { 328 | .my-carousel .vs-carousel__slide { 329 | flex: 0 0 33.33%; 330 | } 331 | } 332 | ``` 333 | 334 | ::: 335 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | All notable changes to this project will be documented in this file. 3 | 4 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 5 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 6 | 7 | ## [Unreleased] 8 | 9 | ## [1.1.0] - 2025-06-21 10 | ## Updated 11 | - Refactored core logic into a custom useCarousel hook 12 | - Removed unnecessary logic (e.g. resize events, lodash/debounce) 13 | - Simplified and optimized carousel calculations 14 | - Minified entire carousel bundle to just 4KB 15 | 16 | ## [1.0.3] - 2025-06-15 17 | 18 | ### Fixed 19 | - Package.json import/export destination files 20 | 21 | ## [1.0.2] - 2025-06-15 22 | 23 | ### Fixed 24 | - Package.json import/export destination files 25 | 26 | ## [1.0.1] - 2025-06-15 27 | 28 | ### Fixed 29 | - Package.json import/export destination files 30 | 31 | ## [1.0.0] - 2025-06-15 32 | 33 | ### Added 34 | - Vitepress docs 35 | ### Fixed 36 | - Github Workflow Pipeline 37 | ### Removed 38 | - Rollup configs 39 | - Storybook 40 | 41 | ## [0.7.1] - 2021-05-07 42 | 43 | ### Added 44 | - Mounted event 45 | ### Fixed 46 | - Prevent duplicated event page trigger 47 | 48 | ## [0.7.0] - 2021-02-08 49 | ### Removed 50 | - maxPages and its calculation (#55) 51 | 52 | ### Updated 53 | - Replace changeSlide with simpler goToSlide, for consistent behavior with exposed go-to-page API + removal of dependent method that is not in use anymore (#55) 54 | - Split getting current page index from setting it, supporting passing the index from outside, for example goToSlide method, so in some cases the index will change, even if there was no scroll event. (#55) 55 | 56 | ### Fixed 57 | - Fix support for calculating a proper current slide index, when there is nothing left to scroll (#55) 58 | 59 | ## [0.6.7] - 2021-02-08 60 | ### Added 61 | - Go to slide API (#54) 62 | 63 | ## [0.6.6] - 2020-12-06 64 | ### Updated 65 | - Rollback rollup-plugin-vue(6.0.0 => 5.1.9) 66 | 67 | ## [0.6.5] - 2020-12-05 68 | ### Updated 69 | - Dependencies 70 | 71 | ## [0.6.4] - 2020-11-29 72 | ### Added 73 | - changeSlide, BoundLeft, BoundRight inside slot-scope 74 | 75 | ## [0.6.3] - 2020-11-23 76 | ### Updated 77 | - elementScrollBy function name (#47) 78 | - Dependencies 79 | 80 | ## [0.6.2] - 2020-11-01 81 | ### Fixed 82 | - Slide children method 83 | 84 | ## [0.6.1] - 2020-09-24 85 | ### Updated 86 | - Yarn lock file 87 | 88 | ## [0.6.0] - 2020-09-24 89 | ### Removed 90 | - Removed maximum node version range (#41) 91 | - Node version max range (#41) 92 | 93 | ### Added 94 | - Added dynamic tag support (#41) 95 | - Added i18n support with proper validation (#41) 96 | - Reset list-style CSS (#41) 97 | 98 | ## [0.5.2] - 2020-09-21 99 | ### Updated 100 | - Rollup configs 101 | - Vue@2 and Vue@3 examples 102 | - Docs 103 | - Dependencies 104 | - TravisCI Config (Auto-deploy only Vue@2 version) 105 | 106 | ## [0.5.1] - 2020-09-17 107 | ### Updated 108 | - Docs 109 | 110 | ## [0.5.0] - 2020-09-17 111 | ### Added 112 | - Emit page and bound events (#35) 113 | - Slot/Props/Event descriptions 114 | 115 | ### Updated 116 | - seamless-scroll-polyfill (1.1.0 => 1.2.1) 117 | - Stories markups 118 | 119 | ## [0.4.0] - 2020-09-15 120 | ### Added 121 | - Ability to disable arrows and arrowsOnBound (#30) 122 | 123 | ### Fixed 124 | - Created onResizefn/onScrollFn variables to avoid memory leaks (#28) 125 | - Improve bound calculation precision (#28) 126 | - Avoiding undefined ref (#28) 127 | - Decrease MutationObserver scope only to vsWrapper 128 | 129 | ### Updated 130 | - Renamed Navigation slot to Arrows (#30) 131 | 132 | ## [0.3.4] - 2020-09-15 133 | ### Fixed 134 | - seamless-scroll-polyfill(^1.1.0 => 1.1.0) 135 | 136 | ## [0.3.3] - 2020-09-15 137 | ### Fixed 138 | - TravisCI Config with proper ENV variables 139 | 140 | ## [0.3.2] - 2020-09-15 141 | ### Added 142 | - Automated travis deployment 143 | 144 | ## [0.3.1] - 2020-09-14 145 | ### Updated 146 | - TravisCI configs 147 | 148 | ## [0.3.0] - 2020-09-05 149 | ### Added 150 | - Dynamic slides support (#25) 151 | 152 | ### Updated 153 | - Dependencies 154 | 155 | ## [0.2.0] - 2020-08-29 156 | ### Added 157 | - VueLazy lib 158 | 159 | ### Updated 160 | - Dependencies 161 | 162 | ### Deleted 163 | - Static height in wrapper (#22) 164 | - Old directives 165 | 166 | ## [0.1.0-beta.9] - 2020-08-26 167 | ### Updated 168 | - Dependencies 169 | 170 | ### Added 171 | - Missing type for button arrows (#21) 172 | 173 | ## [0.1.0-beta.8] - 2020-07-12 174 | ### Deleted 175 | - develop branch 176 | 177 | ### Updated 178 | - trigger deployment only on tag release 179 | 180 | ## [0.1.0-beta.7] - 2020-07-12 181 | ### Updated 182 | - changed spread to Array.from (reduce bundle size) 183 | 184 | ## [0.1.0-beta.6] - 2020-07-12 185 | ### Fixed 186 | - storybook typo 187 | 188 | ## [0.1.0-beta.5] - 2020-07-12 189 | ### Added 190 | - storybook-static folder to .npmignore 191 | 192 | ## [0.1.0-beta.4] - 2020-07-12 193 | ### Fixed 194 | - tag typo 195 | 196 | ## [0.1.0-beta.3] - 2020-07-12 197 | ### Added 198 | - non-regular slide widths Support (#16) 199 | - SSR Support (#13) 200 | - Event optimisation with debounce 201 | - Reorganize methods, and load only on need (like Events: Scroll, Resize, or on init) 202 | 203 | ### Updated 204 | - docs with new installation proccess 205 | 206 | ### Moved 207 | - rollup configs to seperate folders 208 | 209 | ## [0.1.0-beta.2] - 2020-06-24 210 | ### Added 211 | - Rollup init 212 | 213 | ### Deleted 214 | - Webpack configs 215 | 216 | ## [0.1.0-beta.1] - 2020-06-17 217 | ### Fixed 218 | - Docs: example relative url 219 | 220 | ### Added 221 | - seamless-scroll-polyfill package 222 | 223 | ### Deleted 224 | - Docs: removed example url 225 | - scss-loader and reduce final bundle size 226 | - comments in final bundle 227 | 228 | ### Moved 229 | - Vue as peerDependency 230 | 231 | ## [0.1.0-alpha.8] - 2020-06-14 232 | ### Fixed 233 | - Docs: Workaround for non-supported SSR plugin 234 | 235 | ## [0.1.0-alpha.7] - 2020-06-14 236 | ### Added 237 | - Docs: Intersection-observer polyfill 238 | 239 | ### Fixed 240 | - Docs: taking VueSnap from dist folder (compiled version) 241 | 242 | ## [0.1.0-alpha.6] - 2020-06-14 243 | ### Added 244 | - Scroll Smooth polyfill (#11) 245 | 246 | ## [0.1.0-alpha.5] - 2020-06-14 247 | ### Added 248 | - Lazyload support 249 | - Lazyload examples to docs and storybook 250 | 251 | ## [0.1.0-alpha.4] - 2020-06-13 252 | ### Added 253 | - Examples to docs 254 | - Babel presets 255 | 256 | ## [0.1.0-alpha.3] - 2020-06-13 257 | ### Added 258 | - docs & storybook deployment 259 | 260 | ## [0.1.0-alpha.2] - 2020-06-13 261 | ### Added 262 | - initialize eslint #8 263 | - initilize git hooks (husky) #8 264 | - initialize VuePress #6 265 | - Storybook Addons (docs, a11y, actions, knobs, viewport, storysource) #2 266 | - props/slots preview #2 267 | - initilize travis #7 268 | 269 | ## [0.1.0-alpha.1] - 2020-06-12 270 | ### Added 271 | - Project init 272 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | vue: 12 | specifier: ^3.5.16 13 | version: 3.5.16(typescript@5.8.3) 14 | devDependencies: 15 | '@eslint/eslintrc': 16 | specifier: ^3.3.1 17 | version: 3.3.1 18 | '@eslint/js': 19 | specifier: ^9.29.0 20 | version: 9.29.0 21 | '@typescript-eslint/eslint-plugin': 22 | specifier: ^8.34.1 23 | version: 8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0)(typescript@5.8.3))(eslint@9.29.0)(typescript@5.8.3) 24 | '@typescript-eslint/parser': 25 | specifier: ^8.34.1 26 | version: 8.34.1(eslint@9.29.0)(typescript@5.8.3) 27 | '@vitejs/plugin-vue': 28 | specifier: ^5.2.4 29 | version: 5.2.4(vite@6.3.5(sass-embedded@1.89.2))(vue@3.5.16(typescript@5.8.3)) 30 | '@vue/tsconfig': 31 | specifier: ^0.7.0 32 | version: 0.7.0(typescript@5.8.3)(vue@3.5.16(typescript@5.8.3)) 33 | eslint: 34 | specifier: ^9.29.0 35 | version: 9.29.0 36 | eslint-plugin-vue: 37 | specifier: ^10.2.0 38 | version: 10.2.0(eslint@9.29.0)(vue-eslint-parser@10.1.3(eslint@9.29.0)) 39 | globals: 40 | specifier: ^16.2.0 41 | version: 16.2.0 42 | lodash: 43 | specifier: ^4.17.21 44 | version: 4.17.21 45 | sass-embedded: 46 | specifier: ^1.89.2 47 | version: 1.89.2 48 | typescript: 49 | specifier: ~5.8.3 50 | version: 5.8.3 51 | vite: 52 | specifier: ^6.3.5 53 | version: 6.3.5(sass-embedded@1.89.2) 54 | vue-eslint-parser: 55 | specifier: ^10.1.3 56 | version: 10.1.3(eslint@9.29.0) 57 | vue-tsc: 58 | specifier: ^2.2.10 59 | version: 2.2.10(typescript@5.8.3) 60 | 61 | packages: 62 | 63 | '@babel/helper-string-parser@7.27.1': 64 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 65 | engines: {node: '>=6.9.0'} 66 | 67 | '@babel/helper-validator-identifier@7.27.1': 68 | resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 69 | engines: {node: '>=6.9.0'} 70 | 71 | '@babel/parser@7.27.5': 72 | resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} 73 | engines: {node: '>=6.0.0'} 74 | hasBin: true 75 | 76 | '@babel/types@7.27.6': 77 | resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} 78 | engines: {node: '>=6.9.0'} 79 | 80 | '@bufbuild/protobuf@2.5.2': 81 | resolution: {integrity: sha512-foZ7qr0IsUBjzWIq+SuBLfdQCpJ1j8cTuNNT4owngTHoN5KsJb8L9t65fzz7SCeSWzescoOil/0ldqiL041ABg==} 82 | 83 | '@esbuild/aix-ppc64@0.25.5': 84 | resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} 85 | engines: {node: '>=18'} 86 | cpu: [ppc64] 87 | os: [aix] 88 | 89 | '@esbuild/android-arm64@0.25.5': 90 | resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} 91 | engines: {node: '>=18'} 92 | cpu: [arm64] 93 | os: [android] 94 | 95 | '@esbuild/android-arm@0.25.5': 96 | resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} 97 | engines: {node: '>=18'} 98 | cpu: [arm] 99 | os: [android] 100 | 101 | '@esbuild/android-x64@0.25.5': 102 | resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} 103 | engines: {node: '>=18'} 104 | cpu: [x64] 105 | os: [android] 106 | 107 | '@esbuild/darwin-arm64@0.25.5': 108 | resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} 109 | engines: {node: '>=18'} 110 | cpu: [arm64] 111 | os: [darwin] 112 | 113 | '@esbuild/darwin-x64@0.25.5': 114 | resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} 115 | engines: {node: '>=18'} 116 | cpu: [x64] 117 | os: [darwin] 118 | 119 | '@esbuild/freebsd-arm64@0.25.5': 120 | resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} 121 | engines: {node: '>=18'} 122 | cpu: [arm64] 123 | os: [freebsd] 124 | 125 | '@esbuild/freebsd-x64@0.25.5': 126 | resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} 127 | engines: {node: '>=18'} 128 | cpu: [x64] 129 | os: [freebsd] 130 | 131 | '@esbuild/linux-arm64@0.25.5': 132 | resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} 133 | engines: {node: '>=18'} 134 | cpu: [arm64] 135 | os: [linux] 136 | 137 | '@esbuild/linux-arm@0.25.5': 138 | resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} 139 | engines: {node: '>=18'} 140 | cpu: [arm] 141 | os: [linux] 142 | 143 | '@esbuild/linux-ia32@0.25.5': 144 | resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} 145 | engines: {node: '>=18'} 146 | cpu: [ia32] 147 | os: [linux] 148 | 149 | '@esbuild/linux-loong64@0.25.5': 150 | resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} 151 | engines: {node: '>=18'} 152 | cpu: [loong64] 153 | os: [linux] 154 | 155 | '@esbuild/linux-mips64el@0.25.5': 156 | resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} 157 | engines: {node: '>=18'} 158 | cpu: [mips64el] 159 | os: [linux] 160 | 161 | '@esbuild/linux-ppc64@0.25.5': 162 | resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} 163 | engines: {node: '>=18'} 164 | cpu: [ppc64] 165 | os: [linux] 166 | 167 | '@esbuild/linux-riscv64@0.25.5': 168 | resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} 169 | engines: {node: '>=18'} 170 | cpu: [riscv64] 171 | os: [linux] 172 | 173 | '@esbuild/linux-s390x@0.25.5': 174 | resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} 175 | engines: {node: '>=18'} 176 | cpu: [s390x] 177 | os: [linux] 178 | 179 | '@esbuild/linux-x64@0.25.5': 180 | resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} 181 | engines: {node: '>=18'} 182 | cpu: [x64] 183 | os: [linux] 184 | 185 | '@esbuild/netbsd-arm64@0.25.5': 186 | resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} 187 | engines: {node: '>=18'} 188 | cpu: [arm64] 189 | os: [netbsd] 190 | 191 | '@esbuild/netbsd-x64@0.25.5': 192 | resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} 193 | engines: {node: '>=18'} 194 | cpu: [x64] 195 | os: [netbsd] 196 | 197 | '@esbuild/openbsd-arm64@0.25.5': 198 | resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} 199 | engines: {node: '>=18'} 200 | cpu: [arm64] 201 | os: [openbsd] 202 | 203 | '@esbuild/openbsd-x64@0.25.5': 204 | resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} 205 | engines: {node: '>=18'} 206 | cpu: [x64] 207 | os: [openbsd] 208 | 209 | '@esbuild/sunos-x64@0.25.5': 210 | resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} 211 | engines: {node: '>=18'} 212 | cpu: [x64] 213 | os: [sunos] 214 | 215 | '@esbuild/win32-arm64@0.25.5': 216 | resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} 217 | engines: {node: '>=18'} 218 | cpu: [arm64] 219 | os: [win32] 220 | 221 | '@esbuild/win32-ia32@0.25.5': 222 | resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} 223 | engines: {node: '>=18'} 224 | cpu: [ia32] 225 | os: [win32] 226 | 227 | '@esbuild/win32-x64@0.25.5': 228 | resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} 229 | engines: {node: '>=18'} 230 | cpu: [x64] 231 | os: [win32] 232 | 233 | '@eslint-community/eslint-utils@4.7.0': 234 | resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} 235 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 236 | peerDependencies: 237 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 238 | 239 | '@eslint-community/regexpp@4.12.1': 240 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 241 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 242 | 243 | '@eslint/config-array@0.20.1': 244 | resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==} 245 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 246 | 247 | '@eslint/config-helpers@0.2.2': 248 | resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} 249 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 250 | 251 | '@eslint/core@0.14.0': 252 | resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} 253 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 254 | 255 | '@eslint/eslintrc@3.3.1': 256 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 257 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 258 | 259 | '@eslint/js@9.29.0': 260 | resolution: {integrity: sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==} 261 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 262 | 263 | '@eslint/object-schema@2.1.6': 264 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 265 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 266 | 267 | '@eslint/plugin-kit@0.3.1': 268 | resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} 269 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 270 | 271 | '@humanfs/core@0.19.1': 272 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 273 | engines: {node: '>=18.18.0'} 274 | 275 | '@humanfs/node@0.16.6': 276 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 277 | engines: {node: '>=18.18.0'} 278 | 279 | '@humanwhocodes/module-importer@1.0.1': 280 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 281 | engines: {node: '>=12.22'} 282 | 283 | '@humanwhocodes/retry@0.3.1': 284 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 285 | engines: {node: '>=18.18'} 286 | 287 | '@humanwhocodes/retry@0.4.3': 288 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 289 | engines: {node: '>=18.18'} 290 | 291 | '@jridgewell/sourcemap-codec@1.5.0': 292 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 293 | 294 | '@nodelib/fs.scandir@2.1.5': 295 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 296 | engines: {node: '>= 8'} 297 | 298 | '@nodelib/fs.stat@2.0.5': 299 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 300 | engines: {node: '>= 8'} 301 | 302 | '@nodelib/fs.walk@1.2.8': 303 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 304 | engines: {node: '>= 8'} 305 | 306 | '@rollup/rollup-android-arm-eabi@4.42.0': 307 | resolution: {integrity: sha512-gldmAyS9hpj+H6LpRNlcjQWbuKUtb94lodB9uCz71Jm+7BxK1VIOo7y62tZZwxhA7j1ylv/yQz080L5WkS+LoQ==} 308 | cpu: [arm] 309 | os: [android] 310 | 311 | '@rollup/rollup-android-arm64@4.42.0': 312 | resolution: {integrity: sha512-bpRipfTgmGFdCZDFLRvIkSNO1/3RGS74aWkJJTFJBH7h3MRV4UijkaEUeOMbi9wxtxYmtAbVcnMtHTPBhLEkaw==} 313 | cpu: [arm64] 314 | os: [android] 315 | 316 | '@rollup/rollup-darwin-arm64@4.42.0': 317 | resolution: {integrity: sha512-JxHtA081izPBVCHLKnl6GEA0w3920mlJPLh89NojpU2GsBSB6ypu4erFg/Wx1qbpUbepn0jY4dVWMGZM8gplgA==} 318 | cpu: [arm64] 319 | os: [darwin] 320 | 321 | '@rollup/rollup-darwin-x64@4.42.0': 322 | resolution: {integrity: sha512-rv5UZaWVIJTDMyQ3dCEK+m0SAn6G7H3PRc2AZmExvbDvtaDc+qXkei0knQWcI3+c9tEs7iL/4I4pTQoPbNL2SA==} 323 | cpu: [x64] 324 | os: [darwin] 325 | 326 | '@rollup/rollup-freebsd-arm64@4.42.0': 327 | resolution: {integrity: sha512-fJcN4uSGPWdpVmvLuMtALUFwCHgb2XiQjuECkHT3lWLZhSQ3MBQ9pq+WoWeJq2PrNxr9rPM1Qx+IjyGj8/c6zQ==} 328 | cpu: [arm64] 329 | os: [freebsd] 330 | 331 | '@rollup/rollup-freebsd-x64@4.42.0': 332 | resolution: {integrity: sha512-CziHfyzpp8hJpCVE/ZdTizw58gr+m7Y2Xq5VOuCSrZR++th2xWAz4Nqk52MoIIrV3JHtVBhbBsJcAxs6NammOQ==} 333 | cpu: [x64] 334 | os: [freebsd] 335 | 336 | '@rollup/rollup-linux-arm-gnueabihf@4.42.0': 337 | resolution: {integrity: sha512-UsQD5fyLWm2Fe5CDM7VPYAo+UC7+2Px4Y+N3AcPh/LdZu23YcuGPegQly++XEVaC8XUTFVPscl5y5Cl1twEI4A==} 338 | cpu: [arm] 339 | os: [linux] 340 | 341 | '@rollup/rollup-linux-arm-musleabihf@4.42.0': 342 | resolution: {integrity: sha512-/i8NIrlgc/+4n1lnoWl1zgH7Uo0XK5xK3EDqVTf38KvyYgCU/Rm04+o1VvvzJZnVS5/cWSd07owkzcVasgfIkQ==} 343 | cpu: [arm] 344 | os: [linux] 345 | 346 | '@rollup/rollup-linux-arm64-gnu@4.42.0': 347 | resolution: {integrity: sha512-eoujJFOvoIBjZEi9hJnXAbWg+Vo1Ov8n/0IKZZcPZ7JhBzxh2A+2NFyeMZIRkY9iwBvSjloKgcvnjTbGKHE44Q==} 348 | cpu: [arm64] 349 | os: [linux] 350 | 351 | '@rollup/rollup-linux-arm64-musl@4.42.0': 352 | resolution: {integrity: sha512-/3NrcOWFSR7RQUQIuZQChLND36aTU9IYE4j+TB40VU78S+RA0IiqHR30oSh6P1S9f9/wVOenHQnacs/Byb824g==} 353 | cpu: [arm64] 354 | os: [linux] 355 | 356 | '@rollup/rollup-linux-loongarch64-gnu@4.42.0': 357 | resolution: {integrity: sha512-O8AplvIeavK5ABmZlKBq9/STdZlnQo7Sle0LLhVA7QT+CiGpNVe197/t8Aph9bhJqbDVGCHpY2i7QyfEDDStDg==} 358 | cpu: [loong64] 359 | os: [linux] 360 | 361 | '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': 362 | resolution: {integrity: sha512-6Qb66tbKVN7VyQrekhEzbHRxXXFFD8QKiFAwX5v9Xt6FiJ3BnCVBuyBxa2fkFGqxOCSGGYNejxd8ht+q5SnmtA==} 363 | cpu: [ppc64] 364 | os: [linux] 365 | 366 | '@rollup/rollup-linux-riscv64-gnu@4.42.0': 367 | resolution: {integrity: sha512-KQETDSEBamQFvg/d8jajtRwLNBlGc3aKpaGiP/LvEbnmVUKlFta1vqJqTrvPtsYsfbE/DLg5CC9zyXRX3fnBiA==} 368 | cpu: [riscv64] 369 | os: [linux] 370 | 371 | '@rollup/rollup-linux-riscv64-musl@4.42.0': 372 | resolution: {integrity: sha512-qMvnyjcU37sCo/tuC+JqeDKSuukGAd+pVlRl/oyDbkvPJ3awk6G6ua7tyum02O3lI+fio+eM5wsVd66X0jQtxw==} 373 | cpu: [riscv64] 374 | os: [linux] 375 | 376 | '@rollup/rollup-linux-s390x-gnu@4.42.0': 377 | resolution: {integrity: sha512-I2Y1ZUgTgU2RLddUHXTIgyrdOwljjkmcZ/VilvaEumtS3Fkuhbw4p4hgHc39Ypwvo2o7sBFNl2MquNvGCa55Iw==} 378 | cpu: [s390x] 379 | os: [linux] 380 | 381 | '@rollup/rollup-linux-x64-gnu@4.42.0': 382 | resolution: {integrity: sha512-Gfm6cV6mj3hCUY8TqWa63DB8Mx3NADoFwiJrMpoZ1uESbK8FQV3LXkhfry+8bOniq9pqY1OdsjFWNsSbfjPugw==} 383 | cpu: [x64] 384 | os: [linux] 385 | 386 | '@rollup/rollup-linux-x64-musl@4.42.0': 387 | resolution: {integrity: sha512-g86PF8YZ9GRqkdi0VoGlcDUb4rYtQKyTD1IVtxxN4Hpe7YqLBShA7oHMKU6oKTCi3uxwW4VkIGnOaH/El8de3w==} 388 | cpu: [x64] 389 | os: [linux] 390 | 391 | '@rollup/rollup-win32-arm64-msvc@4.42.0': 392 | resolution: {integrity: sha512-+axkdyDGSp6hjyzQ5m1pgcvQScfHnMCcsXkx8pTgy/6qBmWVhtRVlgxjWwDp67wEXXUr0x+vD6tp5W4x6V7u1A==} 393 | cpu: [arm64] 394 | os: [win32] 395 | 396 | '@rollup/rollup-win32-ia32-msvc@4.42.0': 397 | resolution: {integrity: sha512-F+5J9pelstXKwRSDq92J0TEBXn2nfUrQGg+HK1+Tk7VOL09e0gBqUHugZv7SW4MGrYj41oNCUe3IKCDGVlis2g==} 398 | cpu: [ia32] 399 | os: [win32] 400 | 401 | '@rollup/rollup-win32-x64-msvc@4.42.0': 402 | resolution: {integrity: sha512-LpHiJRwkaVz/LqjHjK8LCi8osq7elmpwujwbXKNW88bM8eeGxavJIKKjkjpMHAh/2xfnrt1ZSnhTv41WYUHYmA==} 403 | cpu: [x64] 404 | os: [win32] 405 | 406 | '@types/estree@1.0.7': 407 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 408 | 409 | '@types/json-schema@7.0.15': 410 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 411 | 412 | '@typescript-eslint/eslint-plugin@8.34.1': 413 | resolution: {integrity: sha512-STXcN6ebF6li4PxwNeFnqF8/2BNDvBupf2OPx2yWNzr6mKNGF7q49VM00Pz5FaomJyqvbXpY6PhO+T9w139YEQ==} 414 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 415 | peerDependencies: 416 | '@typescript-eslint/parser': ^8.34.1 417 | eslint: ^8.57.0 || ^9.0.0 418 | typescript: '>=4.8.4 <5.9.0' 419 | 420 | '@typescript-eslint/parser@8.34.1': 421 | resolution: {integrity: sha512-4O3idHxhyzjClSMJ0a29AcoK0+YwnEqzI6oz3vlRf3xw0zbzt15MzXwItOlnr5nIth6zlY2RENLsOPvhyrKAQA==} 422 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 423 | peerDependencies: 424 | eslint: ^8.57.0 || ^9.0.0 425 | typescript: '>=4.8.4 <5.9.0' 426 | 427 | '@typescript-eslint/project-service@8.34.1': 428 | resolution: {integrity: sha512-nuHlOmFZfuRwLJKDGQOVc0xnQrAmuq1Mj/ISou5044y1ajGNp2BNliIqp7F2LPQ5sForz8lempMFCovfeS1XoA==} 429 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 430 | peerDependencies: 431 | typescript: '>=4.8.4 <5.9.0' 432 | 433 | '@typescript-eslint/scope-manager@8.34.1': 434 | resolution: {integrity: sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA==} 435 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 436 | 437 | '@typescript-eslint/tsconfig-utils@8.34.1': 438 | resolution: {integrity: sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg==} 439 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 440 | peerDependencies: 441 | typescript: '>=4.8.4 <5.9.0' 442 | 443 | '@typescript-eslint/type-utils@8.34.1': 444 | resolution: {integrity: sha512-Tv7tCCr6e5m8hP4+xFugcrwTOucB8lshffJ6zf1mF1TbU67R+ntCc6DzLNKM+s/uzDyv8gLq7tufaAhIBYeV8g==} 445 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 446 | peerDependencies: 447 | eslint: ^8.57.0 || ^9.0.0 448 | typescript: '>=4.8.4 <5.9.0' 449 | 450 | '@typescript-eslint/types@8.34.1': 451 | resolution: {integrity: sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==} 452 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 453 | 454 | '@typescript-eslint/typescript-estree@8.34.1': 455 | resolution: {integrity: sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA==} 456 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 457 | peerDependencies: 458 | typescript: '>=4.8.4 <5.9.0' 459 | 460 | '@typescript-eslint/utils@8.34.1': 461 | resolution: {integrity: sha512-mqOwUdZ3KjtGk7xJJnLbHxTuWVn3GO2WZZuM+Slhkun4+qthLdXx32C8xIXbO1kfCECb3jIs3eoxK3eryk7aoQ==} 462 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 463 | peerDependencies: 464 | eslint: ^8.57.0 || ^9.0.0 465 | typescript: '>=4.8.4 <5.9.0' 466 | 467 | '@typescript-eslint/visitor-keys@8.34.1': 468 | resolution: {integrity: sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw==} 469 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 470 | 471 | '@vitejs/plugin-vue@5.2.4': 472 | resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} 473 | engines: {node: ^18.0.0 || >=20.0.0} 474 | peerDependencies: 475 | vite: ^5.0.0 || ^6.0.0 476 | vue: ^3.2.25 477 | 478 | '@volar/language-core@2.4.14': 479 | resolution: {integrity: sha512-X6beusV0DvuVseaOEy7GoagS4rYHgDHnTrdOj5jeUb49fW5ceQyP9Ej5rBhqgz2wJggl+2fDbbojq1XKaxDi6w==} 480 | 481 | '@volar/source-map@2.4.14': 482 | resolution: {integrity: sha512-5TeKKMh7Sfxo8021cJfmBzcjfY1SsXsPMMjMvjY7ivesdnybqqS+GxGAoXHAOUawQTwtdUxgP65Im+dEmvWtYQ==} 483 | 484 | '@volar/typescript@2.4.14': 485 | resolution: {integrity: sha512-p8Z6f/bZM3/HyCdRNFZOEEzts51uV8WHeN8Tnfnm2EBv6FDB2TQLzfVx7aJvnl8ofKAOnS64B2O8bImBFaauRw==} 486 | 487 | '@vue/compiler-core@3.5.16': 488 | resolution: {integrity: sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==} 489 | 490 | '@vue/compiler-dom@3.5.16': 491 | resolution: {integrity: sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==} 492 | 493 | '@vue/compiler-sfc@3.5.16': 494 | resolution: {integrity: sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==} 495 | 496 | '@vue/compiler-ssr@3.5.16': 497 | resolution: {integrity: sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==} 498 | 499 | '@vue/compiler-vue2@2.7.16': 500 | resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} 501 | 502 | '@vue/language-core@2.2.10': 503 | resolution: {integrity: sha512-+yNoYx6XIKuAO8Mqh1vGytu8jkFEOH5C8iOv3i8Z/65A7x9iAOXA97Q+PqZ3nlm2lxf5rOJuIGI/wDtx/riNYw==} 504 | peerDependencies: 505 | typescript: '*' 506 | peerDependenciesMeta: 507 | typescript: 508 | optional: true 509 | 510 | '@vue/reactivity@3.5.16': 511 | resolution: {integrity: sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==} 512 | 513 | '@vue/runtime-core@3.5.16': 514 | resolution: {integrity: sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==} 515 | 516 | '@vue/runtime-dom@3.5.16': 517 | resolution: {integrity: sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==} 518 | 519 | '@vue/server-renderer@3.5.16': 520 | resolution: {integrity: sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==} 521 | peerDependencies: 522 | vue: 3.5.16 523 | 524 | '@vue/shared@3.5.16': 525 | resolution: {integrity: sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==} 526 | 527 | '@vue/tsconfig@0.7.0': 528 | resolution: {integrity: sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==} 529 | peerDependencies: 530 | typescript: 5.x 531 | vue: ^3.4.0 532 | peerDependenciesMeta: 533 | typescript: 534 | optional: true 535 | vue: 536 | optional: true 537 | 538 | acorn-jsx@5.3.2: 539 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 540 | peerDependencies: 541 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 542 | 543 | acorn@8.15.0: 544 | resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 545 | engines: {node: '>=0.4.0'} 546 | hasBin: true 547 | 548 | ajv@6.12.6: 549 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 550 | 551 | alien-signals@1.0.13: 552 | resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} 553 | 554 | ansi-styles@4.3.0: 555 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 556 | engines: {node: '>=8'} 557 | 558 | argparse@2.0.1: 559 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 560 | 561 | balanced-match@1.0.2: 562 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 563 | 564 | boolbase@1.0.0: 565 | resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} 566 | 567 | brace-expansion@1.1.11: 568 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 569 | 570 | brace-expansion@2.0.2: 571 | resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 572 | 573 | braces@3.0.3: 574 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 575 | engines: {node: '>=8'} 576 | 577 | buffer-builder@0.2.0: 578 | resolution: {integrity: sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==} 579 | 580 | callsites@3.1.0: 581 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 582 | engines: {node: '>=6'} 583 | 584 | chalk@4.1.2: 585 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 586 | engines: {node: '>=10'} 587 | 588 | color-convert@2.0.1: 589 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 590 | engines: {node: '>=7.0.0'} 591 | 592 | color-name@1.1.4: 593 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 594 | 595 | colorjs.io@0.5.2: 596 | resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==} 597 | 598 | concat-map@0.0.1: 599 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 600 | 601 | cross-spawn@7.0.6: 602 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 603 | engines: {node: '>= 8'} 604 | 605 | cssesc@3.0.0: 606 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 607 | engines: {node: '>=4'} 608 | hasBin: true 609 | 610 | csstype@3.1.3: 611 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 612 | 613 | de-indent@1.0.2: 614 | resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} 615 | 616 | debug@4.4.1: 617 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 618 | engines: {node: '>=6.0'} 619 | peerDependencies: 620 | supports-color: '*' 621 | peerDependenciesMeta: 622 | supports-color: 623 | optional: true 624 | 625 | deep-is@0.1.4: 626 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 627 | 628 | entities@4.5.0: 629 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 630 | engines: {node: '>=0.12'} 631 | 632 | esbuild@0.25.5: 633 | resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} 634 | engines: {node: '>=18'} 635 | hasBin: true 636 | 637 | escape-string-regexp@4.0.0: 638 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 639 | engines: {node: '>=10'} 640 | 641 | eslint-plugin-vue@10.2.0: 642 | resolution: {integrity: sha512-tl9s+KN3z0hN2b8fV2xSs5ytGl7Esk1oSCxULLwFcdaElhZ8btYYZFrWxvh4En+czrSDtuLCeCOGa8HhEZuBdQ==} 643 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 644 | peerDependencies: 645 | eslint: ^8.57.0 || ^9.0.0 646 | vue-eslint-parser: ^10.0.0 647 | 648 | eslint-scope@8.4.0: 649 | resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 650 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 651 | 652 | eslint-visitor-keys@3.4.3: 653 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 654 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 655 | 656 | eslint-visitor-keys@4.2.1: 657 | resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 658 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 659 | 660 | eslint@9.29.0: 661 | resolution: {integrity: sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==} 662 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 663 | hasBin: true 664 | peerDependencies: 665 | jiti: '*' 666 | peerDependenciesMeta: 667 | jiti: 668 | optional: true 669 | 670 | espree@10.4.0: 671 | resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} 672 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 673 | 674 | esquery@1.6.0: 675 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 676 | engines: {node: '>=0.10'} 677 | 678 | esrecurse@4.3.0: 679 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 680 | engines: {node: '>=4.0'} 681 | 682 | estraverse@5.3.0: 683 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 684 | engines: {node: '>=4.0'} 685 | 686 | estree-walker@2.0.2: 687 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 688 | 689 | esutils@2.0.3: 690 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 691 | engines: {node: '>=0.10.0'} 692 | 693 | fast-deep-equal@3.1.3: 694 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 695 | 696 | fast-glob@3.3.3: 697 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 698 | engines: {node: '>=8.6.0'} 699 | 700 | fast-json-stable-stringify@2.1.0: 701 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 702 | 703 | fast-levenshtein@2.0.6: 704 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 705 | 706 | fastq@1.19.1: 707 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 708 | 709 | fdir@6.4.6: 710 | resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} 711 | peerDependencies: 712 | picomatch: ^3 || ^4 713 | peerDependenciesMeta: 714 | picomatch: 715 | optional: true 716 | 717 | file-entry-cache@8.0.0: 718 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 719 | engines: {node: '>=16.0.0'} 720 | 721 | fill-range@7.1.1: 722 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 723 | engines: {node: '>=8'} 724 | 725 | find-up@5.0.0: 726 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 727 | engines: {node: '>=10'} 728 | 729 | flat-cache@4.0.1: 730 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 731 | engines: {node: '>=16'} 732 | 733 | flatted@3.3.3: 734 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 735 | 736 | fsevents@2.3.3: 737 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 738 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 739 | os: [darwin] 740 | 741 | glob-parent@5.1.2: 742 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 743 | engines: {node: '>= 6'} 744 | 745 | glob-parent@6.0.2: 746 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 747 | engines: {node: '>=10.13.0'} 748 | 749 | globals@14.0.0: 750 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 751 | engines: {node: '>=18'} 752 | 753 | globals@16.2.0: 754 | resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==} 755 | engines: {node: '>=18'} 756 | 757 | graphemer@1.4.0: 758 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 759 | 760 | has-flag@4.0.0: 761 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 762 | engines: {node: '>=8'} 763 | 764 | he@1.2.0: 765 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 766 | hasBin: true 767 | 768 | ignore@5.3.2: 769 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 770 | engines: {node: '>= 4'} 771 | 772 | ignore@7.0.5: 773 | resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} 774 | engines: {node: '>= 4'} 775 | 776 | immutable@5.1.3: 777 | resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==} 778 | 779 | import-fresh@3.3.1: 780 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 781 | engines: {node: '>=6'} 782 | 783 | imurmurhash@0.1.4: 784 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 785 | engines: {node: '>=0.8.19'} 786 | 787 | is-extglob@2.1.1: 788 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 789 | engines: {node: '>=0.10.0'} 790 | 791 | is-glob@4.0.3: 792 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 793 | engines: {node: '>=0.10.0'} 794 | 795 | is-number@7.0.0: 796 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 797 | engines: {node: '>=0.12.0'} 798 | 799 | isexe@2.0.0: 800 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 801 | 802 | js-yaml@4.1.0: 803 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 804 | hasBin: true 805 | 806 | json-buffer@3.0.1: 807 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 808 | 809 | json-schema-traverse@0.4.1: 810 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 811 | 812 | json-stable-stringify-without-jsonify@1.0.1: 813 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 814 | 815 | keyv@4.5.4: 816 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 817 | 818 | levn@0.4.1: 819 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 820 | engines: {node: '>= 0.8.0'} 821 | 822 | locate-path@6.0.0: 823 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 824 | engines: {node: '>=10'} 825 | 826 | lodash.merge@4.6.2: 827 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 828 | 829 | lodash@4.17.21: 830 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 831 | 832 | magic-string@0.30.17: 833 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 834 | 835 | merge2@1.4.1: 836 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 837 | engines: {node: '>= 8'} 838 | 839 | micromatch@4.0.8: 840 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 841 | engines: {node: '>=8.6'} 842 | 843 | minimatch@3.1.2: 844 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 845 | 846 | minimatch@9.0.5: 847 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 848 | engines: {node: '>=16 || 14 >=14.17'} 849 | 850 | ms@2.1.3: 851 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 852 | 853 | muggle-string@0.4.1: 854 | resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} 855 | 856 | nanoid@3.3.11: 857 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 858 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 859 | hasBin: true 860 | 861 | natural-compare@1.4.0: 862 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 863 | 864 | nth-check@2.1.1: 865 | resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} 866 | 867 | optionator@0.9.4: 868 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 869 | engines: {node: '>= 0.8.0'} 870 | 871 | p-limit@3.1.0: 872 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 873 | engines: {node: '>=10'} 874 | 875 | p-locate@5.0.0: 876 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 877 | engines: {node: '>=10'} 878 | 879 | parent-module@1.0.1: 880 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 881 | engines: {node: '>=6'} 882 | 883 | path-browserify@1.0.1: 884 | resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 885 | 886 | path-exists@4.0.0: 887 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 888 | engines: {node: '>=8'} 889 | 890 | path-key@3.1.1: 891 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 892 | engines: {node: '>=8'} 893 | 894 | picocolors@1.1.1: 895 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 896 | 897 | picomatch@2.3.1: 898 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 899 | engines: {node: '>=8.6'} 900 | 901 | picomatch@4.0.2: 902 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 903 | engines: {node: '>=12'} 904 | 905 | postcss-selector-parser@6.1.2: 906 | resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} 907 | engines: {node: '>=4'} 908 | 909 | postcss@8.5.4: 910 | resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} 911 | engines: {node: ^10 || ^12 || >=14} 912 | 913 | prelude-ls@1.2.1: 914 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 915 | engines: {node: '>= 0.8.0'} 916 | 917 | punycode@2.3.1: 918 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 919 | engines: {node: '>=6'} 920 | 921 | queue-microtask@1.2.3: 922 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 923 | 924 | resolve-from@4.0.0: 925 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 926 | engines: {node: '>=4'} 927 | 928 | reusify@1.1.0: 929 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 930 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 931 | 932 | rollup@4.42.0: 933 | resolution: {integrity: sha512-LW+Vse3BJPyGJGAJt1j8pWDKPd73QM8cRXYK1IxOBgL2AGLu7Xd2YOW0M2sLUBCkF5MshXXtMApyEAEzMVMsnw==} 934 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 935 | hasBin: true 936 | 937 | run-parallel@1.2.0: 938 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 939 | 940 | rxjs@7.8.2: 941 | resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} 942 | 943 | sass-embedded-android-arm64@1.89.2: 944 | resolution: {integrity: sha512-+pq7a7AUpItNyPu61sRlP6G2A8pSPpyazASb+8AK2pVlFayCSPAEgpwpCE9A2/Xj86xJZeMizzKUHxM2CBCUxA==} 945 | engines: {node: '>=14.0.0'} 946 | cpu: [arm64] 947 | os: [android] 948 | 949 | sass-embedded-android-arm@1.89.2: 950 | resolution: {integrity: sha512-oHAPTboBHRZlDBhyRB6dvDKh4KvFs+DZibDHXbkSI6dBZxMTT+Yb2ivocHnctVGucKTLQeT7+OM5DjWHyynL/A==} 951 | engines: {node: '>=14.0.0'} 952 | cpu: [arm] 953 | os: [android] 954 | 955 | sass-embedded-android-riscv64@1.89.2: 956 | resolution: {integrity: sha512-HfJJWp/S6XSYvlGAqNdakeEMPOdhBkj2s2lN6SHnON54rahKem+z9pUbCriUJfM65Z90lakdGuOfidY61R9TYg==} 957 | engines: {node: '>=14.0.0'} 958 | cpu: [riscv64] 959 | os: [android] 960 | 961 | sass-embedded-android-x64@1.89.2: 962 | resolution: {integrity: sha512-BGPzq53VH5z5HN8de6jfMqJjnRe1E6sfnCWFd4pK+CAiuM7iw5Fx6BQZu3ikfI1l2GY0y6pRXzsVLdp/j4EKEA==} 963 | engines: {node: '>=14.0.0'} 964 | cpu: [x64] 965 | os: [android] 966 | 967 | sass-embedded-darwin-arm64@1.89.2: 968 | resolution: {integrity: sha512-UCm3RL/tzMpG7DsubARsvGUNXC5pgfQvP+RRFJo9XPIi6elopY5B6H4m9dRYDpHA+scjVthdiDwkPYr9+S/KGw==} 969 | engines: {node: '>=14.0.0'} 970 | cpu: [arm64] 971 | os: [darwin] 972 | 973 | sass-embedded-darwin-x64@1.89.2: 974 | resolution: {integrity: sha512-D9WxtDY5VYtMApXRuhQK9VkPHB8R79NIIR6xxVlN2MIdEid/TZWi1MHNweieETXhWGrKhRKglwnHxxyKdJYMnA==} 975 | engines: {node: '>=14.0.0'} 976 | cpu: [x64] 977 | os: [darwin] 978 | 979 | sass-embedded-linux-arm64@1.89.2: 980 | resolution: {integrity: sha512-2N4WW5LLsbtrWUJ7iTpjvhajGIbmDR18ZzYRywHdMLpfdPApuHPMDF5CYzHbS+LLx2UAx7CFKBnj5LLjY6eFgQ==} 981 | engines: {node: '>=14.0.0'} 982 | cpu: [arm64] 983 | os: [linux] 984 | 985 | sass-embedded-linux-arm@1.89.2: 986 | resolution: {integrity: sha512-leP0t5U4r95dc90o8TCWfxNXwMAsQhpWxTkdtySDpngoqtTy3miMd7EYNYd1znI0FN1CBaUvbdCMbnbPwygDlA==} 987 | engines: {node: '>=14.0.0'} 988 | cpu: [arm] 989 | os: [linux] 990 | 991 | sass-embedded-linux-musl-arm64@1.89.2: 992 | resolution: {integrity: sha512-nTyuaBX6U1A/cG7WJh0pKD1gY8hbg1m2SnzsyoFG+exQ0lBX/lwTLHq3nyhF+0atv7YYhYKbmfz+sjPP8CZ9lw==} 993 | engines: {node: '>=14.0.0'} 994 | cpu: [arm64] 995 | os: [linux] 996 | 997 | sass-embedded-linux-musl-arm@1.89.2: 998 | resolution: {integrity: sha512-Z6gG2FiVEEdxYHRi2sS5VIYBmp17351bWtOCUZ/thBM66+e70yiN6Eyqjz80DjL8haRUegNQgy9ZJqsLAAmr9g==} 999 | engines: {node: '>=14.0.0'} 1000 | cpu: [arm] 1001 | os: [linux] 1002 | 1003 | sass-embedded-linux-musl-riscv64@1.89.2: 1004 | resolution: {integrity: sha512-N6oul+qALO0SwGY8JW7H/Vs0oZIMrRMBM4GqX3AjM/6y8JsJRxkAwnfd0fDyK+aICMFarDqQonQNIx99gdTZqw==} 1005 | engines: {node: '>=14.0.0'} 1006 | cpu: [riscv64] 1007 | os: [linux] 1008 | 1009 | sass-embedded-linux-musl-x64@1.89.2: 1010 | resolution: {integrity: sha512-K+FmWcdj/uyP8GiG9foxOCPfb5OAZG0uSVq80DKgVSC0U44AdGjvAvVZkrgFEcZ6cCqlNC2JfYmslB5iqdL7tg==} 1011 | engines: {node: '>=14.0.0'} 1012 | cpu: [x64] 1013 | os: [linux] 1014 | 1015 | sass-embedded-linux-riscv64@1.89.2: 1016 | resolution: {integrity: sha512-g9nTbnD/3yhOaskeqeBQETbtfDQWRgsjHok6bn7DdAuwBsyrR3JlSFyqKc46pn9Xxd9SQQZU8AzM4IR+sY0A0w==} 1017 | engines: {node: '>=14.0.0'} 1018 | cpu: [riscv64] 1019 | os: [linux] 1020 | 1021 | sass-embedded-linux-x64@1.89.2: 1022 | resolution: {integrity: sha512-Ax7dKvzncyQzIl4r7012KCMBvJzOz4uwSNoyoM5IV6y5I1f5hEwI25+U4WfuTqdkv42taCMgpjZbh9ERr6JVMQ==} 1023 | engines: {node: '>=14.0.0'} 1024 | cpu: [x64] 1025 | os: [linux] 1026 | 1027 | sass-embedded-win32-arm64@1.89.2: 1028 | resolution: {integrity: sha512-j96iJni50ZUsfD6tRxDQE2QSYQ2WrfHxeiyAXf41Kw0V4w5KYR/Sf6rCZQLMTUOHnD16qTMVpQi20LQSqf4WGg==} 1029 | engines: {node: '>=14.0.0'} 1030 | cpu: [arm64] 1031 | os: [win32] 1032 | 1033 | sass-embedded-win32-x64@1.89.2: 1034 | resolution: {integrity: sha512-cS2j5ljdkQsb4PaORiClaVYynE9OAPZG/XjbOMxpQmjRIf7UroY4PEIH+Waf+y47PfXFX9SyxhYuw2NIKGbEng==} 1035 | engines: {node: '>=14.0.0'} 1036 | cpu: [x64] 1037 | os: [win32] 1038 | 1039 | sass-embedded@1.89.2: 1040 | resolution: {integrity: sha512-Ack2K8rc57kCFcYlf3HXpZEJFNUX8xd8DILldksREmYXQkRHI879yy8q4mRDJgrojkySMZqmmmW1NxrFxMsYaA==} 1041 | engines: {node: '>=16.0.0'} 1042 | hasBin: true 1043 | 1044 | semver@7.7.2: 1045 | resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 1046 | engines: {node: '>=10'} 1047 | hasBin: true 1048 | 1049 | shebang-command@2.0.0: 1050 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1051 | engines: {node: '>=8'} 1052 | 1053 | shebang-regex@3.0.0: 1054 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1055 | engines: {node: '>=8'} 1056 | 1057 | source-map-js@1.2.1: 1058 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1059 | engines: {node: '>=0.10.0'} 1060 | 1061 | strip-json-comments@3.1.1: 1062 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1063 | engines: {node: '>=8'} 1064 | 1065 | supports-color@7.2.0: 1066 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1067 | engines: {node: '>=8'} 1068 | 1069 | supports-color@8.1.1: 1070 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1071 | engines: {node: '>=10'} 1072 | 1073 | sync-child-process@1.0.2: 1074 | resolution: {integrity: sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==} 1075 | engines: {node: '>=16.0.0'} 1076 | 1077 | sync-message-port@1.1.3: 1078 | resolution: {integrity: sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==} 1079 | engines: {node: '>=16.0.0'} 1080 | 1081 | tinyglobby@0.2.14: 1082 | resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 1083 | engines: {node: '>=12.0.0'} 1084 | 1085 | to-regex-range@5.0.1: 1086 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1087 | engines: {node: '>=8.0'} 1088 | 1089 | ts-api-utils@2.1.0: 1090 | resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 1091 | engines: {node: '>=18.12'} 1092 | peerDependencies: 1093 | typescript: '>=4.8.4' 1094 | 1095 | tslib@2.8.1: 1096 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1097 | 1098 | type-check@0.4.0: 1099 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1100 | engines: {node: '>= 0.8.0'} 1101 | 1102 | typescript@5.8.3: 1103 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1104 | engines: {node: '>=14.17'} 1105 | hasBin: true 1106 | 1107 | uri-js@4.4.1: 1108 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1109 | 1110 | util-deprecate@1.0.2: 1111 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1112 | 1113 | varint@6.0.0: 1114 | resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} 1115 | 1116 | vite@6.3.5: 1117 | resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 1118 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1119 | hasBin: true 1120 | peerDependencies: 1121 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1122 | jiti: '>=1.21.0' 1123 | less: '*' 1124 | lightningcss: ^1.21.0 1125 | sass: '*' 1126 | sass-embedded: '*' 1127 | stylus: '*' 1128 | sugarss: '*' 1129 | terser: ^5.16.0 1130 | tsx: ^4.8.1 1131 | yaml: ^2.4.2 1132 | peerDependenciesMeta: 1133 | '@types/node': 1134 | optional: true 1135 | jiti: 1136 | optional: true 1137 | less: 1138 | optional: true 1139 | lightningcss: 1140 | optional: true 1141 | sass: 1142 | optional: true 1143 | sass-embedded: 1144 | optional: true 1145 | stylus: 1146 | optional: true 1147 | sugarss: 1148 | optional: true 1149 | terser: 1150 | optional: true 1151 | tsx: 1152 | optional: true 1153 | yaml: 1154 | optional: true 1155 | 1156 | vscode-uri@3.1.0: 1157 | resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} 1158 | 1159 | vue-eslint-parser@10.1.3: 1160 | resolution: {integrity: sha512-dbCBnd2e02dYWsXoqX5yKUZlOt+ExIpq7hmHKPb5ZqKcjf++Eo0hMseFTZMLKThrUk61m+Uv6A2YSBve6ZvuDQ==} 1161 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1162 | peerDependencies: 1163 | eslint: ^8.57.0 || ^9.0.0 1164 | 1165 | vue-tsc@2.2.10: 1166 | resolution: {integrity: sha512-jWZ1xSaNbabEV3whpIDMbjVSVawjAyW+x1n3JeGQo7S0uv2n9F/JMgWW90tGWNFRKya4YwKMZgCtr0vRAM7DeQ==} 1167 | hasBin: true 1168 | peerDependencies: 1169 | typescript: '>=5.0.0' 1170 | 1171 | vue@3.5.16: 1172 | resolution: {integrity: sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==} 1173 | peerDependencies: 1174 | typescript: '*' 1175 | peerDependenciesMeta: 1176 | typescript: 1177 | optional: true 1178 | 1179 | which@2.0.2: 1180 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1181 | engines: {node: '>= 8'} 1182 | hasBin: true 1183 | 1184 | word-wrap@1.2.5: 1185 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1186 | engines: {node: '>=0.10.0'} 1187 | 1188 | xml-name-validator@4.0.0: 1189 | resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} 1190 | engines: {node: '>=12'} 1191 | 1192 | yocto-queue@0.1.0: 1193 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1194 | engines: {node: '>=10'} 1195 | 1196 | snapshots: 1197 | 1198 | '@babel/helper-string-parser@7.27.1': {} 1199 | 1200 | '@babel/helper-validator-identifier@7.27.1': {} 1201 | 1202 | '@babel/parser@7.27.5': 1203 | dependencies: 1204 | '@babel/types': 7.27.6 1205 | 1206 | '@babel/types@7.27.6': 1207 | dependencies: 1208 | '@babel/helper-string-parser': 7.27.1 1209 | '@babel/helper-validator-identifier': 7.27.1 1210 | 1211 | '@bufbuild/protobuf@2.5.2': {} 1212 | 1213 | '@esbuild/aix-ppc64@0.25.5': 1214 | optional: true 1215 | 1216 | '@esbuild/android-arm64@0.25.5': 1217 | optional: true 1218 | 1219 | '@esbuild/android-arm@0.25.5': 1220 | optional: true 1221 | 1222 | '@esbuild/android-x64@0.25.5': 1223 | optional: true 1224 | 1225 | '@esbuild/darwin-arm64@0.25.5': 1226 | optional: true 1227 | 1228 | '@esbuild/darwin-x64@0.25.5': 1229 | optional: true 1230 | 1231 | '@esbuild/freebsd-arm64@0.25.5': 1232 | optional: true 1233 | 1234 | '@esbuild/freebsd-x64@0.25.5': 1235 | optional: true 1236 | 1237 | '@esbuild/linux-arm64@0.25.5': 1238 | optional: true 1239 | 1240 | '@esbuild/linux-arm@0.25.5': 1241 | optional: true 1242 | 1243 | '@esbuild/linux-ia32@0.25.5': 1244 | optional: true 1245 | 1246 | '@esbuild/linux-loong64@0.25.5': 1247 | optional: true 1248 | 1249 | '@esbuild/linux-mips64el@0.25.5': 1250 | optional: true 1251 | 1252 | '@esbuild/linux-ppc64@0.25.5': 1253 | optional: true 1254 | 1255 | '@esbuild/linux-riscv64@0.25.5': 1256 | optional: true 1257 | 1258 | '@esbuild/linux-s390x@0.25.5': 1259 | optional: true 1260 | 1261 | '@esbuild/linux-x64@0.25.5': 1262 | optional: true 1263 | 1264 | '@esbuild/netbsd-arm64@0.25.5': 1265 | optional: true 1266 | 1267 | '@esbuild/netbsd-x64@0.25.5': 1268 | optional: true 1269 | 1270 | '@esbuild/openbsd-arm64@0.25.5': 1271 | optional: true 1272 | 1273 | '@esbuild/openbsd-x64@0.25.5': 1274 | optional: true 1275 | 1276 | '@esbuild/sunos-x64@0.25.5': 1277 | optional: true 1278 | 1279 | '@esbuild/win32-arm64@0.25.5': 1280 | optional: true 1281 | 1282 | '@esbuild/win32-ia32@0.25.5': 1283 | optional: true 1284 | 1285 | '@esbuild/win32-x64@0.25.5': 1286 | optional: true 1287 | 1288 | '@eslint-community/eslint-utils@4.7.0(eslint@9.29.0)': 1289 | dependencies: 1290 | eslint: 9.29.0 1291 | eslint-visitor-keys: 3.4.3 1292 | 1293 | '@eslint-community/regexpp@4.12.1': {} 1294 | 1295 | '@eslint/config-array@0.20.1': 1296 | dependencies: 1297 | '@eslint/object-schema': 2.1.6 1298 | debug: 4.4.1 1299 | minimatch: 3.1.2 1300 | transitivePeerDependencies: 1301 | - supports-color 1302 | 1303 | '@eslint/config-helpers@0.2.2': {} 1304 | 1305 | '@eslint/core@0.14.0': 1306 | dependencies: 1307 | '@types/json-schema': 7.0.15 1308 | 1309 | '@eslint/eslintrc@3.3.1': 1310 | dependencies: 1311 | ajv: 6.12.6 1312 | debug: 4.4.1 1313 | espree: 10.4.0 1314 | globals: 14.0.0 1315 | ignore: 5.3.2 1316 | import-fresh: 3.3.1 1317 | js-yaml: 4.1.0 1318 | minimatch: 3.1.2 1319 | strip-json-comments: 3.1.1 1320 | transitivePeerDependencies: 1321 | - supports-color 1322 | 1323 | '@eslint/js@9.29.0': {} 1324 | 1325 | '@eslint/object-schema@2.1.6': {} 1326 | 1327 | '@eslint/plugin-kit@0.3.1': 1328 | dependencies: 1329 | '@eslint/core': 0.14.0 1330 | levn: 0.4.1 1331 | 1332 | '@humanfs/core@0.19.1': {} 1333 | 1334 | '@humanfs/node@0.16.6': 1335 | dependencies: 1336 | '@humanfs/core': 0.19.1 1337 | '@humanwhocodes/retry': 0.3.1 1338 | 1339 | '@humanwhocodes/module-importer@1.0.1': {} 1340 | 1341 | '@humanwhocodes/retry@0.3.1': {} 1342 | 1343 | '@humanwhocodes/retry@0.4.3': {} 1344 | 1345 | '@jridgewell/sourcemap-codec@1.5.0': {} 1346 | 1347 | '@nodelib/fs.scandir@2.1.5': 1348 | dependencies: 1349 | '@nodelib/fs.stat': 2.0.5 1350 | run-parallel: 1.2.0 1351 | 1352 | '@nodelib/fs.stat@2.0.5': {} 1353 | 1354 | '@nodelib/fs.walk@1.2.8': 1355 | dependencies: 1356 | '@nodelib/fs.scandir': 2.1.5 1357 | fastq: 1.19.1 1358 | 1359 | '@rollup/rollup-android-arm-eabi@4.42.0': 1360 | optional: true 1361 | 1362 | '@rollup/rollup-android-arm64@4.42.0': 1363 | optional: true 1364 | 1365 | '@rollup/rollup-darwin-arm64@4.42.0': 1366 | optional: true 1367 | 1368 | '@rollup/rollup-darwin-x64@4.42.0': 1369 | optional: true 1370 | 1371 | '@rollup/rollup-freebsd-arm64@4.42.0': 1372 | optional: true 1373 | 1374 | '@rollup/rollup-freebsd-x64@4.42.0': 1375 | optional: true 1376 | 1377 | '@rollup/rollup-linux-arm-gnueabihf@4.42.0': 1378 | optional: true 1379 | 1380 | '@rollup/rollup-linux-arm-musleabihf@4.42.0': 1381 | optional: true 1382 | 1383 | '@rollup/rollup-linux-arm64-gnu@4.42.0': 1384 | optional: true 1385 | 1386 | '@rollup/rollup-linux-arm64-musl@4.42.0': 1387 | optional: true 1388 | 1389 | '@rollup/rollup-linux-loongarch64-gnu@4.42.0': 1390 | optional: true 1391 | 1392 | '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': 1393 | optional: true 1394 | 1395 | '@rollup/rollup-linux-riscv64-gnu@4.42.0': 1396 | optional: true 1397 | 1398 | '@rollup/rollup-linux-riscv64-musl@4.42.0': 1399 | optional: true 1400 | 1401 | '@rollup/rollup-linux-s390x-gnu@4.42.0': 1402 | optional: true 1403 | 1404 | '@rollup/rollup-linux-x64-gnu@4.42.0': 1405 | optional: true 1406 | 1407 | '@rollup/rollup-linux-x64-musl@4.42.0': 1408 | optional: true 1409 | 1410 | '@rollup/rollup-win32-arm64-msvc@4.42.0': 1411 | optional: true 1412 | 1413 | '@rollup/rollup-win32-ia32-msvc@4.42.0': 1414 | optional: true 1415 | 1416 | '@rollup/rollup-win32-x64-msvc@4.42.0': 1417 | optional: true 1418 | 1419 | '@types/estree@1.0.7': {} 1420 | 1421 | '@types/json-schema@7.0.15': {} 1422 | 1423 | '@typescript-eslint/eslint-plugin@8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0)(typescript@5.8.3))(eslint@9.29.0)(typescript@5.8.3)': 1424 | dependencies: 1425 | '@eslint-community/regexpp': 4.12.1 1426 | '@typescript-eslint/parser': 8.34.1(eslint@9.29.0)(typescript@5.8.3) 1427 | '@typescript-eslint/scope-manager': 8.34.1 1428 | '@typescript-eslint/type-utils': 8.34.1(eslint@9.29.0)(typescript@5.8.3) 1429 | '@typescript-eslint/utils': 8.34.1(eslint@9.29.0)(typescript@5.8.3) 1430 | '@typescript-eslint/visitor-keys': 8.34.1 1431 | eslint: 9.29.0 1432 | graphemer: 1.4.0 1433 | ignore: 7.0.5 1434 | natural-compare: 1.4.0 1435 | ts-api-utils: 2.1.0(typescript@5.8.3) 1436 | typescript: 5.8.3 1437 | transitivePeerDependencies: 1438 | - supports-color 1439 | 1440 | '@typescript-eslint/parser@8.34.1(eslint@9.29.0)(typescript@5.8.3)': 1441 | dependencies: 1442 | '@typescript-eslint/scope-manager': 8.34.1 1443 | '@typescript-eslint/types': 8.34.1 1444 | '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) 1445 | '@typescript-eslint/visitor-keys': 8.34.1 1446 | debug: 4.4.1 1447 | eslint: 9.29.0 1448 | typescript: 5.8.3 1449 | transitivePeerDependencies: 1450 | - supports-color 1451 | 1452 | '@typescript-eslint/project-service@8.34.1(typescript@5.8.3)': 1453 | dependencies: 1454 | '@typescript-eslint/tsconfig-utils': 8.34.1(typescript@5.8.3) 1455 | '@typescript-eslint/types': 8.34.1 1456 | debug: 4.4.1 1457 | typescript: 5.8.3 1458 | transitivePeerDependencies: 1459 | - supports-color 1460 | 1461 | '@typescript-eslint/scope-manager@8.34.1': 1462 | dependencies: 1463 | '@typescript-eslint/types': 8.34.1 1464 | '@typescript-eslint/visitor-keys': 8.34.1 1465 | 1466 | '@typescript-eslint/tsconfig-utils@8.34.1(typescript@5.8.3)': 1467 | dependencies: 1468 | typescript: 5.8.3 1469 | 1470 | '@typescript-eslint/type-utils@8.34.1(eslint@9.29.0)(typescript@5.8.3)': 1471 | dependencies: 1472 | '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) 1473 | '@typescript-eslint/utils': 8.34.1(eslint@9.29.0)(typescript@5.8.3) 1474 | debug: 4.4.1 1475 | eslint: 9.29.0 1476 | ts-api-utils: 2.1.0(typescript@5.8.3) 1477 | typescript: 5.8.3 1478 | transitivePeerDependencies: 1479 | - supports-color 1480 | 1481 | '@typescript-eslint/types@8.34.1': {} 1482 | 1483 | '@typescript-eslint/typescript-estree@8.34.1(typescript@5.8.3)': 1484 | dependencies: 1485 | '@typescript-eslint/project-service': 8.34.1(typescript@5.8.3) 1486 | '@typescript-eslint/tsconfig-utils': 8.34.1(typescript@5.8.3) 1487 | '@typescript-eslint/types': 8.34.1 1488 | '@typescript-eslint/visitor-keys': 8.34.1 1489 | debug: 4.4.1 1490 | fast-glob: 3.3.3 1491 | is-glob: 4.0.3 1492 | minimatch: 9.0.5 1493 | semver: 7.7.2 1494 | ts-api-utils: 2.1.0(typescript@5.8.3) 1495 | typescript: 5.8.3 1496 | transitivePeerDependencies: 1497 | - supports-color 1498 | 1499 | '@typescript-eslint/utils@8.34.1(eslint@9.29.0)(typescript@5.8.3)': 1500 | dependencies: 1501 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0) 1502 | '@typescript-eslint/scope-manager': 8.34.1 1503 | '@typescript-eslint/types': 8.34.1 1504 | '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) 1505 | eslint: 9.29.0 1506 | typescript: 5.8.3 1507 | transitivePeerDependencies: 1508 | - supports-color 1509 | 1510 | '@typescript-eslint/visitor-keys@8.34.1': 1511 | dependencies: 1512 | '@typescript-eslint/types': 8.34.1 1513 | eslint-visitor-keys: 4.2.1 1514 | 1515 | '@vitejs/plugin-vue@5.2.4(vite@6.3.5(sass-embedded@1.89.2))(vue@3.5.16(typescript@5.8.3))': 1516 | dependencies: 1517 | vite: 6.3.5(sass-embedded@1.89.2) 1518 | vue: 3.5.16(typescript@5.8.3) 1519 | 1520 | '@volar/language-core@2.4.14': 1521 | dependencies: 1522 | '@volar/source-map': 2.4.14 1523 | 1524 | '@volar/source-map@2.4.14': {} 1525 | 1526 | '@volar/typescript@2.4.14': 1527 | dependencies: 1528 | '@volar/language-core': 2.4.14 1529 | path-browserify: 1.0.1 1530 | vscode-uri: 3.1.0 1531 | 1532 | '@vue/compiler-core@3.5.16': 1533 | dependencies: 1534 | '@babel/parser': 7.27.5 1535 | '@vue/shared': 3.5.16 1536 | entities: 4.5.0 1537 | estree-walker: 2.0.2 1538 | source-map-js: 1.2.1 1539 | 1540 | '@vue/compiler-dom@3.5.16': 1541 | dependencies: 1542 | '@vue/compiler-core': 3.5.16 1543 | '@vue/shared': 3.5.16 1544 | 1545 | '@vue/compiler-sfc@3.5.16': 1546 | dependencies: 1547 | '@babel/parser': 7.27.5 1548 | '@vue/compiler-core': 3.5.16 1549 | '@vue/compiler-dom': 3.5.16 1550 | '@vue/compiler-ssr': 3.5.16 1551 | '@vue/shared': 3.5.16 1552 | estree-walker: 2.0.2 1553 | magic-string: 0.30.17 1554 | postcss: 8.5.4 1555 | source-map-js: 1.2.1 1556 | 1557 | '@vue/compiler-ssr@3.5.16': 1558 | dependencies: 1559 | '@vue/compiler-dom': 3.5.16 1560 | '@vue/shared': 3.5.16 1561 | 1562 | '@vue/compiler-vue2@2.7.16': 1563 | dependencies: 1564 | de-indent: 1.0.2 1565 | he: 1.2.0 1566 | 1567 | '@vue/language-core@2.2.10(typescript@5.8.3)': 1568 | dependencies: 1569 | '@volar/language-core': 2.4.14 1570 | '@vue/compiler-dom': 3.5.16 1571 | '@vue/compiler-vue2': 2.7.16 1572 | '@vue/shared': 3.5.16 1573 | alien-signals: 1.0.13 1574 | minimatch: 9.0.5 1575 | muggle-string: 0.4.1 1576 | path-browserify: 1.0.1 1577 | optionalDependencies: 1578 | typescript: 5.8.3 1579 | 1580 | '@vue/reactivity@3.5.16': 1581 | dependencies: 1582 | '@vue/shared': 3.5.16 1583 | 1584 | '@vue/runtime-core@3.5.16': 1585 | dependencies: 1586 | '@vue/reactivity': 3.5.16 1587 | '@vue/shared': 3.5.16 1588 | 1589 | '@vue/runtime-dom@3.5.16': 1590 | dependencies: 1591 | '@vue/reactivity': 3.5.16 1592 | '@vue/runtime-core': 3.5.16 1593 | '@vue/shared': 3.5.16 1594 | csstype: 3.1.3 1595 | 1596 | '@vue/server-renderer@3.5.16(vue@3.5.16(typescript@5.8.3))': 1597 | dependencies: 1598 | '@vue/compiler-ssr': 3.5.16 1599 | '@vue/shared': 3.5.16 1600 | vue: 3.5.16(typescript@5.8.3) 1601 | 1602 | '@vue/shared@3.5.16': {} 1603 | 1604 | '@vue/tsconfig@0.7.0(typescript@5.8.3)(vue@3.5.16(typescript@5.8.3))': 1605 | optionalDependencies: 1606 | typescript: 5.8.3 1607 | vue: 3.5.16(typescript@5.8.3) 1608 | 1609 | acorn-jsx@5.3.2(acorn@8.15.0): 1610 | dependencies: 1611 | acorn: 8.15.0 1612 | 1613 | acorn@8.15.0: {} 1614 | 1615 | ajv@6.12.6: 1616 | dependencies: 1617 | fast-deep-equal: 3.1.3 1618 | fast-json-stable-stringify: 2.1.0 1619 | json-schema-traverse: 0.4.1 1620 | uri-js: 4.4.1 1621 | 1622 | alien-signals@1.0.13: {} 1623 | 1624 | ansi-styles@4.3.0: 1625 | dependencies: 1626 | color-convert: 2.0.1 1627 | 1628 | argparse@2.0.1: {} 1629 | 1630 | balanced-match@1.0.2: {} 1631 | 1632 | boolbase@1.0.0: {} 1633 | 1634 | brace-expansion@1.1.11: 1635 | dependencies: 1636 | balanced-match: 1.0.2 1637 | concat-map: 0.0.1 1638 | 1639 | brace-expansion@2.0.2: 1640 | dependencies: 1641 | balanced-match: 1.0.2 1642 | 1643 | braces@3.0.3: 1644 | dependencies: 1645 | fill-range: 7.1.1 1646 | 1647 | buffer-builder@0.2.0: {} 1648 | 1649 | callsites@3.1.0: {} 1650 | 1651 | chalk@4.1.2: 1652 | dependencies: 1653 | ansi-styles: 4.3.0 1654 | supports-color: 7.2.0 1655 | 1656 | color-convert@2.0.1: 1657 | dependencies: 1658 | color-name: 1.1.4 1659 | 1660 | color-name@1.1.4: {} 1661 | 1662 | colorjs.io@0.5.2: {} 1663 | 1664 | concat-map@0.0.1: {} 1665 | 1666 | cross-spawn@7.0.6: 1667 | dependencies: 1668 | path-key: 3.1.1 1669 | shebang-command: 2.0.0 1670 | which: 2.0.2 1671 | 1672 | cssesc@3.0.0: {} 1673 | 1674 | csstype@3.1.3: {} 1675 | 1676 | de-indent@1.0.2: {} 1677 | 1678 | debug@4.4.1: 1679 | dependencies: 1680 | ms: 2.1.3 1681 | 1682 | deep-is@0.1.4: {} 1683 | 1684 | entities@4.5.0: {} 1685 | 1686 | esbuild@0.25.5: 1687 | optionalDependencies: 1688 | '@esbuild/aix-ppc64': 0.25.5 1689 | '@esbuild/android-arm': 0.25.5 1690 | '@esbuild/android-arm64': 0.25.5 1691 | '@esbuild/android-x64': 0.25.5 1692 | '@esbuild/darwin-arm64': 0.25.5 1693 | '@esbuild/darwin-x64': 0.25.5 1694 | '@esbuild/freebsd-arm64': 0.25.5 1695 | '@esbuild/freebsd-x64': 0.25.5 1696 | '@esbuild/linux-arm': 0.25.5 1697 | '@esbuild/linux-arm64': 0.25.5 1698 | '@esbuild/linux-ia32': 0.25.5 1699 | '@esbuild/linux-loong64': 0.25.5 1700 | '@esbuild/linux-mips64el': 0.25.5 1701 | '@esbuild/linux-ppc64': 0.25.5 1702 | '@esbuild/linux-riscv64': 0.25.5 1703 | '@esbuild/linux-s390x': 0.25.5 1704 | '@esbuild/linux-x64': 0.25.5 1705 | '@esbuild/netbsd-arm64': 0.25.5 1706 | '@esbuild/netbsd-x64': 0.25.5 1707 | '@esbuild/openbsd-arm64': 0.25.5 1708 | '@esbuild/openbsd-x64': 0.25.5 1709 | '@esbuild/sunos-x64': 0.25.5 1710 | '@esbuild/win32-arm64': 0.25.5 1711 | '@esbuild/win32-ia32': 0.25.5 1712 | '@esbuild/win32-x64': 0.25.5 1713 | 1714 | escape-string-regexp@4.0.0: {} 1715 | 1716 | eslint-plugin-vue@10.2.0(eslint@9.29.0)(vue-eslint-parser@10.1.3(eslint@9.29.0)): 1717 | dependencies: 1718 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0) 1719 | eslint: 9.29.0 1720 | natural-compare: 1.4.0 1721 | nth-check: 2.1.1 1722 | postcss-selector-parser: 6.1.2 1723 | semver: 7.7.2 1724 | vue-eslint-parser: 10.1.3(eslint@9.29.0) 1725 | xml-name-validator: 4.0.0 1726 | 1727 | eslint-scope@8.4.0: 1728 | dependencies: 1729 | esrecurse: 4.3.0 1730 | estraverse: 5.3.0 1731 | 1732 | eslint-visitor-keys@3.4.3: {} 1733 | 1734 | eslint-visitor-keys@4.2.1: {} 1735 | 1736 | eslint@9.29.0: 1737 | dependencies: 1738 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0) 1739 | '@eslint-community/regexpp': 4.12.1 1740 | '@eslint/config-array': 0.20.1 1741 | '@eslint/config-helpers': 0.2.2 1742 | '@eslint/core': 0.14.0 1743 | '@eslint/eslintrc': 3.3.1 1744 | '@eslint/js': 9.29.0 1745 | '@eslint/plugin-kit': 0.3.1 1746 | '@humanfs/node': 0.16.6 1747 | '@humanwhocodes/module-importer': 1.0.1 1748 | '@humanwhocodes/retry': 0.4.3 1749 | '@types/estree': 1.0.7 1750 | '@types/json-schema': 7.0.15 1751 | ajv: 6.12.6 1752 | chalk: 4.1.2 1753 | cross-spawn: 7.0.6 1754 | debug: 4.4.1 1755 | escape-string-regexp: 4.0.0 1756 | eslint-scope: 8.4.0 1757 | eslint-visitor-keys: 4.2.1 1758 | espree: 10.4.0 1759 | esquery: 1.6.0 1760 | esutils: 2.0.3 1761 | fast-deep-equal: 3.1.3 1762 | file-entry-cache: 8.0.0 1763 | find-up: 5.0.0 1764 | glob-parent: 6.0.2 1765 | ignore: 5.3.2 1766 | imurmurhash: 0.1.4 1767 | is-glob: 4.0.3 1768 | json-stable-stringify-without-jsonify: 1.0.1 1769 | lodash.merge: 4.6.2 1770 | minimatch: 3.1.2 1771 | natural-compare: 1.4.0 1772 | optionator: 0.9.4 1773 | transitivePeerDependencies: 1774 | - supports-color 1775 | 1776 | espree@10.4.0: 1777 | dependencies: 1778 | acorn: 8.15.0 1779 | acorn-jsx: 5.3.2(acorn@8.15.0) 1780 | eslint-visitor-keys: 4.2.1 1781 | 1782 | esquery@1.6.0: 1783 | dependencies: 1784 | estraverse: 5.3.0 1785 | 1786 | esrecurse@4.3.0: 1787 | dependencies: 1788 | estraverse: 5.3.0 1789 | 1790 | estraverse@5.3.0: {} 1791 | 1792 | estree-walker@2.0.2: {} 1793 | 1794 | esutils@2.0.3: {} 1795 | 1796 | fast-deep-equal@3.1.3: {} 1797 | 1798 | fast-glob@3.3.3: 1799 | dependencies: 1800 | '@nodelib/fs.stat': 2.0.5 1801 | '@nodelib/fs.walk': 1.2.8 1802 | glob-parent: 5.1.2 1803 | merge2: 1.4.1 1804 | micromatch: 4.0.8 1805 | 1806 | fast-json-stable-stringify@2.1.0: {} 1807 | 1808 | fast-levenshtein@2.0.6: {} 1809 | 1810 | fastq@1.19.1: 1811 | dependencies: 1812 | reusify: 1.1.0 1813 | 1814 | fdir@6.4.6(picomatch@4.0.2): 1815 | optionalDependencies: 1816 | picomatch: 4.0.2 1817 | 1818 | file-entry-cache@8.0.0: 1819 | dependencies: 1820 | flat-cache: 4.0.1 1821 | 1822 | fill-range@7.1.1: 1823 | dependencies: 1824 | to-regex-range: 5.0.1 1825 | 1826 | find-up@5.0.0: 1827 | dependencies: 1828 | locate-path: 6.0.0 1829 | path-exists: 4.0.0 1830 | 1831 | flat-cache@4.0.1: 1832 | dependencies: 1833 | flatted: 3.3.3 1834 | keyv: 4.5.4 1835 | 1836 | flatted@3.3.3: {} 1837 | 1838 | fsevents@2.3.3: 1839 | optional: true 1840 | 1841 | glob-parent@5.1.2: 1842 | dependencies: 1843 | is-glob: 4.0.3 1844 | 1845 | glob-parent@6.0.2: 1846 | dependencies: 1847 | is-glob: 4.0.3 1848 | 1849 | globals@14.0.0: {} 1850 | 1851 | globals@16.2.0: {} 1852 | 1853 | graphemer@1.4.0: {} 1854 | 1855 | has-flag@4.0.0: {} 1856 | 1857 | he@1.2.0: {} 1858 | 1859 | ignore@5.3.2: {} 1860 | 1861 | ignore@7.0.5: {} 1862 | 1863 | immutable@5.1.3: {} 1864 | 1865 | import-fresh@3.3.1: 1866 | dependencies: 1867 | parent-module: 1.0.1 1868 | resolve-from: 4.0.0 1869 | 1870 | imurmurhash@0.1.4: {} 1871 | 1872 | is-extglob@2.1.1: {} 1873 | 1874 | is-glob@4.0.3: 1875 | dependencies: 1876 | is-extglob: 2.1.1 1877 | 1878 | is-number@7.0.0: {} 1879 | 1880 | isexe@2.0.0: {} 1881 | 1882 | js-yaml@4.1.0: 1883 | dependencies: 1884 | argparse: 2.0.1 1885 | 1886 | json-buffer@3.0.1: {} 1887 | 1888 | json-schema-traverse@0.4.1: {} 1889 | 1890 | json-stable-stringify-without-jsonify@1.0.1: {} 1891 | 1892 | keyv@4.5.4: 1893 | dependencies: 1894 | json-buffer: 3.0.1 1895 | 1896 | levn@0.4.1: 1897 | dependencies: 1898 | prelude-ls: 1.2.1 1899 | type-check: 0.4.0 1900 | 1901 | locate-path@6.0.0: 1902 | dependencies: 1903 | p-locate: 5.0.0 1904 | 1905 | lodash.merge@4.6.2: {} 1906 | 1907 | lodash@4.17.21: {} 1908 | 1909 | magic-string@0.30.17: 1910 | dependencies: 1911 | '@jridgewell/sourcemap-codec': 1.5.0 1912 | 1913 | merge2@1.4.1: {} 1914 | 1915 | micromatch@4.0.8: 1916 | dependencies: 1917 | braces: 3.0.3 1918 | picomatch: 2.3.1 1919 | 1920 | minimatch@3.1.2: 1921 | dependencies: 1922 | brace-expansion: 1.1.11 1923 | 1924 | minimatch@9.0.5: 1925 | dependencies: 1926 | brace-expansion: 2.0.2 1927 | 1928 | ms@2.1.3: {} 1929 | 1930 | muggle-string@0.4.1: {} 1931 | 1932 | nanoid@3.3.11: {} 1933 | 1934 | natural-compare@1.4.0: {} 1935 | 1936 | nth-check@2.1.1: 1937 | dependencies: 1938 | boolbase: 1.0.0 1939 | 1940 | optionator@0.9.4: 1941 | dependencies: 1942 | deep-is: 0.1.4 1943 | fast-levenshtein: 2.0.6 1944 | levn: 0.4.1 1945 | prelude-ls: 1.2.1 1946 | type-check: 0.4.0 1947 | word-wrap: 1.2.5 1948 | 1949 | p-limit@3.1.0: 1950 | dependencies: 1951 | yocto-queue: 0.1.0 1952 | 1953 | p-locate@5.0.0: 1954 | dependencies: 1955 | p-limit: 3.1.0 1956 | 1957 | parent-module@1.0.1: 1958 | dependencies: 1959 | callsites: 3.1.0 1960 | 1961 | path-browserify@1.0.1: {} 1962 | 1963 | path-exists@4.0.0: {} 1964 | 1965 | path-key@3.1.1: {} 1966 | 1967 | picocolors@1.1.1: {} 1968 | 1969 | picomatch@2.3.1: {} 1970 | 1971 | picomatch@4.0.2: {} 1972 | 1973 | postcss-selector-parser@6.1.2: 1974 | dependencies: 1975 | cssesc: 3.0.0 1976 | util-deprecate: 1.0.2 1977 | 1978 | postcss@8.5.4: 1979 | dependencies: 1980 | nanoid: 3.3.11 1981 | picocolors: 1.1.1 1982 | source-map-js: 1.2.1 1983 | 1984 | prelude-ls@1.2.1: {} 1985 | 1986 | punycode@2.3.1: {} 1987 | 1988 | queue-microtask@1.2.3: {} 1989 | 1990 | resolve-from@4.0.0: {} 1991 | 1992 | reusify@1.1.0: {} 1993 | 1994 | rollup@4.42.0: 1995 | dependencies: 1996 | '@types/estree': 1.0.7 1997 | optionalDependencies: 1998 | '@rollup/rollup-android-arm-eabi': 4.42.0 1999 | '@rollup/rollup-android-arm64': 4.42.0 2000 | '@rollup/rollup-darwin-arm64': 4.42.0 2001 | '@rollup/rollup-darwin-x64': 4.42.0 2002 | '@rollup/rollup-freebsd-arm64': 4.42.0 2003 | '@rollup/rollup-freebsd-x64': 4.42.0 2004 | '@rollup/rollup-linux-arm-gnueabihf': 4.42.0 2005 | '@rollup/rollup-linux-arm-musleabihf': 4.42.0 2006 | '@rollup/rollup-linux-arm64-gnu': 4.42.0 2007 | '@rollup/rollup-linux-arm64-musl': 4.42.0 2008 | '@rollup/rollup-linux-loongarch64-gnu': 4.42.0 2009 | '@rollup/rollup-linux-powerpc64le-gnu': 4.42.0 2010 | '@rollup/rollup-linux-riscv64-gnu': 4.42.0 2011 | '@rollup/rollup-linux-riscv64-musl': 4.42.0 2012 | '@rollup/rollup-linux-s390x-gnu': 4.42.0 2013 | '@rollup/rollup-linux-x64-gnu': 4.42.0 2014 | '@rollup/rollup-linux-x64-musl': 4.42.0 2015 | '@rollup/rollup-win32-arm64-msvc': 4.42.0 2016 | '@rollup/rollup-win32-ia32-msvc': 4.42.0 2017 | '@rollup/rollup-win32-x64-msvc': 4.42.0 2018 | fsevents: 2.3.3 2019 | 2020 | run-parallel@1.2.0: 2021 | dependencies: 2022 | queue-microtask: 1.2.3 2023 | 2024 | rxjs@7.8.2: 2025 | dependencies: 2026 | tslib: 2.8.1 2027 | 2028 | sass-embedded-android-arm64@1.89.2: 2029 | optional: true 2030 | 2031 | sass-embedded-android-arm@1.89.2: 2032 | optional: true 2033 | 2034 | sass-embedded-android-riscv64@1.89.2: 2035 | optional: true 2036 | 2037 | sass-embedded-android-x64@1.89.2: 2038 | optional: true 2039 | 2040 | sass-embedded-darwin-arm64@1.89.2: 2041 | optional: true 2042 | 2043 | sass-embedded-darwin-x64@1.89.2: 2044 | optional: true 2045 | 2046 | sass-embedded-linux-arm64@1.89.2: 2047 | optional: true 2048 | 2049 | sass-embedded-linux-arm@1.89.2: 2050 | optional: true 2051 | 2052 | sass-embedded-linux-musl-arm64@1.89.2: 2053 | optional: true 2054 | 2055 | sass-embedded-linux-musl-arm@1.89.2: 2056 | optional: true 2057 | 2058 | sass-embedded-linux-musl-riscv64@1.89.2: 2059 | optional: true 2060 | 2061 | sass-embedded-linux-musl-x64@1.89.2: 2062 | optional: true 2063 | 2064 | sass-embedded-linux-riscv64@1.89.2: 2065 | optional: true 2066 | 2067 | sass-embedded-linux-x64@1.89.2: 2068 | optional: true 2069 | 2070 | sass-embedded-win32-arm64@1.89.2: 2071 | optional: true 2072 | 2073 | sass-embedded-win32-x64@1.89.2: 2074 | optional: true 2075 | 2076 | sass-embedded@1.89.2: 2077 | dependencies: 2078 | '@bufbuild/protobuf': 2.5.2 2079 | buffer-builder: 0.2.0 2080 | colorjs.io: 0.5.2 2081 | immutable: 5.1.3 2082 | rxjs: 7.8.2 2083 | supports-color: 8.1.1 2084 | sync-child-process: 1.0.2 2085 | varint: 6.0.0 2086 | optionalDependencies: 2087 | sass-embedded-android-arm: 1.89.2 2088 | sass-embedded-android-arm64: 1.89.2 2089 | sass-embedded-android-riscv64: 1.89.2 2090 | sass-embedded-android-x64: 1.89.2 2091 | sass-embedded-darwin-arm64: 1.89.2 2092 | sass-embedded-darwin-x64: 1.89.2 2093 | sass-embedded-linux-arm: 1.89.2 2094 | sass-embedded-linux-arm64: 1.89.2 2095 | sass-embedded-linux-musl-arm: 1.89.2 2096 | sass-embedded-linux-musl-arm64: 1.89.2 2097 | sass-embedded-linux-musl-riscv64: 1.89.2 2098 | sass-embedded-linux-musl-x64: 1.89.2 2099 | sass-embedded-linux-riscv64: 1.89.2 2100 | sass-embedded-linux-x64: 1.89.2 2101 | sass-embedded-win32-arm64: 1.89.2 2102 | sass-embedded-win32-x64: 1.89.2 2103 | 2104 | semver@7.7.2: {} 2105 | 2106 | shebang-command@2.0.0: 2107 | dependencies: 2108 | shebang-regex: 3.0.0 2109 | 2110 | shebang-regex@3.0.0: {} 2111 | 2112 | source-map-js@1.2.1: {} 2113 | 2114 | strip-json-comments@3.1.1: {} 2115 | 2116 | supports-color@7.2.0: 2117 | dependencies: 2118 | has-flag: 4.0.0 2119 | 2120 | supports-color@8.1.1: 2121 | dependencies: 2122 | has-flag: 4.0.0 2123 | 2124 | sync-child-process@1.0.2: 2125 | dependencies: 2126 | sync-message-port: 1.1.3 2127 | 2128 | sync-message-port@1.1.3: {} 2129 | 2130 | tinyglobby@0.2.14: 2131 | dependencies: 2132 | fdir: 6.4.6(picomatch@4.0.2) 2133 | picomatch: 4.0.2 2134 | 2135 | to-regex-range@5.0.1: 2136 | dependencies: 2137 | is-number: 7.0.0 2138 | 2139 | ts-api-utils@2.1.0(typescript@5.8.3): 2140 | dependencies: 2141 | typescript: 5.8.3 2142 | 2143 | tslib@2.8.1: {} 2144 | 2145 | type-check@0.4.0: 2146 | dependencies: 2147 | prelude-ls: 1.2.1 2148 | 2149 | typescript@5.8.3: {} 2150 | 2151 | uri-js@4.4.1: 2152 | dependencies: 2153 | punycode: 2.3.1 2154 | 2155 | util-deprecate@1.0.2: {} 2156 | 2157 | varint@6.0.0: {} 2158 | 2159 | vite@6.3.5(sass-embedded@1.89.2): 2160 | dependencies: 2161 | esbuild: 0.25.5 2162 | fdir: 6.4.6(picomatch@4.0.2) 2163 | picomatch: 4.0.2 2164 | postcss: 8.5.4 2165 | rollup: 4.42.0 2166 | tinyglobby: 0.2.14 2167 | optionalDependencies: 2168 | fsevents: 2.3.3 2169 | sass-embedded: 1.89.2 2170 | 2171 | vscode-uri@3.1.0: {} 2172 | 2173 | vue-eslint-parser@10.1.3(eslint@9.29.0): 2174 | dependencies: 2175 | debug: 4.4.1 2176 | eslint: 9.29.0 2177 | eslint-scope: 8.4.0 2178 | eslint-visitor-keys: 4.2.1 2179 | espree: 10.4.0 2180 | esquery: 1.6.0 2181 | lodash: 4.17.21 2182 | semver: 7.7.2 2183 | transitivePeerDependencies: 2184 | - supports-color 2185 | 2186 | vue-tsc@2.2.10(typescript@5.8.3): 2187 | dependencies: 2188 | '@volar/typescript': 2.4.14 2189 | '@vue/language-core': 2.2.10(typescript@5.8.3) 2190 | typescript: 5.8.3 2191 | 2192 | vue@3.5.16(typescript@5.8.3): 2193 | dependencies: 2194 | '@vue/compiler-dom': 3.5.16 2195 | '@vue/compiler-sfc': 3.5.16 2196 | '@vue/runtime-dom': 3.5.16 2197 | '@vue/server-renderer': 3.5.16(vue@3.5.16(typescript@5.8.3)) 2198 | '@vue/shared': 3.5.16 2199 | optionalDependencies: 2200 | typescript: 5.8.3 2201 | 2202 | which@2.0.2: 2203 | dependencies: 2204 | isexe: 2.0.0 2205 | 2206 | word-wrap@1.2.5: {} 2207 | 2208 | xml-name-validator@4.0.0: {} 2209 | 2210 | yocto-queue@0.1.0: {} 2211 | --------------------------------------------------------------------------------