diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..ab78a95
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,4 @@
+# Package Managers
+package-lock.json
+pnpm-lock.yaml
+yarn.lock
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..3f7802c
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,15 @@
+{
+ "useTabs": true,
+ "singleQuote": true,
+ "trailingComma": "none",
+ "printWidth": 100,
+ "plugins": ["prettier-plugin-svelte"],
+ "overrides": [
+ {
+ "files": "*.svelte",
+ "options": {
+ "parser": "svelte"
+ }
+ }
+ ]
+}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index bdef820..28d1e67 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -1,3 +1,3 @@
{
- "recommendations": ["svelte.svelte-vscode"]
+ "recommendations": ["svelte.svelte-vscode"]
}
diff --git a/index.html b/index.html
index 13c7e7b..fb42670 100644
--- a/index.html
+++ b/index.html
@@ -1,21 +1,21 @@
-
-
-
-
-
-
-
-
-
- Obliviate
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ Obliviate
+
+
+
+
+
diff --git a/jsconfig.json b/jsconfig.json
index 4258594..7ed0c37 100644
--- a/jsconfig.json
+++ b/jsconfig.json
@@ -1,34 +1,34 @@
{
- "compilerOptions": {
- "moduleResolution": "node",
- "target": "esnext",
- "module": "esnext",
- /**
- * svelte-preprocess cannot figure out whether you have
- * a value or a type, so tell TypeScript to enforce using
- * `import type` instead of `import` for Types.
- */
- "importsNotUsedAsValues": "error",
- "isolatedModules": true,
- "resolveJsonModule": true,
- /**
- * To have warnings / errors of the Svelte compiler at the
- * correct position, enable source maps by default.
- */
- "sourceMap": true,
- "esModuleInterop": true,
- "skipLibCheck": true,
- "forceConsistentCasingInFileNames": true,
- "baseUrl": ".",
- /**
- * Typecheck JS in `.svelte` and `.js` files by default.
- * Disable this if you'd like to use dynamic types.
- */
- "checkJs": true
- },
- /**
- * Use global.d.ts instead of compilerOptions.types
- * to avoid limiting type declarations.
- */
- "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"]
+ "compilerOptions": {
+ "moduleResolution": "node",
+ "target": "esnext",
+ "module": "esnext",
+ /**
+ * svelte-preprocess cannot figure out whether you have
+ * a value or a type, so tell TypeScript to enforce using
+ * `import type` instead of `import` for Types.
+ */
+ "importsNotUsedAsValues": "error",
+ "isolatedModules": true,
+ "resolveJsonModule": true,
+ /**
+ * To have warnings / errors of the Svelte compiler at the
+ * correct position, enable source maps by default.
+ */
+ "sourceMap": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true,
+ "baseUrl": ".",
+ /**
+ * Typecheck JS in `.svelte` and `.js` files by default.
+ * Disable this if you'd like to use dynamic types.
+ */
+ "checkJs": true
+ },
+ /**
+ * Use global.d.ts instead of compilerOptions.types
+ * to avoid limiting type declarations.
+ */
+ "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"]
}
diff --git a/package-lock.json b/package-lock.json
index 9a59d33..d195397 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,7 +13,7 @@
},
"devDependencies": {
"@sveltejs/vite-plugin-svelte": "^4.0.0",
- "prettier": "^3.1.0",
+ "prettier": "^3.3.2",
"prettier-plugin-svelte": "^3.2.6",
"svelte": "^5.0.0",
"vite": "^5.4.4"
diff --git a/package.json b/package.json
index a650ec6..1f915d5 100644
--- a/package.json
+++ b/package.json
@@ -1,22 +1,24 @@
{
- "name": "obliviate-web",
- "private": true,
- "version": "1.0.0",
- "type": "module",
- "scripts": {
- "dev": "vite",
- "build": "vite build",
- "preview": "vite preview"
- },
- "devDependencies": {
- "@sveltejs/vite-plugin-svelte": "^4.0.0",
- "prettier": "^3.1.0",
- "prettier-plugin-svelte": "^3.2.6",
- "svelte": "^5.0.0",
- "vite": "^5.4.4"
- },
- "dependencies": {
- "copy-text-to-clipboard": "^3.0.1",
- "pbkdf2-hmac": "^1.0.4"
- }
+ "name": "obliviate-web",
+ "private": true,
+ "version": "1.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview",
+ "format": "prettier --write .",
+ "lint": "prettier --check ."
+ },
+ "devDependencies": {
+ "@sveltejs/vite-plugin-svelte": "^4.0.0",
+ "prettier": "^3.3.2",
+ "prettier-plugin-svelte": "^3.2.6",
+ "svelte": "^5.0.0",
+ "vite": "^5.4.4"
+ },
+ "dependencies": {
+ "copy-text-to-clipboard": "^3.0.1",
+ "pbkdf2-hmac": "^1.0.4"
+ }
}
diff --git a/public/global.css b/public/global.css
index 20ad8d7..22ddaf4 100644
--- a/public/global.css
+++ b/public/global.css
@@ -1,141 +1,139 @@
:root {
- --bg-color: #fafafa;
- --fg-color: #333;
- --accent-color: #715344;
- --accent-color-dark: #3d211b;
- --input-bg-color: white;
- --input-fg-color: #333;
- --button-bg: linear-gradient(
- to bottom,
- transparent,
- transparent 50%,
- rgba(0 0 0 0.04)
- );
+ --bg-color: #fafafa;
+ --fg-color: #333;
+ --accent-color: #715344;
+ --accent-color-dark: #3d211b;
+ --input-bg-color: white;
+ --input-fg-color: #333;
+ --button-bg: linear-gradient(to bottom, transparent, transparent 50%, rgba(0 0 0 0.04));
}
@media (prefers-color-scheme: dark) {
- :root {
- --bg-color: #1a1a1a;
- --fg-color: #d4d4d4;
- --accent-color: #a3907c;
- --accent-color-dark: #8a715e;
- --input-bg-color: #4d4d4d;
- --input-fg-color: white;
- --button-bg: linear-gradient(
- to bottom,
- rgba(51, 51, 51, 1),
- rgba(51, 51, 51, 1) 50%,
- rgba(51, 51, 51, 0.96)
- );
- }
+ :root {
+ --bg-color: #1a1a1a;
+ --fg-color: #d4d4d4;
+ --accent-color: #a3907c;
+ --accent-color-dark: #8a715e;
+ --input-bg-color: #4d4d4d;
+ --input-fg-color: white;
+ --button-bg: linear-gradient(
+ to bottom,
+ rgba(51, 51, 51, 1),
+ rgba(51, 51, 51, 1) 50%,
+ rgba(51, 51, 51, 0.96)
+ );
+ }
}
html,
body {
- position: relative;
- width: 100%;
- height: 100%;
+ position: relative;
+ width: 100%;
+ height: 100%;
}
body {
- background: var(--bg-color);
- color: var(--fg-color);
- margin: 0;
- box-sizing: border-box;
- font-family: "Inter", sans-serif;
- font-size: 14px;
+ background: var(--bg-color);
+ color: var(--fg-color);
+ margin: 0;
+ box-sizing: border-box;
+ font-family: 'Inter', sans-serif;
+ font-size: 14px;
}
a {
- color: var(--accent-color);
+ color: var(--accent-color);
}
label {
- display: block;
+ display: block;
}
input,
button,
select,
textarea {
- font-family: inherit;
- font-size: inherit;
- -webkit-padding: 0.4em 0;
- padding: 0.4em;
- margin: 0 0 0.5em 0;
- box-sizing: border-box;
- border: 1px solid #ccc;
- border-radius: 2px;
+ font-family: inherit;
+ font-size: inherit;
+ -webkit-padding: 0.4em 0;
+ padding: 0.4em;
+ margin: 0 0 0.5em 0;
+ box-sizing: border-box;
+ border: 1px solid #ccc;
+ border-radius: 2px;
}
-input[type="text"],
-input[type="password"] {
- background-color: var(--input-bg-color);
- border: 1px solid rgba(0, 0, 0, 0.2);
- border-radius: 3px;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
- padding: 6px;
- color: var(--input-fg-color);
+input[type='text'],
+input[type='password'] {
+ background-color: var(--input-bg-color);
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 3px;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+ padding: 6px;
+ color: var(--input-fg-color);
}
input:active,
input:focus,
button:focus,
-input[type="submit"]:focus {
- outline: none;
- border: 1px solid var(--accent-color);
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.05),
- inset 0 1px 0 0 rgba(255, 255, 255, 0.45),
- inset 0 -1px 0 0 rgba(255, 255, 255, 0.15),
- 0 3px 6px rgba(113, 83, 68, 0.16), 0 3px 6px rgba(113, 83, 68, 0.23);
+input[type='submit']:focus {
+ outline: none;
+ border: 1px solid var(--accent-color);
+ box-shadow:
+ inset 0 0 0 1px rgba(255, 255, 255, 0.05),
+ inset 0 1px 0 0 rgba(255, 255, 255, 0.45),
+ inset 0 -1px 0 0 rgba(255, 255, 255, 0.15),
+ 0 3px 6px rgba(113, 83, 68, 0.16),
+ 0 3px 6px rgba(113, 83, 68, 0.23);
}
.info,
.toggle {
- align-self: center;
- width: min-content;
- padding: 0.125em 0.25em;
- background: transparent;
- border: 1px solid transparent;
- color: currentColor;
- font-size: large;
+ align-self: center;
+ width: min-content;
+ padding: 0.125em 0.25em;
+ background: transparent;
+ border: 1px solid transparent;
+ color: currentColor;
+ font-size: large;
}
.info:focus,
.toggle:focus {
- border: 1px solid var(--accent-color);
- box-shadow: none;
- color: var(--accent-color);
+ border: 1px solid var(--accent-color);
+ box-shadow: none;
+ color: var(--accent-color);
}
input:disabled {
- color: #ccc;
- box-shadow: none;
+ color: #ccc;
+ box-shadow: none;
}
button,
-input[type="submit"] {
- background: var(--button-bg);
- border: 1px solid rgba(0, 0, 0, 0.2);
- border-radius: 3px;
- color: currentColor;
- outline: none;
+input[type='submit'] {
+ background: var(--button-bg);
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 3px;
+ color: currentColor;
+ outline: none;
}
button:disabled,
-input[type="submit"]:disabled {
- color: #999;
+input[type='submit']:disabled {
+ color: #999;
}
button:not(:disabled):active,
-input[type="submit"]:not(:disabled):active {
- background-color: rgba(0, 0, 0, 0.05);
- background-image: none;
- border-color: rgba(0, 0, 0, 0.25);
- box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.05),
- 0 1px 0 0 rgba(255, 255, 255, 0.3);
+input[type='submit']:not(:disabled):active {
+ background-color: rgba(0, 0, 0, 0.05);
+ background-image: none;
+ border-color: rgba(0, 0, 0, 0.25);
+ box-shadow:
+ inset 0 0 0 1px rgba(0, 0, 0, 0.05),
+ 0 1px 0 0 rgba(255, 255, 255, 0.3);
}
button:focus {
- border-color: #666;
+ border-color: #666;
}
diff --git a/public/icons/remixicon.css b/public/icons/remixicon.css
index 9652c5a..0978789 100644
--- a/public/icons/remixicon.css
+++ b/public/icons/remixicon.css
@@ -1,4 +1,3 @@
-
/*
* https://remixicon.com
* https://github.com/Remix-Design/RemixIcon
@@ -7,40 +6,86 @@
*/
@font-face {
- font-family: "remixicon";
- src: url('remixicon.eot?t=1607859683539'); /* IE9*/
- src: url('remixicon.eot?t=1607859683539#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url("remixicon.woff2?t=1607859683539") format("woff2"),
- url("remixicon.woff?t=1607859683539") format("woff"),
- url('remixicon.ttf?t=1607859683539') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
- url('remixicon.svg?t=1607859683539#remixicon') format('svg'); /* iOS 4.1- */
- font-display: swap;
+ font-family: 'remixicon';
+ src: url('remixicon.eot?t=1607859683539'); /* IE9*/
+ src:
+ url('remixicon.eot?t=1607859683539#iefix') format('embedded-opentype'),
+ /* IE6-IE8 */ url('remixicon.woff2?t=1607859683539') format('woff2'),
+ url('remixicon.woff?t=1607859683539') format('woff'),
+ url('remixicon.ttf?t=1607859683539') format('truetype'),
+ /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+ url('remixicon.svg?t=1607859683539#remixicon') format('svg'); /* iOS 4.1- */
+ font-display: swap;
}
-[class^="ri-"], [class*="ri-"] {
- font-family: 'remixicon' !important;
- font-style: normal;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
+[class^='ri-'],
+[class*='ri-'] {
+ font-family: 'remixicon' !important;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
}
-.ri-lg { font-size: 1.3333em; line-height: 0.75em; vertical-align: -.0667em; }
-.ri-xl { font-size: 1.5em; line-height: 0.6666em; vertical-align: -.075em; }
-.ri-xxs { font-size: .5em; }
-.ri-xs { font-size: .75em; }
-.ri-sm { font-size: .875em }
-.ri-1x { font-size: 1em; }
-.ri-2x { font-size: 2em; }
-.ri-3x { font-size: 3em; }
-.ri-4x { font-size: 4em; }
-.ri-5x { font-size: 5em; }
-.ri-6x { font-size: 6em; }
-.ri-7x { font-size: 7em; }
-.ri-8x { font-size: 8em; }
-.ri-9x { font-size: 9em; }
-.ri-10x { font-size: 10em; }
-.ri-fw { text-align: center; width: 1.25em; }
+.ri-lg {
+ font-size: 1.3333em;
+ line-height: 0.75em;
+ vertical-align: -0.0667em;
+}
+.ri-xl {
+ font-size: 1.5em;
+ line-height: 0.6666em;
+ vertical-align: -0.075em;
+}
+.ri-xxs {
+ font-size: 0.5em;
+}
+.ri-xs {
+ font-size: 0.75em;
+}
+.ri-sm {
+ font-size: 0.875em;
+}
+.ri-1x {
+ font-size: 1em;
+}
+.ri-2x {
+ font-size: 2em;
+}
+.ri-3x {
+ font-size: 3em;
+}
+.ri-4x {
+ font-size: 4em;
+}
+.ri-5x {
+ font-size: 5em;
+}
+.ri-6x {
+ font-size: 6em;
+}
+.ri-7x {
+ font-size: 7em;
+}
+.ri-8x {
+ font-size: 8em;
+}
+.ri-9x {
+ font-size: 9em;
+}
+.ri-10x {
+ font-size: 10em;
+}
+.ri-fw {
+ text-align: center;
+ width: 1.25em;
+}
-.ri-information-line:before { content: "\ee59"; }
-.ri-eye-off-line:before { content: "\ecb7"; }
-.ri-eye-line:before { content: "\ecb5"; }
+.ri-information-line:before {
+ content: '\ee59';
+}
+.ri-eye-off-line:before {
+ content: '\ecb7';
+}
+.ri-eye-line:before {
+ content: '\ecb5';
+}
diff --git a/public/icons/remixicon.less b/public/icons/remixicon.less
index 14fbae6..fd456b9 100644
--- a/public/icons/remixicon.less
+++ b/public/icons/remixicon.less
@@ -1,4 +1,3 @@
-
/*
* https://remixicon.com
* https://github.com/Remix-Design/RemixIcon
@@ -7,42 +6,88 @@
*/
@font-face {
- font-family: "remixicon";
- src: url('remixicon.eot?t=1607859683539'); /* IE9*/
- src: url('remixicon.eot?t=1607859683539#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url("remixicon.woff2?t=1607859683539") format("woff2"),
- url("remixicon.woff?t=1607859683539") format("woff"),
- url('remixicon.ttf?t=1607859683539') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
- url('remixicon.svg?t=1607859683539#remixicon') format('svg'); /* iOS 4.1- */
- font-display: swap;
+ font-family: 'remixicon';
+ src: url('remixicon.eot?t=1607859683539'); /* IE9*/
+ src:
+ url('remixicon.eot?t=1607859683539#iefix') format('embedded-opentype'),
+ /* IE6-IE8 */ url('remixicon.woff2?t=1607859683539') format('woff2'),
+ url('remixicon.woff?t=1607859683539') format('woff'),
+ url('remixicon.ttf?t=1607859683539') format('truetype'),
+ /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+ url('remixicon.svg?t=1607859683539#remixicon') format('svg'); /* iOS 4.1- */
+ font-display: swap;
}
-[class^="ri-"], [class*="ri-"] {
- font-family: 'remixicon' !important;
- font-style: normal;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
+[class^='ri-'],
+[class*='ri-'] {
+ font-family: 'remixicon' !important;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
}
:global {
-.ri-lg { font-size: 1.3333em; line-height: 0.75em; vertical-align: -.0667em; }
-.ri-xl { font-size: 1.5em; line-height: 0.6666em; vertical-align: -.075em; }
-.ri-xxs { font-size: .5em; }
-.ri-xs { font-size: .75em; }
-.ri-sm { font-size: .875em }
-.ri-1x { font-size: 1em; }
-.ri-2x { font-size: 2em; }
-.ri-3x { font-size: 3em; }
-.ri-4x { font-size: 4em; }
-.ri-5x { font-size: 5em; }
-.ri-6x { font-size: 6em; }
-.ri-7x { font-size: 7em; }
-.ri-8x { font-size: 8em; }
-.ri-9x { font-size: 9em; }
-.ri-10x { font-size: 10em; }
-.ri-fw { text-align: center; width: 1.25em; }
+ .ri-lg {
+ font-size: 1.3333em;
+ line-height: 0.75em;
+ vertical-align: -0.0667em;
+ }
+ .ri-xl {
+ font-size: 1.5em;
+ line-height: 0.6666em;
+ vertical-align: -0.075em;
+ }
+ .ri-xxs {
+ font-size: 0.5em;
+ }
+ .ri-xs {
+ font-size: 0.75em;
+ }
+ .ri-sm {
+ font-size: 0.875em;
+ }
+ .ri-1x {
+ font-size: 1em;
+ }
+ .ri-2x {
+ font-size: 2em;
+ }
+ .ri-3x {
+ font-size: 3em;
+ }
+ .ri-4x {
+ font-size: 4em;
+ }
+ .ri-5x {
+ font-size: 5em;
+ }
+ .ri-6x {
+ font-size: 6em;
+ }
+ .ri-7x {
+ font-size: 7em;
+ }
+ .ri-8x {
+ font-size: 8em;
+ }
+ .ri-9x {
+ font-size: 9em;
+ }
+ .ri-10x {
+ font-size: 10em;
+ }
+ .ri-fw {
+ text-align: center;
+ width: 1.25em;
+ }
-.ri-information-line:before { content: "\ee59"; }
-.ri-eye-off-line:before { content: "\ecb7"; }
-.ri-eye-line:before { content: "\ecb5"; }
-}
\ No newline at end of file
+ .ri-information-line:before {
+ content: '\ee59';
+ }
+ .ri-eye-off-line:before {
+ content: '\ecb7';
+ }
+ .ri-eye-line:before {
+ content: '\ecb5';
+ }
+}
diff --git a/public/index.html b/public/index.html
index 5420da3..a4c028a 100644
--- a/public/index.html
+++ b/public/index.html
@@ -1,25 +1,25 @@
-
+
+
+
+
-
-
-
+ Obliviate
- Obliviate
+
+
-
-
+
+
+
+
+
-
-
-
-
-
+
+
-
-
-
-
-
-
-
\ No newline at end of file
+
+