├── src ├── routes │ ├── global.css │ ├── +layout.server.ts │ ├── tailwind.css │ ├── ambient.d.ts │ ├── tokens.css │ ├── +layout.svelte │ ├── shiki.css │ ├── docs │ │ └── +page.svelte │ └── +page.svelte ├── index.test.ts ├── lib │ ├── utils.ts │ ├── index.ts │ └── sveltekit-view-transition.ts ├── app.html ├── app.d.ts └── components │ ├── Mouse.svelte │ └── BrowserWindow.svelte ├── .npmrc ├── examples ├── sveltegram │ ├── .npmrc │ ├── src │ │ ├── lib │ │ │ ├── index.ts │ │ │ ├── assets │ │ │ │ └── logo.png │ │ │ ├── StorySelector.svelte │ │ │ ├── Post.svelte │ │ │ └── fake-data.ts │ │ ├── app.d.ts │ │ ├── routes │ │ │ ├── +layout.svelte │ │ │ └── (base) │ │ │ │ ├── +layout.svelte │ │ │ │ ├── +page.svelte │ │ │ │ ├── photo │ │ │ │ └── [id] │ │ │ │ │ └── +page.svelte │ │ │ │ └── stories │ │ │ │ └── [id] │ │ │ │ └── +page@.svelte │ │ └── app.html │ ├── static │ │ └── favicon.png │ ├── vite.config.ts │ ├── .gitignore │ ├── .eslintignore │ ├── .prettierignore │ ├── .prettierrc │ ├── tsconfig.json │ ├── .eslintrc.cjs │ ├── svelte.config.js │ ├── README.md │ └── package.json └── list-and-details │ ├── .npmrc │ ├── static │ └── favicon.png │ ├── vite.config.ts │ ├── .gitignore │ ├── src │ ├── routes │ │ ├── details │ │ │ └── [id] │ │ │ │ ├── +page.svelte │ │ │ │ └── +page.server.ts │ │ ├── +layout.svelte │ │ ├── +page.server.ts │ │ ├── global.css │ │ └── +page.svelte │ ├── app.d.ts │ ├── lib │ │ ├── components │ │ │ ├── Rating.svelte │ │ │ ├── Details.svelte │ │ │ └── Card.svelte │ │ └── products.json │ └── app.html │ ├── .eslintignore │ ├── .prettierignore │ ├── .prettierrc │ ├── tsconfig.json │ ├── .eslintrc.cjs │ ├── svelte.config.js │ ├── package.json │ ├── README.md │ └── pnpm-lock.yaml ├── .github ├── FUNDING.yml ├── workflows │ └── publish.yml └── ISSUE_TEMPLATE │ ├── feature_request.yaml │ └── bug_report.yaml ├── static └── favicon.png ├── postcss.config.js ├── .gitignore ├── .eslintignore ├── .prettierignore ├── tests └── test.ts ├── .prettierrc ├── .changeset ├── config.json └── README.md ├── playwright.config.ts ├── vite.config.ts ├── tsconfig.json ├── tailwind.config.js ├── .eslintrc.cjs ├── mdsvex.config.js ├── svelte.config.js ├── LICENSE ├── package.json ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md └── README.md /src/routes/global.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | resolution-mode=highest 3 | -------------------------------------------------------------------------------- /src/routes/+layout.server.ts: -------------------------------------------------------------------------------- 1 | export const prerender = true; 2 | -------------------------------------------------------------------------------- /examples/sveltegram/.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | resolution-mode=highest 3 | -------------------------------------------------------------------------------- /examples/list-and-details/.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | resolution-mode=highest 3 | -------------------------------------------------------------------------------- /src/routes/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: paoloricciuti 4 | -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paoloricciuti/sveltekit-view-transition/HEAD/static/favicon.png -------------------------------------------------------------------------------- /examples/sveltegram/src/lib/index.ts: -------------------------------------------------------------------------------- 1 | // place files you want to import through the `$lib` alias in this folder. 2 | -------------------------------------------------------------------------------- /examples/sveltegram/static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paoloricciuti/sveltekit-view-transition/HEAD/examples/sveltegram/static/favicon.png -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | 'tailwindcss/nesting': {}, 4 | tailwindcss: {}, 5 | autoprefixer: {}, 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /examples/list-and-details/static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paoloricciuti/sveltekit-view-transition/HEAD/examples/list-and-details/static/favicon.png -------------------------------------------------------------------------------- /examples/sveltegram/src/lib/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/paoloricciuti/sveltekit-view-transition/HEAD/examples/sveltegram/src/lib/assets/logo.png -------------------------------------------------------------------------------- /src/index.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from 'vitest'; 2 | 3 | describe('sum test', () => { 4 | it('adds 1 + 2 to equal 3', () => { 5 | expect(1 + 2).toBe(3); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /examples/sveltegram/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import { defineConfig } from 'vite'; 3 | 4 | export default defineConfig({ 5 | plugins: [sveltekit()] 6 | }); 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /dist 5 | /.svelte-kit 6 | /package 7 | .env 8 | .env.* 9 | !.env.example 10 | vite.config.js.timestamp-* 11 | vite.config.ts.timestamp-* 12 | -------------------------------------------------------------------------------- /examples/list-and-details/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import { defineConfig } from 'vite'; 3 | 4 | export default defineConfig({ 5 | plugins: [sveltekit()] 6 | }); 7 | -------------------------------------------------------------------------------- /src/routes/ambient.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.md' { 2 | import type { SvelteComponent, ComponentType } from 'svelte'; 3 | const content: ComponentType; 4 | export default content; 5 | } 6 | -------------------------------------------------------------------------------- /examples/sveltegram/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | vite.config.js.timestamp-* 10 | vite.config.ts.timestamp-* 11 | -------------------------------------------------------------------------------- /examples/list-and-details/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | vite.config.js.timestamp-* 10 | vite.config.ts.timestamp-* 11 | -------------------------------------------------------------------------------- /examples/list-and-details/src/routes/details/[id]/+page.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 |
8 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | export class SetOfCallback< 2 | T, 3 | S extends { listener: (props: T) => void | Promise; auto_clean: boolean } = { 4 | listener: (props: T) => void | Promise; 5 | auto_clean: boolean; 6 | }, 7 | > extends Set {} 8 | -------------------------------------------------------------------------------- /examples/sveltegram/.eslintignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /examples/sveltegram/.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /tests/test.ts: -------------------------------------------------------------------------------- 1 | import { expect, test } from '@playwright/test'; 2 | 3 | test('index page has expected h1', async ({ page }) => { 4 | await page.goto('/'); 5 | await expect(page.getByRole('heading', { name: 'Welcome to SvelteKit' })).toBeVisible(); 6 | }); 7 | -------------------------------------------------------------------------------- /examples/list-and-details/.eslintignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /examples/list-and-details/.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "all", 5 | "printWidth": 100, 6 | "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], 7 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] 8 | } 9 | -------------------------------------------------------------------------------- /src/routes/tokens.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --sk-back-3-hsl: 0, 0%, 14%; 3 | --sk-code-base: hsl(45, 7%, 75%); 4 | --sk-code-comment: hsl(0, 0%, 55%); 5 | --sk-code-keyword: hsl(204, 88%, 65%); 6 | --sk-code-function: hsl(19, 67%, 75%); 7 | --sk-code-string: hsl(41, 37%, 68%); 8 | } -------------------------------------------------------------------------------- /examples/list-and-details/src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |
6 | 7 |
8 | 9 | 16 | -------------------------------------------------------------------------------- /examples/sveltegram/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "plugins": ["prettier-plugin-svelte"], 7 | "pluginSearchDirs": ["."], 8 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] 9 | } 10 | -------------------------------------------------------------------------------- /examples/list-and-details/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "plugins": ["prettier-plugin-svelte"], 7 | "pluginSearchDirs": ["."], 8 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] 9 | } 10 | -------------------------------------------------------------------------------- /examples/sveltegram/src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | declare global { 4 | namespace App { 5 | // interface Error {} 6 | // interface Locals {} 7 | // interface PageData {} 8 | // interface Platform {} 9 | } 10 | } 11 | 12 | export {}; 13 | -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json", 3 | "changelog": "@changesets/cli/changelog", 4 | "commit": false, 5 | "fixed": [], 6 | "linked": [], 7 | "access": "public", 8 | "baseBranch": "main", 9 | "updateInternalDependencies": "patch", 10 | "ignore": [] 11 | } 12 | -------------------------------------------------------------------------------- /examples/list-and-details/src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | declare global { 4 | namespace App { 5 | // interface Error {} 6 | // interface Locals {} 7 | // interface PageData {} 8 | // interface Platform {} 9 | } 10 | } 11 | 12 | export {}; 13 | -------------------------------------------------------------------------------- /examples/list-and-details/src/routes/details/[id]/+page.server.ts: -------------------------------------------------------------------------------- 1 | import products from '$lib/products.json'; 2 | 3 | export async function load({ params: { id } }) { 4 | const product = products.find((product) => product.id.toString() === id); 5 | if (!product) throw new Error('Not found'); 6 | return { 7 | product 8 | }; 9 | } 10 | -------------------------------------------------------------------------------- /playwright.config.ts: -------------------------------------------------------------------------------- 1 | import type { PlaywrightTestConfig } from '@playwright/test'; 2 | 3 | const config: PlaywrightTestConfig = { 4 | webServer: { 5 | command: 'npm run build && npm run preview', 6 | port: 4173, 7 | }, 8 | testDir: 'tests', 9 | testMatch: /(.+\.)?(test|spec)\.[jt]s/, 10 | }; 11 | 12 | export default config; 13 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import { defineConfig } from 'vitest/config'; 3 | 4 | export default defineConfig({ 5 | plugins: [sveltekit()], 6 | test: { 7 | include: ['src/**/*.{test,spec}.{js,ts}'], 8 | }, 9 | server: { 10 | fs: { 11 | allow: ['./README.md'], 12 | }, 13 | }, 14 | }); 15 | -------------------------------------------------------------------------------- /examples/list-and-details/src/lib/components/Rating.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | {#each { length: 5 } as _, i} 7 | rate}>⭐️ 8 | {/each} 9 | out of {count} 10 | 11 | 16 | -------------------------------------------------------------------------------- /examples/sveltegram/src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | 17 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true, 12 | "moduleResolution": "bundler" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/lib/index.ts: -------------------------------------------------------------------------------- 1 | // Reexport your entry components here 2 | 3 | export { setupViewTransition } from './sveltekit-view-transition'; 4 | 5 | export type { 6 | OnOptions, 7 | SveltekitViewTransitionEvents, 8 | SveltekitViewTransitionEventsMap, 9 | TransitionAction, 10 | TransitionActionFunctionProps, 11 | TransitionActionFunctions, 12 | } from './sveltekit-view-transition'; 13 | -------------------------------------------------------------------------------- /examples/sveltegram/src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
%sveltekit.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | %sveltekit.head% 9 | 10 | 11 | 12 |
%sveltekit.body%
13 | 14 | 15 | -------------------------------------------------------------------------------- /examples/list-and-details/src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
%sveltekit.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /examples/list-and-details/src/routes/+page.server.ts: -------------------------------------------------------------------------------- 1 | import products_json from '$lib/products.json'; 2 | 3 | export async function load({ url: { searchParams } }) { 4 | const search = searchParams.get('search')?.toString() ?? ''; 5 | // pretend this is an api search 6 | const products = products_json.filter((product) => { 7 | return product.title.toLowerCase().includes(search.toLowerCase()); 8 | }); 9 | return { 10 | products, 11 | search 12 | }; 13 | } 14 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | import typography from '@tailwindcss/typography'; 2 | 3 | /** @type {import('tailwindcss').Config} */ 4 | export default { 5 | content: ['./src/**/*.{html,js,svelte,ts}'], 6 | theme: { 7 | extend: { 8 | borderWidth: { 9 | 1: '1px', 10 | }, 11 | fontSize: { 12 | fluid: 'clamp(.6rem, 1.5vw + .3rem, 1rem)', 13 | 'fluid-xl': 'clamp(.6rem, 2.5vw + .3rem, 3rem)', 14 | }, 15 | }, 16 | }, 17 | plugins: [typography], 18 | }; 19 | -------------------------------------------------------------------------------- /.changeset/README.md: -------------------------------------------------------------------------------- 1 | # Changesets 2 | 3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works 4 | with multi-package repos, or single-package repos to help you version and publish your code. You can 5 | find the full documentation for it [in our repository](https://github.com/changesets/changesets) 6 | 7 | We have a quick list of common questions to get you started engaging with this project in 8 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) 9 | -------------------------------------------------------------------------------- /src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 20 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | declare global { 4 | namespace App { 5 | // interface Error {} 6 | // interface Locals {} 7 | // interface PageData {} 8 | // interface Platform {} 9 | } 10 | interface ViewTransition { 11 | updateCallbackDone: Promise; 12 | ready: Promise; 13 | finished: Promise; 14 | skipTransition: () => void; 15 | } 16 | 17 | interface Document { 18 | startViewTransition(updateCallback: () => Promise | void): ViewTransition; 19 | } 20 | } 21 | 22 | export {}; 23 | -------------------------------------------------------------------------------- /src/routes/shiki.css: -------------------------------------------------------------------------------- 1 | html { 2 | --shiki-color-text: var(--sk-code-base); 3 | --shiki-color-background: hsl(var(--sk-back-3-hsl)); 4 | --shiki-token-constant: var(--sk-code-base); 5 | --shiki-token-string: var(--sk-code-string); 6 | --shiki-token-comment: var(--sk-code-comment); 7 | --shiki-token-keyword: var(--sk-code-keyword); 8 | --shiki-token-parameter: var(--sk-code-base); 9 | --shiki-token-function: var(--sk-code-function); 10 | --shiki-token-string-expression: var(--sk-code-string); 11 | --shiki-token-punctuation: var(--sk-code-base); 12 | --shiki-token-link: var(--sk-code-keyword); 13 | } -------------------------------------------------------------------------------- /examples/sveltegram/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true 12 | } 13 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias 14 | // 15 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 16 | // from the referenced tsconfig.json - TypeScript does not merge them in 17 | } 18 | -------------------------------------------------------------------------------- /examples/list-and-details/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true 12 | } 13 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias 14 | // 15 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 16 | // from the referenced tsconfig.json - TypeScript does not merge them in 17 | } 18 | -------------------------------------------------------------------------------- /src/components/Mouse.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | 23 | 24 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: [ 4 | 'eslint:recommended', 5 | 'plugin:@typescript-eslint/recommended', 6 | 'plugin:svelte/recommended', 7 | 'prettier', 8 | ], 9 | parser: '@typescript-eslint/parser', 10 | plugins: ['@typescript-eslint'], 11 | parserOptions: { 12 | sourceType: 'module', 13 | ecmaVersion: 2020, 14 | extraFileExtensions: ['.svelte'], 15 | }, 16 | env: { 17 | browser: true, 18 | es2017: true, 19 | node: true, 20 | }, 21 | overrides: [ 22 | { 23 | files: ['*.svelte'], 24 | parser: 'svelte-eslint-parser', 25 | parserOptions: { 26 | parser: '@typescript-eslint/parser', 27 | }, 28 | }, 29 | ], 30 | }; 31 | -------------------------------------------------------------------------------- /examples/list-and-details/src/routes/global.css: -------------------------------------------------------------------------------- 1 | *, 2 | *::before, 3 | *::after { 4 | margin: 0; 5 | padding: 0; 6 | box-sizing: border-box; 7 | } 8 | 9 | html, 10 | body { 11 | height: 100%; 12 | } 13 | 14 | :root { 15 | --bg: hsl(0 0% 98%); 16 | --text: hsl(0 0% 8%); 17 | } 18 | 19 | body { 20 | color: var(--text); 21 | background-color: var(--bg); 22 | background-attachment: fixed; 23 | font-family: 24 | system-ui, 25 | -apple-system, 26 | BlinkMacSystemFont, 27 | 'Segoe UI', 28 | Roboto, 29 | Oxygen, 30 | Ubuntu, 31 | Cantarell, 32 | 'Open Sans', 33 | 'Helvetica Neue', 34 | sans-serif; 35 | } 36 | 37 | img { 38 | width: 100%; 39 | display: block; 40 | } 41 | -------------------------------------------------------------------------------- /examples/sveltegram/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: [ 4 | 'eslint:recommended', 5 | 'plugin:@typescript-eslint/recommended', 6 | 'plugin:svelte/recommended', 7 | 'prettier' 8 | ], 9 | parser: '@typescript-eslint/parser', 10 | plugins: ['@typescript-eslint'], 11 | parserOptions: { 12 | sourceType: 'module', 13 | ecmaVersion: 2020, 14 | extraFileExtensions: ['.svelte'] 15 | }, 16 | env: { 17 | browser: true, 18 | es2017: true, 19 | node: true 20 | }, 21 | overrides: [ 22 | { 23 | files: ['*.svelte'], 24 | parser: 'svelte-eslint-parser', 25 | parserOptions: { 26 | parser: '@typescript-eslint/parser' 27 | } 28 | } 29 | ] 30 | }; 31 | -------------------------------------------------------------------------------- /mdsvex.config.js: -------------------------------------------------------------------------------- 1 | import { defineMDSveXConfig as defineConfig } from 'mdsvex'; 2 | import { getHighlighter } from 'shiki'; 3 | 4 | const highlighter = await getHighlighter({ theme: 'css-variables' }); 5 | 6 | const config = defineConfig({ 7 | extensions: ['.svelte.md', '.md', '.svx'], 8 | highlight: { 9 | highlighter(code, lang) { 10 | const html = highlighter.codeToHtml(code, { lang }); 11 | return `{@html \`${html 12 | .replace('%ts%', 'ts') 13 | .replaceAll('`', '\\`') 14 | .replaceAll('{', '\\{')}\`}`; 15 | }, 16 | }, 17 | smartypants: { 18 | dashes: 'oldschool', 19 | }, 20 | 21 | remarkPlugins: [], 22 | rehypePlugins: [], 23 | }); 24 | 25 | export default config; 26 | -------------------------------------------------------------------------------- /examples/list-and-details/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: [ 4 | 'eslint:recommended', 5 | 'plugin:@typescript-eslint/recommended', 6 | 'plugin:svelte/recommended', 7 | 'prettier' 8 | ], 9 | parser: '@typescript-eslint/parser', 10 | plugins: ['@typescript-eslint'], 11 | parserOptions: { 12 | sourceType: 'module', 13 | ecmaVersion: 2020, 14 | extraFileExtensions: ['.svelte'] 15 | }, 16 | env: { 17 | browser: true, 18 | es2017: true, 19 | node: true 20 | }, 21 | overrides: [ 22 | { 23 | files: ['*.svelte'], 24 | parser: 'svelte-eslint-parser', 25 | parserOptions: { 26 | parser: '@typescript-eslint/parser' 27 | } 28 | } 29 | ] 30 | }; 31 | -------------------------------------------------------------------------------- /examples/sveltegram/src/routes/(base)/+layout.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |
6 | 7 | 8 | SvelteGram 9 | 10 |
11 | 12 | 13 | 35 | -------------------------------------------------------------------------------- /examples/list-and-details/svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto'; 2 | import { vitePreprocess } from '@sveltejs/kit/vite'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://kit.svelte.dev/docs/integrations#preprocessors 7 | // for more information about preprocessors 8 | preprocess: vitePreprocess(), 9 | 10 | kit: { 11 | // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. 12 | // If your environment is not supported or you settled on a specific environment, switch out the adapter. 13 | // See https://kit.svelte.dev/docs/adapters for more information about adapters. 14 | adapter: adapter() 15 | } 16 | }; 17 | 18 | export default config; 19 | -------------------------------------------------------------------------------- /examples/sveltegram/svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-vercel'; 2 | import { vitePreprocess } from '@sveltejs/kit/vite'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://kit.svelte.dev/docs/integrations#preprocessors 7 | // for more information about preprocessors 8 | preprocess: vitePreprocess(), 9 | 10 | kit: { 11 | // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. 12 | // If your environment is not supported or you settled on a specific environment, switch out the adapter. 13 | // See https://kit.svelte.dev/docs/adapters for more information about adapters. 14 | adapter: adapter() 15 | } 16 | }; 17 | 18 | export default config; 19 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish 2 | on: 3 | push: 4 | branches: 5 | - 'main' 6 | 7 | concurrency: ${{ github.workflow }}-${{ github.ref }} 8 | 9 | jobs: 10 | publish: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v3 14 | - uses: pnpm/action-setup@v2 15 | with: 16 | version: 8 17 | - uses: actions/setup-node@v3 18 | with: 19 | node-version: 16.x 20 | cache: 'pnpm' 21 | 22 | - run: pnpm install --frozen-lockfile 23 | - name: Create Release Pull Request or Publish 24 | id: changesets 25 | uses: changesets/action@v1 26 | with: 27 | publish: pnpm run changeset:publish 28 | env: 29 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 30 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 31 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yaml: -------------------------------------------------------------------------------- 1 | name: "\U0001F4A1 Feature Request" 2 | description: Request a new feature 3 | body: 4 | - type: markdown 5 | attributes: 6 | value: | 7 | Thank you for taking the time to propose a new idea 8 | - type: textarea 9 | id: problem 10 | attributes: 11 | label: Describe the problem 12 | description: Please provide a clear and concise description the problem this feature would solve. The more information you can provide here, the better. 13 | placeholder: I would like to... 14 | validations: 15 | required: true 16 | - type: textarea 17 | id: solution 18 | attributes: 19 | label: Describe the proposed solution 20 | description: Try to provide a description of the API you would like to see implemented 21 | placeholder: I would like to see... 22 | validations: 23 | required: true 24 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-static'; 2 | import { vitePreprocess } from '@sveltejs/kit/vite'; 3 | import mdsvex_config from './mdsvex.config.js'; 4 | import { mdsvex } from 'mdsvex'; 5 | 6 | /** @type {import('@sveltejs/kit').Config} */ 7 | const config = { 8 | // Consult https://kit.svelte.dev/docs/integrations#preprocessors 9 | // for more information about preprocessors 10 | preprocess: [vitePreprocess(), mdsvex(mdsvex_config)], 11 | extensions: ['.svelte', ...mdsvex_config.extensions], 12 | 13 | kit: { 14 | // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. 15 | // If your environment is not supported or you settled on a specific environment, switch out the adapter. 16 | // See https://kit.svelte.dev/docs/adapters for more information about adapters. 17 | adapter: adapter(), 18 | alias: { 19 | $components: './src/components', 20 | $stores: './src/stores', 21 | }, 22 | }, 23 | }; 24 | 25 | export default config; 26 | -------------------------------------------------------------------------------- /examples/sveltegram/src/routes/(base)/+page.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 |
14 | {#each Object.keys(stories) as user (user)} 15 | 20 | {/each} 21 |
22 |
23 | {#each photos as photo (photo.id)} 24 | 25 | {/each} 26 |
27 | 28 | 43 | -------------------------------------------------------------------------------- /examples/sveltegram/README.md: -------------------------------------------------------------------------------- 1 | # sveltegram 2 | 3 | Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte). 4 | 5 | ## Creating a project 6 | 7 | If you're seeing this, you've probably already done this step. Congrats! 8 | 9 | ```bash 10 | # create a new project in the current directory 11 | npm create svelte@latest 12 | 13 | # create a new project in my-app 14 | npm create svelte@latest my-app 15 | ``` 16 | 17 | ## Developing 18 | 19 | Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: 20 | 21 | ```bash 22 | npm run dev 23 | 24 | # or start the server and open the app in a new browser tab 25 | npm run dev -- --open 26 | ``` 27 | 28 | ## Building 29 | 30 | To create a production version of your app: 31 | 32 | ```bash 33 | npm run build 34 | ``` 35 | 36 | You can preview the production build with `npm run preview`. 37 | 38 | > To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. 39 | -------------------------------------------------------------------------------- /examples/list-and-details/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "list-and-details", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite dev", 7 | "build": "vite build", 8 | "preview": "vite preview", 9 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 10 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 11 | "lint": "prettier --plugin-search-dir . --check . && eslint .", 12 | "format": "prettier --plugin-search-dir . --write ." 13 | }, 14 | "devDependencies": { 15 | "@sveltejs/adapter-auto": "^2.0.0", 16 | "@sveltejs/kit": "^1.20.4", 17 | "@typescript-eslint/eslint-plugin": "^5.45.0", 18 | "@typescript-eslint/parser": "^5.45.0", 19 | "eslint": "^8.28.0", 20 | "eslint-config-prettier": "^8.5.0", 21 | "eslint-plugin-svelte": "^2.30.0", 22 | "prettier": "^3.0.3", 23 | "prettier-plugin-svelte": "^3.0.3", 24 | "svelte": "^4.0.5", 25 | "svelte-check": "^3.4.3", 26 | "sveltekit-view-transition": "^0.5.2", 27 | "tslib": "^2.4.1", 28 | "typescript": "^5.0.0", 29 | "vite": "^4.4.2" 30 | }, 31 | "type": "module" 32 | } 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Paolo Ricciuti 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. -------------------------------------------------------------------------------- /examples/list-and-details/README.md: -------------------------------------------------------------------------------- 1 | # list-and-details example 2 | 3 | Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte). 4 | 5 | ## Creating a project 6 | 7 | If you're seeing this, you've probably already done this step. Congrats! 8 | 9 | ```bash 10 | # create a new project in the current directory 11 | npm create svelte@latest 12 | 13 | # create a new project in my-app 14 | npm create svelte@latest my-app 15 | ``` 16 | 17 | ## Developing 18 | 19 | Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: 20 | 21 | ```bash 22 | npm run dev 23 | 24 | # or start the server and open the app in a new browser tab 25 | npm run dev -- --open 26 | ``` 27 | 28 | ## Building 29 | 30 | To create a production version of your app: 31 | 32 | ```bash 33 | npm run build 34 | ``` 35 | 36 | You can preview the production build with `npm run preview`. 37 | 38 | > To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. 39 | -------------------------------------------------------------------------------- /examples/sveltegram/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sveltegram", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite dev", 7 | "build": "vite build", 8 | "preview": "vite preview", 9 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 10 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 11 | "lint": "prettier --plugin-search-dir . --check . && eslint .", 12 | "format": "prettier --plugin-search-dir . --write ." 13 | }, 14 | "devDependencies": { 15 | "@faker-js/faker": "^8.0.2", 16 | "@sveltejs/adapter-vercel": "^3.0.3", 17 | "@sveltejs/kit": "^1.20.4", 18 | "@typescript-eslint/eslint-plugin": "^5.45.0", 19 | "@typescript-eslint/parser": "^5.45.0", 20 | "eslint": "^8.28.0", 21 | "eslint-config-prettier": "^8.5.0", 22 | "eslint-plugin-svelte": "^2.30.0", 23 | "prettier": "^3.0.3", 24 | "prettier-plugin-svelte": "^3.0.3", 25 | "svelte": "^4.0.5", 26 | "svelte-check": "^3.4.3", 27 | "sveltekit-view-transition": "^0.5.2", 28 | "tslib": "^2.4.1", 29 | "typescript": "^5.0.0", 30 | "vite": "^4.4.2" 31 | }, 32 | "type": "module" 33 | } 34 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yaml: -------------------------------------------------------------------------------- 1 | name: "\U0001F41E Bug report" 2 | description: Report an issue 3 | body: 4 | - type: markdown 5 | attributes: 6 | value: | 7 | First thing first, thanks for reporting! 8 | - type: textarea 9 | id: bug-description 10 | attributes: 11 | label: Describe the bug 12 | description: A clear and concise description of what the bug is. If you intend to submit a PR for this issue, tell us in the description. Thanks! 13 | placeholder: Bug description 14 | validations: 15 | required: true 16 | - type: textarea 17 | id: reproduction 18 | attributes: 19 | label: Reproduction 20 | description: Please provide a link to a repo or better a sveltelab/stackblitz/replit that can reproduce the problem you ran into. This will speed up the fixing. 21 | placeholder: Reproduction 22 | validations: 23 | required: true 24 | - type: textarea 25 | id: logs 26 | attributes: 27 | label: Logs 28 | description: 'Please include browser console and server logs around the time this bug occurred. Optional if provided reproduction. Please try not to insert an image but copy paste the log text.' 29 | render: shell 30 | -------------------------------------------------------------------------------- /examples/sveltegram/src/lib/StorySelector.svelte: -------------------------------------------------------------------------------- 1 | 18 | 19 | 20 | {user} stories 29 | {user} stories 39 | 40 | 41 | 58 | -------------------------------------------------------------------------------- /src/routes/docs/+page.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 |

`sveltekit-view-transition`

10 | 24 |
25 |
26 | 27 |
28 | -------------------------------------------------------------------------------- /examples/sveltegram/src/routes/(base)/photo/[id]/+page.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | {photo.description} 14 | 15 | 25 | 30 | 31 | {photo.likes} likes 32 | 33 |

34 | @{photo.user.username.toLowerCase()} 35 | {photo.description} 36 |

37 | 38 | {#each comments as comment} 39 |

@{comment.user.username.toLowerCase()} {comment.text}

40 | {/each} 41 | 42 | 55 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sveltekit-view-transition", 3 | "repository": "https://github.com/paoloricciuti/sveltekit-view-transition", 4 | "author": "Paolo Ricciuti", 5 | "license": "MIT", 6 | "version": "0.5.3", 7 | "keywords": [ 8 | "sveltekit", 9 | "svelte", 10 | "view", 11 | "transition", 12 | "api", 13 | "view-transition-api", 14 | "view transition api" 15 | ], 16 | "scripts": { 17 | "dev": "vite dev", 18 | "build": "vite build && npm run package", 19 | "preview": "vite preview", 20 | "package": "svelte-kit sync && svelte-package && publint", 21 | "changeset:add": "changeset", 22 | "changeset:publish": "pnpm run build && changeset publish", 23 | "prepublishOnly": "npm run package", 24 | "test": "npm run test:integration && npm run test:unit", 25 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 26 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 27 | "lint": "prettier --check . && eslint .", 28 | "format": "prettier --write .", 29 | "test:integration": "playwright test", 30 | "test:unit": "vitest" 31 | }, 32 | "exports": { 33 | ".": { 34 | "types": "./dist/index.d.ts", 35 | "svelte": "./dist/index.js" 36 | } 37 | }, 38 | "files": [ 39 | "dist", 40 | "!dist/**/*.test.*", 41 | "!dist/**/*.spec.*" 42 | ], 43 | "peerDependencies": { 44 | "@sveltejs/kit": "^1.20.4 || ^2.0.0", 45 | "svelte": "^4.0.0 || ^5.0.0" 46 | }, 47 | "devDependencies": { 48 | "@changesets/cli": "^2.26.2", 49 | "@playwright/test": "^1.28.1", 50 | "@sveltejs/adapter-static": "^2.0.3", 51 | "@sveltejs/kit": "^1.20.4", 52 | "@sveltejs/package": "^2.0.0", 53 | "@tailwindcss/typography": "^0.5.10", 54 | "@typescript-eslint/eslint-plugin": "^5.45.0", 55 | "@typescript-eslint/parser": "^5.45.0", 56 | "autoprefixer": "^10.4.15", 57 | "eslint": "^8.28.0", 58 | "eslint-config-prettier": "^8.5.0", 59 | "eslint-plugin-svelte": "^2.30.0", 60 | "mdsvex": "^0.11.0", 61 | "postcss": "^8.4.29", 62 | "prettier": "^3.0.3", 63 | "prettier-plugin-svelte": "^3.0.3", 64 | "prettier-plugin-tailwindcss": "^0.5.4", 65 | "publint": "^0.1.9", 66 | "shiki": "^0.14.4", 67 | "svelte": "^4.0.5", 68 | "svelte-check": "^3.4.3", 69 | "tailwindcss": "^3.3.3", 70 | "tslib": "^2.4.1", 71 | "typescript": "^5.0.0", 72 | "vite": "^4.4.2", 73 | "vitest": "^0.32.2" 74 | }, 75 | "svelte": "./dist/index.js", 76 | "types": "./dist/index.d.ts", 77 | "type": "module" 78 | } 79 | -------------------------------------------------------------------------------- /examples/list-and-details/src/lib/components/Details.svelte: -------------------------------------------------------------------------------- 1 | 17 | 18 |
19 |
20 | {title} 21 | 22 | {price.toFixed(2)} € 23 | 24 |

{title}

25 |

{description}

26 |
{category}
27 | 28 | Back 29 |
30 |
31 | 32 | 103 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # sveltekit-view-transition 2 | 3 | ## 0.5.3 4 | 5 | ### Patch Changes 6 | 7 | - 9a01377: fix: update peer deps 8 | 9 | ## 0.5.2 10 | 11 | ### Patch Changes 12 | 13 | - 7aaa3e4: fix: clean the listeners immediately in should apply 14 | 15 | ## 0.5.1 16 | 17 | ### Patch Changes 18 | 19 | - fd0a8fb: fix readme information 20 | 21 | ## 0.5.0 22 | 23 | ### Minor Changes 24 | 25 | - 6c32491: provide node and isInViewport arguments to action functions 26 | 27 | ## 0.4.6 28 | 29 | ### Patch Changes 30 | 31 | - 6e6072c: avoid adding onNavigate if startViewTransition is not in document 32 | 33 | ## 0.4.5 34 | 35 | ### Patch Changes 36 | 37 | - a2116bd: add warning in readme 38 | 39 | ## 0.4.4 40 | 41 | ### Patch Changes 42 | 43 | - 1aaf46b: fix typos and add sveltelab links 44 | 45 | ## 0.4.3 46 | 47 | ### Patch Changes 48 | 49 | - 70f9ad8: fix typing for action and move jsdoc to return value 50 | 51 | ## 0.4.2 52 | 53 | ### Patch Changes 54 | 55 | - bbedbce: update readme.md 56 | 57 | ## 0.4.1 58 | 59 | ### Patch Changes 60 | 61 | - 383b496: remove transition name after the transition is finished 62 | 63 | ## 0.4.0 64 | 65 | ### Minor Changes 66 | 67 | - e172bd1: change avoidWrapping to autoWrap to avoid negative booleans 68 | 69 | ## 0.3.1 70 | 71 | ### Patch Changes 72 | 73 | - 9ed241c: fix: avoid clearing callbacks without autoclean 74 | 75 | ## 0.3.0 76 | 77 | ### Minor Changes 78 | 79 | - ca0f41f: remove positional options for `on` and add autoClean option 80 | 81 | ## 0.2.2 82 | 83 | ### Patch Changes 84 | 85 | - f278dad: return function from `on` takes extra parameter to specify avoid wrapping 86 | 87 | ## 0.2.1 88 | 89 | ### Patch Changes 90 | 91 | - b848d63: fix on function called outside component initialization 92 | 93 | ## 0.2.0 94 | 95 | ### Minor Changes 96 | 97 | - c1b9c7a: automatically wrap methods in afterNavigate 98 | 99 | ## 0.1.0 100 | 101 | ### Minor Changes 102 | 103 | - 958f4dd: feat: Add ability to pass a function for the name of the transition 104 | 105 | ### Patch Changes 106 | 107 | - 74433a2: docs: fix spaces in install instructions 108 | 109 | ## 0.0.6 110 | 111 | ### Patch Changes 112 | 113 | - 5b2c3bf: fix readme to hint at the usage of afterNavigate 114 | 115 | ## 0.0.5 116 | 117 | ### Patch Changes 118 | 119 | - ebc946e: emit types 120 | 121 | ## 0.0.4 122 | 123 | ### Patch Changes 124 | 125 | - a174eb1: precise peerDependencies 126 | 127 | ## 0.0.3 128 | 129 | ### Patch Changes 130 | 131 | - 0147b65: move functions in outside scope and update readme 132 | 133 | ## 0.0.2 134 | 135 | ### Patch Changes 136 | 137 | - fbb3a0a: initial working setup 138 | -------------------------------------------------------------------------------- /src/components/BrowserWindow.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |
7 |
8 |
13 |
14 |
15 | 31 | {url} 32 |
33 |
34 |
35 | 36 |
37 |
38 | 39 | 132 | -------------------------------------------------------------------------------- /examples/list-and-details/src/lib/components/Card.svelte: -------------------------------------------------------------------------------- 1 | 26 | 27 |
28 |
29 |
30 |

38 | {title} 39 |

40 | 48 | {price.toFixed(2)} € 49 | 50 |
51 | 52 |
{category}
53 | 54 | 55 | 56 | 57 |
58 | 59 |
60 | {title} 69 |
70 |
71 | 72 | 135 | -------------------------------------------------------------------------------- /examples/sveltegram/src/lib/Post.svelte: -------------------------------------------------------------------------------- 1 | 30 | 31 |
32 | 33 | {description} 42 | 43 | 50 | 59 | 64 | 65 | {likes} likes 66 | 75 | 80 | 81 | 82 | {comments_num} 83 | {comments_sentence} 84 | 85 | 86 |

93 | @{user.username.toLowerCase()} 94 | {description} 95 |

96 |
97 | 98 | 114 | -------------------------------------------------------------------------------- /examples/sveltegram/src/routes/(base)/stories/[id]/+page@.svelte: -------------------------------------------------------------------------------- 1 | 35 | 36 |
37 | {#each stories as _, i} 38 |
44 | {/each} 45 |
46 | {current_story.user.full_name} story 52 |
53 |
54 | 64 | 69 | 70 | 71 | {current_story.user.full_name} 77 |
78 |
79 | 80 | 148 | -------------------------------------------------------------------------------- /examples/sveltegram/src/lib/fake-data.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Fake Instagram Data 3 | */ 4 | 5 | import { faker } from '@faker-js/faker'; 6 | 7 | // Fake user data 8 | export interface User { 9 | id: number; 10 | username: string; 11 | full_name: string; 12 | profile_picture_url: string; 13 | } 14 | 15 | // Fake photo data 16 | export interface Photo { 17 | id: number; 18 | image_url: string; 19 | description: string; 20 | likes: number; 21 | user: User; 22 | } 23 | 24 | // Fake comment data 25 | export interface Comment { 26 | id: number; 27 | user: User; 28 | text: string; 29 | photo_id: number; 30 | } 31 | 32 | // Fake story data 33 | export interface Story { 34 | id: number; 35 | user: User; 36 | image_url: string; 37 | } 38 | 39 | // Generate fake user data 40 | const generateUsers = (count: number): User[] => { 41 | const users: User[] = []; 42 | for (let i = 1; i <= count; i++) { 43 | const sex = faker.datatype.boolean() ? 'female' : 'male'; 44 | users.push({ 45 | id: i, 46 | username: faker.internet.userName(), 47 | full_name: faker.person.fullName({ 48 | sex 49 | }), 50 | profile_picture_url: `https://randomuser.me/api/portraits/${ 51 | sex === 'female' ? 'women' : 'men' 52 | }/${i}.jpg` 53 | }); 54 | } 55 | return users; 56 | }; 57 | 58 | // Generate fake photos 59 | const generatePhotos = (count: number): Photo[] => { 60 | const photos: Photo[] = []; 61 | for (let i = 1; i <= count; i++) { 62 | const randomUserId = faker.number.int({ min: 1, max: users.length }); 63 | // eslint-disable-next-line @typescript-eslint/no-non-null-assertion 64 | const user = users.find((user) => user.id === randomUserId)!; 65 | photos.push({ 66 | id: i, 67 | image_url: `https://unsplash.it/500/500?image=${i + 30}`, 68 | description: faker.lorem.sentence(), 69 | likes: faker.number.int(1000), 70 | user 71 | }); 72 | } 73 | return photos; 74 | }; 75 | 76 | // Generate fake comments 77 | const generateComments = (count: number, users: User[]): Comment[] => { 78 | const comments: Comment[] = []; 79 | for (let i = 1; i <= count; i++) { 80 | const randomUserId = faker.number.int({ min: 1, max: users.length }); 81 | // eslint-disable-next-line @typescript-eslint/no-non-null-assertion 82 | const user = users.find((user) => user.id === randomUserId)!; 83 | const randomPhotoId = faker.number.int({ min: 1, max: photos.length }); 84 | comments.push({ 85 | id: i, 86 | user, 87 | text: faker.lorem.sentence(), 88 | photo_id: randomPhotoId 89 | }); 90 | } 91 | return comments; 92 | }; 93 | 94 | // Generate fake stories 95 | const generateStories = (count: number, users: User[]) => { 96 | const stories: Story[] = []; 97 | for (let i = 1; i <= count; i++) { 98 | const randomUserId = faker.number.int({ min: 1, max: users.length }); 99 | // eslint-disable-next-line @typescript-eslint/no-non-null-assertion 100 | const user = users.find((user) => user.id === randomUserId)!; 101 | stories.push({ 102 | id: i, 103 | user, 104 | image_url: `https://unsplash.it/400/800?image=${i}` 105 | }); 106 | } 107 | const stories_map: Record> = {}; 108 | for (const story of stories) { 109 | if (!stories_map[story.user.id]) { 110 | stories_map[story.user.id] = []; 111 | } 112 | stories_map[story.user.id].push(story); 113 | } 114 | return stories_map; 115 | }; 116 | 117 | // Generate 10 fake users 118 | const users = generateUsers(20); 119 | 120 | // Generate 50 fake photos 121 | const photos = generatePhotos(50); 122 | 123 | // Generate 100 fake comments 124 | const comments = generateComments(100, users); 125 | 126 | // Generate 20 fake stories 127 | const stories = generateStories(100, users); 128 | 129 | // Export the fake data 130 | export { users, photos, comments, stories }; 131 | -------------------------------------------------------------------------------- /examples/list-and-details/src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 |
10 | Shoppe 11 |
12 | { 14 | const form = e.currentTarget.form; 15 | clearTimeout(timeout); 16 | setTimeout(() => { 17 | form?.requestSubmit(); 18 | }, 200); 19 | }} 20 | value={data.search} 21 | type="search" 22 | name="search" 23 | /> 24 | 40 |
41 |
42 | 43 |
    44 | {#each data.products as product (product.id)} 45 |
  • 70 | 71 | 72 | 73 |
  • 74 | {/each} 75 |
76 | 77 | 151 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | ricciutipaolo@gmail.com. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 |
15 | 19 | {#if !clicked} 20 |
21 |

30 | `sveltekit-view-transition` 31 |

32 | Read the docs 42 | 50 | 55 | 56 | 57 | { 59 | clicking = true; 60 | setTimeout(() => { 61 | clicked = true; 62 | }, 500); 63 | }} 64 | class="mouse bottom-0 right-4" 65 | > 66 | 67 | 68 | 69 |

70 | sveltekit-view-transition 92 |

93 |

94 | Made with 🧡 by paoloricciuti 97 |

98 |
99 | {:else} 100 |
101 |
102 |

111 | `sveltekit-view-transition` 112 |

113 | 133 |
134 |

Getting started

135 |

136 | `sveltekit-view-transition` is the easiest way to unlock the power of the browser 137 | based view transition inside your Svelte-kit application! 138 |

139 |
140 | Read the docs 150 | 158 | 163 | 164 | 165 | 187 |
188 |
189 | {/if} 190 |
191 |
192 | 193 | 210 | -------------------------------------------------------------------------------- /examples/list-and-details/src/lib/products.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "title": "Fjallraven - Foldsack No. 1 Backpack, Fits 15 Laptops", 5 | "price": 109.95, 6 | "description": "Your perfect pack for everyday use and walks in the forest. Stash your laptop (up to 15 inches) in the padded sleeve, your everyday", 7 | "category": "men's clothing", 8 | "image": "https://fakestoreapi.com/img/81fPKd-2AYL._AC_SL1500_.jpg", 9 | "rating": { "rate": 3.9, "count": 120 } 10 | }, 11 | { 12 | "id": 2, 13 | "title": "Mens Casual Premium Slim Fit T-Shirts ", 14 | "price": 22.3, 15 | "description": "Slim-fitting style, contrast raglan long sleeve, three-button henley placket, light weight & soft fabric for breathable and comfortable wearing. And Solid stitched shirts with round neck made for durability and a great fit for casual fashion wear and diehard baseball fans. The Henley style round neckline includes a three-button placket.", 16 | "category": "men's clothing", 17 | "image": "https://fakestoreapi.com/img/71-3HjGNDUL._AC_SY879._SX._UX._SY._UY_.jpg", 18 | "rating": { "rate": 4.1, "count": 259 } 19 | }, 20 | { 21 | "id": 3, 22 | "title": "Mens Cotton Jacket", 23 | "price": 55.99, 24 | "description": "great outerwear jackets for Spring/Autumn/Winter, suitable for many occasions, such as working, hiking, camping, mountain/rock climbing, cycling, traveling or other outdoors. Good gift choice for you or your family member. A warm hearted love to Father, husband or son in this thanksgiving or Christmas Day.", 25 | "category": "men's clothing", 26 | "image": "https://fakestoreapi.com/img/71li-ujtlUL._AC_UX679_.jpg", 27 | "rating": { "rate": 4.7, "count": 500 } 28 | }, 29 | { 30 | "id": 4, 31 | "title": "Mens Casual Slim Fit", 32 | "price": 15.99, 33 | "description": "The color could be slightly different between on the screen and in practice. / Please note that body builds vary by person, therefore, detailed size information should be reviewed below on the product description.", 34 | "category": "men's clothing", 35 | "image": "https://fakestoreapi.com/img/71YXzeOuslL._AC_UY879_.jpg", 36 | "rating": { "rate": 2.1, "count": 430 } 37 | }, 38 | { 39 | "id": 5, 40 | "title": "John Hardy Women's Legends Naga Gold & Silver Dragon Station Chain Bracelet", 41 | "price": 695, 42 | "description": "From our Legends Collection, the Naga was inspired by the mythical water dragon that protects the ocean's pearl. Wear facing inward to be bestowed with love and abundance, or outward for protection.", 43 | "category": "jewelery", 44 | "image": "https://fakestoreapi.com/img/71pWzhdJNwL._AC_UL640_QL65_ML3_.jpg", 45 | "rating": { "rate": 4.6, "count": 400 } 46 | }, 47 | { 48 | "id": 6, 49 | "title": "Solid Gold Petite Micropave ", 50 | "price": 168, 51 | "description": "Satisfaction Guaranteed. Return or exchange any order within 30 days.Designed and sold by Hafeez Center in the United States. Satisfaction Guaranteed. Return or exchange any order within 30 days.", 52 | "category": "jewelery", 53 | "image": "https://fakestoreapi.com/img/61sbMiUnoGL._AC_UL640_QL65_ML3_.jpg", 54 | "rating": { "rate": 3.9, "count": 70 } 55 | }, 56 | { 57 | "id": 7, 58 | "title": "White Gold Plated Princess", 59 | "price": 9.99, 60 | "description": "Classic Created Wedding Engagement Solitaire Diamond Promise Ring for Her. Gifts to spoil your love more for Engagement, Wedding, Anniversary, Valentine's Day...", 61 | "category": "jewelery", 62 | "image": "https://fakestoreapi.com/img/71YAIFU48IL._AC_UL640_QL65_ML3_.jpg", 63 | "rating": { "rate": 3, "count": 400 } 64 | }, 65 | { 66 | "id": 8, 67 | "title": "Pierced Owl Rose Gold Plated Stainless Steel Double", 68 | "price": 10.99, 69 | "description": "Rose Gold Plated Double Flared Tunnel Plug Earrings. Made of 316L Stainless Steel", 70 | "category": "jewelery", 71 | "image": "https://fakestoreapi.com/img/51UDEzMJVpL._AC_UL640_QL65_ML3_.jpg", 72 | "rating": { "rate": 1.9, "count": 100 } 73 | }, 74 | { 75 | "id": 9, 76 | "title": "WD 2TB Elements Portable External Hard Drive - USB 3.0 ", 77 | "price": 64, 78 | "description": "USB 3.0 and USB 2.0 Compatibility Fast data transfers Improve PC Performance High Capacity; Compatibility Formatted NTFS for Windows 10, Windows 8.1, Windows 7; Reformatting may be required for other operating systems; Compatibility may vary depending on user’s hardware configuration and operating system", 79 | "category": "electronics", 80 | "image": "https://fakestoreapi.com/img/61IBBVJvSDL._AC_SY879_.jpg", 81 | "rating": { "rate": 3.3, "count": 203 } 82 | }, 83 | { 84 | "id": 10, 85 | "title": "SanDisk SSD PLUS 1TB Internal SSD - SATA III 6 Gb/s", 86 | "price": 109, 87 | "description": "Easy upgrade for faster boot up, shutdown, application load and response (As compared to 5400 RPM SATA 2.5” hard drive; Based on published specifications and internal benchmarking tests using PCMark vantage scores) Boosts burst write performance, making it ideal for typical PC workloads The perfect balance of performance and reliability Read/write speeds of up to 535MB/s/450MB/s (Based on internal testing; Performance may vary depending upon drive capacity, host device, OS and application.)", 88 | "category": "electronics", 89 | "image": "https://fakestoreapi.com/img/61U7T1koQqL._AC_SX679_.jpg", 90 | "rating": { "rate": 2.9, "count": 470 } 91 | }, 92 | { 93 | "id": 11, 94 | "title": "Silicon Power 256GB SSD 3D NAND A55 SLC Cache Performance Boost SATA III 2.5", 95 | "price": 109, 96 | "description": "3D NAND flash are applied to deliver high transfer speeds Remarkable transfer speeds that enable faster bootup and improved overall system performance. The advanced SLC Cache Technology allows performance boost and longer lifespan 7mm slim design suitable for Ultrabooks and Ultra-slim notebooks. Supports TRIM command, Garbage Collection technology, RAID, and ECC (Error Checking & Correction) to provide the optimized performance and enhanced reliability.", 97 | "category": "electronics", 98 | "image": "https://fakestoreapi.com/img/71kWymZ+c+L._AC_SX679_.jpg", 99 | "rating": { "rate": 4.8, "count": 319 } 100 | }, 101 | { 102 | "id": 12, 103 | "title": "WD 4TB Gaming Drive Works with Playstation 4 Portable External Hard Drive", 104 | "price": 114, 105 | "description": "Expand your PS4 gaming experience, Play anywhere Fast and easy, setup Sleek design with high capacity, 3-year manufacturer's limited warranty", 106 | "category": "electronics", 107 | "image": "https://fakestoreapi.com/img/61mtL65D4cL._AC_SX679_.jpg", 108 | "rating": { "rate": 4.8, "count": 400 } 109 | }, 110 | { 111 | "id": 13, 112 | "title": "Acer SB220Q bi 21.5 inches Full HD (1920 x 1080) IPS Ultra-Thin", 113 | "price": 599, 114 | "description": "21. 5 inches Full HD (1920 x 1080) widescreen IPS display And Radeon free Sync technology. No compatibility for VESA Mount Refresh Rate: 75Hz - Using HDMI port Zero-frame design | ultra-thin | 4ms response time | IPS panel Aspect ratio - 16: 9. Color Supported - 16. 7 million colors. Brightness - 250 nit Tilt angle -5 degree to 15 degree. Horizontal viewing angle-178 degree. Vertical viewing angle-178 degree 75 hertz", 115 | "category": "electronics", 116 | "image": "https://fakestoreapi.com/img/81QpkIctqPL._AC_SX679_.jpg", 117 | "rating": { "rate": 2.9, "count": 250 } 118 | }, 119 | { 120 | "id": 14, 121 | "title": "Samsung 49-Inch CHG90 144Hz Curved Gaming Monitor (LC49HG90DMNXZA) – Super Ultrawide Screen QLED ", 122 | "price": 999.99, 123 | "description": "49 INCH SUPER ULTRAWIDE 32:9 CURVED GAMING MONITOR with dual 27 inch screen side by side QUANTUM DOT (QLED) TECHNOLOGY, HDR support and factory calibration provides stunningly realistic and accurate color and contrast 144HZ HIGH REFRESH RATE and 1ms ultra fast response time work to eliminate motion blur, ghosting, and reduce input lag", 124 | "category": "electronics", 125 | "image": "https://fakestoreapi.com/img/81Zt42ioCgL._AC_SX679_.jpg", 126 | "rating": { "rate": 2.2, "count": 140 } 127 | }, 128 | { 129 | "id": 15, 130 | "title": "BIYLACLESEN Women's 3-in-1 Snowboard Jacket Winter Coats", 131 | "price": 56.99, 132 | "description": "Note:The Jackets is US standard size, Please choose size as your usual wear Material: 100% Polyester; Detachable Liner Fabric: Warm Fleece. Detachable Functional Liner: Skin Friendly, Lightweigt and Warm.Stand Collar Liner jacket, keep you warm in cold weather. Zippered Pockets: 2 Zippered Hand Pockets, 2 Zippered Pockets on Chest (enough to keep cards or keys)and 1 Hidden Pocket Inside.Zippered Hand Pockets and Hidden Pocket keep your things secure. Humanized Design: Adjustable and Detachable Hood and Adjustable cuff to prevent the wind and water,for a comfortable fit. 3 in 1 Detachable Design provide more convenience, you can separate the coat and inner as needed, or wear it together. It is suitable for different season and help you adapt to different climates", 133 | "category": "women's clothing", 134 | "image": "https://fakestoreapi.com/img/51Y5NI-I5jL._AC_UX679_.jpg", 135 | "rating": { "rate": 2.6, "count": 235 } 136 | }, 137 | { 138 | "id": 16, 139 | "title": "Lock and Love Women's Removable Hooded Faux Leather Moto Biker Jacket", 140 | "price": 29.95, 141 | "description": "100% POLYURETHANE(shell) 100% POLYESTER(lining) 75% POLYESTER 25% COTTON (SWEATER), Faux leather material for style and comfort / 2 pockets of front, 2-For-One Hooded denim style faux leather jacket, Button detail on waist / Detail stitching at sides, HAND WASH ONLY / DO NOT BLEACH / LINE DRY / DO NOT IRON", 142 | "category": "women's clothing", 143 | "image": "https://fakestoreapi.com/img/81XH0e8fefL._AC_UY879_.jpg", 144 | "rating": { "rate": 2.9, "count": 340 } 145 | }, 146 | { 147 | "id": 17, 148 | "title": "Rain Jacket Women Windbreaker Striped Climbing Raincoats", 149 | "price": 39.99, 150 | "description": "Lightweight perfet for trip or casual wear---Long sleeve with hooded, adjustable drawstring waist design. Button and zipper front closure raincoat, fully stripes Lined and The Raincoat has 2 side pockets are a good size to hold all kinds of things, it covers the hips, and the hood is generous but doesn't overdo it.Attached Cotton Lined Hood with Adjustable Drawstrings give it a real styled look.", 151 | "category": "women's clothing", 152 | "image": "https://fakestoreapi.com/img/71HblAHs5xL._AC_UY879_-2.jpg", 153 | "rating": { "rate": 3.8, "count": 679 } 154 | }, 155 | { 156 | "id": 18, 157 | "title": "MBJ Women's Solid Short Sleeve Boat Neck V ", 158 | "price": 9.85, 159 | "description": "95% RAYON 5% SPANDEX, Made in USA or Imported, Do Not Bleach, Lightweight fabric with great stretch for comfort, Ribbed on sleeves and neckline / Double stitching on bottom hem", 160 | "category": "women's clothing", 161 | "image": "https://fakestoreapi.com/img/71z3kpMAYsL._AC_UY879_.jpg", 162 | "rating": { "rate": 4.7, "count": 130 } 163 | }, 164 | { 165 | "id": 19, 166 | "title": "Opna Women's Short Sleeve Moisture", 167 | "price": 7.95, 168 | "description": "100% Polyester, Machine wash, 100% cationic polyester interlock, Machine Wash & Pre Shrunk for a Great Fit, Lightweight, roomy and highly breathable with moisture wicking fabric which helps to keep moisture away, Soft Lightweight Fabric with comfortable V-neck collar and a slimmer fit, delivers a sleek, more feminine silhouette and Added Comfort", 169 | "category": "women's clothing", 170 | "image": "https://fakestoreapi.com/img/51eg55uWmdL._AC_UX679_.jpg", 171 | "rating": { "rate": 4.5, "count": 146 } 172 | }, 173 | { 174 | "id": 20, 175 | "title": "DANVOUY Womens T Shirt Casual Cotton Short", 176 | "price": 12.99, 177 | "description": "95%Cotton,5%Spandex, Features: Casual, Short Sleeve, Letter Print,V-Neck,Fashion Tees, The fabric is soft and has some stretch., Occasion: Casual/Office/Beach/School/Home/Street. Season: Spring,Summer,Autumn,Winter.", 178 | "category": "women's clothing", 179 | "image": "https://fakestoreapi.com/img/61pHAEJ4NML._AC_UX679_.jpg", 180 | "rating": { "rate": 3.6, "count": 145 } 181 | } 182 | ] 183 | -------------------------------------------------------------------------------- /src/lib/sveltekit-view-transition.ts: -------------------------------------------------------------------------------- 1 | import { afterNavigate, onNavigate } from '$app/navigation'; 2 | import type { OnNavigate } from '@sveltejs/kit'; 3 | import { SetOfCallback } from './utils'; 4 | import { onDestroy } from 'svelte'; 5 | import { browser } from '$app/environment'; 6 | 7 | export type TransitionActionFunctionProps = 8 | SveltekitViewTransitionEventsMap[TEvent] & { 9 | node: HTMLElement | SVGElement; 10 | isInViewport: boolean; 11 | }; 12 | 13 | export type TransitionAction = { 14 | name: string | ((props: TransitionActionFunctionProps<'before-start-view-transition'>) => string); 15 | classes?: 16 | | string[] 17 | | (( 18 | props: TransitionActionFunctionProps<'before-start-view-transition'>, 19 | ) => string[] | undefined); 20 | shouldApply?: 21 | | boolean 22 | | ((props: TransitionActionFunctionProps<'before-start-view-transition'>) => boolean); 23 | applyImmediately?: 24 | | boolean 25 | | ((props: TransitionActionFunctionProps<'after-navigation-complete'>) => boolean); 26 | }; 27 | 28 | export type TransitionActionFunctions = { 29 | // eslint-disable-next-line @typescript-eslint/ban-types 30 | [Key in keyof TransitionAction]-?: Extract; 31 | }; 32 | 33 | export type OnOptions = { 34 | registerDuringTransition?: boolean; 35 | autoWrap?: boolean; 36 | autoClean?: boolean; 37 | }; 38 | 39 | interface ViewTransition { 40 | updateCallbackDone: Promise; 41 | ready: Promise; 42 | finished: Promise; 43 | skipTransition: () => void; 44 | } 45 | 46 | export type SveltekitViewTransitionEventsMap = { 47 | 'before-start-view-transition': { 48 | navigation: OnNavigate; 49 | }; 50 | 'before-navigation': { 51 | navigation: OnNavigate; 52 | }; 53 | 'before-navigation-complete': { 54 | navigation: OnNavigate; 55 | }; 56 | 'after-navigation-complete': { 57 | navigation: OnNavigate; 58 | }; 59 | 'transition-ready': { 60 | navigation: OnNavigate; 61 | transition: ViewTransition; 62 | }; 63 | 'update-callback-done': { 64 | navigation: OnNavigate; 65 | transition: ViewTransition; 66 | }; 67 | 'transition-finished': { 68 | navigation: OnNavigate; 69 | transition: ViewTransition; 70 | }; 71 | }; 72 | 73 | export type SveltekitViewTransitionEvents = keyof SveltekitViewTransitionEventsMap; 74 | 75 | type ListenerMap = { 76 | [Key in SveltekitViewTransitionEvents]?: Set<{ 77 | listener: (props: SveltekitViewTransitionEventsMap[Key]) => void; 78 | auto_clean: boolean; 79 | }>; 80 | }; 81 | 82 | const callbacks: ListenerMap = {}; 83 | 84 | let on_navigate_registered = 0; 85 | 86 | let is_transition_happening = false; 87 | 88 | const listeners_during_transition_queue = new Set<() => void>(); 89 | 90 | function run_all_events( 91 | event: T, 92 | props: SveltekitViewTransitionEventsMap[T], 93 | ) { 94 | const events = callbacks[event]; 95 | if (events) { 96 | events.forEach((callback) => { 97 | try { 98 | callback.listener(props); 99 | } catch (e) { 100 | console.error(`Error in callback for event "${event}": ${e}`); 101 | } 102 | if (callback.auto_clean) { 103 | events.delete(callback); 104 | } 105 | }); 106 | } 107 | } 108 | 109 | function off( 110 | event: T, 111 | callback: (props: SveltekitViewTransitionEventsMap[T]) => void | Promise, 112 | autoWrap = true, 113 | ) { 114 | function off_function() { 115 | let events = callbacks[event]; 116 | if (!events) { 117 | callbacks[event] = new SetOfCallback() as ListenerMap[T]; 118 | events = callbacks[event]; 119 | } 120 | // loop over the listeners to search for the one with the right callback 121 | for (const event of events?.values() ?? []) { 122 | if (event.listener === callback) { 123 | // when found it delete the event and break from the loop 124 | events?.delete(event); 125 | break; 126 | } 127 | } 128 | } 129 | // if we need to avoid wrapping we just call the function 130 | if (!autoWrap) { 131 | off_function(); 132 | } else { 133 | // this can fail if caled inside another afterNavigate so we fallback to just call the off function 134 | try { 135 | afterNavigate(() => { 136 | off_function(); 137 | }); 138 | } catch (e) { 139 | console.warn( 140 | 'I tried to wrap the function within afterNavigate and failed...are you calling this inside afterNavigate?', 141 | ); 142 | off_function(); 143 | } 144 | } 145 | } 146 | 147 | function on( 148 | event: T, 149 | callback: (props: SveltekitViewTransitionEventsMap[T]) => void, 150 | { registerDuringTransition = false, autoWrap = true, autoClean = true }: OnOptions = {}, 151 | ) { 152 | const return_value = (wrap = autoWrap) => off(event, callback, wrap); 153 | function on_function() { 154 | function register_listener() { 155 | let events = callbacks[event]; 156 | if (!events) { 157 | callbacks[event] = new SetOfCallback< 158 | SveltekitViewTransitionEventsMap[T] 159 | >() as ListenerMap[T]; 160 | events = callbacks[event]; 161 | } 162 | events?.add({ listener: callback, auto_clean: autoClean }); 163 | } 164 | // if there's a transition happening we store a function to add the listener 165 | // in the queue and return the un-subscriber 166 | if (is_transition_happening && !registerDuringTransition) { 167 | listeners_during_transition_queue.add(() => { 168 | register_listener(); 169 | }); 170 | return return_value; 171 | } 172 | register_listener(); 173 | } 174 | if (!autoWrap) { 175 | on_function(); 176 | return return_value; 177 | } 178 | try { 179 | afterNavigate(() => { 180 | on_function(); 181 | }); 182 | } catch (e) { 183 | console.warn( 184 | 'I tried to wrap the function within afterNavigate and failed...are you calling this inside afterNavigate?', 185 | ); 186 | on_function(); 187 | } 188 | return return_value; 189 | } 190 | 191 | function classes( 192 | to_add: 193 | | string[] 194 | | (( 195 | props: SveltekitViewTransitionEventsMap['before-start-view-transition'], 196 | ) => string[] | undefined), 197 | autoWrap = true, 198 | ) { 199 | let classes: string[] | undefined; 200 | const off_finished = on( 201 | 'transition-finished', 202 | () => { 203 | if (classes && classes.length > 0) { 204 | document.documentElement.classList.remove(...classes); 205 | } 206 | }, 207 | { 208 | registerDuringTransition: false, 209 | autoWrap, 210 | }, 211 | ); 212 | on( 213 | 'before-start-view-transition', 214 | (navigation) => { 215 | classes = Array.isArray(to_add) ? to_add : to_add(navigation); 216 | if (classes) { 217 | document.documentElement.classList.add(...classes); 218 | } else { 219 | off_finished(true); 220 | } 221 | }, 222 | { 223 | registerDuringTransition: false, 224 | autoWrap, 225 | }, 226 | ); 227 | } 228 | 229 | function transition(node: HTMLElement | SVGElement, props: string | TransitionAction) { 230 | if (typeof props === 'string') { 231 | node.style.setProperty('view-transition-name', props); 232 | return; 233 | } 234 | function setup_listeners_for_props(props: TransitionAction) { 235 | let classes_to_add: string[] | undefined; 236 | const off_functions: ReturnType[] = []; 237 | off_functions.push( 238 | on( 239 | 'after-navigation-complete', 240 | (callback_props) => { 241 | const { top } = node.getBoundingClientRect(); 242 | const is_in_viewport = top < window.innerHeight + window.scrollY; 243 | const props_for_callback = { ...callback_props, node, isInViewport: is_in_viewport }; 244 | let apply_immediately = false; 245 | if (props.applyImmediately != null) { 246 | apply_immediately = 247 | typeof props.applyImmediately === 'boolean' 248 | ? props.applyImmediately 249 | : props.applyImmediately(props_for_callback); 250 | } 251 | if (apply_immediately) { 252 | const name = 253 | typeof props.name === 'function' ? props.name(props_for_callback) : props.name; 254 | node.style.setProperty('view-transition-name', name); 255 | off_functions.push( 256 | on( 257 | 'transition-finished', 258 | () => { 259 | node.style.setProperty('view-transition-name', null); 260 | }, 261 | { registerDuringTransition: true, autoWrap: false, autoClean: false }, 262 | ), 263 | ); 264 | } 265 | }, 266 | { registerDuringTransition: true, autoWrap: false, autoClean: false }, 267 | ), 268 | ); 269 | const off_before = on( 270 | 'before-start-view-transition', 271 | (callback_props) => { 272 | let should_apply = true; 273 | const { top } = node.getBoundingClientRect(); 274 | const is_in_viewport = top < window.innerHeight + window.scrollY; 275 | const props_for_callback = { ...callback_props, node, isInViewport: is_in_viewport }; 276 | if (props.shouldApply != null) { 277 | should_apply = 278 | typeof props.shouldApply === 'boolean' 279 | ? props.shouldApply 280 | : props.shouldApply(props_for_callback); 281 | } 282 | if (should_apply) { 283 | const name = 284 | typeof props.name === 'function' ? props.name(props_for_callback) : props.name; 285 | node.style.setProperty('view-transition-name', name); 286 | off_functions.push( 287 | on( 288 | 'transition-finished', 289 | () => { 290 | node.style.setProperty('view-transition-name', null); 291 | }, 292 | { 293 | autoWrap: false, 294 | registerDuringTransition: true, 295 | autoClean: false, 296 | }, 297 | ), 298 | ); 299 | if (props.classes) { 300 | classes_to_add = Array.isArray(props.classes) 301 | ? props.classes 302 | : props.classes(props_for_callback); 303 | } 304 | if (classes_to_add) { 305 | document.documentElement.classList.add(...classes_to_add); 306 | } else { 307 | off_finished?.(); 308 | } 309 | } 310 | }, 311 | { registerDuringTransition: false, autoWrap: false, autoClean: false }, 312 | ); 313 | off_functions.push(off_before); 314 | let off_finished: ReturnType | undefined = undefined; 315 | off_finished = on( 316 | 'transition-finished', 317 | () => { 318 | if (classes_to_add && classes_to_add.length > 0) { 319 | document.documentElement.classList.remove(...classes_to_add); 320 | } 321 | }, 322 | { registerDuringTransition: false, autoWrap: false, autoClean: false }, 323 | ); 324 | off_functions.push(off_finished); 325 | return () => { 326 | off_functions.forEach((off) => { 327 | off(false); 328 | }); 329 | }; 330 | } 331 | let cleanup: ReturnType | undefined = 332 | setup_listeners_for_props(props); 333 | return { 334 | update(new_props: string | TransitionAction) { 335 | // on update remove the previous listeners 336 | cleanup?.(); 337 | cleanup = undefined; 338 | // if it's a string just set the view transition name 339 | if (typeof new_props === 'string') { 340 | node.style.setProperty('view-transition-name', new_props); 341 | return; 342 | } 343 | // otherwise run the setup listeners function and store the new cleanup 344 | cleanup = setup_listeners_for_props(new_props); 345 | }, 346 | destroy() { 347 | // clean everything 348 | cleanup?.(); 349 | }, 350 | }; 351 | } 352 | 353 | export function setupViewTransition() { 354 | // only register once the onNavigate 355 | if (on_navigate_registered === 0 && browser && document.startViewTransition) { 356 | on_navigate_registered++; 357 | onNavigate((navigation) => { 358 | // this should never happen but better be safe than sorry 359 | if (!document.startViewTransition) return; 360 | return new Promise((resolve) => { 361 | run_all_events('before-start-view-transition', { navigation }); 362 | const transition = document.startViewTransition(async () => { 363 | is_transition_happening = true; 364 | run_all_events('before-navigation', { navigation }); 365 | resolve(); 366 | run_all_events('before-navigation-complete', { navigation }); 367 | // reset back the on_navigate_registered to register on the new route 368 | await navigation.complete; 369 | run_all_events('after-navigation-complete', { navigation }); 370 | }); 371 | transition.ready 372 | .then(() => { 373 | run_all_events('transition-ready', { navigation, transition }); 374 | }) 375 | .catch(console.error); 376 | transition.updateCallbackDone 377 | .then(() => { 378 | run_all_events('update-callback-done', { navigation, transition }); 379 | }) 380 | .catch(console.error); 381 | transition.finished 382 | .then(() => { 383 | run_all_events('transition-finished', { navigation, transition }); 384 | is_transition_happening = false; 385 | listeners_during_transition_queue.forEach((add_listener) => { 386 | add_listener(); 387 | }); 388 | listeners_during_transition_queue.clear(); 389 | }) 390 | .catch(console.error); 391 | }); 392 | }); 393 | 394 | onDestroy(() => { 395 | on_navigate_registered--; 396 | }); 397 | } 398 | 399 | return { 400 | /** 401 | * Function used to register a callback run during the onNavigate 402 | * @param event the event name you want to register a callback for 403 | * @param callback The callback you want to run 404 | * @param options The options for the add listener 405 | * @param options.registerDuringTransition if you want to register this callback even if a transition is running (if false 406 | * it will still be registered as soon as the transition finishes) 407 | * @param options.avoidWrapping by default the on function is wrapped in afterNavigate so that you can 408 | * avoid unnecessarily wrap it every time. If you need to avoid this behavior you can pass true. 409 | * @param options.autoClean wether the listener clean automatically after has been applied or it requires manual cleaning. 410 | * it defaults to true 411 | * @returns A function to deregister the callback 412 | */ 413 | on, 414 | /** 415 | * This function is used to deregister from an event. A function that 416 | * deregister from an event is also returned from the on function. 417 | * @param event the event name you want to deregister from 418 | * @param callback the callback reference you want to deregister 419 | * @param autoWrap by default the off function is wrapped in afterNavigate so that you can 420 | * avoid unnecessarily wrap it every time. If you need to avoid this behavior you can pass false. 421 | */ 422 | off, 423 | /** 424 | * The action to specify a transition name on a specific element. You can use it on an element 425 | * passing a string to directly assign that specific string as view transition name. 426 | * 427 | * If you pass an object instead you can specify a series of options: 428 | * 429 | * - name: required, it's the transition name that will be applied it can be either a string or a function that return a string. The function takes a navigation 430 | * object as input. This is useful if you need to apply different transition names depending on where the navigation is going. 431 | * - classes: either an array of strings or a function that returns an array of string that will be applied 432 | * during the transition. The function will take a navigation object 433 | * - applyImmediately: by default when you specify a transition name it will only be applied when it's actually navigating 434 | * following the suggestion from Jake Archibald himself (the creator of the view transition api) https://twitter.com/jaffathecake/status/1697541871847748098?s=20 435 | * that you should not add transition names to everything but only to the elements involved in the transition. Sometimes tho you want to 436 | * add a transition name immediately (for example when you are coming back from a detail page and you want to animate back an image in the list). 437 | * applyImmediately is either a boolean or a function that take the navigation object (please note that this is the navigation object) from 438 | * the previous page so the `from` will be the page that is navigating to this page and the `to` will be this page) and returns a boolean. 439 | * - shouldApply: as mentioned above this can be either a boolean or a function that takes a navigation object (this time the `from` is 440 | * this page and the `to` is the page you are navigating to) and return a boolean. If the boolean is true the transition name will be applied. 441 | * This is useful when you want to navigate from a list to a detail. 442 | * 443 | * @param node The element to apply the action to 444 | * @param props either a string for a simple view transition name or a set of options 445 | */ 446 | transition, 447 | /** 448 | * Function to call during component initialization to add a class or a series of classes 449 | * during the navigation. This is useful to run a different types of transition when you are going 450 | * back to a specific page. 451 | * 452 | * The classes will be automatically removed at the end of the transition. 453 | * 454 | * @param to_add either a list of class that will always be applied or a function that returns an array 455 | * of strings. The function will get a navigation props as input to allow you to check the to, from, route id etc. 456 | * @param autoWrap by default the classes function is wrapped in afterNavigate so that you can 457 | * avoid unnecessarily wrap it every time. If you need to avoid this behavior you can pass false. 458 | */ 459 | classes, 460 | }; 461 | } 462 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # sveltekit-view-transition 2 | 3 | Simplified `view-transition-api` for Sveltekit. 4 | 5 | [![MIT License](https://img.shields.io/badge/License-MIT-green.svg)](https://choosealicense.com/licenses/mit/) 6 | ![GitHub last commit](https://img.shields.io/github/last-commit/paoloricciuti/sveltekit-view-transition) 7 | ![npm](https://img.shields.io/npm/v/sveltekit-view-transition) 8 | ![npm](https://img.shields.io/npm/dt/sveltekit-view-transition) 9 | 10 | ## Before we begin: what is a view transition? 11 | 12 | Svelte has kinda spoiled us: we have built in animations and transitions so that we can add a little bit of micro-interactions to our websites and apps. Do you need to animate a list reordering? `flip` comes to the rescue. Is a div moving and morphing from one list to another? `crossfade` is your friend. The web platform must have seen how much svelte developers love those kind of things and has provided us with a brand new, fully progressive enhance-able api: **[the view transition API](https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API)**. This api not only allows you to animate between two states of your application regardless of the fact that two elements are actually the same or not (something that before was only possible with third party libraries or very complex code) but allows you to animate elements that are **on different pages**! 13 | 14 | SvelteKit provides a way to hook into the navigation to allow the developer to start a view transition before the navigation and they do so with a very low level primitive. Here's how you can enable view transitions in SvelteKit 15 | 16 | ```ts 17 | onNavigate((navigation) => { 18 | if (!document.startViewTransition) return; 19 | return new Promise((resolve) => { 20 | document.startViewTransition(async () => { 21 | resolve(); 22 | await navigation.complete; 23 | }); 24 | }); 25 | }); 26 | ``` 27 | 28 | While not very complex, writing this snippets everywhere you need it can get quite tedious and sometimes based on how the `view-transition-api` works you might need to do other things like add classes or change the style of an element. 29 | 30 | `sveltekit-view-transition` aim to ease the experience of writing easy and complex transitions in SvelteKit! 31 | 32 | Before going in the details of how this library works and how to make use of it i want to leave here a [wonderful article](https://developer.chrome.com/docs/web-platform/view-transitions/) that explains what they are and how to use them in Vanilla JS from Jake Archibald, the main mind behind them. 33 | 34 | > **Warning** 35 | > While view transitions are cool please don't overuse them as having too much motion can worsten your users experience rather than enhance it. Also **PLEASE** respect your users preference for reduced motion with `@media (prefers-reduced-motion)` 36 | 37 | ## Installation 38 | 39 | ```bash 40 | npm i -D sveltekit-view-transition@latest # or pnpm/yarn 41 | ``` 42 | 43 | ## Usage 44 | 45 | ### The simplest setup: 46 | 47 | _src/routes/+layout.svelte_ 48 | 49 | ```svelte 50 | 55 | 56 | 57 | ``` 58 | 59 | This will automatically enable the default transition to every navigation. 60 | 61 | ### Modifying the defaults: 62 | 63 | Optionally, the default animation can be modified via `::view-transition-old(root)` and `::view-transition-new(root)` like so: 64 | 65 | _src/routes/+layout.svelte_ 66 | 67 | ```svelte 68 | 73 | 74 | 75 | 76 | 88 | ``` 89 | 90 | ## `transition` 91 | 92 | It's often useful to give specific parts of the page their own unique view transitions. We can do this by setting an element's `view-transition-name`. 93 | 94 | One way to do this is with `transition`, a svelte [action](https://svelte.dev/tutorial/actions) returned by `setupViewTransition`. 95 | 96 | `transition` accepts a string representing the `view-transition-name` that should be assigned to the element using it: 97 | 98 | ```svelte 99 | 104 | 105 |
106 | 107 |
108 | 109 | 110 | 111 | 117 | ``` 118 | 119 | As you can see, the header's view transition can now be modified via `::view-transition-old(header)` and `::view-transition-new(header)`. 120 | 121 | ## Additional Options 122 | 123 | If you want to be a bit more creative with the transitions, you can pass an `object` to the `transition` action instead of a `string`. This object accepts the following options: 124 | 125 | - `name`: the view-transition-name _(required)_ 126 | - `classes`: classnames to apply to the target element during the transition. An array of strings or a function that returns one. 127 | - `applyImmediately`: Whether the transition should be applied immediately, or only during the actual navigation. A boolean or a function that returns one. 128 | - `shouldApply`: Whether the transition should be applied or not. Can be a boolean or a function that returns one. 129 | 130 | Let's take a look at each of these options in more detail: 131 | 132 | ### `name` 133 | 134 | The `view-transition-name` -- the only required parameter. It can be a `string` _or_ a `function` that takes a navigation object and returns a string, and will be applied to the target element during the transition. This is equivalent to setting the style property `view-transition-name` on an element. 135 | 136 | Apart from the `navigation` object this function also receive the `HTMLElement` of the action (it's the property `node` inside the prop object) and a boolean that express if this element is actually in the viewport at the time of the transition (it's the property `isInViewport` inside the prop object). This allow you to easily skip a transition if the element is not in the viewport to avoid having elements that fly off the viewport (inspired by this [tweet by Ryan Florence](https://x.com/ryanflorence/status/1706686168837054754)) 137 | 138 | ### `classes` 139 | 140 | Either an array of strings, or a function that returns an array of strings. These classes will be applied as classnames to the root element during the transition. 141 | 142 | To demonstrate this, let's assume we want to apply a unique transition to our header anytime our "back" button is clicked. 143 | 144 | This can be achieved by returning an array, i.e. `["back"]`, to our `classes` callback. 145 | 146 | Apart from the `navigation` object this function also receive the `HTMLElement` of the action (it's the property `node` inside the prop object) and a boolean that express if this element is actually in the viewport at the time of the transition (it's the property `isInViewport` inside the prop object). This allow you to easily skip a transition if the element is not in the viewport to avoid having elements that fly off the viewport (inspired by this [tweet by Ryan Florence](https://x.com/ryanflorence/status/1706686168837054754)) 147 | 148 | ```svelte 149 | 154 | 155 |
165 | Back 166 |
167 | 168 | 169 | ``` 170 | 171 | Now, we can target `.back::view-transition-old(back)` and `.back::view-transition-new(back)` in our CSS and those transitions will only be applied when navigating to the home page `/`. 172 | 173 | In the example above, you can see we're destructuring `navigation` from the provided `OnNavigate` object _(the same object that sveltekit will pass to the `onNavigate` function)_. This object contains a lot of useful information, including the page you are navigating to, allowing us to apply classes conditionally based on the navigation. 174 | 175 |
176 | Click here to see the full Navigation interface. 177 | 178 | ```ts 179 | interface Navigation { 180 | /** 181 | * Where navigation was triggered from 182 | */ 183 | from: { 184 | /** 185 | * Parameters of the target page - e.g. for a route like `/blog/[slug]`, a `{ slug: string }` object. 186 | * Is `null` if the target is not part of the SvelteKit app (could not be resolved to a route). 187 | */ 188 | params: Record | null; 189 | /** 190 | * Info about the target route 191 | */ 192 | route: { id: string | null }; 193 | /** 194 | * The URL that is navigated to 195 | */ 196 | url: URL; 197 | } | null; 198 | /** 199 | * Where navigation is going to/has gone to 200 | */ 201 | to: { 202 | /** 203 | * Parameters of the target page - e.g. for a route like `/blog/[slug]`, a `{ slug: string }` object. 204 | * Is `null` if the target is not part of the SvelteKit app (could not be resolved to a route). 205 | */ 206 | params: Record | null; 207 | /** 208 | * Info about the target route 209 | */ 210 | route: { id: string | null }; 211 | /** 212 | * The URL that is navigated to 213 | */ 214 | url: URL; 215 | } | null; 216 | /** 217 | * The type of navigation: 218 | * - `form`: The user submitted a `
` 219 | * - `leave`: The user is leaving the app by closing the tab or using the back/forward buttons to go to a different document 220 | * - `link`: Navigation was triggered by a link click 221 | * - `goto`: Navigation was triggered by a `goto(...)` call or a redirect 222 | * - `popstate`: Navigation was triggered by back/forward navigation 223 | */ 224 | type: 'form' | 'leave' | 'link' | 'goto' | 'popstate'; 225 | /** 226 | * Whether or not the navigation will result in the page being unloaded (i.e. not a client-side navigation) 227 | */ 228 | willUnload: false; 229 | /** 230 | * In case of a history back/forward navigation, the number of steps to go back/forward 231 | */ 232 | delta?: number; 233 | /** 234 | * A promise that resolves once the navigation is complete, and rejects if the navigation 235 | * fails or is aborted. In the case of a `willUnload` navigation, the promise will never resolve 236 | */ 237 | complete: Promise; 238 | } 239 | ``` 240 | 241 |
242 | 243 | ### `applyImmediately` 244 | 245 | By default, the transition name you provide will only be applied during the actual navigation, following [the suggestion](https://twitter.com/jaffathecake/status/1697541871847748098) from Jake Archibald himself (the creator of the view transition api), which states that you shouldn't add transition names to everything -- instead, only to the elements involved in the transition. However, sometimes you want to add a transition name immediately _(for example, when you're navigating back from a "detail" page and you want to animate back an image in the list)_. 246 | 247 | `applyImmediately` is either a `boolean` or a `function` that take the `navigation` object _(please note that this is the navigation object from the previous page, so the `from` will be the page that is navigating to the current page, and the `to` will be the current page)_ and returns a boolean. 248 | 249 | Apart from the `navigation` object this function also receive the `HTMLElement` of the action (it's the property `node` inside the prop object) and a boolean that express if this element is actually in the viewport at the time of the transition (it's the property `isInViewport` inside the prop object). This allow you to easily skip a transition if the element is not in the viewport to avoid having elements that fly off the viewport (inspired by this [tweet by Ryan Florence](https://x.com/ryanflorence/status/1706686168837054754)) 250 | 251 | Here's a simple example of this in action: 252 | 253 | ```svelte 254 | 261 | 262 |
    263 | {#each data.posts as post (post.id)} 264 |
  • 281 | {post.title} 282 |
  • 283 | {/each} 284 |
285 | ``` 286 | 287 | In this example, when we navigate back from the `/post/1` page, the title will slide into the its position in the list. 288 | 289 | > Important Note: **the transition name will be added before the transition ends and removed immediately after to allow for a forward transition from another post to happen. If not removed the transition name would be duplicated.** 290 | 291 | ### `shouldApply` 292 | 293 | As mentioned above, this can be either a `boolean` or a `function` that takes a `navigation` object _(this time the `from` is this page and the `to` is the page you are navigating to)_ and returns a `boolean`. If the return value is `true` the transition name will be applied, otherwise it will not. This is useful when, for example, you want to navigate from a list to a detail. 294 | 295 | NB: the default is true so if you don't pass `shouldApply` the transition name will be applied every time. 296 | 297 | Apart from the `navigation` object this function also receive the `HTMLElement` of the action (it's the property `node` inside the prop object) and a boolean that express if this element is actually in the viewport at the time of the transition (it's the property `isInViewport` inside the prop object). This allow you to easily skip a transition if the element is not in the viewport to avoid having elements that fly off the viewport (inspired by this [tweet by Ryan Florence](https://x.com/ryanflorence/status/1706686168837054754)) 298 | 299 | So, completing the example above: 300 | 301 | ```svelte 302 | 309 | 310 |
    311 | {#each data.posts as post (post.id)} 312 |
  • 330 | {post.title} 331 |
  • 332 | {/each} 333 |
334 | ``` 335 | 336 | ## More advanced usage 337 | 338 | ### `on` 339 | 340 | This function is returned from `setupViewTransition`, and allows you to add a listener to run code during an arbitrary moment of the "lifecycle" of the view transition. It takes three arguments; the name of the event, the main callback function, and a series of options. 341 | 342 | | option name | type | meaning | 343 | | ------------------------ | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 344 | | registerDuringTransition | `boolean` | Wether the callback should be added immediately _(even if there's a transition running)_ or not. This is because there are events that runs after the component has mounted, and if you add the listeners on mount specifying true as the third argument, this listeners will be called immediately. This might be useful if, for example, you want to modify the state after an incoming transition. | 345 | | autoWrap | `boolean` | By default the function will be internally wrapped in `afterNavigate` (to reassign the listeners even if the navigation is towards the same page) but you can pass `autoWrap` as `false` to avoid wrapping the add listener in `afterNavigate`. | 346 | | autoClean | `boolean` | wether the listener clean automatically after has been applied or it requires manual cleaning. It defaults to true | 347 | 348 | There are 7 types of events you can subscribe to in order of calling: 349 | 350 | | Event Name | Description | 351 | | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- | 352 | | `before-start-view-transition` | event called before the transition even start if you modify the DOM here it will be included in the "screenshot" of the `view-transition` | 353 | | `before-navigation` | Event called before SvelteKit start to handle the navigation the view transition has
already been started | 354 | | `before-navigation-complete` | Event called after SvelteKit started to handle the navigation but before it completes.
_The `view-transition` is still happening_ | 355 | | `after-navigation-complete` | Event called after the navigation from SvelteKit has completed.
The `view-transition` is still happening | 356 | | `transition-ready` | Event called when the `view-transition` is ready, the pseudo-elements are created. | 357 | | `update-callback-done` | Event called when the callback of the `view-transition` has finished running. | 358 | | `transition-finished` | Event called when the `view-transition` finish and the new view is in place | 359 | 360 | The `on` function also returns a function that unregister the callback when called. 361 | 362 | ### `off` 363 | 364 | A function to unsubscribe a specific handle from a specific event. This will rarely be necessary given that the `on` function already returns unsubscribe. 365 | 366 | By default the function will be internally wrapped in `afterNavigate` (to reassign the listeners even if the navigation is towards the same page) but you can pass a third parameter as `false` to avoid wrapping the remove listener in `afterNavigate`. 367 | 368 | ### `classes` 369 | 370 | Much like the `classes` function on the action, this function can be called immediately in the script tag of a component to add a specific class to the `:root` element during a navigation. It can either be a array of strings or a function that returns an array of strings. The callback provides a `navigation` object (just like the one from the action). 371 | 372 | By default the function will be internally wrapped in `afterNavigate` (to reassign the listeners even if the navigation is towards the same page) but you can pass a second parameter as `false` to avoid wrapping the add listener in `afterNavigate`. 373 | 374 | ```svelte 375 | 386 | ``` 387 | 388 | ## Examples 389 | 390 | You can find some example of usage in the [examples](https://github.com/paoloricciuti/sveltekit-view-transition/tree/main/examples/) folder. 391 | 392 | | Example | SvelteLab link | Live demo | Features | 393 | | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | ----------------------------------------------------------------------- | 394 | | [list-and-details](https://github.com/paoloricciuti/sveltekit-view-transition/tree/main/examples/list-and-details) | [link](https://sveltelab.dev/github.com/paoloricciuti/sveltekit-view-transition/tree/main/examples/list-and-details) | [link](https://svt-list-and-details.vercel.app) | entry/exit animation, dynamic name, page transition from list to detail | 395 | | [sveltegram](https://github.com/paoloricciuti/sveltekit-view-transition/tree/main/examples/sveltegram) | [link](https://sveltelab.dev/github.com/paoloricciuti/sveltekit-view-transition/tree/main/examples/sveltegram) | [link](https://svt-sveltegram.vercel.app) | multiple element transitions, conditional apply based on route | 396 | 397 | ## Contributing 398 | 399 | Contributions are always welcome! 400 | 401 | For the moment there's no code of conduct or contributing guideline, but if you've found a problem or have an idea, feel free to [open an issue](https://github.com/paoloricciuti/sveltekit-view-transition/issues/new) 402 | 403 | For the fastest way to open a PR, try out Codeflow: 404 | 405 | [![Open in Codeflow](https://developer.stackblitz.com/img/open_in_codeflow.svg)](https://pr.new/paoloricciuti/sveltekit-view-transition/) 406 | 407 | ## Authors 408 | 409 | - [@paoloricciuti](https://www.github.com/paoloricciuti) 410 | -------------------------------------------------------------------------------- /examples/list-and-details/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | devDependencies: 8 | '@sveltejs/adapter-auto': 9 | specifier: ^2.0.0 10 | version: 2.1.0(@sveltejs/kit@1.24.1) 11 | '@sveltejs/kit': 12 | specifier: ^1.20.4 13 | version: 1.24.1(svelte@4.2.0)(vite@4.4.9) 14 | '@typescript-eslint/eslint-plugin': 15 | specifier: ^5.45.0 16 | version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.49.0)(typescript@5.2.2) 17 | '@typescript-eslint/parser': 18 | specifier: ^5.45.0 19 | version: 5.62.0(eslint@8.49.0)(typescript@5.2.2) 20 | eslint: 21 | specifier: ^8.28.0 22 | version: 8.49.0 23 | eslint-config-prettier: 24 | specifier: ^8.5.0 25 | version: 8.10.0(eslint@8.49.0) 26 | eslint-plugin-svelte: 27 | specifier: ^2.30.0 28 | version: 2.33.1(eslint@8.49.0)(svelte@4.2.0) 29 | prettier: 30 | specifier: ^3.0.3 31 | version: 3.0.3 32 | prettier-plugin-svelte: 33 | specifier: ^3.0.3 34 | version: 3.0.3(prettier@3.0.3)(svelte@4.2.0) 35 | svelte: 36 | specifier: ^4.0.5 37 | version: 4.2.0 38 | svelte-check: 39 | specifier: ^3.4.3 40 | version: 3.5.1(postcss@8.4.29)(svelte@4.2.0) 41 | sveltekit-view-transition: 42 | specifier: ^0.5.2 43 | version: 0.5.2(@sveltejs/kit@1.24.1)(svelte@4.2.0) 44 | tslib: 45 | specifier: ^2.4.1 46 | version: 2.6.2 47 | typescript: 48 | specifier: ^5.0.0 49 | version: 5.2.2 50 | vite: 51 | specifier: ^4.4.2 52 | version: 4.4.9 53 | 54 | packages: 55 | 56 | /@aashutoshrathi/word-wrap@1.2.6: 57 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 58 | engines: {node: '>=0.10.0'} 59 | dev: true 60 | 61 | /@ampproject/remapping@2.2.1: 62 | resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} 63 | engines: {node: '>=6.0.0'} 64 | dependencies: 65 | '@jridgewell/gen-mapping': 0.3.3 66 | '@jridgewell/trace-mapping': 0.3.19 67 | dev: true 68 | 69 | /@esbuild/android-arm64@0.18.20: 70 | resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} 71 | engines: {node: '>=12'} 72 | cpu: [arm64] 73 | os: [android] 74 | requiresBuild: true 75 | dev: true 76 | optional: true 77 | 78 | /@esbuild/android-arm@0.18.20: 79 | resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} 80 | engines: {node: '>=12'} 81 | cpu: [arm] 82 | os: [android] 83 | requiresBuild: true 84 | dev: true 85 | optional: true 86 | 87 | /@esbuild/android-x64@0.18.20: 88 | resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} 89 | engines: {node: '>=12'} 90 | cpu: [x64] 91 | os: [android] 92 | requiresBuild: true 93 | dev: true 94 | optional: true 95 | 96 | /@esbuild/darwin-arm64@0.18.20: 97 | resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} 98 | engines: {node: '>=12'} 99 | cpu: [arm64] 100 | os: [darwin] 101 | requiresBuild: true 102 | dev: true 103 | optional: true 104 | 105 | /@esbuild/darwin-x64@0.18.20: 106 | resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} 107 | engines: {node: '>=12'} 108 | cpu: [x64] 109 | os: [darwin] 110 | requiresBuild: true 111 | dev: true 112 | optional: true 113 | 114 | /@esbuild/freebsd-arm64@0.18.20: 115 | resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} 116 | engines: {node: '>=12'} 117 | cpu: [arm64] 118 | os: [freebsd] 119 | requiresBuild: true 120 | dev: true 121 | optional: true 122 | 123 | /@esbuild/freebsd-x64@0.18.20: 124 | resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} 125 | engines: {node: '>=12'} 126 | cpu: [x64] 127 | os: [freebsd] 128 | requiresBuild: true 129 | dev: true 130 | optional: true 131 | 132 | /@esbuild/linux-arm64@0.18.20: 133 | resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} 134 | engines: {node: '>=12'} 135 | cpu: [arm64] 136 | os: [linux] 137 | requiresBuild: true 138 | dev: true 139 | optional: true 140 | 141 | /@esbuild/linux-arm@0.18.20: 142 | resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} 143 | engines: {node: '>=12'} 144 | cpu: [arm] 145 | os: [linux] 146 | requiresBuild: true 147 | dev: true 148 | optional: true 149 | 150 | /@esbuild/linux-ia32@0.18.20: 151 | resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} 152 | engines: {node: '>=12'} 153 | cpu: [ia32] 154 | os: [linux] 155 | requiresBuild: true 156 | dev: true 157 | optional: true 158 | 159 | /@esbuild/linux-loong64@0.18.20: 160 | resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} 161 | engines: {node: '>=12'} 162 | cpu: [loong64] 163 | os: [linux] 164 | requiresBuild: true 165 | dev: true 166 | optional: true 167 | 168 | /@esbuild/linux-mips64el@0.18.20: 169 | resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} 170 | engines: {node: '>=12'} 171 | cpu: [mips64el] 172 | os: [linux] 173 | requiresBuild: true 174 | dev: true 175 | optional: true 176 | 177 | /@esbuild/linux-ppc64@0.18.20: 178 | resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} 179 | engines: {node: '>=12'} 180 | cpu: [ppc64] 181 | os: [linux] 182 | requiresBuild: true 183 | dev: true 184 | optional: true 185 | 186 | /@esbuild/linux-riscv64@0.18.20: 187 | resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} 188 | engines: {node: '>=12'} 189 | cpu: [riscv64] 190 | os: [linux] 191 | requiresBuild: true 192 | dev: true 193 | optional: true 194 | 195 | /@esbuild/linux-s390x@0.18.20: 196 | resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} 197 | engines: {node: '>=12'} 198 | cpu: [s390x] 199 | os: [linux] 200 | requiresBuild: true 201 | dev: true 202 | optional: true 203 | 204 | /@esbuild/linux-x64@0.18.20: 205 | resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} 206 | engines: {node: '>=12'} 207 | cpu: [x64] 208 | os: [linux] 209 | requiresBuild: true 210 | dev: true 211 | optional: true 212 | 213 | /@esbuild/netbsd-x64@0.18.20: 214 | resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} 215 | engines: {node: '>=12'} 216 | cpu: [x64] 217 | os: [netbsd] 218 | requiresBuild: true 219 | dev: true 220 | optional: true 221 | 222 | /@esbuild/openbsd-x64@0.18.20: 223 | resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} 224 | engines: {node: '>=12'} 225 | cpu: [x64] 226 | os: [openbsd] 227 | requiresBuild: true 228 | dev: true 229 | optional: true 230 | 231 | /@esbuild/sunos-x64@0.18.20: 232 | resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 233 | engines: {node: '>=12'} 234 | cpu: [x64] 235 | os: [sunos] 236 | requiresBuild: true 237 | dev: true 238 | optional: true 239 | 240 | /@esbuild/win32-arm64@0.18.20: 241 | resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} 242 | engines: {node: '>=12'} 243 | cpu: [arm64] 244 | os: [win32] 245 | requiresBuild: true 246 | dev: true 247 | optional: true 248 | 249 | /@esbuild/win32-ia32@0.18.20: 250 | resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} 251 | engines: {node: '>=12'} 252 | cpu: [ia32] 253 | os: [win32] 254 | requiresBuild: true 255 | dev: true 256 | optional: true 257 | 258 | /@esbuild/win32-x64@0.18.20: 259 | resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} 260 | engines: {node: '>=12'} 261 | cpu: [x64] 262 | os: [win32] 263 | requiresBuild: true 264 | dev: true 265 | optional: true 266 | 267 | /@eslint-community/eslint-utils@4.4.0(eslint@8.49.0): 268 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 269 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 270 | peerDependencies: 271 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 272 | dependencies: 273 | eslint: 8.49.0 274 | eslint-visitor-keys: 3.4.3 275 | dev: true 276 | 277 | /@eslint-community/regexpp@4.8.0: 278 | resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} 279 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 280 | dev: true 281 | 282 | /@eslint/eslintrc@2.1.2: 283 | resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} 284 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 285 | dependencies: 286 | ajv: 6.12.6 287 | debug: 4.3.4 288 | espree: 9.6.1 289 | globals: 13.21.0 290 | ignore: 5.2.4 291 | import-fresh: 3.3.0 292 | js-yaml: 4.1.0 293 | minimatch: 3.1.2 294 | strip-json-comments: 3.1.1 295 | transitivePeerDependencies: 296 | - supports-color 297 | dev: true 298 | 299 | /@eslint/js@8.49.0: 300 | resolution: {integrity: sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==} 301 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 302 | dev: true 303 | 304 | /@humanwhocodes/config-array@0.11.11: 305 | resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} 306 | engines: {node: '>=10.10.0'} 307 | dependencies: 308 | '@humanwhocodes/object-schema': 1.2.1 309 | debug: 4.3.4 310 | minimatch: 3.1.2 311 | transitivePeerDependencies: 312 | - supports-color 313 | dev: true 314 | 315 | /@humanwhocodes/module-importer@1.0.1: 316 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 317 | engines: {node: '>=12.22'} 318 | dev: true 319 | 320 | /@humanwhocodes/object-schema@1.2.1: 321 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 322 | dev: true 323 | 324 | /@jridgewell/gen-mapping@0.3.3: 325 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 326 | engines: {node: '>=6.0.0'} 327 | dependencies: 328 | '@jridgewell/set-array': 1.1.2 329 | '@jridgewell/sourcemap-codec': 1.4.15 330 | '@jridgewell/trace-mapping': 0.3.19 331 | dev: true 332 | 333 | /@jridgewell/resolve-uri@3.1.1: 334 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 335 | engines: {node: '>=6.0.0'} 336 | dev: true 337 | 338 | /@jridgewell/set-array@1.1.2: 339 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 340 | engines: {node: '>=6.0.0'} 341 | dev: true 342 | 343 | /@jridgewell/sourcemap-codec@1.4.15: 344 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 345 | dev: true 346 | 347 | /@jridgewell/trace-mapping@0.3.19: 348 | resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} 349 | dependencies: 350 | '@jridgewell/resolve-uri': 3.1.1 351 | '@jridgewell/sourcemap-codec': 1.4.15 352 | dev: true 353 | 354 | /@nodelib/fs.scandir@2.1.5: 355 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 356 | engines: {node: '>= 8'} 357 | dependencies: 358 | '@nodelib/fs.stat': 2.0.5 359 | run-parallel: 1.2.0 360 | dev: true 361 | 362 | /@nodelib/fs.stat@2.0.5: 363 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 364 | engines: {node: '>= 8'} 365 | dev: true 366 | 367 | /@nodelib/fs.walk@1.2.8: 368 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 369 | engines: {node: '>= 8'} 370 | dependencies: 371 | '@nodelib/fs.scandir': 2.1.5 372 | fastq: 1.15.0 373 | dev: true 374 | 375 | /@polka/url@1.0.0-next.23: 376 | resolution: {integrity: sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==} 377 | dev: true 378 | 379 | /@sveltejs/adapter-auto@2.1.0(@sveltejs/kit@1.24.1): 380 | resolution: {integrity: sha512-o2pZCfATFtA/Gw/BB0Xm7k4EYaekXxaPGER3xGSY3FvzFJGTlJlZjBseaXwYSM94lZ0HniOjTokN3cWaLX6fow==} 381 | peerDependencies: 382 | '@sveltejs/kit': ^1.0.0 383 | dependencies: 384 | '@sveltejs/kit': 1.24.1(svelte@4.2.0)(vite@4.4.9) 385 | import-meta-resolve: 3.0.0 386 | dev: true 387 | 388 | /@sveltejs/kit@1.24.1(svelte@4.2.0)(vite@4.4.9): 389 | resolution: {integrity: sha512-u2FO0q62Se9UZ0g9kXaWYi+54vTK70BKaPScOcx6jLMRou4CUZgDTNKnRhsbJgPMgaLkOH0j3o/fKlZ6jBfgSg==} 390 | engines: {node: ^16.14 || >=18} 391 | hasBin: true 392 | requiresBuild: true 393 | peerDependencies: 394 | svelte: ^3.54.0 || ^4.0.0-next.0 395 | vite: ^4.0.0 396 | dependencies: 397 | '@sveltejs/vite-plugin-svelte': 2.4.5(svelte@4.2.0)(vite@4.4.9) 398 | '@types/cookie': 0.5.2 399 | cookie: 0.5.0 400 | devalue: 4.3.2 401 | esm-env: 1.0.0 402 | kleur: 4.1.5 403 | magic-string: 0.30.3 404 | mime: 3.0.0 405 | sade: 1.8.1 406 | set-cookie-parser: 2.6.0 407 | sirv: 2.0.3 408 | svelte: 4.2.0 409 | tiny-glob: 0.2.9 410 | undici: 5.23.0 411 | vite: 4.4.9 412 | transitivePeerDependencies: 413 | - supports-color 414 | dev: true 415 | 416 | /@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.4.5)(svelte@4.2.0)(vite@4.4.9): 417 | resolution: {integrity: sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==} 418 | engines: {node: ^14.18.0 || >= 16} 419 | peerDependencies: 420 | '@sveltejs/vite-plugin-svelte': ^2.2.0 421 | svelte: ^3.54.0 || ^4.0.0 422 | vite: ^4.0.0 423 | dependencies: 424 | '@sveltejs/vite-plugin-svelte': 2.4.5(svelte@4.2.0)(vite@4.4.9) 425 | debug: 4.3.4 426 | svelte: 4.2.0 427 | vite: 4.4.9 428 | transitivePeerDependencies: 429 | - supports-color 430 | dev: true 431 | 432 | /@sveltejs/vite-plugin-svelte@2.4.5(svelte@4.2.0)(vite@4.4.9): 433 | resolution: {integrity: sha512-UJKsFNwhzCVuiZd06jM/psscyNJNDwjQC+qIeb7GBJK9iWeQCcIyfcPWDvbCudfcJggY9jtxJeeaZH7uny93FQ==} 434 | engines: {node: ^14.18.0 || >= 16} 435 | peerDependencies: 436 | svelte: ^3.54.0 || ^4.0.0 437 | vite: ^4.0.0 438 | dependencies: 439 | '@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.4.5)(svelte@4.2.0)(vite@4.4.9) 440 | debug: 4.3.4 441 | deepmerge: 4.3.1 442 | kleur: 4.1.5 443 | magic-string: 0.30.3 444 | svelte: 4.2.0 445 | svelte-hmr: 0.15.3(svelte@4.2.0) 446 | vite: 4.4.9 447 | vitefu: 0.2.4(vite@4.4.9) 448 | transitivePeerDependencies: 449 | - supports-color 450 | dev: true 451 | 452 | /@types/cookie@0.5.2: 453 | resolution: {integrity: sha512-DBpRoJGKJZn7RY92dPrgoMew8xCWc2P71beqsjyhEI/Ds9mOyVmBwtekyfhpwFIVt1WrxTonFifiOZ62V8CnNA==} 454 | dev: true 455 | 456 | /@types/estree@1.0.1: 457 | resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} 458 | dev: true 459 | 460 | /@types/json-schema@7.0.12: 461 | resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} 462 | dev: true 463 | 464 | /@types/pug@2.0.6: 465 | resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} 466 | dev: true 467 | 468 | /@types/semver@7.5.1: 469 | resolution: {integrity: sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==} 470 | dev: true 471 | 472 | /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.49.0)(typescript@5.2.2): 473 | resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} 474 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 475 | peerDependencies: 476 | '@typescript-eslint/parser': ^5.0.0 477 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 478 | typescript: '*' 479 | peerDependenciesMeta: 480 | typescript: 481 | optional: true 482 | dependencies: 483 | '@eslint-community/regexpp': 4.8.0 484 | '@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@5.2.2) 485 | '@typescript-eslint/scope-manager': 5.62.0 486 | '@typescript-eslint/type-utils': 5.62.0(eslint@8.49.0)(typescript@5.2.2) 487 | '@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@5.2.2) 488 | debug: 4.3.4 489 | eslint: 8.49.0 490 | graphemer: 1.4.0 491 | ignore: 5.2.4 492 | natural-compare-lite: 1.4.0 493 | semver: 7.5.4 494 | tsutils: 3.21.0(typescript@5.2.2) 495 | typescript: 5.2.2 496 | transitivePeerDependencies: 497 | - supports-color 498 | dev: true 499 | 500 | /@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.2.2): 501 | resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} 502 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 503 | peerDependencies: 504 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 505 | typescript: '*' 506 | peerDependenciesMeta: 507 | typescript: 508 | optional: true 509 | dependencies: 510 | '@typescript-eslint/scope-manager': 5.62.0 511 | '@typescript-eslint/types': 5.62.0 512 | '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) 513 | debug: 4.3.4 514 | eslint: 8.49.0 515 | typescript: 5.2.2 516 | transitivePeerDependencies: 517 | - supports-color 518 | dev: true 519 | 520 | /@typescript-eslint/scope-manager@5.62.0: 521 | resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} 522 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 523 | dependencies: 524 | '@typescript-eslint/types': 5.62.0 525 | '@typescript-eslint/visitor-keys': 5.62.0 526 | dev: true 527 | 528 | /@typescript-eslint/type-utils@5.62.0(eslint@8.49.0)(typescript@5.2.2): 529 | resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} 530 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 531 | peerDependencies: 532 | eslint: '*' 533 | typescript: '*' 534 | peerDependenciesMeta: 535 | typescript: 536 | optional: true 537 | dependencies: 538 | '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) 539 | '@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@5.2.2) 540 | debug: 4.3.4 541 | eslint: 8.49.0 542 | tsutils: 3.21.0(typescript@5.2.2) 543 | typescript: 5.2.2 544 | transitivePeerDependencies: 545 | - supports-color 546 | dev: true 547 | 548 | /@typescript-eslint/types@5.62.0: 549 | resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} 550 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 551 | dev: true 552 | 553 | /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2): 554 | resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} 555 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 556 | peerDependencies: 557 | typescript: '*' 558 | peerDependenciesMeta: 559 | typescript: 560 | optional: true 561 | dependencies: 562 | '@typescript-eslint/types': 5.62.0 563 | '@typescript-eslint/visitor-keys': 5.62.0 564 | debug: 4.3.4 565 | globby: 11.1.0 566 | is-glob: 4.0.3 567 | semver: 7.5.4 568 | tsutils: 3.21.0(typescript@5.2.2) 569 | typescript: 5.2.2 570 | transitivePeerDependencies: 571 | - supports-color 572 | dev: true 573 | 574 | /@typescript-eslint/utils@5.62.0(eslint@8.49.0)(typescript@5.2.2): 575 | resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} 576 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 577 | peerDependencies: 578 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 579 | dependencies: 580 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) 581 | '@types/json-schema': 7.0.12 582 | '@types/semver': 7.5.1 583 | '@typescript-eslint/scope-manager': 5.62.0 584 | '@typescript-eslint/types': 5.62.0 585 | '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) 586 | eslint: 8.49.0 587 | eslint-scope: 5.1.1 588 | semver: 7.5.4 589 | transitivePeerDependencies: 590 | - supports-color 591 | - typescript 592 | dev: true 593 | 594 | /@typescript-eslint/visitor-keys@5.62.0: 595 | resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} 596 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 597 | dependencies: 598 | '@typescript-eslint/types': 5.62.0 599 | eslint-visitor-keys: 3.4.3 600 | dev: true 601 | 602 | /acorn-jsx@5.3.2(acorn@8.10.0): 603 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 604 | peerDependencies: 605 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 606 | dependencies: 607 | acorn: 8.10.0 608 | dev: true 609 | 610 | /acorn@8.10.0: 611 | resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} 612 | engines: {node: '>=0.4.0'} 613 | hasBin: true 614 | dev: true 615 | 616 | /ajv@6.12.6: 617 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 618 | dependencies: 619 | fast-deep-equal: 3.1.3 620 | fast-json-stable-stringify: 2.1.0 621 | json-schema-traverse: 0.4.1 622 | uri-js: 4.4.1 623 | dev: true 624 | 625 | /ansi-regex@5.0.1: 626 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 627 | engines: {node: '>=8'} 628 | dev: true 629 | 630 | /ansi-styles@4.3.0: 631 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 632 | engines: {node: '>=8'} 633 | dependencies: 634 | color-convert: 2.0.1 635 | dev: true 636 | 637 | /anymatch@3.1.3: 638 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 639 | engines: {node: '>= 8'} 640 | dependencies: 641 | normalize-path: 3.0.0 642 | picomatch: 2.3.1 643 | dev: true 644 | 645 | /argparse@2.0.1: 646 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 647 | dev: true 648 | 649 | /aria-query@5.3.0: 650 | resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} 651 | dependencies: 652 | dequal: 2.0.3 653 | dev: true 654 | 655 | /array-union@2.1.0: 656 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 657 | engines: {node: '>=8'} 658 | dev: true 659 | 660 | /axobject-query@3.2.1: 661 | resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} 662 | dependencies: 663 | dequal: 2.0.3 664 | dev: true 665 | 666 | /balanced-match@1.0.2: 667 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 668 | dev: true 669 | 670 | /binary-extensions@2.2.0: 671 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 672 | engines: {node: '>=8'} 673 | dev: true 674 | 675 | /brace-expansion@1.1.11: 676 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 677 | dependencies: 678 | balanced-match: 1.0.2 679 | concat-map: 0.0.1 680 | dev: true 681 | 682 | /braces@3.0.2: 683 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 684 | engines: {node: '>=8'} 685 | dependencies: 686 | fill-range: 7.0.1 687 | dev: true 688 | 689 | /buffer-crc32@0.2.13: 690 | resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} 691 | dev: true 692 | 693 | /busboy@1.6.0: 694 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 695 | engines: {node: '>=10.16.0'} 696 | dependencies: 697 | streamsearch: 1.1.0 698 | dev: true 699 | 700 | /callsites@3.1.0: 701 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 702 | engines: {node: '>=6'} 703 | dev: true 704 | 705 | /chalk@4.1.2: 706 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 707 | engines: {node: '>=10'} 708 | dependencies: 709 | ansi-styles: 4.3.0 710 | supports-color: 7.2.0 711 | dev: true 712 | 713 | /chokidar@3.5.3: 714 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 715 | engines: {node: '>= 8.10.0'} 716 | dependencies: 717 | anymatch: 3.1.3 718 | braces: 3.0.2 719 | glob-parent: 5.1.2 720 | is-binary-path: 2.1.0 721 | is-glob: 4.0.3 722 | normalize-path: 3.0.0 723 | readdirp: 3.6.0 724 | optionalDependencies: 725 | fsevents: 2.3.3 726 | dev: true 727 | 728 | /code-red@1.0.4: 729 | resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} 730 | dependencies: 731 | '@jridgewell/sourcemap-codec': 1.4.15 732 | '@types/estree': 1.0.1 733 | acorn: 8.10.0 734 | estree-walker: 3.0.3 735 | periscopic: 3.1.0 736 | dev: true 737 | 738 | /color-convert@2.0.1: 739 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 740 | engines: {node: '>=7.0.0'} 741 | dependencies: 742 | color-name: 1.1.4 743 | dev: true 744 | 745 | /color-name@1.1.4: 746 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 747 | dev: true 748 | 749 | /concat-map@0.0.1: 750 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 751 | dev: true 752 | 753 | /cookie@0.5.0: 754 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 755 | engines: {node: '>= 0.6'} 756 | dev: true 757 | 758 | /cross-spawn@7.0.3: 759 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 760 | engines: {node: '>= 8'} 761 | dependencies: 762 | path-key: 3.1.1 763 | shebang-command: 2.0.0 764 | which: 2.0.2 765 | dev: true 766 | 767 | /css-tree@2.3.1: 768 | resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} 769 | engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 770 | dependencies: 771 | mdn-data: 2.0.30 772 | source-map-js: 1.0.2 773 | dev: true 774 | 775 | /cssesc@3.0.0: 776 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 777 | engines: {node: '>=4'} 778 | hasBin: true 779 | dev: true 780 | 781 | /debug@4.3.4: 782 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 783 | engines: {node: '>=6.0'} 784 | peerDependencies: 785 | supports-color: '*' 786 | peerDependenciesMeta: 787 | supports-color: 788 | optional: true 789 | dependencies: 790 | ms: 2.1.2 791 | dev: true 792 | 793 | /deep-is@0.1.4: 794 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 795 | dev: true 796 | 797 | /deepmerge@4.3.1: 798 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 799 | engines: {node: '>=0.10.0'} 800 | dev: true 801 | 802 | /dequal@2.0.3: 803 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 804 | engines: {node: '>=6'} 805 | dev: true 806 | 807 | /detect-indent@6.1.0: 808 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 809 | engines: {node: '>=8'} 810 | dev: true 811 | 812 | /devalue@4.3.2: 813 | resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} 814 | dev: true 815 | 816 | /dir-glob@3.0.1: 817 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 818 | engines: {node: '>=8'} 819 | dependencies: 820 | path-type: 4.0.0 821 | dev: true 822 | 823 | /doctrine@3.0.0: 824 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 825 | engines: {node: '>=6.0.0'} 826 | dependencies: 827 | esutils: 2.0.3 828 | dev: true 829 | 830 | /es6-promise@3.3.1: 831 | resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} 832 | dev: true 833 | 834 | /esbuild@0.18.20: 835 | resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} 836 | engines: {node: '>=12'} 837 | hasBin: true 838 | requiresBuild: true 839 | optionalDependencies: 840 | '@esbuild/android-arm': 0.18.20 841 | '@esbuild/android-arm64': 0.18.20 842 | '@esbuild/android-x64': 0.18.20 843 | '@esbuild/darwin-arm64': 0.18.20 844 | '@esbuild/darwin-x64': 0.18.20 845 | '@esbuild/freebsd-arm64': 0.18.20 846 | '@esbuild/freebsd-x64': 0.18.20 847 | '@esbuild/linux-arm': 0.18.20 848 | '@esbuild/linux-arm64': 0.18.20 849 | '@esbuild/linux-ia32': 0.18.20 850 | '@esbuild/linux-loong64': 0.18.20 851 | '@esbuild/linux-mips64el': 0.18.20 852 | '@esbuild/linux-ppc64': 0.18.20 853 | '@esbuild/linux-riscv64': 0.18.20 854 | '@esbuild/linux-s390x': 0.18.20 855 | '@esbuild/linux-x64': 0.18.20 856 | '@esbuild/netbsd-x64': 0.18.20 857 | '@esbuild/openbsd-x64': 0.18.20 858 | '@esbuild/sunos-x64': 0.18.20 859 | '@esbuild/win32-arm64': 0.18.20 860 | '@esbuild/win32-ia32': 0.18.20 861 | '@esbuild/win32-x64': 0.18.20 862 | dev: true 863 | 864 | /escape-string-regexp@4.0.0: 865 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 866 | engines: {node: '>=10'} 867 | dev: true 868 | 869 | /eslint-config-prettier@8.10.0(eslint@8.49.0): 870 | resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} 871 | hasBin: true 872 | peerDependencies: 873 | eslint: '>=7.0.0' 874 | dependencies: 875 | eslint: 8.49.0 876 | dev: true 877 | 878 | /eslint-plugin-svelte@2.33.1(eslint@8.49.0)(svelte@4.2.0): 879 | resolution: {integrity: sha512-veYmyjsbt8ikXdaa6pLsgytdlzJpZZKw9vRaQlRBNKaLNmrbsdJulwiWfcDZ7tYJdaVpRB4iDFn/fuPeebxUVg==} 880 | engines: {node: ^14.17.0 || >=16.0.0} 881 | peerDependencies: 882 | eslint: ^7.0.0 || ^8.0.0-0 883 | svelte: ^3.37.0 || ^4.0.0 884 | peerDependenciesMeta: 885 | svelte: 886 | optional: true 887 | dependencies: 888 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) 889 | '@jridgewell/sourcemap-codec': 1.4.15 890 | debug: 4.3.4 891 | eslint: 8.49.0 892 | esutils: 2.0.3 893 | known-css-properties: 0.28.0 894 | postcss: 8.4.29 895 | postcss-load-config: 3.1.4(postcss@8.4.29) 896 | postcss-safe-parser: 6.0.0(postcss@8.4.29) 897 | postcss-selector-parser: 6.0.13 898 | semver: 7.5.4 899 | svelte: 4.2.0 900 | svelte-eslint-parser: 0.33.0(svelte@4.2.0) 901 | transitivePeerDependencies: 902 | - supports-color 903 | - ts-node 904 | dev: true 905 | 906 | /eslint-scope@5.1.1: 907 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 908 | engines: {node: '>=8.0.0'} 909 | dependencies: 910 | esrecurse: 4.3.0 911 | estraverse: 4.3.0 912 | dev: true 913 | 914 | /eslint-scope@7.2.2: 915 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 916 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 917 | dependencies: 918 | esrecurse: 4.3.0 919 | estraverse: 5.3.0 920 | dev: true 921 | 922 | /eslint-visitor-keys@3.4.3: 923 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 924 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 925 | dev: true 926 | 927 | /eslint@8.49.0: 928 | resolution: {integrity: sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==} 929 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 930 | hasBin: true 931 | dependencies: 932 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) 933 | '@eslint-community/regexpp': 4.8.0 934 | '@eslint/eslintrc': 2.1.2 935 | '@eslint/js': 8.49.0 936 | '@humanwhocodes/config-array': 0.11.11 937 | '@humanwhocodes/module-importer': 1.0.1 938 | '@nodelib/fs.walk': 1.2.8 939 | ajv: 6.12.6 940 | chalk: 4.1.2 941 | cross-spawn: 7.0.3 942 | debug: 4.3.4 943 | doctrine: 3.0.0 944 | escape-string-regexp: 4.0.0 945 | eslint-scope: 7.2.2 946 | eslint-visitor-keys: 3.4.3 947 | espree: 9.6.1 948 | esquery: 1.5.0 949 | esutils: 2.0.3 950 | fast-deep-equal: 3.1.3 951 | file-entry-cache: 6.0.1 952 | find-up: 5.0.0 953 | glob-parent: 6.0.2 954 | globals: 13.21.0 955 | graphemer: 1.4.0 956 | ignore: 5.2.4 957 | imurmurhash: 0.1.4 958 | is-glob: 4.0.3 959 | is-path-inside: 3.0.3 960 | js-yaml: 4.1.0 961 | json-stable-stringify-without-jsonify: 1.0.1 962 | levn: 0.4.1 963 | lodash.merge: 4.6.2 964 | minimatch: 3.1.2 965 | natural-compare: 1.4.0 966 | optionator: 0.9.3 967 | strip-ansi: 6.0.1 968 | text-table: 0.2.0 969 | transitivePeerDependencies: 970 | - supports-color 971 | dev: true 972 | 973 | /esm-env@1.0.0: 974 | resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} 975 | dev: true 976 | 977 | /espree@9.6.1: 978 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 979 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 980 | dependencies: 981 | acorn: 8.10.0 982 | acorn-jsx: 5.3.2(acorn@8.10.0) 983 | eslint-visitor-keys: 3.4.3 984 | dev: true 985 | 986 | /esquery@1.5.0: 987 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 988 | engines: {node: '>=0.10'} 989 | dependencies: 990 | estraverse: 5.3.0 991 | dev: true 992 | 993 | /esrecurse@4.3.0: 994 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 995 | engines: {node: '>=4.0'} 996 | dependencies: 997 | estraverse: 5.3.0 998 | dev: true 999 | 1000 | /estraverse@4.3.0: 1001 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 1002 | engines: {node: '>=4.0'} 1003 | dev: true 1004 | 1005 | /estraverse@5.3.0: 1006 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1007 | engines: {node: '>=4.0'} 1008 | dev: true 1009 | 1010 | /estree-walker@3.0.3: 1011 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1012 | dependencies: 1013 | '@types/estree': 1.0.1 1014 | dev: true 1015 | 1016 | /esutils@2.0.3: 1017 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1018 | engines: {node: '>=0.10.0'} 1019 | dev: true 1020 | 1021 | /fast-deep-equal@3.1.3: 1022 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1023 | dev: true 1024 | 1025 | /fast-glob@3.3.1: 1026 | resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} 1027 | engines: {node: '>=8.6.0'} 1028 | dependencies: 1029 | '@nodelib/fs.stat': 2.0.5 1030 | '@nodelib/fs.walk': 1.2.8 1031 | glob-parent: 5.1.2 1032 | merge2: 1.4.1 1033 | micromatch: 4.0.5 1034 | dev: true 1035 | 1036 | /fast-json-stable-stringify@2.1.0: 1037 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1038 | dev: true 1039 | 1040 | /fast-levenshtein@2.0.6: 1041 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1042 | dev: true 1043 | 1044 | /fastq@1.15.0: 1045 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 1046 | dependencies: 1047 | reusify: 1.0.4 1048 | dev: true 1049 | 1050 | /file-entry-cache@6.0.1: 1051 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1052 | engines: {node: ^10.12.0 || >=12.0.0} 1053 | dependencies: 1054 | flat-cache: 3.1.0 1055 | dev: true 1056 | 1057 | /fill-range@7.0.1: 1058 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1059 | engines: {node: '>=8'} 1060 | dependencies: 1061 | to-regex-range: 5.0.1 1062 | dev: true 1063 | 1064 | /find-up@5.0.0: 1065 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1066 | engines: {node: '>=10'} 1067 | dependencies: 1068 | locate-path: 6.0.0 1069 | path-exists: 4.0.0 1070 | dev: true 1071 | 1072 | /flat-cache@3.1.0: 1073 | resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} 1074 | engines: {node: '>=12.0.0'} 1075 | dependencies: 1076 | flatted: 3.2.7 1077 | keyv: 4.5.3 1078 | rimraf: 3.0.2 1079 | dev: true 1080 | 1081 | /flatted@3.2.7: 1082 | resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} 1083 | dev: true 1084 | 1085 | /fs.realpath@1.0.0: 1086 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1087 | dev: true 1088 | 1089 | /fsevents@2.3.3: 1090 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1091 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1092 | os: [darwin] 1093 | requiresBuild: true 1094 | dev: true 1095 | optional: true 1096 | 1097 | /glob-parent@5.1.2: 1098 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1099 | engines: {node: '>= 6'} 1100 | dependencies: 1101 | is-glob: 4.0.3 1102 | dev: true 1103 | 1104 | /glob-parent@6.0.2: 1105 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1106 | engines: {node: '>=10.13.0'} 1107 | dependencies: 1108 | is-glob: 4.0.3 1109 | dev: true 1110 | 1111 | /glob@7.2.3: 1112 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1113 | dependencies: 1114 | fs.realpath: 1.0.0 1115 | inflight: 1.0.6 1116 | inherits: 2.0.4 1117 | minimatch: 3.1.2 1118 | once: 1.4.0 1119 | path-is-absolute: 1.0.1 1120 | dev: true 1121 | 1122 | /globals@13.21.0: 1123 | resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} 1124 | engines: {node: '>=8'} 1125 | dependencies: 1126 | type-fest: 0.20.2 1127 | dev: true 1128 | 1129 | /globalyzer@0.1.0: 1130 | resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} 1131 | dev: true 1132 | 1133 | /globby@11.1.0: 1134 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1135 | engines: {node: '>=10'} 1136 | dependencies: 1137 | array-union: 2.1.0 1138 | dir-glob: 3.0.1 1139 | fast-glob: 3.3.1 1140 | ignore: 5.2.4 1141 | merge2: 1.4.1 1142 | slash: 3.0.0 1143 | dev: true 1144 | 1145 | /globrex@0.1.2: 1146 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 1147 | dev: true 1148 | 1149 | /graceful-fs@4.2.11: 1150 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1151 | dev: true 1152 | 1153 | /graphemer@1.4.0: 1154 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1155 | dev: true 1156 | 1157 | /has-flag@4.0.0: 1158 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1159 | engines: {node: '>=8'} 1160 | dev: true 1161 | 1162 | /ignore@5.2.4: 1163 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 1164 | engines: {node: '>= 4'} 1165 | dev: true 1166 | 1167 | /import-fresh@3.3.0: 1168 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1169 | engines: {node: '>=6'} 1170 | dependencies: 1171 | parent-module: 1.0.1 1172 | resolve-from: 4.0.0 1173 | dev: true 1174 | 1175 | /import-meta-resolve@3.0.0: 1176 | resolution: {integrity: sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==} 1177 | dev: true 1178 | 1179 | /imurmurhash@0.1.4: 1180 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1181 | engines: {node: '>=0.8.19'} 1182 | dev: true 1183 | 1184 | /inflight@1.0.6: 1185 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1186 | dependencies: 1187 | once: 1.4.0 1188 | wrappy: 1.0.2 1189 | dev: true 1190 | 1191 | /inherits@2.0.4: 1192 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1193 | dev: true 1194 | 1195 | /is-binary-path@2.1.0: 1196 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1197 | engines: {node: '>=8'} 1198 | dependencies: 1199 | binary-extensions: 2.2.0 1200 | dev: true 1201 | 1202 | /is-extglob@2.1.1: 1203 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1204 | engines: {node: '>=0.10.0'} 1205 | dev: true 1206 | 1207 | /is-glob@4.0.3: 1208 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1209 | engines: {node: '>=0.10.0'} 1210 | dependencies: 1211 | is-extglob: 2.1.1 1212 | dev: true 1213 | 1214 | /is-number@7.0.0: 1215 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1216 | engines: {node: '>=0.12.0'} 1217 | dev: true 1218 | 1219 | /is-path-inside@3.0.3: 1220 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1221 | engines: {node: '>=8'} 1222 | dev: true 1223 | 1224 | /is-reference@3.0.1: 1225 | resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} 1226 | dependencies: 1227 | '@types/estree': 1.0.1 1228 | dev: true 1229 | 1230 | /isexe@2.0.0: 1231 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1232 | dev: true 1233 | 1234 | /js-yaml@4.1.0: 1235 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1236 | hasBin: true 1237 | dependencies: 1238 | argparse: 2.0.1 1239 | dev: true 1240 | 1241 | /json-buffer@3.0.1: 1242 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1243 | dev: true 1244 | 1245 | /json-schema-traverse@0.4.1: 1246 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1247 | dev: true 1248 | 1249 | /json-stable-stringify-without-jsonify@1.0.1: 1250 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1251 | dev: true 1252 | 1253 | /keyv@4.5.3: 1254 | resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} 1255 | dependencies: 1256 | json-buffer: 3.0.1 1257 | dev: true 1258 | 1259 | /kleur@4.1.5: 1260 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 1261 | engines: {node: '>=6'} 1262 | dev: true 1263 | 1264 | /known-css-properties@0.28.0: 1265 | resolution: {integrity: sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==} 1266 | dev: true 1267 | 1268 | /levn@0.4.1: 1269 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1270 | engines: {node: '>= 0.8.0'} 1271 | dependencies: 1272 | prelude-ls: 1.2.1 1273 | type-check: 0.4.0 1274 | dev: true 1275 | 1276 | /lilconfig@2.1.0: 1277 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 1278 | engines: {node: '>=10'} 1279 | dev: true 1280 | 1281 | /locate-character@3.0.0: 1282 | resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 1283 | dev: true 1284 | 1285 | /locate-path@6.0.0: 1286 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1287 | engines: {node: '>=10'} 1288 | dependencies: 1289 | p-locate: 5.0.0 1290 | dev: true 1291 | 1292 | /lodash.merge@4.6.2: 1293 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1294 | dev: true 1295 | 1296 | /lru-cache@6.0.0: 1297 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1298 | engines: {node: '>=10'} 1299 | dependencies: 1300 | yallist: 4.0.0 1301 | dev: true 1302 | 1303 | /magic-string@0.27.0: 1304 | resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} 1305 | engines: {node: '>=12'} 1306 | dependencies: 1307 | '@jridgewell/sourcemap-codec': 1.4.15 1308 | dev: true 1309 | 1310 | /magic-string@0.30.3: 1311 | resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} 1312 | engines: {node: '>=12'} 1313 | dependencies: 1314 | '@jridgewell/sourcemap-codec': 1.4.15 1315 | dev: true 1316 | 1317 | /mdn-data@2.0.30: 1318 | resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} 1319 | dev: true 1320 | 1321 | /merge2@1.4.1: 1322 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1323 | engines: {node: '>= 8'} 1324 | dev: true 1325 | 1326 | /micromatch@4.0.5: 1327 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1328 | engines: {node: '>=8.6'} 1329 | dependencies: 1330 | braces: 3.0.2 1331 | picomatch: 2.3.1 1332 | dev: true 1333 | 1334 | /mime@3.0.0: 1335 | resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} 1336 | engines: {node: '>=10.0.0'} 1337 | hasBin: true 1338 | dev: true 1339 | 1340 | /min-indent@1.0.1: 1341 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 1342 | engines: {node: '>=4'} 1343 | dev: true 1344 | 1345 | /minimatch@3.1.2: 1346 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1347 | dependencies: 1348 | brace-expansion: 1.1.11 1349 | dev: true 1350 | 1351 | /minimist@1.2.8: 1352 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1353 | dev: true 1354 | 1355 | /mkdirp@0.5.6: 1356 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 1357 | hasBin: true 1358 | dependencies: 1359 | minimist: 1.2.8 1360 | dev: true 1361 | 1362 | /mri@1.2.0: 1363 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 1364 | engines: {node: '>=4'} 1365 | dev: true 1366 | 1367 | /mrmime@1.0.1: 1368 | resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} 1369 | engines: {node: '>=10'} 1370 | dev: true 1371 | 1372 | /ms@2.1.2: 1373 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1374 | dev: true 1375 | 1376 | /nanoid@3.3.6: 1377 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 1378 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1379 | hasBin: true 1380 | dev: true 1381 | 1382 | /natural-compare-lite@1.4.0: 1383 | resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} 1384 | dev: true 1385 | 1386 | /natural-compare@1.4.0: 1387 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1388 | dev: true 1389 | 1390 | /normalize-path@3.0.0: 1391 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1392 | engines: {node: '>=0.10.0'} 1393 | dev: true 1394 | 1395 | /once@1.4.0: 1396 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1397 | dependencies: 1398 | wrappy: 1.0.2 1399 | dev: true 1400 | 1401 | /optionator@0.9.3: 1402 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 1403 | engines: {node: '>= 0.8.0'} 1404 | dependencies: 1405 | '@aashutoshrathi/word-wrap': 1.2.6 1406 | deep-is: 0.1.4 1407 | fast-levenshtein: 2.0.6 1408 | levn: 0.4.1 1409 | prelude-ls: 1.2.1 1410 | type-check: 0.4.0 1411 | dev: true 1412 | 1413 | /p-limit@3.1.0: 1414 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1415 | engines: {node: '>=10'} 1416 | dependencies: 1417 | yocto-queue: 0.1.0 1418 | dev: true 1419 | 1420 | /p-locate@5.0.0: 1421 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1422 | engines: {node: '>=10'} 1423 | dependencies: 1424 | p-limit: 3.1.0 1425 | dev: true 1426 | 1427 | /parent-module@1.0.1: 1428 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1429 | engines: {node: '>=6'} 1430 | dependencies: 1431 | callsites: 3.1.0 1432 | dev: true 1433 | 1434 | /path-exists@4.0.0: 1435 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1436 | engines: {node: '>=8'} 1437 | dev: true 1438 | 1439 | /path-is-absolute@1.0.1: 1440 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1441 | engines: {node: '>=0.10.0'} 1442 | dev: true 1443 | 1444 | /path-key@3.1.1: 1445 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1446 | engines: {node: '>=8'} 1447 | dev: true 1448 | 1449 | /path-type@4.0.0: 1450 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1451 | engines: {node: '>=8'} 1452 | dev: true 1453 | 1454 | /periscopic@3.1.0: 1455 | resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} 1456 | dependencies: 1457 | '@types/estree': 1.0.1 1458 | estree-walker: 3.0.3 1459 | is-reference: 3.0.1 1460 | dev: true 1461 | 1462 | /picocolors@1.0.0: 1463 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1464 | dev: true 1465 | 1466 | /picomatch@2.3.1: 1467 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1468 | engines: {node: '>=8.6'} 1469 | dev: true 1470 | 1471 | /postcss-load-config@3.1.4(postcss@8.4.29): 1472 | resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 1473 | engines: {node: '>= 10'} 1474 | peerDependencies: 1475 | postcss: '>=8.0.9' 1476 | ts-node: '>=9.0.0' 1477 | peerDependenciesMeta: 1478 | postcss: 1479 | optional: true 1480 | ts-node: 1481 | optional: true 1482 | dependencies: 1483 | lilconfig: 2.1.0 1484 | postcss: 8.4.29 1485 | yaml: 1.10.2 1486 | dev: true 1487 | 1488 | /postcss-safe-parser@6.0.0(postcss@8.4.29): 1489 | resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} 1490 | engines: {node: '>=12.0'} 1491 | peerDependencies: 1492 | postcss: ^8.3.3 1493 | dependencies: 1494 | postcss: 8.4.29 1495 | dev: true 1496 | 1497 | /postcss-scss@4.0.8(postcss@8.4.29): 1498 | resolution: {integrity: sha512-Cr0X8Eu7xMhE96PJck6ses/uVVXDtE5ghUTKNUYgm8ozgP2TkgV3LWs3WgLV1xaSSLq8ZFiXaUrj0LVgG1fGEA==} 1499 | engines: {node: '>=12.0'} 1500 | peerDependencies: 1501 | postcss: ^8.4.29 1502 | dependencies: 1503 | postcss: 8.4.29 1504 | dev: true 1505 | 1506 | /postcss-selector-parser@6.0.13: 1507 | resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} 1508 | engines: {node: '>=4'} 1509 | dependencies: 1510 | cssesc: 3.0.0 1511 | util-deprecate: 1.0.2 1512 | dev: true 1513 | 1514 | /postcss@8.4.29: 1515 | resolution: {integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==} 1516 | engines: {node: ^10 || ^12 || >=14} 1517 | dependencies: 1518 | nanoid: 3.3.6 1519 | picocolors: 1.0.0 1520 | source-map-js: 1.0.2 1521 | dev: true 1522 | 1523 | /prelude-ls@1.2.1: 1524 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1525 | engines: {node: '>= 0.8.0'} 1526 | dev: true 1527 | 1528 | /prettier-plugin-svelte@3.0.3(prettier@3.0.3)(svelte@4.2.0): 1529 | resolution: {integrity: sha512-dLhieh4obJEK1hnZ6koxF+tMUrZbV5YGvRpf2+OADyanjya5j0z1Llo8iGwiHmFWZVG/hLEw/AJD5chXd9r3XA==} 1530 | peerDependencies: 1531 | prettier: ^3.0.0 1532 | svelte: ^3.2.0 || ^4.0.0-next.0 1533 | dependencies: 1534 | prettier: 3.0.3 1535 | svelte: 4.2.0 1536 | dev: true 1537 | 1538 | /prettier@3.0.3: 1539 | resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} 1540 | engines: {node: '>=14'} 1541 | hasBin: true 1542 | dev: true 1543 | 1544 | /punycode@2.3.0: 1545 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 1546 | engines: {node: '>=6'} 1547 | dev: true 1548 | 1549 | /queue-microtask@1.2.3: 1550 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1551 | dev: true 1552 | 1553 | /readdirp@3.6.0: 1554 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1555 | engines: {node: '>=8.10.0'} 1556 | dependencies: 1557 | picomatch: 2.3.1 1558 | dev: true 1559 | 1560 | /resolve-from@4.0.0: 1561 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1562 | engines: {node: '>=4'} 1563 | dev: true 1564 | 1565 | /reusify@1.0.4: 1566 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1567 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1568 | dev: true 1569 | 1570 | /rimraf@2.7.1: 1571 | resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} 1572 | hasBin: true 1573 | dependencies: 1574 | glob: 7.2.3 1575 | dev: true 1576 | 1577 | /rimraf@3.0.2: 1578 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1579 | hasBin: true 1580 | dependencies: 1581 | glob: 7.2.3 1582 | dev: true 1583 | 1584 | /rollup@3.29.1: 1585 | resolution: {integrity: sha512-c+ebvQz0VIH4KhhCpDsI+Bik0eT8ZFEVZEYw0cGMVqIP8zc+gnwl7iXCamTw7vzv2MeuZFZfdx5JJIq+ehzDlg==} 1586 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 1587 | hasBin: true 1588 | optionalDependencies: 1589 | fsevents: 2.3.3 1590 | dev: true 1591 | 1592 | /run-parallel@1.2.0: 1593 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1594 | dependencies: 1595 | queue-microtask: 1.2.3 1596 | dev: true 1597 | 1598 | /sade@1.8.1: 1599 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 1600 | engines: {node: '>=6'} 1601 | dependencies: 1602 | mri: 1.2.0 1603 | dev: true 1604 | 1605 | /sander@0.5.1: 1606 | resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} 1607 | dependencies: 1608 | es6-promise: 3.3.1 1609 | graceful-fs: 4.2.11 1610 | mkdirp: 0.5.6 1611 | rimraf: 2.7.1 1612 | dev: true 1613 | 1614 | /semver@7.5.4: 1615 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 1616 | engines: {node: '>=10'} 1617 | hasBin: true 1618 | dependencies: 1619 | lru-cache: 6.0.0 1620 | dev: true 1621 | 1622 | /set-cookie-parser@2.6.0: 1623 | resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} 1624 | dev: true 1625 | 1626 | /shebang-command@2.0.0: 1627 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1628 | engines: {node: '>=8'} 1629 | dependencies: 1630 | shebang-regex: 3.0.0 1631 | dev: true 1632 | 1633 | /shebang-regex@3.0.0: 1634 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1635 | engines: {node: '>=8'} 1636 | dev: true 1637 | 1638 | /sirv@2.0.3: 1639 | resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==} 1640 | engines: {node: '>= 10'} 1641 | dependencies: 1642 | '@polka/url': 1.0.0-next.23 1643 | mrmime: 1.0.1 1644 | totalist: 3.0.1 1645 | dev: true 1646 | 1647 | /slash@3.0.0: 1648 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1649 | engines: {node: '>=8'} 1650 | dev: true 1651 | 1652 | /sorcery@0.11.0: 1653 | resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} 1654 | hasBin: true 1655 | dependencies: 1656 | '@jridgewell/sourcemap-codec': 1.4.15 1657 | buffer-crc32: 0.2.13 1658 | minimist: 1.2.8 1659 | sander: 0.5.1 1660 | dev: true 1661 | 1662 | /source-map-js@1.0.2: 1663 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1664 | engines: {node: '>=0.10.0'} 1665 | dev: true 1666 | 1667 | /streamsearch@1.1.0: 1668 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 1669 | engines: {node: '>=10.0.0'} 1670 | dev: true 1671 | 1672 | /strip-ansi@6.0.1: 1673 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1674 | engines: {node: '>=8'} 1675 | dependencies: 1676 | ansi-regex: 5.0.1 1677 | dev: true 1678 | 1679 | /strip-indent@3.0.0: 1680 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 1681 | engines: {node: '>=8'} 1682 | dependencies: 1683 | min-indent: 1.0.1 1684 | dev: true 1685 | 1686 | /strip-json-comments@3.1.1: 1687 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1688 | engines: {node: '>=8'} 1689 | dev: true 1690 | 1691 | /supports-color@7.2.0: 1692 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1693 | engines: {node: '>=8'} 1694 | dependencies: 1695 | has-flag: 4.0.0 1696 | dev: true 1697 | 1698 | /svelte-check@3.5.1(postcss@8.4.29)(svelte@4.2.0): 1699 | resolution: {integrity: sha512-+Zb4iHxAhdUtcUg/WJPRjlS1RJalIsWAe9Mz6G1zyznSs7dDkT7VUBdXc3q7Iwg49O/VrZgyJRvOJkjuBfKjFA==} 1700 | hasBin: true 1701 | peerDependencies: 1702 | svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 1703 | dependencies: 1704 | '@jridgewell/trace-mapping': 0.3.19 1705 | chokidar: 3.5.3 1706 | fast-glob: 3.3.1 1707 | import-fresh: 3.3.0 1708 | picocolors: 1.0.0 1709 | sade: 1.8.1 1710 | svelte: 4.2.0 1711 | svelte-preprocess: 5.0.4(postcss@8.4.29)(svelte@4.2.0)(typescript@5.2.2) 1712 | typescript: 5.2.2 1713 | transitivePeerDependencies: 1714 | - '@babel/core' 1715 | - coffeescript 1716 | - less 1717 | - postcss 1718 | - postcss-load-config 1719 | - pug 1720 | - sass 1721 | - stylus 1722 | - sugarss 1723 | dev: true 1724 | 1725 | /svelte-eslint-parser@0.33.0(svelte@4.2.0): 1726 | resolution: {integrity: sha512-5awZ6Bs+Tb/zQwa41PSdcLynAVQTwW0HGyCBjtbAQ59taLZqDgQSMzRlDmapjZdDtzERm0oXDZNE0E+PKJ6ryg==} 1727 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1728 | peerDependencies: 1729 | svelte: ^3.37.0 || ^4.0.0 1730 | peerDependenciesMeta: 1731 | svelte: 1732 | optional: true 1733 | dependencies: 1734 | eslint-scope: 7.2.2 1735 | eslint-visitor-keys: 3.4.3 1736 | espree: 9.6.1 1737 | postcss: 8.4.29 1738 | postcss-scss: 4.0.8(postcss@8.4.29) 1739 | svelte: 4.2.0 1740 | dev: true 1741 | 1742 | /svelte-hmr@0.15.3(svelte@4.2.0): 1743 | resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==} 1744 | engines: {node: ^12.20 || ^14.13.1 || >= 16} 1745 | peerDependencies: 1746 | svelte: ^3.19.0 || ^4.0.0 1747 | dependencies: 1748 | svelte: 4.2.0 1749 | dev: true 1750 | 1751 | /svelte-preprocess@5.0.4(postcss@8.4.29)(svelte@4.2.0)(typescript@5.2.2): 1752 | resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} 1753 | engines: {node: '>= 14.10.0'} 1754 | requiresBuild: true 1755 | peerDependencies: 1756 | '@babel/core': ^7.10.2 1757 | coffeescript: ^2.5.1 1758 | less: ^3.11.3 || ^4.0.0 1759 | postcss: ^7 || ^8 1760 | postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 1761 | pug: ^3.0.0 1762 | sass: ^1.26.8 1763 | stylus: ^0.55.0 1764 | sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 1765 | svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 1766 | typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' 1767 | peerDependenciesMeta: 1768 | '@babel/core': 1769 | optional: true 1770 | coffeescript: 1771 | optional: true 1772 | less: 1773 | optional: true 1774 | postcss: 1775 | optional: true 1776 | postcss-load-config: 1777 | optional: true 1778 | pug: 1779 | optional: true 1780 | sass: 1781 | optional: true 1782 | stylus: 1783 | optional: true 1784 | sugarss: 1785 | optional: true 1786 | typescript: 1787 | optional: true 1788 | dependencies: 1789 | '@types/pug': 2.0.6 1790 | detect-indent: 6.1.0 1791 | magic-string: 0.27.0 1792 | postcss: 8.4.29 1793 | sorcery: 0.11.0 1794 | strip-indent: 3.0.0 1795 | svelte: 4.2.0 1796 | typescript: 5.2.2 1797 | dev: true 1798 | 1799 | /svelte@4.2.0: 1800 | resolution: {integrity: sha512-kVsdPjDbLrv74SmLSUzAsBGquMs4MPgWGkGLpH+PjOYnFOziAvENVzgJmyOCV2gntxE32aNm8/sqNKD6LbIpeQ==} 1801 | engines: {node: '>=16'} 1802 | dependencies: 1803 | '@ampproject/remapping': 2.2.1 1804 | '@jridgewell/sourcemap-codec': 1.4.15 1805 | '@jridgewell/trace-mapping': 0.3.19 1806 | acorn: 8.10.0 1807 | aria-query: 5.3.0 1808 | axobject-query: 3.2.1 1809 | code-red: 1.0.4 1810 | css-tree: 2.3.1 1811 | estree-walker: 3.0.3 1812 | is-reference: 3.0.1 1813 | locate-character: 3.0.0 1814 | magic-string: 0.30.3 1815 | periscopic: 3.1.0 1816 | dev: true 1817 | 1818 | /sveltekit-view-transition@0.5.2(@sveltejs/kit@1.24.1)(svelte@4.2.0): 1819 | resolution: {integrity: sha512-xQ5+5YkQUW41nTW7206SB0pD6JgtebmCiFoPoyKdilGkqKFdLjZ940kMY6kDf5bi0dRf18H0ZmUSH9v1BB5m3Q==} 1820 | peerDependencies: 1821 | '@sveltejs/kit': ^1.20.4 1822 | svelte: ^4.0.0 1823 | dependencies: 1824 | '@sveltejs/kit': 1.24.1(svelte@4.2.0)(vite@4.4.9) 1825 | svelte: 4.2.0 1826 | dev: true 1827 | 1828 | /text-table@0.2.0: 1829 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1830 | dev: true 1831 | 1832 | /tiny-glob@0.2.9: 1833 | resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} 1834 | dependencies: 1835 | globalyzer: 0.1.0 1836 | globrex: 0.1.2 1837 | dev: true 1838 | 1839 | /to-regex-range@5.0.1: 1840 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1841 | engines: {node: '>=8.0'} 1842 | dependencies: 1843 | is-number: 7.0.0 1844 | dev: true 1845 | 1846 | /totalist@3.0.1: 1847 | resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} 1848 | engines: {node: '>=6'} 1849 | dev: true 1850 | 1851 | /tslib@1.14.1: 1852 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 1853 | dev: true 1854 | 1855 | /tslib@2.6.2: 1856 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 1857 | dev: true 1858 | 1859 | /tsutils@3.21.0(typescript@5.2.2): 1860 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 1861 | engines: {node: '>= 6'} 1862 | peerDependencies: 1863 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 1864 | dependencies: 1865 | tslib: 1.14.1 1866 | typescript: 5.2.2 1867 | dev: true 1868 | 1869 | /type-check@0.4.0: 1870 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1871 | engines: {node: '>= 0.8.0'} 1872 | dependencies: 1873 | prelude-ls: 1.2.1 1874 | dev: true 1875 | 1876 | /type-fest@0.20.2: 1877 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1878 | engines: {node: '>=10'} 1879 | dev: true 1880 | 1881 | /typescript@5.2.2: 1882 | resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} 1883 | engines: {node: '>=14.17'} 1884 | hasBin: true 1885 | dev: true 1886 | 1887 | /undici@5.23.0: 1888 | resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} 1889 | engines: {node: '>=14.0'} 1890 | dependencies: 1891 | busboy: 1.6.0 1892 | dev: true 1893 | 1894 | /uri-js@4.4.1: 1895 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1896 | dependencies: 1897 | punycode: 2.3.0 1898 | dev: true 1899 | 1900 | /util-deprecate@1.0.2: 1901 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1902 | dev: true 1903 | 1904 | /vite@4.4.9: 1905 | resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} 1906 | engines: {node: ^14.18.0 || >=16.0.0} 1907 | hasBin: true 1908 | peerDependencies: 1909 | '@types/node': '>= 14' 1910 | less: '*' 1911 | lightningcss: ^1.21.0 1912 | sass: '*' 1913 | stylus: '*' 1914 | sugarss: '*' 1915 | terser: ^5.4.0 1916 | peerDependenciesMeta: 1917 | '@types/node': 1918 | optional: true 1919 | less: 1920 | optional: true 1921 | lightningcss: 1922 | optional: true 1923 | sass: 1924 | optional: true 1925 | stylus: 1926 | optional: true 1927 | sugarss: 1928 | optional: true 1929 | terser: 1930 | optional: true 1931 | dependencies: 1932 | esbuild: 0.18.20 1933 | postcss: 8.4.29 1934 | rollup: 3.29.1 1935 | optionalDependencies: 1936 | fsevents: 2.3.3 1937 | dev: true 1938 | 1939 | /vitefu@0.2.4(vite@4.4.9): 1940 | resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} 1941 | peerDependencies: 1942 | vite: ^3.0.0 || ^4.0.0 1943 | peerDependenciesMeta: 1944 | vite: 1945 | optional: true 1946 | dependencies: 1947 | vite: 4.4.9 1948 | dev: true 1949 | 1950 | /which@2.0.2: 1951 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1952 | engines: {node: '>= 8'} 1953 | hasBin: true 1954 | dependencies: 1955 | isexe: 2.0.0 1956 | dev: true 1957 | 1958 | /wrappy@1.0.2: 1959 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1960 | dev: true 1961 | 1962 | /yallist@4.0.0: 1963 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1964 | dev: true 1965 | 1966 | /yaml@1.10.2: 1967 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 1968 | engines: {node: '>= 6'} 1969 | dev: true 1970 | 1971 | /yocto-queue@0.1.0: 1972 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1973 | engines: {node: '>=10'} 1974 | dev: true 1975 | --------------------------------------------------------------------------------