From e7f01847d44d751faaaf27feb7f72ff90622aa80 Mon Sep 17 00:00:00 2001 From: shm Date: Tue, 4 Jun 2024 00:45:11 +0900 Subject: [PATCH 01/35] =?UTF-8?q?fix:=20change=20CPU=20=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=8E=87=E3=82=92=E6=95=B4=E6=95=B0=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/get_hardware_data.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/get_hardware_data.rs b/src-tauri/src/get_hardware_data.rs index 71c2fd1..84c7040 100644 --- a/src-tauri/src/get_hardware_data.rs +++ b/src-tauri/src/get_hardware_data.rs @@ -10,12 +10,16 @@ pub struct AppState { pub system: Arc>, } +const SYSTEM_INFO_INIT_INTERVAL: u64 = 1; + #[command] -pub fn get_cpu(state: tauri::State<'_, AppState>) -> f32 { +pub fn get_cpu(state: tauri::State<'_, AppState>) -> i32 { let system = state.system.lock().unwrap(); let cpus = system.cpus(); let total_usage: f32 = cpus.iter().map(|cpu| cpu.cpu_usage()).sum(); - total_usage / cpus.len() as f32 + + let usage = total_usage / cpus.len() as f32; + usage.round() as i32 } pub fn initialize_system(system: Arc>) { @@ -24,6 +28,7 @@ pub fn initialize_system(system: Arc>) { let mut sys = system.lock().unwrap(); sys.refresh_cpu(); } - thread::sleep(Duration::from_secs(1)); + + thread::sleep(Duration::from_secs(SYSTEM_INFO_INIT_INTERVAL)); }); } From 850913f97f97731d2c1173f13409e8ad9bbe0dbd Mon Sep 17 00:00:00 2001 From: shm Date: Tue, 4 Jun 2024 01:32:43 +0900 Subject: [PATCH 02/35] =?UTF-8?q?add:=20=E3=83=A1=E3=83=A2=E3=83=AA?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=8E=87=E5=8F=96=E5=BE=97API=E3=81=AE?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/get_hardware_data.rs | 13 +++++++++++-- src-tauri/src/main.rs | 9 +++------ src/lib/components/sample.svelte | 13 ++++++++++--- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src-tauri/src/get_hardware_data.rs b/src-tauri/src/get_hardware_data.rs index 84c7040..425885d 100644 --- a/src-tauri/src/get_hardware_data.rs +++ b/src-tauri/src/get_hardware_data.rs @@ -3,7 +3,7 @@ use std::sync::{Arc, Mutex}; use std::thread; use std::time::Duration; -use sysinfo::System; +use sysinfo::{Components, System}; use tauri::command; pub struct AppState { @@ -13,7 +13,7 @@ pub struct AppState { const SYSTEM_INFO_INIT_INTERVAL: u64 = 1; #[command] -pub fn get_cpu(state: tauri::State<'_, AppState>) -> i32 { +pub fn get_cpu_usage(state: tauri::State<'_, AppState>) -> i32 { let system = state.system.lock().unwrap(); let cpus = system.cpus(); let total_usage: f32 = cpus.iter().map(|cpu| cpu.cpu_usage()).sum(); @@ -22,6 +22,15 @@ pub fn get_cpu(state: tauri::State<'_, AppState>) -> i32 { usage.round() as i32 } +#[command] +pub fn get_memory_usage(state: tauri::State<'_, AppState>) -> i32 { + let system = state.system.lock().unwrap(); + let used_memory = system.used_memory() as f64; + let total_memory = system.total_memory() as f64; + + ((used_memory / total_memory) * 100.0 as f64).round() as i32 +} + pub fn initialize_system(system: Arc>) { thread::spawn(move || loop { { diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 1cdbedf..3b79124 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -1,24 +1,21 @@ // Prevents additional console window on Windows in release, DO NOT REMOVE!! #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] - mod get_hardware_data; -use get_hardware_data::{initialize_system, AppState, get_cpu}; +use get_hardware_data::{get_cpu_usage, get_memory_usage, initialize_system, AppState}; use std::sync::{Arc, Mutex}; use sysinfo::System; fn main() { let system = Arc::new(Mutex::new(System::new_all())); - let state = AppState { - system: Arc::clone(&system), - }; + let state = AppState { system: Arc::clone(&system) }; initialize_system(system); tauri::Builder::default() .manage(state) - .invoke_handler(tauri::generate_handler![get_cpu]) + .invoke_handler(tauri::generate_handler![get_cpu_usage, get_memory_usage]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/src/lib/components/sample.svelte b/src/lib/components/sample.svelte index bffc86c..c9687b9 100644 --- a/src/lib/components/sample.svelte +++ b/src/lib/components/sample.svelte @@ -4,13 +4,19 @@ import { invoke } from "@tauri-apps/api/tauri"; const intervalSec = 1; let cpuUsage = 0; +let memoryUsage = 0; -const getCpu = async () => { - return await invoke("get_cpu"); +const getCpuUsage = async () => { + return await invoke("get_cpu_usage"); +} + +const getMemoryUsage = async () => { + return await invoke("get_memory_usage"); } setInterval(async () => { - cpuUsage = await getCpu(); + cpuUsage = await getCpuUsage(); + memoryUsage = await getMemoryUsage(); }, intervalSec * 1000); @@ -18,4 +24,5 @@ setInterval(async () => {

CPU: {cpuUsage}%

+

MEMORY: {memoryUsage}%

From 22606e71f1d30eab9a99d2dd73a00c13905048bd Mon Sep 17 00:00:00 2001 From: shm Date: Tue, 4 Jun 2024 01:47:47 +0900 Subject: [PATCH 03/35] =?UTF-8?q?refactor:=20=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/get_hardware_data.rs | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src-tauri/src/get_hardware_data.rs b/src-tauri/src/get_hardware_data.rs index 425885d..39983b1 100644 --- a/src-tauri/src/get_hardware_data.rs +++ b/src-tauri/src/get_hardware_data.rs @@ -10,8 +10,17 @@ pub struct AppState { pub system: Arc>, } +/// +/// システム情報の更新頻度(秒) +/// const SYSTEM_INFO_INIT_INTERVAL: u64 = 1; +/// +/// ## CPU使用率(%)を取得 +/// +/// - pram state: `tauri::State` アプリケーションの状態 +/// - return: `i32` CPU使用率(%) +/// #[command] pub fn get_cpu_usage(state: tauri::State<'_, AppState>) -> i32 { let system = state.system.lock().unwrap(); @@ -22,6 +31,12 @@ pub fn get_cpu_usage(state: tauri::State<'_, AppState>) -> i32 { usage.round() as i32 } +/// +/// ## メモリ使用率(%)を取得 +/// +/// - pram state: `tauri::State` アプリケーションの状態 +/// - return: `i32` メモリ使用率(%) +/// #[command] pub fn get_memory_usage(state: tauri::State<'_, AppState>) -> i32 { let system = state.system.lock().unwrap(); @@ -31,11 +46,23 @@ pub fn get_memory_usage(state: tauri::State<'_, AppState>) -> i32 { ((used_memory / total_memory) * 100.0 as f64).round() as i32 } +/// +/// ## システム情報の初期化 +/// +/// - param system: `Arc>` システム情報 +/// +/// - `SYSTEM_INFO_INIT_INTERVAL` 秒ごとにCPU使用率とメモリ使用率を更新 +/// pub fn initialize_system(system: Arc>) { thread::spawn(move || loop { { - let mut sys = system.lock().unwrap(); + let mut sys = match system.lock() { + Ok(s) => s, + Err(_) => continue, // エラーハンドリング:ロックが破損している場合はスキップ + }; + sys.refresh_cpu(); + sys.refresh_memory(); } thread::sleep(Duration::from_secs(SYSTEM_INFO_INIT_INTERVAL)); From d94a011d1c4f75d1bc40ca2ba308a032c2d23f29 Mon Sep 17 00:00:00 2001 From: shm Date: Sat, 8 Jun 2024 23:50:43 +0900 Subject: [PATCH 04/35] =?UTF-8?q?add:=20=E3=83=8F=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=82=A6=E3=82=A7=E3=82=A2=E3=81=AE=E9=81=8E=E5=8E=BB=E3=81=AE?= =?UTF-8?q?=E5=B1=A5=E6=AD=B4=E3=81=A7=E5=8F=96=E5=BE=97=E3=81=A7=E3=81=8D?= =?UTF-8?q?=E3=82=8B=E9=96=A2=E6=95=B0=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/get_hardware_data.rs | 64 +++++++++++++++++++++++++++++- src-tauri/src/main.rs | 21 ++++++++-- src/lib/components/sample.svelte | 28 +++++++++---- src/services/hardwareService.ts | 17 ++++++++ 4 files changed, 116 insertions(+), 14 deletions(-) create mode 100644 src/services/hardwareService.ts diff --git a/src-tauri/src/get_hardware_data.rs b/src-tauri/src/get_hardware_data.rs index 39983b1..3f7954b 100644 --- a/src-tauri/src/get_hardware_data.rs +++ b/src-tauri/src/get_hardware_data.rs @@ -1,5 +1,6 @@ -#![cfg_attr(all(not(debug_assertions), target_os = "windows"), windows_subsystem = "windows")] +#![cfg_attr(not(debug_assertions), target_os = "windows")] +use std::collections::VecDeque; use std::sync::{Arc, Mutex}; use std::thread; use std::time::Duration; @@ -8,6 +9,8 @@ use tauri::command; pub struct AppState { pub system: Arc>, + pub cpu_history: Arc>>, + pub memory_history: Arc>>, } /// @@ -15,6 +18,11 @@ pub struct AppState { /// const SYSTEM_INFO_INIT_INTERVAL: u64 = 1; +/// +/// データを保持する期間(秒) +/// +const HISTORY_CAPACITY: usize = 60; + /// /// ## CPU使用率(%)を取得 /// @@ -46,6 +54,30 @@ pub fn get_memory_usage(state: tauri::State<'_, AppState>) -> i32 { ((used_memory / total_memory) * 100.0 as f64).round() as i32 } +/// +/// ## CPU使用率の履歴を取得 +/// +/// - param state: `tauri::State` アプリケーションの状態 +/// - param seconds: `usize` 取得する秒数 +/// +#[command] +pub fn get_cpu_usage_history(state: tauri::State<'_, AppState>, seconds: usize) -> Vec { + let history = state.cpu_history.lock().unwrap(); + history.iter().rev().take(seconds).cloned().collect() +} + +/// +/// ## メモリ使用率の履歴を取得 +/// +/// - param state: `tauri::State` アプリケーションの状態 +/// - param seconds: `usize` 取得する秒数 +/// +#[command] +pub fn get_memory_usage_history(state: tauri::State<'_, AppState>, seconds: usize) -> Vec { + let history = state.memory_history.lock().unwrap(); + history.iter().rev().take(seconds).cloned().collect() +} + /// /// ## システム情報の初期化 /// @@ -53,7 +85,7 @@ pub fn get_memory_usage(state: tauri::State<'_, AppState>) -> i32 { /// /// - `SYSTEM_INFO_INIT_INTERVAL` 秒ごとにCPU使用率とメモリ使用率を更新 /// -pub fn initialize_system(system: Arc>) { +pub fn initialize_system(system: Arc>, cpu_history: Arc>>, memory_history: Arc>>) { thread::spawn(move || loop { { let mut sys = match system.lock() { @@ -63,6 +95,34 @@ pub fn initialize_system(system: Arc>) { sys.refresh_cpu(); sys.refresh_memory(); + + let cpu_usage = { + let cpus = sys.cpus(); + let total_usage: f32 = cpus.iter().map(|cpu| cpu.cpu_usage()).sum(); + total_usage / cpus.len() as f32 + }; + + let memory_usage = { + let used_memory = sys.used_memory() as f64; + let total_memory = sys.total_memory() as f64; + (used_memory / total_memory * 100.0) as f32 + }; + + { + let mut cpu_hist = cpu_history.lock().unwrap(); + if cpu_hist.len() >= HISTORY_CAPACITY { + cpu_hist.pop_front(); + } + cpu_hist.push_back(cpu_usage); + } + + { + let mut memory_hist = memory_history.lock().unwrap(); + if memory_hist.len() >= HISTORY_CAPACITY { + memory_hist.pop_front(); + } + memory_hist.push_back(memory_usage); + } } thread::sleep(Duration::from_secs(SYSTEM_INFO_INIT_INTERVAL)); diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 3b79124..c3321c7 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -3,19 +3,32 @@ mod get_hardware_data; -use get_hardware_data::{get_cpu_usage, get_memory_usage, initialize_system, AppState}; +use get_hardware_data::{get_cpu_usage, get_cpu_usage_history, get_memory_usage, get_memory_usage_history, initialize_system, AppState}; +use std::collections::VecDeque; use std::sync::{Arc, Mutex}; use sysinfo::System; fn main() { let system = Arc::new(Mutex::new(System::new_all())); - let state = AppState { system: Arc::clone(&system) }; + let cpu_history = Arc::new(Mutex::new(VecDeque::with_capacity(60))); + let memory_history = Arc::new(Mutex::new(VecDeque::with_capacity(60))); - initialize_system(system); + let state = AppState { + system: Arc::clone(&system), + cpu_history: Arc::clone(&cpu_history), + memory_history: Arc::clone(&memory_history), + }; + + initialize_system(system, cpu_history, memory_history); tauri::Builder::default() .manage(state) - .invoke_handler(tauri::generate_handler![get_cpu_usage, get_memory_usage]) + .invoke_handler(tauri::generate_handler![ + get_cpu_usage, + get_memory_usage, + get_cpu_usage_history, + get_memory_usage_history + ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/src/lib/components/sample.svelte b/src/lib/components/sample.svelte index c9687b9..1aa5e8a 100644 --- a/src/lib/components/sample.svelte +++ b/src/lib/components/sample.svelte @@ -1,22 +1,21 @@ -
-
-
- -
- diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 21ac59c..cf6d549 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,6 +1,6 @@ -

Welcome to SvelteKit

- + + diff --git a/src/routes/Counter.svelte b/src/routes/Counter.svelte deleted file mode 100644 index fee4744..0000000 --- a/src/routes/Counter.svelte +++ /dev/null @@ -1,102 +0,0 @@ - - -
- - -
-
- - {Math.floor($displayed_count)} -
-
- - -
- - diff --git a/src/routes/Header.svelte b/src/routes/Header.svelte deleted file mode 100644 index 34321de..0000000 --- a/src/routes/Header.svelte +++ /dev/null @@ -1,129 +0,0 @@ - - -
-
- - SvelteKit - -
- - - -
- - GitHub - -
-
- - diff --git a/src/routes/about/+page.svelte b/src/routes/about/+page.svelte deleted file mode 100644 index 7f7946d..0000000 --- a/src/routes/about/+page.svelte +++ /dev/null @@ -1,26 +0,0 @@ - - About - - - -
-

About this app

- -

- This is a SvelteKit app. You can make your own by typing the - following into your command line and following the prompts: -

- -
npm create svelte@latest
- -

- The page you're looking at is purely static HTML, with no client-side interactivity needed. - Because of that, we don't need to load any JavaScript. Try viewing the page's source, or opening - the devtools network panel and reloading. -

- -

- The Sverdle page illustrates SvelteKit's data loading and form handling. Try - using it with JavaScript disabled! -

-
diff --git a/src/routes/about/+page.ts b/src/routes/about/+page.ts deleted file mode 100644 index cd03567..0000000 --- a/src/routes/about/+page.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { dev } from "$app/environment"; - -// we don't need any JS on this page, though we'll load -// it in dev so that we get hot module replacement -export const csr = dev; - -// since there's no dynamic data here, we can prerender -// it so that it gets served as a static asset in production -export const prerender = true; diff --git a/src/routes/styles.css b/src/routes/styles.css deleted file mode 100644 index 1441d94..0000000 --- a/src/routes/styles.css +++ /dev/null @@ -1,107 +0,0 @@ -@import '@fontsource/fira-mono'; - -:root { - --font-body: Arial, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, - Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; - --font-mono: 'Fira Mono', monospace; - --color-bg-0: rgb(202, 216, 228); - --color-bg-1: hsl(209, 36%, 86%); - --color-bg-2: hsl(224, 44%, 95%); - --color-theme-1: #ff3e00; - --color-theme-2: #4075a6; - --color-text: rgba(0, 0, 0, 0.7); - --column-width: 42rem; - --column-margin-top: 4rem; - font-family: var(--font-body); - color: var(--color-text); -} - -body { - min-height: 100vh; - margin: 0; - background-attachment: fixed; - background-color: var(--color-bg-1); - background-size: 100vw 100vh; - background-image: radial-gradient( - 50% 50% at 50% 50%, - rgba(255, 255, 255, 0.75) 0%, - rgba(255, 255, 255, 0) 100% - ), - linear-gradient(180deg, var(--color-bg-0) 0%, var(--color-bg-1) 15%, var(--color-bg-2) 50%); -} - -h1, -h2, -p { - font-weight: 400; -} - -p { - line-height: 1.5; -} - -a { - color: var(--color-theme-1); - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - -h1 { - font-size: 2rem; - text-align: center; -} - -h2 { - font-size: 1rem; -} - -pre { - font-size: 16px; - font-family: var(--font-mono); - background-color: rgba(255, 255, 255, 0.45); - border-radius: 3px; - box-shadow: 2px 2px 6px rgb(255 255 255 / 25%); - padding: 0.5em; - overflow-x: auto; - color: var(--color-text); -} - -.text-column { - display: flex; - max-width: 48rem; - flex: 0.6; - flex-direction: column; - justify-content: center; - margin: 0 auto; -} - -input, -button { - font-size: inherit; - font-family: inherit; -} - -button:focus:not(:focus-visible) { - outline: none; -} - -@media (min-width: 720px) { - h1 { - font-size: 2.4rem; - } -} - -.visually-hidden { - border: 0; - clip: rect(0 0 0 0); - height: auto; - margin: 0; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; - white-space: nowrap; -} diff --git a/src/routes/sverdle/+page.server.ts b/src/routes/sverdle/+page.server.ts deleted file mode 100644 index ebcd4a0..0000000 --- a/src/routes/sverdle/+page.server.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { fail } from "@sveltejs/kit"; -import type { Actions, PageServerLoad } from "./$types"; -import { Game } from "./game"; - -export const load = (({ cookies }) => { - const game = new Game(cookies.get("sverdle")); - - return { - /** - * The player's guessed words so far - */ - guesses: game.guesses, - - /** - * An array of strings like '__x_c' corresponding to the guesses, where 'x' means - * an exact match, and 'c' means a close match (right letter, wrong place) - */ - answers: game.answers, - - /** - * The correct answer, revealed if the game is over - */ - answer: game.answers.length >= 6 ? game.answer : null, - }; -}) satisfies PageServerLoad; - -export const actions = { - /** - * Modify game state in reaction to a keypress. If client-side JavaScript - * is available, this will happen in the browser instead of here - */ - update: async ({ request, cookies }) => { - const game = new Game(cookies.get("sverdle")); - - const data = await request.formData(); - const key = data.get("key"); - - const i = game.answers.length; - - if (key === "backspace") { - game.guesses[i] = game.guesses[i].slice(0, -1); - } else { - game.guesses[i] += key; - } - - cookies.set("sverdle", game.toString(), { path: "/" }); - }, - - /** - * Modify game state in reaction to a guessed word. This logic always runs on - * the server, so that people can't cheat by peeking at the JavaScript - */ - enter: async ({ request, cookies }) => { - const game = new Game(cookies.get("sverdle")); - - const data = await request.formData(); - const guess = data.getAll("guess") as string[]; - - if (!game.enter(guess)) { - return fail(400, { badGuess: true }); - } - - cookies.set("sverdle", game.toString(), { path: "/" }); - }, - - restart: async ({ cookies }) => { - cookies.delete("sverdle", { path: "/" }); - }, -} satisfies Actions; diff --git a/src/routes/sverdle/+page.svelte b/src/routes/sverdle/+page.svelte deleted file mode 100644 index 807e3bd..0000000 --- a/src/routes/sverdle/+page.svelte +++ /dev/null @@ -1,409 +0,0 @@ - - - - - - Sverdle - - - -

Sverdle

- -
{ - // prevent default callback from resetting the form - return ({ update }) => { - update({ reset: false }); - }; - }} -> - How to play - -
- {#each Array.from(Array(6).keys()) as row (row)} - {@const current = row === i} -

Row {row + 1}

-
- {#each Array.from(Array(5).keys()) as column (column)} - {@const guess = current ? currentGuess : data.guesses[row]} - {@const answer = data.answers[row]?.[column]} - {@const value = guess?.[column] ?? ''} - {@const selected = current && column === guess.length} - {@const exact = answer === 'x'} - {@const close = answer === 'c'} - {@const missing = answer === '_'} -
- {value} - - {#if exact} - (correct) - {:else if close} - (present) - {:else if missing} - (absent) - {:else} - empty - {/if} - - -
- {/each} -
- {/each} -
- -
- {#if won || data.answers.length >= 6} - {#if !won && data.answer} -

the answer was "{data.answer}"

- {/if} - - {:else} -
- - - - - {#each ['qwertyuiop', 'asdfghjkl', 'zxcvbnm'] as row} -
- {#each row as letter} - - {/each} -
- {/each} -
- {/if} -
-
- -{#if won} -
-{/if} - - diff --git a/src/routes/sverdle/game.test.ts b/src/routes/sverdle/game.test.ts deleted file mode 100644 index 565516b..0000000 --- a/src/routes/sverdle/game.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { Game } from "./game"; - -describe("game test", () => { - it("returns true when a valid word is entered", () => { - const game = new Game(); - expect(game.enter("zorro".split(""))).toBe(true); - }); -}); diff --git a/src/routes/sverdle/game.ts b/src/routes/sverdle/game.ts deleted file mode 100644 index c62430f..0000000 --- a/src/routes/sverdle/game.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { allowed, words } from "./words.server"; - -export class Game { - index: number; - guesses: string[]; - answers: string[]; - answer: string; - - /** - * Create a game object from the player's cookie, or initialise a new game - */ - constructor(serialized: string | undefined = undefined) { - if (serialized) { - const [index, guesses, answers] = serialized.split("-"); - - this.index = +index; - this.guesses = guesses ? guesses.split(" ") : []; - this.answers = answers ? answers.split(" ") : []; - } else { - this.index = Math.floor(Math.random() * words.length); - this.guesses = ["", "", "", "", "", ""]; - this.answers = []; - } - - this.answer = words[this.index]; - } - - /** - * Update game state based on a guess of a five-letter word. Returns - * true if the guess was valid, false otherwise - */ - enter(letters: string[]) { - const word = letters.join(""); - const valid = allowed.has(word); - - if (!valid) return false; - - this.guesses[this.answers.length] = word; - - const available = Array.from(this.answer); - const answer = Array(5).fill("_"); - - // first, find exact matches - for (let i = 0; i < 5; i += 1) { - if (letters[i] === available[i]) { - answer[i] = "x"; - available[i] = " "; - } - } - - // then find close matches (this has to happen - // in a second step, otherwise an early close - // match can prevent a later exact match) - for (let i = 0; i < 5; i += 1) { - if (answer[i] === "_") { - const index = available.indexOf(letters[i]); - if (index !== -1) { - answer[i] = "c"; - available[index] = " "; - } - } - } - - this.answers.push(answer.join("")); - - return true; - } - - /** - * Serialize game state so it can be set as a cookie - */ - toString() { - return `${this.index}-${this.guesses.join(" ")}-${this.answers.join(" ")}`; - } -} diff --git a/src/routes/sverdle/how-to-play/+page.svelte b/src/routes/sverdle/how-to-play/+page.svelte deleted file mode 100644 index e8e2cec..0000000 --- a/src/routes/sverdle/how-to-play/+page.svelte +++ /dev/null @@ -1,95 +0,0 @@ - - How to play Sverdle - - - -
-

How to play Sverdle

- -

- Sverdle is a clone of Wordle, the - word guessing game. To play, enter a five-letter English word. For example: -

- -
- r - i - t - z - y -
- -

- The y is in the right place. r and - t - are the right letters, but in the wrong place. The other letters are wrong, and can be discarded. - Let's make another guess: -

- -
- p - a - r - t - y -
- -

This time we guessed right! You have six guesses to get the word.

- -

- Unlike the original Wordle, Sverdle runs on the server instead of in the browser, making it - impossible to cheat. It uses <form> and cookies to submit data, meaning you can - even play with JavaScript disabled! -

-
- - diff --git a/src/routes/sverdle/how-to-play/+page.ts b/src/routes/sverdle/how-to-play/+page.ts deleted file mode 100644 index cd03567..0000000 --- a/src/routes/sverdle/how-to-play/+page.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { dev } from "$app/environment"; - -// we don't need any JS on this page, though we'll load -// it in dev so that we get hot module replacement -export const csr = dev; - -// since there's no dynamic data here, we can prerender -// it so that it gets served as a static asset in production -export const prerender = true; diff --git a/src/routes/sverdle/reduced-motion.ts b/src/routes/sverdle/reduced-motion.ts deleted file mode 100644 index 89f77b9..0000000 --- a/src/routes/sverdle/reduced-motion.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { browser } from "$app/environment"; -import { readable } from "svelte/store"; - -const reduced_motion_query = "(prefers-reduced-motion: reduce)"; - -const get_initial_motion_preference = () => { - if (!browser) return false; - return window.matchMedia(reduced_motion_query).matches; -}; - -export const reduced_motion = readable( - get_initial_motion_preference(), - (set) => { - if (browser) { - const set_reduced_motion = (event: MediaQueryListEvent) => { - set(event.matches); - }; - const media_query_list = window.matchMedia(reduced_motion_query); - media_query_list.addEventListener("change", set_reduced_motion); - - return () => { - media_query_list.removeEventListener("change", set_reduced_motion); - }; - } - }, -); diff --git a/src/routes/sverdle/words.server.ts b/src/routes/sverdle/words.server.ts deleted file mode 100644 index 9e347c7..0000000 --- a/src/routes/sverdle/words.server.ts +++ /dev/null @@ -1,12980 +0,0 @@ -/** The list of possible words */ -export const words = [ - "aback", - "abase", - "abate", - "abbey", - "abbot", - "abhor", - "abide", - "abled", - "abode", - "abort", - "about", - "above", - "abuse", - "abyss", - "acorn", - "acrid", - "actor", - "acute", - "adage", - "adapt", - "adept", - "admin", - "admit", - "adobe", - "adopt", - "adore", - "adorn", - "adult", - "affix", - "afire", - "afoot", - "afoul", - "after", - "again", - "agape", - "agate", - "agent", - "agile", - "aging", - "aglow", - "agony", - "agora", - "agree", - "ahead", - "aider", - "aisle", - "alarm", - "album", - "alert", - "algae", - "alibi", - "alien", - "align", - "alike", - "alive", - "allay", - "alley", - "allot", - "allow", - "alloy", - "aloft", - "alone", - "along", - "aloof", - "aloud", - "alpha", - "altar", - "alter", - "amass", - "amaze", - "amber", - "amble", - "amend", - "amiss", - "amity", - "among", - "ample", - "amply", - "amuse", - "angel", - "anger", - "angle", - "angry", - "angst", - "anime", - "ankle", - "annex", - "annoy", - "annul", - "anode", - "antic", - "anvil", - "aorta", - "apart", - "aphid", - "aping", - "apnea", - "apple", - "apply", - "apron", - "aptly", - "arbor", - "ardor", - "arena", - "argue", - "arise", - "armor", - "aroma", - "arose", - "array", - "arrow", - "arson", - "artsy", - "ascot", - "ashen", - "aside", - "askew", - "assay", - "asset", - "atoll", - "atone", - "attic", - "audio", - "audit", - "augur", - "aunty", - "avail", - "avert", - "avian", - "avoid", - "await", - "awake", - "award", - "aware", - "awash", - "awful", - "awoke", - "axial", - "axiom", - "axion", - "azure", - "bacon", - "badge", - "badly", - "bagel", - "baggy", - "baker", - "baler", - "balmy", - "banal", - "banjo", - "barge", - "baron", - "basal", - "basic", - "basil", - "basin", - "basis", - "baste", - "batch", - "bathe", - "baton", - "batty", - "bawdy", - "bayou", - "beach", - "beady", - "beard", - "beast", - "beech", - "beefy", - "befit", - "began", - "begat", - "beget", - "begin", - "begun", - "being", - "belch", - "belie", - "belle", - "belly", - "below", - "bench", - "beret", - "berry", - "berth", - "beset", - "betel", - "bevel", - "bezel", - "bible", - "bicep", - "biddy", - "bigot", - "bilge", - "billy", - "binge", - "bingo", - "biome", - "birch", - "birth", - "bison", - "bitty", - "black", - "blade", - "blame", - "bland", - "blank", - "blare", - "blast", - "blaze", - "bleak", - "bleat", - "bleed", - "bleep", - "blend", - "bless", - "blimp", - "blind", - "blink", - "bliss", - "blitz", - "bloat", - "block", - "bloke", - "blond", - "blood", - "bloom", - "blown", - "bluer", - "bluff", - "blunt", - "blurb", - "blurt", - "blush", - "board", - "boast", - "bobby", - "boney", - "bongo", - "bonus", - "booby", - "boost", - "booth", - "booty", - "booze", - "boozy", - "borax", - "borne", - "bosom", - "bossy", - "botch", - "bough", - "boule", - "bound", - "bowel", - "boxer", - "brace", - "braid", - "brain", - "brake", - "brand", - "brash", - "brass", - "brave", - "bravo", - "brawl", - "brawn", - "bread", - "break", - "breed", - "briar", - "bribe", - "brick", - "bride", - "brief", - "brine", - "bring", - "brink", - "briny", - "brisk", - "broad", - "broil", - "broke", - "brood", - "brook", - "broom", - "broth", - "brown", - "brunt", - "brush", - "brute", - "buddy", - "budge", - "buggy", - "bugle", - "build", - "built", - "bulge", - "bulky", - "bully", - "bunch", - "bunny", - "burly", - "burnt", - "burst", - "bused", - "bushy", - "butch", - "butte", - "buxom", - "buyer", - "bylaw", - "cabal", - "cabby", - "cabin", - "cable", - "cacao", - "cache", - "cacti", - "caddy", - "cadet", - "cagey", - "cairn", - "camel", - "cameo", - "canal", - "candy", - "canny", - "canoe", - "canon", - "caper", - "caput", - "carat", - "cargo", - "carol", - "carry", - "carve", - "caste", - "catch", - "cater", - "catty", - "caulk", - "cause", - "cavil", - "cease", - "cedar", - "cello", - "chafe", - "chaff", - "chain", - "chair", - "chalk", - "champ", - "chant", - "chaos", - "chard", - "charm", - "chart", - "chase", - "chasm", - "cheap", - "cheat", - "check", - "cheek", - "cheer", - "chess", - "chest", - "chick", - "chide", - "chief", - "child", - "chili", - "chill", - "chime", - "china", - "chirp", - "chock", - "choir", - "choke", - "chord", - "chore", - "chose", - "chuck", - "chump", - "chunk", - "churn", - "chute", - "cider", - "cigar", - "cinch", - "circa", - "civic", - "civil", - "clack", - "claim", - "clamp", - "clang", - "clank", - "clash", - "clasp", - "class", - "clean", - "clear", - "cleat", - "cleft", - "clerk", - "click", - "cliff", - "climb", - "cling", - "clink", - "cloak", - "clock", - "clone", - "close", - "cloth", - "cloud", - "clout", - "clove", - "clown", - "cluck", - "clued", - "clump", - "clung", - "coach", - "coast", - "cobra", - "cocoa", - "colon", - "color", - "comet", - "comfy", - "comic", - "comma", - "conch", - "condo", - "conic", - "copse", - "coral", - "corer", - "corny", - "couch", - "cough", - "could", - "count", - "coupe", - "court", - "coven", - "cover", - "covet", - "covey", - "cower", - "coyly", - "crack", - "craft", - "cramp", - "crane", - "crank", - "crash", - "crass", - "crate", - "crave", - "crawl", - "craze", - "crazy", - "creak", - "cream", - "credo", - "creed", - "creek", - "creep", - "creme", - "crepe", - "crept", - "cress", - "crest", - "crick", - "cried", - "crier", - "crime", - "crimp", - "crisp", - "croak", - "crock", - "crone", - "crony", - "crook", - "cross", - "croup", - "crowd", - "crown", - "crude", - "cruel", - "crumb", - "crump", - "crush", - "crust", - "crypt", - "cubic", - "cumin", - "curio", - "curly", - "curry", - "curse", - "curve", - "curvy", - "cutie", - "cyber", - "cycle", - "cynic", - "daddy", - "daily", - "dairy", - "daisy", - "dally", - "dance", - "dandy", - "datum", - "daunt", - "dealt", - "death", - "debar", - "debit", - "debug", - "debut", - "decal", - "decay", - "decor", - "decoy", - "decry", - "defer", - "deign", - "deity", - "delay", - "delta", - "delve", - "demon", - "demur", - "denim", - "dense", - "depot", - "depth", - "derby", - "deter", - "detox", - "deuce", - "devil", - "diary", - "dicey", - "digit", - "dilly", - "dimly", - "diner", - "dingo", - "dingy", - "diode", - "dirge", - "dirty", - "disco", - "ditch", - "ditto", - "ditty", - "diver", - "dizzy", - "dodge", - "dodgy", - "dogma", - "doing", - "dolly", - "donor", - "donut", - "dopey", - "doubt", - "dough", - "dowdy", - "dowel", - "downy", - "dowry", - "dozen", - "draft", - "drain", - "drake", - "drama", - "drank", - "drape", - "drawl", - "drawn", - "dread", - "dream", - "dress", - "dried", - "drier", - "drift", - "drill", - "drink", - "drive", - "droit", - "droll", - "drone", - "drool", - "droop", - "dross", - "drove", - "drown", - "druid", - "drunk", - "dryer", - "dryly", - "duchy", - "dully", - "dummy", - "dumpy", - "dunce", - "dusky", - "dusty", - "dutch", - "duvet", - "dwarf", - "dwell", - "dwelt", - "dying", - "eager", - "eagle", - "early", - "earth", - "easel", - "eaten", - "eater", - "ebony", - "eclat", - "edict", - "edify", - "eerie", - "egret", - "eight", - "eject", - "eking", - "elate", - "elbow", - "elder", - "elect", - "elegy", - "elfin", - "elide", - "elite", - "elope", - "elude", - "email", - "embed", - "ember", - "emcee", - "empty", - "enact", - "endow", - "enema", - "enemy", - "enjoy", - "ennui", - "ensue", - "enter", - "entry", - "envoy", - "epoch", - "epoxy", - "equal", - "equip", - "erase", - "erect", - "erode", - "error", - "erupt", - "essay", - "ester", - "ether", - "ethic", - "ethos", - "etude", - "evade", - "event", - "every", - "evict", - "evoke", - "exact", - "exalt", - "excel", - "exert", - "exile", - "exist", - "expel", - "extol", - "extra", - "exult", - "eying", - "fable", - "facet", - "faint", - "fairy", - "faith", - "false", - "fancy", - "fanny", - "farce", - "fatal", - "fatty", - "fault", - "fauna", - "favor", - "feast", - "fecal", - "feign", - "fella", - "felon", - "femme", - "femur", - "fence", - "feral", - "ferry", - "fetal", - "fetch", - "fetid", - "fetus", - "fever", - "fewer", - "fiber", - "fibre", - "ficus", - "field", - "fiend", - "fiery", - "fifth", - "fifty", - "fight", - "filer", - "filet", - "filly", - "filmy", - "filth", - "final", - "finch", - "finer", - "first", - "fishy", - "fixer", - "fizzy", - "fjord", - "flack", - "flail", - "flair", - "flake", - "flaky", - "flame", - "flank", - "flare", - "flash", - "flask", - "fleck", - "fleet", - "flesh", - "flick", - "flier", - "fling", - "flint", - "flirt", - "float", - "flock", - "flood", - "floor", - "flora", - "floss", - "flour", - "flout", - "flown", - "fluff", - "fluid", - "fluke", - "flume", - "flung", - "flunk", - "flush", - "flute", - "flyer", - "foamy", - "focal", - "focus", - "foggy", - "foist", - "folio", - "folly", - "foray", - "force", - "forge", - "forgo", - "forte", - "forth", - "forty", - "forum", - "found", - "foyer", - "frail", - "frame", - "frank", - "fraud", - "freak", - "freed", - "freer", - "fresh", - "friar", - "fried", - "frill", - "frisk", - "fritz", - "frock", - "frond", - "front", - "frost", - "froth", - "frown", - "froze", - "fruit", - "fudge", - "fugue", - "fully", - "fungi", - "funky", - "funny", - "furor", - "furry", - "fussy", - "fuzzy", - "gaffe", - "gaily", - "gamer", - "gamma", - "gamut", - "gassy", - "gaudy", - "gauge", - "gaunt", - "gauze", - "gavel", - "gawky", - "gayer", - "gayly", - "gazer", - "gecko", - "geeky", - "geese", - "genie", - "genre", - "ghost", - "ghoul", - "giant", - "giddy", - "gipsy", - "girly", - "girth", - "given", - "giver", - "glade", - "gland", - "glare", - "glass", - "glaze", - "gleam", - "glean", - "glide", - "glint", - "gloat", - "globe", - "gloom", - "glory", - "gloss", - "glove", - "glyph", - "gnash", - "gnome", - "godly", - "going", - "golem", - "golly", - "gonad", - "goner", - "goody", - "gooey", - "goofy", - "goose", - "gorge", - "gouge", - "gourd", - "grace", - "grade", - "graft", - "grail", - "grain", - "grand", - "grant", - "grape", - "graph", - "grasp", - "grass", - "grate", - "grave", - "gravy", - "graze", - "great", - "greed", - "green", - "greet", - "grief", - "grill", - "grime", - "grimy", - "grind", - "gripe", - "groan", - "groin", - "groom", - "grope", - "gross", - "group", - "grout", - "grove", - "growl", - "grown", - "gruel", - "gruff", - "grunt", - "guard", - "guava", - "guess", - "guest", - "guide", - "guild", - "guile", - "guilt", - "guise", - "gulch", - "gully", - "gumbo", - "gummy", - "guppy", - "gusto", - "gusty", - "gypsy", - "habit", - "hairy", - "halve", - "handy", - "happy", - "hardy", - "harem", - "harpy", - "harry", - "harsh", - "haste", - "hasty", - "hatch", - "hater", - "haunt", - "haute", - "haven", - "havoc", - "hazel", - "heady", - "heard", - "heart", - "heath", - "heave", - "heavy", - "hedge", - "hefty", - "heist", - "helix", - "hello", - "hence", - "heron", - "hilly", - "hinge", - "hippo", - "hippy", - "hitch", - "hoard", - "hobby", - "hoist", - "holly", - "homer", - "honey", - "honor", - "horde", - "horny", - "horse", - "hotel", - "hotly", - "hound", - "house", - "hovel", - "hover", - "howdy", - "human", - "humid", - "humor", - "humph", - "humus", - "hunch", - "hunky", - "hurry", - "husky", - "hussy", - "hutch", - "hydro", - "hyena", - "hymen", - "hyper", - "icily", - "icing", - "ideal", - "idiom", - "idiot", - "idler", - "idyll", - "igloo", - "iliac", - "image", - "imbue", - "impel", - "imply", - "inane", - "inbox", - "incur", - "index", - "inept", - "inert", - "infer", - "ingot", - "inlay", - "inlet", - "inner", - "input", - "inter", - "intro", - "ionic", - "irate", - "irony", - "islet", - "issue", - "itchy", - "ivory", - "jaunt", - "jazzy", - "jelly", - "jerky", - "jetty", - "jewel", - "jiffy", - "joint", - "joist", - "joker", - "jolly", - "joust", - "judge", - "juice", - "juicy", - "jumbo", - "jumpy", - "junta", - "junto", - "juror", - "kappa", - "karma", - "kayak", - "kebab", - "khaki", - "kinky", - "kiosk", - "kitty", - "knack", - "knave", - "knead", - "kneed", - "kneel", - "knelt", - "knife", - "knock", - "knoll", - "known", - "koala", - "krill", - "label", - "labor", - "laden", - "ladle", - "lager", - "lance", - "lanky", - "lapel", - "lapse", - "large", - "larva", - "lasso", - "latch", - "later", - "lathe", - "latte", - "laugh", - "layer", - "leach", - "leafy", - "leaky", - "leant", - "leapt", - "learn", - "lease", - "leash", - "least", - "leave", - "ledge", - "leech", - "leery", - "lefty", - "legal", - "leggy", - "lemon", - "lemur", - "leper", - "level", - "lever", - "libel", - "liege", - "light", - "liken", - "lilac", - "limbo", - "limit", - "linen", - "liner", - "lingo", - "lipid", - "lithe", - "liver", - "livid", - "llama", - "loamy", - "loath", - "lobby", - "local", - "locus", - "lodge", - "lofty", - "logic", - "login", - "loopy", - "loose", - "lorry", - "loser", - "louse", - "lousy", - "lover", - "lower", - "lowly", - "loyal", - "lucid", - "lucky", - "lumen", - "lumpy", - "lunar", - "lunch", - "lunge", - "lupus", - "lurch", - "lurid", - "lusty", - "lying", - "lymph", - "lynch", - "lyric", - "macaw", - "macho", - "macro", - "madam", - "madly", - "mafia", - "magic", - "magma", - "maize", - "major", - "maker", - "mambo", - "mamma", - "mammy", - "manga", - "mange", - "mango", - "mangy", - "mania", - "manic", - "manly", - "manor", - "maple", - "march", - "marry", - "marsh", - "mason", - "masse", - "match", - "matey", - "mauve", - "maxim", - "maybe", - "mayor", - "mealy", - "meant", - "meaty", - "mecca", - "medal", - "media", - "medic", - "melee", - "melon", - "mercy", - "merge", - "merit", - "merry", - "metal", - "meter", - "metro", - "micro", - "midge", - "midst", - "might", - "milky", - "mimic", - "mince", - "miner", - "minim", - "minor", - "minty", - "minus", - "mirth", - "miser", - "missy", - "mocha", - "modal", - "model", - "modem", - "mogul", - "moist", - "molar", - "moldy", - "money", - "month", - "moody", - "moose", - "moral", - "moron", - "morph", - "mossy", - "motel", - "motif", - "motor", - "motto", - "moult", - "mound", - "mount", - "mourn", - "mouse", - "mouth", - "mover", - "movie", - "mower", - "mucky", - "mucus", - "muddy", - "mulch", - "mummy", - "munch", - "mural", - "murky", - "mushy", - "music", - "musky", - "musty", - "myrrh", - "nadir", - "naive", - "nanny", - "nasal", - "nasty", - "natal", - "naval", - "navel", - "needy", - "neigh", - "nerdy", - "nerve", - "never", - "newer", - "newly", - "nicer", - "niche", - "niece", - "night", - "ninja", - "ninny", - "ninth", - "noble", - "nobly", - "noise", - "noisy", - "nomad", - "noose", - "north", - "nosey", - "notch", - "novel", - "nudge", - "nurse", - "nutty", - "nylon", - "nymph", - "oaken", - "obese", - "occur", - "ocean", - "octal", - "octet", - "odder", - "oddly", - "offal", - "offer", - "often", - "olden", - "older", - "olive", - "ombre", - "omega", - "onion", - "onset", - "opera", - "opine", - "opium", - "optic", - "orbit", - "order", - "organ", - "other", - "otter", - "ought", - "ounce", - "outdo", - "outer", - "outgo", - "ovary", - "ovate", - "overt", - "ovine", - "ovoid", - "owing", - "owner", - "oxide", - "ozone", - "paddy", - "pagan", - "paint", - "paler", - "palsy", - "panel", - "panic", - "pansy", - "papal", - "paper", - "parer", - "parka", - "parry", - "parse", - "party", - "pasta", - "paste", - "pasty", - "patch", - "patio", - "patsy", - "patty", - "pause", - "payee", - "payer", - "peace", - "peach", - "pearl", - "pecan", - "pedal", - "penal", - "pence", - "penne", - "penny", - "perch", - "peril", - "perky", - "pesky", - "pesto", - "petal", - "petty", - "phase", - "phone", - "phony", - "photo", - "piano", - "picky", - "piece", - "piety", - "piggy", - "pilot", - "pinch", - "piney", - "pinky", - "pinto", - "piper", - "pique", - "pitch", - "pithy", - "pivot", - "pixel", - "pixie", - "pizza", - "place", - "plaid", - "plain", - "plait", - "plane", - "plank", - "plant", - "plate", - "plaza", - "plead", - "pleat", - "plied", - "plier", - "pluck", - "plumb", - "plume", - "plump", - "plunk", - "plush", - "poesy", - "point", - "poise", - "poker", - "polar", - "polka", - "polyp", - "pooch", - "poppy", - "porch", - "poser", - "posit", - "posse", - "pouch", - "pound", - "pouty", - "power", - "prank", - "prawn", - "preen", - "press", - "price", - "prick", - "pride", - "pried", - "prime", - "primo", - "print", - "prior", - "prism", - "privy", - "prize", - "probe", - "prone", - "prong", - "proof", - "prose", - "proud", - "prove", - "prowl", - "proxy", - "prude", - "prune", - "psalm", - "pubic", - "pudgy", - "puffy", - "pulpy", - "pulse", - "punch", - "pupal", - "pupil", - "puppy", - "puree", - "purer", - "purge", - "purse", - "pushy", - "putty", - "pygmy", - "quack", - "quail", - "quake", - "qualm", - "quark", - "quart", - "quash", - "quasi", - "queen", - "queer", - "quell", - "query", - "quest", - "queue", - "quick", - "quiet", - "quill", - "quilt", - "quirk", - "quite", - "quota", - "quote", - "quoth", - "rabbi", - "rabid", - "racer", - "radar", - "radii", - "radio", - "rainy", - "raise", - "rajah", - "rally", - "ralph", - "ramen", - "ranch", - "randy", - "range", - "rapid", - "rarer", - "raspy", - "ratio", - "ratty", - "raven", - "rayon", - "razor", - "reach", - "react", - "ready", - "realm", - "rearm", - "rebar", - "rebel", - "rebus", - "rebut", - "recap", - "recur", - "recut", - "reedy", - "refer", - "refit", - "regal", - "rehab", - "reign", - "relax", - "relay", - "relic", - "remit", - "renal", - "renew", - "repay", - "repel", - "reply", - "rerun", - "reset", - "resin", - "retch", - "retro", - "retry", - "reuse", - "revel", - "revue", - "rhino", - "rhyme", - "rider", - "ridge", - "rifle", - "right", - "rigid", - "rigor", - "rinse", - "ripen", - "riper", - "risen", - "riser", - "risky", - "rival", - "river", - "rivet", - "roach", - "roast", - "robin", - "robot", - "rocky", - "rodeo", - "roger", - "rogue", - "roomy", - "roost", - "rotor", - "rouge", - "rough", - "round", - "rouse", - "route", - "rover", - "rowdy", - "rower", - "royal", - "ruddy", - "ruder", - "rugby", - "ruler", - "rumba", - "rumor", - "rupee", - "rural", - "rusty", - "sadly", - "safer", - "saint", - "salad", - "sally", - "salon", - "salsa", - "salty", - "salve", - "salvo", - "sandy", - "saner", - "sappy", - "sassy", - "satin", - "satyr", - "sauce", - "saucy", - "sauna", - "saute", - "savor", - "savoy", - "savvy", - "scald", - "scale", - "scalp", - "scaly", - "scamp", - "scant", - "scare", - "scarf", - "scary", - "scene", - "scent", - "scion", - "scoff", - "scold", - "scone", - "scoop", - "scope", - "score", - "scorn", - "scour", - "scout", - "scowl", - "scram", - "scrap", - "scree", - "screw", - "scrub", - "scrum", - "scuba", - "sedan", - "seedy", - "segue", - "seize", - "semen", - "sense", - "sepia", - "serif", - "serum", - "serve", - "setup", - "seven", - "sever", - "sewer", - "shack", - "shade", - "shady", - "shaft", - "shake", - "shaky", - "shale", - "shall", - "shalt", - "shame", - "shank", - "shape", - "shard", - "share", - "shark", - "sharp", - "shave", - "shawl", - "shear", - "sheen", - "sheep", - "sheer", - "sheet", - "sheik", - "shelf", - "shell", - "shied", - "shift", - "shine", - "shiny", - "shire", - "shirk", - "shirt", - "shoal", - "shock", - "shone", - "shook", - "shoot", - "shore", - "shorn", - "short", - "shout", - "shove", - "shown", - "showy", - "shrew", - "shrub", - "shrug", - "shuck", - "shunt", - "shush", - "shyly", - "siege", - "sieve", - "sight", - "sigma", - "silky", - "silly", - "since", - "sinew", - "singe", - "siren", - "sissy", - "sixth", - "sixty", - "skate", - "skier", - "skiff", - "skill", - "skimp", - "skirt", - "skulk", - "skull", - "skunk", - "slack", - "slain", - "slang", - "slant", - "slash", - "slate", - "slave", - "sleek", - "sleep", - "sleet", - "slept", - "slice", - "slick", - "slide", - "slime", - "slimy", - "sling", - "slink", - "sloop", - "slope", - "slosh", - "sloth", - "slump", - "slung", - "slunk", - "slurp", - "slush", - "slyly", - "smack", - "small", - "smart", - "smash", - "smear", - "smell", - "smelt", - "smile", - "smirk", - "smite", - "smith", - "smock", - "smoke", - "smoky", - "smote", - "snack", - "snail", - "snake", - "snaky", - "snare", - "snarl", - "sneak", - "sneer", - "snide", - "sniff", - "snipe", - "snoop", - "snore", - "snort", - "snout", - "snowy", - "snuck", - "snuff", - "soapy", - "sober", - "soggy", - "solar", - "solid", - "solve", - "sonar", - "sonic", - "sooth", - "sooty", - "sorry", - "sound", - "south", - "sower", - "space", - "spade", - "spank", - "spare", - "spark", - "spasm", - "spawn", - "speak", - "spear", - "speck", - "speed", - "spell", - "spelt", - "spend", - "spent", - "sperm", - "spice", - "spicy", - "spied", - "spiel", - "spike", - "spiky", - "spill", - "spilt", - "spine", - "spiny", - "spire", - "spite", - "splat", - "split", - "spoil", - "spoke", - "spoof", - "spook", - "spool", - "spoon", - "spore", - "sport", - "spout", - "spray", - "spree", - "sprig", - "spunk", - "spurn", - "spurt", - "squad", - "squat", - "squib", - "stack", - "staff", - "stage", - "staid", - "stain", - "stair", - "stake", - "stale", - "stalk", - "stall", - "stamp", - "stand", - "stank", - "stare", - "stark", - "start", - "stash", - "state", - "stave", - "stead", - "steak", - "steal", - "steam", - "steed", - "steel", - "steep", - "steer", - "stein", - "stern", - "stick", - "stiff", - "still", - "stilt", - "sting", - "stink", - "stint", - "stock", - "stoic", - "stoke", - "stole", - "stomp", - "stone", - "stony", - "stood", - "stool", - "stoop", - "store", - "stork", - "storm", - "story", - "stout", - "stove", - "strap", - "straw", - "stray", - "strip", - "strut", - "stuck", - "study", - "stuff", - "stump", - "stung", - "stunk", - "stunt", - "style", - "suave", - "sugar", - "suing", - "suite", - "sulky", - "sully", - "sumac", - "sunny", - "super", - "surer", - "surge", - "surly", - "sushi", - "swami", - "swamp", - "swarm", - "swash", - "swath", - "swear", - "sweat", - "sweep", - "sweet", - "swell", - "swept", - "swift", - "swill", - "swine", - "swing", - "swirl", - "swish", - "swoon", - "swoop", - "sword", - "swore", - "sworn", - "swung", - "synod", - "syrup", - "tabby", - "table", - "taboo", - "tacit", - "tacky", - "taffy", - "taint", - "taken", - "taker", - "tally", - "talon", - "tamer", - "tango", - "tangy", - "taper", - "tapir", - "tardy", - "tarot", - "taste", - "tasty", - "tatty", - "taunt", - "tawny", - "teach", - "teary", - "tease", - "teddy", - "teeth", - "tempo", - "tenet", - "tenor", - "tense", - "tenth", - "tepee", - "tepid", - "terra", - "terse", - "testy", - "thank", - "theft", - "their", - "theme", - "there", - "these", - "theta", - "thick", - "thief", - "thigh", - "thing", - "think", - "third", - "thong", - "thorn", - "those", - "three", - "threw", - "throb", - "throw", - "thrum", - "thumb", - "thump", - "thyme", - "tiara", - "tibia", - "tidal", - "tiger", - "tight", - "tilde", - "timer", - "timid", - "tipsy", - "titan", - "tithe", - "title", - "toast", - "today", - "toddy", - "token", - "tonal", - "tonga", - "tonic", - "tooth", - "topaz", - "topic", - "torch", - "torso", - "torus", - "total", - "totem", - "touch", - "tough", - "towel", - "tower", - "toxic", - "toxin", - "trace", - "track", - "tract", - "trade", - "trail", - "train", - "trait", - "tramp", - "trash", - "trawl", - "tread", - "treat", - "trend", - "triad", - "trial", - "tribe", - "trice", - "trick", - "tried", - "tripe", - "trite", - "troll", - "troop", - "trope", - "trout", - "trove", - "truce", - "truck", - "truer", - "truly", - "trump", - "trunk", - "truss", - "trust", - "truth", - "tryst", - "tubal", - "tuber", - "tulip", - "tulle", - "tumor", - "tunic", - "turbo", - "tutor", - "twang", - "tweak", - "tweed", - "tweet", - "twice", - "twine", - "twirl", - "twist", - "twixt", - "tying", - "udder", - "ulcer", - "ultra", - "umbra", - "uncle", - "uncut", - "under", - "undid", - "undue", - "unfed", - "unfit", - "unify", - "union", - "unite", - "unity", - "unlit", - "unmet", - "unset", - "untie", - "until", - "unwed", - "unzip", - "upper", - "upset", - "urban", - "urine", - "usage", - "usher", - "using", - "usual", - "usurp", - "utile", - "utter", - "vague", - "valet", - "valid", - "valor", - "value", - "valve", - "vapid", - "vapor", - "vault", - "vaunt", - "vegan", - "venom", - "venue", - "verge", - "verse", - "verso", - "verve", - "vicar", - "video", - "vigil", - "vigor", - "villa", - "vinyl", - "viola", - "viper", - "viral", - "virus", - "visit", - "visor", - "vista", - "vital", - "vivid", - "vixen", - "vocal", - "vodka", - "vogue", - "voice", - "voila", - "vomit", - "voter", - "vouch", - "vowel", - "vying", - "wacky", - "wafer", - "wager", - "wagon", - "waist", - "waive", - "waltz", - "warty", - "waste", - "watch", - "water", - "waver", - "waxen", - "weary", - "weave", - "wedge", - "weedy", - "weigh", - "weird", - "welch", - "welsh", - "wench", - "whack", - "whale", - "wharf", - "wheat", - "wheel", - "whelp", - "where", - "which", - "whiff", - "while", - "whine", - "whiny", - "whirl", - "whisk", - "white", - "whole", - "whoop", - "whose", - "widen", - "wider", - "widow", - "width", - "wield", - "wight", - "willy", - "wimpy", - "wince", - "winch", - "windy", - "wiser", - "wispy", - "witch", - "witty", - "woken", - "woman", - "women", - "woody", - "wooer", - "wooly", - "woozy", - "wordy", - "world", - "worry", - "worse", - "worst", - "worth", - "would", - "wound", - "woven", - "wrack", - "wrath", - "wreak", - "wreck", - "wrest", - "wring", - "wrist", - "write", - "wrong", - "wrote", - "wrung", - "wryly", - "yacht", - "yearn", - "yeast", - "yield", - "young", - "youth", - "zebra", - "zesty", - "zonal", -]; - -/** The list of valid guesses, of which the list of possible words is a subset */ -export const allowed = new Set([ - ...words, - "aahed", - "aalii", - "aargh", - "aarti", - "abaca", - "abaci", - "abacs", - "abaft", - "abaka", - "abamp", - "aband", - "abash", - "abask", - "abaya", - "abbas", - "abbed", - "abbes", - "abcee", - "abeam", - "abear", - "abele", - "abers", - "abets", - "abies", - "abler", - "ables", - "ablet", - "ablow", - "abmho", - "abohm", - "aboil", - "aboma", - "aboon", - "abord", - "abore", - "abram", - "abray", - "abrim", - "abrin", - "abris", - "absey", - "absit", - "abuna", - "abune", - "abuts", - "abuzz", - "abyes", - "abysm", - "acais", - "acari", - "accas", - "accoy", - "acerb", - "acers", - "aceta", - "achar", - "ached", - "aches", - "achoo", - "acids", - "acidy", - "acing", - "acini", - "ackee", - "acker", - "acmes", - "acmic", - "acned", - "acnes", - "acock", - "acold", - "acred", - "acres", - "acros", - "acted", - "actin", - "acton", - "acyls", - "adaws", - "adays", - "adbot", - "addax", - "added", - "adder", - "addio", - "addle", - "adeem", - "adhan", - "adieu", - "adios", - "adits", - "adman", - "admen", - "admix", - "adobo", - "adown", - "adoze", - "adrad", - "adred", - "adsum", - "aduki", - "adunc", - "adust", - "advew", - "adyta", - "adzed", - "adzes", - "aecia", - "aedes", - "aegis", - "aeons", - "aerie", - "aeros", - "aesir", - "afald", - "afara", - "afars", - "afear", - "aflaj", - "afore", - "afrit", - "afros", - "agama", - "agami", - "agars", - "agast", - "agave", - "agaze", - "agene", - "agers", - "agger", - "aggie", - "aggri", - "aggro", - "aggry", - "aghas", - "agila", - "agios", - "agism", - "agist", - "agita", - "aglee", - "aglet", - "agley", - "agloo", - "aglus", - "agmas", - "agoge", - "agone", - "agons", - "agood", - "agria", - "agrin", - "agros", - "agued", - "agues", - "aguna", - "aguti", - "aheap", - "ahent", - "ahigh", - "ahind", - "ahing", - "ahint", - "ahold", - "ahull", - "ahuru", - "aidas", - "aided", - "aides", - "aidoi", - "aidos", - "aiery", - "aigas", - "aight", - "ailed", - "aimed", - "aimer", - "ainee", - "ainga", - "aioli", - "aired", - "airer", - "airns", - "airth", - "airts", - "aitch", - "aitus", - "aiver", - "aiyee", - "aizle", - "ajies", - "ajiva", - "ajuga", - "ajwan", - "akees", - "akela", - "akene", - "aking", - "akita", - "akkas", - "alaap", - "alack", - "alamo", - "aland", - "alane", - "alang", - "alans", - "alant", - "alapa", - "alaps", - "alary", - "alate", - "alays", - "albas", - "albee", - "alcid", - "alcos", - "aldea", - "alder", - "aldol", - "aleck", - "alecs", - "alefs", - "aleft", - "aleph", - "alews", - "aleye", - "alfas", - "algal", - "algas", - "algid", - "algin", - "algor", - "algum", - "alias", - "alifs", - "aline", - "alist", - "aliya", - "alkie", - "alkos", - "alkyd", - "alkyl", - "allee", - "allel", - "allis", - "allod", - "allyl", - "almah", - "almas", - "almeh", - "almes", - "almud", - "almug", - "alods", - "aloed", - "aloes", - "aloha", - "aloin", - "aloos", - "alowe", - "altho", - "altos", - "alula", - "alums", - "alure", - "alvar", - "alway", - "amahs", - "amain", - "amate", - "amaut", - "amban", - "ambit", - "ambos", - "ambry", - "ameba", - "ameer", - "amene", - "amens", - "ament", - "amias", - "amice", - "amici", - "amide", - "amido", - "amids", - "amies", - "amiga", - "amigo", - "amine", - "amino", - "amins", - "amirs", - "amlas", - "amman", - "ammon", - "ammos", - "amnia", - "amnic", - "amnio", - "amoks", - "amole", - "amort", - "amour", - "amove", - "amowt", - "amped", - "ampul", - "amrit", - "amuck", - "amyls", - "anana", - "anata", - "ancho", - "ancle", - "ancon", - "andro", - "anear", - "anele", - "anent", - "angas", - "anglo", - "anigh", - "anile", - "anils", - "anima", - "animi", - "anion", - "anise", - "anker", - "ankhs", - "ankus", - "anlas", - "annal", - "annas", - "annat", - "anoas", - "anole", - "anomy", - "ansae", - "antae", - "antar", - "antas", - "anted", - "antes", - "antis", - "antra", - "antre", - "antsy", - "anura", - "anyon", - "apace", - "apage", - "apaid", - "apayd", - "apays", - "apeak", - "apeek", - "apers", - "apert", - "apery", - "apgar", - "aphis", - "apian", - "apiol", - "apish", - "apism", - "apode", - "apods", - "apoop", - "aport", - "appal", - "appay", - "appel", - "appro", - "appui", - "appuy", - "apres", - "apses", - "apsis", - "apsos", - "apted", - "apter", - "aquae", - "aquas", - "araba", - "araks", - "arame", - "arars", - "arbas", - "arced", - "archi", - "arcos", - "arcus", - "ardeb", - "ardri", - "aread", - "areae", - "areal", - "arear", - "areas", - "areca", - "aredd", - "arede", - "arefy", - "areic", - "arene", - "arepa", - "arere", - "arete", - "arets", - "arett", - "argal", - "argan", - "argil", - "argle", - "argol", - "argon", - "argot", - "argus", - "arhat", - "arias", - "ariel", - "ariki", - "arils", - "ariot", - "arish", - "arked", - "arled", - "arles", - "armed", - "armer", - "armet", - "armil", - "arnas", - "arnut", - "aroba", - "aroha", - "aroid", - "arpas", - "arpen", - "arrah", - "arras", - "arret", - "arris", - "arroz", - "arsed", - "arses", - "arsey", - "arsis", - "artal", - "artel", - "artic", - "artis", - "aruhe", - "arums", - "arval", - "arvee", - "arvos", - "aryls", - "asana", - "ascon", - "ascus", - "asdic", - "ashed", - "ashes", - "ashet", - "asked", - "asker", - "askoi", - "askos", - "aspen", - "asper", - "aspic", - "aspie", - "aspis", - "aspro", - "assai", - "assam", - "asses", - "assez", - "assot", - "aster", - "astir", - "astun", - "asura", - "asway", - "aswim", - "asyla", - "ataps", - "ataxy", - "atigi", - "atilt", - "atimy", - "atlas", - "atman", - "atmas", - "atmos", - "atocs", - "atoke", - "atoks", - "atoms", - "atomy", - "atony", - "atopy", - "atria", - "atrip", - "attap", - "attar", - "atuas", - "audad", - "auger", - "aught", - "aulas", - "aulic", - "auloi", - "aulos", - "aumil", - "aunes", - "aunts", - "aurae", - "aural", - "aurar", - "auras", - "aurei", - "aures", - "auric", - "auris", - "aurum", - "autos", - "auxin", - "avale", - "avant", - "avast", - "avels", - "avens", - "avers", - "avgas", - "avine", - "avion", - "avise", - "aviso", - "avize", - "avows", - "avyze", - "awarn", - "awato", - "awave", - "aways", - "awdls", - "aweel", - "aweto", - "awing", - "awmry", - "awned", - "awner", - "awols", - "awork", - "axels", - "axile", - "axils", - "axing", - "axite", - "axled", - "axles", - "axman", - "axmen", - "axoid", - "axone", - "axons", - "ayahs", - "ayaya", - "ayelp", - "aygre", - "ayins", - "ayont", - "ayres", - "ayrie", - "azans", - "azide", - "azido", - "azine", - "azlon", - "azoic", - "azole", - "azons", - "azote", - "azoth", - "azuki", - "azurn", - "azury", - "azygy", - "azyme", - "azyms", - "baaed", - "baals", - "babas", - "babel", - "babes", - "babka", - "baboo", - "babul", - "babus", - "bacca", - "bacco", - "baccy", - "bacha", - "bachs", - "backs", - "baddy", - "baels", - "baffs", - "baffy", - "bafts", - "baghs", - "bagie", - "bahts", - "bahus", - "bahut", - "bails", - "bairn", - "baisa", - "baith", - "baits", - "baiza", - "baize", - "bajan", - "bajra", - "bajri", - "bajus", - "baked", - "baken", - "bakes", - "bakra", - "balas", - "balds", - "baldy", - "baled", - "bales", - "balks", - "balky", - "balls", - "bally", - "balms", - "baloo", - "balsa", - "balti", - "balun", - "balus", - "bambi", - "banak", - "banco", - "bancs", - "banda", - "bandh", - "bands", - "bandy", - "baned", - "banes", - "bangs", - "bania", - "banks", - "banns", - "bants", - "bantu", - "banty", - "banya", - "bapus", - "barbe", - "barbs", - "barby", - "barca", - "barde", - "bardo", - "bards", - "bardy", - "bared", - "barer", - "bares", - "barfi", - "barfs", - "baric", - "barks", - "barky", - "barms", - "barmy", - "barns", - "barny", - "barps", - "barra", - "barre", - "barro", - "barry", - "barye", - "basan", - "based", - "basen", - "baser", - "bases", - "basho", - "basij", - "basks", - "bason", - "basse", - "bassi", - "basso", - "bassy", - "basta", - "basti", - "basto", - "basts", - "bated", - "bates", - "baths", - "batik", - "batta", - "batts", - "battu", - "bauds", - "bauks", - "baulk", - "baurs", - "bavin", - "bawds", - "bawks", - "bawls", - "bawns", - "bawrs", - "bawty", - "bayed", - "bayer", - "bayes", - "bayle", - "bayts", - "bazar", - "bazoo", - "beads", - "beaks", - "beaky", - "beals", - "beams", - "beamy", - "beano", - "beans", - "beany", - "beare", - "bears", - "beath", - "beats", - "beaty", - "beaus", - "beaut", - "beaux", - "bebop", - "becap", - "becke", - "becks", - "bedad", - "bedel", - "bedes", - "bedew", - "bedim", - "bedye", - "beedi", - "beefs", - "beeps", - "beers", - "beery", - "beets", - "befog", - "begad", - "begar", - "begem", - "begot", - "begum", - "beige", - "beigy", - "beins", - "bekah", - "belah", - "belar", - "belay", - "belee", - "belga", - "bells", - "belon", - "belts", - "bemad", - "bemas", - "bemix", - "bemud", - "bends", - "bendy", - "benes", - "benet", - "benga", - "benis", - "benne", - "benni", - "benny", - "bento", - "bents", - "benty", - "bepat", - "beray", - "beres", - "bergs", - "berko", - "berks", - "berme", - "berms", - "berob", - "beryl", - "besat", - "besaw", - "besee", - "beses", - "besit", - "besom", - "besot", - "besti", - "bests", - "betas", - "beted", - "betes", - "beths", - "betid", - "beton", - "betta", - "betty", - "bever", - "bevor", - "bevue", - "bevvy", - "bewet", - "bewig", - "bezes", - "bezil", - "bezzy", - "bhais", - "bhaji", - "bhang", - "bhats", - "bhels", - "bhoot", - "bhuna", - "bhuts", - "biach", - "biali", - "bialy", - "bibbs", - "bibes", - "biccy", - "bices", - "bided", - "bider", - "bides", - "bidet", - "bidis", - "bidon", - "bield", - "biers", - "biffo", - "biffs", - "biffy", - "bifid", - "bigae", - "biggs", - "biggy", - "bigha", - "bight", - "bigly", - "bigos", - "bijou", - "biked", - "biker", - "bikes", - "bikie", - "bilbo", - "bilby", - "biled", - "biles", - "bilgy", - "bilks", - "bills", - "bimah", - "bimas", - "bimbo", - "binal", - "bindi", - "binds", - "biner", - "bines", - "bings", - "bingy", - "binit", - "binks", - "bints", - "biogs", - "biont", - "biota", - "biped", - "bipod", - "birds", - "birks", - "birle", - "birls", - "biros", - "birrs", - "birse", - "birsy", - "bises", - "bisks", - "bisom", - "bitch", - "biter", - "bites", - "bitos", - "bitou", - "bitsy", - "bitte", - "bitts", - "bivia", - "bivvy", - "bizes", - "bizzo", - "bizzy", - "blabs", - "blads", - "blady", - "blaer", - "blaes", - "blaff", - "blags", - "blahs", - "blain", - "blams", - "blart", - "blase", - "blash", - "blate", - "blats", - "blatt", - "blaud", - "blawn", - "blaws", - "blays", - "blear", - "blebs", - "blech", - "blees", - "blent", - "blert", - "blest", - "blets", - "bleys", - "blimy", - "bling", - "blini", - "blins", - "bliny", - "blips", - "blist", - "blite", - "blits", - "blive", - "blobs", - "blocs", - "blogs", - "blook", - "bloop", - "blore", - "blots", - "blows", - "blowy", - "blubs", - "blude", - "bluds", - "bludy", - "blued", - "blues", - "bluet", - "bluey", - "bluid", - "blume", - "blunk", - "blurs", - "blype", - "boabs", - "boaks", - "boars", - "boart", - "boats", - "bobac", - "bobak", - "bobas", - "bobol", - "bobos", - "bocca", - "bocce", - "bocci", - "boche", - "bocks", - "boded", - "bodes", - "bodge", - "bodhi", - "bodle", - "boeps", - "boets", - "boeuf", - "boffo", - "boffs", - "bogan", - "bogey", - "boggy", - "bogie", - "bogle", - "bogue", - "bogus", - "bohea", - "bohos", - "boils", - "boing", - "boink", - "boite", - "boked", - "bokeh", - "bokes", - "bokos", - "bolar", - "bolas", - "bolds", - "boles", - "bolix", - "bolls", - "bolos", - "bolts", - "bolus", - "bomas", - "bombe", - "bombo", - "bombs", - "bonce", - "bonds", - "boned", - "boner", - "bones", - "bongs", - "bonie", - "bonks", - "bonne", - "bonny", - "bonza", - "bonze", - "booai", - "booay", - "boobs", - "boody", - "booed", - "boofy", - "boogy", - "boohs", - "books", - "booky", - "bools", - "booms", - "boomy", - "boong", - "boons", - "boord", - "boors", - "boose", - "boots", - "boppy", - "borak", - "boral", - "boras", - "borde", - "bords", - "bored", - "boree", - "borel", - "borer", - "bores", - "borgo", - "boric", - "borks", - "borms", - "borna", - "boron", - "borts", - "borty", - "bortz", - "bosie", - "bosks", - "bosky", - "boson", - "bosun", - "botas", - "botel", - "botes", - "bothy", - "botte", - "botts", - "botty", - "bouge", - "bouks", - "boult", - "bouns", - "bourd", - "bourg", - "bourn", - "bouse", - "bousy", - "bouts", - "bovid", - "bowat", - "bowed", - "bower", - "bowes", - "bowet", - "bowie", - "bowls", - "bowne", - "bowrs", - "bowse", - "boxed", - "boxen", - "boxes", - "boxla", - "boxty", - "boyar", - "boyau", - "boyed", - "boyfs", - "boygs", - "boyla", - "boyos", - "boysy", - "bozos", - "braai", - "brach", - "brack", - "bract", - "brads", - "braes", - "brags", - "brail", - "braks", - "braky", - "brame", - "brane", - "brank", - "brans", - "brant", - "brast", - "brats", - "brava", - "bravi", - "braws", - "braxy", - "brays", - "braza", - "braze", - "bream", - "brede", - "breds", - "breem", - "breer", - "brees", - "breid", - "breis", - "breme", - "brens", - "brent", - "brere", - "brers", - "breve", - "brews", - "breys", - "brier", - "bries", - "brigs", - "briki", - "briks", - "brill", - "brims", - "brins", - "brios", - "brise", - "briss", - "brith", - "brits", - "britt", - "brize", - "broch", - "brock", - "brods", - "brogh", - "brogs", - "brome", - "bromo", - "bronc", - "brond", - "brool", - "broos", - "brose", - "brosy", - "brows", - "brugh", - "bruin", - "bruit", - "brule", - "brume", - "brung", - "brusk", - "brust", - "bruts", - "buats", - "buaze", - "bubal", - "bubas", - "bubba", - "bubbe", - "bubby", - "bubus", - "buchu", - "bucko", - "bucks", - "bucku", - "budas", - "budis", - "budos", - "buffa", - "buffe", - "buffi", - "buffo", - "buffs", - "buffy", - "bufos", - "bufty", - "buhls", - "buhrs", - "buiks", - "buist", - "bukes", - "bulbs", - "bulgy", - "bulks", - "bulla", - "bulls", - "bulse", - "bumbo", - "bumfs", - "bumph", - "bumps", - "bumpy", - "bunas", - "bunce", - "bunco", - "bunde", - "bundh", - "bunds", - "bundt", - "bundu", - "bundy", - "bungs", - "bungy", - "bunia", - "bunje", - "bunjy", - "bunko", - "bunks", - "bunns", - "bunts", - "bunty", - "bunya", - "buoys", - "buppy", - "buran", - "buras", - "burbs", - "burds", - "buret", - "burfi", - "burgh", - "burgs", - "burin", - "burka", - "burke", - "burks", - "burls", - "burns", - "buroo", - "burps", - "burqa", - "burro", - "burrs", - "burry", - "bursa", - "burse", - "busby", - "buses", - "busks", - "busky", - "bussu", - "busti", - "busts", - "busty", - "buteo", - "butes", - "butle", - "butoh", - "butts", - "butty", - "butut", - "butyl", - "buzzy", - "bwana", - "bwazi", - "byded", - "bydes", - "byked", - "bykes", - "byres", - "byrls", - "byssi", - "bytes", - "byway", - "caaed", - "cabas", - "caber", - "cabob", - "caboc", - "cabre", - "cacas", - "cacks", - "cacky", - "cadee", - "cades", - "cadge", - "cadgy", - "cadie", - "cadis", - "cadre", - "caeca", - "caese", - "cafes", - "caffs", - "caged", - "cager", - "cages", - "cagot", - "cahow", - "caids", - "cains", - "caird", - "cajon", - "cajun", - "caked", - "cakes", - "cakey", - "calfs", - "calid", - "calif", - "calix", - "calks", - "calla", - "calls", - "calms", - "calmy", - "calos", - "calpa", - "calps", - "calve", - "calyx", - "caman", - "camas", - "cames", - "camis", - "camos", - "campi", - "campo", - "camps", - "campy", - "camus", - "caned", - "caneh", - "caner", - "canes", - "cangs", - "canid", - "canna", - "canns", - "canso", - "canst", - "canto", - "cants", - "canty", - "capas", - "caped", - "capes", - "capex", - "caphs", - "capiz", - "caple", - "capon", - "capos", - "capot", - "capri", - "capul", - "carap", - "carbo", - "carbs", - "carby", - "cardi", - "cards", - "cardy", - "cared", - "carer", - "cares", - "caret", - "carex", - "carks", - "carle", - "carls", - "carns", - "carny", - "carob", - "carom", - "caron", - "carpi", - "carps", - "carrs", - "carse", - "carta", - "carte", - "carts", - "carvy", - "casas", - "casco", - "cased", - "cases", - "casks", - "casky", - "casts", - "casus", - "cates", - "cauda", - "cauks", - "cauld", - "cauls", - "caums", - "caups", - "cauri", - "causa", - "cavas", - "caved", - "cavel", - "caver", - "caves", - "cavie", - "cawed", - "cawks", - "caxon", - "ceaze", - "cebid", - "cecal", - "cecum", - "ceded", - "ceder", - "cedes", - "cedis", - "ceiba", - "ceili", - "ceils", - "celeb", - "cella", - "celli", - "cells", - "celom", - "celts", - "cense", - "cento", - "cents", - "centu", - "ceorl", - "cepes", - "cerci", - "cered", - "ceres", - "cerge", - "ceria", - "ceric", - "cerne", - "ceroc", - "ceros", - "certs", - "certy", - "cesse", - "cesta", - "cesti", - "cetes", - "cetyl", - "cezve", - "chace", - "chack", - "chaco", - "chado", - "chads", - "chaft", - "chais", - "chals", - "chams", - "chana", - "chang", - "chank", - "chape", - "chaps", - "chapt", - "chara", - "chare", - "chark", - "charr", - "chars", - "chary", - "chats", - "chave", - "chavs", - "chawk", - "chaws", - "chaya", - "chays", - "cheep", - "chefs", - "cheka", - "chela", - "chelp", - "chemo", - "chems", - "chere", - "chert", - "cheth", - "chevy", - "chews", - "chewy", - "chiao", - "chias", - "chibs", - "chica", - "chich", - "chico", - "chics", - "chiel", - "chiks", - "chile", - "chimb", - "chimo", - "chimp", - "chine", - "ching", - "chink", - "chino", - "chins", - "chips", - "chirk", - "chirl", - "chirm", - "chiro", - "chirr", - "chirt", - "chiru", - "chits", - "chive", - "chivs", - "chivy", - "chizz", - "choco", - "chocs", - "chode", - "chogs", - "choil", - "choko", - "choky", - "chola", - "choli", - "cholo", - "chomp", - "chons", - "choof", - "chook", - "choom", - "choon", - "chops", - "chota", - "chott", - "chout", - "choux", - "chowk", - "chows", - "chubs", - "chufa", - "chuff", - "chugs", - "chums", - "churl", - "churr", - "chuse", - "chuts", - "chyle", - "chyme", - "chynd", - "cibol", - "cided", - "cides", - "ciels", - "ciggy", - "cilia", - "cills", - "cimar", - "cimex", - "cinct", - "cines", - "cinqs", - "cions", - "cippi", - "circs", - "cires", - "cirls", - "cirri", - "cisco", - "cissy", - "cists", - "cital", - "cited", - "citer", - "cites", - "cives", - "civet", - "civie", - "civvy", - "clach", - "clade", - "clads", - "claes", - "clags", - "clame", - "clams", - "clans", - "claps", - "clapt", - "claro", - "clart", - "clary", - "clast", - "clats", - "claut", - "clave", - "clavi", - "claws", - "clays", - "cleck", - "cleek", - "cleep", - "clefs", - "clegs", - "cleik", - "clems", - "clepe", - "clept", - "cleve", - "clews", - "clied", - "clies", - "clift", - "clime", - "cline", - "clint", - "clipe", - "clips", - "clipt", - "clits", - "cloam", - "clods", - "cloff", - "clogs", - "cloke", - "clomb", - "clomp", - "clonk", - "clons", - "cloop", - "cloot", - "clops", - "clote", - "clots", - "clour", - "clous", - "clows", - "cloye", - "cloys", - "cloze", - "clubs", - "clues", - "cluey", - "clunk", - "clype", - "cnida", - "coact", - "coady", - "coala", - "coals", - "coaly", - "coapt", - "coarb", - "coate", - "coati", - "coats", - "cobbs", - "cobby", - "cobia", - "coble", - "cobza", - "cocas", - "cocci", - "cocco", - "cocks", - "cocky", - "cocos", - "codas", - "codec", - "coded", - "coden", - "coder", - "codes", - "codex", - "codon", - "coeds", - "coffs", - "cogie", - "cogon", - "cogue", - "cohab", - "cohen", - "cohoe", - "cohog", - "cohos", - "coifs", - "coign", - "coils", - "coins", - "coirs", - "coits", - "coked", - "cokes", - "colas", - "colby", - "colds", - "coled", - "coles", - "coley", - "colic", - "colin", - "colls", - "colly", - "colog", - "colts", - "colza", - "comae", - "comal", - "comas", - "combe", - "combi", - "combo", - "combs", - "comby", - "comer", - "comes", - "comix", - "commo", - "comms", - "commy", - "compo", - "comps", - "compt", - "comte", - "comus", - "coned", - "cones", - "coney", - "confs", - "conga", - "conge", - "congo", - "conia", - "conin", - "conks", - "conky", - "conne", - "conns", - "conte", - "conto", - "conus", - "convo", - "cooch", - "cooed", - "cooee", - "cooer", - "cooey", - "coofs", - "cooks", - "cooky", - "cools", - "cooly", - "coomb", - "cooms", - "coomy", - "coons", - "coops", - "coopt", - "coost", - "coots", - "cooze", - "copal", - "copay", - "coped", - "copen", - "coper", - "copes", - "coppy", - "copra", - "copsy", - "coqui", - "coram", - "corbe", - "corby", - "cords", - "cored", - "cores", - "corey", - "corgi", - "coria", - "corks", - "corky", - "corms", - "corni", - "corno", - "corns", - "cornu", - "corps", - "corse", - "corso", - "cosec", - "cosed", - "coses", - "coset", - "cosey", - "cosie", - "costa", - "coste", - "costs", - "cotan", - "coted", - "cotes", - "coths", - "cotta", - "cotts", - "coude", - "coups", - "courb", - "courd", - "coure", - "cours", - "couta", - "couth", - "coved", - "coves", - "covin", - "cowal", - "cowan", - "cowed", - "cowks", - "cowls", - "cowps", - "cowry", - "coxae", - "coxal", - "coxed", - "coxes", - "coxib", - "coyau", - "coyed", - "coyer", - "coypu", - "cozed", - "cozen", - "cozes", - "cozey", - "cozie", - "craal", - "crabs", - "crags", - "craic", - "craig", - "crake", - "crame", - "crams", - "crans", - "crape", - "craps", - "crapy", - "crare", - "craws", - "crays", - "creds", - "creel", - "crees", - "crems", - "crena", - "creps", - "crepy", - "crewe", - "crews", - "crias", - "cribs", - "cries", - "crims", - "crine", - "crios", - "cripe", - "crips", - "crise", - "crith", - "crits", - "croci", - "crocs", - "croft", - "crogs", - "cromb", - "crome", - "cronk", - "crons", - "crool", - "croon", - "crops", - "crore", - "crost", - "crout", - "crows", - "croze", - "cruck", - "crudo", - "cruds", - "crudy", - "crues", - "cruet", - "cruft", - "crunk", - "cruor", - "crura", - "cruse", - "crusy", - "cruve", - "crwth", - "cryer", - "ctene", - "cubby", - "cubeb", - "cubed", - "cuber", - "cubes", - "cubit", - "cuddy", - "cuffo", - "cuffs", - "cuifs", - "cuing", - "cuish", - "cuits", - "cukes", - "culch", - "culet", - "culex", - "culls", - "cully", - "culms", - "culpa", - "culti", - "cults", - "culty", - "cumec", - "cundy", - "cunei", - "cunit", - "cunts", - "cupel", - "cupid", - "cuppa", - "cuppy", - "curat", - "curbs", - "curch", - "curds", - "curdy", - "cured", - "curer", - "cures", - "curet", - "curfs", - "curia", - "curie", - "curli", - "curls", - "curns", - "curny", - "currs", - "cursi", - "curst", - "cusec", - "cushy", - "cusks", - "cusps", - "cuspy", - "cusso", - "cusum", - "cutch", - "cuter", - "cutes", - "cutey", - "cutin", - "cutis", - "cutto", - "cutty", - "cutup", - "cuvee", - "cuzes", - "cwtch", - "cyano", - "cyans", - "cycad", - "cycas", - "cyclo", - "cyder", - "cylix", - "cymae", - "cymar", - "cymas", - "cymes", - "cymol", - "cysts", - "cytes", - "cyton", - "czars", - "daals", - "dabba", - "daces", - "dacha", - "dacks", - "dadah", - "dadas", - "dados", - "daffs", - "daffy", - "dagga", - "daggy", - "dagos", - "dahls", - "daiko", - "daine", - "daint", - "daker", - "daled", - "dales", - "dalis", - "dalle", - "dalts", - "daman", - "damar", - "dames", - "damme", - "damns", - "damps", - "dampy", - "dancy", - "dangs", - "danio", - "danks", - "danny", - "dants", - "daraf", - "darbs", - "darcy", - "dared", - "darer", - "dares", - "darga", - "dargs", - "daric", - "daris", - "darks", - "darky", - "darns", - "darre", - "darts", - "darzi", - "dashi", - "dashy", - "datal", - "dated", - "dater", - "dates", - "datos", - "datto", - "daube", - "daubs", - "dauby", - "dauds", - "dault", - "daurs", - "dauts", - "daven", - "davit", - "dawah", - "dawds", - "dawed", - "dawen", - "dawks", - "dawns", - "dawts", - "dayan", - "daych", - "daynt", - "dazed", - "dazer", - "dazes", - "deads", - "deair", - "deals", - "deans", - "deare", - "dearn", - "dears", - "deary", - "deash", - "deave", - "deaws", - "deawy", - "debag", - "debby", - "debel", - "debes", - "debts", - "debud", - "debur", - "debus", - "debye", - "decad", - "decaf", - "decan", - "decko", - "decks", - "decos", - "dedal", - "deeds", - "deedy", - "deely", - "deems", - "deens", - "deeps", - "deere", - "deers", - "deets", - "deeve", - "deevs", - "defat", - "deffo", - "defis", - "defog", - "degas", - "degum", - "degus", - "deice", - "deids", - "deify", - "deils", - "deism", - "deist", - "deked", - "dekes", - "dekko", - "deled", - "deles", - "delfs", - "delft", - "delis", - "dells", - "delly", - "delos", - "delph", - "delts", - "deman", - "demes", - "demic", - "demit", - "demob", - "demoi", - "demos", - "dempt", - "denar", - "denay", - "dench", - "denes", - "denet", - "denis", - "dents", - "deoxy", - "derat", - "deray", - "dered", - "deres", - "derig", - "derma", - "derms", - "derns", - "derny", - "deros", - "derro", - "derry", - "derth", - "dervs", - "desex", - "deshi", - "desis", - "desks", - "desse", - "devas", - "devel", - "devis", - "devon", - "devos", - "devot", - "dewan", - "dewar", - "dewax", - "dewed", - "dexes", - "dexie", - "dhaba", - "dhaks", - "dhals", - "dhikr", - "dhobi", - "dhole", - "dholl", - "dhols", - "dhoti", - "dhows", - "dhuti", - "diact", - "dials", - "diane", - "diazo", - "dibbs", - "diced", - "dicer", - "dices", - "dicht", - "dicks", - "dicky", - "dicot", - "dicta", - "dicts", - "dicty", - "diddy", - "didie", - "didos", - "didst", - "diebs", - "diels", - "diene", - "diets", - "diffs", - "dight", - "dikas", - "diked", - "diker", - "dikes", - "dikey", - "dildo", - "dilli", - "dills", - "dimbo", - "dimer", - "dimes", - "dimps", - "dinar", - "dined", - "dines", - "dinge", - "dings", - "dinic", - "dinks", - "dinky", - "dinna", - "dinos", - "dints", - "diols", - "diota", - "dippy", - "dipso", - "diram", - "direr", - "dirke", - "dirks", - "dirls", - "dirts", - "disas", - "disci", - "discs", - "dishy", - "disks", - "disme", - "dital", - "ditas", - "dited", - "dites", - "ditsy", - "ditts", - "ditzy", - "divan", - "divas", - "dived", - "dives", - "divis", - "divna", - "divos", - "divot", - "divvy", - "diwan", - "dixie", - "dixit", - "diyas", - "dizen", - "djinn", - "djins", - "doabs", - "doats", - "dobby", - "dobes", - "dobie", - "dobla", - "dobra", - "dobro", - "docht", - "docks", - "docos", - "docus", - "doddy", - "dodos", - "doeks", - "doers", - "doest", - "doeth", - "doffs", - "dogan", - "doges", - "dogey", - "doggo", - "doggy", - "dogie", - "dohyo", - "doilt", - "doily", - "doits", - "dojos", - "dolce", - "dolci", - "doled", - "doles", - "dolia", - "dolls", - "dolma", - "dolor", - "dolos", - "dolts", - "domal", - "domed", - "domes", - "domic", - "donah", - "donas", - "donee", - "doner", - "donga", - "dongs", - "donko", - "donna", - "donne", - "donny", - "donsy", - "doobs", - "dooce", - "doody", - "dooks", - "doole", - "dools", - "dooly", - "dooms", - "doomy", - "doona", - "doorn", - "doors", - "doozy", - "dopas", - "doped", - "doper", - "dopes", - "dorad", - "dorba", - "dorbs", - "doree", - "dores", - "doric", - "doris", - "dorks", - "dorky", - "dorms", - "dormy", - "dorps", - "dorrs", - "dorsa", - "dorse", - "dorts", - "dorty", - "dosai", - "dosas", - "dosed", - "doseh", - "doser", - "doses", - "dosha", - "dotal", - "doted", - "doter", - "dotes", - "dotty", - "douar", - "douce", - "doucs", - "douks", - "doula", - "douma", - "doums", - "doups", - "doura", - "douse", - "douts", - "doved", - "doven", - "dover", - "doves", - "dovie", - "dowar", - "dowds", - "dowed", - "dower", - "dowie", - "dowle", - "dowls", - "dowly", - "downa", - "downs", - "dowps", - "dowse", - "dowts", - "doxed", - "doxes", - "doxie", - "doyen", - "doyly", - "dozed", - "dozer", - "dozes", - "drabs", - "drack", - "draco", - "draff", - "drags", - "drail", - "drams", - "drant", - "draps", - "drats", - "drave", - "draws", - "drays", - "drear", - "dreck", - "dreed", - "dreer", - "drees", - "dregs", - "dreks", - "drent", - "drere", - "drest", - "dreys", - "dribs", - "drice", - "dries", - "drily", - "drips", - "dript", - "droid", - "droil", - "droke", - "drole", - "drome", - "drony", - "droob", - "droog", - "drook", - "drops", - "dropt", - "drouk", - "drows", - "drubs", - "drugs", - "drums", - "drupe", - "druse", - "drusy", - "druxy", - "dryad", - "dryas", - "dsobo", - "dsomo", - "duads", - "duals", - "duans", - "duars", - "dubbo", - "ducal", - "ducat", - "duces", - "ducks", - "ducky", - "ducts", - "duddy", - "duded", - "dudes", - "duels", - "duets", - "duett", - "duffs", - "dufus", - "duing", - "duits", - "dukas", - "duked", - "dukes", - "dukka", - "dulce", - "dules", - "dulia", - "dulls", - "dulse", - "dumas", - "dumbo", - "dumbs", - "dumka", - "dumky", - "dumps", - "dunam", - "dunch", - "dunes", - "dungs", - "dungy", - "dunks", - "dunno", - "dunny", - "dunsh", - "dunts", - "duomi", - "duomo", - "duped", - "duper", - "dupes", - "duple", - "duply", - "duppy", - "dural", - "duras", - "dured", - "dures", - "durgy", - "durns", - "duroc", - "duros", - "duroy", - "durra", - "durrs", - "durry", - "durst", - "durum", - "durzi", - "dusks", - "dusts", - "duxes", - "dwaal", - "dwale", - "dwalm", - "dwams", - "dwang", - "dwaum", - "dweeb", - "dwile", - "dwine", - "dyads", - "dyers", - "dyked", - "dykes", - "dykey", - "dykon", - "dynel", - "dynes", - "dzhos", - "eagre", - "ealed", - "eales", - "eaned", - "eards", - "eared", - "earls", - "earns", - "earnt", - "earst", - "eased", - "easer", - "eases", - "easle", - "easts", - "eathe", - "eaved", - "eaves", - "ebbed", - "ebbet", - "ebons", - "ebook", - "ecads", - "eched", - "eches", - "echos", - "ecrus", - "edema", - "edged", - "edger", - "edges", - "edile", - "edits", - "educe", - "educt", - "eejit", - "eensy", - "eeven", - "eevns", - "effed", - "egads", - "egers", - "egest", - "eggar", - "egged", - "egger", - "egmas", - "ehing", - "eider", - "eidos", - "eigne", - "eiked", - "eikon", - "eilds", - "eisel", - "ejido", - "ekkas", - "elain", - "eland", - "elans", - "elchi", - "eldin", - "elemi", - "elfed", - "eliad", - "elint", - "elmen", - "eloge", - "elogy", - "eloin", - "elops", - "elpee", - "elsin", - "elute", - "elvan", - "elven", - "elver", - "elves", - "emacs", - "embar", - "embay", - "embog", - "embow", - "embox", - "embus", - "emeer", - "emend", - "emerg", - "emery", - "emeus", - "emics", - "emirs", - "emits", - "emmas", - "emmer", - "emmet", - "emmew", - "emmys", - "emoji", - "emong", - "emote", - "emove", - "empts", - "emule", - "emure", - "emyde", - "emyds", - "enarm", - "enate", - "ended", - "ender", - "endew", - "endue", - "enews", - "enfix", - "eniac", - "enlit", - "enmew", - "ennog", - "enoki", - "enols", - "enorm", - "enows", - "enrol", - "ensew", - "ensky", - "entia", - "enure", - "enurn", - "envoi", - "enzym", - "eorls", - "eosin", - "epact", - "epees", - "ephah", - "ephas", - "ephod", - "ephor", - "epics", - "epode", - "epopt", - "epris", - "eques", - "equid", - "erbia", - "erevs", - "ergon", - "ergos", - "ergot", - "erhus", - "erica", - "erick", - "erics", - "ering", - "erned", - "ernes", - "erose", - "erred", - "erses", - "eruct", - "erugo", - "eruvs", - "erven", - "ervil", - "escar", - "escot", - "esile", - "eskar", - "esker", - "esnes", - "esses", - "estoc", - "estop", - "estro", - "etage", - "etape", - "etats", - "etens", - "ethal", - "ethne", - "ethyl", - "etics", - "etnas", - "ettin", - "ettle", - "etuis", - "etwee", - "etyma", - "eughs", - "euked", - "eupad", - "euros", - "eusol", - "evens", - "evert", - "evets", - "evhoe", - "evils", - "evite", - "evohe", - "ewers", - "ewest", - "ewhow", - "ewked", - "exams", - "exeat", - "execs", - "exeem", - "exeme", - "exfil", - "exies", - "exine", - "exing", - "exits", - "exode", - "exome", - "exons", - "expat", - "expos", - "exude", - "exuls", - "exurb", - "eyass", - "eyers", - "eyots", - "eyras", - "eyres", - "eyrie", - "eyrir", - "ezine", - "fabby", - "faced", - "facer", - "faces", - "facia", - "facta", - "facts", - "faddy", - "faded", - "fader", - "fades", - "fadge", - "fados", - "faena", - "faery", - "faffs", - "faffy", - "faggy", - "fagin", - "fagot", - "faiks", - "fails", - "faine", - "fains", - "fairs", - "faked", - "faker", - "fakes", - "fakey", - "fakie", - "fakir", - "falaj", - "falls", - "famed", - "fames", - "fanal", - "fands", - "fanes", - "fanga", - "fango", - "fangs", - "fanks", - "fanon", - "fanos", - "fanum", - "faqir", - "farad", - "farci", - "farcy", - "fards", - "fared", - "farer", - "fares", - "farle", - "farls", - "farms", - "faros", - "farro", - "farse", - "farts", - "fasci", - "fasti", - "fasts", - "fated", - "fates", - "fatly", - "fatso", - "fatwa", - "faugh", - "fauld", - "fauns", - "faurd", - "fauts", - "fauve", - "favas", - "favel", - "faver", - "faves", - "favus", - "fawns", - "fawny", - "faxed", - "faxes", - "fayed", - "fayer", - "fayne", - "fayre", - "fazed", - "fazes", - "feals", - "feare", - "fears", - "feart", - "fease", - "feats", - "feaze", - "feces", - "fecht", - "fecit", - "fecks", - "fedex", - "feebs", - "feeds", - "feels", - "feens", - "feers", - "feese", - "feeze", - "fehme", - "feint", - "feist", - "felch", - "felid", - "fells", - "felly", - "felts", - "felty", - "femal", - "femes", - "femmy", - "fends", - "fendy", - "fenis", - "fenks", - "fenny", - "fents", - "feods", - "feoff", - "ferer", - "feres", - "feria", - "ferly", - "fermi", - "ferms", - "ferns", - "ferny", - "fesse", - "festa", - "fests", - "festy", - "fetas", - "feted", - "fetes", - "fetor", - "fetta", - "fetts", - "fetwa", - "feuar", - "feuds", - "feued", - "feyed", - "feyer", - "feyly", - "fezes", - "fezzy", - "fiars", - "fiats", - "fibro", - "fices", - "fiche", - "fichu", - "ficin", - "ficos", - "fides", - "fidge", - "fidos", - "fiefs", - "fient", - "fiere", - "fiers", - "fiest", - "fifed", - "fifer", - "fifes", - "fifis", - "figgy", - "figos", - "fiked", - "fikes", - "filar", - "filch", - "filed", - "files", - "filii", - "filks", - "fille", - "fillo", - "fills", - "filmi", - "films", - "filos", - "filum", - "finca", - "finds", - "fined", - "fines", - "finis", - "finks", - "finny", - "finos", - "fiord", - "fiqhs", - "fique", - "fired", - "firer", - "fires", - "firie", - "firks", - "firms", - "firns", - "firry", - "firth", - "fiscs", - "fisks", - "fists", - "fisty", - "fitch", - "fitly", - "fitna", - "fitte", - "fitts", - "fiver", - "fives", - "fixed", - "fixes", - "fixit", - "fjeld", - "flabs", - "flaff", - "flags", - "flaks", - "flamm", - "flams", - "flamy", - "flane", - "flans", - "flaps", - "flary", - "flats", - "flava", - "flawn", - "flaws", - "flawy", - "flaxy", - "flays", - "fleam", - "fleas", - "fleek", - "fleer", - "flees", - "flegs", - "fleme", - "fleur", - "flews", - "flexi", - "flexo", - "fleys", - "flics", - "flied", - "flies", - "flimp", - "flims", - "flips", - "flirs", - "flisk", - "flite", - "flits", - "flitt", - "flobs", - "flocs", - "floes", - "flogs", - "flong", - "flops", - "flors", - "flory", - "flosh", - "flota", - "flote", - "flows", - "flubs", - "flued", - "flues", - "fluey", - "fluky", - "flump", - "fluor", - "flurr", - "fluty", - "fluyt", - "flyby", - "flype", - "flyte", - "foals", - "foams", - "foehn", - "fogey", - "fogie", - "fogle", - "fogou", - "fohns", - "foids", - "foils", - "foins", - "folds", - "foley", - "folia", - "folic", - "folie", - "folks", - "folky", - "fomes", - "fonda", - "fonds", - "fondu", - "fones", - "fonly", - "fonts", - "foods", - "foody", - "fools", - "foots", - "footy", - "foram", - "forbs", - "forby", - "fordo", - "fords", - "forel", - "fores", - "forex", - "forks", - "forky", - "forme", - "forms", - "forts", - "forza", - "forze", - "fossa", - "fosse", - "fouat", - "fouds", - "fouer", - "fouet", - "foule", - "fouls", - "fount", - "fours", - "fouth", - "fovea", - "fowls", - "fowth", - "foxed", - "foxes", - "foxie", - "foyle", - "foyne", - "frabs", - "frack", - "fract", - "frags", - "fraim", - "franc", - "frape", - "fraps", - "frass", - "frate", - "frati", - "frats", - "fraus", - "frays", - "frees", - "freet", - "freit", - "fremd", - "frena", - "freon", - "frere", - "frets", - "fribs", - "frier", - "fries", - "frigs", - "frise", - "frist", - "frith", - "frits", - "fritt", - "frize", - "frizz", - "froes", - "frogs", - "frons", - "frore", - "frorn", - "frory", - "frosh", - "frows", - "frowy", - "frugs", - "frump", - "frush", - "frust", - "fryer", - "fubar", - "fubby", - "fubsy", - "fucks", - "fucus", - "fuddy", - "fudgy", - "fuels", - "fuero", - "fuffs", - "fuffy", - "fugal", - "fuggy", - "fugie", - "fugio", - "fugle", - "fugly", - "fugus", - "fujis", - "fulls", - "fumed", - "fumer", - "fumes", - "fumet", - "fundi", - "funds", - "fundy", - "fungo", - "fungs", - "funks", - "fural", - "furan", - "furca", - "furls", - "furol", - "furrs", - "furth", - "furze", - "furzy", - "fused", - "fusee", - "fusel", - "fuses", - "fusil", - "fusks", - "fusts", - "fusty", - "futon", - "fuzed", - "fuzee", - "fuzes", - "fuzil", - "fyces", - "fyked", - "fykes", - "fyles", - "fyrds", - "fytte", - "gabba", - "gabby", - "gable", - "gaddi", - "gades", - "gadge", - "gadid", - "gadis", - "gadje", - "gadjo", - "gadso", - "gaffs", - "gaged", - "gager", - "gages", - "gaids", - "gains", - "gairs", - "gaita", - "gaits", - "gaitt", - "gajos", - "galah", - "galas", - "galax", - "galea", - "galed", - "gales", - "galls", - "gally", - "galop", - "galut", - "galvo", - "gamas", - "gamay", - "gamba", - "gambe", - "gambo", - "gambs", - "gamed", - "games", - "gamey", - "gamic", - "gamin", - "gamme", - "gammy", - "gamps", - "ganch", - "gandy", - "ganef", - "ganev", - "gangs", - "ganja", - "ganof", - "gants", - "gaols", - "gaped", - "gaper", - "gapes", - "gapos", - "gappy", - "garbe", - "garbo", - "garbs", - "garda", - "gares", - "garis", - "garms", - "garni", - "garre", - "garth", - "garum", - "gases", - "gasps", - "gaspy", - "gasts", - "gatch", - "gated", - "gater", - "gates", - "gaths", - "gator", - "gauch", - "gaucy", - "gauds", - "gauje", - "gault", - "gaums", - "gaumy", - "gaups", - "gaurs", - "gauss", - "gauzy", - "gavot", - "gawcy", - "gawds", - "gawks", - "gawps", - "gawsy", - "gayal", - "gazal", - "gazar", - "gazed", - "gazes", - "gazon", - "gazoo", - "geals", - "geans", - "geare", - "gears", - "geats", - "gebur", - "gecks", - "geeks", - "geeps", - "geest", - "geist", - "geits", - "gelds", - "gelee", - "gelid", - "gelly", - "gelts", - "gemel", - "gemma", - "gemmy", - "gemot", - "genal", - "genas", - "genes", - "genet", - "genic", - "genii", - "genip", - "genny", - "genoa", - "genom", - "genro", - "gents", - "genty", - "genua", - "genus", - "geode", - "geoid", - "gerah", - "gerbe", - "geres", - "gerle", - "germs", - "germy", - "gerne", - "gesse", - "gesso", - "geste", - "gests", - "getas", - "getup", - "geums", - "geyan", - "geyer", - "ghast", - "ghats", - "ghaut", - "ghazi", - "ghees", - "ghest", - "ghyll", - "gibed", - "gibel", - "giber", - "gibes", - "gibli", - "gibus", - "gifts", - "gigas", - "gighe", - "gigot", - "gigue", - "gilas", - "gilds", - "gilet", - "gills", - "gilly", - "gilpy", - "gilts", - "gimel", - "gimme", - "gimps", - "gimpy", - "ginch", - "ginge", - "gings", - "ginks", - "ginny", - "ginzo", - "gipon", - "gippo", - "gippy", - "girds", - "girls", - "girns", - "giron", - "giros", - "girrs", - "girsh", - "girts", - "gismo", - "gisms", - "gists", - "gitch", - "gites", - "giust", - "gived", - "gives", - "gizmo", - "glace", - "glads", - "glady", - "glaik", - "glair", - "glams", - "glans", - "glary", - "glaum", - "glaur", - "glazy", - "gleba", - "glebe", - "gleby", - "glede", - "gleds", - "gleed", - "gleek", - "glees", - "gleet", - "gleis", - "glens", - "glent", - "gleys", - "glial", - "glias", - "glibs", - "gliff", - "glift", - "glike", - "glime", - "glims", - "glisk", - "glits", - "glitz", - "gloam", - "globi", - "globs", - "globy", - "glode", - "glogg", - "gloms", - "gloop", - "glops", - "glost", - "glout", - "glows", - "gloze", - "glued", - "gluer", - "glues", - "gluey", - "glugs", - "glume", - "glums", - "gluon", - "glute", - "gluts", - "gnarl", - "gnarr", - "gnars", - "gnats", - "gnawn", - "gnaws", - "gnows", - "goads", - "goafs", - "goals", - "goary", - "goats", - "goaty", - "goban", - "gobar", - "gobbi", - "gobbo", - "gobby", - "gobis", - "gobos", - "godet", - "godso", - "goels", - "goers", - "goest", - "goeth", - "goety", - "gofer", - "goffs", - "gogga", - "gogos", - "goier", - "gojis", - "golds", - "goldy", - "goles", - "golfs", - "golpe", - "golps", - "gombo", - "gomer", - "gompa", - "gonch", - "gonef", - "gongs", - "gonia", - "gonif", - "gonks", - "gonna", - "gonof", - "gonys", - "gonzo", - "gooby", - "goods", - "goofs", - "googs", - "gooks", - "gooky", - "goold", - "gools", - "gooly", - "goons", - "goony", - "goops", - "goopy", - "goors", - "goory", - "goosy", - "gopak", - "gopik", - "goral", - "goras", - "gored", - "gores", - "goris", - "gorms", - "gormy", - "gorps", - "gorse", - "gorsy", - "gosht", - "gosse", - "gotch", - "goths", - "gothy", - "gotta", - "gouch", - "gouks", - "goura", - "gouts", - "gouty", - "gowan", - "gowds", - "gowfs", - "gowks", - "gowls", - "gowns", - "goxes", - "goyim", - "goyle", - "graal", - "grabs", - "grads", - "graff", - "graip", - "grama", - "grame", - "gramp", - "grams", - "grana", - "grans", - "grapy", - "gravs", - "grays", - "grebe", - "grebo", - "grece", - "greek", - "grees", - "grege", - "grego", - "grein", - "grens", - "grese", - "greve", - "grews", - "greys", - "grice", - "gride", - "grids", - "griff", - "grift", - "grigs", - "grike", - "grins", - "griot", - "grips", - "gript", - "gripy", - "grise", - "grist", - "grisy", - "grith", - "grits", - "grize", - "groat", - "grody", - "grogs", - "groks", - "groma", - "grone", - "groof", - "grosz", - "grots", - "grouf", - "grovy", - "grows", - "grrls", - "grrrl", - "grubs", - "grued", - "grues", - "grufe", - "grume", - "grump", - "grund", - "gryce", - "gryde", - "gryke", - "grype", - "grypt", - "guaco", - "guana", - "guano", - "guans", - "guars", - "gucks", - "gucky", - "gudes", - "guffs", - "gugas", - "guids", - "guimp", - "guiro", - "gulag", - "gular", - "gulas", - "gules", - "gulet", - "gulfs", - "gulfy", - "gulls", - "gulph", - "gulps", - "gulpy", - "gumma", - "gummi", - "gumps", - "gundy", - "gunge", - "gungy", - "gunks", - "gunky", - "gunny", - "guqin", - "gurdy", - "gurge", - "gurls", - "gurly", - "gurns", - "gurry", - "gursh", - "gurus", - "gushy", - "gusla", - "gusle", - "gusli", - "gussy", - "gusts", - "gutsy", - "gutta", - "gutty", - "guyed", - "guyle", - "guyot", - "guyse", - "gwine", - "gyals", - "gyans", - "gybed", - "gybes", - "gyeld", - "gymps", - "gynae", - "gynie", - "gynny", - "gynos", - "gyoza", - "gypos", - "gyppo", - "gyppy", - "gyral", - "gyred", - "gyres", - "gyron", - "gyros", - "gyrus", - "gytes", - "gyved", - "gyves", - "haafs", - "haars", - "hable", - "habus", - "hacek", - "hacks", - "hadal", - "haded", - "hades", - "hadji", - "hadst", - "haems", - "haets", - "haffs", - "hafiz", - "hafts", - "haggs", - "hahas", - "haick", - "haika", - "haiks", - "haiku", - "hails", - "haily", - "hains", - "haint", - "hairs", - "haith", - "hajes", - "hajis", - "hajji", - "hakam", - "hakas", - "hakea", - "hakes", - "hakim", - "hakus", - "halal", - "haled", - "haler", - "hales", - "halfa", - "halfs", - "halid", - "hallo", - "halls", - "halma", - "halms", - "halon", - "halos", - "halse", - "halts", - "halva", - "halwa", - "hamal", - "hamba", - "hamed", - "hames", - "hammy", - "hamza", - "hanap", - "hance", - "hanch", - "hands", - "hangi", - "hangs", - "hanks", - "hanky", - "hansa", - "hanse", - "hants", - "haole", - "haoma", - "hapax", - "haply", - "happi", - "hapus", - "haram", - "hards", - "hared", - "hares", - "harim", - "harks", - "harls", - "harms", - "harns", - "haros", - "harps", - "harts", - "hashy", - "hasks", - "hasps", - "hasta", - "hated", - "hates", - "hatha", - "hauds", - "haufs", - "haugh", - "hauld", - "haulm", - "hauls", - "hault", - "hauns", - "hause", - "haver", - "haves", - "hawed", - "hawks", - "hawms", - "hawse", - "hayed", - "hayer", - "hayey", - "hayle", - "hazan", - "hazed", - "hazer", - "hazes", - "heads", - "heald", - "heals", - "heame", - "heaps", - "heapy", - "heare", - "hears", - "heast", - "heats", - "heben", - "hebes", - "hecht", - "hecks", - "heder", - "hedgy", - "heeds", - "heedy", - "heels", - "heeze", - "hefte", - "hefts", - "heids", - "heigh", - "heils", - "heirs", - "hejab", - "hejra", - "heled", - "heles", - "helio", - "hells", - "helms", - "helos", - "helot", - "helps", - "helve", - "hemal", - "hemes", - "hemic", - "hemin", - "hemps", - "hempy", - "hench", - "hends", - "henge", - "henna", - "henny", - "henry", - "hents", - "hepar", - "herbs", - "herby", - "herds", - "heres", - "herls", - "herma", - "herms", - "herns", - "heros", - "herry", - "herse", - "hertz", - "herye", - "hesps", - "hests", - "hetes", - "heths", - "heuch", - "heugh", - "hevea", - "hewed", - "hewer", - "hewgh", - "hexad", - "hexed", - "hexer", - "hexes", - "hexyl", - "heyed", - "hiant", - "hicks", - "hided", - "hider", - "hides", - "hiems", - "highs", - "hight", - "hijab", - "hijra", - "hiked", - "hiker", - "hikes", - "hikoi", - "hilar", - "hilch", - "hillo", - "hills", - "hilts", - "hilum", - "hilus", - "himbo", - "hinau", - "hinds", - "hings", - "hinky", - "hinny", - "hints", - "hiois", - "hiply", - "hired", - "hiree", - "hirer", - "hires", - "hissy", - "hists", - "hithe", - "hived", - "hiver", - "hives", - "hizen", - "hoaed", - "hoagy", - "hoars", - "hoary", - "hoast", - "hobos", - "hocks", - "hocus", - "hodad", - "hodja", - "hoers", - "hogan", - "hogen", - "hoggs", - "hoghs", - "hohed", - "hoick", - "hoied", - "hoiks", - "hoing", - "hoise", - "hokas", - "hoked", - "hokes", - "hokey", - "hokis", - "hokku", - "hokum", - "holds", - "holed", - "holes", - "holey", - "holks", - "holla", - "hollo", - "holme", - "holms", - "holon", - "holos", - "holts", - "homas", - "homed", - "homes", - "homey", - "homie", - "homme", - "homos", - "honan", - "honda", - "honds", - "honed", - "honer", - "hones", - "hongi", - "hongs", - "honks", - "honky", - "hooch", - "hoods", - "hoody", - "hooey", - "hoofs", - "hooka", - "hooks", - "hooky", - "hooly", - "hoons", - "hoops", - "hoord", - "hoors", - "hoosh", - "hoots", - "hooty", - "hoove", - "hopak", - "hoped", - "hoper", - "hopes", - "hoppy", - "horah", - "horal", - "horas", - "horis", - "horks", - "horme", - "horns", - "horst", - "horsy", - "hosed", - "hosel", - "hosen", - "hoser", - "hoses", - "hosey", - "hosta", - "hosts", - "hotch", - "hoten", - "hotty", - "houff", - "houfs", - "hough", - "houri", - "hours", - "houts", - "hovea", - "hoved", - "hoven", - "hoves", - "howbe", - "howes", - "howff", - "howfs", - "howks", - "howls", - "howre", - "howso", - "hoxed", - "hoxes", - "hoyas", - "hoyed", - "hoyle", - "hubby", - "hucks", - "hudna", - "hudud", - "huers", - "huffs", - "huffy", - "huger", - "huggy", - "huhus", - "huias", - "hulas", - "hules", - "hulks", - "hulky", - "hullo", - "hulls", - "hully", - "humas", - "humfs", - "humic", - "humps", - "humpy", - "hunks", - "hunts", - "hurds", - "hurls", - "hurly", - "hurra", - "hurst", - "hurts", - "hushy", - "husks", - "husos", - "hutia", - "huzza", - "huzzy", - "hwyls", - "hydra", - "hyens", - "hygge", - "hying", - "hykes", - "hylas", - "hyleg", - "hyles", - "hylic", - "hymns", - "hynde", - "hyoid", - "hyped", - "hypes", - "hypha", - "hyphy", - "hypos", - "hyrax", - "hyson", - "hythe", - "iambi", - "iambs", - "ibrik", - "icers", - "iched", - "iches", - "ichor", - "icier", - "icker", - "ickle", - "icons", - "ictal", - "ictic", - "ictus", - "idant", - "ideas", - "idees", - "ident", - "idled", - "idles", - "idola", - "idols", - "idyls", - "iftar", - "igapo", - "igged", - "iglus", - "ihram", - "ikans", - "ikats", - "ikons", - "ileac", - "ileal", - "ileum", - "ileus", - "iliad", - "ilial", - "ilium", - "iller", - "illth", - "imago", - "imams", - "imari", - "imaum", - "imbar", - "imbed", - "imide", - "imido", - "imids", - "imine", - "imino", - "immew", - "immit", - "immix", - "imped", - "impis", - "impot", - "impro", - "imshi", - "imshy", - "inapt", - "inarm", - "inbye", - "incel", - "incle", - "incog", - "incus", - "incut", - "indew", - "india", - "indie", - "indol", - "indow", - "indri", - "indue", - "inerm", - "infix", - "infos", - "infra", - "ingan", - "ingle", - "inion", - "inked", - "inker", - "inkle", - "inned", - "innit", - "inorb", - "inrun", - "inset", - "inspo", - "intel", - "intil", - "intis", - "intra", - "inula", - "inure", - "inurn", - "inust", - "invar", - "inwit", - "iodic", - "iodid", - "iodin", - "iotas", - "ippon", - "irade", - "irids", - "iring", - "irked", - "iroko", - "irone", - "irons", - "isbas", - "ishes", - "isled", - "isles", - "isnae", - "issei", - "istle", - "items", - "ither", - "ivied", - "ivies", - "ixias", - "ixnay", - "ixora", - "ixtle", - "izard", - "izars", - "izzat", - "jaaps", - "jabot", - "jacal", - "jacks", - "jacky", - "jaded", - "jades", - "jafas", - "jaffa", - "jagas", - "jager", - "jaggs", - "jaggy", - "jagir", - "jagra", - "jails", - "jaker", - "jakes", - "jakey", - "jalap", - "jalop", - "jambe", - "jambo", - "jambs", - "jambu", - "james", - "jammy", - "jamon", - "janes", - "janns", - "janny", - "janty", - "japan", - "japed", - "japer", - "japes", - "jarks", - "jarls", - "jarps", - "jarta", - "jarul", - "jasey", - "jaspe", - "jasps", - "jatos", - "jauks", - "jaups", - "javas", - "javel", - "jawan", - "jawed", - "jaxie", - "jeans", - "jeats", - "jebel", - "jedis", - "jeels", - "jeely", - "jeeps", - "jeers", - "jeeze", - "jefes", - "jeffs", - "jehad", - "jehus", - "jelab", - "jello", - "jells", - "jembe", - "jemmy", - "jenny", - "jeons", - "jerid", - "jerks", - "jerry", - "jesse", - "jests", - "jesus", - "jetes", - "jeton", - "jeune", - "jewed", - "jewie", - "jhala", - "jiaos", - "jibba", - "jibbs", - "jibed", - "jiber", - "jibes", - "jiffs", - "jiggy", - "jigot", - "jihad", - "jills", - "jilts", - "jimmy", - "jimpy", - "jingo", - "jinks", - "jinne", - "jinni", - "jinns", - "jirds", - "jirga", - "jirre", - "jisms", - "jived", - "jiver", - "jives", - "jivey", - "jnana", - "jobed", - "jobes", - "jocko", - "jocks", - "jocky", - "jocos", - "jodel", - "joeys", - "johns", - "joins", - "joked", - "jokes", - "jokey", - "jokol", - "joled", - "joles", - "jolls", - "jolts", - "jolty", - "jomon", - "jomos", - "jones", - "jongs", - "jonty", - "jooks", - "joram", - "jorum", - "jotas", - "jotty", - "jotun", - "joual", - "jougs", - "jouks", - "joule", - "jours", - "jowar", - "jowed", - "jowls", - "jowly", - "joyed", - "jubas", - "jubes", - "jucos", - "judas", - "judgy", - "judos", - "jugal", - "jugum", - "jujus", - "juked", - "jukes", - "jukus", - "julep", - "jumar", - "jumby", - "jumps", - "junco", - "junks", - "junky", - "jupes", - "jupon", - "jural", - "jurat", - "jurel", - "jures", - "justs", - "jutes", - "jutty", - "juves", - "juvie", - "kaama", - "kabab", - "kabar", - "kabob", - "kacha", - "kacks", - "kadai", - "kades", - "kadis", - "kafir", - "kagos", - "kagus", - "kahal", - "kaiak", - "kaids", - "kaies", - "kaifs", - "kaika", - "kaiks", - "kails", - "kaims", - "kaing", - "kains", - "kakas", - "kakis", - "kalam", - "kales", - "kalif", - "kalis", - "kalpa", - "kamas", - "kames", - "kamik", - "kamis", - "kamme", - "kanae", - "kanas", - "kandy", - "kaneh", - "kanes", - "kanga", - "kangs", - "kanji", - "kants", - "kanzu", - "kaons", - "kapas", - "kaphs", - "kapok", - "kapow", - "kapus", - "kaput", - "karas", - "karat", - "karks", - "karns", - "karoo", - "karos", - "karri", - "karst", - "karsy", - "karts", - "karzy", - "kasha", - "kasme", - "katal", - "katas", - "katis", - "katti", - "kaugh", - "kauri", - "kauru", - "kaury", - "kaval", - "kavas", - "kawas", - "kawau", - "kawed", - "kayle", - "kayos", - "kazis", - "kazoo", - "kbars", - "kebar", - "kebob", - "kecks", - "kedge", - "kedgy", - "keech", - "keefs", - "keeks", - "keels", - "keema", - "keeno", - "keens", - "keeps", - "keets", - "keeve", - "kefir", - "kehua", - "keirs", - "kelep", - "kelim", - "kells", - "kelly", - "kelps", - "kelpy", - "kelts", - "kelty", - "kembo", - "kembs", - "kemps", - "kempt", - "kempy", - "kenaf", - "kench", - "kendo", - "kenos", - "kente", - "kents", - "kepis", - "kerbs", - "kerel", - "kerfs", - "kerky", - "kerma", - "kerne", - "kerns", - "keros", - "kerry", - "kerve", - "kesar", - "kests", - "ketas", - "ketch", - "ketes", - "ketol", - "kevel", - "kevil", - "kexes", - "keyed", - "keyer", - "khadi", - "khafs", - "khans", - "khaph", - "khats", - "khaya", - "khazi", - "kheda", - "kheth", - "khets", - "khoja", - "khors", - "khoum", - "khuds", - "kiaat", - "kiack", - "kiang", - "kibbe", - "kibbi", - "kibei", - "kibes", - "kibla", - "kicks", - "kicky", - "kiddo", - "kiddy", - "kidel", - "kidge", - "kiefs", - "kiers", - "kieve", - "kievs", - "kight", - "kikes", - "kikoi", - "kiley", - "kilim", - "kills", - "kilns", - "kilos", - "kilps", - "kilts", - "kilty", - "kimbo", - "kinas", - "kinda", - "kinds", - "kindy", - "kines", - "kings", - "kinin", - "kinks", - "kinos", - "kiore", - "kipes", - "kippa", - "kipps", - "kirby", - "kirks", - "kirns", - "kirri", - "kisan", - "kissy", - "kists", - "kited", - "kiter", - "kites", - "kithe", - "kiths", - "kitul", - "kivas", - "kiwis", - "klang", - "klaps", - "klett", - "klick", - "klieg", - "kliks", - "klong", - "kloof", - "kluge", - "klutz", - "knags", - "knaps", - "knarl", - "knars", - "knaur", - "knawe", - "knees", - "knell", - "knish", - "knits", - "knive", - "knobs", - "knops", - "knosp", - "knots", - "knout", - "knowe", - "knows", - "knubs", - "knurl", - "knurr", - "knurs", - "knuts", - "koans", - "koaps", - "koban", - "kobos", - "koels", - "koffs", - "kofta", - "kogal", - "kohas", - "kohen", - "kohls", - "koine", - "kojis", - "kokam", - "kokas", - "koker", - "kokra", - "kokum", - "kolas", - "kolos", - "kombu", - "konbu", - "kondo", - "konks", - "kooks", - "kooky", - "koori", - "kopek", - "kophs", - "kopje", - "koppa", - "korai", - "koras", - "korat", - "kores", - "korma", - "koros", - "korun", - "korus", - "koses", - "kotch", - "kotos", - "kotow", - "koura", - "kraal", - "krabs", - "kraft", - "krais", - "krait", - "krang", - "krans", - "kranz", - "kraut", - "krays", - "kreep", - "kreng", - "krewe", - "krona", - "krone", - "kroon", - "krubi", - "krunk", - "ksars", - "kubie", - "kudos", - "kudus", - "kudzu", - "kufis", - "kugel", - "kuias", - "kukri", - "kukus", - "kulak", - "kulan", - "kulas", - "kulfi", - "kumis", - "kumys", - "kuris", - "kurre", - "kurta", - "kurus", - "kusso", - "kutas", - "kutch", - "kutis", - "kutus", - "kuzus", - "kvass", - "kvell", - "kwela", - "kyack", - "kyaks", - "kyang", - "kyars", - "kyats", - "kybos", - "kydst", - "kyles", - "kylie", - "kylin", - "kylix", - "kyloe", - "kynde", - "kynds", - "kypes", - "kyrie", - "kytes", - "kythe", - "laari", - "labda", - "labia", - "labis", - "labra", - "laced", - "lacer", - "laces", - "lacet", - "lacey", - "lacks", - "laddy", - "laded", - "lader", - "lades", - "laers", - "laevo", - "lagan", - "lahal", - "lahar", - "laich", - "laics", - "laids", - "laigh", - "laika", - "laiks", - "laird", - "lairs", - "lairy", - "laith", - "laity", - "laked", - "laker", - "lakes", - "lakhs", - "lakin", - "laksa", - "laldy", - "lalls", - "lamas", - "lambs", - "lamby", - "lamed", - "lamer", - "lames", - "lamia", - "lammy", - "lamps", - "lanai", - "lanas", - "lanch", - "lande", - "lands", - "lanes", - "lanks", - "lants", - "lapin", - "lapis", - "lapje", - "larch", - "lards", - "lardy", - "laree", - "lares", - "largo", - "laris", - "larks", - "larky", - "larns", - "larnt", - "larum", - "lased", - "laser", - "lases", - "lassi", - "lassu", - "lassy", - "lasts", - "latah", - "lated", - "laten", - "latex", - "lathi", - "laths", - "lathy", - "latke", - "latus", - "lauan", - "lauch", - "lauds", - "laufs", - "laund", - "laura", - "laval", - "lavas", - "laved", - "laver", - "laves", - "lavra", - "lavvy", - "lawed", - "lawer", - "lawin", - "lawks", - "lawns", - "lawny", - "laxed", - "laxer", - "laxes", - "laxly", - "layed", - "layin", - "layup", - "lazar", - "lazed", - "lazes", - "lazos", - "lazzi", - "lazzo", - "leads", - "leady", - "leafs", - "leaks", - "leams", - "leans", - "leany", - "leaps", - "leare", - "lears", - "leary", - "leats", - "leavy", - "leaze", - "leben", - "leccy", - "ledes", - "ledgy", - "ledum", - "leear", - "leeks", - "leeps", - "leers", - "leese", - "leets", - "leeze", - "lefte", - "lefts", - "leger", - "leges", - "legge", - "leggo", - "legit", - "lehrs", - "lehua", - "leirs", - "leish", - "leman", - "lemed", - "lemel", - "lemes", - "lemma", - "lemme", - "lends", - "lenes", - "lengs", - "lenis", - "lenos", - "lense", - "lenti", - "lento", - "leone", - "lepid", - "lepra", - "lepta", - "lered", - "leres", - "lerps", - "lesbo", - "leses", - "lests", - "letch", - "lethe", - "letup", - "leuch", - "leuco", - "leuds", - "leugh", - "levas", - "levee", - "leves", - "levin", - "levis", - "lewis", - "lexes", - "lexis", - "lezes", - "lezza", - "lezzy", - "liana", - "liane", - "liang", - "liard", - "liars", - "liart", - "liber", - "libra", - "libri", - "lichi", - "licht", - "licit", - "licks", - "lidar", - "lidos", - "liefs", - "liens", - "liers", - "lieus", - "lieve", - "lifer", - "lifes", - "lifts", - "ligan", - "liger", - "ligge", - "ligne", - "liked", - "liker", - "likes", - "likin", - "lills", - "lilos", - "lilts", - "liman", - "limas", - "limax", - "limba", - "limbi", - "limbs", - "limby", - "limed", - "limen", - "limes", - "limey", - "limma", - "limns", - "limos", - "limpa", - "limps", - "linac", - "linch", - "linds", - "lindy", - "lined", - "lines", - "liney", - "linga", - "lings", - "lingy", - "linin", - "links", - "linky", - "linns", - "linny", - "linos", - "lints", - "linty", - "linum", - "linux", - "lions", - "lipas", - "lipes", - "lipin", - "lipos", - "lippy", - "liras", - "lirks", - "lirot", - "lisks", - "lisle", - "lisps", - "lists", - "litai", - "litas", - "lited", - "liter", - "lites", - "litho", - "liths", - "litre", - "lived", - "liven", - "lives", - "livor", - "livre", - "llano", - "loach", - "loads", - "loafs", - "loams", - "loans", - "loast", - "loave", - "lobar", - "lobed", - "lobes", - "lobos", - "lobus", - "loche", - "lochs", - "locie", - "locis", - "locks", - "locos", - "locum", - "loden", - "lodes", - "loess", - "lofts", - "logan", - "loges", - "loggy", - "logia", - "logie", - "logoi", - "logon", - "logos", - "lohan", - "loids", - "loins", - "loipe", - "loirs", - "lokes", - "lolls", - "lolly", - "lolog", - "lomas", - "lomed", - "lomes", - "loner", - "longa", - "longe", - "longs", - "looby", - "looed", - "looey", - "loofa", - "loofs", - "looie", - "looks", - "looky", - "looms", - "loons", - "loony", - "loops", - "loord", - "loots", - "loped", - "loper", - "lopes", - "loppy", - "loral", - "loran", - "lords", - "lordy", - "lorel", - "lores", - "loric", - "loris", - "losed", - "losel", - "losen", - "loses", - "lossy", - "lotah", - "lotas", - "lotes", - "lotic", - "lotos", - "lotsa", - "lotta", - "lotte", - "lotto", - "lotus", - "loued", - "lough", - "louie", - "louis", - "louma", - "lound", - "louns", - "loupe", - "loups", - "loure", - "lours", - "loury", - "louts", - "lovat", - "loved", - "loves", - "lovey", - "lovie", - "lowan", - "lowed", - "lowes", - "lownd", - "lowne", - "lowns", - "lowps", - "lowry", - "lowse", - "lowts", - "loxed", - "loxes", - "lozen", - "luach", - "luaus", - "lubed", - "lubes", - "lubra", - "luces", - "lucks", - "lucre", - "ludes", - "ludic", - "ludos", - "luffa", - "luffs", - "luged", - "luger", - "luges", - "lulls", - "lulus", - "lumas", - "lumbi", - "lumme", - "lummy", - "lumps", - "lunas", - "lunes", - "lunet", - "lungi", - "lungs", - "lunks", - "lunts", - "lupin", - "lured", - "lurer", - "lures", - "lurex", - "lurgi", - "lurgy", - "lurks", - "lurry", - "lurve", - "luser", - "lushy", - "lusks", - "lusts", - "lusus", - "lutea", - "luted", - "luter", - "lutes", - "luvvy", - "luxed", - "luxer", - "luxes", - "lweis", - "lyams", - "lyard", - "lyart", - "lyase", - "lycea", - "lycee", - "lycra", - "lymes", - "lynes", - "lyres", - "lysed", - "lyses", - "lysin", - "lysis", - "lysol", - "lyssa", - "lyted", - "lytes", - "lythe", - "lytic", - "lytta", - "maaed", - "maare", - "maars", - "mabes", - "macas", - "maced", - "macer", - "maces", - "mache", - "machi", - "machs", - "macks", - "macle", - "macon", - "madge", - "madid", - "madre", - "maerl", - "mafic", - "mages", - "maggs", - "magot", - "magus", - "mahoe", - "mahua", - "mahwa", - "maids", - "maiko", - "maiks", - "maile", - "maill", - "mails", - "maims", - "mains", - "maire", - "mairs", - "maise", - "maist", - "makar", - "makes", - "makis", - "makos", - "malam", - "malar", - "malas", - "malax", - "males", - "malic", - "malik", - "malis", - "malls", - "malms", - "malmy", - "malts", - "malty", - "malus", - "malva", - "malwa", - "mamas", - "mamba", - "mamee", - "mamey", - "mamie", - "manas", - "manat", - "mandi", - "maneb", - "maned", - "maneh", - "manes", - "manet", - "mangs", - "manis", - "manky", - "manna", - "manos", - "manse", - "manta", - "manto", - "manty", - "manul", - "manus", - "mapau", - "maqui", - "marae", - "marah", - "maras", - "marcs", - "mardy", - "mares", - "marge", - "margs", - "maria", - "marid", - "marka", - "marks", - "marle", - "marls", - "marly", - "marms", - "maron", - "maror", - "marra", - "marri", - "marse", - "marts", - "marvy", - "masas", - "mased", - "maser", - "mases", - "mashy", - "masks", - "massa", - "massy", - "masts", - "masty", - "masus", - "matai", - "mated", - "mater", - "mates", - "maths", - "matin", - "matlo", - "matte", - "matts", - "matza", - "matzo", - "mauby", - "mauds", - "mauls", - "maund", - "mauri", - "mausy", - "mauts", - "mauzy", - "maven", - "mavie", - "mavin", - "mavis", - "mawed", - "mawks", - "mawky", - "mawns", - "mawrs", - "maxed", - "maxes", - "maxis", - "mayan", - "mayas", - "mayed", - "mayos", - "mayst", - "mazed", - "mazer", - "mazes", - "mazey", - "mazut", - "mbira", - "meads", - "meals", - "meane", - "means", - "meany", - "meare", - "mease", - "meath", - "meats", - "mebos", - "mechs", - "mecks", - "medii", - "medle", - "meeds", - "meers", - "meets", - "meffs", - "meins", - "meint", - "meiny", - "meith", - "mekka", - "melas", - "melba", - "melds", - "melic", - "melik", - "mells", - "melts", - "melty", - "memes", - "memos", - "menad", - "mends", - "mened", - "menes", - "menge", - "mengs", - "mensa", - "mense", - "mensh", - "menta", - "mento", - "menus", - "meous", - "meows", - "merch", - "mercs", - "merde", - "mered", - "merel", - "merer", - "meres", - "meril", - "meris", - "merks", - "merle", - "merls", - "merse", - "mesal", - "mesas", - "mesel", - "meses", - "meshy", - "mesic", - "mesne", - "meson", - "messy", - "mesto", - "meted", - "metes", - "metho", - "meths", - "metic", - "metif", - "metis", - "metol", - "metre", - "meuse", - "meved", - "meves", - "mewed", - "mewls", - "meynt", - "mezes", - "mezze", - "mezzo", - "mhorr", - "miaou", - "miaow", - "miasm", - "miaul", - "micas", - "miche", - "micht", - "micks", - "micky", - "micos", - "micra", - "middy", - "midgy", - "midis", - "miens", - "mieve", - "miffs", - "miffy", - "mifty", - "miggs", - "mihas", - "mihis", - "miked", - "mikes", - "mikra", - "mikva", - "milch", - "milds", - "miler", - "miles", - "milfs", - "milia", - "milko", - "milks", - "mille", - "mills", - "milor", - "milos", - "milpa", - "milts", - "milty", - "miltz", - "mimed", - "mimeo", - "mimer", - "mimes", - "mimsy", - "minae", - "minar", - "minas", - "mincy", - "minds", - "mined", - "mines", - "minge", - "mings", - "mingy", - "minis", - "minke", - "minks", - "minny", - "minos", - "mints", - "mired", - "mires", - "mirex", - "mirid", - "mirin", - "mirks", - "mirky", - "mirly", - "miros", - "mirvs", - "mirza", - "misch", - "misdo", - "mises", - "misgo", - "misos", - "missa", - "mists", - "misty", - "mitch", - "miter", - "mites", - "mitis", - "mitre", - "mitts", - "mixed", - "mixen", - "mixer", - "mixes", - "mixte", - "mixup", - "mizen", - "mizzy", - "mneme", - "moans", - "moats", - "mobby", - "mobes", - "mobey", - "mobie", - "moble", - "mochi", - "mochs", - "mochy", - "mocks", - "moder", - "modes", - "modge", - "modii", - "modus", - "moers", - "mofos", - "moggy", - "mohel", - "mohos", - "mohrs", - "mohua", - "mohur", - "moile", - "moils", - "moira", - "moire", - "moits", - "mojos", - "mokes", - "mokis", - "mokos", - "molal", - "molas", - "molds", - "moled", - "moles", - "molla", - "molls", - "molly", - "molto", - "molts", - "molys", - "momes", - "momma", - "mommy", - "momus", - "monad", - "monal", - "monas", - "monde", - "mondo", - "moner", - "mongo", - "mongs", - "monic", - "monie", - "monks", - "monos", - "monte", - "monty", - "moobs", - "mooch", - "moods", - "mooed", - "mooks", - "moola", - "mooli", - "mools", - "mooly", - "moong", - "moons", - "moony", - "moops", - "moors", - "moory", - "moots", - "moove", - "moped", - "moper", - "mopes", - "mopey", - "moppy", - "mopsy", - "mopus", - "morae", - "moras", - "morat", - "moray", - "morel", - "mores", - "moria", - "morne", - "morns", - "morra", - "morro", - "morse", - "morts", - "mosed", - "moses", - "mosey", - "mosks", - "mosso", - "moste", - "mosts", - "moted", - "moten", - "motes", - "motet", - "motey", - "moths", - "mothy", - "motis", - "motte", - "motts", - "motty", - "motus", - "motza", - "mouch", - "moues", - "mould", - "mouls", - "moups", - "moust", - "mousy", - "moved", - "moves", - "mowas", - "mowed", - "mowra", - "moxas", - "moxie", - "moyas", - "moyle", - "moyls", - "mozed", - "mozes", - "mozos", - "mpret", - "mucho", - "mucic", - "mucid", - "mucin", - "mucks", - "mucor", - "mucro", - "mudge", - "mudir", - "mudra", - "muffs", - "mufti", - "mugga", - "muggs", - "muggy", - "muhly", - "muids", - "muils", - "muirs", - "muist", - "mujik", - "mulct", - "muled", - "mules", - "muley", - "mulga", - "mulie", - "mulla", - "mulls", - "mulse", - "mulsh", - "mumms", - "mumps", - "mumsy", - "mumus", - "munga", - "munge", - "mungo", - "mungs", - "munis", - "munts", - "muntu", - "muons", - "muras", - "mured", - "mures", - "murex", - "murid", - "murks", - "murls", - "murly", - "murra", - "murre", - "murri", - "murrs", - "murry", - "murti", - "murva", - "musar", - "musca", - "mused", - "muser", - "muses", - "muset", - "musha", - "musit", - "musks", - "musos", - "musse", - "mussy", - "musth", - "musts", - "mutch", - "muted", - "muter", - "mutes", - "mutha", - "mutis", - "muton", - "mutts", - "muxed", - "muxes", - "muzak", - "muzzy", - "mvule", - "myall", - "mylar", - "mynah", - "mynas", - "myoid", - "myoma", - "myope", - "myops", - "myopy", - "mysid", - "mythi", - "myths", - "mythy", - "myxos", - "mzees", - "naams", - "naans", - "nabes", - "nabis", - "nabks", - "nabla", - "nabob", - "nache", - "nacho", - "nacre", - "nadas", - "naeve", - "naevi", - "naffs", - "nagas", - "naggy", - "nagor", - "nahal", - "naiad", - "naifs", - "naiks", - "nails", - "naira", - "nairu", - "naked", - "naker", - "nakfa", - "nalas", - "naled", - "nalla", - "named", - "namer", - "names", - "namma", - "namus", - "nanas", - "nance", - "nancy", - "nandu", - "nanna", - "nanos", - "nanua", - "napas", - "naped", - "napes", - "napoo", - "nappa", - "nappe", - "nappy", - "naras", - "narco", - "narcs", - "nards", - "nares", - "naric", - "naris", - "narks", - "narky", - "narre", - "nashi", - "natch", - "nates", - "natis", - "natty", - "nauch", - "naunt", - "navar", - "naves", - "navew", - "navvy", - "nawab", - "nazes", - "nazir", - "nazis", - "nduja", - "neafe", - "neals", - "neaps", - "nears", - "neath", - "neats", - "nebek", - "nebel", - "necks", - "neddy", - "needs", - "neeld", - "neele", - "neemb", - "neems", - "neeps", - "neese", - "neeze", - "negro", - "negus", - "neifs", - "neist", - "neive", - "nelis", - "nelly", - "nemas", - "nemns", - "nempt", - "nenes", - "neons", - "neper", - "nepit", - "neral", - "nerds", - "nerka", - "nerks", - "nerol", - "nerts", - "nertz", - "nervy", - "nests", - "netes", - "netop", - "netts", - "netty", - "neuks", - "neume", - "neums", - "nevel", - "neves", - "nevus", - "newbs", - "newed", - "newel", - "newie", - "newsy", - "newts", - "nexts", - "nexus", - "ngaio", - "ngana", - "ngati", - "ngoma", - "ngwee", - "nicad", - "nicht", - "nicks", - "nicol", - "nidal", - "nided", - "nides", - "nidor", - "nidus", - "niefs", - "nieve", - "nifes", - "niffs", - "niffy", - "nifty", - "niger", - "nighs", - "nihil", - "nikab", - "nikah", - "nikau", - "nills", - "nimbi", - "nimbs", - "nimps", - "niner", - "nines", - "ninon", - "nipas", - "nippy", - "niqab", - "nirls", - "nirly", - "nisei", - "nisse", - "nisus", - "niter", - "nites", - "nitid", - "niton", - "nitre", - "nitro", - "nitry", - "nitty", - "nival", - "nixed", - "nixer", - "nixes", - "nixie", - "nizam", - "nkosi", - "noahs", - "nobby", - "nocks", - "nodal", - "noddy", - "nodes", - "nodus", - "noels", - "noggs", - "nohow", - "noils", - "noily", - "noint", - "noirs", - "noles", - "nolls", - "nolos", - "nomas", - "nomen", - "nomes", - "nomic", - "nomoi", - "nomos", - "nonas", - "nonce", - "nones", - "nonet", - "nongs", - "nonis", - "nonny", - "nonyl", - "noobs", - "nooit", - "nooks", - "nooky", - "noons", - "noops", - "nopal", - "noria", - "noris", - "norks", - "norma", - "norms", - "nosed", - "noser", - "noses", - "notal", - "noted", - "noter", - "notes", - "notum", - "nould", - "noule", - "nouls", - "nouns", - "nouny", - "noups", - "novae", - "novas", - "novum", - "noway", - "nowed", - "nowls", - "nowts", - "nowty", - "noxal", - "noxes", - "noyau", - "noyed", - "noyes", - "nubby", - "nubia", - "nucha", - "nuddy", - "nuder", - "nudes", - "nudie", - "nudzh", - "nuffs", - "nugae", - "nuked", - "nukes", - "nulla", - "nulls", - "numbs", - "numen", - "nummy", - "nunny", - "nurds", - "nurdy", - "nurls", - "nurrs", - "nutso", - "nutsy", - "nyaff", - "nyala", - "nying", - "nyssa", - "oaked", - "oaker", - "oakum", - "oared", - "oases", - "oasis", - "oasts", - "oaten", - "oater", - "oaths", - "oaves", - "obang", - "obeah", - "obeli", - "obeys", - "obias", - "obied", - "obiit", - "obits", - "objet", - "oboes", - "obole", - "oboli", - "obols", - "occam", - "ocher", - "oches", - "ochre", - "ochry", - "ocker", - "ocrea", - "octad", - "octan", - "octas", - "octyl", - "oculi", - "odahs", - "odals", - "odeon", - "odeum", - "odism", - "odist", - "odium", - "odors", - "odour", - "odyle", - "odyls", - "ofays", - "offed", - "offie", - "oflag", - "ofter", - "ogams", - "ogeed", - "ogees", - "oggin", - "ogham", - "ogive", - "ogled", - "ogler", - "ogles", - "ogmic", - "ogres", - "ohias", - "ohing", - "ohmic", - "ohone", - "oidia", - "oiled", - "oiler", - "oinks", - "oints", - "ojime", - "okapi", - "okays", - "okehs", - "okras", - "oktas", - "oldie", - "oleic", - "olein", - "olent", - "oleos", - "oleum", - "olios", - "ollas", - "ollav", - "oller", - "ollie", - "ology", - "olpae", - "olpes", - "omasa", - "omber", - "ombus", - "omens", - "omers", - "omits", - "omlah", - "omovs", - "omrah", - "oncer", - "onces", - "oncet", - "oncus", - "onely", - "oners", - "onery", - "onium", - "onkus", - "onlay", - "onned", - "ontic", - "oobit", - "oohed", - "oomph", - "oonts", - "ooped", - "oorie", - "ooses", - "ootid", - "oozed", - "oozes", - "opahs", - "opals", - "opens", - "opepe", - "oping", - "oppos", - "opsin", - "opted", - "opter", - "orach", - "oracy", - "orals", - "orang", - "orant", - "orate", - "orbed", - "orcas", - "orcin", - "ordos", - "oread", - "orfes", - "orgia", - "orgic", - "orgue", - "oribi", - "oriel", - "orixa", - "orles", - "orlon", - "orlop", - "ormer", - "ornis", - "orpin", - "orris", - "ortho", - "orval", - "orzos", - "oscar", - "oshac", - "osier", - "osmic", - "osmol", - "ossia", - "ostia", - "otaku", - "otary", - "ottar", - "ottos", - "oubit", - "oucht", - "ouens", - "ouija", - "oulks", - "oumas", - "oundy", - "oupas", - "ouped", - "ouphe", - "ouphs", - "ourie", - "ousel", - "ousts", - "outby", - "outed", - "outre", - "outro", - "outta", - "ouzel", - "ouzos", - "ovals", - "ovels", - "ovens", - "overs", - "ovist", - "ovoli", - "ovolo", - "ovule", - "owche", - "owies", - "owled", - "owler", - "owlet", - "owned", - "owres", - "owrie", - "owsen", - "oxbow", - "oxers", - "oxeye", - "oxids", - "oxies", - "oxime", - "oxims", - "oxlip", - "oxter", - "oyers", - "ozeki", - "ozzie", - "paals", - "paans", - "pacas", - "paced", - "pacer", - "paces", - "pacey", - "pacha", - "packs", - "pacos", - "pacta", - "pacts", - "padis", - "padle", - "padma", - "padre", - "padri", - "paean", - "paedo", - "paeon", - "paged", - "pager", - "pages", - "pagle", - "pagod", - "pagri", - "paiks", - "pails", - "pains", - "paire", - "pairs", - "paisa", - "paise", - "pakka", - "palas", - "palay", - "palea", - "paled", - "pales", - "palet", - "palis", - "palki", - "palla", - "palls", - "pally", - "palms", - "palmy", - "palpi", - "palps", - "palsa", - "pampa", - "panax", - "pance", - "panda", - "pands", - "pandy", - "paned", - "panes", - "panga", - "pangs", - "panim", - "panko", - "panne", - "panni", - "panto", - "pants", - "panty", - "paoli", - "paolo", - "papas", - "papaw", - "papes", - "pappi", - "pappy", - "parae", - "paras", - "parch", - "pardi", - "pards", - "pardy", - "pared", - "paren", - "pareo", - "pares", - "pareu", - "parev", - "parge", - "pargo", - "paris", - "parki", - "parks", - "parky", - "parle", - "parly", - "parma", - "parol", - "parps", - "parra", - "parrs", - "parti", - "parts", - "parve", - "parvo", - "paseo", - "pases", - "pasha", - "pashm", - "paska", - "paspy", - "passe", - "pasts", - "pated", - "paten", - "pater", - "pates", - "paths", - "patin", - "patka", - "patly", - "patte", - "patus", - "pauas", - "pauls", - "pavan", - "paved", - "paven", - "paver", - "paves", - "pavid", - "pavin", - "pavis", - "pawas", - "pawaw", - "pawed", - "pawer", - "pawks", - "pawky", - "pawls", - "pawns", - "paxes", - "payed", - "payor", - "paysd", - "peage", - "peags", - "peaks", - "peaky", - "peals", - "peans", - "peare", - "pears", - "peart", - "pease", - "peats", - "peaty", - "peavy", - "peaze", - "pebas", - "pechs", - "pecke", - "pecks", - "pecky", - "pedes", - "pedis", - "pedro", - "peece", - "peeks", - "peels", - "peens", - "peeoy", - "peepe", - "peeps", - "peers", - "peery", - "peeve", - "peggy", - "peghs", - "peins", - "peise", - "peize", - "pekan", - "pekes", - "pekin", - "pekoe", - "pelas", - "pelau", - "peles", - "pelfs", - "pells", - "pelma", - "pelon", - "pelta", - "pelts", - "pends", - "pendu", - "pened", - "penes", - "pengo", - "penie", - "penis", - "penks", - "penna", - "penni", - "pents", - "peons", - "peony", - "pepla", - "pepos", - "peppy", - "pepsi", - "perai", - "perce", - "percs", - "perdu", - "perdy", - "perea", - "peres", - "peris", - "perks", - "perms", - "perns", - "perog", - "perps", - "perry", - "perse", - "perst", - "perts", - "perve", - "pervo", - "pervs", - "pervy", - "pesos", - "pests", - "pesty", - "petar", - "peter", - "petit", - "petre", - "petri", - "petti", - "petto", - "pewee", - "pewit", - "peyse", - "phage", - "phang", - "phare", - "pharm", - "pheer", - "phene", - "pheon", - "phese", - "phial", - "phish", - "phizz", - "phlox", - "phoca", - "phono", - "phons", - "phots", - "phpht", - "phuts", - "phyla", - "phyle", - "piani", - "pians", - "pibal", - "pical", - "picas", - "piccy", - "picks", - "picot", - "picra", - "picul", - "piend", - "piers", - "piert", - "pieta", - "piets", - "piezo", - "pight", - "pigmy", - "piing", - "pikas", - "pikau", - "piked", - "piker", - "pikes", - "pikey", - "pikis", - "pikul", - "pilae", - "pilaf", - "pilao", - "pilar", - "pilau", - "pilaw", - "pilch", - "pilea", - "piled", - "pilei", - "piler", - "piles", - "pilis", - "pills", - "pilow", - "pilum", - "pilus", - "pimas", - "pimps", - "pinas", - "pined", - "pines", - "pingo", - "pings", - "pinko", - "pinks", - "pinna", - "pinny", - "pinon", - "pinot", - "pinta", - "pints", - "pinup", - "pions", - "piony", - "pious", - "pioye", - "pioys", - "pipal", - "pipas", - "piped", - "pipes", - "pipet", - "pipis", - "pipit", - "pippy", - "pipul", - "pirai", - "pirls", - "pirns", - "pirog", - "pisco", - "pises", - "pisky", - "pisos", - "pissy", - "piste", - "pitas", - "piths", - "piton", - "pitot", - "pitta", - "piums", - "pixes", - "pized", - "pizes", - "plaas", - "plack", - "plage", - "plans", - "plaps", - "plash", - "plasm", - "plast", - "plats", - "platt", - "platy", - "playa", - "plays", - "pleas", - "plebe", - "plebs", - "plena", - "pleon", - "plesh", - "plews", - "plica", - "plies", - "plims", - "pling", - "plink", - "ploat", - "plods", - "plong", - "plonk", - "plook", - "plops", - "plots", - "plotz", - "plouk", - "plows", - "ploye", - "ploys", - "plues", - "pluff", - "plugs", - "plums", - "plumy", - "pluot", - "pluto", - "plyer", - "poach", - "poaka", - "poake", - "poboy", - "pocks", - "pocky", - "podal", - "poddy", - "podex", - "podge", - "podgy", - "podia", - "poems", - "poeps", - "poets", - "pogey", - "pogge", - "pogos", - "pohed", - "poilu", - "poind", - "pokal", - "poked", - "pokes", - "pokey", - "pokie", - "poled", - "poler", - "poles", - "poley", - "polio", - "polis", - "polje", - "polks", - "polls", - "polly", - "polos", - "polts", - "polys", - "pombe", - "pomes", - "pommy", - "pomos", - "pomps", - "ponce", - "poncy", - "ponds", - "pones", - "poney", - "ponga", - "pongo", - "pongs", - "pongy", - "ponks", - "ponts", - "ponty", - "ponzu", - "poods", - "pooed", - "poofs", - "poofy", - "poohs", - "pooja", - "pooka", - "pooks", - "pools", - "poons", - "poops", - "poopy", - "poori", - "poort", - "poots", - "poove", - "poovy", - "popes", - "poppa", - "popsy", - "porae", - "poral", - "pored", - "porer", - "pores", - "porge", - "porgy", - "porin", - "porks", - "porky", - "porno", - "porns", - "porny", - "porta", - "ports", - "porty", - "posed", - "poses", - "posey", - "posho", - "posts", - "potae", - "potch", - "poted", - "potes", - "potin", - "potoo", - "potsy", - "potto", - "potts", - "potty", - "pouff", - "poufs", - "pouke", - "pouks", - "poule", - "poulp", - "poult", - "poupe", - "poupt", - "pours", - "pouts", - "powan", - "powin", - "pownd", - "powns", - "powny", - "powre", - "poxed", - "poxes", - "poynt", - "poyou", - "poyse", - "pozzy", - "praam", - "prads", - "prahu", - "prams", - "prana", - "prang", - "praos", - "prase", - "prate", - "prats", - "pratt", - "praty", - "praus", - "prays", - "predy", - "preed", - "prees", - "preif", - "prems", - "premy", - "prent", - "preon", - "preop", - "preps", - "presa", - "prese", - "prest", - "preve", - "prexy", - "preys", - "prial", - "pricy", - "prief", - "prier", - "pries", - "prigs", - "prill", - "prima", - "primi", - "primp", - "prims", - "primy", - "prink", - "prion", - "prise", - "priss", - "proas", - "probs", - "prods", - "proem", - "profs", - "progs", - "proin", - "proke", - "prole", - "proll", - "promo", - "proms", - "pronk", - "props", - "prore", - "proso", - "pross", - "prost", - "prosy", - "proto", - "proul", - "prows", - "proyn", - "prunt", - "pruta", - "pryer", - "pryse", - "pseud", - "pshaw", - "psion", - "psoae", - "psoai", - "psoas", - "psora", - "psych", - "psyop", - "pubco", - "pubes", - "pubis", - "pucan", - "pucer", - "puces", - "pucka", - "pucks", - "puddy", - "pudge", - "pudic", - "pudor", - "pudsy", - "pudus", - "puers", - "puffa", - "puffs", - "puggy", - "pugil", - "puhas", - "pujah", - "pujas", - "pukas", - "puked", - "puker", - "pukes", - "pukey", - "pukka", - "pukus", - "pulao", - "pulas", - "puled", - "puler", - "pules", - "pulik", - "pulis", - "pulka", - "pulks", - "pulli", - "pulls", - "pully", - "pulmo", - "pulps", - "pulus", - "pumas", - "pumie", - "pumps", - "punas", - "punce", - "punga", - "pungs", - "punji", - "punka", - "punks", - "punky", - "punny", - "punto", - "punts", - "punty", - "pupae", - "pupas", - "pupus", - "purda", - "pured", - "pures", - "purin", - "puris", - "purls", - "purpy", - "purrs", - "pursy", - "purty", - "puses", - "pusle", - "pussy", - "putid", - "puton", - "putti", - "putto", - "putts", - "puzel", - "pwned", - "pyats", - "pyets", - "pygal", - "pyins", - "pylon", - "pyned", - "pynes", - "pyoid", - "pyots", - "pyral", - "pyran", - "pyres", - "pyrex", - "pyric", - "pyros", - "pyxed", - "pyxes", - "pyxie", - "pyxis", - "pzazz", - "qadis", - "qaids", - "qajaq", - "qanat", - "qapik", - "qibla", - "qophs", - "qorma", - "quads", - "quaff", - "quags", - "quair", - "quais", - "quaky", - "quale", - "quant", - "quare", - "quass", - "quate", - "quats", - "quayd", - "quays", - "qubit", - "quean", - "queme", - "quena", - "quern", - "queyn", - "queys", - "quich", - "quids", - "quiff", - "quims", - "quina", - "quine", - "quino", - "quins", - "quint", - "quipo", - "quips", - "quipu", - "quire", - "quirt", - "quist", - "quits", - "quoad", - "quods", - "quoif", - "quoin", - "quoit", - "quoll", - "quonk", - "quops", - "qursh", - "quyte", - "rabat", - "rabic", - "rabis", - "raced", - "races", - "rache", - "racks", - "racon", - "radge", - "radix", - "radon", - "raffs", - "rafts", - "ragas", - "ragde", - "raged", - "ragee", - "rager", - "rages", - "ragga", - "raggs", - "raggy", - "ragis", - "ragus", - "rahed", - "rahui", - "raias", - "raids", - "raiks", - "raile", - "rails", - "raine", - "rains", - "raird", - "raita", - "raits", - "rajas", - "rajes", - "raked", - "rakee", - "raker", - "rakes", - "rakia", - "rakis", - "rakus", - "rales", - "ramal", - "ramee", - "ramet", - "ramie", - "ramin", - "ramis", - "rammy", - "ramps", - "ramus", - "ranas", - "rance", - "rands", - "ranee", - "ranga", - "rangi", - "rangs", - "rangy", - "ranid", - "ranis", - "ranke", - "ranks", - "rants", - "raped", - "raper", - "rapes", - "raphe", - "rappe", - "rared", - "raree", - "rares", - "rarks", - "rased", - "raser", - "rases", - "rasps", - "rasse", - "rasta", - "ratal", - "ratan", - "ratas", - "ratch", - "rated", - "ratel", - "rater", - "rates", - "ratha", - "rathe", - "raths", - "ratoo", - "ratos", - "ratus", - "rauns", - "raupo", - "raved", - "ravel", - "raver", - "raves", - "ravey", - "ravin", - "rawer", - "rawin", - "rawly", - "rawns", - "raxed", - "raxes", - "rayah", - "rayas", - "rayed", - "rayle", - "rayne", - "razed", - "razee", - "razer", - "razes", - "razoo", - "readd", - "reads", - "reais", - "reaks", - "realo", - "reals", - "reame", - "reams", - "reamy", - "reans", - "reaps", - "rears", - "reast", - "reata", - "reate", - "reave", - "rebbe", - "rebec", - "rebid", - "rebit", - "rebop", - "rebuy", - "recal", - "recce", - "recco", - "reccy", - "recit", - "recks", - "recon", - "recta", - "recti", - "recto", - "redan", - "redds", - "reddy", - "reded", - "redes", - "redia", - "redid", - "redip", - "redly", - "redon", - "redos", - "redox", - "redry", - "redub", - "redux", - "redye", - "reech", - "reede", - "reeds", - "reefs", - "reefy", - "reeks", - "reeky", - "reels", - "reens", - "reest", - "reeve", - "refed", - "refel", - "reffo", - "refis", - "refix", - "refly", - "refry", - "regar", - "reges", - "reggo", - "regie", - "regma", - "regna", - "regos", - "regur", - "rehem", - "reifs", - "reify", - "reiki", - "reiks", - "reink", - "reins", - "reird", - "reist", - "reive", - "rejig", - "rejon", - "reked", - "rekes", - "rekey", - "relet", - "relie", - "relit", - "rello", - "reman", - "remap", - "remen", - "remet", - "remex", - "remix", - "renay", - "rends", - "reney", - "renga", - "renig", - "renin", - "renne", - "renos", - "rente", - "rents", - "reoil", - "reorg", - "repeg", - "repin", - "repla", - "repos", - "repot", - "repps", - "repro", - "reran", - "rerig", - "resat", - "resaw", - "resay", - "resee", - "reses", - "resew", - "resid", - "resit", - "resod", - "resow", - "resto", - "rests", - "resty", - "resus", - "retag", - "retax", - "retem", - "retia", - "retie", - "retox", - "revet", - "revie", - "rewan", - "rewax", - "rewed", - "rewet", - "rewin", - "rewon", - "rewth", - "rexes", - "rezes", - "rheas", - "rheme", - "rheum", - "rhies", - "rhime", - "rhine", - "rhody", - "rhomb", - "rhone", - "rhumb", - "rhyne", - "rhyta", - "riads", - "rials", - "riant", - "riata", - "ribas", - "ribby", - "ribes", - "riced", - "ricer", - "rices", - "ricey", - "richt", - "ricin", - "ricks", - "rides", - "ridgy", - "ridic", - "riels", - "riems", - "rieve", - "rifer", - "riffs", - "rifte", - "rifts", - "rifty", - "riggs", - "rigol", - "riled", - "riles", - "riley", - "rille", - "rills", - "rimae", - "rimed", - "rimer", - "rimes", - "rimus", - "rinds", - "rindy", - "rines", - "rings", - "rinks", - "rioja", - "riots", - "riped", - "ripes", - "ripps", - "rises", - "rishi", - "risks", - "risps", - "risus", - "rites", - "ritts", - "ritzy", - "rivas", - "rived", - "rivel", - "riven", - "rives", - "riyal", - "rizas", - "roads", - "roams", - "roans", - "roars", - "roary", - "roate", - "robed", - "robes", - "roble", - "rocks", - "roded", - "rodes", - "roguy", - "rohes", - "roids", - "roils", - "roily", - "roins", - "roist", - "rojak", - "rojis", - "roked", - "roker", - "rokes", - "rolag", - "roles", - "rolfs", - "rolls", - "romal", - "roman", - "romeo", - "romps", - "ronde", - "rondo", - "roneo", - "rones", - "ronin", - "ronne", - "ronte", - "ronts", - "roods", - "roofs", - "roofy", - "rooks", - "rooky", - "rooms", - "roons", - "roops", - "roopy", - "roosa", - "roose", - "roots", - "rooty", - "roped", - "roper", - "ropes", - "ropey", - "roque", - "roral", - "rores", - "roric", - "rorid", - "rorie", - "rorts", - "rorty", - "rosed", - "roses", - "roset", - "roshi", - "rosin", - "rosit", - "rosti", - "rosts", - "rotal", - "rotan", - "rotas", - "rotch", - "roted", - "rotes", - "rotis", - "rotls", - "roton", - "rotos", - "rotte", - "rouen", - "roues", - "roule", - "rouls", - "roums", - "roups", - "roupy", - "roust", - "routh", - "routs", - "roved", - "roven", - "roves", - "rowan", - "rowed", - "rowel", - "rowen", - "rowie", - "rowme", - "rownd", - "rowth", - "rowts", - "royne", - "royst", - "rozet", - "rozit", - "ruana", - "rubai", - "rubby", - "rubel", - "rubes", - "rubin", - "ruble", - "rubli", - "rubus", - "ruche", - "rucks", - "rudas", - "rudds", - "rudes", - "rudie", - "rudis", - "rueda", - "ruers", - "ruffe", - "ruffs", - "rugae", - "rugal", - "ruggy", - "ruing", - "ruins", - "rukhs", - "ruled", - "rules", - "rumal", - "rumbo", - "rumen", - "rumes", - "rumly", - "rummy", - "rumpo", - "rumps", - "rumpy", - "runch", - "runds", - "runed", - "runes", - "rungs", - "runic", - "runny", - "runts", - "runty", - "rupia", - "rurps", - "rurus", - "rusas", - "ruses", - "rushy", - "rusks", - "rusma", - "russe", - "rusts", - "ruths", - "rutin", - "rutty", - "ryals", - "rybat", - "ryked", - "rykes", - "rymme", - "rynds", - "ryots", - "ryper", - "saags", - "sabal", - "sabed", - "saber", - "sabes", - "sabha", - "sabin", - "sabir", - "sable", - "sabot", - "sabra", - "sabre", - "sacks", - "sacra", - "saddo", - "sades", - "sadhe", - "sadhu", - "sadis", - "sados", - "sadza", - "safed", - "safes", - "sagas", - "sager", - "sages", - "saggy", - "sagos", - "sagum", - "saheb", - "sahib", - "saice", - "saick", - "saics", - "saids", - "saiga", - "sails", - "saims", - "saine", - "sains", - "sairs", - "saist", - "saith", - "sajou", - "sakai", - "saker", - "sakes", - "sakia", - "sakis", - "sakti", - "salal", - "salat", - "salep", - "sales", - "salet", - "salic", - "salix", - "salle", - "salmi", - "salol", - "salop", - "salpa", - "salps", - "salse", - "salto", - "salts", - "salue", - "salut", - "saman", - "samas", - "samba", - "sambo", - "samek", - "samel", - "samen", - "sames", - "samey", - "samfu", - "sammy", - "sampi", - "samps", - "sands", - "saned", - "sanes", - "sanga", - "sangh", - "sango", - "sangs", - "sanko", - "sansa", - "santo", - "sants", - "saola", - "sapan", - "sapid", - "sapor", - "saran", - "sards", - "sared", - "saree", - "sarge", - "sargo", - "sarin", - "saris", - "sarks", - "sarky", - "sarod", - "saros", - "sarus", - "saser", - "sasin", - "sasse", - "satai", - "satay", - "sated", - "satem", - "sates", - "satis", - "sauba", - "sauch", - "saugh", - "sauls", - "sault", - "saunt", - "saury", - "sauts", - "saved", - "saver", - "saves", - "savey", - "savin", - "sawah", - "sawed", - "sawer", - "saxes", - "sayed", - "sayer", - "sayid", - "sayne", - "sayon", - "sayst", - "sazes", - "scabs", - "scads", - "scaff", - "scags", - "scail", - "scala", - "scall", - "scams", - "scand", - "scans", - "scapa", - "scape", - "scapi", - "scarp", - "scars", - "scart", - "scath", - "scats", - "scatt", - "scaud", - "scaup", - "scaur", - "scaws", - "sceat", - "scena", - "scend", - "schav", - "schmo", - "schul", - "schwa", - "sclim", - "scody", - "scogs", - "scoog", - "scoot", - "scopa", - "scops", - "scots", - "scoug", - "scoup", - "scowp", - "scows", - "scrab", - "scrae", - "scrag", - "scran", - "scrat", - "scraw", - "scray", - "scrim", - "scrip", - "scrob", - "scrod", - "scrog", - "scrow", - "scudi", - "scudo", - "scuds", - "scuff", - "scuft", - "scugs", - "sculk", - "scull", - "sculp", - "sculs", - "scums", - "scups", - "scurf", - "scurs", - "scuse", - "scuta", - "scute", - "scuts", - "scuzz", - "scyes", - "sdayn", - "sdein", - "seals", - "seame", - "seams", - "seamy", - "seans", - "seare", - "sears", - "sease", - "seats", - "seaze", - "sebum", - "secco", - "sechs", - "sects", - "seder", - "sedes", - "sedge", - "sedgy", - "sedum", - "seeds", - "seeks", - "seeld", - "seels", - "seely", - "seems", - "seeps", - "seepy", - "seers", - "sefer", - "segar", - "segni", - "segno", - "segol", - "segos", - "sehri", - "seifs", - "seils", - "seine", - "seirs", - "seise", - "seism", - "seity", - "seiza", - "sekos", - "sekts", - "selah", - "seles", - "selfs", - "sella", - "selle", - "sells", - "selva", - "semee", - "semes", - "semie", - "semis", - "senas", - "sends", - "senes", - "sengi", - "senna", - "senor", - "sensa", - "sensi", - "sente", - "senti", - "sents", - "senvy", - "senza", - "sepad", - "sepal", - "sepic", - "sepoy", - "septa", - "septs", - "serac", - "serai", - "seral", - "sered", - "serer", - "seres", - "serfs", - "serge", - "seric", - "serin", - "serks", - "seron", - "serow", - "serra", - "serre", - "serrs", - "serry", - "servo", - "sesey", - "sessa", - "setae", - "setal", - "seton", - "setts", - "sewan", - "sewar", - "sewed", - "sewel", - "sewen", - "sewin", - "sexed", - "sexer", - "sexes", - "sexto", - "sexts", - "seyen", - "shads", - "shags", - "shahs", - "shako", - "shakt", - "shalm", - "shaly", - "shama", - "shams", - "shand", - "shans", - "shaps", - "sharn", - "shash", - "shaul", - "shawm", - "shawn", - "shaws", - "shaya", - "shays", - "shchi", - "sheaf", - "sheal", - "sheas", - "sheds", - "sheel", - "shend", - "shent", - "sheol", - "sherd", - "shere", - "shero", - "shets", - "sheva", - "shewn", - "shews", - "shiai", - "shiel", - "shier", - "shies", - "shill", - "shily", - "shims", - "shins", - "ships", - "shirr", - "shirs", - "shish", - "shiso", - "shist", - "shite", - "shits", - "shiur", - "shiva", - "shive", - "shivs", - "shlep", - "shlub", - "shmek", - "shmoe", - "shoat", - "shoed", - "shoer", - "shoes", - "shogi", - "shogs", - "shoji", - "shojo", - "shola", - "shool", - "shoon", - "shoos", - "shope", - "shops", - "shorl", - "shote", - "shots", - "shott", - "showd", - "shows", - "shoyu", - "shred", - "shris", - "shrow", - "shtik", - "shtum", - "shtup", - "shule", - "shuln", - "shuls", - "shuns", - "shura", - "shute", - "shuts", - "shwas", - "shyer", - "sials", - "sibbs", - "sibyl", - "sices", - "sicht", - "sicko", - "sicks", - "sicky", - "sidas", - "sided", - "sider", - "sides", - "sidha", - "sidhe", - "sidle", - "sield", - "siens", - "sient", - "sieth", - "sieur", - "sifts", - "sighs", - "sigil", - "sigla", - "signa", - "signs", - "sijos", - "sikas", - "siker", - "sikes", - "silds", - "siled", - "silen", - "siler", - "siles", - "silex", - "silks", - "sills", - "silos", - "silts", - "silty", - "silva", - "simar", - "simas", - "simba", - "simis", - "simps", - "simul", - "sinds", - "sined", - "sines", - "sings", - "sinhs", - "sinks", - "sinky", - "sinus", - "siped", - "sipes", - "sippy", - "sired", - "siree", - "sires", - "sirih", - "siris", - "siroc", - "sirra", - "sirup", - "sisal", - "sises", - "sista", - "sists", - "sitar", - "sited", - "sites", - "sithe", - "sitka", - "situp", - "situs", - "siver", - "sixer", - "sixes", - "sixmo", - "sixte", - "sizar", - "sized", - "sizel", - "sizer", - "sizes", - "skags", - "skail", - "skald", - "skank", - "skart", - "skats", - "skatt", - "skaws", - "skean", - "skear", - "skeds", - "skeed", - "skeef", - "skeen", - "skeer", - "skees", - "skeet", - "skegg", - "skegs", - "skein", - "skelf", - "skell", - "skelm", - "skelp", - "skene", - "skens", - "skeos", - "skeps", - "skers", - "skets", - "skews", - "skids", - "skied", - "skies", - "skiey", - "skimo", - "skims", - "skink", - "skins", - "skint", - "skios", - "skips", - "skirl", - "skirr", - "skite", - "skits", - "skive", - "skivy", - "sklim", - "skoal", - "skody", - "skoff", - "skogs", - "skols", - "skool", - "skort", - "skosh", - "skran", - "skrik", - "skuas", - "skugs", - "skyed", - "skyer", - "skyey", - "skyfs", - "skyre", - "skyrs", - "skyte", - "slabs", - "slade", - "slaes", - "slags", - "slaid", - "slake", - "slams", - "slane", - "slank", - "slaps", - "slart", - "slats", - "slaty", - "slaws", - "slays", - "slebs", - "sleds", - "sleer", - "slews", - "sleys", - "slier", - "slily", - "slims", - "slipe", - "slips", - "slipt", - "slish", - "slits", - "slive", - "sloan", - "slobs", - "sloes", - "slogs", - "sloid", - "slojd", - "slomo", - "sloom", - "sloot", - "slops", - "slopy", - "slorm", - "slots", - "slove", - "slows", - "sloyd", - "slubb", - "slubs", - "slued", - "slues", - "sluff", - "slugs", - "sluit", - "slums", - "slurb", - "slurs", - "sluse", - "sluts", - "slyer", - "slype", - "smaak", - "smaik", - "smalm", - "smalt", - "smarm", - "smaze", - "smeek", - "smees", - "smeik", - "smeke", - "smerk", - "smews", - "smirr", - "smirs", - "smits", - "smogs", - "smoko", - "smolt", - "smoor", - "smoot", - "smore", - "smorg", - "smout", - "smowt", - "smugs", - "smurs", - "smush", - "smuts", - "snabs", - "snafu", - "snags", - "snaps", - "snarf", - "snark", - "snars", - "snary", - "snash", - "snath", - "snaws", - "snead", - "sneap", - "snebs", - "sneck", - "sneds", - "sneed", - "snees", - "snell", - "snibs", - "snick", - "snies", - "snift", - "snigs", - "snips", - "snipy", - "snirt", - "snits", - "snobs", - "snods", - "snoek", - "snoep", - "snogs", - "snoke", - "snood", - "snook", - "snool", - "snoot", - "snots", - "snowk", - "snows", - "snubs", - "snugs", - "snush", - "snyes", - "soaks", - "soaps", - "soare", - "soars", - "soave", - "sobas", - "socas", - "soces", - "socko", - "socks", - "socle", - "sodas", - "soddy", - "sodic", - "sodom", - "sofar", - "sofas", - "softa", - "softs", - "softy", - "soger", - "sohur", - "soils", - "soily", - "sojas", - "sojus", - "sokah", - "soken", - "sokes", - "sokol", - "solah", - "solan", - "solas", - "solde", - "soldi", - "soldo", - "solds", - "soled", - "solei", - "soler", - "soles", - "solon", - "solos", - "solum", - "solus", - "soman", - "somas", - "sonce", - "sonde", - "sones", - "songs", - "sonly", - "sonne", - "sonny", - "sonse", - "sonsy", - "sooey", - "sooks", - "sooky", - "soole", - "sools", - "sooms", - "soops", - "soote", - "soots", - "sophs", - "sophy", - "sopor", - "soppy", - "sopra", - "soral", - "soras", - "sorbo", - "sorbs", - "sorda", - "sordo", - "sords", - "sored", - "soree", - "sorel", - "sorer", - "sores", - "sorex", - "sorgo", - "sorns", - "sorra", - "sorta", - "sorts", - "sorus", - "soths", - "sotol", - "souce", - "souct", - "sough", - "souks", - "souls", - "soums", - "soups", - "soupy", - "sours", - "souse", - "souts", - "sowar", - "sowce", - "sowed", - "sowff", - "sowfs", - "sowle", - "sowls", - "sowms", - "sownd", - "sowne", - "sowps", - "sowse", - "sowth", - "soyas", - "soyle", - "soyuz", - "sozin", - "spacy", - "spado", - "spaed", - "spaer", - "spaes", - "spags", - "spahi", - "spail", - "spain", - "spait", - "spake", - "spald", - "spale", - "spall", - "spalt", - "spams", - "spane", - "spang", - "spans", - "spard", - "spars", - "spart", - "spate", - "spats", - "spaul", - "spawl", - "spaws", - "spayd", - "spays", - "spaza", - "spazz", - "speal", - "spean", - "speat", - "specs", - "spect", - "speel", - "speer", - "speil", - "speir", - "speks", - "speld", - "spelk", - "speos", - "spets", - "speug", - "spews", - "spewy", - "spial", - "spica", - "spick", - "spics", - "spide", - "spier", - "spies", - "spiff", - "spifs", - "spiks", - "spile", - "spims", - "spina", - "spink", - "spins", - "spirt", - "spiry", - "spits", - "spitz", - "spivs", - "splay", - "splog", - "spode", - "spods", - "spoom", - "spoor", - "spoot", - "spork", - "sposh", - "spots", - "sprad", - "sprag", - "sprat", - "spred", - "sprew", - "sprit", - "sprod", - "sprog", - "sprue", - "sprug", - "spuds", - "spued", - "spuer", - "spues", - "spugs", - "spule", - "spume", - "spumy", - "spurs", - "sputa", - "spyal", - "spyre", - "squab", - "squaw", - "squeg", - "squid", - "squit", - "squiz", - "stabs", - "stade", - "stags", - "stagy", - "staig", - "stane", - "stang", - "staph", - "staps", - "starn", - "starr", - "stars", - "stats", - "staun", - "staws", - "stays", - "stean", - "stear", - "stedd", - "stede", - "steds", - "steek", - "steem", - "steen", - "steil", - "stela", - "stele", - "stell", - "steme", - "stems", - "stend", - "steno", - "stens", - "stent", - "steps", - "stept", - "stere", - "stets", - "stews", - "stewy", - "steys", - "stich", - "stied", - "sties", - "stilb", - "stile", - "stime", - "stims", - "stimy", - "stipa", - "stipe", - "stire", - "stirk", - "stirp", - "stirs", - "stive", - "stivy", - "stoae", - "stoai", - "stoas", - "stoat", - "stobs", - "stoep", - "stogy", - "stoit", - "stoln", - "stoma", - "stond", - "stong", - "stonk", - "stonn", - "stook", - "stoor", - "stope", - "stops", - "stopt", - "stoss", - "stots", - "stott", - "stoun", - "stoup", - "stour", - "stown", - "stowp", - "stows", - "strad", - "strae", - "strag", - "strak", - "strep", - "strew", - "stria", - "strig", - "strim", - "strop", - "strow", - "stroy", - "strum", - "stubs", - "stude", - "studs", - "stull", - "stulm", - "stumm", - "stums", - "stuns", - "stupa", - "stupe", - "sture", - "sturt", - "styed", - "styes", - "styli", - "stylo", - "styme", - "stymy", - "styre", - "styte", - "subah", - "subas", - "subby", - "suber", - "subha", - "succi", - "sucks", - "sucky", - "sucre", - "sudds", - "sudor", - "sudsy", - "suede", - "suent", - "suers", - "suete", - "suets", - "suety", - "sugan", - "sughs", - "sugos", - "suhur", - "suids", - "suint", - "suits", - "sujee", - "sukhs", - "sukuk", - "sulci", - "sulfa", - "sulfo", - "sulks", - "sulph", - "sulus", - "sumis", - "summa", - "sumos", - "sumph", - "sumps", - "sunis", - "sunks", - "sunna", - "sunns", - "sunup", - "supes", - "supra", - "surah", - "sural", - "suras", - "surat", - "surds", - "sured", - "sures", - "surfs", - "surfy", - "surgy", - "surra", - "sused", - "suses", - "susus", - "sutor", - "sutra", - "sutta", - "swabs", - "swack", - "swads", - "swage", - "swags", - "swail", - "swain", - "swale", - "swaly", - "swamy", - "swang", - "swank", - "swans", - "swaps", - "swapt", - "sward", - "sware", - "swarf", - "swart", - "swats", - "swayl", - "sways", - "sweal", - "swede", - "sweed", - "sweel", - "sweer", - "swees", - "sweir", - "swelt", - "swerf", - "sweys", - "swies", - "swigs", - "swile", - "swims", - "swink", - "swipe", - "swire", - "swiss", - "swith", - "swits", - "swive", - "swizz", - "swobs", - "swole", - "swoln", - "swops", - "swopt", - "swots", - "swoun", - "sybbe", - "sybil", - "syboe", - "sybow", - "sycee", - "syces", - "sycon", - "syens", - "syker", - "sykes", - "sylis", - "sylph", - "sylva", - "symar", - "synch", - "syncs", - "synds", - "syned", - "synes", - "synth", - "syped", - "sypes", - "syphs", - "syrah", - "syren", - "sysop", - "sythe", - "syver", - "taals", - "taata", - "taber", - "tabes", - "tabid", - "tabis", - "tabla", - "tabor", - "tabun", - "tabus", - "tacan", - "taces", - "tacet", - "tache", - "tacho", - "tachs", - "tacks", - "tacos", - "tacts", - "taels", - "tafia", - "taggy", - "tagma", - "tahas", - "tahrs", - "taiga", - "taigs", - "taiko", - "tails", - "tains", - "taira", - "taish", - "taits", - "tajes", - "takas", - "takes", - "takhi", - "takin", - "takis", - "takky", - "talak", - "talaq", - "talar", - "talas", - "talcs", - "talcy", - "talea", - "taler", - "tales", - "talks", - "talky", - "talls", - "talma", - "talpa", - "taluk", - "talus", - "tamal", - "tamed", - "tames", - "tamin", - "tamis", - "tammy", - "tamps", - "tanas", - "tanga", - "tangi", - "tangs", - "tanhs", - "tanka", - "tanks", - "tanky", - "tanna", - "tansy", - "tanti", - "tanto", - "tanty", - "tapas", - "taped", - "tapen", - "tapes", - "tapet", - "tapis", - "tappa", - "tapus", - "taras", - "tardo", - "tared", - "tares", - "targa", - "targe", - "tarns", - "taroc", - "tarok", - "taros", - "tarps", - "tarre", - "tarry", - "tarsi", - "tarts", - "tarty", - "tasar", - "tased", - "taser", - "tases", - "tasks", - "tassa", - "tasse", - "tasso", - "tatar", - "tater", - "tates", - "taths", - "tatie", - "tatou", - "tatts", - "tatus", - "taube", - "tauld", - "tauon", - "taupe", - "tauts", - "tavah", - "tavas", - "taver", - "tawai", - "tawas", - "tawed", - "tawer", - "tawie", - "tawse", - "tawts", - "taxed", - "taxer", - "taxes", - "taxis", - "taxol", - "taxon", - "taxor", - "taxus", - "tayra", - "tazza", - "tazze", - "teade", - "teads", - "teaed", - "teaks", - "teals", - "teams", - "tears", - "teats", - "teaze", - "techs", - "techy", - "tecta", - "teels", - "teems", - "teend", - "teene", - "teens", - "teeny", - "teers", - "teffs", - "teggs", - "tegua", - "tegus", - "tehrs", - "teiid", - "teils", - "teind", - "teins", - "telae", - "telco", - "teles", - "telex", - "telia", - "telic", - "tells", - "telly", - "teloi", - "telos", - "temed", - "temes", - "tempi", - "temps", - "tempt", - "temse", - "tench", - "tends", - "tendu", - "tenes", - "tenge", - "tenia", - "tenne", - "tenno", - "tenny", - "tenon", - "tents", - "tenty", - "tenue", - "tepal", - "tepas", - "tepoy", - "terai", - "teras", - "terce", - "terek", - "teres", - "terfe", - "terfs", - "terga", - "terms", - "terne", - "terns", - "terry", - "terts", - "tesla", - "testa", - "teste", - "tests", - "tetes", - "teths", - "tetra", - "tetri", - "teuch", - "teugh", - "tewed", - "tewel", - "tewit", - "texas", - "texes", - "texts", - "thack", - "thagi", - "thaim", - "thale", - "thali", - "thana", - "thane", - "thang", - "thans", - "thanx", - "tharm", - "thars", - "thaws", - "thawy", - "thebe", - "theca", - "theed", - "theek", - "thees", - "thegn", - "theic", - "thein", - "thelf", - "thema", - "thens", - "theow", - "therm", - "thesp", - "thete", - "thews", - "thewy", - "thigs", - "thilk", - "thill", - "thine", - "thins", - "thiol", - "thirl", - "thoft", - "thole", - "tholi", - "thoro", - "thorp", - "thous", - "thowl", - "thrae", - "thraw", - "thrid", - "thrip", - "throe", - "thuds", - "thugs", - "thuja", - "thunk", - "thurl", - "thuya", - "thymi", - "thymy", - "tians", - "tiars", - "tical", - "ticca", - "ticed", - "tices", - "tichy", - "ticks", - "ticky", - "tiddy", - "tided", - "tides", - "tiers", - "tiffs", - "tifos", - "tifts", - "tiges", - "tigon", - "tikas", - "tikes", - "tikis", - "tikka", - "tilak", - "tiled", - "tiler", - "tiles", - "tills", - "tilly", - "tilth", - "tilts", - "timbo", - "timed", - "times", - "timon", - "timps", - "tinas", - "tinct", - "tinds", - "tinea", - "tined", - "tines", - "tinge", - "tings", - "tinks", - "tinny", - "tints", - "tinty", - "tipis", - "tippy", - "tired", - "tires", - "tirls", - "tiros", - "tirrs", - "titch", - "titer", - "titis", - "titre", - "titty", - "titup", - "tiyin", - "tiyns", - "tizes", - "tizzy", - "toads", - "toady", - "toaze", - "tocks", - "tocky", - "tocos", - "todde", - "toeas", - "toffs", - "toffy", - "tofts", - "tofus", - "togae", - "togas", - "toged", - "toges", - "togue", - "tohos", - "toile", - "toils", - "toing", - "toise", - "toits", - "tokay", - "toked", - "toker", - "tokes", - "tokos", - "tolan", - "tolar", - "tolas", - "toled", - "toles", - "tolls", - "tolly", - "tolts", - "tolus", - "tolyl", - "toman", - "tombs", - "tomes", - "tomia", - "tommy", - "tomos", - "tondi", - "tondo", - "toned", - "toner", - "tones", - "toney", - "tongs", - "tonka", - "tonks", - "tonne", - "tonus", - "tools", - "tooms", - "toons", - "toots", - "toped", - "topee", - "topek", - "toper", - "topes", - "tophe", - "tophi", - "tophs", - "topis", - "topoi", - "topos", - "toppy", - "toque", - "torah", - "toran", - "toras", - "torcs", - "tores", - "toric", - "torii", - "toros", - "torot", - "torrs", - "torse", - "torsi", - "torsk", - "torta", - "torte", - "torts", - "tosas", - "tosed", - "toses", - "toshy", - "tossy", - "toted", - "toter", - "totes", - "totty", - "touks", - "touns", - "tours", - "touse", - "tousy", - "touts", - "touze", - "touzy", - "towed", - "towie", - "towns", - "towny", - "towse", - "towsy", - "towts", - "towze", - "towzy", - "toyed", - "toyer", - "toyon", - "toyos", - "tozed", - "tozes", - "tozie", - "trabs", - "trads", - "tragi", - "traik", - "trams", - "trank", - "tranq", - "trans", - "trant", - "trape", - "traps", - "trapt", - "trass", - "trats", - "tratt", - "trave", - "trayf", - "trays", - "treck", - "treed", - "treen", - "trees", - "trefa", - "treif", - "treks", - "trema", - "trems", - "tress", - "trest", - "trets", - "trews", - "treyf", - "treys", - "triac", - "tride", - "trier", - "tries", - "triff", - "trigo", - "trigs", - "trike", - "trild", - "trill", - "trims", - "trine", - "trins", - "triol", - "trior", - "trios", - "trips", - "tripy", - "trist", - "troad", - "troak", - "troat", - "trock", - "trode", - "trods", - "trogs", - "trois", - "troke", - "tromp", - "trona", - "tronc", - "trone", - "tronk", - "trons", - "trooz", - "troth", - "trots", - "trows", - "troys", - "trued", - "trues", - "trugo", - "trugs", - "trull", - "tryer", - "tryke", - "tryma", - "tryps", - "tsade", - "tsadi", - "tsars", - "tsked", - "tsuba", - "tsubo", - "tuans", - "tuart", - "tuath", - "tubae", - "tubar", - "tubas", - "tubby", - "tubed", - "tubes", - "tucks", - "tufas", - "tuffe", - "tuffs", - "tufts", - "tufty", - "tugra", - "tuile", - "tuina", - "tuism", - "tuktu", - "tules", - "tulpa", - "tulsi", - "tumid", - "tummy", - "tumps", - "tumpy", - "tunas", - "tunds", - "tuned", - "tuner", - "tunes", - "tungs", - "tunny", - "tupek", - "tupik", - "tuple", - "tuque", - "turds", - "turfs", - "turfy", - "turks", - "turme", - "turms", - "turns", - "turnt", - "turps", - "turrs", - "tushy", - "tusks", - "tusky", - "tutee", - "tutti", - "tutty", - "tutus", - "tuxes", - "tuyer", - "twaes", - "twain", - "twals", - "twank", - "twats", - "tways", - "tweel", - "tween", - "tweep", - "tweer", - "twerk", - "twerp", - "twier", - "twigs", - "twill", - "twilt", - "twink", - "twins", - "twiny", - "twire", - "twirp", - "twite", - "twits", - "twoer", - "twyer", - "tyees", - "tyers", - "tyiyn", - "tykes", - "tyler", - "tymps", - "tynde", - "tyned", - "tynes", - "typal", - "typed", - "types", - "typey", - "typic", - "typos", - "typps", - "typto", - "tyran", - "tyred", - "tyres", - "tyros", - "tythe", - "tzars", - "udals", - "udons", - "ugali", - "ugged", - "uhlan", - "uhuru", - "ukase", - "ulama", - "ulans", - "ulema", - "ulmin", - "ulnad", - "ulnae", - "ulnar", - "ulnas", - "ulpan", - "ulvas", - "ulyie", - "ulzie", - "umami", - "umbel", - "umber", - "umble", - "umbos", - "umbre", - "umiac", - "umiak", - "umiaq", - "ummah", - "ummas", - "ummed", - "umped", - "umphs", - "umpie", - "umpty", - "umrah", - "umras", - "unais", - "unapt", - "unarm", - "unary", - "unaus", - "unbag", - "unban", - "unbar", - "unbed", - "unbid", - "unbox", - "uncap", - "unces", - "uncia", - "uncos", - "uncoy", - "uncus", - "undam", - "undee", - "undos", - "undug", - "uneth", - "unfix", - "ungag", - "unget", - "ungod", - "ungot", - "ungum", - "unhat", - "unhip", - "unica", - "units", - "unjam", - "unked", - "unket", - "unkid", - "unlaw", - "unlay", - "unled", - "unlet", - "unlid", - "unman", - "unmew", - "unmix", - "unpay", - "unpeg", - "unpen", - "unpin", - "unred", - "unrid", - "unrig", - "unrip", - "unsaw", - "unsay", - "unsee", - "unsew", - "unsex", - "unsod", - "untax", - "untin", - "unwet", - "unwit", - "unwon", - "upbow", - "upbye", - "updos", - "updry", - "upend", - "upjet", - "uplay", - "upled", - "uplit", - "upped", - "upran", - "uprun", - "upsee", - "upsey", - "uptak", - "upter", - "uptie", - "uraei", - "urali", - "uraos", - "urare", - "urari", - "urase", - "urate", - "urbex", - "urbia", - "urdee", - "ureal", - "ureas", - "uredo", - "ureic", - "urena", - "urent", - "urged", - "urger", - "urges", - "urial", - "urite", - "urman", - "urnal", - "urned", - "urped", - "ursae", - "ursid", - "urson", - "urubu", - "urvas", - "users", - "usnea", - "usque", - "usure", - "usury", - "uteri", - "uveal", - "uveas", - "uvula", - "vacua", - "vaded", - "vades", - "vagal", - "vagus", - "vails", - "vaire", - "vairs", - "vairy", - "vakas", - "vakil", - "vales", - "valis", - "valse", - "vamps", - "vampy", - "vanda", - "vaned", - "vanes", - "vangs", - "vants", - "vaped", - "vaper", - "vapes", - "varan", - "varas", - "vardy", - "varec", - "vares", - "varia", - "varix", - "varna", - "varus", - "varve", - "vasal", - "vases", - "vasts", - "vasty", - "vatic", - "vatus", - "vauch", - "vaute", - "vauts", - "vawte", - "vaxes", - "veale", - "veals", - "vealy", - "veena", - "veeps", - "veers", - "veery", - "vegas", - "veges", - "vegie", - "vegos", - "vehme", - "veils", - "veily", - "veins", - "veiny", - "velar", - "velds", - "veldt", - "veles", - "vells", - "velum", - "venae", - "venal", - "vends", - "vendu", - "veney", - "venge", - "venin", - "vents", - "venus", - "verbs", - "verra", - "verry", - "verst", - "verts", - "vertu", - "vespa", - "vesta", - "vests", - "vetch", - "vexed", - "vexer", - "vexes", - "vexil", - "vezir", - "vials", - "viand", - "vibes", - "vibex", - "vibey", - "viced", - "vices", - "vichy", - "viers", - "views", - "viewy", - "vifda", - "viffs", - "vigas", - "vigia", - "vilde", - "viler", - "villi", - "vills", - "vimen", - "vinal", - "vinas", - "vinca", - "vined", - "viner", - "vines", - "vinew", - "vinic", - "vinos", - "vints", - "viold", - "viols", - "vired", - "vireo", - "vires", - "virga", - "virge", - "virid", - "virls", - "virtu", - "visas", - "vised", - "vises", - "visie", - "visne", - "vison", - "visto", - "vitae", - "vitas", - "vitex", - "vitro", - "vitta", - "vivas", - "vivat", - "vivda", - "viver", - "vives", - "vizir", - "vizor", - "vleis", - "vlies", - "vlogs", - "voars", - "vocab", - "voces", - "voddy", - "vodou", - "vodun", - "voema", - "vogie", - "voids", - "voile", - "voips", - "volae", - "volar", - "voled", - "voles", - "volet", - "volks", - "volta", - "volte", - "volti", - "volts", - "volva", - "volve", - "vomer", - "voted", - "votes", - "vouge", - "voulu", - "vowed", - "vower", - "voxel", - "vozhd", - "vraic", - "vrils", - "vroom", - "vrous", - "vrouw", - "vrows", - "vuggs", - "vuggy", - "vughs", - "vughy", - "vulgo", - "vulns", - "vulva", - "vutty", - "waacs", - "wacke", - "wacko", - "wacks", - "wadds", - "waddy", - "waded", - "wader", - "wades", - "wadge", - "wadis", - "wadts", - "waffs", - "wafts", - "waged", - "wages", - "wagga", - "wagyu", - "wahoo", - "waide", - "waifs", - "waift", - "wails", - "wains", - "wairs", - "waite", - "waits", - "wakas", - "waked", - "waken", - "waker", - "wakes", - "wakfs", - "waldo", - "walds", - "waled", - "waler", - "wales", - "walie", - "walis", - "walks", - "walla", - "walls", - "wally", - "walty", - "wamed", - "wames", - "wamus", - "wands", - "waned", - "wanes", - "waney", - "wangs", - "wanks", - "wanky", - "wanle", - "wanly", - "wanna", - "wants", - "wanty", - "wanze", - "waqfs", - "warbs", - "warby", - "wards", - "wared", - "wares", - "warez", - "warks", - "warms", - "warns", - "warps", - "warre", - "warst", - "warts", - "wases", - "washy", - "wasms", - "wasps", - "waspy", - "wasts", - "watap", - "watts", - "wauff", - "waugh", - "wauks", - "waulk", - "wauls", - "waurs", - "waved", - "waves", - "wavey", - "wawas", - "wawes", - "wawls", - "waxed", - "waxer", - "waxes", - "wayed", - "wazir", - "wazoo", - "weald", - "weals", - "weamb", - "weans", - "wears", - "webby", - "weber", - "wecht", - "wedel", - "wedgy", - "weeds", - "weeke", - "weeks", - "weels", - "weems", - "weens", - "weeny", - "weeps", - "weepy", - "weest", - "weete", - "weets", - "wefte", - "wefts", - "weids", - "weils", - "weirs", - "weise", - "weize", - "wekas", - "welds", - "welke", - "welks", - "welkt", - "wells", - "welly", - "welts", - "wembs", - "wends", - "wenge", - "wenny", - "wents", - "weros", - "wersh", - "wests", - "wetas", - "wetly", - "wexed", - "wexes", - "whamo", - "whams", - "whang", - "whaps", - "whare", - "whata", - "whats", - "whaup", - "whaur", - "wheal", - "whear", - "wheen", - "wheep", - "wheft", - "whelk", - "whelm", - "whens", - "whets", - "whews", - "wheys", - "whids", - "whift", - "whigs", - "whilk", - "whims", - "whins", - "whios", - "whips", - "whipt", - "whirr", - "whirs", - "whish", - "whiss", - "whist", - "whits", - "whity", - "whizz", - "whomp", - "whoof", - "whoot", - "whops", - "whore", - "whorl", - "whort", - "whoso", - "whows", - "whump", - "whups", - "whyda", - "wicca", - "wicks", - "wicky", - "widdy", - "wides", - "wiels", - "wifed", - "wifes", - "wifey", - "wifie", - "wifty", - "wigan", - "wigga", - "wiggy", - "wikis", - "wilco", - "wilds", - "wiled", - "wiles", - "wilga", - "wilis", - "wilja", - "wills", - "wilts", - "wimps", - "winds", - "wined", - "wines", - "winey", - "winge", - "wings", - "wingy", - "winks", - "winna", - "winns", - "winos", - "winze", - "wiped", - "wiper", - "wipes", - "wired", - "wirer", - "wires", - "wirra", - "wised", - "wises", - "wisha", - "wisht", - "wisps", - "wists", - "witan", - "wited", - "wites", - "withe", - "withs", - "withy", - "wived", - "wiver", - "wives", - "wizen", - "wizes", - "woads", - "woald", - "wocks", - "wodge", - "woful", - "wojus", - "woker", - "wokka", - "wolds", - "wolfs", - "wolly", - "wolve", - "wombs", - "womby", - "womyn", - "wonga", - "wongi", - "wonks", - "wonky", - "wonts", - "woods", - "wooed", - "woofs", - "woofy", - "woold", - "wools", - "woons", - "woops", - "woopy", - "woose", - "woosh", - "wootz", - "words", - "works", - "worms", - "wormy", - "worts", - "wowed", - "wowee", - "woxen", - "wrang", - "wraps", - "wrapt", - "wrast", - "wrate", - "wrawl", - "wrens", - "wrick", - "wried", - "wrier", - "wries", - "writs", - "wroke", - "wroot", - "wroth", - "wryer", - "wuddy", - "wudus", - "wulls", - "wurst", - "wuses", - "wushu", - "wussy", - "wuxia", - "wyled", - "wyles", - "wynds", - "wynns", - "wyted", - "wytes", - "xebec", - "xenia", - "xenic", - "xenon", - "xeric", - "xerox", - "xerus", - "xoana", - "xrays", - "xylan", - "xylem", - "xylic", - "xylol", - "xylyl", - "xysti", - "xysts", - "yaars", - "yabas", - "yabba", - "yabby", - "yacca", - "yacka", - "yacks", - "yaffs", - "yager", - "yages", - "yagis", - "yahoo", - "yaird", - "yakka", - "yakow", - "yales", - "yamen", - "yampy", - "yamun", - "yangs", - "yanks", - "yapok", - "yapon", - "yapps", - "yappy", - "yarak", - "yarco", - "yards", - "yarer", - "yarfa", - "yarks", - "yarns", - "yarrs", - "yarta", - "yarto", - "yates", - "yauds", - "yauld", - "yaups", - "yawed", - "yawey", - "yawls", - "yawns", - "yawny", - "yawps", - "ybore", - "yclad", - "ycled", - "ycond", - "ydrad", - "ydred", - "yeads", - "yeahs", - "yealm", - "yeans", - "yeard", - "years", - "yecch", - "yechs", - "yechy", - "yedes", - "yeeds", - "yeesh", - "yeggs", - "yelks", - "yells", - "yelms", - "yelps", - "yelts", - "yenta", - "yente", - "yerba", - "yerds", - "yerks", - "yeses", - "yesks", - "yests", - "yesty", - "yetis", - "yetts", - "yeuks", - "yeuky", - "yeven", - "yeves", - "yewen", - "yexed", - "yexes", - "yfere", - "yiked", - "yikes", - "yills", - "yince", - "yipes", - "yippy", - "yirds", - "yirks", - "yirrs", - "yirth", - "yites", - "yitie", - "ylems", - "ylike", - "ylkes", - "ymolt", - "ympes", - "yobbo", - "yobby", - "yocks", - "yodel", - "yodhs", - "yodle", - "yogas", - "yogee", - "yoghs", - "yogic", - "yogin", - "yogis", - "yoick", - "yojan", - "yoked", - "yokel", - "yoker", - "yokes", - "yokul", - "yolks", - "yolky", - "yomim", - "yomps", - "yonic", - "yonis", - "yonks", - "yoofs", - "yoops", - "yores", - "yorks", - "yorps", - "youks", - "yourn", - "yours", - "yourt", - "youse", - "yowed", - "yowes", - "yowie", - "yowls", - "yowza", - "yrapt", - "yrent", - "yrivd", - "yrneh", - "ysame", - "ytost", - "yuans", - "yucas", - "yucca", - "yucch", - "yucko", - "yucks", - "yucky", - "yufts", - "yugas", - "yuked", - "yukes", - "yukky", - "yukos", - "yulan", - "yules", - "yummo", - "yummy", - "yumps", - "yupon", - "yuppy", - "yurta", - "yurts", - "yuzus", - "zabra", - "zacks", - "zaida", - "zaidy", - "zaire", - "zakat", - "zaman", - "zambo", - "zamia", - "zanja", - "zante", - "zanza", - "zanze", - "zappy", - "zarfs", - "zaris", - "zatis", - "zaxes", - "zayin", - "zazen", - "zeals", - "zebec", - "zebub", - "zebus", - "zedas", - "zeins", - "zendo", - "zerda", - "zerks", - "zeros", - "zests", - "zetas", - "zexes", - "zezes", - "zhomo", - "zibet", - "ziffs", - "zigan", - "zilas", - "zilch", - "zilla", - "zills", - "zimbi", - "zimbs", - "zinco", - "zincs", - "zincy", - "zineb", - "zines", - "zings", - "zingy", - "zinke", - "zinky", - "zippo", - "zippy", - "ziram", - "zitis", - "zizel", - "zizit", - "zlote", - "zloty", - "zoaea", - "zobos", - "zobus", - "zocco", - "zoeae", - "zoeal", - "zoeas", - "zoism", - "zoist", - "zombi", - "zonae", - "zonda", - "zoned", - "zoner", - "zones", - "zonks", - "zooea", - "zooey", - "zooid", - "zooks", - "zooms", - "zoons", - "zooty", - "zoppa", - "zoppo", - "zoril", - "zoris", - "zorro", - "zouks", - "zowee", - "zowie", - "zulus", - "zupan", - "zupas", - "zuppa", - "zurfs", - "zuzim", - "zygal", - "zygon", - "zymes", - "zymic", -]); From 93ff62bcb4fa93abaf57ef9bf50b7cac7692fac1 Mon Sep 17 00:00:00 2001 From: shm Date: Sun, 9 Jun 2024 00:17:22 +0900 Subject: [PATCH 07/35] =?UTF-8?q?refactor:=20=E3=83=91=E3=82=B9=E3=82=A8?= =?UTF-8?q?=E3=82=A4=E3=83=AA=E3=82=A2=E3=82=B9=E3=81=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tsconfig.json | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index fc93cbd..3b4c8a9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,19 +1,23 @@ { - "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 + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler", + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + } + // 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 } From 9dc60be7511a947f22f128ed3a5e7ed15228713e Mon Sep 17 00:00:00 2001 From: shm Date: Sun, 9 Jun 2024 00:28:31 +0900 Subject: [PATCH 08/35] =?UTF-8?q?refactor:=20=E3=82=B5=E3=83=B3=E3=83=97?= =?UTF-8?q?=E3=83=AB=E3=82=B3=E3=83=BC=E3=83=89=E3=81=AE=E3=83=AA=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=AF=E3=82=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/components/sample.svelte | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/lib/components/sample.svelte b/src/lib/components/sample.svelte index 9d23637..09f1c01 100644 --- a/src/lib/components/sample.svelte +++ b/src/lib/components/sample.svelte @@ -1,5 +1,6 @@ @@ -27,11 +31,14 @@ setInterval(async () => {

CPU History

+

Count: {cpuHistory.length}

    {#each cpuHistory as item}
  • {item}
  • {/each}
+

MEMORY History

+

Count: {memoryHistory.length}

    {#each memoryHistory as item}
  • {item}
  • From 7ad8f8e8be82d9ca6916a09d5a4701b69a9ab46f Mon Sep 17 00:00:00 2001 From: shm Date: Sun, 9 Jun 2024 01:11:11 +0900 Subject: [PATCH 09/35] =?UTF-8?q?add:=20=E3=83=8F=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=82=A6=E3=82=A7=E3=82=A2=E4=BD=BF=E7=94=A8=E7=8E=87=E3=81=AE?= =?UTF-8?q?=E3=82=B0=E3=83=A9=E3=83=95=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 53 ++++++++++------- package.json | 4 +- src-tauri/src/get_hardware_data.rs | 4 +- src/lib/components/barChart.svelte | 93 ++++++++++++++++++++++++++++++ src/routes/+page.svelte | 25 +++++++- src/types/graphType.ts | 1 + 6 files changed, 152 insertions(+), 28 deletions(-) create mode 100644 src/lib/components/barChart.svelte create mode 100644 src/types/graphType.ts diff --git a/package-lock.json b/package-lock.json index 4c8d2f5..ea9cbec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,9 @@ "name": "hardware-monitor", "version": "0.0.1", "dependencies": { - "@tauri-apps/api": "^1.5.6" + "@tauri-apps/api": "^1.5.6", + "chart.js": "^4.4.3", + "svelte-chartjs": "^3.1.5" }, "devDependencies": { "@biomejs/biome": "1.7.3", @@ -31,7 +33,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -620,7 +621,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -635,7 +635,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -645,7 +644,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -655,20 +653,24 @@ "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==", + "license": "MIT" + }, "node_modules/@neoconfetti/svelte": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@neoconfetti/svelte/-/svelte-1.0.0.tgz", @@ -1274,7 +1276,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, "license": "MIT" }, "node_modules/@types/pug": { @@ -1362,7 +1363,6 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -1412,7 +1412,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, "license": "Apache-2.0", "dependencies": { "dequal": "^2.0.3" @@ -1432,7 +1431,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", - "dev": true, "license": "Apache-2.0", "dependencies": { "dequal": "^2.0.3" @@ -1531,6 +1529,18 @@ "node": ">=4" } }, + "node_modules/chart.js": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz", + "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, "node_modules/check-error": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", @@ -1573,7 +1583,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", @@ -1626,7 +1635,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, "license": "MIT", "dependencies": { "mdn-data": "2.0.30", @@ -1681,7 +1689,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -1771,7 +1778,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -2049,7 +2055,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "*" @@ -2113,7 +2118,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true, "license": "MIT" }, "node_modules/loupe": { @@ -2130,7 +2134,6 @@ "version": "0.30.10", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -2140,7 +2143,6 @@ "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true, "license": "CC0-1.0" }, "node_modules/merge-stream": { @@ -2427,7 +2429,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -2758,7 +2759,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -2821,7 +2821,6 @@ "version": "4.2.17", "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.17.tgz", "integrity": "sha512-N7m1YnoXtRf5wya5Gyx3TWuTddI4nAyayyIWFojiWV5IayDYNV5i2mRp/7qNGol4DtxEYxljmrbgp1HM6hUbmQ==", - "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.1", @@ -2843,6 +2842,16 @@ "node": ">=16" } }, + "node_modules/svelte-chartjs": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/svelte-chartjs/-/svelte-chartjs-3.1.5.tgz", + "integrity": "sha512-ka2zh7v5FiwfAX1oMflZ0HkNkgjHjFqANgRyC+vNYXfxtx2ku68Zo+2KgbKeBH2nS1ThDqkIACPzGxy4T0UaoA==", + "license": "MIT", + "peerDependencies": { + "chart.js": "^3.5.0 || ^4.0.0", + "svelte": "^4.0.0" + } + }, "node_modules/svelte-check": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.8.0.tgz", diff --git a/package.json b/package.json index 220a4ec..8866876 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,8 @@ }, "type": "module", "dependencies": { - "@tauri-apps/api": "^1.5.6" + "@tauri-apps/api": "^1.5.6", + "chart.js": "^4.4.3", + "svelte-chartjs": "^3.1.5" } } diff --git a/src-tauri/src/get_hardware_data.rs b/src-tauri/src/get_hardware_data.rs index 3f7954b..5674d2c 100644 --- a/src-tauri/src/get_hardware_data.rs +++ b/src-tauri/src/get_hardware_data.rs @@ -99,13 +99,13 @@ pub fn initialize_system(system: Arc>, cpu_history: Arc + import { CategoryScale, Legend, LineElement, LinearScale, PointElement, Title, Tooltip } from 'chart.js'; + import type { ChartOptions } from 'chart.js'; + import Chart from 'chart.js/auto'; + import { onMount } from 'svelte'; + import { Line } from 'svelte-chartjs'; + import { getCpuMemoryHistory, getCpuUsageHistory } from '../../services/hardwareService'; + + Chart.register(CategoryScale, LinearScale, PointElement, LineElement, Title, Tooltip, Legend); + + let cpuData: number[] = []; + let memoryData: number[] = []; + let labels: string[] = []; + + async function fetchData() { + const seconds = 60; // 過去60秒のデータを取得 + const newCpuData = await getCpuUsageHistory(seconds); + const newMemoryData = await getCpuMemoryHistory(seconds); + + if (cpuData.length < seconds) { + // 初期データを順次追加 + cpuData = [...cpuData, newCpuData[newCpuData.length - 1]]; + memoryData = [...memoryData, newMemoryData[newMemoryData.length - 1]]; + labels = [...labels, ""]; + } else { + // 最大データ数に達したらシフト + cpuData = [...cpuData.slice(1), newCpuData[newCpuData.length - 1]]; + memoryData = [...memoryData.slice(1), newMemoryData[newMemoryData.length - 1]]; + labels = [...labels.slice(1), ""]; + } + } + + onMount(async () => { + await fetchData(); + setInterval(fetchData, 1000); // 1秒ごとにデータを更新 + }); + + const options: ChartOptions<'line'> = { + responsive: true, + animation: false, + scales: { + x: { + display: false, + }, + y: { + display: true, + suggestedMin: 0, + suggestedMax: 100, + }, + }, + }; + + $: cpuChartData = { + labels, + datasets: [ + { + label: 'CPU Usage (%)', + data: cpuData, + borderColor: 'rgb(75, 192, 192)', + fill: false, + pointRadius: 0, + pointHoverRadius: 0, + }, + ], + }; + + $: memoryChartData = { + labels, + datasets: [ + { + label: 'Memory Usage (%)', + data: memoryData, + borderColor: 'rgb(255, 99, 132)', + fill: false, + pointRadius: 0, + pointHoverRadius: 0, + }, + ], + }; + + + + +
    + + +
    diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index cf6d549..3238dcb 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,6 +1,25 @@ - +type ButtonState = 'chart' | 'raw' + +let buttonState: ButtonState = 'chart'; + +const handleShowData = () => { + buttonState = buttonState === "raw" ? "chart" : "raw"; +}; + + - +
    +

    Hardware Monitor Prot

    +
    + +
    + {#if buttonState === "raw"} + + {:else} + + {/if} +
    diff --git a/src/types/graphType.ts b/src/types/graphType.ts new file mode 100644 index 0000000..d2d8a1a --- /dev/null +++ b/src/types/graphType.ts @@ -0,0 +1 @@ +export type HardGraphType = "line" | "bar" | "doughnut"; From 1e677897069be242f6467e3d1fe9674b35c2c3e9 Mon Sep 17 00:00:00 2001 From: shm Date: Sun, 9 Jun 2024 01:11:28 +0900 Subject: [PATCH 10/35] =?UTF-8?q?fix:=20config=20=E5=91=A8=E3=82=8A?= =?UTF-8?q?=E3=81=AE=E8=A6=8B=E7=9B=B4=E3=81=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/components/sample.svelte | 2 +- svelte.config.js | 22 +++++++++++++--------- tsconfig.json | 6 +----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/lib/components/sample.svelte b/src/lib/components/sample.svelte index 09f1c01..faedb95 100644 --- a/src/lib/components/sample.svelte +++ b/src/lib/components/sample.svelte @@ -1,6 +1,6 @@
    -

    Hardware Monitor Prot

    +

    Hardware Monitor Proto

    From 3a90191355f32018f60f1adef15f3b8f2e6e9766 Mon Sep 17 00:00:00 2001 From: shm Date: Sun, 9 Jun 2024 01:15:05 +0900 Subject: [PATCH 12/35] =?UTF-8?q?chore:=20GH=20Actions=20=E3=81=AE?= =?UTF-8?q?=E3=82=A2=E3=83=97=E3=83=AA=E5=90=8D=E3=82=92=E4=BB=AE=E3=81=AE?= =?UTF-8?q?=E3=82=82=E3=81=AE=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 179ade6..25a4fd4 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -49,7 +49,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tagName: app-v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version. - releaseName: "App v__VERSION__" + releaseName: "Hardware Monitor v__VERSION__" releaseBody: "See the assets to download this version and install." releaseDraft: true prerelease: false From b2792739058b038d9dc99a1f07bcc67b76af1ae3 Mon Sep 17 00:00:00 2001 From: shm Date: Sun, 9 Jun 2024 01:20:40 +0900 Subject: [PATCH 13/35] =?UTF-8?q?fix:=20=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E5=90=8D=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/components/{barChart.svelte => lineChart.svelte} | 0 src/routes/+page.svelte | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/lib/components/{barChart.svelte => lineChart.svelte} (100%) diff --git a/src/lib/components/barChart.svelte b/src/lib/components/lineChart.svelte similarity index 100% rename from src/lib/components/barChart.svelte rename to src/lib/components/lineChart.svelte diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index a52e20e..5a3fedd 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,5 +1,5 @@ - -
    - - - -
    diff --git a/src/lib/components/sample.svelte b/src/lib/components/sample.svelte deleted file mode 100644 index 8bfd684..0000000 --- a/src/lib/components/sample.svelte +++ /dev/null @@ -1,67 +0,0 @@ - - -
    -

    CPU: {cpuUsage}%

    -

    MEMORY: {memoryUsage}%

    -

    GPU: {gpuUsage}%

    -

    {theme.value}

    - -
    -

    CPU History

    -

    Count: {cpuHistory.length}

    -
      - {#each cpuHistory as item} -
    • {item}
    • - {/each} -
    -

    MEMORY History

    -

    Count: {memoryHistory.length}

    -
      - {#each memoryHistory as item} -
    • {item}
    • - {/each} -
    -

    GPU History

    -

    Count: {gpuHistory.length}

    -
      - {#each gpuHistory as item} -
    • {item}
    • - {/each} -
    -
    -
    diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..c08eb09 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,9 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App"; + +ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( + + + , +); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte deleted file mode 100644 index de57e94..0000000 --- a/src/routes/+layout.svelte +++ /dev/null @@ -1,6 +0,0 @@ -
    -
    - -
    -
    - diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte deleted file mode 100644 index 5a3fedd..0000000 --- a/src/routes/+page.svelte +++ /dev/null @@ -1,25 +0,0 @@ - - -
    -

    Hardware Monitor Proto

    -
    - -
    - {#if buttonState === "raw"} - - {:else} - - {/if} -
    diff --git a/src/routes/+page.ts b/src/routes/+page.ts deleted file mode 100644 index b29c487..0000000 --- a/src/routes/+page.ts +++ /dev/null @@ -1,5 +0,0 @@ -// since there's no dynamic data here, we can prerender -// it so that it gets served as a static asset in production -export const prerender = true; - -export const ssr = false; diff --git a/src/types/graphType.ts b/src/types/graphType.ts deleted file mode 100644 index d2d8a1a..0000000 --- a/src/types/graphType.ts +++ /dev/null @@ -1 +0,0 @@ -export type HardGraphType = "line" | "bar" | "doughnut"; diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/svelte.config.js b/svelte.config.js deleted file mode 100644 index 9c56360..0000000 --- a/svelte.config.js +++ /dev/null @@ -1,21 +0,0 @@ -import adapter from "@sveltejs/adapter-static"; -import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; - -/** @type {import('@sveltejs/kit').Config} */ -const config = { - // Consult https://kit.svelte.dev/docs/integrations#preprocessors - // for more information about preprocessors - preprocess: vitePreprocess(), - - kit: { - adapter: adapter({ - fallback: "index.html", - }), - alias: { - "$@/": "./src", - "$@/*": "./src/*", - }, - }, -}; - -export default config; diff --git a/tsconfig.json b/tsconfig.json index 593dc19..a7fc6fb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,19 +1,25 @@ { - "extends": "./.svelte-kit/tsconfig.json", "compilerOptions": { - "allowJs": true, - "checkJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", "skipLibCheck": true, - "sourceMap": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ "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 + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts index 37b6a84..e1eb191 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,9 +1,21 @@ -import { sveltekit } from '@sveltejs/kit/vite'; -import { defineConfig } from 'vitest/config'; +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; -export default defineConfig({ - plugins: [sveltekit()], - test: { - include: ['src/**/*.{test,spec}.{js,ts}'] - } -}); +// https://vitejs.dev/config/ +export default defineConfig(async () => ({ + plugins: [react()], + + // 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: 1520, + strictPort: true, + watch: { + // 3. tell vite to ignore watching `src-tauri` + ignored: ["**/src-tauri/**"], + }, + }, +})); From 203954a554a548b1c7da4a31cfc5286e60771065 Mon Sep 17 00:00:00 2001 From: shm Date: Sat, 24 Aug 2024 17:45:09 +0900 Subject: [PATCH 20/35] add: plugin_window_state --- src-tauri/Cargo.lock | 173 +++++++++++++++++++++-------- src-tauri/Cargo.toml | 5 +- src-tauri/src/get_hardware_data.rs | 2 +- src-tauri/src/main.rs | 1 + src-tauri/tauri.conf.json | 4 +- 5 files changed, 131 insertions(+), 54 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 8ebc421..67599ee 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -71,7 +71,8 @@ dependencies = [ "sysinfo", "tauri", "tauri-build", - "windows 0.57.0", + "tauri-plugin-window-state", + "windows 0.58.0", ] [[package]] @@ -137,6 +138,15 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -311,7 +321,7 @@ dependencies = [ "iana-time-zone", "num-traits", "serde", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -1742,7 +1752,7 @@ dependencies = [ "libc", "redox_syscall 0.5.1", "smallvec", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -2545,17 +2555,16 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.30.12" +version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "732ffa00f53e6b2af46208fba5718d9662a421049204e156328b66791ffa15ae" +checksum = "2b92e0bdf838cbc1c4c9ba14f9c97a7ec6cdcd1ae66b10e1e42775a25553f45d" dependencies = [ - "cfg-if", "core-foundation-sys", "libc", + "memchr", "ntapi", - "once_cell", "rayon", - "windows 0.52.0", + "windows 0.57.0", ] [[package]] @@ -2764,6 +2773,20 @@ dependencies = [ "tauri-utils", ] +[[package]] +name = "tauri-plugin-window-state" +version = "0.1.1" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#677bade9089f2963e5858cc5062e5504787eaf7f" +dependencies = [ + "bincode", + "bitflags 2.5.0", + "log", + "serde", + "serde_json", + "tauri", + "thiserror", +] + [[package]] name = "tauri-runtime" version = "0.14.3" @@ -3412,22 +3435,22 @@ dependencies = [ [[package]] name = "windows" -version = "0.52.0" +version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" dependencies = [ - "windows-core 0.52.0", - "windows-targets 0.52.5", + "windows-core 0.57.0", + "windows-targets 0.52.6", ] [[package]] name = "windows" -version = "0.57.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-core 0.57.0", - "windows-targets 0.52.5", + "windows-core 0.58.0", + "windows-targets 0.52.6", ] [[package]] @@ -3446,7 +3469,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -3456,9 +3479,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" dependencies = [ "windows-implement 0.57.0", - "windows-interface", - "windows-result", - "windows-targets 0.52.5", + "windows-interface 0.57.0", + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings", + "windows-targets 0.52.6", ] [[package]] @@ -3482,6 +3518,17 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "windows-interface" version = "0.57.0" @@ -3493,6 +3540,17 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "windows-metadata" version = "0.39.0" @@ -3505,7 +3563,26 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets 0.52.6", ] [[package]] @@ -3523,7 +3600,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -3543,18 +3620,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -3569,7 +3646,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -3580,9 +3657,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -3598,9 +3675,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -3616,15 +3693,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -3640,9 +3717,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -3658,9 +3735,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -3670,9 +3747,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -3688,9 +3765,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 12e3219..558b4c5 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -18,7 +18,8 @@ tauri-build = { version = "1.5.2", features = [] } serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } tauri = { version = "1.6.5", features = [] } -sysinfo = "0.30.12" +sysinfo = "0.31.3" +tauri-plugin-window-state = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" } [features] # this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled. @@ -27,7 +28,7 @@ sysinfo = "0.30.12" custom-protocol = [ "tauri/custom-protocol" ] [dependencies.windows] -version = "0.57.0" +version = "0.58.0" features = [ "Data_Xml_Dom", "Win32_Foundation", diff --git a/src-tauri/src/get_hardware_data.rs b/src-tauri/src/get_hardware_data.rs index a9ed1b5..49864b7 100644 --- a/src-tauri/src/get_hardware_data.rs +++ b/src-tauri/src/get_hardware_data.rs @@ -135,7 +135,7 @@ pub fn initialize_system( Err(_) => continue, // エラーハンドリング:ロックが破損している場合はスキップ }; - sys.refresh_cpu(); + sys.refresh_cpu_all(); sys.refresh_memory(); let cpu_usage = { diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 518181b..ff2e6a1 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -34,6 +34,7 @@ fn main() { initialize_system(system, cpu_history, memory_history, gpu_usage, gpu_history); tauri::Builder::default() + .plugin(tauri_plugin_window_state::Builder::default().build()) .manage(state) .invoke_handler(tauri::generate_handler![ get_cpu_usage, diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 31af26d..b5e9038 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -58,11 +58,9 @@ }, "windows": [ { - "fullscreen": false, - "height": 600, "resizable": true, "title": "hardware-monitor", - "width": 800 + "decorations": true } ] } From 144126886831822ab229978cf53750c997caaec0 Mon Sep 17 00:00:00 2001 From: shm Date: Sat, 24 Aug 2024 18:04:05 +0900 Subject: [PATCH 21/35] =?UTF-8?q?refactor:=20=E6=9C=AA=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E3=81=AE=E3=82=B3=E3=83=BC=E3=83=89=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/get_hardware_data.rs | 2 +- src/App.css | 116 ----------------------------- 2 files changed, 1 insertion(+), 117 deletions(-) delete mode 100644 src/App.css diff --git a/src-tauri/src/get_hardware_data.rs b/src-tauri/src/get_hardware_data.rs index 49864b7..43cc1ce 100644 --- a/src-tauri/src/get_hardware_data.rs +++ b/src-tauri/src/get_hardware_data.rs @@ -5,7 +5,7 @@ use std::process; use std::sync::{Arc, Mutex}; use std::thread; use std::time::Duration; -use sysinfo::{Components, System}; +use sysinfo::System; use tauri::command; pub struct AppState { diff --git a/src/App.css b/src/App.css deleted file mode 100644 index 85f7a4a..0000000 --- a/src/App.css +++ /dev/null @@ -1,116 +0,0 @@ -.logo.vite:hover { - filter: drop-shadow(0 0 2em #747bff); -} - -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafb); -} -:root { - font-family: Inter, Avenir, Helvetica, Arial, sans-serif; - font-size: 16px; - line-height: 24px; - font-weight: 400; - - color: #0f0f0f; - background-color: #f6f6f6; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -.container { - margin: 0; - padding-top: 10vh; - display: flex; - flex-direction: column; - justify-content: center; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: 0.75s; -} - -.logo.tauri:hover { - filter: drop-shadow(0 0 2em #24c8db); -} - -.row { - display: flex; - justify-content: center; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} - -a:hover { - color: #535bf2; -} - -h1 { - text-align: center; -} - -input, -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); -} - -button { - cursor: pointer; -} - -button:hover { - border-color: #396cd8; -} -button:active { - border-color: #396cd8; - background-color: #e8e8e8; -} - -input, -button { - outline: none; -} - -#greet-input { - margin-right: 5px; -} - -@media (prefers-color-scheme: dark) { - :root { - color: #f6f6f6; - background-color: #2f2f2f; - } - - a:hover { - color: #24c8db; - } - - input, - button { - color: #ffffff; - background-color: #0f0f0f98; - } - button:active { - background-color: #0f0f0f69; - } -} From d2240a8f65c37e3c9e233281f410b8bb0a8f9047 Mon Sep 17 00:00:00 2001 From: shm Date: Sat, 24 Aug 2024 18:23:54 +0900 Subject: [PATCH 22/35] =?UTF-8?q?refactor:=20LineChart=20=E3=81=AE?= =?UTF-8?q?=E5=88=86=E5=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 4 +- src/components/LineChart.tsx | 128 ++++++++++++++--------------------- src/template/Chart.tsx | 51 ++++++++++++++ src/types/chartType.ts | 1 + 4 files changed, 103 insertions(+), 81 deletions(-) create mode 100644 src/template/Chart.tsx create mode 100644 src/types/chartType.ts diff --git a/src/App.tsx b/src/App.tsx index 347f5ed..fe2e00a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,6 @@ import { useState } from "react"; -import Chart from "./components/LineChart"; import TestTemplate from "./components/Sample"; +import ChartTemplate from "./template/Chart"; type ButtonState = "chart" | "raw"; @@ -19,7 +19,7 @@ const Page = () => { {buttonState === "chart" ? "Show Raw Data" : "Show Chart Sample"}
    - {buttonState === "raw" ? : } + {buttonState === "raw" ? : }
); }; diff --git a/src/components/LineChart.tsx b/src/components/LineChart.tsx index d625cfe..e4bdca1 100644 --- a/src/components/LineChart.tsx +++ b/src/components/LineChart.tsx @@ -9,13 +9,9 @@ import { Title, Tooltip, } from "chart.js"; -import { useEffect, useState } from "react"; +import type { ChartData } from "chart.js"; import { Line } from "react-chartjs-2"; -import { - getCpuMemoryHistory, - getCpuUsageHistory, - getGpuUsageHistory, -} from "../services/hardwareService"; +import type { ChartDataType } from "../types/chartType"; ChartJS.register( CategoryScale, @@ -27,39 +23,15 @@ ChartJS.register( Legend, ); -const LineChart = () => { - const [cpuData, setCpuData] = useState([]); - const [memoryData, setMemoryData] = useState([]); - const [gpuData, setGpuData] = useState([]); - const [labels, setLabels] = useState([]); - - useEffect(() => { - const fetchData = async () => { - const seconds = 60; - const newCpuData = await getCpuUsageHistory(seconds); - const newMemoryData = await getCpuMemoryHistory(seconds); - const newGpuData = await getGpuUsageHistory(seconds); - - if (cpuData.length < seconds) { - setCpuData([...cpuData, newCpuData[newCpuData.length - 1]]); - setMemoryData([...memoryData, newMemoryData[newMemoryData.length - 1]]); - setGpuData([...gpuData, newGpuData[newGpuData.length - 1]]); - setLabels([...labels, ""]); - } else { - setCpuData([...cpuData.slice(1), newCpuData[newCpuData.length - 1]]); - setMemoryData([ - ...memoryData.slice(1), - newMemoryData[newMemoryData.length - 1], - ]); - setGpuData([...gpuData.slice(1), newGpuData[newGpuData.length - 1]]); - setLabels([...labels.slice(1), ""]); - } - }; - - const interval = setInterval(fetchData, 1000); - return () => clearInterval(interval); - }, [cpuData, memoryData, gpuData, labels]); - +const LineChart = ({ + labels, + chartData, + dataType, +}: { + labels: string[]; + chartData: number[]; + dataType: ChartDataType; +}) => { const options: ChartOptions<"line"> = { responsive: true, animation: false, @@ -87,50 +59,48 @@ const LineChart = () => { }, }; - const cpuChartData = { - labels, - datasets: [ - { - label: "CPU Usage (%)", - data: cpuData, - borderColor: "rgb(75, 192, 192)", - backgroundColor: "rgba(75, 192, 192, 0.3)", - fill: true, - }, - ], - }; - - const memoryChartData = { - labels, - datasets: [ - { - label: "Memory Usage (%)", - data: memoryData, - borderColor: "rgb(255, 99, 132)", - backgroundColor: "rgba(255, 99, 132, 0.3)", - fill: true, - }, - ], - }; - - const gpuChartData = { - labels, - datasets: [ - { - label: "GPU Usage (%)", - data: gpuData, - borderColor: "rgb(255, 206, 86)", - backgroundColor: "rgba(255, 206, 86, 0.3)", - fill: true, - }, - ], + const data: Record> = { + cpu: { + labels, + datasets: [ + { + label: "CPU Usage (%)", + data: chartData, + borderColor: "rgb(75, 192, 192)", + backgroundColor: "rgba(75, 192, 192, 0.3)", + fill: true, + }, + ], + }, + memory: { + labels, + datasets: [ + { + label: "Memory Usage (%)", + data: chartData, + borderColor: "rgb(255, 99, 132)", + backgroundColor: "rgba(255, 99, 132, 0.3)", + fill: true, + }, + ], + }, + gpu: { + labels, + datasets: [ + { + label: "GPU Usage (%)", + data: chartData, + borderColor: "rgb(255, 206, 86)", + backgroundColor: "rgba(255, 206, 86, 0.3)", + fill: true, + }, + ], + }, }; return (
- - - +
); }; diff --git a/src/template/Chart.tsx b/src/template/Chart.tsx new file mode 100644 index 0000000..f3b57a4 --- /dev/null +++ b/src/template/Chart.tsx @@ -0,0 +1,51 @@ +import { useEffect, useState } from "react"; +import LineChart from "../components/LineChart"; +import { + getCpuMemoryHistory, + getCpuUsageHistory, + getGpuUsageHistory, +} from "../services/hardwareService"; + +const ChartTemplate = () => { + const [cpuData, setCpuData] = useState([]); + const [memoryData, setMemoryData] = useState([]); + const [gpuData, setGpuData] = useState([]); + const [labels, setLabels] = useState([]); + + useEffect(() => { + const fetchData = async () => { + const seconds = 60; + const newCpuData = await getCpuUsageHistory(seconds); + const newMemoryData = await getCpuMemoryHistory(seconds); + const newGpuData = await getGpuUsageHistory(seconds); + + if (cpuData.length < seconds) { + setCpuData([...cpuData, newCpuData[newCpuData.length - 1]]); + setMemoryData([...memoryData, newMemoryData[newMemoryData.length - 1]]); + setGpuData([...gpuData, newGpuData[newGpuData.length - 1]]); + setLabels([...labels, ""]); + } else { + setCpuData([...cpuData.slice(1), newCpuData[newCpuData.length - 1]]); + setMemoryData([ + ...memoryData.slice(1), + newMemoryData[newMemoryData.length - 1], + ]); + setGpuData([...gpuData.slice(1), newGpuData[newGpuData.length - 1]]); + setLabels([...labels.slice(1), ""]); + } + }; + + const interval = setInterval(fetchData, 1000); + return () => clearInterval(interval); + }, [cpuData, memoryData, gpuData, labels]); + + return ( +
+ + + +
+ ); +}; + +export default ChartTemplate; diff --git a/src/types/chartType.ts b/src/types/chartType.ts new file mode 100644 index 0000000..74f5da6 --- /dev/null +++ b/src/types/chartType.ts @@ -0,0 +1 @@ +export type ChartDataType = "cpu" | "memory" | "gpu"; From 75de23a123b21c7941a8aabfc91b61458b5cf2dc Mon Sep 17 00:00:00 2001 From: shm Date: Sat, 24 Aug 2024 18:58:39 +0900 Subject: [PATCH 23/35] =?UTF-8?q?update:=20=E5=87=A1=E4=BE=8B=E3=82=92?= =?UTF-8?q?=E3=82=AB=E3=82=B9=E3=82=BF=E3=83=9E=E3=82=A4=E3=82=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 14 ++++++++++++++ package.json | 1 + src/components/CustomLegend.tsx | 25 +++++++++++++++++++++++++ src/components/LineChart.tsx | 30 +++++++++++++++++++++++++++--- 4 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 src/components/CustomLegend.tsx diff --git a/package-lock.json b/package-lock.json index 4b32a1f..9d877a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "hardware-monitor", "version": "0.0.1", "dependencies": { + "@phosphor-icons/react": "^2.1.7", "@tauri-apps/api": "^1", "chart.js": "^4.4.4", "react": "^18.3.1", @@ -975,6 +976,19 @@ "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==", "license": "MIT" }, + "node_modules/@phosphor-icons/react": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@phosphor-icons/react/-/react-2.1.7.tgz", + "integrity": "sha512-g2e2eVAn1XG2a+LI09QU3IORLhnFNAFkNbo2iwbX6NOKSLOwvEMmTa7CgOzEbgNWR47z8i8kwjdvYZ5fkGx1mQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">= 16.8", + "react-dom": ">= 16.8" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz", diff --git a/package.json b/package.json index 2c7b9c2..e8b6349 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "vitest": "^1.2.0" }, "dependencies": { + "@phosphor-icons/react": "^2.1.7", "@tauri-apps/api": "^1", "chart.js": "^4.4.4", "react": "^18.3.1", diff --git a/src/components/CustomLegend.tsx b/src/components/CustomLegend.tsx new file mode 100644 index 0000000..08140c5 --- /dev/null +++ b/src/components/CustomLegend.tsx @@ -0,0 +1,25 @@ +export type LegendItem = { + label: string; + icon: JSX.Element; + datasetIndex: number; +}; + +const CustomLegend = ({ + item, +}: { + item: LegendItem; +}) => { + return ( +
+
+ {item.icon} + {item.label} +
+
+ ); +}; + +export default CustomLegend; diff --git a/src/components/LineChart.tsx b/src/components/LineChart.tsx index e4bdca1..c6494d4 100644 --- a/src/components/LineChart.tsx +++ b/src/components/LineChart.tsx @@ -1,3 +1,4 @@ +import { Cpu, GraphicsCard, Memory } from "@phosphor-icons/react"; import { CategoryScale, Chart as ChartJS, @@ -9,9 +10,11 @@ import { Title, Tooltip, } from "chart.js"; -import type { ChartData } from "chart.js"; +import type { Chart, ChartData } from "chart.js"; +import { useRef } from "react"; import { Line } from "react-chartjs-2"; import type { ChartDataType } from "../types/chartType"; +import CustomLegend, { type LegendItem } from "./CustomLegend"; ChartJS.register( CategoryScale, @@ -32,6 +35,8 @@ const LineChart = ({ chartData: number[]; dataType: ChartDataType; }) => { + const chartRef = useRef>(null); + const options: ChartOptions<"line"> = { responsive: true, animation: false, @@ -50,7 +55,7 @@ const LineChart = ({ line: { tension: 0.4 }, }, plugins: { - legend: { display: true, labels: { color: "#fff" } }, + legend: { display: false }, tooltip: { backgroundColor: "rgba(0, 0, 0, 0.7)", titleColor: "#fff", @@ -98,9 +103,28 @@ const LineChart = ({ }, }; + const legendItems: Record = { + cpu: { + label: "CPU Usage", + icon: , + datasetIndex: 0, + }, + memory: { + label: "Memory Usage", + icon: , + datasetIndex: 1, + }, + gpu: { + label: "GPU Usage", + icon: , + datasetIndex: 2, + }, + }; + return (
- + +
); }; From 25a8646acfdf6e9a06ca33a0aef6414da29db2d9 Mon Sep 17 00:00:00 2001 From: shm Date: Sat, 24 Aug 2024 19:14:47 +0900 Subject: [PATCH 24/35] add tailwind --- package-lock.json | 1344 +++++++++++++++++++++++++++++++++- package.json | 3 + postcss.config.js | 6 + src/App.tsx | 1 + src/components/LineChart.tsx | 20 +- src/index.css | 3 + tailwind.config.js | 8 + 7 files changed, 1377 insertions(+), 8 deletions(-) create mode 100644 postcss.config.js create mode 100644 src/index.css create mode 100644 tailwind.config.js diff --git a/package-lock.json b/package-lock.json index 9d877a4..9d023ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,11 +21,27 @@ "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.41", + "tailwindcss": "^3.4.10", "typescript": "^5.2.2", "vite": "^5.3.1", "vitest": "^1.2.0" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -904,6 +920,24 @@ "node": ">=12" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -976,6 +1010,44 @@ "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==", "license": "MIT" }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@phosphor-icons/react": { "version": "2.1.7", "resolved": "https://registry.npmjs.org/@phosphor-icons/react/-/react-2.1.7.tgz", @@ -989,6 +1061,17 @@ "react-dom": ">= 16.8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz", @@ -1631,6 +1714,19 @@ "node": ">=0.4.0" } }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -1644,6 +1740,34 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -1654,6 +1778,87 @@ "node": "*" } }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browserslist": { "version": "4.23.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", @@ -1697,6 +1902,16 @@ "node": ">=8" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001651", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", @@ -1790,6 +2005,44 @@ "node": "*" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1807,6 +2060,16 @@ "dev": true, "license": "MIT" }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/confbox": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", @@ -1836,6 +2099,19 @@ "node": ">= 8" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -1874,6 +2150,13 @@ "node": ">=6" } }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -1884,6 +2167,20 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.13", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", @@ -1891,6 +2188,13 @@ "dev": true, "license": "ISC" }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -1984,6 +2288,90 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1999,6 +2387,16 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2032,6 +2430,40 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -2052,6 +2484,19 @@ "node": ">=4" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", @@ -2062,10 +2507,82 @@ "node": ">=16.17.0" } }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", "engines": { @@ -2082,6 +2599,32 @@ "dev": true, "license": "ISC" }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-tokens": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", @@ -2115,6 +2658,23 @@ "node": ">=6" } }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/local-pkg": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", @@ -2185,6 +2745,30 @@ "dev": true, "license": "MIT" }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", @@ -2198,6 +2782,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mlly": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.0.tgz", @@ -2218,6 +2828,18 @@ "dev": true, "license": "MIT" }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -2244,6 +2866,26 @@ "dev": true, "license": "MIT" }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/npm-run-path": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", @@ -2273,6 +2915,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", @@ -2305,6 +2967,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -2315,6 +2984,37 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/pathe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", @@ -2339,6 +3039,39 @@ "dev": true, "license": "ISC" }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/pkg-types": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz", @@ -2380,6 +3113,140 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -2395,6 +3262,27 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -2445,6 +3333,58 @@ "node": ">=0.10.0" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rollup": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz", @@ -2481,6 +3421,30 @@ "fsevents": "~2.3.2" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -2566,6 +3530,110 @@ "dev": true, "license": "MIT" }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -2592,6 +3660,29 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -2605,6 +3696,80 @@ "node": ">=4" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz", + "integrity": "sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/tinybench": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", @@ -2642,6 +3807,26 @@ "node": ">=4" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -2704,6 +3889,13 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, "node_modules/vite": { "version": "5.4.2", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz", @@ -2886,6 +4078,137 @@ "node": ">=8" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -2893,6 +4216,19 @@ "dev": true, "license": "ISC" }, + "node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/yocto-queue": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", diff --git a/package.json b/package.json index e8b6349..4c0f280 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,9 @@ "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.41", + "tailwindcss": "^3.4.10", "typescript": "^5.2.2", "vite": "^5.3.1", "vitest": "^1.2.0" diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/src/App.tsx b/src/App.tsx index fe2e00a..e3fc9b6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,7 @@ import { useState } from "react"; import TestTemplate from "./components/Sample"; import ChartTemplate from "./template/Chart"; +import "./index.css"; type ButtonState = "chart" | "raw"; diff --git a/src/components/LineChart.tsx b/src/components/LineChart.tsx index c6494d4..14cd87c 100644 --- a/src/components/LineChart.tsx +++ b/src/components/LineChart.tsx @@ -106,17 +106,27 @@ const LineChart = ({ const legendItems: Record = { cpu: { label: "CPU Usage", - icon: , + icon: ( + + ), datasetIndex: 0, }, memory: { label: "Memory Usage", - icon: , + icon: ( + + ), datasetIndex: 1, }, gpu: { label: "GPU Usage", - icon: , + icon: ( + + ), datasetIndex: 2, }, }; @@ -124,7 +134,9 @@ const LineChart = ({ return (
- +
+ +
); }; diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/src/index.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..4ff1efb --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./src/**/*.{js,jsx,ts,tsx}"], + theme: { + extend: {}, + }, + plugins: [], +}; From 69b7fb7b25a162692d35d31a1a9a63d1c21a8e2f Mon Sep 17 00:00:00 2001 From: shm Date: Sat, 24 Aug 2024 19:40:45 +0900 Subject: [PATCH 25/35] refactor: `src-tauri` --- .../src/{ => commands}/get_hardware_data.rs | 2 ++ .../src/{ => commands}/get_setting_data.rs | 0 src-tauri/src/commands/mod.rs | 3 ++ .../src/{ => commands}/windows_service.rs | 0 src-tauri/src/main.rs | 36 +++++++++---------- 5 files changed, 23 insertions(+), 18 deletions(-) rename src-tauri/src/{ => commands}/get_hardware_data.rs (99%) rename src-tauri/src/{ => commands}/get_setting_data.rs (100%) create mode 100644 src-tauri/src/commands/mod.rs rename src-tauri/src/{ => commands}/windows_service.rs (100%) diff --git a/src-tauri/src/get_hardware_data.rs b/src-tauri/src/commands/get_hardware_data.rs similarity index 99% rename from src-tauri/src/get_hardware_data.rs rename to src-tauri/src/commands/get_hardware_data.rs index 43cc1ce..d503c08 100644 --- a/src-tauri/src/get_hardware_data.rs +++ b/src-tauri/src/commands/get_hardware_data.rs @@ -8,6 +8,8 @@ use std::time::Duration; use sysinfo::System; use tauri::command; +//pub mod hardware_data; + pub struct AppState { pub system: Arc>, pub cpu_history: Arc>>, diff --git a/src-tauri/src/get_setting_data.rs b/src-tauri/src/commands/get_setting_data.rs similarity index 100% rename from src-tauri/src/get_setting_data.rs rename to src-tauri/src/commands/get_setting_data.rs diff --git a/src-tauri/src/commands/mod.rs b/src-tauri/src/commands/mod.rs new file mode 100644 index 0000000..d1e1019 --- /dev/null +++ b/src-tauri/src/commands/mod.rs @@ -0,0 +1,3 @@ +pub mod get_hardware_data; +pub mod get_setting_data; +pub mod windows_service; diff --git a/src-tauri/src/windows_service.rs b/src-tauri/src/commands/windows_service.rs similarity index 100% rename from src-tauri/src/windows_service.rs rename to src-tauri/src/commands/windows_service.rs diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index ff2e6a1..752b93d 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -1,16 +1,10 @@ // Prevents additional console window on Windows in release, DO NOT REMOVE!! #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] -mod get_hardware_data; -mod get_setting_data; -mod windows_service; +mod commands; -use get_hardware_data::{ - get_cpu_usage, get_cpu_usage_history, get_gpu_usage, get_gpu_usage_history, - get_memory_usage, get_memory_usage_history, initialize_system, AppState, -}; - -use get_setting_data::get_windows_theme_mode; +use commands::get_hardware_data; +use commands::get_setting_data; use std::collections::VecDeque; use std::sync::{Arc, Mutex}; @@ -23,7 +17,7 @@ fn main() { let gpu_usage = Arc::new(Mutex::new(0.0)); let gpu_history = Arc::new(Mutex::new(VecDeque::with_capacity(60))); - let state = AppState { + let state = get_hardware_data::AppState { system: Arc::clone(&system), cpu_history: Arc::clone(&cpu_history), memory_history: Arc::clone(&memory_history), @@ -31,19 +25,25 @@ fn main() { gpu_history: Arc::clone(&gpu_history), }; - initialize_system(system, cpu_history, memory_history, gpu_usage, gpu_history); + get_hardware_data::initialize_system( + system, + cpu_history, + memory_history, + gpu_usage, + gpu_history, + ); tauri::Builder::default() .plugin(tauri_plugin_window_state::Builder::default().build()) .manage(state) .invoke_handler(tauri::generate_handler![ - get_cpu_usage, - get_memory_usage, - get_gpu_usage, - get_cpu_usage_history, - get_memory_usage_history, - get_gpu_usage_history, - get_windows_theme_mode + get_hardware_data::get_cpu_usage, + get_hardware_data::get_memory_usage, + get_hardware_data::get_gpu_usage, + get_hardware_data::get_cpu_usage_history, + get_hardware_data::get_memory_usage_history, + get_hardware_data::get_gpu_usage_history, + get_setting_data::get_windows_theme_mode ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); From bc0f261675d12489926836f9e9d49b0ff4298241 Mon Sep 17 00:00:00 2001 From: shm Date: Sat, 24 Aug 2024 22:14:48 +0900 Subject: [PATCH 26/35] =?UTF-8?q?feat:=20=E7=8A=B6=E6=85=8B=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=A9=9F=E8=83=BD=E3=82=92=E3=83=90=E3=83=83=E3=82=AF?= =?UTF-8?q?=E3=82=A8=E3=83=B3=E3=83=89=E3=81=AB=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/commands/config.rs | 132 ++++++++++++++++++ src-tauri/src/commands/get_setting_data.rs | 13 -- .../{get_hardware_data.rs => hardware.rs} | 0 src-tauri/src/commands/mod.rs | 5 +- src-tauri/src/commands/windows_service.rs | 29 ---- src-tauri/src/enums/hardware.rs | 22 +++ src-tauri/src/enums/mod.rs | 1 + src-tauri/src/main.rs | 28 ++-- src-tauri/tauri.conf.json | 2 +- src/App.tsx | 10 +- src/components/Sample.tsx | 4 - src/services/settingService.ts | 4 +- 12 files changed, 186 insertions(+), 64 deletions(-) create mode 100644 src-tauri/src/commands/config.rs delete mode 100644 src-tauri/src/commands/get_setting_data.rs rename src-tauri/src/commands/{get_hardware_data.rs => hardware.rs} (100%) delete mode 100644 src-tauri/src/commands/windows_service.rs create mode 100644 src-tauri/src/enums/hardware.rs create mode 100644 src-tauri/src/enums/mod.rs diff --git a/src-tauri/src/commands/config.rs b/src-tauri/src/commands/config.rs new file mode 100644 index 0000000..b017a1b --- /dev/null +++ b/src-tauri/src/commands/config.rs @@ -0,0 +1,132 @@ +//use crate::enums::hardware::HardwareType; +use crate::enums::hardware; +use serde::{Deserialize, Serialize}; +use std::fs; +use std::io::Write; +use std::mem; +use std::path::PathBuf; +use std::sync::Mutex; +//use tauri::api::path::resolve_path; + +const SETTINGS_FILENAME: &str = "settings.json"; + +#[cfg(target_os = "windows")] +fn get_config_root() -> PathBuf { + let appdata = PathBuf::from(std::env::var("APPDATA").unwrap()); + appdata.join("shm11C3.HardwareMonitor") +} + +trait Config { + fn write_file(&self) {} + fn read_file(&mut self) {} +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Settings { + language: String, + theme: String, + display_targets: Vec, +} + +impl Default for Settings { + fn default() -> Self { + Self { + language: "en".to_string(), + theme: "dark".to_string(), + display_targets: vec![ + hardware::HardwareType::CPU, + hardware::HardwareType::Memory, + hardware::HardwareType::GPU, + ], + } + } +} + +impl Config for Settings { + fn write_file(&self) { + let config_file = get_config_root().join(SETTINGS_FILENAME); + if !config_file.parent().unwrap().exists() { + fs::create_dir_all(config_file.parent().unwrap()).unwrap(); + } + let serialized = serde_json::to_string(self).unwrap(); + let mut file = fs::File::create(config_file).unwrap(); + file.write_all(&serialized.as_bytes()).unwrap(); + } + + fn read_file(&mut self) { + let config_file = get_config_root().join(SETTINGS_FILENAME); + let input = fs::read_to_string(config_file).unwrap(); + let deserialized: Self = serde_json::from_str(&input).unwrap(); + let _ = mem::replace(self, deserialized); + } +} + +impl Settings { + pub fn new() -> Self { + let config_file = get_config_root().join(SETTINGS_FILENAME); + if !config_file.exists() { + Self::default() + } else { + let mut settings = Self::default(); + settings.read_file(); + settings + } + } + + pub fn set_language(&mut self, new_lang: String) { + self.language = new_lang; + self.write_file(); + println!("{:?}", self); + } + + pub fn set_theme(&mut self, new_theme: String) { + self.theme = new_theme; + self.write_file(); + println!("{:?}", self); + } +} + +#[derive(Debug)] +pub struct AppState { + settings: Mutex, +} + +impl AppState { + pub fn new() -> Self { + Self { + settings: Mutex::from(Settings::new()), + } + } +} + +pub mod commands { + use super::*; + + #[tauri::command] + pub async fn set_language( + state: tauri::State<'_, AppState>, + new_language: String, + ) -> Result<(), String> { + let mut settings = state.settings.lock().unwrap(); + settings.set_language(new_language); + Ok(()) + } + + #[tauri::command] + pub async fn set_theme( + state: tauri::State<'_, AppState>, + new_theme: String, + ) -> Result<(), String> { + let mut settings = state.settings.lock().unwrap(); + settings.set_theme(new_theme); + Ok(()) + } + + #[tauri::command] + pub async fn get_settings( + state: tauri::State<'_, AppState>, + ) -> Result { + let settings = state.settings.lock().unwrap().clone(); + Ok(settings) + } +} diff --git a/src-tauri/src/commands/get_setting_data.rs b/src-tauri/src/commands/get_setting_data.rs deleted file mode 100644 index 4a9a574..0000000 --- a/src-tauri/src/commands/get_setting_data.rs +++ /dev/null @@ -1,13 +0,0 @@ -#[path = "./windows_service.rs"] -mod windows_service; - -use tauri::command; -use windows_service::get_windows_theme; - -#[command] -pub fn get_windows_theme_mode() -> String { - match get_windows_theme() { - Ok(theme) => theme, - Err(_) => "Unknown".to_string(), - } -} diff --git a/src-tauri/src/commands/get_hardware_data.rs b/src-tauri/src/commands/hardware.rs similarity index 100% rename from src-tauri/src/commands/get_hardware_data.rs rename to src-tauri/src/commands/hardware.rs diff --git a/src-tauri/src/commands/mod.rs b/src-tauri/src/commands/mod.rs index d1e1019..2acb6bb 100644 --- a/src-tauri/src/commands/mod.rs +++ b/src-tauri/src/commands/mod.rs @@ -1,3 +1,2 @@ -pub mod get_hardware_data; -pub mod get_setting_data; -pub mod windows_service; +pub mod config; +pub mod hardware; diff --git a/src-tauri/src/commands/windows_service.rs b/src-tauri/src/commands/windows_service.rs deleted file mode 100644 index 22e9784..0000000 --- a/src-tauri/src/commands/windows_service.rs +++ /dev/null @@ -1,29 +0,0 @@ -use windows::{ - Win32::Foundation::BOOL, - Win32::UI::WindowsAndMessaging::{ - SystemParametersInfoA, SPI_GETCLIENTAREAANIMATION, - SYSTEM_PARAMETERS_INFO_UPDATE_FLAGS, - }, -}; - -pub fn get_windows_theme() -> Result { - let mut theme_mode: BOOL = BOOL(0); - unsafe { - let result = SystemParametersInfoA( - SPI_GETCLIENTAREAANIMATION, - 0, - Some(&mut theme_mode as *mut _ as *mut _), - SYSTEM_PARAMETERS_INFO_UPDATE_FLAGS(0), - ); - - if result.is_err() { - return Err(windows::core::Error::from_win32()); - } - } - let theme = if theme_mode.0 == 0 { - "Dark Mode" - } else { - "Light Mode" - }; - Ok(theme.to_string()) -} diff --git a/src-tauri/src/enums/hardware.rs b/src-tauri/src/enums/hardware.rs new file mode 100644 index 0000000..2fb1c34 --- /dev/null +++ b/src-tauri/src/enums/hardware.rs @@ -0,0 +1,22 @@ +use serde::{Deserialize, Serialize, Serializer}; + +#[derive(Debug, PartialEq, Eq, Clone, Deserialize)] +pub enum HardwareType { + CPU, + Memory, + GPU, +} + +impl Serialize for HardwareType { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + let s = match *self { + HardwareType::CPU => "cpu", + HardwareType::Memory => "memory", + HardwareType::GPU => "gpu", + }; + serializer.serialize_str(s) + } +} diff --git a/src-tauri/src/enums/mod.rs b/src-tauri/src/enums/mod.rs new file mode 100644 index 0000000..9c06cff --- /dev/null +++ b/src-tauri/src/enums/mod.rs @@ -0,0 +1 @@ +pub mod hardware; diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 752b93d..4a1841d 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -2,22 +2,25 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] mod commands; +mod enums; -use commands::get_hardware_data; -use commands::get_setting_data; +use commands::config; +use commands::hardware; use std::collections::VecDeque; use std::sync::{Arc, Mutex}; use sysinfo::System; fn main() { + let app_state = config::AppState::new(); + let system = Arc::new(Mutex::new(System::new_all())); let cpu_history = Arc::new(Mutex::new(VecDeque::with_capacity(60))); let memory_history = Arc::new(Mutex::new(VecDeque::with_capacity(60))); let gpu_usage = Arc::new(Mutex::new(0.0)); let gpu_history = Arc::new(Mutex::new(VecDeque::with_capacity(60))); - let state = get_hardware_data::AppState { + let state = hardware::AppState { system: Arc::clone(&system), cpu_history: Arc::clone(&cpu_history), memory_history: Arc::clone(&memory_history), @@ -25,7 +28,7 @@ fn main() { gpu_history: Arc::clone(&gpu_history), }; - get_hardware_data::initialize_system( + hardware::initialize_system( system, cpu_history, memory_history, @@ -36,14 +39,17 @@ fn main() { tauri::Builder::default() .plugin(tauri_plugin_window_state::Builder::default().build()) .manage(state) + .manage(app_state) .invoke_handler(tauri::generate_handler![ - get_hardware_data::get_cpu_usage, - get_hardware_data::get_memory_usage, - get_hardware_data::get_gpu_usage, - get_hardware_data::get_cpu_usage_history, - get_hardware_data::get_memory_usage_history, - get_hardware_data::get_gpu_usage_history, - get_setting_data::get_windows_theme_mode + hardware::get_cpu_usage, + hardware::get_memory_usage, + hardware::get_gpu_usage, + hardware::get_cpu_usage_history, + hardware::get_memory_usage_history, + hardware::get_gpu_usage_history, + config::commands::set_language, + config::commands::set_theme, + config::commands::get_settings ]) .run(tauri::generate_context!()) .expect("error while running tauri application"); diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index b5e9038..e6d9789 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -29,7 +29,7 @@ "icons/icon.icns", "icons/icon.ico" ], - "identifier": "com.hardware-monitor", + "identifier": "shm11C3.HardwareMonitor", "longDescription": "", "macOS": { "entitlements": null, diff --git a/src/App.tsx b/src/App.tsx index e3fc9b6..3273251 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,8 @@ -import { useState } from "react"; +import { useEffect, useState } from "react"; import TestTemplate from "./components/Sample"; import ChartTemplate from "./template/Chart"; import "./index.css"; +import { getSettings } from "./services/settingService"; type ButtonState = "chart" | "raw"; @@ -12,6 +13,13 @@ const Page = () => { setButtonState(buttonState === "raw" ? "chart" : "raw"); }; + useEffect(() => { + (async () => { + const setting = await getSettings(); + console.log(setting); + })(); + }, []); + return (

Hardware Monitor Proto

diff --git a/src/components/Sample.tsx b/src/components/Sample.tsx index 2be5d75..eebd461 100644 --- a/src/components/Sample.tsx +++ b/src/components/Sample.tsx @@ -7,7 +7,6 @@ import { getGpuUsageHistory, getMemoryUsage, } from "../services/hardwareService"; -import { getColorTheme } from "../services/settingService"; const Sample = () => { const [cpuUsage, setCpuUsage] = useState(0); @@ -17,7 +16,6 @@ const Sample = () => { const [cpuHistory, setCpuHistory] = useState([]); const [memoryHistory, setMemoryHistory] = useState([]); const [gpuHistory, setGpuHistory] = useState([]); - const [theme, setTheme] = useState(""); useEffect(() => { const interval = setInterval(async () => { @@ -27,7 +25,6 @@ const Sample = () => { setMemoryHistory(await getCpuMemoryHistory(30)); setGpuUsage(await getGpuUsage()); setGpuHistory(await getGpuUsageHistory(30)); - setTheme(await getColorTheme()); }, 1000); return () => clearInterval(interval); @@ -38,7 +35,6 @@ const Sample = () => {

CPU: {cpuUsage}%

MEMORY: {memoryUsage}%

GPU: {gpuUsage}%

-

{theme}

CPU History

diff --git a/src/services/settingService.ts b/src/services/settingService.ts index 1077508..cc801e9 100644 --- a/src/services/settingService.ts +++ b/src/services/settingService.ts @@ -1,5 +1,5 @@ import { invoke } from "@tauri-apps/api/tauri"; -export const getColorTheme = async (): Promise => { - return await invoke("get_windows_theme_mode"); +export const getSettings = async (): Promise => { + return await invoke("get_settings"); }; From ce292869c9025ecda877102c58a15b9b6761fcbd Mon Sep 17 00:00:00 2001 From: shm Date: Sun, 25 Aug 2024 04:05:21 +0900 Subject: [PATCH 27/35] add: dark mode --- package-lock.json | 143 +++++++-------------------------- package.json | 3 +- src/App.tsx | 29 +++++-- src/hooks/useDarkMode.ts | 29 +++++++ src/services/settingService.ts | 3 +- src/types/settingsType.ts | 5 ++ src/types/tauriType.ts | 0 tailwind.config.js | 1 + 8 files changed, 90 insertions(+), 123 deletions(-) create mode 100644 src/hooks/useDarkMode.ts create mode 100644 src/types/settingsType.ts create mode 100644 src/types/tauriType.ts diff --git a/package-lock.json b/package-lock.json index 9d023ad..deb2323 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,8 @@ "chart.js": "^4.4.4", "react": "^18.3.1", "react-chartjs-2": "^5.2.0", - "react-dom": "^18.3.1" + "react-dom": "^18.3.1", + "tailwind-variants": "^0.2.1" }, "devDependencies": { "@biomejs/biome": "1.7.3", @@ -33,7 +34,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -924,7 +924,6 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, "license": "ISC", "dependencies": { "string-width": "^5.1.2", @@ -955,7 +954,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -970,7 +968,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -980,7 +977,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -990,14 +986,12 @@ "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1014,7 +1008,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -1028,7 +1021,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -1038,7 +1030,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -1065,7 +1056,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, "license": "MIT", "optional": true, "engines": { @@ -1718,7 +1708,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -1744,14 +1733,12 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -1765,7 +1752,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, "license": "MIT" }, "node_modules/assertion-error": { @@ -1820,14 +1806,12 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, "license": "MIT" }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1840,7 +1824,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -1850,7 +1833,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -1906,7 +1888,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -2009,7 +1990,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -2034,7 +2014,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -2064,7 +2043,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -2088,7 +2066,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -2103,7 +2080,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "license": "MIT", "bin": { "cssesc": "bin/cssesc" @@ -2154,7 +2130,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, "license": "Apache-2.0" }, "node_modules/diff-sequences": { @@ -2171,14 +2146,12 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, "license": "MIT" }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, "license": "MIT" }, "node_modules/electron-to-chromium": { @@ -2192,7 +2165,6 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, "license": "MIT" }, "node_modules/esbuild": { @@ -2292,7 +2264,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -2309,7 +2280,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -2322,7 +2292,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -2332,7 +2301,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -2345,7 +2313,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", @@ -2376,7 +2343,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -2391,7 +2357,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2434,7 +2399,6 @@ "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -2455,7 +2419,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -2488,7 +2451,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -2511,7 +2473,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -2524,7 +2485,6 @@ "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -2540,7 +2500,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -2550,7 +2509,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -2560,7 +2518,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -2573,7 +2530,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -2596,14 +2552,12 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, "license": "ISC" }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -2619,7 +2573,6 @@ "version": "1.21.6", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", - "dev": true, "license": "MIT", "bin": { "jiti": "bin/jiti.js" @@ -2662,7 +2615,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -2672,7 +2624,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, "license": "MIT" }, "node_modules/local-pkg": { @@ -2749,7 +2700,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -2759,7 +2709,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -2786,7 +2735,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -2802,7 +2750,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" @@ -2832,7 +2779,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "license": "MIT", "dependencies": { "any-promise": "^1.0.0", @@ -2844,7 +2790,6 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, "funding": [ { "type": "github", @@ -2870,7 +2815,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -2919,7 +2863,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -2929,7 +2872,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -2971,14 +2913,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -2988,14 +2928,12 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", @@ -3012,7 +2950,6 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, "license": "ISC" }, "node_modules/pathe": { @@ -3036,14 +2973,12 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -3056,7 +2991,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3066,7 +3000,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 6" @@ -3088,7 +3021,6 @@ "version": "8.4.41", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -3117,7 +3049,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", @@ -3135,7 +3066,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" @@ -3155,7 +3085,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -3191,7 +3120,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "dev": true, "license": "MIT", "engines": { "node": ">=14" @@ -3204,7 +3132,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -3230,7 +3157,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -3244,7 +3170,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, "license": "MIT" }, "node_modules/pretty-format": { @@ -3266,7 +3191,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -3337,7 +3261,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "license": "MIT", "dependencies": { "pify": "^2.3.0" @@ -3347,7 +3270,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -3360,7 +3282,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -3378,7 +3299,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -3425,7 +3345,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -3467,7 +3386,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -3480,7 +3398,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3497,7 +3414,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -3510,7 +3426,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -3534,7 +3449,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -3553,7 +3467,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -3568,7 +3481,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3578,14 +3490,12 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -3598,7 +3508,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -3615,7 +3524,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -3628,7 +3536,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3664,7 +3571,6 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", @@ -3700,7 +3606,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3709,11 +3614,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tailwind-merge": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.2.tgz", + "integrity": "sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwind-variants": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-0.2.1.tgz", + "integrity": "sha512-2xmhAf4UIc3PijOUcJPA1LP4AbxhpcHuHM2C26xM0k81r0maAO6uoUSHl3APmvHZcY5cZCY/bYuJdfFa4eGoaw==", + "license": "MIT", + "dependencies": { + "tailwind-merge": "^2.2.0" + }, + "engines": { + "node": ">=16.x", + "pnpm": ">=7.x" + }, + "peerDependencies": { + "tailwindcss": "*" + } + }, "node_modules/tailwindcss": { "version": "3.4.10", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz", "integrity": "sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==", - "dev": true, "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -3751,7 +3681,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, "license": "MIT", "dependencies": { "any-promise": "^1.0.0" @@ -3761,7 +3690,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" @@ -3811,7 +3739,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -3824,7 +3751,6 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, "license": "Apache-2.0" }, "node_modules/type-detect": { @@ -3893,7 +3819,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, "license": "MIT" }, "node_modules/vite": { @@ -4049,7 +3974,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -4082,7 +4006,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", @@ -4101,7 +4024,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -4119,7 +4041,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -4129,7 +4050,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -4145,7 +4065,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -4158,21 +4077,18 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -4187,7 +4103,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -4200,7 +4115,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -4220,7 +4134,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", - "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/package.json b/package.json index 4c0f280..08536d8 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "chart.js": "^4.4.4", "react": "^18.3.1", "react-chartjs-2": "^5.2.0", - "react-dom": "^18.3.1" + "react-dom": "^18.3.1", + "tailwind-variants": "^0.2.1" } } diff --git a/src/App.tsx b/src/App.tsx index 3273251..c83718b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,26 +2,43 @@ import { useEffect, useState } from "react"; import TestTemplate from "./components/Sample"; import ChartTemplate from "./template/Chart"; import "./index.css"; +import { useDarkMode } from "./hooks/useDarkMode"; import { getSettings } from "./services/settingService"; +import type { Settings } from "./types/settingsType"; type ButtonState = "chart" | "raw"; +const useLoadSettings = () => { + const [settingState, setSettingState] = useState(null); + + useEffect(() => { + const loadSettings = async () => { + const setting = await getSettings(); + setSettingState(setting); + }; + loadSettings(); + }, []); + + return settingState; +}; + const Page = () => { const [buttonState, setButtonState] = useState("chart"); + const settingState = useLoadSettings(); + const { toggle } = useDarkMode(); const handleShowData = () => { setButtonState(buttonState === "raw" ? "chart" : "raw"); }; useEffect(() => { - (async () => { - const setting = await getSettings(); - console.log(setting); - })(); - }, []); + if (settingState?.theme) { + toggle(settingState.theme === "dark"); + } + }, [settingState?.theme, toggle]); return ( -
+

Hardware Monitor Proto