diff --git a/ng-app/src-tauri/src/lib.rs b/ng-app/src-tauri/src/lib.rs index c9d9b19..4254612 100644 --- a/ng-app/src-tauri/src/lib.rs +++ b/ng-app/src-tauri/src/lib.rs @@ -60,9 +60,19 @@ async fn wallet_open_wallet_with_pazzle( } #[tauri::command(rename_all = "snake_case")] -async fn wallet_create_wallet(params: CreateWalletV0) -> Result { - log!("wallet_create_wallet from rust {:?}", params); - create_wallet_v0(params).await.map_err(|e| e.to_string()) +async fn wallet_create_wallet(mut params: CreateWalletV0) -> Result { + //log!("wallet_create_wallet from rust {:?}", params); + params.result_with_wallet_file = false; + let local_save = params.local_save; + let res = create_wallet_v0(params).await.map_err(|e| e.to_string()); + + if local_save { + // TODO save in user store + } else { + // TODO save wallet file to Downloads folder + } + + res } #[tauri::command(rename_all = "snake_case")] diff --git a/ng-app/src-tauri/tauri.conf.json b/ng-app/src-tauri/tauri.conf.json index 75da95a..49473ae 100644 --- a/ng-app/src-tauri/tauri.conf.json +++ b/ng-app/src-tauri/tauri.conf.json @@ -42,7 +42,7 @@ "resizable": true, "title": "NextGraph", "width": 800, - "height": 900 + "height": 980 } ] } diff --git a/ng-app/src/App.svelte b/ng-app/src/App.svelte index 1427e6b..e06f7bd 100644 --- a/ng-app/src/App.svelte +++ b/ng-app/src/App.svelte @@ -20,6 +20,9 @@ import Grid from "./routes/Grid.svelte"; import URI from "./routes/URI.svelte"; import NotFound from "./routes/NotFound.svelte"; + import WalletCreate from "./routes/WalletCreate.svelte"; + import Install from "./routes/Install.svelte"; + import ng from "./api"; ng.test(); @@ -28,6 +31,8 @@ routes.set("/", Home); routes.set("/test", Test); routes.set("/grid", Grid); + routes.set("/wallet/create", WalletCreate); + if (import.meta.env.NG_APP_WEB) routes.set("/install", Install); routes.set(/^\/ng(.*)/i, URI); routes.set("*", NotFound); diff --git a/ng-app/src/api.ts b/ng-app/src/api.ts index 5449148..d187782 100644 --- a/ng-app/src/api.ts +++ b/ng-app/src/api.ts @@ -52,7 +52,12 @@ const handler = { let res = await tauri.invoke(path[0],arg); res['File'].V0.content = Uint8Array.from(res['File'].V0.content); res['File'].V0.metadata = Uint8Array.from(res['File'].V0.metadata); - return res + return res + } else if (path[0] === "wallet_create_wallet") { + let params = args[0]; + params.result_with_wallet_file = false; + params.security_img = Array.from(new Uint8Array(params.security_img)); + return await tauri.invoke(path[0],{params}) } else { let arg = {}; diff --git a/ng-app/src/assets/EU.svg b/ng-app/src/assets/EU.svg new file mode 100755 index 0000000..a9a71aa --- /dev/null +++ b/ng-app/src/assets/EU.svg @@ -0,0 +1,4 @@ +European flag + + + diff --git a/ng-app/src/lib/Home.svelte b/ng-app/src/lib/Home.svelte new file mode 100644 index 0000000..27d6f48 --- /dev/null +++ b/ng-app/src/lib/Home.svelte @@ -0,0 +1,84 @@ + + + + +
+
+
+

Welcome to NextGraph

+ + {#if display_login_create} +

+ We could not find a wallet saved on this device.
If you already have + a wallet, select "Log in", otherwise, select "Create Wallet" here below +

+ + + {/if} +
diff --git a/ng-app/src/routes/Grid.svelte b/ng-app/src/routes/Grid.svelte index 0e5a640..235b5ff 100644 --- a/ng-app/src/routes/Grid.svelte +++ b/ng-app/src/routes/Grid.svelte @@ -51,12 +51,13 @@ let img = await ng.doc_get_file_from_store_with_object_ref("ng:", ref); let c = { - security_img: Array.from(img["File"].V0.content), + security_img: img["File"].V0.content, security_txt: " know yourself ", pin: [5, 2, 9, 1], pazzle_length: 9, send_bootstrap: undefined, send_wallet: false, + result_with_wallet_file: true, peer_id: { Ed25519PubKey: [ 119, 251, 253, 29, 135, 199, 254, 50, 134, 67, 1, 208, 117, 196, 167, @@ -260,4 +261,33 @@ {:else if step == "end"}{/if} diff --git a/ng-app/src/routes/Home.svelte b/ng-app/src/routes/Home.svelte index 0d36877..da0a910 100644 --- a/ng-app/src/routes/Home.svelte +++ b/ng-app/src/routes/Home.svelte @@ -12,63 +12,26 @@ + import Home from "../lib/Home.svelte"; + import { onMount } from "svelte"; + + let display_login_create = false; -
-
-
-

Welcome to NextGraph

+ async function bootstrap() { + let bs; + try { + bs = localStorage.getItem("bootstrap"); + } catch (e) {} + if (bs) { + } else { + // probe localhost and LAN + + // if nothing found, displays login/create account + console.log("no wallet found"); + display_login_create = true; + } + } + onMount(() => bootstrap()); + - - -
+ diff --git a/ng-app/src/routes/Install.svelte b/ng-app/src/routes/Install.svelte new file mode 100644 index 0000000..5761e9d --- /dev/null +++ b/ng-app/src/routes/Install.svelte @@ -0,0 +1,204 @@ + + + + +
+
+ + +
+ +

+ NextGraph App is available for download as a native app for your + mobile, tablet, laptop and desktop.
The app supports iOS, Android, Linux, + macOS, Windows and all other platforms that can run a modern web browser. +

+ {#if display_note_on_local_wallets} + + A wallet is saved in this browser. If it is yours,
once the + installation of the app will be finished,
choose the option "Login" + on the app.
(do not create another wallet from the app). +
+ {/if} + + + + + + + + + + + +
diff --git a/ng-app/src/routes/Test.svelte b/ng-app/src/routes/Test.svelte index 0923730..ba29f10 100644 --- a/ng-app/src/routes/Test.svelte +++ b/ng-app/src/routes/Test.svelte @@ -14,7 +14,7 @@ export let params = {}; -
+

Welcome to test

diff --git a/ng-app/src/routes/WalletCreate.svelte b/ng-app/src/routes/WalletCreate.svelte new file mode 100644 index 0000000..47b48f5 --- /dev/null +++ b/ng-app/src/routes/WalletCreate.svelte @@ -0,0 +1,867 @@ + + + + +
+
+ + +
+ {#if intro} +
+

+ A NextGraph Wallet is unique to each individual. It stores your + credentials and authorizations to access documents.

If you + already have a wallet, you should not create a new one, instead, + login here with your existing wallet. + If you never created a NextGraph Wallet before, please follow the instructions + below in order to create your personal wallet. +

+
+ {#if display_note_on_local_wallets} + + Some wallets are saved on this device,
to log in with one of them, + click here. +
+ {/if} +
+
+

+ What is a wallet? Please read +

+
    +
  • + + + It is a secure and encrypted small file that contains some + important information that only you should have access to. +
  • +
  • + + + In it, we store all the permissions to access documents you have + been granted with, or that you have created yourself. +
  • +
  • + + + In order to open it, you will need to enter your pazzle + and a + PIN code of 4 digits. Your personal pazzle (contraction of puzzle + and password) is composed of 9 images you should remember. The order + of the images is important too. +
  • +
  • + + + + Don't worry, it is easier to remember 9 images than a password + like "69$g&ms%C*%", and it has the same strength than a complex + password. The entropy of your pazzle is 66bits, which is + considered very high by all standards. +
  • + +
  • + + + You should only create one unique wallet for yourself. All + your accounts, identities and permissions will be added to this + unique wallet later on. Do not create another wallet if you + already have one. Instead, you will + import your existing wallet in all the apps and websites where + you need it +
  • +
  • + + + Your wallet can be imported with the help of a small file that + you download, or with a QRcode. In any case, you should never + share this file or QRcode with anybody else. +
  • +
  • + + + We at NextGraph will never see the content of your wallet. It is + encrypted and we do not know your pazzle, so we cannot see what is + inside. +
  • +
  • + + + For the same reason, we won't be able to help you if you forget + your pazzle or PIN code. There is no "password recovery" option in + this case. You can note your pazzle down on a piece of paper until + you remember it, but don't forget to destroy this note after a + while. +
  • +
+
+
+
+ +
+ {:else if pin.length < 4} +
+

+ Let's start by choosing a PIN code + + We recommend you to choose a PIN code that you already know very well + :
+ your credit card PIN, by example, is a good choice +
+

+

Here are the rules for the PIN :

+
    +
  • It cannot be a series like 1234 or 8765
  • +
  • + The same digit cannot repeat more than once. By example 4484 is + invalid +
  • +
  • + Try to avoid birth date, last digits of phone number, or zip code +
  • +
+ + + You have chosen: {#each pin as digit}{digit}{/each} + +
+ {#each [0, 1, 2] as row} +
+ {#each [1, 2, 3] as num} + + {/each} +
+ {/each} + +
+
+ {:else if pin_confirm.length < 4} +
+

+ Please confirm your PIN code. + Enter the same PIN again +

+ + You have chosen: {#each pin_confirm as digit}{digit}{/each} + +
+ {#each [0, 1, 2] as row} +
+ {#each [1, 2, 3] as num} + + {/each} +
+ {/each} + +
+
+ {:else if !options} +
+ {#if pin.toString() === pin_confirm.toString()} + + Your PIN is confirmed as : {#each pin_confirm as digit}{digit}{/each} + +

+ Now let's enter a security phrase and a security image +

+

+ As a verification step, this phrase and image will be presented to you + every time you are about to enter your pazzle and PIN before you + unlock your wallet.
+ This security measure will prevent you from entering your pazzle and PIN + on malicious sites and apps. + + When you will use you wallet, if you do not see and recognize your + own security phrase and image before entering your pazzle, please + stop and DO NOT enter your pazzle, you are being the victim of a + phishing attempt. + +

+

+ Here are the rules for the security phrase and image : +

+
    +
  • The phrase should be at least 10 characters long
  • +
  • + It should be something you will remember, but not something too + personal. +
  • +
  • Do not enter your full name, nor address, nor phone number.
  • +
  • + Instead, you can enter a quote, a small sentence that you like, or + something meaningless to others, but unique to you. +
  • +
  • + The image should be minimum 150x150px. There is no need to provide + more than 400x400px as it will be scaled down anyway. +
  • +
  • We accept several formats like JPEG, PNG, GIF, WEBP and more.
  • +
  • + The image should be unique to you. But it should not be too personal + neither. +
  • +
  • Do not upload your face picture, this is not a profile pic.
  • +
  • + The best would be a landscape you like or any other picture that you + will recognize as unique. +
  • +
  • + Please be aware that other people who are sharing this device with + you, will be able to see this image and phrase. +
  • +
+
+ {#if security_txt && security_img} + + {/if} + { + event.preventDefault(); + }} + on:change={handleChange} + > +

+ {#if mobile} + Tap to upload an image + {:else} + Click to select an image or drag + and drop + {/if} +

+ +
+ + {:else} + + You didn't enter the same PIN twice + + + {/if} +
+ {:else if !creating} +
+

+ We are almost done !
+ There are 2 options to choose before we can create your wallet. Those options + can help you to use and keep your wallet. But we also want to be careful + with your security and privacy.

+ Remember that in any case, once your wallet will be created, you will download + a file that you should keep privately somewhere on your device, USB key or + harddisk. This is the default way you can use and keep your wallet. Now let's + look at some options that can make your life a bit easier. +

+

+ Do you trust this device?
+ If you do, if this device is yours or is used by few trusted persons of your + family or workplace, then you can save your wallet in this device. To the + contrary, if this device is public and shared by strangers, do not save your + wallet here. {#if !import.meta.env.TAURI_PLATFORM}By selecting this + option, you agree to save some cookies on your browser.{/if}
+ Save your wallet here? +

+

+ Keep a copy in the cloud?
+ Are you afraid that you will loose the file containing your wallet? If this + would happen, your wallet would be lost forever, together with all your documents. + We can keep an encrypted copy of your wallet in our cloud. Only you will + be able to download it with a special link. You would have to keep this link + safely though. By selecting this option, you agree to the + Terms and Conditions of our cloud. +
+ Save your wallet in the cloud? +

+ +
+ {:else if !error} + {#if !ready} +
+ We are creating your wallet... + + + + +
+ {:else} +
+ Your wallet is ready! + + {#if download_link} + Please download your wallet and keep it in a safe location
+ + +
+ {:else if !options.trusted} + Your wallet file has been downloaded into your "Downloads" folder, + with the name
{download_name}
+ Please move it to a safe and durable place.

+ {/if} + {#each display_pazzle(ready.pazzle) as emoji} + {emoji}
+ {/each} +
+ {/if} + {:else} +
+ An error occurred ! + + + {error} + + +
+ {/if} +
diff --git a/ng-app/src/styles.css b/ng-app/src/styles.css index 451396f..9324551 100644 --- a/ng-app/src/styles.css +++ b/ng-app/src/styles.css @@ -9,6 +9,31 @@ // according to those terms. */ +.logo { + padding: 1.5em; + will-change: filter; + transition: 0.75s; + padding-bottom: 1em; +} + +.container3 { + margin: 0; + min-width: 280px; + display: flex; + flex-direction: column; + justify-content: center; + text-align: center; +} + +div[role="alert"] div { + display: block; +} + +.row { + display: flex; + justify-content: center; +} + :root { font-family: Inter, Avenir, Helvetica, Arial, sans-serif; font-size: 16px; @@ -25,56 +50,24 @@ -webkit-text-size-adjust: 100%; } -.pazzleline { - margin-right: auto; - margin-left: auto; -} - -.pin { - cursor: pointer; - text-align: center; -} - -.sel { - position: relative; - top: -56%; - font-size: 100px; - left: 30%; - font-weight: 700; -} - -.sel-emoji { - overflow: hidden; -} - -.emoji { - cursor: pointer; - /* padding: 0; +body { margin: 0; - border: 0; - box-shadow: none; */ -} - -.container2 { - margin: 0; - min-width: 280px; - padding-top: 10vh; display: flex; - flex-direction: column; - justify-content: center; - text-align: center; + place-items: center; + min-width: 320px; + min-height: 100vh; } -.logo { - padding: 1.5em; - will-change: filter; - transition: 0.75s; +#app { + max-width: 1280px; + margin: 0 auto; + padding: 0rem; + text-align: center; } -.row { - display: flex; - justify-content: center; -} +/* .container2 { + padding-top: 10vh; +} */ a { font-weight: 500; @@ -88,6 +81,8 @@ a:hover { h1 { text-align: center; + font-size: 3.2em; + line-height: 1.1; } input, @@ -116,13 +111,14 @@ button:active { background-color: #e8e8e8; } -input, +/* input, button { outline: none; -} +} */ -#greet-input { - margin-right: 5px; +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; } @media (prefers-color-scheme: dark) { diff --git a/ng-app/src/wallet_emojis.ts b/ng-app/src/wallet_emojis.ts index fb0d69c..d1e8a99 100644 --- a/ng-app/src/wallet_emojis.ts +++ b/ng-app/src/wallet_emojis.ts @@ -1734,3 +1734,12 @@ export const emoji_cat = [ "emotion", ]; +export function display_pazzle(pazzle) { + let res = []; + for (const emoji of pazzle) { + let cat = (emoji & 240) >> 4; + let idx = emoji & 15; + res.push(emoji_cat[cat] +":"+ emojis[emoji_cat[cat]][idx].code); + } + return res; +} diff --git a/ng-sdk-js/src/lib.rs b/ng-sdk-js/src/lib.rs index 9e850ff..8867b54 100644 --- a/ng-sdk-js/src/lib.rs +++ b/ng-sdk-js/src/lib.rs @@ -67,9 +67,9 @@ pub fn wallet_open_wallet_with_pazzle( #[cfg(target_arch = "wasm32")] #[wasm_bindgen] pub async fn wallet_create_wallet(js_params: JsValue) -> Result { - let params = serde_wasm_bindgen::from_value::(js_params) + let mut params = serde_wasm_bindgen::from_value::(js_params) .map_err(|_| "Deserialization error of args")?; - + params.result_with_wallet_file = true; let res = create_wallet_v0(params).await; match res { Ok(r) => Ok(serde_wasm_bindgen::to_value(&r).unwrap()), diff --git a/ng-wallet/src/lib.rs b/ng-wallet/src/lib.rs index b7f34f8..8ba6bfe 100644 --- a/ng-wallet/src/lib.rs +++ b/ng-wallet/src/lib.rs @@ -353,22 +353,20 @@ pub async fn create_wallet_v0( // check validity of PIN // shouldn't start with 0 - if params.pin[0] == 0 { - return Err(NgWalletError::InvalidPin); - } + // if params.pin[0] == 0 { + // return Err(NgWalletError::InvalidPin); + // } // each digit shouldnt be greater than 9 if params.pin[0] > 9 || params.pin[1] > 9 || params.pin[2] > 9 || params.pin[3] > 9 { return Err(NgWalletError::InvalidPin); } - // check for uniqueness of each digit - if params.pin[1] == params.pin[0] - || params.pin[1] == params.pin[2] - || params.pin[1] == params.pin[3] - || params.pin[2] == params.pin[0] - || params.pin[2] == params.pin[3] - || params.pin[3] == params.pin[0] + // check for same digit doesnt appear 3 times + if (params.pin[0] == params.pin[1] && params.pin[0] == params.pin[2]) + || (params.pin[0] == params.pin[1] && params.pin[0] == params.pin[3]) + || (params.pin[0] == params.pin[2] && params.pin[0] == params.pin[3]) + || (params.pin[1] == params.pin[2] && params.pin[1] == params.pin[3]) { return Err(NgWalletError::InvalidPin); } @@ -409,7 +407,11 @@ pub async fn create_wallet_v0( return Err(NgWalletError::InvalidSecurityImage); } - let resized_img = decoded_img.resize_to_fill(400, 400, FilterType::Triangle); + let resized_img = if decoded_img.height() == 400 && decoded_img.width() == 400 { + decoded_img + } else { + decoded_img.resize_to_fill(400, 400, FilterType::Triangle) + }; let buffer: Vec = Vec::with_capacity(100000); let mut cursor = Cursor::new(buffer); @@ -543,11 +545,17 @@ pub async fn create_wallet_v0( "creating of wallet took: {} ms", creating_pazzle.elapsed().as_millis() ); - + let wallet = Wallet::V0(wallet_v0); + let wallet_file = match (params.result_with_wallet_file) { + false => vec![], // TODO: save locally + true => to_vec(&NgFile::V0(NgFileV0::Wallet(wallet.clone()))).unwrap(), + }; Ok(CreateWalletResultV0 { - wallet: Wallet::V0(wallet_v0), + wallet: wallet, + wallet_file, pazzle, mnemonic, + wallet_name: base64_url::encode(&wallet_id.slice()), }) } diff --git a/ng-wallet/src/types.rs b/ng-wallet/src/types.rs index 023d83a..1223efd 100644 --- a/ng-wallet/src/types.rs +++ b/ng-wallet/src/types.rs @@ -24,11 +24,11 @@ pub type BootstrapId = WalletId; /// BootstrapServer type #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub enum BoostrapServerTypeV0 { - Localhost, + Localhost(u16), // optional port number BoxPrivate(Vec), BoxPublic(Vec), BoxPublicDyn(Vec), // can be empty - Domain(String), + Domain(String), // accepts an option trailing ":port" number } /// BootstrapServer details Version 0 @@ -229,6 +229,8 @@ pub struct CreateWalletV0 { pub pazzle_length: u8, pub send_bootstrap: Option, pub send_wallet: bool, + pub result_with_wallet_file: bool, + pub local_save: bool, pub peer_id: PubKey, pub nonce: u64, } @@ -245,6 +247,8 @@ impl CreateWalletV0 { nonce: u64, ) -> Self { CreateWalletV0 { + result_with_wallet_file: false, + local_save: true, security_img, security_txt, pin, @@ -260,8 +264,11 @@ impl CreateWalletV0 { #[derive(Clone, Debug, Serialize, Deserialize)] pub struct CreateWalletResultV0 { pub wallet: Wallet, + #[serde(with = "serde_bytes")] + pub wallet_file: Vec, pub pazzle: Vec, pub mnemonic: [u16; 12], + pub wallet_name: String, } #[derive(Debug, Eq, PartialEq, Clone)] diff --git a/ngone/src/main.rs b/ngone/src/main.rs index 7895c9d..40bea9b 100644 --- a/ngone/src/main.rs +++ b/ngone/src/main.rs @@ -157,7 +157,7 @@ async fn main() { let key: [u8; 32] = [0; 32]; println!("{}", dir.to_str().unwrap()); fs::create_dir_all(dir.clone()).unwrap(); - let mut store = LmdbKCVStore::open(&dir, key); + let store = LmdbKCVStore::open(&dir, key); let server = Arc::new(Server { store }); @@ -201,7 +201,11 @@ async fn main() { #[cfg(not(debug_assertions))] { - cors = cors.allow_origin("https://nextgraph.one"); + cors = cors + .allow_origin("https://nextgraph.one") + .allow_origin("https://app.nextgraph.one") + .allow_origin("https://nextgraph.eu") + .allow_origin("https://nextgraph.net"); } #[cfg(debug_assertions)] { diff --git a/ngone/web/index.html b/ngone/web/index.html index 9ab71a4..a05053c 100644 --- a/ngone/web/index.html +++ b/ngone/web/index.html @@ -12,12 +12,50 @@ - + - Vite + Svelte + NextGraph +
- + \ No newline at end of file diff --git a/ngone/web/package.json b/ngone/web/package.json index 4ea51fa..c2aada5 100644 --- a/ngone/web/package.json +++ b/ngone/web/package.json @@ -8,9 +8,20 @@ "build": "vite build --base=./", "preview": "vite preview" }, + "dependencies": { + "flowbite": "^1.6.5", + "flowbite-svelte": "^0.37.1", + "svelte-spa-router": "^3.3.0" + }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^2.0.4", "svelte": "^3.58.0", - "vite": "^4.3.9" + "vite": "^4.3.9", + "postcss": "^8.4.23", + "postcss-load-config": "^4.0.1", + "svelte-preprocess": "^5.0.3", + "tailwindcss": "^3.3.1", + "autoprefixer": "^10.4.14", + "vite-plugin-svelte-svg": "^2.2.1" } } diff --git a/ngone/web/pnpm-lock.yaml b/ngone/web/pnpm-lock.yaml index 7d692ce..a71774a 100644 --- a/ngone/web/pnpm-lock.yaml +++ b/ngone/web/pnpm-lock.yaml @@ -2,16 +2,41 @@ lockfileVersion: 5.4 specifiers: '@sveltejs/vite-plugin-svelte': ^2.0.4 + autoprefixer: ^10.4.14 + flowbite: ^1.6.5 + flowbite-svelte: ^0.37.1 + postcss: ^8.4.23 + postcss-load-config: ^4.0.1 svelte: ^3.58.0 + svelte-preprocess: ^5.0.3 + svelte-spa-router: ^3.3.0 + tailwindcss: ^3.3.1 vite: ^4.3.9 + vite-plugin-svelte-svg: ^2.2.1 + +dependencies: + flowbite: 1.6.6 + flowbite-svelte: 0.37.5_svelte@3.59.1 + svelte-spa-router: 3.3.0 devDependencies: '@sveltejs/vite-plugin-svelte': 2.4.1_svelte@3.59.1+vite@4.3.9 + autoprefixer: 10.4.14_postcss@8.4.24 + postcss: 8.4.24 + postcss-load-config: 4.0.1_postcss@8.4.24 svelte: 3.59.1 + svelte-preprocess: 5.0.4_sxhny56dlbcmwov4vk7qwrzshi + tailwindcss: 3.3.2 vite: 4.3.9 + vite-plugin-svelte-svg: 2.2.1_svelte@3.59.1+vite@4.3.9 packages: + /@alloc/quick-lru/5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: true + /@esbuild/android-arm/0.17.19: resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} @@ -210,10 +235,65 @@ packages: dev: true optional: true + /@jridgewell/gen-mapping/0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + /@jridgewell/sourcemap-codec/1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true + /@jridgewell/trace-mapping/0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@popperjs/core/2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: false + /@sveltejs/vite-plugin-svelte-inspector/1.0.2_qiij5gx4uovhfqjpd2vh63pzyq: resolution: {integrity: sha512-Cy1dUMcYCnDVV/hPLXa43YZJ2jGKVW5rA0xuNL9dlmYhT0yoS1g7+FOFSRlgk0BXKk/Oc7grs+8BVA5Iz2fr8A==} engines: {node: ^14.18.0 || >= 16} @@ -250,6 +330,175 @@ packages: - supports-color dev: true + /@trysound/sax/0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: true + + /@types/pug/2.0.6: + resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} + dev: true + + /any-promise/1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch/3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg/5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + + /autoprefixer/10.4.14_postcss@8.4.24: + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.8 + caniuse-lite: 1.0.30001503 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /boolbase/1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist/4.21.8: + resolution: {integrity: sha512-j+7xYe+v+q2Id9qbBeCI8WX5NmZSRe8es1+0xntD/+gaWXznP8tFEkv5IgSaHf5dS1YwVMbX/4W6m937mj+wQw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001503 + electron-to-chromium: 1.4.430 + node-releases: 2.0.12 + update-browserslist-db: 1.0.11_browserslist@4.21.8 + dev: true + + /buffer-crc32/0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /camelcase-css/2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + + /caniuse-lite/1.0.30001503: + resolution: {integrity: sha512-Sf9NiF+wZxPfzv8Z3iS0rXM1Do+iOy2Lxvib38glFX+08TCYYYGR5fRJXk4d77C4AYwhUjgYgMsMudbh2TqCKw==} + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /classnames/2.3.2: + resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + dev: false + + /commander/4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /commander/7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /css-select/5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + dev: true + + /css-tree/2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.0.2 + dev: true + + /css-tree/2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.0.2 + dev: true + + /css-what/6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /cssesc/3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /csso/5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + dependencies: + css-tree: 2.2.1 + dev: true + /debug/4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -267,6 +516,59 @@ packages: engines: {node: '>=0.10.0'} dev: true + /detect-indent/6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /didyoumean/1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + + /dlv/1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + + /dom-serializer/2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: true + + /domelementtype/2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler/5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils/3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + + /electron-to-chromium/1.4.430: + resolution: {integrity: sha512-FytjTbGwz///F+ToZ5XSeXbbSaXalsVRXsz2mHityI5gfxft7ieW3HqFLkU5V1aIrY42aflICqbmFoDxW10etg==} + dev: true + + /entities/4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /es6-promise/3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + dev: true + /esbuild/0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} @@ -297,6 +599,62 @@ packages: '@esbuild/win32-x64': 0.17.19 dev: true + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /fast-glob/3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fastq/1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /flowbite-svelte/0.37.5_svelte@3.59.1: + resolution: {integrity: sha512-aAPJygrfqY1+wkcl4rG/ikTxAdnB1p4Xe2sKG3Jm+BJsMZvArgl6/weH+DimoSjHLAMLhtd4spAbzfT8eHBgnQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} + peerDependencies: + svelte: ^3.55.1 || ^4.0.0 + dependencies: + '@popperjs/core': 2.11.8 + classnames: 2.3.2 + flowbite: 1.6.6 + svelte: 3.59.1 + dev: false + + /flowbite/1.6.6: + resolution: {integrity: sha512-T+IaFikHELo1PBKfT/axDqhAmKQLfm/dxVch2r07TZ+IcKwkorZjzwkVuw3OslTETniRIUf2qQvEhxk3bQCaew==} + dependencies: + '@popperjs/core': 2.11.8 + mini-svg-data-uri: 1.4.4 + dev: false + + /fraction.js/4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + /fsevents/2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -305,11 +663,124 @@ packages: dev: true optional: true + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /graceful-fs/4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module/2.12.1: + resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /jiti/1.18.2: + resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} + hasBin: true + dev: true + /kleur/4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} dev: true + /lilconfig/2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /magic-string/0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /magic-string/0.30.0: resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} engines: {node: '>=12'} @@ -317,20 +788,197 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /mdn-data/2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + dev: true + + /mdn-data/2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: true + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /mini-svg-data-uri/1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + dev: false + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist/1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true + /mz/2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + /nanoid/3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true + /node-releases/2.0.12: + resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range/0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /nth-check/2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-hash/3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify/2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pirates/4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + engines: {node: '>= 6'} + dev: true + + /postcss-import/15.1.0_postcss@8.4.24: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.24 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.2 + dev: true + + /postcss-js/4.0.1_postcss@8.4.24: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.24 + dev: true + + /postcss-load-config/4.0.1_postcss@8.4.24: + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.24 + yaml: 2.3.1 + dev: true + + /postcss-nested/6.0.1_postcss@8.4.24: + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.24 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-selector-parser/6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser/4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + /postcss/8.4.24: resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} engines: {node: ^10 || ^12 || >=14} @@ -340,6 +988,49 @@ packages: source-map-js: 1.0.2 dev: true + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /read-cache/1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /regexparam/2.0.1: + resolution: {integrity: sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw==} + engines: {node: '>=8'} + dev: false + + /resolve/1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf/2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + /rollup/3.23.0: resolution: {integrity: sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} @@ -348,11 +1039,62 @@ packages: fsevents: 2.3.2 dev: true + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /sander/0.5.1: + resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} + dependencies: + es6-promise: 3.3.1 + graceful-fs: 4.2.11 + mkdirp: 0.5.6 + rimraf: 2.7.1 + dev: true + + /sorcery/0.11.0: + resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} + hasBin: true + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + buffer-crc32: 0.2.13 + minimist: 1.2.8 + sander: 0.5.1 + dev: true + /source-map-js/1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} dev: true + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /sucrase/3.32.0: + resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.5 + ts-interface-checker: 0.1.13 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + /svelte-hmr/0.15.2_svelte@3.59.1: resolution: {integrity: sha512-q/bAruCvFLwvNbeE1x3n37TYFb3mTBJ6TrCq6p2CoFbSTNhDE9oAtEfpy+wmc9So8AG0Tja+X0/mJzX9tSfvIg==} engines: {node: ^12.20 || ^14.13.1 || >= 16} @@ -362,9 +1104,157 @@ packages: svelte: 3.59.1 dev: true + /svelte-preprocess/5.0.4_sxhny56dlbcmwov4vk7qwrzshi: + resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} + engines: {node: '>= 14.10.0'} + requiresBuild: true + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.55.0 + sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 + svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 + typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + dependencies: + '@types/pug': 2.0.6 + detect-indent: 6.1.0 + magic-string: 0.27.0 + postcss: 8.4.24 + postcss-load-config: 4.0.1_postcss@8.4.24 + sorcery: 0.11.0 + strip-indent: 3.0.0 + svelte: 3.59.1 + dev: true + + /svelte-spa-router/3.3.0: + resolution: {integrity: sha512-cwRNe7cxD43sCvSfEeaKiNZg3FCizGxeMcf7CPiWRP3jKXjEma3vxyyuDtPOam6nWbVxl9TNM3hlE/i87ZlqcQ==} + dependencies: + regexparam: 2.0.1 + dev: false + /svelte/3.59.1: resolution: {integrity: sha512-pKj8fEBmqf6mq3/NfrB9SLtcJcUvjYSWyePlfCqN9gujLB25RitWK8PvFzlwim6hD/We35KbPlRteuA6rnPGcQ==} engines: {node: '>= 8'} + + /svgo/3.0.2: + resolution: {integrity: sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.1.0 + css-tree: 2.3.1 + csso: 5.0.5 + picocolors: 1.0.0 + dev: true + + /tailwindcss/3.3.2: + resolution: {integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==} + engines: {node: '>=14.0.0'} + hasBin: true + 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.2.12 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.18.2 + 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.24 + postcss-import: 15.1.0_postcss@8.4.24 + postcss-js: 4.0.1_postcss@8.4.24 + postcss-load-config: 4.0.1_postcss@8.4.24 + postcss-nested: 6.0.1_postcss@8.4.24 + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + resolve: 1.22.2 + sucrase: 3.32.0 + transitivePeerDependencies: + - ts-node + dev: true + + /thenify-all/1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify/3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /ts-interface-checker/0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + + /update-browserslist-db/1.0.11_browserslist@4.21.8: + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.8 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /vite-plugin-svelte-svg/2.2.1_svelte@3.59.1+vite@4.3.9: + resolution: {integrity: sha512-CoGzvoAY02u4Haek6whVkvTPus2fIPU37dkKvlk2wBI8bB+A7UKasR8mDIbq4rH5fxvZee8UrEzLcZxNbm4bTQ==} + peerDependencies: + svelte: ^3.55.0 + vite: < 5.0.0 + dependencies: + svelte: 3.59.1 + svgo: 3.0.2 + vite: 4.3.9 dev: true /vite/4.3.9: @@ -409,3 +1299,12 @@ packages: dependencies: vite: 4.3.9 dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /yaml/2.3.1: + resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} + engines: {node: '>= 14'} + dev: true diff --git a/ngone/web/postcss.config.cjs b/ngone/web/postcss.config.cjs new file mode 100644 index 0000000..e48cff5 --- /dev/null +++ b/ngone/web/postcss.config.cjs @@ -0,0 +1,13 @@ +const tailwindcss = require("tailwindcss"); +const autoprefixer = require("autoprefixer"); + +const config = { + plugins: [ + //Some plugins, like tailwindcss/nesting, need to run before Tailwind, + tailwindcss(), + //But others, like autoprefixer, need to run after, + autoprefixer, + ], +}; + +module.exports = config; diff --git a/ngone/web/src/App.svelte b/ngone/web/src/App.svelte index 6c97e0f..b8236f4 100644 --- a/ngone/web/src/App.svelte +++ b/ngone/web/src/App.svelte @@ -9,54 +9,24 @@ // according to those terms. --> - -
- -

Vite + Svelte

+ import Router from "svelte-spa-router"; + import { onMount, tick } from "svelte"; - + import Home from "./routes/Home.svelte"; + import WalletCreate from "./routes/WalletCreate.svelte"; + import Install from "../../../ng-app/src/routes/Install.svelte"; -
- -
+ //import URI from "./routes/URI.svelte"; + import NotFound from "./routes/NotFound.svelte"; -

- Check out SvelteKit, the official Svelte app framework powered by Vite! -

+ const routes = new Map(); + routes.set("/", Home); + routes.set("/wallet/create", WalletCreate); + routes.set("/install", Install); + //routes.set(/^\/ng(.*)/i, URI); + routes.set("*", NotFound); + -

Click on the Vite and Svelte logos to learn more

+
+
- - diff --git a/ngone/web/src/Greeting.svelte b/ngone/web/src/Greeting.svelte deleted file mode 100644 index f358fd7..0000000 --- a/ngone/web/src/Greeting.svelte +++ /dev/null @@ -1,25 +0,0 @@ - - -

{greeting}

diff --git a/ngone/web/src/app.css b/ngone/web/src/app.css deleted file mode 100644 index 7c35f3d..0000000 --- a/ngone/web/src/app.css +++ /dev/null @@ -1,91 +0,0 @@ -/* -// Copyright (c) 2022-2023 Niko Bonnieure, Par le Peuple, NextGraph.org developers -// All rights reserved. -// Licensed under the Apache License, Version 2.0 -// -// or the MIT license , -// at your option. All files in the project carrying such -// notice may not be copied, modified, or distributed except -// according to those terms. -*/ - -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -.card { - padding: 2em; -} - -#app { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/ngone/web/src/app.postcss b/ngone/web/src/app.postcss new file mode 100644 index 0000000..1a7b7cf --- /dev/null +++ b/ngone/web/src/app.postcss @@ -0,0 +1,4 @@ +/* Write your global styles here, in PostCSS syntax */ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/ngone/web/src/assets/EU.svg b/ngone/web/src/assets/EU.svg new file mode 100755 index 0000000..a9a71aa --- /dev/null +++ b/ngone/web/src/assets/EU.svg @@ -0,0 +1,4 @@ +European flag + + + diff --git a/ngone/web/src/assets/nextgraph.svg b/ngone/web/src/assets/nextgraph.svg new file mode 100644 index 0000000..585d488 --- /dev/null +++ b/ngone/web/src/assets/nextgraph.svg @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/ngone/web/src/assets/svelte.svg b/ngone/web/src/assets/svelte.svg deleted file mode 100644 index c5e0848..0000000 --- a/ngone/web/src/assets/svelte.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ngone/web/src/lib/Counter.svelte b/ngone/web/src/lib/Counter.svelte deleted file mode 100644 index e45f903..0000000 --- a/ngone/web/src/lib/Counter.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/ngone/web/src/main.js b/ngone/web/src/main.js index 8a909a1..4472c64 100644 --- a/ngone/web/src/main.js +++ b/ngone/web/src/main.js @@ -1,4 +1,5 @@ -import './app.css' +import './app.postcss' +import "../../../ng-app/src/styles.css"; import App from './App.svelte' const app = new App({ diff --git a/ngone/web/src/routes/Home.svelte b/ngone/web/src/routes/Home.svelte new file mode 100644 index 0000000..c56d66a --- /dev/null +++ b/ngone/web/src/routes/Home.svelte @@ -0,0 +1,55 @@ + + + + + diff --git a/ngone/web/src/routes/NotFound.svelte b/ngone/web/src/routes/NotFound.svelte new file mode 100644 index 0000000..59c0f9b --- /dev/null +++ b/ngone/web/src/routes/NotFound.svelte @@ -0,0 +1,20 @@ + + + + +
+ + 404 Page not found. + +
diff --git a/ngone/web/src/routes/WalletCreate.svelte b/ngone/web/src/routes/WalletCreate.svelte new file mode 100644 index 0000000..19aa4bd --- /dev/null +++ b/ngone/web/src/routes/WalletCreate.svelte @@ -0,0 +1,247 @@ + + + + +
+
+ + +
+ +

+ A NextGraph Wallet is unique to each individual.
It stores your + credentials to access documents.
If you already have a wallet, you + should not create a new one, instead, + {#if display_note_on_local_wallets} + login here with your existing wallet. + {:else} + login here with your existing wallet. + {/if} + If you never created a NextGraph Wallet before, please choose one of the options + below to do so now. +

+ {#if display_note_on_local_wallets} + + Some wallets are saved on this device,
to log in with one of them, + click here. +
+ {/if} + + + + + + +
diff --git a/ngone/web/tailwind.config.cjs b/ngone/web/tailwind.config.cjs new file mode 100644 index 0000000..e338bf8 --- /dev/null +++ b/ngone/web/tailwind.config.cjs @@ -0,0 +1,23 @@ +/** @type {import('tailwindcss').Config}*/ +const config = { + content: [ + "./src/**/*.{html,js,svelte,ts}", + "../../ng-app/src/**/*.{html,js,svelte,ts}", + "./node_modules/flowbite-svelte/**/*.{html,js,svelte,ts}", + ], + + theme: { + extend: { + colors: { + primary: { "50": "#eff6ff", "100": "#dbeafe", "200": "#bfdbfe", "300": "#93c5fd", "400": "#60a5fa", "500": "#3b82f6", "600": "#1E88E5", "700": "#4972A5", "800": "#1e40af", "900": "#1e3a8a" } + } + }, + }, + + plugins: [ + require('flowbite/plugin') + ], + darkMode: 'class', +}; + +module.exports = config; diff --git a/ngone/web/vite.config.js b/ngone/web/vite.config.js index d701969..cb3bff8 100644 --- a/ngone/web/vite.config.js +++ b/ngone/web/vite.config.js @@ -1,7 +1,36 @@ import { defineConfig } from 'vite' -import { svelte } from '@sveltejs/vite-plugin-svelte' +import { svelte, vitePreprocess } from '@sveltejs/vite-plugin-svelte' +import sveltePreprocess from "svelte-preprocess"; +import svelteSVG from "vite-plugin-svelte-svg"; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [svelte()], + plugins: [svelte({ + preprocess: [ + vitePreprocess(), + sveltePreprocess({ + typescript: false, + postcss: true, + }), + ], + }), + svelteSVG({ + svgoConfig: { + plugins: [ + { + name: 'preset-default', + params: { + overrides: { + // disable plugins + removeViewBox: false, + }, + }, + }, + { + name: 'prefixIds', + } + ], + }, // See https://github.com/svg/svgo#configuration + requireSuffix: true, // Set false to accept '.svg' without the '?component' + }),], })