├── ui ├── .npmrc ├── src │ ├── routes │ │ ├── +layout.ts │ │ ├── +layout.svelte │ │ ├── styles.css │ │ └── +page.svelte │ ├── lib │ │ ├── stores.ts │ │ ├── picker-customization.ts │ │ ├── CustomMenu.svelte │ │ └── picker-shadow-styles.css │ ├── app.html │ └── app.d.ts ├── static │ └── favicon.png ├── vite.config.ts ├── .prettierignore ├── .prettierrc.json5 ├── tsconfig.json ├── svelte.config.js ├── package.json └── package-lock.json ├── assets ├── audio │ └── pop.wav ├── emoji-mart.ico ├── emoji-mart.png ├── emoji-mart.desktop └── AppImageBuilder.yml ├── .editorconfig ├── .gitattributes ├── src ├── audio_nix.c.v ├── cache.v ├── auido_windows.c.v ├── config.v ├── main.v ├── paths.v ├── init_d_embed.v └── api.v ├── v.mod ├── .github └── workflows │ ├── ci.yml │ ├── lint.yml │ ├── macos.yml │ ├── windows.yml │ └── linux.yml ├── .gitignore └── README.md /ui/.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | resolution-mode=highest 3 | -------------------------------------------------------------------------------- /ui/src/routes/+layout.ts: -------------------------------------------------------------------------------- 1 | export const prerender = true; 2 | -------------------------------------------------------------------------------- /assets/audio/pop.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ttytm/emoji-mart-desktop/HEAD/assets/audio/pop.wav -------------------------------------------------------------------------------- /assets/emoji-mart.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ttytm/emoji-mart-desktop/HEAD/assets/emoji-mart.ico -------------------------------------------------------------------------------- /assets/emoji-mart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ttytm/emoji-mart-desktop/HEAD/assets/emoji-mart.png -------------------------------------------------------------------------------- /ui/src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /ui/static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ttytm/emoji-mart-desktop/HEAD/ui/static/favicon.png -------------------------------------------------------------------------------- /ui/src/lib/stores.ts: -------------------------------------------------------------------------------- 1 | import { writable } from 'svelte/store'; 2 | 3 | export const config = writable(); 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | charset = utf-8 3 | end_of_line = lf 4 | insert_final_newline = true 5 | trim_trailing_whitespace = true 6 | 7 | [*.v] 8 | indent_style = tab 9 | -------------------------------------------------------------------------------- /ui/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 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | *.bat eol=crlf 3 | 4 | **/*.v linguist-language=V 5 | **/*.vv linguist-language=V 6 | **/*.vsh linguist-language=V 7 | **/v.mod linguist-language=V 8 | -------------------------------------------------------------------------------- /src/audio_nix.c.v: -------------------------------------------------------------------------------- 1 | module main 2 | 3 | import os 4 | 5 | fn play_wav_file() { 6 | $if linux { 7 | os.system('aplay -q "${paths.sound}"') 8 | } $else $if macos { 9 | os.system('afplay "${paths.sound}"') 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /ui/.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 | -------------------------------------------------------------------------------- /v.mod: -------------------------------------------------------------------------------- 1 | Module{ 2 | name: 'Emoji Mart Desktop App' 3 | description: 'An emoji picker created with V and webview' 4 | version: '0.4.0' 5 | license: 'MIT' 6 | dependencies: ['https://github.com/ttytm/webview', 'https://github.com/Larpon/miniaudio'] 7 | } 8 | -------------------------------------------------------------------------------- /ui/.prettierrc.json5: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /assets/emoji-mart.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=Application 3 | TryExec=emoji-mart-desktop 4 | Exec=emoji-mart-desktop 5 | Icon=emoji-mart 6 | Terminal=false 7 | Categories=Utility; 8 | 9 | Name=Emoji Mart 10 | GenericName=Terminal 11 | Comment=Emoji picker, cross-platform, lightweight 12 | -------------------------------------------------------------------------------- /ui/src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
%sveltekit.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /src/cache.v: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | 4 | pub struct LocalStorage { 5 | mut: 6 | frequently string 7 | } 8 | 9 | fn (mut cache LocalStorage) load() { 10 | if f := os.read_file(paths.cache_file) { 11 | cache = json.decode(LocalStorage, f) or { LocalStorage{} } 12 | } 13 | } 14 | 15 | fn (cache LocalStorage) save() ! { 16 | if !os.is_dir(paths.cache_dir) { 17 | os.mkdir_all(paths.cache_dir)! 18 | } 19 | os.write_file(paths.cache_file, json.encode(cache))! 20 | } 21 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | paths-ignore: ['**/*.md'] 6 | pull_request: 7 | paths-ignore: ['**/*.md'] 8 | workflow_dispatch: 9 | 10 | jobs: 11 | linux: 12 | uses: ./.github/workflows/linux.yml 13 | permissions: 14 | contents: write 15 | 16 | macOS: 17 | uses: ./.github/workflows/macos.yml 18 | permissions: 19 | contents: write 20 | 21 | windows: 22 | uses: ./.github/workflows/windows.yml 23 | permissions: 24 | contents: write 25 | -------------------------------------------------------------------------------- /src/auido_windows.c.v: -------------------------------------------------------------------------------- 1 | module main 2 | 3 | import time 4 | import miniaudio as ma 5 | 6 | fn play_wav_file() { 7 | engine := &ma.Engine{} 8 | if ma.engine_init(ma.null, engine) != .success { 9 | panic('failed to initialize audio engine.') 10 | } 11 | defer { 12 | ma.engine_uninit(engine) 13 | } 14 | if ma.engine_play_sound(engine, paths.sound.str, ma.null) != .success { 15 | panic('failed to load and play "${paths.sound}".') 16 | } 17 | ma.engine_play_sound(engine, paths.sound.str, ma.null) 18 | time.sleep(140 * time.millisecond) 19 | } 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # == V 2 | # Binaries for programs and plugins 3 | emoji-mart-desktop 4 | *.exe 5 | *.exe~ 6 | *.so 7 | *.dylib 8 | *.dll 9 | 10 | # Ignore binary output folders 11 | dist/ 12 | 13 | # Generated files 14 | lvb.v 15 | 16 | # Ignore common editor/system specific metadata 17 | .DS_Store 18 | .idea/ 19 | .vscode/ 20 | *.iml 21 | 22 | # == Svelte 23 | .DS_Store 24 | node_modules 25 | build 26 | .svelte-kit 27 | package 28 | vite.config.js.timestamp-* 29 | vite.config.ts.timestamp-* 30 | 31 | # == Common 32 | # Env 33 | .env 34 | .env.* 35 | !.env.example 36 | -------------------------------------------------------------------------------- /src/config.v: -------------------------------------------------------------------------------- 1 | import os 2 | import toml 3 | 4 | struct Config { 5 | mut: 6 | audio bool = true // Last state of audio feedback feedback setting for emoji selections 7 | frequent bool = true // Controls whether or not frequently used emojis are shown 8 | } 9 | 10 | fn (mut config Config) load() { 11 | if f := toml.parse_file(paths.cfg_file) { 12 | config = f.decode[Config]() or { return } 13 | } 14 | } 15 | 16 | fn (config Config) save() ! { 17 | if !os.is_dir(paths.cfg_dir) { 18 | os.mkdir_all(paths.cfg_dir)! 19 | } 20 | os.write_file(paths.cfg_file, toml.encode(config))! 21 | } 22 | -------------------------------------------------------------------------------- /ui/src/routes/styles.css: -------------------------------------------------------------------------------- 1 | @media (prefers-color-scheme: dark) { 2 | :root { 3 | --rgb-accent: 162, 234, 233; 4 | --rgb-accent-secondary: 251, 184, 108; 5 | --rgb-background: 39, 39, 39; 6 | --rgb-background-secondary: 44, 44, 44; 7 | --rgb-background-tertiary: 54, 54, 54; 8 | --rgb-input: 28, 28, 28; 9 | --color-hover: rgb(64, 64, 64); 10 | --color-border: rgb(var(--rgb-input)); 11 | } 12 | html { 13 | background: rgb(var(--rgb-background)); 14 | color: #ccc; 15 | } 16 | } 17 | 18 | body { 19 | margin: 0; 20 | } 21 | 22 | em-emoji-picker { 23 | width: 100%; 24 | height: 100vh; 25 | } 26 | -------------------------------------------------------------------------------- /ui/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 | -------------------------------------------------------------------------------- /ui/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 | declare module 'svelte-popover'; 13 | 14 | type Config = { 15 | audio: boolean; 16 | frequent: boolean; 17 | }; 18 | 19 | // Webview functions 20 | declare function get_config(): Promise; 21 | declare function get_cache(): Promise; 22 | declare function handle_select(localStorage: string): Promise; 23 | declare function toggle_audio(): Promise; 24 | declare function open_in_browser(uri: string): Promise; 25 | -------------------------------------------------------------------------------- /ui/svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-static'; 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/lint.yml: -------------------------------------------------------------------------------- 1 | name: Lint 2 | 3 | on: 4 | workflow_call: 5 | 6 | env: 7 | REPO_NAME: ${{ github.event.repository.name }} 8 | 9 | jobs: 10 | fmt: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout ${{ env.REPO_NAME }} 14 | uses: actions/checkout@v4 15 | with: 16 | path: ${{ env.REPO_NAME }} 17 | - name: Restore Cache 18 | uses: actions/cache/restore@v3 19 | with: 20 | path: | 21 | vlang 22 | ~/.vmodules 23 | key: ${{ runner.os }}-${{ github.sha }} 24 | fail-on-cache-miss: true 25 | - name: Setup V 26 | run: vlang/v symlink && v version 27 | - name: Check Formatting 28 | run: v fmt ${{ env.REPO_NAME }} && v fmt -verify ${{ env.REPO_NAME }} 29 | -------------------------------------------------------------------------------- /ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui-", 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 .", 12 | "format": "prettier --plugin-search-dir . --write ." 13 | }, 14 | "devDependencies": { 15 | "@iconify/svelte": "^3.1.4", 16 | "@sveltejs/adapter-auto": "^2.0.0", 17 | "@sveltejs/adapter-static": "^2.0.2", 18 | "@sveltejs/kit": "^1.20.4", 19 | "prettier": "^2.8.0", 20 | "prettier-plugin-svelte": "^2.10.1", 21 | "svelte": "^4.0.5", 22 | "svelte-check": "^3.4.3", 23 | "svelte-popover": "^2.0.8", 24 | "tslib": "^2.4.1", 25 | "typescript": "^5.0.0", 26 | "vite": "^4.4.2" 27 | }, 28 | "type": "module", 29 | "dependencies": { 30 | "@emoji-mart/data": "^1.1.2", 31 | "emoji-mart": "^5.5.2" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main.v: -------------------------------------------------------------------------------- 1 | import webview { Webview } 2 | import os 3 | 4 | @[heap] 5 | struct App { 6 | mut: 7 | window Webview 8 | config Config 9 | cache LocalStorage 10 | port int 11 | } 12 | 13 | fn main() { 14 | mut app := App{ 15 | window: webview.create() 16 | } 17 | app.config.load() 18 | app.cache.load() 19 | os.signal_opt(.int, app.handle_interrupt)! 20 | app.run()! 21 | } 22 | 23 | fn (mut app App) run() ! { 24 | app.bind() 25 | app.window.set_title('Emoji Mart') 26 | app.window.set_size(352, 435, .@none) 27 | app.window.set_icon(paths.icon) or {} // FIXME: `assets/emoji-mart.ico` not recognized on linux. 28 | $if dev ? { 29 | app.window.serve_dev(paths.ui)! 30 | } $else { 31 | app.window.serve_static(paths.ui)! 32 | } 33 | app.window.run() 34 | app.end() 35 | } 36 | 37 | fn (mut app App) end() { 38 | app.window.destroy() 39 | app.config.save() or { panic('failed to save config. ${err}') } 40 | app.cache.save() or { panic('failed to load cache. ${err}') } 41 | } 42 | 43 | fn (mut app App) handle_interrupt(signal os.Signal) { 44 | app.end() 45 | exit(0) 46 | } 47 | -------------------------------------------------------------------------------- /src/paths.v: -------------------------------------------------------------------------------- 1 | import os { join_path } 2 | 3 | struct Paths { 4 | mut: 5 | root string 6 | ui string 7 | sound string 8 | icon string 9 | cfg_dir string 10 | cfg_file string 11 | cache_dir string 12 | cache_file string 13 | } 14 | 15 | const app_name = 'emoji-mart' 16 | const paths = get_paths()! 17 | 18 | fn get_paths() !Paths { 19 | mut p := Paths{} 20 | $if embed ? { 21 | tmp_dir := join_path(os.temp_dir(), '${app_name}-@${version}') 22 | p.ui = join_path(tmp_dir, 'ui') 23 | p.sound = join_path(tmp_dir, 'assets', 'pop.wav') 24 | p.icon = join_path(tmp_dir, 'assets', 'icon.ico') 25 | } $else { 26 | app_root := @VMODROOT 27 | p.ui = join_path(app_root, 'ui', 'build') 28 | p.sound = join_path(app_root, 'assets', 'audio', 'pop.wav') 29 | p.icon = join_path(app_root, 'assets', 'emoji-mart.ico') 30 | } 31 | // Config 32 | p.cfg_dir = join_path(os.config_dir()!, app_name) 33 | p.cfg_file = join_path(p.cfg_dir, '${app_name}.toml') 34 | // Cache 35 | p.cache_dir = join_path(os.cache_dir(), app_name, 'LocalStorage') 36 | p.cache_file = join_path(p.cache_dir, 'localStorage.json') 37 | return p 38 | } 39 | -------------------------------------------------------------------------------- /src/init_d_embed.v: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | // Example of two static embedded files. 4 | const icon = $embed_file('../assets/emoji-mart.ico') 5 | // Note: Currently, this one must be in a differnt dir, else V embeds the wrong file. 6 | // Else the path would be `../assets/pop.wav`. 7 | const sound = $embed_file('../assets/audio/pop.wav') 8 | 9 | fn init() { 10 | write_embedded() or { 11 | eprintln('failed to write embedded files: `${err}`') 12 | exit(1) 13 | } 14 | } 15 | 16 | fn write_embedded() ! { 17 | if !os.exists(paths.ui) { 18 | dist_ui_path := os.join_path('dist', 'ui') 19 | for file in ui { 20 | _, rel_file_path := file.path.rsplit_once(dist_ui_path) or { 21 | return error('failed to prepare path for ${file.path}') 22 | } 23 | out_path := os.join_path(paths.ui, rel_file_path) 24 | os.mkdir_all(os.dir(out_path))! 25 | os.write_file(out_path, file.to_string())! 26 | } 27 | } 28 | if !os.exists(paths.sound) { 29 | os.mkdir_all(os.dir(paths.sound)) or {} 30 | os.write_file(paths.sound, sound.to_string())! 31 | } 32 | if !os.exists(paths.icon) { 33 | os.mkdir_all(os.dir(paths.icon)) or {} 34 | os.write_file(paths.icon, icon.to_string())! 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /assets/AppImageBuilder.yml: -------------------------------------------------------------------------------- 1 | # appimage-builder recipe see https://appimage-builder.readthedocs.io for details 2 | version: 1 3 | AppDir: 4 | path: /home/turiiya/Dev/vlang/webview/emoji-mart-desktop/dist/appimage/AppDir 5 | app_info: 6 | id: emoji-mart 7 | name: Emoji Mart 8 | icon: emoji-mart 9 | version: 'latest' 10 | exec: usr/bin/emoji-mart 11 | exec_args: $@ 12 | files: 13 | include: 14 | - lib64/ld-linux-x86-64.so.2 15 | - /usr/lib/x86_64-linux-gnu/libatomic.so.1 16 | - /usr/lib/x86_64-linux-gnu/libffi.so.8 17 | - /usr/lib/x86_64-linux-gnu/libfribidi.so.0 18 | - /usr/lib/x86_64-linux-gnu/libharfbuzz-gobject.so.0 19 | - /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0 20 | - /usr/lib/x86_64-linux-gnu/libpsl.so.5 21 | - /usr/lib/x86_64-linux-gnu/libpthread.so.0 22 | - /usr/lib/x86_64-linux-gnu/librt.so.1 23 | - /usr/lib/x86_64-linux-gnu/libsepol.so.2 24 | - /usr/lib/x86_64-linux-gnu/libstdc++.so.6 25 | exclude: 26 | - usr/share/man 27 | - usr/share/doc/*/README.* 28 | - usr/share/doc/*/changelog.* 29 | - usr/share/doc/*/NEWS.* 30 | - usr/share/doc/*/TODO.* 31 | test: 32 | ubuntu-bionic: 33 | image: appimagecrafters/tests-env:ubuntu-bionic 34 | command: ./AppRun 35 | AppImage: 36 | arch: x86_64 37 | update-information: guess 38 | -------------------------------------------------------------------------------- /src/api.v: -------------------------------------------------------------------------------- 1 | import webview { Event } 2 | import os 3 | 4 | fn (mut app App) bind() { 5 | // Bind a function. 6 | app.window.bind_opt('open_in_browser', open_in_browser) 7 | // Bind a function method to make the app struct available. 8 | app.window.bind('get_config', app.get_config) 9 | app.window.bind('get_cache', app.get_cache) 10 | app.window.bind_opt('handle_select', app.handle_select) 11 | // Alternatively, use `bind_ctx` and use the context pointer to pass a struct. 12 | app.window.bind_with_ctx('toggle_audio', toggle_audio, app) 13 | } 14 | 15 | // The functions we bind do not have to be public. For semantic reasons or 16 | // if we would want to generate docs for pub functions we can do it anyway. 17 | 18 | pub fn (app &App) get_config(_ &Event) Config { 19 | return app.config 20 | } 21 | 22 | pub fn (mut app App) handle_select(e &Event) !voidptr { 23 | if app.config.audio { 24 | spawn play_wav_file() 25 | } 26 | app.cache.frequently = e.get_arg[string](0)! 27 | return webview.no_result 28 | } 29 | 30 | pub fn toggle_audio(e &Event, mut app App) bool { 31 | app.config.audio = !app.config.audio 32 | if app.config.audio { 33 | spawn play_wav_file() 34 | } 35 | return app.config.audio 36 | } 37 | 38 | pub fn (app &App) get_cache(e &Event) string { 39 | return app.cache.frequently 40 | } 41 | 42 | pub fn open_in_browser(e &Event) !voidptr { 43 | link := e.get_arg[string](0)! 44 | os.open_uri(link)! 45 | return webview.no_result 46 | } 47 | -------------------------------------------------------------------------------- /ui/src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 46 | 47 |
48 | 49 | -------------------------------------------------------------------------------- /ui/src/lib/picker-customization.ts: -------------------------------------------------------------------------------- 1 | import shadowStyles from './picker-shadow-styles.css?inline'; 2 | 3 | function style(shadowRoot: ShadowRoot) { 4 | let style = document.createElement('style'); 5 | style.innerHTML = shadowStyles; 6 | shadowRoot.appendChild(style); 7 | } 8 | 9 | function setKeymaps(shadowRoot: ShadowRoot) { 10 | const searchInput = shadowRoot.querySelector('.search input[type="search"]') as HTMLElement; 11 | document.addEventListener('keydown', (e) => { 12 | // e.preventDefault(); // for testing purposes in the browser 13 | if (((e.metaKey || e.ctrlKey) && e.key === 'f') || e.key === '/') { 14 | e.preventDefault(); 15 | searchInput.focus(); 16 | } 17 | }); 18 | // Keyboard shortcut indicator 19 | const shortcutIndicator = document.createElement('div'); 20 | shortcutIndicator.setAttribute('id', 'search-keys'); 21 | // The searchbox is autofocus so we initially hide the shortcut indicator. 22 | shortcutIndicator.classList.add('hide'); 23 | shortcutIndicator.innerHTML = '
/
'; 24 | searchInput.parentElement?.appendChild(shortcutIndicator); 25 | searchInput.addEventListener('focus', () => shortcutIndicator.classList.add('hide')); 26 | searchInput.addEventListener('blur', () => shortcutIndicator.classList.remove('hide')); 27 | } 28 | 29 | function appendSettings(shadowRoot: ShadowRoot) { 30 | const settings = document.getElementById('custom-settings'); 31 | if (!settings) return; 32 | const search = shadowRoot.querySelector('div.search')?.parentElement; 33 | search?.appendChild(settings); 34 | } 35 | 36 | export function highlightKeyboarSelect(button: HTMLElement) { 37 | button.classList.add('keyboard-active'); 38 | setTimeout(() => { 39 | button.classList.remove('keyboard-active'); 40 | }, 150); 41 | } 42 | 43 | export function customizePicker(shadowRoot: ShadowRoot) { 44 | setTimeout(() => { 45 | // Settings won't appear without this timeout. Using this hack until something better appears. 46 | setKeymaps(shadowRoot); 47 | appendSettings(shadowRoot); 48 | style(shadowRoot); 49 | }, 1); 50 | } 51 | -------------------------------------------------------------------------------- /ui/src/lib/CustomMenu.svelte: -------------------------------------------------------------------------------- 1 | 40 | 41 |
42 | 43 | 46 | 73 | 74 |
75 | 76 | 82 | -------------------------------------------------------------------------------- /ui/src/lib/picker-shadow-styles.css: -------------------------------------------------------------------------------- 1 | #custom-settings, 2 | #custom-settings button { 3 | display: flex; 4 | justify-items: center; 5 | align-items: center; 6 | } 7 | 8 | #custom-settings { 9 | position: relative; 10 | margin: 0 12px; 11 | } 12 | 13 | /* `menu` ^= emoji-picker class */ 14 | #custom-settings .menu { 15 | right: -4px; 16 | top: 26px; 17 | } 18 | 19 | #custom-settings .menu.open { 20 | animation: scaleIn 0.15s ease forwards; 21 | } 22 | 23 | #custom-settings .menu.close { 24 | animation: scaleOut 0.15s ease forwards; 25 | } 26 | 27 | #custom-settings__menu-btn svg { 28 | width: auto; 29 | height: auto; 30 | color: var(--color-b); 31 | transition: color 0.15s; 32 | } 33 | 34 | #custom-settings__menu-btn:hover svg, 35 | #custom-settings__menu-btn.open svg { 36 | color: var(--color-a); 37 | } 38 | 39 | #search-keys { 40 | position: absolute; 41 | top: 0; 42 | right: 0; 43 | opacity: 0.5; 44 | height: 100%; 45 | display: flex; 46 | justify-content: right; 47 | align-items: center; 48 | transition: opacity 0.15s; 49 | } 50 | 51 | #search-keys.hide { 52 | opacity: 0; 53 | } 54 | 55 | #search-keys div { 56 | margin-right: 10px; 57 | } 58 | 59 | #search-keys kbd { 60 | margin-right: 2px; 61 | padding: 2px; 62 | font-size: 0.825em; 63 | background-color: rgb(var(--rgb-background)); 64 | border: 1px solid var(--color-hover); 65 | border-radius: 3px; 66 | } 67 | 68 | /* Customize emoji-picker's classes */ 69 | 70 | @media (prefers-color-scheme: dark) { 71 | #nav { 72 | background-color: rgb(var(--rgb-background-secondary)); 73 | } 74 | 75 | #nav:before, 76 | #preview:before { 77 | height: 1px; 78 | } 79 | 80 | .search input[type='search'] { 81 | background-color: rgb(var(--rgb-background-secondary)); 82 | box-shadow: inset 0 0 0 1px rgb(var(--rgb-input)), 0 1px 3px rgba(65, 69, 73, 0.2); 83 | } 84 | 85 | .search input[type='search']:focus { 86 | box-shadow: inset 0 0 0 1px rgb(var(--rgb-accent-secondary)), 0 1px 3px rgba(65, 69, 73, 0.2); 87 | } 88 | 89 | .category button .background { 90 | background: var(--color-hover); 91 | } 92 | 93 | .menu .option:hover { 94 | background-color: var(--color-hover); 95 | } 96 | 97 | .scroll::-webkit-scrollbar-thumb, 98 | .scroll:hover::-webkit-scrollbar-thumb { 99 | background-color: rgb(var(--rgb-background-tertiary)); 100 | } 101 | 102 | .scroll::-webkit-scrollbar-thumb:hover { 103 | background-color: var(--color-hover) !important; 104 | } 105 | } 106 | 107 | .category button:active .background, 108 | .category button.keyboard-active .background { 109 | background: rgb(var(--rgb-accent)); 110 | } 111 | 112 | .category button.keyboard-active .background { 113 | transition: background-color 0.15s; 114 | } 115 | 116 | @keyframes scaleIn { 117 | from { 118 | transform: scale(0.85); 119 | transform-origin: top right; 120 | opacity: 0; 121 | } 122 | to { 123 | transform: scale(1); 124 | opacity: 1; 125 | } 126 | } 127 | @keyframes scaleOut { 128 | from { 129 | transform: scale(1); 130 | opacity: 1; 131 | } 132 | to { 133 | transform: scale(0.95); 134 | opacity: 0; 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /.github/workflows/macos.yml: -------------------------------------------------------------------------------- 1 | name: macOS 2 | 3 | on: 4 | workflow_call: 5 | 6 | env: 7 | REPO_NAME: ${{ github.event.repository.name }} 8 | 9 | jobs: 10 | setup: 11 | runs-on: macos-latest 12 | defaults: 13 | run: 14 | working-directory: ${{ env.REPO_NAME }} 15 | steps: 16 | - name: Checkout ${{ env.REPO_NAME }} 17 | uses: actions/checkout@v4 18 | with: 19 | path: ${{ env.REPO_NAME }} 20 | - name: Checkout V 21 | uses: actions/checkout@v4 22 | with: 23 | repository: 'vlang/v' 24 | path: vlang 25 | - name: Setup V 26 | run: cd ../vlang && make -j4 && ./v symlink && v version 27 | - name: Setup modules 28 | run: | 29 | v install 30 | ~/.vmodules/webview/build.vsh --silent 31 | - name: Cache 32 | uses: actions/cache/save@v3 33 | with: 34 | path: | 35 | vlang 36 | ~/.vmodules 37 | key: ${{ runner.os }}-${{ github.sha }} 38 | 39 | build: 40 | needs: setup 41 | runs-on: macos-latest 42 | defaults: 43 | run: 44 | working-directory: ${{ env.REPO_NAME }} 45 | steps: 46 | - name: Checkout ${{ env.REPO_NAME }} 47 | uses: actions/checkout@v4 48 | with: 49 | path: ${{ env.REPO_NAME }} 50 | - name: Restore cache 51 | uses: actions/cache/restore@v3 52 | with: 53 | path: | 54 | vlang 55 | ~/.vmodules 56 | key: ${{ runner.os }}-${{ github.sha }} 57 | fail-on-cache-miss: true 58 | - name: Setup V 59 | run: ../vlang/v symlink && v version 60 | - name: Build 61 | run: v -cg . 62 | 63 | deploy: 64 | needs: build 65 | runs-on: macos-latest 66 | permissions: 67 | contents: write 68 | defaults: 69 | run: 70 | working-directory: ${{ env.REPO_NAME }} 71 | env: 72 | ARTIFACT: emoji-mart-macos-amd64 73 | steps: 74 | - name: Checkout ${{ env.REPO_NAME }} 75 | uses: actions/checkout@v4 76 | with: 77 | path: ${{ env.REPO_NAME }} 78 | - name: Restore cache 79 | uses: actions/cache/restore@v3 80 | with: 81 | path: | 82 | vlang 83 | ~/.vmodules 84 | key: ${{ runner.os }}-${{ github.sha }} 85 | fail-on-cache-miss: true 86 | - name: Setup V 87 | run: ../vlang/v symlink && v version 88 | - name: Prepare deployment build 89 | run: | 90 | curl -sSLo lvb https://github.com/ttytm/LVbag/releases/latest/download/lvb-macos-amd64 91 | sudo chmod +x ./lvb 92 | ./lvb --version 93 | git fetch --prune --unshallow 94 | - name: Build 95 | run: ./build.vsh 96 | - name: Prepare artifacts 97 | run: mv "dist/emoji-mart" ./$ARTIFACT 98 | - name: Upload binary artifact 99 | uses: actions/upload-artifact@v3 100 | with: 101 | name: ${{ env.ARTIFACT }} 102 | path: ${{ env.REPO_NAME }}/${{ env.ARTIFACT }} 103 | - name: Release 104 | if: github.ref_type == 'tag' 105 | uses: softprops/action-gh-release@v1 106 | with: 107 | files: ${{ env.REPO_NAME }}/${{ env.ARTIFACT }} 108 | -------------------------------------------------------------------------------- /.github/workflows/windows.yml: -------------------------------------------------------------------------------- 1 | name: Windows 2 | 3 | on: 4 | workflow_call: 5 | 6 | env: 7 | REPO_NAME: ${{ github.event.repository.name }} 8 | 9 | jobs: 10 | setup: 11 | runs-on: windows-latest 12 | defaults: 13 | run: 14 | working-directory: ${{ env.REPO_NAME }} 15 | steps: 16 | - name: Checkout ${{ env.REPO_NAME }} 17 | uses: actions/checkout@v4 18 | with: 19 | path: ${{ env.REPO_NAME }} 20 | - name: Checkout V 21 | uses: actions/checkout@v4 22 | with: 23 | repository: 'vlang/v' 24 | path: vlang 25 | - name: Setup V 26 | run: cd ../vlang && ./make.bat && ./v symlink 27 | - name: Setup modules 28 | run: | 29 | $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 30 | v install 31 | v $HOME/.vmodules/webview/build.vsh --silent 32 | - name: Cache 33 | uses: actions/cache/save@v3 34 | with: 35 | path: | 36 | vlang 37 | ~/.vmodules 38 | key: ${{ runner.os }}-${{ github.sha }} 39 | 40 | build: 41 | needs: setup 42 | runs-on: windows-latest 43 | defaults: 44 | run: 45 | working-directory: ${{ env.REPO_NAME }} 46 | steps: 47 | - name: Checkout ${{ env.REPO_NAME }} 48 | uses: actions/checkout@v4 49 | with: 50 | path: ${{ env.REPO_NAME }} 51 | - name: Restore Cache 52 | uses: actions/cache/restore@v3 53 | with: 54 | path: | 55 | vlang 56 | ~/.vmodules 57 | key: ${{ runner.os }}-${{ github.sha }} 58 | fail-on-cache-miss: true 59 | - name: Build 60 | run: ../vlang/v -cg -cc gcc . 61 | 62 | deploy: 63 | needs: build 64 | runs-on: windows-latest 65 | permissions: 66 | contents: write 67 | env: 68 | ARTIFACT: emoji-mart-windows-amd64.exe 69 | defaults: 70 | run: 71 | shell: bash # run in bash so that deployment works 72 | steps: 73 | - name: Restore Cache 74 | uses: actions/cache/restore@v3 75 | with: 76 | path: | 77 | vlang 78 | ~/.vmodules 79 | key: ${{ runner.os }}-${{ github.sha }} 80 | fail-on-cache-miss: true 81 | # Use vlang/setup action, as restoring V from cache and using it with a different shell was causing problems. 82 | - name: Install V 83 | uses: vlang/setup-v@v1.3 84 | with: 85 | check-latest: true 86 | - name: Checkout ${{ env.REPO_NAME }} 87 | uses: actions/checkout@v4 88 | - name: Prepare deployment build 89 | run: | 90 | curl -sSLo lvb.exe https://github.com/ttytm/LVbag/releases/latest/download/lvb-windows-amd64.exe 91 | ./lvb --version 92 | git fetch --prune --unshallow 93 | - name: Build 94 | run: ./build.vsh 95 | - name: Prepare artifacts 96 | run: | 97 | find dist/ 98 | mv "dist/emoji-mart.exe" ./$ARTIFACT 99 | - name: Upload binary artifact 100 | uses: actions/upload-artifact@v3 101 | with: 102 | name: ${{ env.ARTIFACT }} 103 | path: ${{ env.ARTIFACT }} 104 | - name: Release 105 | if: github.ref_type == 'tag' 106 | uses: softprops/action-gh-release@v1 107 | with: 108 | files: ${{ env.ARTIFACT }} 109 | -------------------------------------------------------------------------------- /.github/workflows/linux.yml: -------------------------------------------------------------------------------- 1 | name: Linux 2 | 3 | on: 4 | workflow_call: 5 | 6 | env: 7 | REPO_NAME: ${{ github.event.repository.name }} 8 | 9 | jobs: 10 | setup: 11 | runs-on: ubuntu-latest 12 | defaults: 13 | run: 14 | working-directory: ${{ env.REPO_NAME }} 15 | steps: 16 | - name: Checkout ${{ env.REPO_NAME }} 17 | uses: actions/checkout@v4 18 | with: 19 | path: ${{ env.REPO_NAME }} 20 | - name: Setup Dependencies 21 | uses: awalsh128/cache-apt-pkgs-action@latest 22 | with: 23 | packages: libgtk-3-dev libwebkit2gtk-4.0-dev 24 | version: 1.0 25 | - name: Checkout V 26 | uses: actions/checkout@v4 27 | with: 28 | repository: 'vlang/v' 29 | path: vlang 30 | - name: Setup V 31 | run: cd ../vlang && make -j4 && ./v symlink && v version 32 | - name: Setup modules 33 | run: | 34 | v install 35 | ~/.vmodules/webview/build.vsh --silent 36 | - name: Cache 37 | uses: actions/cache/save@v3 38 | with: 39 | path: | 40 | vlang 41 | ~/.vmodules 42 | key: ${{ runner.os }}-${{ github.sha }} 43 | 44 | lint: 45 | needs: setup 46 | uses: ./.github/workflows/lint.yml 47 | 48 | build: 49 | needs: setup 50 | runs-on: ubuntu-latest 51 | strategy: 52 | matrix: 53 | cc: [tcc, gcc, clang] 54 | flag: ['', '-W -cstrict'] 55 | exclude: 56 | - cc: clang 57 | flag: '-W -cstrict' 58 | - cc: tcc 59 | flag: '-W -cstrict' 60 | fail-fast: false 61 | env: 62 | VFLAGS: -cg -cc ${{ matrix.cc }} ${{ matrix.flag }} 63 | defaults: 64 | run: 65 | working-directory: ${{ env.REPO_NAME }} 66 | steps: 67 | - name: Checkout ${{ env.REPO_NAME }} 68 | uses: actions/checkout@v4 69 | with: 70 | path: ${{ env.REPO_NAME }} 71 | - name: Restore cache 72 | uses: actions/cache/restore@v3 73 | with: 74 | path: | 75 | vlang 76 | ~/.vmodules 77 | key: ${{ runner.os }}-${{ github.sha }} 78 | fail-on-cache-miss: true 79 | - name: Setup V 80 | run: ../vlang/v symlink && v version 81 | - name: Setup dependencies 82 | if: runner.os == 'Linux' 83 | uses: awalsh128/cache-apt-pkgs-action@latest 84 | with: 85 | packages: libgtk-3-dev libwebkit2gtk-4.0-dev 86 | version: 1.0 87 | - name: Build 88 | run: v . 89 | 90 | deploy: 91 | needs: build 92 | runs-on: ubuntu-latest 93 | defaults: 94 | run: 95 | working-directory: ${{ env.REPO_NAME }} 96 | permissions: 97 | contents: write 98 | env: 99 | ARTIFACT: emoji-mart-linux-amd64 100 | APPIMAGE_ARTIFACT: emoji-mart-ubuntu-amd64.AppImage 101 | steps: 102 | - name: Checkout ${{ env.REPO_NAME }} 103 | uses: actions/checkout@v4 104 | with: 105 | path: ${{ env.REPO_NAME }} 106 | - name: Restore cache 107 | uses: actions/cache/restore@v3 108 | with: 109 | path: | 110 | vlang 111 | ~/.vmodules 112 | key: ${{ runner.os }}-${{ github.sha }} 113 | fail-on-cache-miss: true 114 | - name: Setup V 115 | run: ../vlang/v symlink && v version 116 | - name: Setup dependencies 117 | uses: awalsh128/cache-apt-pkgs-action@latest 118 | with: 119 | packages: libgtk-3-dev libwebkit2gtk-4.0-dev libfuse2 120 | version: 1.0 121 | - name: Prepare deployment build 122 | run: | 123 | curl -sSLo /usr/local/bin/appimage-builder https://github.com/AppImageCrafters/appimage-builder/releases/latest/download/appimage-builder-1.1.0-x86_64.AppImage 124 | curl -sSLo ./lvb https://github.com/ttytm/LVbag/releases/latest/download/lvb-linux-amd64 125 | sudo chmod +x /usr/local/bin/appimage-builder 126 | sudo chmod +x ./lvb 127 | ./lvb --version 128 | appimage-builder --version 129 | git fetch --prune --unshallow 130 | - name: Build 131 | run: | 132 | ./build.vsh 133 | ./build.vsh --appimage --skip-ui --skip-bin 134 | - name: Prepare artifacts 135 | run: | 136 | mv "dist/emoji-mart" ./$ARTIFACT 137 | mv "dist/appimage/Emoji Mart-latest-x86_64.AppImage" ./$APPIMAGE_ARTIFACT 138 | - name: Upload binary artifact 139 | uses: actions/upload-artifact@v3 140 | with: 141 | name: ${{ env.ARTIFACT }} 142 | path: ${{ env.REPO_NAME }}/${{ env.ARTIFACT }} 143 | - name: Upload appimage artifact 144 | uses: actions/upload-artifact@v3 145 | with: 146 | name: ${{ env.APPIMAGE_ARTIFACT }} 147 | path: ${{ env.REPO_NAME }}/${{ env.APPIMAGE_ARTIFACT }} 148 | - name: Release 149 | if: github.ref_type == 'tag' 150 | uses: softprops/action-gh-release@v1 151 | with: 152 | files: | 153 | ${{ env.REPO_NAME }}/assets/emoji-mart.desktop 154 | ${{ env.REPO_NAME }}/${{ env.ARTIFACT }} 155 | ${{ env.REPO_NAME }}/${{ env.APPIMAGE_ARTIFACT }} 156 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Emoji Mart Desktop App 2 | 3 | An emoji picker desktop application - it serves as an example of using [webview](https://github.com/ttytm/webview) with a modern web framework. 4 | Nonetheless, it is a real and capable application, and nothing should stop you from simply using it. 5 | 6 | ## Contents 7 | 8 | - [Application / Usage](#application--usage) 9 | - [Installation](#installation) 10 | - [Config](#config) 11 | - [Webview Example / Building and Development](#webview-example--building-and-development) 12 | - [Preparation](#preparation) 13 | - [Building](#building) 14 | - [Building and Running in a Development Context](#building-and-running-in-a-development-context) 15 | - [Credits](#credits) 16 | 17 | ## Application / Usage 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 29 | 32 | 35 | 36 | 37 | 40 | 43 | 46 |
LinuxWindowsmacOS
27 | 28 | 30 | 31 | 33 | 34 |
38 | 39 | 41 | 42 | 44 | 45 |
47 | 48 | ### Installation 49 | 50 | - The projects [GitHub releases page](https://github.com/ttytm/emoji-mart-desktop/releases) provides prebuilt binaries for GNU/Linux, Windows and macOS. 51 | 52 | ### Config 53 | 54 | Config values that are set via the in-app menu are saved for the next run. 55 | 56 | ```toml 57 | # Lin: ~/.config/emoji-mart/ 58 | # Mac: ~/Library/Application Support/emoji-mart/ 59 | # Win: %USERPROFILE%/AppData/Roaming/emoji-mart/ 60 | 61 | # Default values 62 | audio = true # enable audio hint on emoji-selection 63 | frequent = true # display frequently used emojis 64 | ``` 65 | 66 | ## Webview Example / Building and Development 67 | 68 | ### Preparation 69 | 70 | - V - [Installing V from source](https://github.com/vlang/v#installing-v-from-source) 71 | 72 | - npm - [npm/cli](https://github.com/npm/cli) 73 | 74 | - emoji-mart-desktop 75 | 76 | ```sh 77 | # Clone the repisitory 78 | git clone https://github.com/ttytm/emoji-mart-desktop.git 79 | cd emoji-mart-desktop 80 | # Install dependencies 81 | v install --once 82 | 83 | # If you haven't used it before, prepare the webview library. 84 | # Linux/macOS 85 | ~/.vmodules/webview/build.vsh 86 | # Windows PowerShell 87 | v $HOME/.vmodules/webview/build.vsh 88 | ``` 89 | 90 | ### Building 91 | 92 | If you just want to build the application for usage you can now run `./build.vsh`. 93 | 94 | - The `dist/` directory will contain the build output. 95 | 96 | ### Building and Running in a Development Context 97 | 98 | Since we use web technologies for the UI, a good part of the frontend-work can likely be done via the browser, just like working on a regular web application. 99 | However, there comes a point where we want to connect our V program and the UI. 100 | 101 | #### Example 1 - run a vite dev server and connect to it 102 | 103 | When connecting to a vite dev server features like hot reloading are preserved. 104 | Just like in the browser most changes on the UI will be immediately reflected in the application window. 105 | 106 | - Run the app with the `dev` flag - this runs a vite dev server and connects to its localhost instance 107 | 108 | ```sh 109 | # Install the node modules beforehand if it's the first run. 110 | npm i --prefix ui/ 111 | ``` 112 | 113 | ```sh 114 | v -d dev run . 115 | ``` 116 | 117 | ```sh 118 | # On Windows, it is recommended to use `gcc` for compilation. 119 | v -cc gcc -d dev run . 120 | ``` 121 | 122 | #### Example 2 - serve the prebuilt site 123 | 124 | This is the regular build approach and how our final app is working. 125 | 126 | - Build the UI - this uses SvelteKit as a static site generator 127 | 128 | ```sh 129 | # Install the node modules beforehand if it's the first run. 130 | npm i --prefix ui/ 131 | ``` 132 | 133 | ```sh 134 | npm run build --prefix ui/ 135 | ``` 136 | 137 | - Run the app - this uses vweb to serve the previously build files locally and connect to it via webview 138 | 139 | ```sh 140 | v run . 141 | ``` 142 | 143 | ```sh 144 | # Windows 145 | v -cc gcc run . 146 | ``` 147 | 148 |
149 | 150 | I hope this quick start guide and the examples in the repositories source code help on the way to release your own UI project. 151 | 152 | ## Related Projects 153 | 154 | - [webview](https://github.com/ttytm/webview) - V module that allows to create a system level application, while using modern web technologies for the UI. 155 | - [LVbag](https://github.com/ttytm/LVbag) - CLI tool to generate embedded file lists. 156 | 157 | ## Credits 158 | 159 | - The app uses on the great work of [missive/emoji-mart](https://github.com/missive/emoji-mart) 160 | - The icon used for the AppImage comes from [microsoft/fluentui-emoji](https://github.com/microsoft/fluentui-emoji) 161 | -------------------------------------------------------------------------------- /ui/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui-", 3 | "version": "0.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "ui-", 9 | "version": "0.0.1", 10 | "dependencies": { 11 | "@emoji-mart/data": "^1.1.2", 12 | "emoji-mart": "^5.5.2" 13 | }, 14 | "devDependencies": { 15 | "@iconify/svelte": "^3.1.4", 16 | "@sveltejs/adapter-auto": "^2.0.0", 17 | "@sveltejs/adapter-static": "^2.0.2", 18 | "@sveltejs/kit": "^1.20.4", 19 | "prettier": "^2.8.0", 20 | "prettier-plugin-svelte": "^2.10.1", 21 | "svelte": "^4.0.5", 22 | "svelte-check": "^3.4.3", 23 | "svelte-popover": "^2.0.8", 24 | "tslib": "^2.4.1", 25 | "typescript": "^5.0.0", 26 | "vite": "^4.4.2" 27 | } 28 | }, 29 | "node_modules/@ampproject/remapping": { 30 | "version": "2.2.1", 31 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", 32 | "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", 33 | "dev": true, 34 | "dependencies": { 35 | "@jridgewell/gen-mapping": "^0.3.0", 36 | "@jridgewell/trace-mapping": "^0.3.9" 37 | }, 38 | "engines": { 39 | "node": ">=6.0.0" 40 | } 41 | }, 42 | "node_modules/@emoji-mart/data": { 43 | "version": "1.1.2", 44 | "resolved": "https://registry.npmjs.org/@emoji-mart/data/-/data-1.1.2.tgz", 45 | "integrity": "sha512-1HP8BxD2azjqWJvxIaWAMyTySeZY0Osr83ukYjltPVkNXeJvTz7yDrPLBtnrD5uqJ3tg4CcLuuBW09wahqL/fg==" 46 | }, 47 | "node_modules/@esbuild/android-arm": { 48 | "version": "0.18.18", 49 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.18.tgz", 50 | "integrity": "sha512-oBymf7ZwplAawSxmiSlBCf+FMcY0f4bs5QP2jn43JKUf0M9DnrUTjqa5RvFPl1elw+sMfcpfBRPK+rb+E1q7zg==", 51 | "cpu": [ 52 | "arm" 53 | ], 54 | "dev": true, 55 | "optional": true, 56 | "os": [ 57 | "android" 58 | ], 59 | "engines": { 60 | "node": ">=12" 61 | } 62 | }, 63 | "node_modules/@esbuild/android-arm64": { 64 | "version": "0.18.18", 65 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.18.tgz", 66 | "integrity": "sha512-dkAPYzRHq3dNXIzOyAknYOzsx8o3KWaNiuu56B2rP9IFPmFWMS58WQcTlUQi6iloku8ZyHHMluCe5sTWhKq/Yw==", 67 | "cpu": [ 68 | "arm64" 69 | ], 70 | "dev": true, 71 | "optional": true, 72 | "os": [ 73 | "android" 74 | ], 75 | "engines": { 76 | "node": ">=12" 77 | } 78 | }, 79 | "node_modules/@esbuild/android-x64": { 80 | "version": "0.18.18", 81 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.18.tgz", 82 | "integrity": "sha512-r7/pVcrUQMYkjvtE/1/n6BxhWM+/9tvLxDG1ev1ce4z3YsqoxMK9bbOM6bFcj0BowMeGQvOZWcBV182lFFKmrw==", 83 | "cpu": [ 84 | "x64" 85 | ], 86 | "dev": true, 87 | "optional": true, 88 | "os": [ 89 | "android" 90 | ], 91 | "engines": { 92 | "node": ">=12" 93 | } 94 | }, 95 | "node_modules/@esbuild/darwin-arm64": { 96 | "version": "0.18.18", 97 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.18.tgz", 98 | "integrity": "sha512-MSe2iV9MAH3wfP0g+vzN9bp36rtPPuCSk+bT5E2vv/d8krvW5uB/Pi/Q5+txUZuxsG3GcO8dhygjnFq0wJU9hQ==", 99 | "cpu": [ 100 | "arm64" 101 | ], 102 | "dev": true, 103 | "optional": true, 104 | "os": [ 105 | "darwin" 106 | ], 107 | "engines": { 108 | "node": ">=12" 109 | } 110 | }, 111 | "node_modules/@esbuild/darwin-x64": { 112 | "version": "0.18.18", 113 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.18.tgz", 114 | "integrity": "sha512-ARFYISOWkaifjcr48YtO70gcDNeOf1H2RnmOj6ip3xHIj66f3dAbhcd5Nph5np6oHI7DhHIcr9MWO18RvUL1bw==", 115 | "cpu": [ 116 | "x64" 117 | ], 118 | "dev": true, 119 | "optional": true, 120 | "os": [ 121 | "darwin" 122 | ], 123 | "engines": { 124 | "node": ">=12" 125 | } 126 | }, 127 | "node_modules/@esbuild/freebsd-arm64": { 128 | "version": "0.18.18", 129 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.18.tgz", 130 | "integrity": "sha512-BHnXmexzEWRU2ZySJosU0Ts0NRnJnNrMB6t4EiIaOSel73I8iLsNiTPLH0rJulAh19cYZutsB5XHK6N8fi5eMg==", 131 | "cpu": [ 132 | "arm64" 133 | ], 134 | "dev": true, 135 | "optional": true, 136 | "os": [ 137 | "freebsd" 138 | ], 139 | "engines": { 140 | "node": ">=12" 141 | } 142 | }, 143 | "node_modules/@esbuild/freebsd-x64": { 144 | "version": "0.18.18", 145 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.18.tgz", 146 | "integrity": "sha512-n823w35wm0ZOobbuE//0sJjuz1Qj619+AwjgOcAJMN2pomZhH9BONCtn+KlfrmM/NWZ+27yB/eGVFzUIWLeh3w==", 147 | "cpu": [ 148 | "x64" 149 | ], 150 | "dev": true, 151 | "optional": true, 152 | "os": [ 153 | "freebsd" 154 | ], 155 | "engines": { 156 | "node": ">=12" 157 | } 158 | }, 159 | "node_modules/@esbuild/linux-arm": { 160 | "version": "0.18.18", 161 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.18.tgz", 162 | "integrity": "sha512-Kck3jxPLQU4VeAGwe8Q4NU+IWIx+suULYOFUI9T0C2J1+UQlOHJ08ITN+MaJJ+2youzJOmKmcphH/t3SJxQ1Tw==", 163 | "cpu": [ 164 | "arm" 165 | ], 166 | "dev": true, 167 | "optional": true, 168 | "os": [ 169 | "linux" 170 | ], 171 | "engines": { 172 | "node": ">=12" 173 | } 174 | }, 175 | "node_modules/@esbuild/linux-arm64": { 176 | "version": "0.18.18", 177 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.18.tgz", 178 | "integrity": "sha512-zANxnwF0sCinDcAqoMohGoWBK9QaFJ65Vgh0ZE+RXtURaMwx+RfmfLElqtnn7X8OYNckMoIXSg7u+tZ3tqTlrA==", 179 | "cpu": [ 180 | "arm64" 181 | ], 182 | "dev": true, 183 | "optional": true, 184 | "os": [ 185 | "linux" 186 | ], 187 | "engines": { 188 | "node": ">=12" 189 | } 190 | }, 191 | "node_modules/@esbuild/linux-ia32": { 192 | "version": "0.18.18", 193 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.18.tgz", 194 | "integrity": "sha512-+VHz2sIRlY5u8IlaLJpdf5TL2kM76yx186pW7bpTB+vLWpzcFQVP04L842ZB2Ty13A1VXUvy3DbU1jV65P2skg==", 195 | "cpu": [ 196 | "ia32" 197 | ], 198 | "dev": true, 199 | "optional": true, 200 | "os": [ 201 | "linux" 202 | ], 203 | "engines": { 204 | "node": ">=12" 205 | } 206 | }, 207 | "node_modules/@esbuild/linux-loong64": { 208 | "version": "0.18.18", 209 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.18.tgz", 210 | "integrity": "sha512-fXPEPdeGBvguo/1+Na8OIWz3667BN1cwbGtTEZWTd0qdyTsk5gGf9jVX8MblElbDb/Cpw6y5JiaQuL96YmvBwQ==", 211 | "cpu": [ 212 | "loong64" 213 | ], 214 | "dev": true, 215 | "optional": true, 216 | "os": [ 217 | "linux" 218 | ], 219 | "engines": { 220 | "node": ">=12" 221 | } 222 | }, 223 | "node_modules/@esbuild/linux-mips64el": { 224 | "version": "0.18.18", 225 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.18.tgz", 226 | "integrity": "sha512-dLvRB87pIBIRnEIC32LIcgwK1JzlIuADIRjLKdUIpxauKwMuS/xMpN+cFl+0nN4RHNYOZ57DmXFFmQAcdlFOmw==", 227 | "cpu": [ 228 | "mips64el" 229 | ], 230 | "dev": true, 231 | "optional": true, 232 | "os": [ 233 | "linux" 234 | ], 235 | "engines": { 236 | "node": ">=12" 237 | } 238 | }, 239 | "node_modules/@esbuild/linux-ppc64": { 240 | "version": "0.18.18", 241 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.18.tgz", 242 | "integrity": "sha512-fRChqIJZ7hLkXSKfBLYgsX9Ssb5OGCjk3dzCETF5QSS1qjTgayLv0ALUdJDB9QOh/nbWwp+qfLZU6md4XcjL7w==", 243 | "cpu": [ 244 | "ppc64" 245 | ], 246 | "dev": true, 247 | "optional": true, 248 | "os": [ 249 | "linux" 250 | ], 251 | "engines": { 252 | "node": ">=12" 253 | } 254 | }, 255 | "node_modules/@esbuild/linux-riscv64": { 256 | "version": "0.18.18", 257 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.18.tgz", 258 | "integrity": "sha512-ALK/BT3u7Hoa/vHjow6W6+MKF0ohYcVcVA1EpskI4bkBPVuDLrUDqt2YFifg5UcZc8qup0CwQqWmFUd6VMNgaA==", 259 | "cpu": [ 260 | "riscv64" 261 | ], 262 | "dev": true, 263 | "optional": true, 264 | "os": [ 265 | "linux" 266 | ], 267 | "engines": { 268 | "node": ">=12" 269 | } 270 | }, 271 | "node_modules/@esbuild/linux-s390x": { 272 | "version": "0.18.18", 273 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.18.tgz", 274 | "integrity": "sha512-crT7jtOXd9iirY65B+mJQ6W0HWdNy8dtkZqKGWNcBnunpLcTCfne5y5bKic9bhyYzKpQEsO+C/VBPD8iF0RhRw==", 275 | "cpu": [ 276 | "s390x" 277 | ], 278 | "dev": true, 279 | "optional": true, 280 | "os": [ 281 | "linux" 282 | ], 283 | "engines": { 284 | "node": ">=12" 285 | } 286 | }, 287 | "node_modules/@esbuild/linux-x64": { 288 | "version": "0.18.18", 289 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.18.tgz", 290 | "integrity": "sha512-/NSgghjBOW9ELqjXDYxOCCIsvQUZpvua1/6NdnA9Vnrp9UzEydyDdFXljUjMMS9p5KxMzbMO9frjHYGVHBfCHg==", 291 | "cpu": [ 292 | "x64" 293 | ], 294 | "dev": true, 295 | "optional": true, 296 | "os": [ 297 | "linux" 298 | ], 299 | "engines": { 300 | "node": ">=12" 301 | } 302 | }, 303 | "node_modules/@esbuild/netbsd-x64": { 304 | "version": "0.18.18", 305 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.18.tgz", 306 | "integrity": "sha512-8Otf05Vx5sZjLLDulgr5QS5lsWXMplKZEyHMArH9/S4olLlhzmdhQBPhzhJTNwaL2FJNdWcUPNGAcoD5zDTfUA==", 307 | "cpu": [ 308 | "x64" 309 | ], 310 | "dev": true, 311 | "optional": true, 312 | "os": [ 313 | "netbsd" 314 | ], 315 | "engines": { 316 | "node": ">=12" 317 | } 318 | }, 319 | "node_modules/@esbuild/openbsd-x64": { 320 | "version": "0.18.18", 321 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.18.tgz", 322 | "integrity": "sha512-tFiFF4kT5L5qhVrWJUNxEXWvvX8nK/UX9ZrB7apuTwY3f6+Xy4aFMBPwAVrBYtBd5MOUuyOVHK6HBZCAHkwUlw==", 323 | "cpu": [ 324 | "x64" 325 | ], 326 | "dev": true, 327 | "optional": true, 328 | "os": [ 329 | "openbsd" 330 | ], 331 | "engines": { 332 | "node": ">=12" 333 | } 334 | }, 335 | "node_modules/@esbuild/sunos-x64": { 336 | "version": "0.18.18", 337 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.18.tgz", 338 | "integrity": "sha512-MPogVV8Bzh8os4OM+YDGGsSzCzmNRiyKGtHoJyZLtI4BMmd6EcxmGlcEGK1uM46h1BiOyi7Z7teUtzzQhvkC+w==", 339 | "cpu": [ 340 | "x64" 341 | ], 342 | "dev": true, 343 | "optional": true, 344 | "os": [ 345 | "sunos" 346 | ], 347 | "engines": { 348 | "node": ">=12" 349 | } 350 | }, 351 | "node_modules/@esbuild/win32-arm64": { 352 | "version": "0.18.18", 353 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.18.tgz", 354 | "integrity": "sha512-YKD6LF/XXY9REu+ZL5RAsusiG48n602qxsMVh/E8FFD9hp4OyTQaL9fpE1ovxwQXqFio+tT0ITUGjDSSSPN13w==", 355 | "cpu": [ 356 | "arm64" 357 | ], 358 | "dev": true, 359 | "optional": true, 360 | "os": [ 361 | "win32" 362 | ], 363 | "engines": { 364 | "node": ">=12" 365 | } 366 | }, 367 | "node_modules/@esbuild/win32-ia32": { 368 | "version": "0.18.18", 369 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.18.tgz", 370 | "integrity": "sha512-NjSBmBsyZBTsZB6ga6rA6PfG/RHnwruUz/9YEVXcm4STGauFWvhYhOMhEyw1yU5NVgYYm8CH5AltCm77TS21/Q==", 371 | "cpu": [ 372 | "ia32" 373 | ], 374 | "dev": true, 375 | "optional": true, 376 | "os": [ 377 | "win32" 378 | ], 379 | "engines": { 380 | "node": ">=12" 381 | } 382 | }, 383 | "node_modules/@esbuild/win32-x64": { 384 | "version": "0.18.18", 385 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.18.tgz", 386 | "integrity": "sha512-eTSg/gC3p3tdjj4roDhe5xu94l1s2jMazP8u2FsYO8SEKvSpPOO71EucprDn/IuErDPvTFUhV9lTw5z5WJCRKQ==", 387 | "cpu": [ 388 | "x64" 389 | ], 390 | "dev": true, 391 | "optional": true, 392 | "os": [ 393 | "win32" 394 | ], 395 | "engines": { 396 | "node": ">=12" 397 | } 398 | }, 399 | "node_modules/@iconify/svelte": { 400 | "version": "3.1.4", 401 | "resolved": "https://registry.npmjs.org/@iconify/svelte/-/svelte-3.1.4.tgz", 402 | "integrity": "sha512-YDwQlN46ka8KPRayDb7TivmkAPizfTXi6BSRNqa1IV0+byA907n8JcgQafA7FD//pW5XCuuAhVx6uRbKTo+CfA==", 403 | "dev": true, 404 | "dependencies": { 405 | "@iconify/types": "^2.0.0" 406 | }, 407 | "funding": { 408 | "url": "https://github.com/sponsors/cyberalien" 409 | }, 410 | "peerDependencies": { 411 | "svelte": "*" 412 | } 413 | }, 414 | "node_modules/@iconify/types": { 415 | "version": "2.0.0", 416 | "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", 417 | "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", 418 | "dev": true 419 | }, 420 | "node_modules/@jridgewell/gen-mapping": { 421 | "version": "0.3.3", 422 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", 423 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", 424 | "dev": true, 425 | "dependencies": { 426 | "@jridgewell/set-array": "^1.0.1", 427 | "@jridgewell/sourcemap-codec": "^1.4.10", 428 | "@jridgewell/trace-mapping": "^0.3.9" 429 | }, 430 | "engines": { 431 | "node": ">=6.0.0" 432 | } 433 | }, 434 | "node_modules/@jridgewell/resolve-uri": { 435 | "version": "3.1.0", 436 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 437 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 438 | "dev": true, 439 | "engines": { 440 | "node": ">=6.0.0" 441 | } 442 | }, 443 | "node_modules/@jridgewell/set-array": { 444 | "version": "1.1.2", 445 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 446 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 447 | "dev": true, 448 | "engines": { 449 | "node": ">=6.0.0" 450 | } 451 | }, 452 | "node_modules/@jridgewell/sourcemap-codec": { 453 | "version": "1.4.15", 454 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 455 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 456 | "dev": true 457 | }, 458 | "node_modules/@jridgewell/trace-mapping": { 459 | "version": "0.3.18", 460 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", 461 | "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", 462 | "dev": true, 463 | "dependencies": { 464 | "@jridgewell/resolve-uri": "3.1.0", 465 | "@jridgewell/sourcemap-codec": "1.4.14" 466 | } 467 | }, 468 | "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { 469 | "version": "1.4.14", 470 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 471 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 472 | "dev": true 473 | }, 474 | "node_modules/@nodelib/fs.scandir": { 475 | "version": "2.1.5", 476 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 477 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 478 | "dev": true, 479 | "dependencies": { 480 | "@nodelib/fs.stat": "2.0.5", 481 | "run-parallel": "^1.1.9" 482 | }, 483 | "engines": { 484 | "node": ">= 8" 485 | } 486 | }, 487 | "node_modules/@nodelib/fs.stat": { 488 | "version": "2.0.5", 489 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 490 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 491 | "dev": true, 492 | "engines": { 493 | "node": ">= 8" 494 | } 495 | }, 496 | "node_modules/@nodelib/fs.walk": { 497 | "version": "1.2.8", 498 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 499 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 500 | "dev": true, 501 | "dependencies": { 502 | "@nodelib/fs.scandir": "2.1.5", 503 | "fastq": "^1.6.0" 504 | }, 505 | "engines": { 506 | "node": ">= 8" 507 | } 508 | }, 509 | "node_modules/@polka/url": { 510 | "version": "1.0.0-next.21", 511 | "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", 512 | "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", 513 | "dev": true 514 | }, 515 | "node_modules/@sveltejs/adapter-auto": { 516 | "version": "2.1.0", 517 | "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-2.1.0.tgz", 518 | "integrity": "sha512-o2pZCfATFtA/Gw/BB0Xm7k4EYaekXxaPGER3xGSY3FvzFJGTlJlZjBseaXwYSM94lZ0HniOjTokN3cWaLX6fow==", 519 | "dev": true, 520 | "dependencies": { 521 | "import-meta-resolve": "^3.0.0" 522 | }, 523 | "peerDependencies": { 524 | "@sveltejs/kit": "^1.0.0" 525 | } 526 | }, 527 | "node_modules/@sveltejs/adapter-static": { 528 | "version": "2.0.3", 529 | "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-2.0.3.tgz", 530 | "integrity": "sha512-VUqTfXsxYGugCpMqQv1U0LIdbR3S5nBkMMDmpjGVJyM6Q2jHVMFtdWJCkeHMySc6mZxJ+0eZK3T7IgmUCDrcUQ==", 531 | "dev": true, 532 | "peerDependencies": { 533 | "@sveltejs/kit": "^1.5.0" 534 | } 535 | }, 536 | "node_modules/@sveltejs/kit": { 537 | "version": "1.22.4", 538 | "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.22.4.tgz", 539 | "integrity": "sha512-Opkqw1QXk4Cc25b/heJP2D7mX+OUBFAq4MXKfET58svTTxdeiHFKzmnuRsSF3nmxESqrLjqPAgHpib+knNGzRw==", 540 | "dev": true, 541 | "hasInstallScript": true, 542 | "dependencies": { 543 | "@sveltejs/vite-plugin-svelte": "^2.4.1", 544 | "@types/cookie": "^0.5.1", 545 | "cookie": "^0.5.0", 546 | "devalue": "^4.3.1", 547 | "esm-env": "^1.0.0", 548 | "kleur": "^4.1.5", 549 | "magic-string": "^0.30.0", 550 | "mime": "^3.0.0", 551 | "sade": "^1.8.1", 552 | "set-cookie-parser": "^2.6.0", 553 | "sirv": "^2.0.2", 554 | "undici": "~5.22.0" 555 | }, 556 | "bin": { 557 | "svelte-kit": "svelte-kit.js" 558 | }, 559 | "engines": { 560 | "node": "^16.14 || >=18" 561 | }, 562 | "peerDependencies": { 563 | "svelte": "^3.54.0 || ^4.0.0-next.0", 564 | "vite": "^4.0.0" 565 | } 566 | }, 567 | "node_modules/@sveltejs/vite-plugin-svelte": { 568 | "version": "2.4.4", 569 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.4.4.tgz", 570 | "integrity": "sha512-Q5z7+iIjs3sw/Jquxaa9KSY5/MShboNjvsxnQYRMdREx/SBDmEYTjeXenpMBh6k0IQ3tMKESCiwKq3/TeAQ8Og==", 571 | "dev": true, 572 | "dependencies": { 573 | "@sveltejs/vite-plugin-svelte-inspector": "^1.0.3", 574 | "debug": "^4.3.4", 575 | "deepmerge": "^4.3.1", 576 | "kleur": "^4.1.5", 577 | "magic-string": "^0.30.2", 578 | "svelte-hmr": "^0.15.3", 579 | "vitefu": "^0.2.4" 580 | }, 581 | "engines": { 582 | "node": "^14.18.0 || >= 16" 583 | }, 584 | "peerDependencies": { 585 | "svelte": "^3.54.0 || ^4.0.0", 586 | "vite": "^4.0.0" 587 | } 588 | }, 589 | "node_modules/@sveltejs/vite-plugin-svelte-inspector": { 590 | "version": "1.0.3", 591 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.3.tgz", 592 | "integrity": "sha512-Khdl5jmmPN6SUsVuqSXatKpQTMIifoQPDanaxC84m9JxIibWvSABJyHpyys0Z+1yYrxY5TTEQm+6elh0XCMaOA==", 593 | "dev": true, 594 | "dependencies": { 595 | "debug": "^4.3.4" 596 | }, 597 | "engines": { 598 | "node": "^14.18.0 || >= 16" 599 | }, 600 | "peerDependencies": { 601 | "@sveltejs/vite-plugin-svelte": "^2.2.0", 602 | "svelte": "^3.54.0 || ^4.0.0", 603 | "vite": "^4.0.0" 604 | } 605 | }, 606 | "node_modules/@types/cookie": { 607 | "version": "0.5.1", 608 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", 609 | "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==", 610 | "dev": true 611 | }, 612 | "node_modules/@types/estree": { 613 | "version": "1.0.1", 614 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", 615 | "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", 616 | "dev": true 617 | }, 618 | "node_modules/@types/pug": { 619 | "version": "2.0.6", 620 | "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", 621 | "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", 622 | "dev": true 623 | }, 624 | "node_modules/acorn": { 625 | "version": "8.10.0", 626 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", 627 | "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", 628 | "dev": true, 629 | "bin": { 630 | "acorn": "bin/acorn" 631 | }, 632 | "engines": { 633 | "node": ">=0.4.0" 634 | } 635 | }, 636 | "node_modules/anymatch": { 637 | "version": "3.1.3", 638 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 639 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 640 | "dev": true, 641 | "dependencies": { 642 | "normalize-path": "^3.0.0", 643 | "picomatch": "^2.0.4" 644 | }, 645 | "engines": { 646 | "node": ">= 8" 647 | } 648 | }, 649 | "node_modules/aria-query": { 650 | "version": "5.3.0", 651 | "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", 652 | "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", 653 | "dev": true, 654 | "dependencies": { 655 | "dequal": "^2.0.3" 656 | } 657 | }, 658 | "node_modules/axobject-query": { 659 | "version": "3.2.1", 660 | "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", 661 | "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", 662 | "dev": true, 663 | "dependencies": { 664 | "dequal": "^2.0.3" 665 | } 666 | }, 667 | "node_modules/balanced-match": { 668 | "version": "1.0.2", 669 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 670 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 671 | "dev": true 672 | }, 673 | "node_modules/binary-extensions": { 674 | "version": "2.2.0", 675 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 676 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 677 | "dev": true, 678 | "engines": { 679 | "node": ">=8" 680 | } 681 | }, 682 | "node_modules/brace-expansion": { 683 | "version": "1.1.11", 684 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 685 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 686 | "dev": true, 687 | "dependencies": { 688 | "balanced-match": "^1.0.0", 689 | "concat-map": "0.0.1" 690 | } 691 | }, 692 | "node_modules/braces": { 693 | "version": "3.0.2", 694 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 695 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 696 | "dev": true, 697 | "dependencies": { 698 | "fill-range": "^7.0.1" 699 | }, 700 | "engines": { 701 | "node": ">=8" 702 | } 703 | }, 704 | "node_modules/buffer-crc32": { 705 | "version": "0.2.13", 706 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 707 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 708 | "dev": true, 709 | "engines": { 710 | "node": "*" 711 | } 712 | }, 713 | "node_modules/busboy": { 714 | "version": "1.6.0", 715 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 716 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 717 | "dev": true, 718 | "dependencies": { 719 | "streamsearch": "^1.1.0" 720 | }, 721 | "engines": { 722 | "node": ">=10.16.0" 723 | } 724 | }, 725 | "node_modules/callsites": { 726 | "version": "3.1.0", 727 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 728 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 729 | "dev": true, 730 | "engines": { 731 | "node": ">=6" 732 | } 733 | }, 734 | "node_modules/chokidar": { 735 | "version": "3.5.3", 736 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 737 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 738 | "dev": true, 739 | "funding": [ 740 | { 741 | "type": "individual", 742 | "url": "https://paulmillr.com/funding/" 743 | } 744 | ], 745 | "dependencies": { 746 | "anymatch": "~3.1.2", 747 | "braces": "~3.0.2", 748 | "glob-parent": "~5.1.2", 749 | "is-binary-path": "~2.1.0", 750 | "is-glob": "~4.0.1", 751 | "normalize-path": "~3.0.0", 752 | "readdirp": "~3.6.0" 753 | }, 754 | "engines": { 755 | "node": ">= 8.10.0" 756 | }, 757 | "optionalDependencies": { 758 | "fsevents": "~2.3.2" 759 | } 760 | }, 761 | "node_modules/code-red": { 762 | "version": "1.0.3", 763 | "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.3.tgz", 764 | "integrity": "sha512-kVwJELqiILQyG5aeuyKFbdsI1fmQy1Cmf7dQ8eGmVuJoaRVdwey7WaMknr2ZFeVSYSKT0rExsa8EGw0aoI/1QQ==", 765 | "dev": true, 766 | "dependencies": { 767 | "@jridgewell/sourcemap-codec": "^1.4.14", 768 | "@types/estree": "^1.0.0", 769 | "acorn": "^8.8.2", 770 | "estree-walker": "^3.0.3", 771 | "periscopic": "^3.1.0" 772 | } 773 | }, 774 | "node_modules/concat-map": { 775 | "version": "0.0.1", 776 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 777 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 778 | "dev": true 779 | }, 780 | "node_modules/cookie": { 781 | "version": "0.5.0", 782 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 783 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 784 | "dev": true, 785 | "engines": { 786 | "node": ">= 0.6" 787 | } 788 | }, 789 | "node_modules/css-tree": { 790 | "version": "2.3.1", 791 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", 792 | "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", 793 | "dev": true, 794 | "dependencies": { 795 | "mdn-data": "2.0.30", 796 | "source-map-js": "^1.0.1" 797 | }, 798 | "engines": { 799 | "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" 800 | } 801 | }, 802 | "node_modules/debug": { 803 | "version": "4.3.4", 804 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 805 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 806 | "dev": true, 807 | "dependencies": { 808 | "ms": "2.1.2" 809 | }, 810 | "engines": { 811 | "node": ">=6.0" 812 | }, 813 | "peerDependenciesMeta": { 814 | "supports-color": { 815 | "optional": true 816 | } 817 | } 818 | }, 819 | "node_modules/deepmerge": { 820 | "version": "4.3.1", 821 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 822 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 823 | "dev": true, 824 | "engines": { 825 | "node": ">=0.10.0" 826 | } 827 | }, 828 | "node_modules/dequal": { 829 | "version": "2.0.3", 830 | "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", 831 | "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", 832 | "dev": true, 833 | "engines": { 834 | "node": ">=6" 835 | } 836 | }, 837 | "node_modules/detect-indent": { 838 | "version": "6.1.0", 839 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", 840 | "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", 841 | "dev": true, 842 | "engines": { 843 | "node": ">=8" 844 | } 845 | }, 846 | "node_modules/devalue": { 847 | "version": "4.3.2", 848 | "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", 849 | "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==", 850 | "dev": true 851 | }, 852 | "node_modules/emoji-mart": { 853 | "version": "5.5.2", 854 | "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.5.2.tgz", 855 | "integrity": "sha512-Sqc/nso4cjxhOwWJsp9xkVm8OF5c+mJLZJFoFfzRuKO+yWiN7K8c96xmtughYb0d/fZ8UC6cLIQ/p4BR6Pv3/A==" 856 | }, 857 | "node_modules/es6-promise": { 858 | "version": "3.3.1", 859 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", 860 | "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", 861 | "dev": true 862 | }, 863 | "node_modules/esbuild": { 864 | "version": "0.18.18", 865 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.18.tgz", 866 | "integrity": "sha512-UckDPWvdVJLNT0npk5AMTpVwGRQhS76rWFLmHwEtgNvWlR9sgVV1eyc/oeBtM86q9s8ABBLMmm0CwNxhVemOiw==", 867 | "dev": true, 868 | "hasInstallScript": true, 869 | "bin": { 870 | "esbuild": "bin/esbuild" 871 | }, 872 | "engines": { 873 | "node": ">=12" 874 | }, 875 | "optionalDependencies": { 876 | "@esbuild/android-arm": "0.18.18", 877 | "@esbuild/android-arm64": "0.18.18", 878 | "@esbuild/android-x64": "0.18.18", 879 | "@esbuild/darwin-arm64": "0.18.18", 880 | "@esbuild/darwin-x64": "0.18.18", 881 | "@esbuild/freebsd-arm64": "0.18.18", 882 | "@esbuild/freebsd-x64": "0.18.18", 883 | "@esbuild/linux-arm": "0.18.18", 884 | "@esbuild/linux-arm64": "0.18.18", 885 | "@esbuild/linux-ia32": "0.18.18", 886 | "@esbuild/linux-loong64": "0.18.18", 887 | "@esbuild/linux-mips64el": "0.18.18", 888 | "@esbuild/linux-ppc64": "0.18.18", 889 | "@esbuild/linux-riscv64": "0.18.18", 890 | "@esbuild/linux-s390x": "0.18.18", 891 | "@esbuild/linux-x64": "0.18.18", 892 | "@esbuild/netbsd-x64": "0.18.18", 893 | "@esbuild/openbsd-x64": "0.18.18", 894 | "@esbuild/sunos-x64": "0.18.18", 895 | "@esbuild/win32-arm64": "0.18.18", 896 | "@esbuild/win32-ia32": "0.18.18", 897 | "@esbuild/win32-x64": "0.18.18" 898 | } 899 | }, 900 | "node_modules/esm-env": { 901 | "version": "1.0.0", 902 | "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", 903 | "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==", 904 | "dev": true 905 | }, 906 | "node_modules/estree-walker": { 907 | "version": "3.0.3", 908 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", 909 | "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", 910 | "dev": true, 911 | "dependencies": { 912 | "@types/estree": "^1.0.0" 913 | } 914 | }, 915 | "node_modules/fast-glob": { 916 | "version": "3.3.1", 917 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", 918 | "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", 919 | "dev": true, 920 | "dependencies": { 921 | "@nodelib/fs.stat": "^2.0.2", 922 | "@nodelib/fs.walk": "^1.2.3", 923 | "glob-parent": "^5.1.2", 924 | "merge2": "^1.3.0", 925 | "micromatch": "^4.0.4" 926 | }, 927 | "engines": { 928 | "node": ">=8.6.0" 929 | } 930 | }, 931 | "node_modules/fastq": { 932 | "version": "1.15.0", 933 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 934 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 935 | "dev": true, 936 | "dependencies": { 937 | "reusify": "^1.0.4" 938 | } 939 | }, 940 | "node_modules/fill-range": { 941 | "version": "7.0.1", 942 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 943 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 944 | "dev": true, 945 | "dependencies": { 946 | "to-regex-range": "^5.0.1" 947 | }, 948 | "engines": { 949 | "node": ">=8" 950 | } 951 | }, 952 | "node_modules/fs.realpath": { 953 | "version": "1.0.0", 954 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 955 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 956 | "dev": true 957 | }, 958 | "node_modules/fsevents": { 959 | "version": "2.3.2", 960 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 961 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 962 | "dev": true, 963 | "hasInstallScript": true, 964 | "optional": true, 965 | "os": [ 966 | "darwin" 967 | ], 968 | "engines": { 969 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 970 | } 971 | }, 972 | "node_modules/glob": { 973 | "version": "7.2.3", 974 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 975 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 976 | "dev": true, 977 | "dependencies": { 978 | "fs.realpath": "^1.0.0", 979 | "inflight": "^1.0.4", 980 | "inherits": "2", 981 | "minimatch": "^3.1.1", 982 | "once": "^1.3.0", 983 | "path-is-absolute": "^1.0.0" 984 | }, 985 | "engines": { 986 | "node": "*" 987 | }, 988 | "funding": { 989 | "url": "https://github.com/sponsors/isaacs" 990 | } 991 | }, 992 | "node_modules/glob-parent": { 993 | "version": "5.1.2", 994 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 995 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 996 | "dev": true, 997 | "dependencies": { 998 | "is-glob": "^4.0.1" 999 | }, 1000 | "engines": { 1001 | "node": ">= 6" 1002 | } 1003 | }, 1004 | "node_modules/graceful-fs": { 1005 | "version": "4.2.11", 1006 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1007 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1008 | "dev": true 1009 | }, 1010 | "node_modules/import-fresh": { 1011 | "version": "3.3.0", 1012 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1013 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1014 | "dev": true, 1015 | "dependencies": { 1016 | "parent-module": "^1.0.0", 1017 | "resolve-from": "^4.0.0" 1018 | }, 1019 | "engines": { 1020 | "node": ">=6" 1021 | }, 1022 | "funding": { 1023 | "url": "https://github.com/sponsors/sindresorhus" 1024 | } 1025 | }, 1026 | "node_modules/import-meta-resolve": { 1027 | "version": "3.0.0", 1028 | "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", 1029 | "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", 1030 | "dev": true, 1031 | "funding": { 1032 | "type": "github", 1033 | "url": "https://github.com/sponsors/wooorm" 1034 | } 1035 | }, 1036 | "node_modules/inflight": { 1037 | "version": "1.0.6", 1038 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1039 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1040 | "dev": true, 1041 | "dependencies": { 1042 | "once": "^1.3.0", 1043 | "wrappy": "1" 1044 | } 1045 | }, 1046 | "node_modules/inherits": { 1047 | "version": "2.0.4", 1048 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1049 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1050 | "dev": true 1051 | }, 1052 | "node_modules/is-binary-path": { 1053 | "version": "2.1.0", 1054 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1055 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1056 | "dev": true, 1057 | "dependencies": { 1058 | "binary-extensions": "^2.0.0" 1059 | }, 1060 | "engines": { 1061 | "node": ">=8" 1062 | } 1063 | }, 1064 | "node_modules/is-extglob": { 1065 | "version": "2.1.1", 1066 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1067 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1068 | "dev": true, 1069 | "engines": { 1070 | "node": ">=0.10.0" 1071 | } 1072 | }, 1073 | "node_modules/is-glob": { 1074 | "version": "4.0.3", 1075 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1076 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1077 | "dev": true, 1078 | "dependencies": { 1079 | "is-extglob": "^2.1.1" 1080 | }, 1081 | "engines": { 1082 | "node": ">=0.10.0" 1083 | } 1084 | }, 1085 | "node_modules/is-number": { 1086 | "version": "7.0.0", 1087 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1088 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1089 | "dev": true, 1090 | "engines": { 1091 | "node": ">=0.12.0" 1092 | } 1093 | }, 1094 | "node_modules/is-reference": { 1095 | "version": "3.0.1", 1096 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.1.tgz", 1097 | "integrity": "sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==", 1098 | "dev": true, 1099 | "dependencies": { 1100 | "@types/estree": "*" 1101 | } 1102 | }, 1103 | "node_modules/kleur": { 1104 | "version": "4.1.5", 1105 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 1106 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 1107 | "dev": true, 1108 | "engines": { 1109 | "node": ">=6" 1110 | } 1111 | }, 1112 | "node_modules/locate-character": { 1113 | "version": "3.0.0", 1114 | "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", 1115 | "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", 1116 | "dev": true 1117 | }, 1118 | "node_modules/magic-string": { 1119 | "version": "0.30.2", 1120 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.2.tgz", 1121 | "integrity": "sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==", 1122 | "dev": true, 1123 | "dependencies": { 1124 | "@jridgewell/sourcemap-codec": "^1.4.15" 1125 | }, 1126 | "engines": { 1127 | "node": ">=12" 1128 | } 1129 | }, 1130 | "node_modules/mdn-data": { 1131 | "version": "2.0.30", 1132 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", 1133 | "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", 1134 | "dev": true 1135 | }, 1136 | "node_modules/merge2": { 1137 | "version": "1.4.1", 1138 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1139 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1140 | "dev": true, 1141 | "engines": { 1142 | "node": ">= 8" 1143 | } 1144 | }, 1145 | "node_modules/micromatch": { 1146 | "version": "4.0.5", 1147 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1148 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1149 | "dev": true, 1150 | "dependencies": { 1151 | "braces": "^3.0.2", 1152 | "picomatch": "^2.3.1" 1153 | }, 1154 | "engines": { 1155 | "node": ">=8.6" 1156 | } 1157 | }, 1158 | "node_modules/mime": { 1159 | "version": "3.0.0", 1160 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 1161 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 1162 | "dev": true, 1163 | "bin": { 1164 | "mime": "cli.js" 1165 | }, 1166 | "engines": { 1167 | "node": ">=10.0.0" 1168 | } 1169 | }, 1170 | "node_modules/min-indent": { 1171 | "version": "1.0.1", 1172 | "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", 1173 | "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", 1174 | "dev": true, 1175 | "engines": { 1176 | "node": ">=4" 1177 | } 1178 | }, 1179 | "node_modules/minimatch": { 1180 | "version": "3.1.2", 1181 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1182 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1183 | "dev": true, 1184 | "dependencies": { 1185 | "brace-expansion": "^1.1.7" 1186 | }, 1187 | "engines": { 1188 | "node": "*" 1189 | } 1190 | }, 1191 | "node_modules/minimist": { 1192 | "version": "1.2.8", 1193 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1194 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1195 | "dev": true, 1196 | "funding": { 1197 | "url": "https://github.com/sponsors/ljharb" 1198 | } 1199 | }, 1200 | "node_modules/mkdirp": { 1201 | "version": "0.5.6", 1202 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 1203 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1204 | "dev": true, 1205 | "dependencies": { 1206 | "minimist": "^1.2.6" 1207 | }, 1208 | "bin": { 1209 | "mkdirp": "bin/cmd.js" 1210 | } 1211 | }, 1212 | "node_modules/mri": { 1213 | "version": "1.2.0", 1214 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 1215 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 1216 | "dev": true, 1217 | "engines": { 1218 | "node": ">=4" 1219 | } 1220 | }, 1221 | "node_modules/mrmime": { 1222 | "version": "1.0.1", 1223 | "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", 1224 | "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", 1225 | "dev": true, 1226 | "engines": { 1227 | "node": ">=10" 1228 | } 1229 | }, 1230 | "node_modules/ms": { 1231 | "version": "2.1.2", 1232 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1233 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1234 | "dev": true 1235 | }, 1236 | "node_modules/nanoid": { 1237 | "version": "3.3.6", 1238 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", 1239 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", 1240 | "dev": true, 1241 | "funding": [ 1242 | { 1243 | "type": "github", 1244 | "url": "https://github.com/sponsors/ai" 1245 | } 1246 | ], 1247 | "bin": { 1248 | "nanoid": "bin/nanoid.cjs" 1249 | }, 1250 | "engines": { 1251 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1252 | } 1253 | }, 1254 | "node_modules/normalize-path": { 1255 | "version": "3.0.0", 1256 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1257 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1258 | "dev": true, 1259 | "engines": { 1260 | "node": ">=0.10.0" 1261 | } 1262 | }, 1263 | "node_modules/once": { 1264 | "version": "1.4.0", 1265 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1266 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1267 | "dev": true, 1268 | "dependencies": { 1269 | "wrappy": "1" 1270 | } 1271 | }, 1272 | "node_modules/parent-module": { 1273 | "version": "1.0.1", 1274 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1275 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1276 | "dev": true, 1277 | "dependencies": { 1278 | "callsites": "^3.0.0" 1279 | }, 1280 | "engines": { 1281 | "node": ">=6" 1282 | } 1283 | }, 1284 | "node_modules/path-is-absolute": { 1285 | "version": "1.0.1", 1286 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1287 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1288 | "dev": true, 1289 | "engines": { 1290 | "node": ">=0.10.0" 1291 | } 1292 | }, 1293 | "node_modules/periscopic": { 1294 | "version": "3.1.0", 1295 | "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", 1296 | "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", 1297 | "dev": true, 1298 | "dependencies": { 1299 | "@types/estree": "^1.0.0", 1300 | "estree-walker": "^3.0.0", 1301 | "is-reference": "^3.0.0" 1302 | } 1303 | }, 1304 | "node_modules/picocolors": { 1305 | "version": "1.0.0", 1306 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1307 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 1308 | "dev": true 1309 | }, 1310 | "node_modules/picomatch": { 1311 | "version": "2.3.1", 1312 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1313 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1314 | "dev": true, 1315 | "engines": { 1316 | "node": ">=8.6" 1317 | }, 1318 | "funding": { 1319 | "url": "https://github.com/sponsors/jonschlinkert" 1320 | } 1321 | }, 1322 | "node_modules/postcss": { 1323 | "version": "8.4.27", 1324 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", 1325 | "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", 1326 | "dev": true, 1327 | "funding": [ 1328 | { 1329 | "type": "opencollective", 1330 | "url": "https://opencollective.com/postcss/" 1331 | }, 1332 | { 1333 | "type": "tidelift", 1334 | "url": "https://tidelift.com/funding/github/npm/postcss" 1335 | }, 1336 | { 1337 | "type": "github", 1338 | "url": "https://github.com/sponsors/ai" 1339 | } 1340 | ], 1341 | "dependencies": { 1342 | "nanoid": "^3.3.6", 1343 | "picocolors": "^1.0.0", 1344 | "source-map-js": "^1.0.2" 1345 | }, 1346 | "engines": { 1347 | "node": "^10 || ^12 || >=14" 1348 | } 1349 | }, 1350 | "node_modules/prettier": { 1351 | "version": "2.8.8", 1352 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", 1353 | "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", 1354 | "dev": true, 1355 | "bin": { 1356 | "prettier": "bin-prettier.js" 1357 | }, 1358 | "engines": { 1359 | "node": ">=10.13.0" 1360 | }, 1361 | "funding": { 1362 | "url": "https://github.com/prettier/prettier?sponsor=1" 1363 | } 1364 | }, 1365 | "node_modules/prettier-plugin-svelte": { 1366 | "version": "2.10.1", 1367 | "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.10.1.tgz", 1368 | "integrity": "sha512-Wlq7Z5v2ueCubWo0TZzKc9XHcm7TDxqcuzRuGd0gcENfzfT4JZ9yDlCbEgxWgiPmLHkBjfOtpAWkcT28MCDpUQ==", 1369 | "dev": true, 1370 | "peerDependencies": { 1371 | "prettier": "^1.16.4 || ^2.0.0", 1372 | "svelte": "^3.2.0 || ^4.0.0-next.0" 1373 | } 1374 | }, 1375 | "node_modules/queue-microtask": { 1376 | "version": "1.2.3", 1377 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1378 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1379 | "dev": true, 1380 | "funding": [ 1381 | { 1382 | "type": "github", 1383 | "url": "https://github.com/sponsors/feross" 1384 | }, 1385 | { 1386 | "type": "patreon", 1387 | "url": "https://www.patreon.com/feross" 1388 | }, 1389 | { 1390 | "type": "consulting", 1391 | "url": "https://feross.org/support" 1392 | } 1393 | ] 1394 | }, 1395 | "node_modules/readdirp": { 1396 | "version": "3.6.0", 1397 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1398 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1399 | "dev": true, 1400 | "dependencies": { 1401 | "picomatch": "^2.2.1" 1402 | }, 1403 | "engines": { 1404 | "node": ">=8.10.0" 1405 | } 1406 | }, 1407 | "node_modules/resolve-from": { 1408 | "version": "4.0.0", 1409 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1410 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1411 | "dev": true, 1412 | "engines": { 1413 | "node": ">=4" 1414 | } 1415 | }, 1416 | "node_modules/reusify": { 1417 | "version": "1.0.4", 1418 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1419 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1420 | "dev": true, 1421 | "engines": { 1422 | "iojs": ">=1.0.0", 1423 | "node": ">=0.10.0" 1424 | } 1425 | }, 1426 | "node_modules/rimraf": { 1427 | "version": "2.7.1", 1428 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 1429 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 1430 | "dev": true, 1431 | "dependencies": { 1432 | "glob": "^7.1.3" 1433 | }, 1434 | "bin": { 1435 | "rimraf": "bin.js" 1436 | } 1437 | }, 1438 | "node_modules/rollup": { 1439 | "version": "3.27.2", 1440 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.27.2.tgz", 1441 | "integrity": "sha512-YGwmHf7h2oUHkVBT248x0yt6vZkYQ3/rvE5iQuVBh3WO8GcJ6BNeOkpoX1yMHIiBm18EMLjBPIoUDkhgnyxGOQ==", 1442 | "dev": true, 1443 | "bin": { 1444 | "rollup": "dist/bin/rollup" 1445 | }, 1446 | "engines": { 1447 | "node": ">=14.18.0", 1448 | "npm": ">=8.0.0" 1449 | }, 1450 | "optionalDependencies": { 1451 | "fsevents": "~2.3.2" 1452 | } 1453 | }, 1454 | "node_modules/run-parallel": { 1455 | "version": "1.2.0", 1456 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1457 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1458 | "dev": true, 1459 | "funding": [ 1460 | { 1461 | "type": "github", 1462 | "url": "https://github.com/sponsors/feross" 1463 | }, 1464 | { 1465 | "type": "patreon", 1466 | "url": "https://www.patreon.com/feross" 1467 | }, 1468 | { 1469 | "type": "consulting", 1470 | "url": "https://feross.org/support" 1471 | } 1472 | ], 1473 | "dependencies": { 1474 | "queue-microtask": "^1.2.2" 1475 | } 1476 | }, 1477 | "node_modules/sade": { 1478 | "version": "1.8.1", 1479 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 1480 | "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 1481 | "dev": true, 1482 | "dependencies": { 1483 | "mri": "^1.1.0" 1484 | }, 1485 | "engines": { 1486 | "node": ">=6" 1487 | } 1488 | }, 1489 | "node_modules/sander": { 1490 | "version": "0.5.1", 1491 | "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", 1492 | "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", 1493 | "dev": true, 1494 | "dependencies": { 1495 | "es6-promise": "^3.1.2", 1496 | "graceful-fs": "^4.1.3", 1497 | "mkdirp": "^0.5.1", 1498 | "rimraf": "^2.5.2" 1499 | } 1500 | }, 1501 | "node_modules/set-cookie-parser": { 1502 | "version": "2.6.0", 1503 | "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", 1504 | "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", 1505 | "dev": true 1506 | }, 1507 | "node_modules/sirv": { 1508 | "version": "2.0.3", 1509 | "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", 1510 | "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", 1511 | "dev": true, 1512 | "dependencies": { 1513 | "@polka/url": "^1.0.0-next.20", 1514 | "mrmime": "^1.0.0", 1515 | "totalist": "^3.0.0" 1516 | }, 1517 | "engines": { 1518 | "node": ">= 10" 1519 | } 1520 | }, 1521 | "node_modules/sorcery": { 1522 | "version": "0.11.0", 1523 | "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", 1524 | "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", 1525 | "dev": true, 1526 | "dependencies": { 1527 | "@jridgewell/sourcemap-codec": "^1.4.14", 1528 | "buffer-crc32": "^0.2.5", 1529 | "minimist": "^1.2.0", 1530 | "sander": "^0.5.0" 1531 | }, 1532 | "bin": { 1533 | "sorcery": "bin/sorcery" 1534 | } 1535 | }, 1536 | "node_modules/source-map-js": { 1537 | "version": "1.0.2", 1538 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1539 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1540 | "dev": true, 1541 | "engines": { 1542 | "node": ">=0.10.0" 1543 | } 1544 | }, 1545 | "node_modules/streamsearch": { 1546 | "version": "1.1.0", 1547 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 1548 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 1549 | "dev": true, 1550 | "engines": { 1551 | "node": ">=10.0.0" 1552 | } 1553 | }, 1554 | "node_modules/strip-indent": { 1555 | "version": "3.0.0", 1556 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", 1557 | "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", 1558 | "dev": true, 1559 | "dependencies": { 1560 | "min-indent": "^1.0.0" 1561 | }, 1562 | "engines": { 1563 | "node": ">=8" 1564 | } 1565 | }, 1566 | "node_modules/svelte": { 1567 | "version": "4.1.2", 1568 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.1.2.tgz", 1569 | "integrity": "sha512-/evA8U6CgOHe5ZD1C1W3va9iJG7mWflcCdghBORJaAhD2JzrVERJty/2gl0pIPrJYBGZwZycH6onYf+64XXF9g==", 1570 | "dev": true, 1571 | "dependencies": { 1572 | "@ampproject/remapping": "^2.2.1", 1573 | "@jridgewell/sourcemap-codec": "^1.4.15", 1574 | "@jridgewell/trace-mapping": "^0.3.18", 1575 | "acorn": "^8.9.0", 1576 | "aria-query": "^5.3.0", 1577 | "axobject-query": "^3.2.1", 1578 | "code-red": "^1.0.3", 1579 | "css-tree": "^2.3.1", 1580 | "estree-walker": "^3.0.3", 1581 | "is-reference": "^3.0.1", 1582 | "locate-character": "^3.0.0", 1583 | "magic-string": "^0.30.0", 1584 | "periscopic": "^3.1.0" 1585 | }, 1586 | "engines": { 1587 | "node": ">=16" 1588 | } 1589 | }, 1590 | "node_modules/svelte-check": { 1591 | "version": "3.4.6", 1592 | "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.4.6.tgz", 1593 | "integrity": "sha512-OBlY8866Zh1zHQTkBMPS6psPi7o2umTUyj6JWm4SacnIHXpWFm658pG32m3dKvKFL49V4ntAkfFHKo4ztH07og==", 1594 | "dev": true, 1595 | "dependencies": { 1596 | "@jridgewell/trace-mapping": "^0.3.17", 1597 | "chokidar": "^3.4.1", 1598 | "fast-glob": "^3.2.7", 1599 | "import-fresh": "^3.2.1", 1600 | "picocolors": "^1.0.0", 1601 | "sade": "^1.7.4", 1602 | "svelte-preprocess": "^5.0.4", 1603 | "typescript": "^5.0.3" 1604 | }, 1605 | "bin": { 1606 | "svelte-check": "bin/svelte-check" 1607 | }, 1608 | "peerDependencies": { 1609 | "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0" 1610 | } 1611 | }, 1612 | "node_modules/svelte-hmr": { 1613 | "version": "0.15.3", 1614 | "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz", 1615 | "integrity": "sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==", 1616 | "dev": true, 1617 | "engines": { 1618 | "node": "^12.20 || ^14.13.1 || >= 16" 1619 | }, 1620 | "peerDependencies": { 1621 | "svelte": "^3.19.0 || ^4.0.0" 1622 | } 1623 | }, 1624 | "node_modules/svelte-popover": { 1625 | "version": "2.0.8", 1626 | "resolved": "https://registry.npmjs.org/svelte-popover/-/svelte-popover-2.0.8.tgz", 1627 | "integrity": "sha512-Yvz4FpvvXc5aBGyIE/TlGlqULLKkcfc7N0MoaqNXHMRVXxla+sc7G1xSCCURP3VqP0nZ5cIyPWOLLWFXuJjTRA==", 1628 | "dev": true 1629 | }, 1630 | "node_modules/svelte-preprocess": { 1631 | "version": "5.0.4", 1632 | "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.4.tgz", 1633 | "integrity": "sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==", 1634 | "dev": true, 1635 | "hasInstallScript": true, 1636 | "dependencies": { 1637 | "@types/pug": "^2.0.6", 1638 | "detect-indent": "^6.1.0", 1639 | "magic-string": "^0.27.0", 1640 | "sorcery": "^0.11.0", 1641 | "strip-indent": "^3.0.0" 1642 | }, 1643 | "engines": { 1644 | "node": ">= 14.10.0" 1645 | }, 1646 | "peerDependencies": { 1647 | "@babel/core": "^7.10.2", 1648 | "coffeescript": "^2.5.1", 1649 | "less": "^3.11.3 || ^4.0.0", 1650 | "postcss": "^7 || ^8", 1651 | "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", 1652 | "pug": "^3.0.0", 1653 | "sass": "^1.26.8", 1654 | "stylus": "^0.55.0", 1655 | "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", 1656 | "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0", 1657 | "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" 1658 | }, 1659 | "peerDependenciesMeta": { 1660 | "@babel/core": { 1661 | "optional": true 1662 | }, 1663 | "coffeescript": { 1664 | "optional": true 1665 | }, 1666 | "less": { 1667 | "optional": true 1668 | }, 1669 | "postcss": { 1670 | "optional": true 1671 | }, 1672 | "postcss-load-config": { 1673 | "optional": true 1674 | }, 1675 | "pug": { 1676 | "optional": true 1677 | }, 1678 | "sass": { 1679 | "optional": true 1680 | }, 1681 | "stylus": { 1682 | "optional": true 1683 | }, 1684 | "sugarss": { 1685 | "optional": true 1686 | }, 1687 | "typescript": { 1688 | "optional": true 1689 | } 1690 | } 1691 | }, 1692 | "node_modules/svelte-preprocess/node_modules/magic-string": { 1693 | "version": "0.27.0", 1694 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", 1695 | "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", 1696 | "dev": true, 1697 | "dependencies": { 1698 | "@jridgewell/sourcemap-codec": "^1.4.13" 1699 | }, 1700 | "engines": { 1701 | "node": ">=12" 1702 | } 1703 | }, 1704 | "node_modules/to-regex-range": { 1705 | "version": "5.0.1", 1706 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1707 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1708 | "dev": true, 1709 | "dependencies": { 1710 | "is-number": "^7.0.0" 1711 | }, 1712 | "engines": { 1713 | "node": ">=8.0" 1714 | } 1715 | }, 1716 | "node_modules/totalist": { 1717 | "version": "3.0.1", 1718 | "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", 1719 | "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", 1720 | "dev": true, 1721 | "engines": { 1722 | "node": ">=6" 1723 | } 1724 | }, 1725 | "node_modules/tslib": { 1726 | "version": "2.6.1", 1727 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", 1728 | "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", 1729 | "dev": true 1730 | }, 1731 | "node_modules/typescript": { 1732 | "version": "5.1.6", 1733 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", 1734 | "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", 1735 | "dev": true, 1736 | "bin": { 1737 | "tsc": "bin/tsc", 1738 | "tsserver": "bin/tsserver" 1739 | }, 1740 | "engines": { 1741 | "node": ">=14.17" 1742 | } 1743 | }, 1744 | "node_modules/undici": { 1745 | "version": "5.22.1", 1746 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", 1747 | "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", 1748 | "dev": true, 1749 | "dependencies": { 1750 | "busboy": "^1.6.0" 1751 | }, 1752 | "engines": { 1753 | "node": ">=14.0" 1754 | } 1755 | }, 1756 | "node_modules/vite": { 1757 | "version": "4.4.8", 1758 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.8.tgz", 1759 | "integrity": "sha512-LONawOUUjxQridNWGQlNizfKH89qPigK36XhMI7COMGztz8KNY0JHim7/xDd71CZwGT4HtSRgI7Hy+RlhG0Gvg==", 1760 | "dev": true, 1761 | "dependencies": { 1762 | "esbuild": "^0.18.10", 1763 | "postcss": "^8.4.26", 1764 | "rollup": "^3.25.2" 1765 | }, 1766 | "bin": { 1767 | "vite": "bin/vite.js" 1768 | }, 1769 | "engines": { 1770 | "node": "^14.18.0 || >=16.0.0" 1771 | }, 1772 | "funding": { 1773 | "url": "https://github.com/vitejs/vite?sponsor=1" 1774 | }, 1775 | "optionalDependencies": { 1776 | "fsevents": "~2.3.2" 1777 | }, 1778 | "peerDependencies": { 1779 | "@types/node": ">= 14", 1780 | "less": "*", 1781 | "lightningcss": "^1.21.0", 1782 | "sass": "*", 1783 | "stylus": "*", 1784 | "sugarss": "*", 1785 | "terser": "^5.4.0" 1786 | }, 1787 | "peerDependenciesMeta": { 1788 | "@types/node": { 1789 | "optional": true 1790 | }, 1791 | "less": { 1792 | "optional": true 1793 | }, 1794 | "lightningcss": { 1795 | "optional": true 1796 | }, 1797 | "sass": { 1798 | "optional": true 1799 | }, 1800 | "stylus": { 1801 | "optional": true 1802 | }, 1803 | "sugarss": { 1804 | "optional": true 1805 | }, 1806 | "terser": { 1807 | "optional": true 1808 | } 1809 | } 1810 | }, 1811 | "node_modules/vitefu": { 1812 | "version": "0.2.4", 1813 | "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", 1814 | "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", 1815 | "dev": true, 1816 | "peerDependencies": { 1817 | "vite": "^3.0.0 || ^4.0.0" 1818 | }, 1819 | "peerDependenciesMeta": { 1820 | "vite": { 1821 | "optional": true 1822 | } 1823 | } 1824 | }, 1825 | "node_modules/wrappy": { 1826 | "version": "1.0.2", 1827 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1828 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1829 | "dev": true 1830 | } 1831 | } 1832 | } 1833 | --------------------------------------------------------------------------------