diff --git a/.gitignore b/.gitignore index 96ef6c0..cb531d5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,13 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example +vite.config.js.timestamp-* +vite.config.ts.timestamp-* + /target Cargo.lock diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..61343e9 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "svelte.svelte-vscode", + "tauri-apps.tauri-vscode", + "rust-lang.rust-analyzer" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..0826a47 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "lldb", + "request": "launch", + "name": "Debug", + "program": "${workspaceFolder}/src-tauri/target/debug/keydisplay", + "args": [], + "cwd": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2f86c50 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "svelte.enable-ts-plugin": true +} diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index 3844c52..0000000 --- a/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "keydisplay" -version = "0.1.0" -edition = "2021" - -[dependencies] -serde = { version = "1.0", features = ["derive"] } -toml = "0.8" -dirs = "5.0" -inputbot = "0.6.0" -thiserror = "2.0.11" -slint = "1.9.2" - -[build-dependencies] -slint-build = "1.9.2" diff --git a/README.md b/README.md index 47cd9e0..7c103bd 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,3 @@ # keydisplay -note: you will need to add yourself to the input group or run as root if you intend to use wayland -you can do it like this - -`doas usermod -aG input $USER` - -## config.rs -- use serde with a config struct - -- impl with defaults and read function - -### read: -- get the current users config folder - -- make a folder if the "keydisplay" folder doesnt exist - -- make a keydisplay/config.toml if it doesnt exist - -- give it 600 permissions - -config: -- theme = {catppuccin_mocha, grey, night, day} -- [listen] -- - keys = "z, x" -- - mouse = "m1, m2" -- [display] -- - mouse = "key" - -## listen.rs -- use inputbot to listen for inputs https://github.com/obv-mikhail/InputBot - -- keys you can use are here https://docs.rs/inputbot/latest/src/inputbot/public.rs.html#300-352 - -## main.rs -- read config - -- start listener on keys from config - -- load gui using theme +ligma balls diff --git a/build.rs b/build.rs deleted file mode 100644 index e70714e..0000000 --- a/build.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - slint_build::compile("ui/window.slint").expect("Slint build failed"); -} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a25f1c8 --- /dev/null +++ b/package.json @@ -0,0 +1,30 @@ +{ + "name": "keydisplay", + "version": "0.1.0", + "description": "", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "tauri": "tauri" + }, + "license": "MIT", + "dependencies": { + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-fs": "~2", + "@tauri-apps/plugin-opener": "^2" + }, + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.6", + "@sveltejs/kit": "^2.9.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "@tauri-apps/cli": "^2", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "typescript": "~5.6.2", + "vite": "^6.0.3" + } +} diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore new file mode 100644 index 0000000..b21bd68 --- /dev/null +++ b/src-tauri/.gitignore @@ -0,0 +1,7 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Generated by Tauri +# will have schema files for capabilities auto-completion +/gen/schemas diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 0000000..de8df49 --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "keydisplay" +version = "0.1.0" +description = "A Tauri App" +authors = ["starlight"] +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +# The `_lib` suffix may seem redundant but it is necessary +# to make the lib name unique and wouldn't conflict with the bin name. +# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519 +name = "keydisplay_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } +tauri-plugin-opener = "2" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +toml = "0.8" +dirs = "5.0" +thiserror = "2.0.11" +tauri-plugin-fs = { version = "2.0.0", features = ["watch"] } +rdev = { version = "0.5.3", features = ["serde", "serialize"] } diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json new file mode 100644 index 0000000..504a3b1 --- /dev/null +++ b/src-tauri/capabilities/default.json @@ -0,0 +1,17 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": [ + "main" + ], + "permissions": [ + "core:default", + "opener:default", + "fs:default", + { + "identifier": "fs:allow-app-read-recursive", + "allow": [{"path": "$CONFIG/keydisplay"}] + } + ] +} \ No newline at end of file diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png new file mode 100644 index 0000000..6be5e50 Binary files /dev/null and b/src-tauri/icons/128x128.png differ diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000..e81bece Binary files /dev/null and b/src-tauri/icons/128x128@2x.png differ diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png new file mode 100644 index 0000000..a437dd5 Binary files /dev/null and b/src-tauri/icons/32x32.png differ diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000..0ca4f27 Binary files /dev/null and b/src-tauri/icons/Square107x107Logo.png differ diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 0000000..b81f820 Binary files /dev/null and b/src-tauri/icons/Square142x142Logo.png differ diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000..624c7bf Binary files /dev/null and b/src-tauri/icons/Square150x150Logo.png differ diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000..c021d2b Binary files /dev/null and b/src-tauri/icons/Square284x284Logo.png differ diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000..6219700 Binary files /dev/null and b/src-tauri/icons/Square30x30Logo.png differ diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000..f9bc048 Binary files /dev/null and b/src-tauri/icons/Square310x310Logo.png differ diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 0000000..d5fbfb2 Binary files /dev/null and b/src-tauri/icons/Square44x44Logo.png differ diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000..63440d7 Binary files /dev/null and b/src-tauri/icons/Square71x71Logo.png differ diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 0000000..f3f705a Binary files /dev/null and b/src-tauri/icons/Square89x89Logo.png differ diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000..4556388 Binary files /dev/null and b/src-tauri/icons/StoreLogo.png differ diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns new file mode 100644 index 0000000..12a5bce Binary files /dev/null and b/src-tauri/icons/icon.icns differ diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico new file mode 100644 index 0000000..b3636e4 Binary files /dev/null and b/src-tauri/icons/icon.ico differ diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png new file mode 100644 index 0000000..e1cd261 Binary files /dev/null and b/src-tauri/icons/icon.png differ diff --git a/src/config.rs b/src-tauri/src/config.rs similarity index 71% rename from src/config.rs rename to src-tauri/src/config.rs index b8b577f..faf023a 100644 --- a/src/config.rs +++ b/src-tauri/src/config.rs @@ -1,6 +1,7 @@ use serde::{Deserialize, Serialize}; -use std::fs; +use std::collections::HashMap; use std::path::PathBuf; +use std::fs; use thiserror::Error; #[derive(Error, Debug)] @@ -16,13 +17,27 @@ pub enum ConfigError { } #[derive(Debug, Serialize, Deserialize)] +#[serde(default)] pub struct Config { // theme = grey / night / day / catppuccin_mocha + pub default: bool, pub theme: String, pub listen: ListenConfig, pub display: DisplayConfig, } +// this is hack as fvck +// allows for removing the "default" line entirely +// basically if "default" is missing from the config then infer as false (hide default warning) +impl Default for Config { + fn default() -> Self { + Config { + default: false, + ..Self::default() + } + } +} + // [listen] #[derive(Debug, Serialize, Deserialize)] pub struct ListenConfig { @@ -35,20 +50,31 @@ pub struct ListenConfig { // [display] #[derive(Debug, Serialize, Deserialize)] pub struct DisplayConfig { + // "instant" or "ease" + pub press: String, + // display mouse buttons as a key or as an svg of a mouse pub mouse: String, + // multiply default key length for the key by the float value + pub size: Vec>, + // which keys to linebreak after + pub r#break: Vec, } impl Config { // Provide default values pub fn default() -> Self { Self { + default: true, theme: "grey".to_string(), listen: ListenConfig { - keys: vec!["ZKey".to_string(), "XKey".to_string()], - mouse: vec!["LeftButton".to_string(), "RightButton".to_string()], + keys: vec!["KeyZ".to_string(), "KeyX".to_string(), "MetaLeft".to_string()], + mouse: vec!["Left".to_string(), "Right".to_string()], }, display: DisplayConfig { + press: "ease".to_string(), mouse: "key".to_string(), + size: vec![HashMap::new()], + r#break: vec![], }, } } @@ -57,6 +83,7 @@ impl Config { pub fn load_or_create(path: PathBuf) -> Result { let full_path = path.join("config.toml"); + // create a file with using the default config if it does not exist if !full_path.exists() { println!("Creating default config"); let config = Self::default(); diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 0000000..011be58 --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,206 @@ +use config::Config; +// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ +use std::{collections::HashMap, sync::Mutex}; +use tauri::{ipc::Channel, Manager, State}; +use rdev::{Event, EventType, listen}; +use std::thread; + +mod config; + +struct AppState { + config: Config, +} + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .plugin(tauri_plugin_fs::init()) + .plugin(tauri_plugin_opener::init()) + .invoke_handler(tauri::generate_handler![ + get_config_path, + update_config, + get_default, + get_theme, + get_keys, + get_mouse_buttons, + get_mouse_display, + get_press_display, + get_size_display, + get_breaks, + start_listener, + label_from_keycode + ]) + .setup(|app| { + let config = config::Config::load_or_create(get_config_path()).unwrap(); + + let theme = &config.theme; + + // Validate and set the theme + let themes = vec!["grey", "night", "day", "catppuccin_mocha"]; + if themes.contains(&theme.as_str()) { + println!("Setting theme to: {}", theme); + app.manage(Mutex::new(AppState { + config: config, + })); + } else { + println!( + "{}", + format!("Theme {} is invalid! Valid themes are: {:?}", theme, themes) + ); + } + + + Ok(()) + }) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} + +// Commands +// Config commands +// gross but i tried returning a struct and everything froze up +#[tauri::command] +fn get_config_path() -> std::path::PathBuf { + let config_dir = dirs::config_dir().expect("Config directory not found"); + config_dir.join("keydisplay") +} +// update the app state with new config +#[tauri::command] +fn update_config(state: State<'_, Mutex>) { + let mut state = state.lock().unwrap(); + state.config = config::Config::load_or_create(get_config_path()).unwrap(); +} +#[tauri::command] +fn get_default(state: State<'_, Mutex>) -> Result { + let default = state.lock().unwrap().config.default.clone(); + Ok(default) +} +#[tauri::command] +fn get_theme(state: State<'_, Mutex>) -> Result { + let theme = state.lock().unwrap().config.theme.clone(); + Ok(theme) +} +#[tauri::command] +fn get_keys(state: State<'_, Mutex>) -> Result, Vec> { + let keys = state.lock().unwrap().config.listen.keys.clone(); + Ok(keys) +} +#[tauri::command] +fn get_mouse_buttons(state: State<'_, Mutex>) -> Result, Vec> { + let mouse_buttons = state.lock().unwrap().config.listen.mouse.clone(); + Ok(mouse_buttons) +} +#[tauri::command] +fn get_press_display(state: State<'_, Mutex>) -> Result { + let press_display = state.lock().unwrap().config.display.press.clone(); + Ok(press_display) +} +#[tauri::command] +fn get_size_display(state: State<'_, Mutex>) -> Result>, Vec>> { + let size_display = state.lock().unwrap().config.display.size.clone(); + Ok(size_display) +} +#[tauri::command] +fn get_mouse_display(state: State<'_, Mutex>) -> Result { + let mouse_display = state.lock().unwrap().config.display.mouse.clone(); + Ok(mouse_display) +} +#[tauri::command] +fn get_breaks(state: State<'_, Mutex>) -> Result, Vec> { + let breaks = state.lock().unwrap().config.display.r#break.clone(); + Ok(breaks) +} +// Input events + +#[tauri::command] +fn start_listener(keys: Vec, m_buttons: Vec, channel: Channel) { + thread::spawn(move || { + println!("Started listening for keys: {:?} and buttons: {:?}", keys, m_buttons); + listen(move |event| { + match event.event_type { + EventType::KeyPress(key) | EventType::KeyRelease(key) => { + if keys.contains(&serde_json::to_string(&key).unwrap().replace("\"", "")) { channel.send(event).unwrap() }; + }, + EventType::ButtonPress(button) | EventType::ButtonRelease(button) => { + if m_buttons.contains(&serde_json::to_string(&button).unwrap().replace("\"", "")) { channel.send(event).unwrap() }; + }, + EventType::MouseMove { x, y } => (), + EventType::Wheel { delta_x, delta_y } => (), + } + + }) + }); +} + +// Other rust +#[tauri::command] +fn label_from_keycode(code: &str) -> &str { + match code { + // Keyboard + // Fine as-is + "Alt"|"AltGr"|"End"|"Home"|"Pause" => code, + // All alphabetical keys + c if c.starts_with("Key") + && c.len() == 4 + && c.chars().nth(3).map_or(false, |c| c.is_ascii_alphabetic()) => &c[3..], + // Number row + c if c.starts_with("Num") + && c.len() == 4 + && c.chars().nth(3).map_or(false, |c| c.is_numeric()) => &c[3..], + // All F keys + c if c.starts_with("F") + && c.len() == 2 + && c.chars().nth(1).map_or(false, |c| c.is_numeric()) => c, + // Numpad numbers + c if c.starts_with("Kp") + && c.len() == 3 + && c.chars().nth(2).map_or(false, |c| c.is_numeric()) => &c[2..], + // Individual mappings + "Backspace" => "🡐", + "CapsLock" => "Caps", + "ControlLeft"|"ControlRight" => "Ctrl", + "Delete"|"KpDelete" => "Del", + "DownArrow" => "⯆", + "Escape" => "Esc", + "LeftArrow" => "⯇", + "MetaLeft"|"MetaRight" => "Super", + "PageDown" => "PgDn", + "PageUp" => "PgUp", + "Return" => "⮠", + "RightArrow" => "⯈", + "ShiftLeft"|"ShiftRight" => "Shift", + // needs an obscure blank character (U+E002D) - css acts weird if its a space or anything the program interprets as one + "Space" => "󠀯", + "Tab" => "⇌", + "UpArrow" => "⯅", + "PrintScreen" => "PrtSc", + "ScrollLock" => "ScrLk", + "NumLock" => "Num", + "BackQuote" => "`", + "Minus" => "-", + "Equal" => "=", + "LeftBracket" => "(", + "RightBracket" => ")", + "SemiColon" => ";", + "Quote" => "\"", + "BackSlash"|"IntlBackslash" => "\\", + "Comma" => ",", + "Dot" => ".", + "Slash"|"KpDivide" => "/", + "Insert" => "Ins", + "KpReturn" => "↲", + "KpPlus" => "+", + "KpMultiply" => "*", + "Function" => "Fn", + + // Mouse + "Left" => "M1", + "Right" => "M2", + "Middle" => "M3", + + &_ => { + println!("Error creating frontend label for keycode: {}, displaying as Unknown", code); + "Unknown" + }, + } +} \ No newline at end of file diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 0000000..59f52d8 --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,8 @@ +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +mod config; + +fn main() { + keydisplay_lib::run() +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json new file mode 100644 index 0000000..a7ac764 --- /dev/null +++ b/src-tauri/tauri.conf.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "keydisplay", + "version": "0.1.0", + "identifier": "whatisthisanandroidapp.keydisplay.starlight", + "build": { + "beforeDevCommand": "yarn dev", + "devUrl": "http://localhost:1420", + "beforeBuildCommand": "yarn build", + "frontendDist": "../build" + }, + "app": { + "windows": [ + { + "title": "keydisplay", + "width": 800, + "height": 600 + } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ] + } +} diff --git a/src/app.html b/src/app.html new file mode 100644 index 0000000..e7244c0 --- /dev/null +++ b/src/app.html @@ -0,0 +1,13 @@ + + + + + + + keydisplay + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/src/listen.rs b/src/listen.rs deleted file mode 100644 index 832b5d9..0000000 --- a/src/listen.rs +++ /dev/null @@ -1,316 +0,0 @@ -use inputbot::{KeybdKey, KeybdKey::*, MouseButton, MouseButton::*}; - -pub fn listen(keys: Vec, m_buttons: Vec) { - for key in keys { - key.bind(move || { - recieve_key_press(key); - while key.is_pressed() { - // theres probably a better way to do this - } - recieve_key_release(key); - }) - } - - for button in m_buttons { - button.bind(move || { - recieve_mouse_press(button); - while button.is_pressed() {} - recieve_mouse_release(button); - }) - } - - MiddleButton.bind(|| { - println!("aaa"); - }); - - inputbot::handle_input_events(); -} - -// move me into gui.rs later -fn recieve_key_press(key: KeybdKey) { - println!("pressed {}", string_from_keybdkey(key)); -} - -fn recieve_key_release(key: KeybdKey) { - println!("released {}", string_from_keybdkey(key)); -} - -fn recieve_mouse_press(button: MouseButton) { - println!("pressed {}", string_from_mousebutton(button)); -} - -fn recieve_mouse_release(button: MouseButton) { - println!("released {}", string_from_mousebutton(button)); -} - -pub fn keybdkey_from_config(key: &str) -> KeybdKey { - match key { - "BackspaceKey" => BackspaceKey, - "TabKey" => TabKey, - "EnterKey" => EnterKey, - "EscapeKey" => EscapeKey, - "SpaceKey" => EscapeKey, - "PageUpKey" => PageUpKey, - "PageDownKey" => PageDownKey, - "EndKey" => EndKey, - "HomeKey" => HomeKey, - "LeftKey" => LeftKey, - "UpKey" => UpKey, - "RightKey" => RightKey, - "DownKey" => DownKey, - "InsertKey" => InsertKey, - "DeleteKey" => DeleteKey, - "Numrow0Key" => Numrow0Key, - "Numrow1Key" => Numrow1Key, - "Numrow2Key" => Numrow2Key, - "Numrow3Key" => Numrow3Key, - "Numrow4Key" => Numrow4Key, - "Numrow5Key" => Numrow5Key, - "Numrow6Key" => Numrow6Key, - "Numrow7Key" => Numrow7Key, - "Numrow8Key" => Numrow8Key, - "Numrow9Key" => Numrow9Key, - "AKey" => AKey, - "BKey" => BKey, - "CKey" => CKey, - "DKey" => DKey, - "EKey" => EKey, - "FKey" => FKey, - "GKey" => GKey, - "HKey" => HKey, - "IKey" => IKey, - "JKey" => JKey, - "KKey" => KKey, - "LKey" => LKey, - "MKey" => MKey, - "NKey" => NKey, - "OKey" => OKey, - "PKey" => PKey, - "QKey" => QKey, - "RKey" => RKey, - "SKey" => SKey, - "TKey" => TKey, - "UKey" => UKey, - "VKey" => VKey, - "WKey" => WKey, - "XKey" => XKey, - "YKey" => YKey, - "ZKey" => ZKey, - "LSuper" => LSuper, - "RSuper" => RSuper, - "Numpad0Key" => Numpad0Key, - "Numpad1Key" => Numpad1Key, - "Numpad2Key" => Numpad2Key, - "Numpad3Key" => Numpad3Key, - "Numpad4Key" => Numpad4Key, - "Numpad5Key" => Numpad5Key, - "Numpad6Key" => Numpad6Key, - "Numpad7Key" => Numpad7Key, - "Numpad8Key" => Numpad8Key, - "Numpad9Key" => Numpad9Key, - "F1Key" => F1Key, - "F2Key" => F2Key, - "F3Key" => F3Key, - "F4Key" => F4Key, - "F5Key" => F5Key, - "F6Key" => F6Key, - "F7Key" => F7Key, - "F8Key" => F8Key, - "F9Key" => F9Key, - "F10Key" => F10Key, - "F11Key" => F11Key, - "F12Key" => F12Key, - "F13Key" => F13Key, - "F14Key" => F14Key, - "F15Key" => F15Key, - "F16Key" => F16Key, - "F17Key" => F17Key, - "F18Key" => F18Key, - "F19Key" => F19Key, - "F20Key" => F20Key, - "F21Key" => F21Key, - "F22Key" => F22Key, - "F23Key" => F23Key, - "F24Key" => F24Key, - "NumLockKey" => NumLockKey, - "ScrollLockKey" => ScrollLockKey, - "CapsLockKey" => CapsLockKey, - "LShiftKey" => LShiftKey, - "RShiftKey" => RShiftKey, - "LControlKey" => LControlKey, - "RControlKey" => RControlKey, - "LAltKey" => LAltKey, - "RAltKey" => RAltKey, - - "BrowserBackKey" => BrowserBackKey, - "BrowserForwardKey" => BrowserForwardKey, - "BrowserRefreshKey" => BrowserRefreshKey, - - "VolumeMuteKey" => VolumeMuteKey, - "VolumeDownKey" => VolumeDownKey, - "VolumeUpKey" => VolumeUpKey, - - "MediaNextTrackKey" => MediaNextTrackKey, - "MediaPrevTrackKey" => MediaPrevTrackKey, - "MediaStopKey" => MediaStopKey, - "MediaPlayPauseKey" => MediaPlayPauseKey, - - "BackquoteKey" => BackquoteKey, - "SlashKey" => SlashKey, - "BackslashKey" => BackslashKey, - "CommaKey" => CommaKey, - "PeriodKey" => PeriodKey, - "MinusKey" => MinusKey, - "QuoteKey" => QuoteKey, - "SemicolonKey" => SemicolonKey, - "LBracketKey" => LBracketKey, - "RBracketKey" => RBracketKey, - "EqualKey" => EqualKey, - _ => panic!("invalid keycode!"), - } -} - -pub fn string_from_keybdkey(key: KeybdKey) -> String { - match key { - BackspaceKey => String::from("🡐"), - TabKey => String::from("⇌"), - EnterKey => String::from("⮠"), - EscapeKey => String::from("ESC"), - SpaceKey => String::from(""), - PageUpKey => String::from("PGUP"), - PageDownKey => String::from("PGDN"), - EndKey => String::from("END"), - HomeKey => String::from("HOME"), - LeftKey => String::from("⯇"), - UpKey => String::from("⯅"), - RightKey => String::from("⯈"), - DownKey => String::from("⯆"), - InsertKey => String::from("INS"), - DeleteKey => String::from("DEL"), - Numrow0Key => String::from("0"), - Numrow1Key => String::from("1"), - Numrow2Key => String::from("2"), - Numrow3Key => String::from("3"), - Numrow4Key => String::from("4"), - Numrow5Key => String::from("5"), - Numrow6Key => String::from("6"), - Numrow7Key => String::from("7"), - Numrow8Key => String::from("8"), - Numrow9Key => String::from("9"), - AKey => String::from("A"), - BKey => String::from("B"), - CKey => String::from("C"), - DKey => String::from("D"), - EKey => String::from("E"), - FKey => String::from("F"), - GKey => String::from("G"), - HKey => String::from("H"), - IKey => String::from("I"), - JKey => String::from("J"), - KKey => String::from("K"), - LKey => String::from("L"), - MKey => String::from("M"), - NKey => String::from("N"), - OKey => String::from("O"), - PKey => String::from("P"), - QKey => String::from("Q"), - RKey => String::from("R"), - SKey => String::from("S"), - TKey => String::from("T"), - UKey => String::from("U"), - VKey => String::from("V"), - WKey => String::from("W"), - XKey => String::from("X"), - YKey => String::from("Y"), - ZKey => String::from("Z"), - LSuper => String::from("SUPER"), - RSuper => String::from("SUPER"), - Numpad0Key => String::from("0"), - Numpad1Key => String::from("1"), - Numpad2Key => String::from("2"), - Numpad3Key => String::from("3"), - Numpad4Key => String::from("4"), - Numpad5Key => String::from("5"), - Numpad6Key => String::from("6"), - Numpad7Key => String::from("7"), - Numpad8Key => String::from("8"), - Numpad9Key => String::from("9"), - F1Key => String::from("F1"), - F2Key => String::from("F2"), - F3Key => String::from("F3"), - F4Key => String::from("F4"), - F5Key => String::from("F5"), - F6Key => String::from("F6"), - F7Key => String::from("F7"), - F8Key => String::from("F8"), - F9Key => String::from("F9"), - F10Key => String::from("F10"), - F11Key => String::from("F11"), - F12Key => String::from("F12"), - F13Key => String::from("F13"), - F14Key => String::from("F14"), - F15Key => String::from("F15"), - F16Key => String::from("F16"), - F17Key => String::from("F17"), - F18Key => String::from("F18"), - F19Key => String::from("F19"), - F20Key => String::from("F20"), - F21Key => String::from("F21"), - F22Key => String::from("F22"), - F23Key => String::from("F23"), - F24Key => String::from("F24"), - NumLockKey => String::from("Num\nLock"), - ScrollLockKey => String::from("Scroll\nLock"), - CapsLockKey => String::from("CAPS"), - LShiftKey => String::from("SHIFT"), - RShiftKey => String::from("SHIFT"), - LControlKey => String::from("CTRL"), - RControlKey => String::from("CTRL"), - LAltKey => String::from("ALT"), - RAltKey => String::from("ALT"), - BrowserBackKey => String::from("🡨"), - BrowserForwardKey => String::from("🡪"), - BrowserRefreshKey => String::from("⟳"), - VolumeMuteKey => String::from("🔊"), - VolumeDownKey => String::from("🔉"), - VolumeUpKey => String::from("🔈+"), - MediaNextTrackKey => String::from("⏭"), - MediaPrevTrackKey => String::from("⏮"), - MediaStopKey => String::from("⏹ "), - MediaPlayPauseKey => String::from("⏵"), - BackquoteKey => String::from("`"), - SlashKey => String::from("/"), - BackslashKey => String::from("\\"), - CommaKey => String::from(","), - PeriodKey => String::from("."), - MinusKey => String::from("-"), - QuoteKey => String::from("\""), - SemicolonKey => String::from(";"), - LBracketKey => String::from("("), - RBracketKey => String::from("),"), - EqualKey => String::from("="), - _ => panic!("invalid keycode!"), - } -} - -pub fn mousebutton_from_config(button: &str) -> MouseButton { - match button { - "LeftButton" => LeftButton, - "MiddleButton" => MiddleButton, - "RightButton" => RightButton, - _ => { - panic!("invalid mouse button! (InputBot hasn't implemented it or your config is wrong)") - } - } -} - -pub fn string_from_mousebutton(button: MouseButton) -> String { - match button { - LeftButton => String::from("M1"), - MiddleButton => String::from("M3"), - RightButton => String::from("M2"), - _ => { - panic!("invalid mouse button! (InputBot hasn't implemented it or your config is wrong)") - } - } -} diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index 0be2550..0000000 --- a/src/main.rs +++ /dev/null @@ -1,124 +0,0 @@ -slint::include_modules!(); -use inputbot::{KeybdKey, MouseButton}; -use listen::*; -use slint::Color; -//use theme::*; - -mod config; -mod listen; -//mod theme; - -use std::thread; - -fn parse_config() -> Result { - let config_dir = dirs::config_dir().expect("Config directory not found"); - let keydisplay_dir = config_dir.join("keydisplay"); - - config::Config::load_or_create(keydisplay_dir) -} - -// obs -const GREY: slint_generatedMainWindow::Theme = Theme { - app_background: Color::from_argb_encoded(0xFF2F2F2F), - key_background: Color::from_argb_encoded(0xFF363636), - key_background_pressed: Color::from_argb_encoded(0xFF212121), - key_border: Color::from_argb_encoded(0xFF737373), - key_text: Color::from_argb_encoded(0xFFFFFFFF), - key_text_pressed: Color::from_argb_encoded(0xFFFFFFFF), -}; - -// florisboard themes -const NIGHT: slint_generatedMainWindow::Theme = Theme { - app_background: Color::from_argb_encoded(0xFF000000), - key_background: Color::from_argb_encoded(0xFF111111), - key_background_pressed: Color::from_argb_encoded(0xFF212121), - key_border: Color::from_argb_encoded(0xFF707070), - key_text: Color::from_argb_encoded(0xFFEEEEEE), - key_text_pressed: Color::from_argb_encoded(0xFFEEEEEE), -}; - -const DAY: slint_generatedMainWindow::Theme = Theme { - app_background: Color::from_argb_encoded(0xFFE0E0E0), - key_background: Color::from_argb_encoded(0xFFFFFFFF), - key_background_pressed: Color::from_argb_encoded(0xFFEEEEEE), - key_border: Color::from_argb_encoded(0xFFFFFFFF), - key_text: Color::from_argb_encoded(0xFF000000), - key_text_pressed: Color::from_argb_encoded(0xFF000000), -}; - -// guess -const CATPPUCCIN_MOCHA: slint_generatedMainWindow::Theme = Theme { - app_background: Color::from_argb_encoded(0xFF181825), - key_background: Color::from_argb_encoded(0xFF1E1E2E), - key_background_pressed: Color::from_argb_encoded(0xFF313244), - key_border: Color::from_argb_encoded(0xFFF5E0DC), - key_text: Color::from_argb_encoded(0xFFCDD6F4), - key_text_pressed: Color::from_argb_encoded(0xFFCDD6F4), -}; - -pub fn theme_from_config(theme: &str) -> slint_generatedMainWindow::Theme { - match theme { - "grey" => GREY, - "night" => NIGHT, - "day" => DAY, - "catppuccin_mocha" => CATPPUCCIN_MOCHA, - _ => { - println!("invalid theme provided by config, defaulting to grey"); - GREY - } - } -} - -fn run_gui( - keys: Vec, - m_buttons: Vec, - theme: String, -) -> Result<(), slint::PlatformError> { - let ui = MainWindow::new()?; - - let mut keyitems: Vec = Vec::new(); - for key in keys { - keyitems.push(KeyData { - key: string_from_keybdkey(key).into(), - }) - } - - let mut mouseitems: Vec = Vec::new(); - for button in m_buttons { - mouseitems.push(KeyData { - key: string_from_mousebutton(button).into(), - }) - } - - ui.set_theme(theme_from_config(&theme)); - - ui.set_keys(std::rc::Rc::new(slint::VecModel::from(keyitems)).into()); - ui.set_m_buttons(std::rc::Rc::new(slint::VecModel::from(mouseitems)).into()); - - ui.run() -} - -fn main() { - println!("Hello, world!"); - - let config = parse_config().unwrap(); - let mut config_to_keys: Vec = Vec::new(); - for key in config.listen.keys { - // rust is magic 😍 🦀 - config_to_keys.push(keybdkey_from_config(&key)); - } - - let mut config_to_mouse: Vec = Vec::new(); - for button in config.listen.mouse { - config_to_mouse.push(mousebutton_from_config(&button)); - } - - let hack = config_to_keys.clone(); - let hack2 = config_to_mouse.clone(); - - thread::spawn(move || { - listen(config_to_keys, config_to_mouse); - }); - - let _ = run_gui(hack, hack2, config.theme); -} diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts new file mode 100644 index 0000000..f4fb689 --- /dev/null +++ b/src/routes/+layout.ts @@ -0,0 +1,5 @@ +// Tauri doesn't have a Node.js server to do proper SSR +// so we will use adapter-static to prerender the app (SSG) +// See: https://v2.tauri.app/start/frontend/sveltekit/ for more info +export const prerender = true; +export const ssr = false; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..be933e8 --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,216 @@ + + +
+ {#if default_config} +
Docs for configuring this program are at https://git.stardust.wtf/starlight/keydisplay/src/branch/main/README.md
You can disable this annoying notice by removing the default = true line from {config_path} :)
+ {/if} +
+ {#each key_elements as key (key.code)} + + + {#if breaks.has(key.code)} +
+ {/if} + {/each} +
+
+ {#each mouse_button_elements as button (button.code)} + + + {#if breaks.has(button.code)} +
+ {/if} + {/each} +
+
\ No newline at end of file diff --git a/src/routes/Key.svelte b/src/routes/Key.svelte new file mode 100644 index 0000000..0296711 --- /dev/null +++ b/src/routes/Key.svelte @@ -0,0 +1,14 @@ + + + +
+{label} +
\ No newline at end of file diff --git a/static/favicon.png b/static/favicon.png new file mode 100644 index 0000000..825b9e6 Binary files /dev/null and b/static/favicon.png differ diff --git a/static/global.css b/static/global.css new file mode 100644 index 0000000..9cd1298 --- /dev/null +++ b/static/global.css @@ -0,0 +1,158 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, +body, +div, +span, +h1, +h2, +h3, +h4, +h5, +h6, +p, +a, +code, +img { + margin: 0; + padding: 0; + border: 0; + outline: none; + text-decoration: none; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} + +/* https://fossheim.io/writing/posts/accessible-theme-picker-html-css-js/ */ + +:root, +[data-selected-theme="grey"] { + --color-app-background: #2F2F2F; + --color-key-background: #363636; + --color-key-background-pressed: #212121; + --color-text: #fff; + --color-accent: #737373; +} +[data-selected-theme="night"] { + --color-app-background: #000; + --color-key-background: #0f0f0f; + --color-key-background-pressed: #212121; + --color-text: #eee; + --color-accent: #525151; +} +[data-selected-theme="day"] { + --color-app-background: #e0e0e0; + --color-key-background: #fff; + --color-key-background-pressed: #eee; + --color-text: #000; + --color-accent: #fff; +} +[data-selected-theme="catppuccin_mocha"] { + --color-app-background: #181825; + --color-key-background: #1e1e2e; + --color-key-background-pressed: #313244; + --color-text: #cdd6f4; + --color-accent: #f5e0dc; +} + +:root { + background-color: var(--color-app-background); + color: var(--color-text); + + font-family: Inter, Avenir, Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +.container { + margin: 0; + display: flex; + flex-direction: column; + justify-content: center; + text-align: center; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + color: #0f0f0f; + background-color: #ffffff; + transition: border-color 0.25s; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2); + cursor: pointer; + outline: none; +} + +button:hover { + border-color: #396cd8; +} +button:active { + border-color: #396cd8; + background-color: #e8e8e8; +} + +a { + color:#ABFFAC; + text-decoration: underline; +} + +code { + font-family: monospace; +} + +div#default_config { + color: #FFF; + background-color: #F37945; + border: 2px solid #EB5B28; + border-radius: 10px; + width: 95vw; + margin-inline: auto; + margin-top: 5px; + overflow-wrap: break-word; +} + +div#keys, +div#mouse_buttons { + /* horizontal spacing between keys is dependent on font-size of the parent div? */ + font-size: 0; +} + +.key { + width: 100px; + height: 100px; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 20px; + margin: 5px; + border: 5px solid var(--color-accent); + border-radius: 5px; + transition: var(--pressed-transition); + background-color: var(--color-key-background); + cursor: pointer; + user-select: none; +} + +[data-press-display="ease"] { + --pressed-transition: background-color 0.1s ease, transform 0.1s ease; +} + +.pressed { + background-color: var(--color-key-background-pressed) !important; + transform: scale(0.95); + box-shadow: 0 2px 5px rgba(0,0,0,0.2); +} \ No newline at end of file diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..2d45f91 --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,15 @@ +// Tauri doesn't have a Node.js server to do proper SSR +// so we will use adapter-static to prerender the app (SSG) +// See: https://v2.tauri.app/start/frontend/sveltekit/ for more info +import adapter from "@sveltejs/adapter-static"; +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + preprocess: vitePreprocess(), + kit: { + adapter: adapter(), + }, +}; + +export default config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..593dc19 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias + // except $lib which is handled by https://kit.svelte.dev/docs/configuration#files + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in +} diff --git a/ui/window.slint b/ui/window.slint deleted file mode 100644 index 120df43..0000000 --- a/ui/window.slint +++ /dev/null @@ -1,74 +0,0 @@ -export struct Theme { - app_background: color, - key_background: color, - key_background_pressed: color, - key_border: color, - key_text: color, - key_text_pressed: color, -} - -struct KeyData { - key: string, -} - -component Key inherits Rectangle { - in-out property key_text_content; - - in-out property key_background; - in-out property key_border; - in-out property key_text_color; - - width: 100px; - height: 100px; - border-width: 5px; - border-radius: 5px; - background: key_background; - border-color: key_border; - - Text { - text: "\{key_text_content}"; - font-weight: 800; - color: key_text_color; - horizontal-alignment: center; - vertical-alignment: center; - } -} - -export component MainWindow inherits Window { - in-out property theme; - in-out property <[KeyData]> keys; - in-out property <[KeyData]> m_buttons; - keys: []; - m_buttons: []; - - title: "keydisplay"; - - // 14 px padding + 100px for every key + 5px for every space + 14 px padding - width: 14px+(100px*(keys.length + m_buttons.length))+(5px*(keys.length + m_buttons.length - 1))+14px; - height: 128px; - - default-font-size: 25px; - background: theme.app_background; - - HorizontalLayout { - padding: 14px; - spacing: 5px; - - for key[i] in keys : Key{ - key_text_content: key.key; - key_background: theme.key_background; - key_border: theme.key_border; - key_text_color: theme.key_text; - - } - - for button[i] in m_buttons : Key{ - key_text_content: button.key; - key_background: theme.key_background; - key_border: theme.key_border; - key_text_color: theme.key_text; - - } - } - -} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..6dee1ec --- /dev/null +++ b/vite.config.js @@ -0,0 +1,32 @@ +import { defineConfig } from "vite"; +import { sveltekit } from "@sveltejs/kit/vite"; + +// @ts-expect-error process is a nodejs global +const host = process.env.TAURI_DEV_HOST; + +// https://vitejs.dev/config/ +export default defineConfig(async () => ({ + plugins: [sveltekit()], + + // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` + // + // 1. prevent vite from obscuring rust errors + clearScreen: false, + // 2. tauri expects a fixed port, fail if that port is not available + server: { + port: 1420, + strictPort: true, + host: host || false, + hmr: host + ? { + protocol: "ws", + host, + port: 1421, + } + : undefined, + watch: { + // 3. tell vite to ignore watching `src-tauri` + ignored: ["**/src-tauri/**"], + }, + }, +})); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..277b55c --- /dev/null +++ b/yarn.lock @@ -0,0 +1,695 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@esbuild/aix-ppc64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz#38848d3e25afe842a7943643cbcd387cc6e13461" + integrity sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA== + +"@esbuild/android-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz#f592957ae8b5643129fa889c79e69cd8669bb894" + integrity sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg== + +"@esbuild/android-arm@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.2.tgz#72d8a2063aa630308af486a7e5cbcd1e134335b3" + integrity sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q== + +"@esbuild/android-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.2.tgz#9a7713504d5f04792f33be9c197a882b2d88febb" + integrity sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw== + +"@esbuild/darwin-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz#02ae04ad8ebffd6e2ea096181b3366816b2b5936" + integrity sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA== + +"@esbuild/darwin-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz#9ec312bc29c60e1b6cecadc82bd504d8adaa19e9" + integrity sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA== + +"@esbuild/freebsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz#5e82f44cb4906d6aebf24497d6a068cfc152fa00" + integrity sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg== + +"@esbuild/freebsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz#3fb1ce92f276168b75074b4e51aa0d8141ecce7f" + integrity sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q== + +"@esbuild/linux-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz#856b632d79eb80aec0864381efd29de8fd0b1f43" + integrity sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg== + +"@esbuild/linux-arm@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz#c846b4694dc5a75d1444f52257ccc5659021b736" + integrity sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA== + +"@esbuild/linux-ia32@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz#f8a16615a78826ccbb6566fab9a9606cfd4a37d5" + integrity sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw== + +"@esbuild/linux-loong64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz#1c451538c765bf14913512c76ed8a351e18b09fc" + integrity sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ== + +"@esbuild/linux-mips64el@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz#0846edeefbc3d8d50645c51869cc64401d9239cb" + integrity sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw== + +"@esbuild/linux-ppc64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz#8e3fc54505671d193337a36dfd4c1a23b8a41412" + integrity sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw== + +"@esbuild/linux-riscv64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz#6a1e92096d5e68f7bb10a0d64bb5b6d1daf9a694" + integrity sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q== + +"@esbuild/linux-s390x@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz#ab18e56e66f7a3c49cb97d337cd0a6fea28a8577" + integrity sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw== + +"@esbuild/linux-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz#8140c9b40da634d380b0b29c837a0b4267aff38f" + integrity sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q== + +"@esbuild/netbsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz#65f19161432bafb3981f5f20a7ff45abb2e708e6" + integrity sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw== + +"@esbuild/netbsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz#7a3a97d77abfd11765a72f1c6f9b18f5396bcc40" + integrity sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw== + +"@esbuild/openbsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz#58b00238dd8f123bfff68d3acc53a6ee369af89f" + integrity sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A== + +"@esbuild/openbsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz#0ac843fda0feb85a93e288842936c21a00a8a205" + integrity sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA== + +"@esbuild/sunos-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz#8b7aa895e07828d36c422a4404cc2ecf27fb15c6" + integrity sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig== + +"@esbuild/win32-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz#c023afb647cabf0c3ed13f0eddfc4f1d61c66a85" + integrity sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ== + +"@esbuild/win32-ia32@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz#96c356132d2dda990098c8b8b951209c3cd743c2" + integrity sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA== + +"@esbuild/win32-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz#34aa0b52d0fbb1a654b596acfa595f0c7b77a77b" + integrity sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg== + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.28" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73" + integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw== + +"@rollup/rollup-android-arm-eabi@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.6.tgz#9b726b4dcafb9332991e9ca49d54bafc71d9d87f" + integrity sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg== + +"@rollup/rollup-android-arm64@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.6.tgz#88326ff46168a47851077ca0bf0c442689ec088f" + integrity sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA== + +"@rollup/rollup-darwin-arm64@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.6.tgz#b8fbcc9389bc6fad3334a1d16dbeaaa5637c5772" + integrity sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg== + +"@rollup/rollup-darwin-x64@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.6.tgz#1aa2bcad84c0fb5902e945d88822e17a4f661d51" + integrity sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg== + +"@rollup/rollup-freebsd-arm64@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.6.tgz#29c54617e0929264dcb6416597d6d7481696e49f" + integrity sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ== + +"@rollup/rollup-freebsd-x64@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.6.tgz#a8b58ab7d31882559d93f2d1b5863d9e4b4b2678" + integrity sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.6.tgz#a844e1978c8b9766b169ecb1cb5cc0d8a3f05930" + integrity sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg== + +"@rollup/rollup-linux-arm-musleabihf@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.6.tgz#6b44c3b7257985d71b087fcb4ef01325e2fff201" + integrity sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg== + +"@rollup/rollup-linux-arm64-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.6.tgz#ebb499cf1720115256d0c9ae7598c90cc2251bc5" + integrity sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA== + +"@rollup/rollup-linux-arm64-musl@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.6.tgz#9658221b59d9e5643348f9a52fa5ef35b4dc07b1" + integrity sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q== + +"@rollup/rollup-linux-loongarch64-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.6.tgz#19418cc57579a5655af2d850a89d74b3f7e9aa92" + integrity sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.6.tgz#fe0bce7778cb6ce86898c781f3f11369d1a4952c" + integrity sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ== + +"@rollup/rollup-linux-riscv64-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.6.tgz#9c158360abf6e6f7794285642ba0898c580291f6" + integrity sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg== + +"@rollup/rollup-linux-s390x-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.6.tgz#f9113498d22962baacdda008b5587d568b05aa34" + integrity sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw== + +"@rollup/rollup-linux-x64-gnu@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.6.tgz#aec8d4cdf911cd869a72b8bd00833cb426664e0c" + integrity sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw== + +"@rollup/rollup-linux-x64-musl@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.6.tgz#61c0a146bdd1b5e0dcda33690dd909b321d8f20f" + integrity sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A== + +"@rollup/rollup-win32-arm64-msvc@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.6.tgz#c6c5bf290a3a459c18871110bc2e7009ce35b15a" + integrity sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA== + +"@rollup/rollup-win32-ia32-msvc@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.6.tgz#16ca6bdadc9e054818b9c51f8dac82f6b8afab81" + integrity sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA== + +"@rollup/rollup-win32-x64-msvc@4.34.6": + version "4.34.6" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.6.tgz#f3d03ce2d82723eb089188ea1494a719b09e1561" + integrity sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w== + +"@sveltejs/adapter-static@^3.0.6": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@sveltejs/adapter-static/-/adapter-static-3.0.8.tgz#f23ee99a9678dbaec58b79d183bc3defbfe99f1a" + integrity sha512-YaDrquRpZwfcXbnlDsSrBQNCChVOT9MGuSg+dMAyfsAa1SmiAhrA5jUYUiIMC59G92kIbY/AaQOWcBdq+lh+zg== + +"@sveltejs/kit@^2.9.0": + version "2.17.1" + resolved "https://registry.yarnpkg.com/@sveltejs/kit/-/kit-2.17.1.tgz#24a55dc164f2c88511daac6fcc8bb7db6802d1ba" + integrity sha512-CpoGSLqE2MCmcQwA2CWJvOsZ9vW+p/1H3itrFykdgajUNAEyQPbsaSn7fZb6PLHQwe+07njxje9ss0fjZoCAyw== + dependencies: + "@types/cookie" "^0.6.0" + cookie "^0.6.0" + devalue "^5.1.0" + esm-env "^1.2.2" + import-meta-resolve "^4.1.0" + kleur "^4.1.5" + magic-string "^0.30.5" + mrmime "^2.0.0" + sade "^1.8.1" + set-cookie-parser "^2.6.0" + sirv "^3.0.0" + +"@sveltejs/vite-plugin-svelte-inspector@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz#2f99a4a593bb910d1492f6c00a042b521c07147e" + integrity sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw== + dependencies: + debug "^4.3.7" + +"@sveltejs/vite-plugin-svelte@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.0.3.tgz#50f425c677243e00fda0402c049f28b489c7ab81" + integrity sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw== + dependencies: + "@sveltejs/vite-plugin-svelte-inspector" "^4.0.1" + debug "^4.4.0" + deepmerge "^4.3.1" + kleur "^4.1.5" + magic-string "^0.30.15" + vitefu "^1.0.4" + +"@tauri-apps/api@^2", "@tauri-apps/api@^2.0.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.2.0.tgz#daaff2515b1a4ff1e763cf84a414548b02b566c5" + integrity sha512-R8epOeZl1eJEl603aUMIGb4RXlhPjpgxbGVEaqY+0G5JG9vzV/clNlzTeqc+NLYXVqXcn8mb4c5b9pJIUDEyAg== + +"@tauri-apps/cli-darwin-arm64@2.2.7": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.2.7.tgz#42ec056eb19309aa50b11c9568b6c0e6637f41ca" + integrity sha512-54kcpxZ3X1Rq+pPTzk3iIcjEVY4yv493uRx/80rLoAA95vAC0c//31Whz75UVddDjJfZvXlXZ3uSZ+bnCOnt0A== + +"@tauri-apps/cli-darwin-x64@2.2.7": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.2.7.tgz#60cb5806e7bec9af2e22ae38a6bd2a769b0a61b0" + integrity sha512-Vgu2XtBWemLnarB+6LqQeLanDlRj7CeFN//H8bVVdjbNzxcSxsvbLYMBP8+3boa7eBnjDrqMImRySSgL6IrwTw== + +"@tauri-apps/cli-linux-arm-gnueabihf@2.2.7": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.2.7.tgz#451029b68b50486e0553adf1a45cbd27c00eb3f9" + integrity sha512-+Clha2iQAiK9zoY/KKW0KLHkR0k36O78YLx5Sl98tWkwI3OBZFg5H5WT1plH/4sbZIS2aLFN6dw58/JlY9Bu/g== + +"@tauri-apps/cli-linux-arm64-gnu@2.2.7": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.2.7.tgz#74f28cc303b0f476209c6117325fc235a3d5ad0f" + integrity sha512-Z/Lp4SQe6BUEOays9BQAEum2pvZF4w9igyXijP+WbkOejZx4cDvarFJ5qXrqSLmBh7vxrdZcLwoLk9U//+yQrg== + +"@tauri-apps/cli-linux-arm64-musl@2.2.7": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.7.tgz#c51890295186395effd2a751739b88c9689eea6c" + integrity sha512-+8HZ+txff/Y3YjAh80XcLXcX8kpGXVdr1P8AfjLHxHdS6QD4Md+acSxGTTNbplmHuBaSHJvuTvZf9tU1eDCTDg== + +"@tauri-apps/cli-linux-x64-gnu@2.2.7": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.2.7.tgz#14959a065858dcc6bff87ca8eb4525b071ab4ffe" + integrity sha512-ahlSnuCnUntblp9dG7/w5ZWZOdzRFi3zl0oScgt7GF4KNAOEa7duADsxPA4/FT2hLRa0SvpqtD4IYFvCxoVv3Q== + +"@tauri-apps/cli-linux-x64-musl@2.2.7": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.7.tgz#6199c671d760b39c75ad13228cc422fadbbd0b15" + integrity sha512-+qKAWnJRSX+pjjRbKAQgTdFY8ecdcu8UdJ69i7wn3ZcRn2nMMzOO2LOMOTQV42B7/Q64D1pIpmZj9yblTMvadA== + +"@tauri-apps/cli-win32-arm64-msvc@2.2.7": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.2.7.tgz#e83f3efda339f8315a54c6b3a105bb16c1d78d66" + integrity sha512-aa86nRnrwT04u9D9fhf5JVssuAZlUCCc8AjqQjqODQjMd4BMA2+d4K9qBMpEG/1kVh95vZaNsLogjEaqSTTw4A== + +"@tauri-apps/cli-win32-ia32-msvc@2.2.7": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.2.7.tgz#6e9cdc615cf1f86469e067e65493a85470c4d6c7" + integrity sha512-EiJ5/25tLSQOSGvv+t6o3ZBfOTKB5S3vb+hHQuKbfmKdRF0XQu2YPdIi1CQw1DU97ZAE0Dq4frvnyYEKWgMzVQ== + +"@tauri-apps/cli-win32-x64-msvc@2.2.7": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.2.7.tgz#c561efac129b386be35a936b0080a4cd2cd01b6d" + integrity sha512-ZB8Kw90j8Ld+9tCWyD2fWCYfIrzbQohJ4DJSidNwbnehlZzP7wAz6Z3xjsvUdKtQ3ibtfoeTqVInzCCEpI+pWg== + +"@tauri-apps/cli@^2": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-2.2.7.tgz#4aedaf941f58bf2839fec38aa8191c5aefc7bb45" + integrity sha512-ZnsS2B4BplwXP37celanNANiIy8TCYhvg5RT09n72uR/o+navFZtGpFSqljV8fy1Y4ixIPds8FrGSXJCN2BerA== + optionalDependencies: + "@tauri-apps/cli-darwin-arm64" "2.2.7" + "@tauri-apps/cli-darwin-x64" "2.2.7" + "@tauri-apps/cli-linux-arm-gnueabihf" "2.2.7" + "@tauri-apps/cli-linux-arm64-gnu" "2.2.7" + "@tauri-apps/cli-linux-arm64-musl" "2.2.7" + "@tauri-apps/cli-linux-x64-gnu" "2.2.7" + "@tauri-apps/cli-linux-x64-musl" "2.2.7" + "@tauri-apps/cli-win32-arm64-msvc" "2.2.7" + "@tauri-apps/cli-win32-ia32-msvc" "2.2.7" + "@tauri-apps/cli-win32-x64-msvc" "2.2.7" + +"@tauri-apps/plugin-fs@~2": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@tauri-apps/plugin-fs/-/plugin-fs-2.2.0.tgz#3cf2968139a9cd9e4d12a7a7176c0b59e446b0a3" + integrity sha512-+08mApuONKI8/sCNEZ6AR8vf5vI9DXD4YfrQ9NQmhRxYKMLVhRW164vdW5BSLmMpuevftpQ2FVoL9EFkfG9Z+g== + dependencies: + "@tauri-apps/api" "^2.0.0" + +"@tauri-apps/plugin-opener@^2": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@tauri-apps/plugin-opener/-/plugin-opener-2.2.5.tgz#928b917d28d3e8b5bafb90f5f91fb0ed20c27fd4" + integrity sha512-hHsJ9RPWpZvZEPVFaL+d25gABMUMOf/A6ESXnvf/ii9guTukj58WXsAE/SOysXRIhej7kseRCxnOnIMpSCdUsQ== + dependencies: + "@tauri-apps/api" "^2.0.0" + +"@types/cookie@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" + integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== + +"@types/estree@1.0.6", "@types/estree@^1.0.5", "@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + +acorn-typescript@^1.4.13: + version "1.4.13" + resolved "https://registry.yarnpkg.com/acorn-typescript/-/acorn-typescript-1.4.13.tgz#5f851c8bdda0aa716ffdd5f6ac084df8acc6f5ea" + integrity sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q== + +acorn@^8.12.1: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + +aria-query@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" + integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== + +axobject-query@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" + integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== + +chokidar@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + +clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +cookie@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== + +debug@^4.3.7, debug@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +devalue@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/devalue/-/devalue-5.1.1.tgz#a71887ac0f354652851752654e4bd435a53891ae" + integrity sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw== + +esbuild@^0.24.2: + version "0.24.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.2.tgz#b5b55bee7de017bff5fb8a4e3e44f2ebe2c3567d" + integrity sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA== + optionalDependencies: + "@esbuild/aix-ppc64" "0.24.2" + "@esbuild/android-arm" "0.24.2" + "@esbuild/android-arm64" "0.24.2" + "@esbuild/android-x64" "0.24.2" + "@esbuild/darwin-arm64" "0.24.2" + "@esbuild/darwin-x64" "0.24.2" + "@esbuild/freebsd-arm64" "0.24.2" + "@esbuild/freebsd-x64" "0.24.2" + "@esbuild/linux-arm" "0.24.2" + "@esbuild/linux-arm64" "0.24.2" + "@esbuild/linux-ia32" "0.24.2" + "@esbuild/linux-loong64" "0.24.2" + "@esbuild/linux-mips64el" "0.24.2" + "@esbuild/linux-ppc64" "0.24.2" + "@esbuild/linux-riscv64" "0.24.2" + "@esbuild/linux-s390x" "0.24.2" + "@esbuild/linux-x64" "0.24.2" + "@esbuild/netbsd-arm64" "0.24.2" + "@esbuild/netbsd-x64" "0.24.2" + "@esbuild/openbsd-arm64" "0.24.2" + "@esbuild/openbsd-x64" "0.24.2" + "@esbuild/sunos-x64" "0.24.2" + "@esbuild/win32-arm64" "0.24.2" + "@esbuild/win32-ia32" "0.24.2" + "@esbuild/win32-x64" "0.24.2" + +esm-env@^1.2.1, esm-env@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/esm-env/-/esm-env-1.2.2.tgz#263c9455c55861f41618df31b20cb571fc20b75e" + integrity sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA== + +esrap@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/esrap/-/esrap-1.4.3.tgz#456ed3c97cf0e6b58b952d351c7c78fe27116576" + integrity sha512-Xddc1RsoFJ4z9nR7W7BFaEPIp4UXoeQ0+077UdWLxbafMQFyU79sQJMk7kxNgRwQ9/aVgaKacCHC2pUACGwmYw== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + +fdir@^6.2.0: + version "6.4.3" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.3.tgz#011cdacf837eca9b811c89dbb902df714273db72" + integrity sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +import-meta-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" + integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== + +is-reference@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.3.tgz#9ef7bf9029c70a67b2152da4adf57c23d718910f" + integrity sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw== + dependencies: + "@types/estree" "^1.0.6" + +kleur@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + +locate-character@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-3.0.0.tgz#0305c5b8744f61028ef5d01f444009e00779f974" + integrity sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA== + +magic-string@^0.30.11, magic-string@^0.30.15, magic-string@^0.30.5: + version "0.30.17" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + +mri@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + +mrmime@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.8: + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== + +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +postcss@^8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214" + integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ== + dependencies: + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +readdirp@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.1.tgz#bd115327129672dc47f87408f05df9bd9ca3ef55" + integrity sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw== + +rollup@^4.30.1: + version "4.34.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.34.6.tgz#a07e4d2621759e29034d909655e7a32eee9195c9" + integrity sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ== + dependencies: + "@types/estree" "1.0.6" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.34.6" + "@rollup/rollup-android-arm64" "4.34.6" + "@rollup/rollup-darwin-arm64" "4.34.6" + "@rollup/rollup-darwin-x64" "4.34.6" + "@rollup/rollup-freebsd-arm64" "4.34.6" + "@rollup/rollup-freebsd-x64" "4.34.6" + "@rollup/rollup-linux-arm-gnueabihf" "4.34.6" + "@rollup/rollup-linux-arm-musleabihf" "4.34.6" + "@rollup/rollup-linux-arm64-gnu" "4.34.6" + "@rollup/rollup-linux-arm64-musl" "4.34.6" + "@rollup/rollup-linux-loongarch64-gnu" "4.34.6" + "@rollup/rollup-linux-powerpc64le-gnu" "4.34.6" + "@rollup/rollup-linux-riscv64-gnu" "4.34.6" + "@rollup/rollup-linux-s390x-gnu" "4.34.6" + "@rollup/rollup-linux-x64-gnu" "4.34.6" + "@rollup/rollup-linux-x64-musl" "4.34.6" + "@rollup/rollup-win32-arm64-msvc" "4.34.6" + "@rollup/rollup-win32-ia32-msvc" "4.34.6" + "@rollup/rollup-win32-x64-msvc" "4.34.6" + fsevents "~2.3.2" + +sade@^1.7.4, sade@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== + dependencies: + mri "^1.1.0" + +set-cookie-parser@^2.6.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz#3016f150072202dfbe90fadee053573cc89d2943" + integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== + +sirv@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-3.0.0.tgz#f8d90fc528f65dff04cb597a88609d4e8a4361ce" + integrity sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg== + dependencies: + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" + +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +svelte-check@^4.0.0: + version "4.1.4" + resolved "https://registry.yarnpkg.com/svelte-check/-/svelte-check-4.1.4.tgz#59ec6f08d23647ec508ff01584ef6d191c77c9e1" + integrity sha512-v0j7yLbT29MezzaQJPEDwksybTE2Ups9rUxEXy92T06TiA0cbqcO8wAOwNUVkFW6B0hsYHA+oAX3BS8b/2oHtw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + chokidar "^4.0.1" + fdir "^6.2.0" + picocolors "^1.0.0" + sade "^1.7.4" + +svelte@^5.0.0: + version "5.19.9" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-5.19.9.tgz#ab29aafe43a512a4ceb517c4f7e2ed4f972c87cc" + integrity sha512-860s752/ZZxHIsii31ELkdKBOCeAuDsfb/AGUXJyQyzUVLRSt4oqEw/BV5+2+mNg8mbqmD3OK+vMvwWMPM6f8A== + dependencies: + "@ampproject/remapping" "^2.3.0" + "@jridgewell/sourcemap-codec" "^1.5.0" + "@types/estree" "^1.0.5" + acorn "^8.12.1" + acorn-typescript "^1.4.13" + aria-query "^5.3.1" + axobject-query "^4.1.0" + clsx "^2.1.1" + esm-env "^1.2.1" + esrap "^1.4.3" + is-reference "^3.0.3" + locate-character "^3.0.0" + magic-string "^0.30.11" + zimmerframe "^1.1.2" + +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + +typescript@~5.6.2: + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + +vite@^6.0.3: + version "6.1.0" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.1.0.tgz#00a4e99a23751af98a2e4701c65ba89ce23858a6" + integrity sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ== + dependencies: + esbuild "^0.24.2" + postcss "^8.5.1" + rollup "^4.30.1" + optionalDependencies: + fsevents "~2.3.3" + +vitefu@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/vitefu/-/vitefu-1.0.5.tgz#eab501e07da167bbb68e957685823e6b425e7ce2" + integrity sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA== + +zimmerframe@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/zimmerframe/-/zimmerframe-1.1.2.tgz#5b75f1fa83b07ae2a428d51e50f58e2ae6855e5e" + integrity sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==