i'm a selfish little fuck and just used tauri because i dont wanna learn a new thing
11
.gitignore
vendored
@ -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
|
/target
|
||||||
Cargo.lock
|
Cargo.lock
|
||||||
|
7
.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"svelte.svelte-vscode",
|
||||||
|
"tauri-apps.tauri-vscode",
|
||||||
|
"rust-lang.rust-analyzer"
|
||||||
|
]
|
||||||
|
}
|
16
.vscode/launch.json
vendored
Normal file
@ -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}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
3
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"svelte.enable-ts-plugin": true
|
||||||
|
}
|
15
Cargo.toml
@ -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"
|
|
39
README.md
@ -1,40 +1,3 @@
|
|||||||
# keydisplay
|
# 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
|
ligma balls
|
||||||
|
|
||||||
`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
|
|
||||||
|
3
build.rs
@ -1,3 +0,0 @@
|
|||||||
fn main() {
|
|
||||||
slint_build::compile("ui/window.slint").expect("Slint build failed");
|
|
||||||
}
|
|
30
package.json
Normal file
@ -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"
|
||||||
|
}
|
||||||
|
}
|
7
src-tauri/.gitignore
vendored
Normal file
@ -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
|
29
src-tauri/Cargo.toml
Normal file
@ -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"] }
|
3
src-tauri/build.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fn main() {
|
||||||
|
tauri_build::build()
|
||||||
|
}
|
17
src-tauri/capabilities/default.json
Normal file
@ -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"}]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
BIN
src-tauri/icons/128x128.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
src-tauri/icons/128x128@2x.png
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
src-tauri/icons/32x32.png
Normal file
After Width: | Height: | Size: 974 B |
BIN
src-tauri/icons/Square107x107Logo.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
src-tauri/icons/Square142x142Logo.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
BIN
src-tauri/icons/Square150x150Logo.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
src-tauri/icons/Square284x284Logo.png
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
src-tauri/icons/Square30x30Logo.png
Normal file
After Width: | Height: | Size: 903 B |
BIN
src-tauri/icons/Square310x310Logo.png
Normal file
After Width: | Height: | Size: 8.4 KiB |
BIN
src-tauri/icons/Square44x44Logo.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
src-tauri/icons/Square71x71Logo.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
src-tauri/icons/Square89x89Logo.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
src-tauri/icons/StoreLogo.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
src-tauri/icons/icon.icns
Normal file
BIN
src-tauri/icons/icon.ico
Normal file
After Width: | Height: | Size: 85 KiB |
BIN
src-tauri/icons/icon.png
Normal file
After Width: | Height: | Size: 14 KiB |
@ -1,6 +1,7 @@
|
|||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::fs;
|
use std::collections::HashMap;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
use std::fs;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
#[derive(Error, Debug)]
|
#[derive(Error, Debug)]
|
||||||
@ -16,13 +17,27 @@ pub enum ConfigError {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
#[serde(default)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
// theme = grey / night / day / catppuccin_mocha
|
// theme = grey / night / day / catppuccin_mocha
|
||||||
|
pub default: bool,
|
||||||
pub theme: String,
|
pub theme: String,
|
||||||
pub listen: ListenConfig,
|
pub listen: ListenConfig,
|
||||||
pub display: DisplayConfig,
|
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]
|
// [listen]
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
pub struct ListenConfig {
|
pub struct ListenConfig {
|
||||||
@ -35,20 +50,31 @@ pub struct ListenConfig {
|
|||||||
// [display]
|
// [display]
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
pub struct DisplayConfig {
|
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,
|
pub mouse: String,
|
||||||
|
// multiply default key length for the key by the float value
|
||||||
|
pub size: Vec<HashMap<String, f64>>,
|
||||||
|
// which keys to linebreak after
|
||||||
|
pub r#break: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
// Provide default values
|
// Provide default values
|
||||||
pub fn default() -> Self {
|
pub fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
default: true,
|
||||||
theme: "grey".to_string(),
|
theme: "grey".to_string(),
|
||||||
listen: ListenConfig {
|
listen: ListenConfig {
|
||||||
keys: vec!["ZKey".to_string(), "XKey".to_string()],
|
keys: vec!["KeyZ".to_string(), "KeyX".to_string(), "MetaLeft".to_string()],
|
||||||
mouse: vec!["LeftButton".to_string(), "RightButton".to_string()],
|
mouse: vec!["Left".to_string(), "Right".to_string()],
|
||||||
},
|
},
|
||||||
display: DisplayConfig {
|
display: DisplayConfig {
|
||||||
|
press: "ease".to_string(),
|
||||||
mouse: "key".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<Self, ConfigError> {
|
pub fn load_or_create(path: PathBuf) -> Result<Self, ConfigError> {
|
||||||
let full_path = path.join("config.toml");
|
let full_path = path.join("config.toml");
|
||||||
|
|
||||||
|
// create a file with using the default config if it does not exist
|
||||||
if !full_path.exists() {
|
if !full_path.exists() {
|
||||||
println!("Creating default config");
|
println!("Creating default config");
|
||||||
let config = Self::default();
|
let config = Self::default();
|
206
src-tauri/src/lib.rs
Normal file
@ -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<AppState>>) {
|
||||||
|
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<AppState>>) -> Result<bool, bool> {
|
||||||
|
let default = state.lock().unwrap().config.default.clone();
|
||||||
|
Ok(default)
|
||||||
|
}
|
||||||
|
#[tauri::command]
|
||||||
|
fn get_theme(state: State<'_, Mutex<AppState>>) -> Result<String, String> {
|
||||||
|
let theme = state.lock().unwrap().config.theme.clone();
|
||||||
|
Ok(theme)
|
||||||
|
}
|
||||||
|
#[tauri::command]
|
||||||
|
fn get_keys(state: State<'_, Mutex<AppState>>) -> Result<Vec<String>, Vec<String>> {
|
||||||
|
let keys = state.lock().unwrap().config.listen.keys.clone();
|
||||||
|
Ok(keys)
|
||||||
|
}
|
||||||
|
#[tauri::command]
|
||||||
|
fn get_mouse_buttons(state: State<'_, Mutex<AppState>>) -> Result<Vec<String>, Vec<String>> {
|
||||||
|
let mouse_buttons = state.lock().unwrap().config.listen.mouse.clone();
|
||||||
|
Ok(mouse_buttons)
|
||||||
|
}
|
||||||
|
#[tauri::command]
|
||||||
|
fn get_press_display(state: State<'_, Mutex<AppState>>) -> Result<String, String> {
|
||||||
|
let press_display = state.lock().unwrap().config.display.press.clone();
|
||||||
|
Ok(press_display)
|
||||||
|
}
|
||||||
|
#[tauri::command]
|
||||||
|
fn get_size_display(state: State<'_, Mutex<AppState>>) -> Result<Vec<HashMap<String, f64>>, Vec<HashMap<String, f64>>> {
|
||||||
|
let size_display = state.lock().unwrap().config.display.size.clone();
|
||||||
|
Ok(size_display)
|
||||||
|
}
|
||||||
|
#[tauri::command]
|
||||||
|
fn get_mouse_display(state: State<'_, Mutex<AppState>>) -> Result<String, String> {
|
||||||
|
let mouse_display = state.lock().unwrap().config.display.mouse.clone();
|
||||||
|
Ok(mouse_display)
|
||||||
|
}
|
||||||
|
#[tauri::command]
|
||||||
|
fn get_breaks(state: State<'_, Mutex<AppState>>) -> Result<Vec<String>, Vec<String>> {
|
||||||
|
let breaks = state.lock().unwrap().config.display.r#break.clone();
|
||||||
|
Ok(breaks)
|
||||||
|
}
|
||||||
|
// Input events
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
fn start_listener(keys: Vec<String>, m_buttons: Vec<String>, channel: Channel<Event>) {
|
||||||
|
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"
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
8
src-tauri/src/main.rs
Normal file
@ -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()
|
||||||
|
}
|
35
src-tauri/tauri.conf.json
Normal file
@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
13
src/app.html
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<link rel="icon" href="%sveltekit.assets%/favicon.png" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<title>keydisplay</title>
|
||||||
|
%sveltekit.head%
|
||||||
|
</head>
|
||||||
|
<body data-sveltekit-preload-data="hover">
|
||||||
|
<div style="display: contents">%sveltekit.body%</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
316
src/listen.rs
@ -1,316 +0,0 @@
|
|||||||
use inputbot::{KeybdKey, KeybdKey::*, MouseButton, MouseButton::*};
|
|
||||||
|
|
||||||
pub fn listen(keys: Vec<KeybdKey>, m_buttons: Vec<MouseButton>) {
|
|
||||||
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)")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
124
src/main.rs
@ -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<config::Config, config::ConfigError> {
|
|
||||||
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<KeybdKey>,
|
|
||||||
m_buttons: Vec<MouseButton>,
|
|
||||||
theme: String,
|
|
||||||
) -> Result<(), slint::PlatformError> {
|
|
||||||
let ui = MainWindow::new()?;
|
|
||||||
|
|
||||||
let mut keyitems: Vec<KeyData> = Vec::new();
|
|
||||||
for key in keys {
|
|
||||||
keyitems.push(KeyData {
|
|
||||||
key: string_from_keybdkey(key).into(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut mouseitems: Vec<KeyData> = 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<KeybdKey> = 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<MouseButton> = 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);
|
|
||||||
}
|
|
5
src/routes/+layout.ts
Normal file
@ -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;
|
216
src/routes/+page.svelte
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { invoke, Channel } from "@tauri-apps/api/core";
|
||||||
|
import Key from "./Key.svelte";
|
||||||
|
import { onMount } from "svelte";
|
||||||
|
import { listen } from "@tauri-apps/api/event";
|
||||||
|
import { watchImmediate } from "@tauri-apps/plugin-fs";
|
||||||
|
|
||||||
|
// rdev::Event
|
||||||
|
type KeyEvent = {
|
||||||
|
time: {
|
||||||
|
secs_since_epoch: number,
|
||||||
|
nanos_since_epoch: number,
|
||||||
|
},
|
||||||
|
name: string | null,
|
||||||
|
event_type: | { KeyPress: string }
|
||||||
|
| { KeyRelease: string }
|
||||||
|
| { ButtonPress: string }
|
||||||
|
| { ButtonRelease: string }
|
||||||
|
| { MouseMove : { x: number, y: number }}
|
||||||
|
| { Wheel: { delta_x: number, delta_y: number } }
|
||||||
|
}
|
||||||
|
|
||||||
|
// type with props for the Key component
|
||||||
|
type KeyElement = {
|
||||||
|
label: string,
|
||||||
|
code: string,
|
||||||
|
pressed: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
// scoping
|
||||||
|
let keys: Array<string>, mouse_buttons: Array<string>;
|
||||||
|
let key_elements: Array<KeyElement>, mouse_button_elements: Array<KeyElement>;
|
||||||
|
|
||||||
|
let default_config: boolean;
|
||||||
|
let config_path: string;
|
||||||
|
|
||||||
|
let breaks: Set<string>;
|
||||||
|
|
||||||
|
onMount(async () => {
|
||||||
|
// on launch
|
||||||
|
await handle_config();
|
||||||
|
|
||||||
|
// watch for changes in the config
|
||||||
|
try {
|
||||||
|
config_path = await invoke<string>('get_config_path');
|
||||||
|
watchImmediate(config_path, async (event) => {
|
||||||
|
if(event.type.valueOf().hasOwnProperty("modify")) {
|
||||||
|
console.log(event)
|
||||||
|
if(event.paths[0].split("/").at(-1) == "config.toml") {
|
||||||
|
await invoke('update_config');
|
||||||
|
await handle_config();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Couldn't watch config file: ", error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// create listener for events
|
||||||
|
const KeyListener = new Channel<KeyEvent>();
|
||||||
|
|
||||||
|
// handle key event by modifying the key_elements and mouse_button_elements arrays
|
||||||
|
KeyListener.onmessage = (message) => {
|
||||||
|
switch (Object.keys(message.event_type)[0]) {
|
||||||
|
case 'KeyPress':
|
||||||
|
handleKeyEvent(Object.values(message.event_type)[0], true);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'KeyRelease':
|
||||||
|
handleKeyEvent(Object.values(message.event_type)[0], false);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'ButtonPress':
|
||||||
|
handleMouseEvent(Object.values(message.event_type)[0], true);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'ButtonRelease':
|
||||||
|
handleMouseEvent(Object.values(message.event_type)[0], false);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
console.warn("Unhandled event: ", message);
|
||||||
|
}
|
||||||
|
console.log("Recieved event: ", message.event_type);
|
||||||
|
};
|
||||||
|
|
||||||
|
async function handleKeyEvent(code: string, isPressed: boolean) {
|
||||||
|
key_elements = key_elements.map(key => {
|
||||||
|
if (key.code === code) {
|
||||||
|
return { ...key, pressed: isPressed}
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleMouseEvent(code: string, isPressed: boolean) {
|
||||||
|
mouse_button_elements = mouse_button_elements.map(button => {
|
||||||
|
if (button.code === code) {
|
||||||
|
return { ...button, pressed: isPressed}
|
||||||
|
}
|
||||||
|
return button;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// invoke backend key listener that will send the events
|
||||||
|
await invoke('start_listener', {
|
||||||
|
keys: keys,
|
||||||
|
// named mButtons and not m_buttons because weird naming """conventions""" (WHO CARES)
|
||||||
|
mButtons: mouse_buttons,
|
||||||
|
channel: KeyListener
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// configure the program based on the config file
|
||||||
|
async function handle_config() {
|
||||||
|
console.log("Handling config");
|
||||||
|
// set the theme
|
||||||
|
let root: HTMLHtmlElement | null;
|
||||||
|
root = document.querySelector("html");
|
||||||
|
try {
|
||||||
|
const theme = await invoke<string>('get_theme');
|
||||||
|
console.log("Got theme from backend: ", theme);
|
||||||
|
root?.setAttribute("data-selected-theme", theme);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Failed to get theme from rust backend: ${error}. Falling back to theme "grey".`);
|
||||||
|
root?.setAttribute("data-selected-theme", "grey");
|
||||||
|
}
|
||||||
|
|
||||||
|
// update if config is the default
|
||||||
|
try {
|
||||||
|
default_config = await invoke<boolean>('get_default');
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Failed to run get_default from the rust backend: ${error}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// set display for keypresses
|
||||||
|
try {
|
||||||
|
let press_display = await invoke('get_press_display');
|
||||||
|
switch (press_display) {
|
||||||
|
case "instant":
|
||||||
|
case "ease":
|
||||||
|
root?.setAttribute("data-press-display", press_display);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
console.warn('"press" field in [display] of the config is an invalid value, falling back to "ease"');
|
||||||
|
root?.setAttribute("data-press-display", "ease");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Failed to run get_press_display from the rust backend: ${error}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// get linebreaks
|
||||||
|
try {
|
||||||
|
breaks = new Set(await invoke<Array<string>>("get_breaks"));
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Failed to get "break" config field from rust backend: ${error}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// load the keys/mousebuttons
|
||||||
|
try {
|
||||||
|
keys = await invoke<Array<string>>('get_keys');
|
||||||
|
mouse_buttons = await invoke<Array<string>>('get_mouse_buttons');
|
||||||
|
key_elements = await Promise.all(keys.map(async key => {
|
||||||
|
return {
|
||||||
|
label: await invoke<string>("label_from_keycode", { code: key }),
|
||||||
|
code: key,
|
||||||
|
pressed: false
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
mouse_button_elements = await Promise.all(mouse_buttons.map(async button => {
|
||||||
|
return {
|
||||||
|
label: await invoke<string>("label_from_keycode", { code: button }),
|
||||||
|
code: button,
|
||||||
|
pressed: false
|
||||||
|
};
|
||||||
|
}));
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Failed to process keys: ", error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<link rel="stylesheet" href="/global.css">
|
||||||
|
<main class="container">
|
||||||
|
{#if default_config}
|
||||||
|
<div id="default_config">Docs for configuring this program are at <a href="https://git.stardust.wtf/starlight/keydisplay/src/branch/main/README.md">https://git.stardust.wtf/starlight/keydisplay/src/branch/main/README.md</a><br>You can disable this annoying notice by removing the <code>default = true</code> line from <code>{config_path}</code> :)</div>
|
||||||
|
{/if}
|
||||||
|
<div id="keys">
|
||||||
|
{#each key_elements as key (key.code)}
|
||||||
|
<Key
|
||||||
|
label={key.label}
|
||||||
|
code={key.code}
|
||||||
|
pressed={key.pressed}
|
||||||
|
>
|
||||||
|
</Key>
|
||||||
|
{#if breaks.has(key.code)}
|
||||||
|
<br>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
<div id="mouse_buttons">
|
||||||
|
{#each mouse_button_elements as button (button.code)}
|
||||||
|
<Key
|
||||||
|
label={button.label}
|
||||||
|
code={button.code}
|
||||||
|
pressed={button.pressed}
|
||||||
|
>
|
||||||
|
</Key>
|
||||||
|
{#if breaks.has(button.code)}
|
||||||
|
<br>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
</main>
|
14
src/routes/Key.svelte
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<!-- generic "key" -->
|
||||||
|
<script>
|
||||||
|
export let label = "";
|
||||||
|
export let code = "";
|
||||||
|
export let pressed = false;
|
||||||
|
|
||||||
|
// Optional: Add press animation
|
||||||
|
import { quintOut } from "svelte/easing";
|
||||||
|
import { crossfade } from "svelte/transition";
|
||||||
|
</script>
|
||||||
|
<link rel="stylesheet" href="/global.css">
|
||||||
|
<div class="key" class:pressed={pressed} data-keycode={code}>
|
||||||
|
{label}
|
||||||
|
</div>
|
BIN
static/favicon.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
158
static/global.css
Normal file
@ -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);
|
||||||
|
}
|
15
svelte.config.js
Normal file
@ -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;
|
19
tsconfig.json
Normal file
@ -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
|
||||||
|
}
|
@ -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 <string> key_text_content;
|
|
||||||
|
|
||||||
in-out property <color> key_background;
|
|
||||||
in-out property <color> key_border;
|
|
||||||
in-out property <color> 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> 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;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
32
vite.config.js
Normal file
@ -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/**"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}));
|
695
yarn.lock
Normal file
@ -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==
|