From 2c5ec6b2819d467e9a231ae65ebd31fc0867a385 Mon Sep 17 00:00:00 2001 From: Martin Drechsel Date: Wed, 2 Apr 2025 18:54:55 +0200 Subject: [PATCH] init commit --- README.md | 16 + drizzle.config.ts | 10 + nuxt.config.ts | 80 + package.json | 59 + pnpm-lock.yaml | 9228 +++++++++++++++++ public/tauri.svg | 6 + public/vite.svg | 1 + src-tauri/.env | 2 + src-tauri/.gitignore | 7 + ...8b002662b594f7f569ee71de11e00c23ca625.json | 44 + src-tauri/Cargo.lock | 5862 +++++++++++ src-tauri/Cargo.toml | 37 + src-tauri/build.rs | 3 + src-tauri/capabilities/default.json | 28 + .../migrations/0000_zippy_scourge.sql | 26 + .../migrations/meta/0000_snapshot.json | 185 + .../database/migrations/meta/_journal.json | 13 + src-tauri/database/schemas/vault.ts | 52 + src-tauri/database/vault.db | Bin 0 -> 40960 bytes src-tauri/icons/128x128.png | Bin 0 -> 8929 bytes src-tauri/icons/128x128@2x.png | Bin 0 -> 21182 bytes src-tauri/icons/32x32.png | Bin 0 -> 1656 bytes src-tauri/icons/64x64.png | Bin 0 -> 3827 bytes src-tauri/icons/Square107x107Logo.png | Bin 0 -> 7198 bytes src-tauri/icons/Square142x142Logo.png | Bin 0 -> 10188 bytes src-tauri/icons/Square150x150Logo.png | Bin 0 -> 10949 bytes src-tauri/icons/Square284x284Logo.png | Bin 0 -> 24220 bytes src-tauri/icons/Square30x30Logo.png | Bin 0 -> 1566 bytes src-tauri/icons/Square310x310Logo.png | Bin 0 -> 27011 bytes src-tauri/icons/Square44x44Logo.png | Bin 0 -> 2509 bytes src-tauri/icons/Square71x71Logo.png | Bin 0 -> 4392 bytes src-tauri/icons/Square89x89Logo.png | Bin 0 -> 5728 bytes src-tauri/icons/StoreLogo.png | Bin 0 -> 2922 bytes src-tauri/icons/icon.icns | Bin 0 -> 261919 bytes src-tauri/icons/icon.ico | Bin 0 -> 34607 bytes src-tauri/icons/icon.png | Bin 0 -> 49325 bytes src-tauri/icons/ios/AppIcon-20x20@1x.png | Bin 0 -> 834 bytes src-tauri/icons/ios/AppIcon-20x20@2x-1.png | Bin 0 -> 1836 bytes src-tauri/icons/ios/AppIcon-20x20@2x.png | Bin 0 -> 1836 bytes src-tauri/icons/ios/AppIcon-20x20@3x.png | Bin 0 -> 2917 bytes src-tauri/icons/ios/AppIcon-29x29@1x.png | Bin 0 -> 1279 bytes src-tauri/icons/ios/AppIcon-29x29@2x-1.png | Bin 0 -> 2802 bytes src-tauri/icons/ios/AppIcon-29x29@2x.png | Bin 0 -> 2802 bytes src-tauri/icons/ios/AppIcon-29x29@3x.png | Bin 0 -> 4412 bytes src-tauri/icons/ios/AppIcon-40x40@1x.png | Bin 0 -> 1836 bytes src-tauri/icons/ios/AppIcon-40x40@2x-1.png | Bin 0 -> 4092 bytes src-tauri/icons/ios/AppIcon-40x40@2x.png | Bin 0 -> 4092 bytes src-tauri/icons/ios/AppIcon-40x40@3x.png | Bin 0 -> 6484 bytes src-tauri/icons/ios/AppIcon-512@2x.png | Bin 0 -> 92198 bytes src-tauri/icons/ios/AppIcon-60x60@2x.png | Bin 0 -> 6484 bytes src-tauri/icons/ios/AppIcon-60x60@3x.png | Bin 0 -> 10591 bytes src-tauri/icons/ios/AppIcon-76x76@1x.png | Bin 0 -> 3833 bytes src-tauri/icons/ios/AppIcon-76x76@2x.png | Bin 0 -> 8718 bytes src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png | Bin 0 -> 9790 bytes src-tauri/src/browser/manager.rs | 285 + src-tauri/src/browser/middleware.rs | 125 + src-tauri/src/browser/mod.rs | 188 + src-tauri/src/database/core.rs | 160 + src-tauri/src/database/mod.rs | 122 + src-tauri/src/extension/database/mod.rs | 46 + .../src/extension/database/permissions.rs | 203 + src-tauri/src/extension/mod.rs | 1 + src-tauri/src/lib.rs | 32 + src-tauri/src/main.rs | 6 + src-tauri/src/models.rs | 50 + src-tauri/tauri.conf.json | 38 + src/app.vue | 27 + src/components/haex/browser/index.vue | 155 + src/components/haex/browser/tabBar.vue | 43 + src/components/haex/browser/urlBar.vue | 57 + src/components/ui/button/action.vue | 79 + src/components/ui/button/index.vue | 25 + src/components/ui/button/types.d.ts | 8 + src/components/ui/dialog/index.vue | 121 + src/components/ui/dialog/test.vue | 58 + src/components/ui/dialog/title.vue | 5 + src/components/ui/input/index.vue | 199 + src/components/ui/input/password.vue | 54 + src/components/ui/input/url.vue | 56 + src/components/ui/logo/itemis.vue | 91 + src/components/ui/sidebar/button.vue | 24 + src/components/ui/sidebar/index.vue | 109 + src/components/ui/sidebar/link.vue | 61 + src/components/ui/sidebar/test.vue | 268 + src/components/ui/text/gradient.vue | 7 + src/components/ui/tooltip/index.vue | 61 + src/components/vault/button/create.vue | 165 + src/components/vault/button/open.vue | 179 + src/components/vault/button/schema.ts | 7 + src/components/vault/card/edit.vue | 250 + src/components/vault/card/index.vue | 42 + src/components/vault/dialog/item/create.vue | 32 + src/components/vault/group/index.vue | 117 + src/components/vault/list/entry.vue | 42 + src/components/vault/list/index.vue | 7 + src/components/vault/modal/saveChanges.vue | 78 + src/composables/helper.ts | 96 + src/i18n/i18n.config.ts | 16 + src/layouts/app.vue | 271 + src/layouts/default.vue | 5 + src/pages/index.vue | 155 + src/pages/test.vue | 10 + src/pages/vault.vue | 7 + src/pages/vault/[vaultId]/browser.vue | 127 + .../[vaultId]/extensions/[extensionId].vue | 13 + .../vault/[vaultId]/extensions/index.vue | 9 + src/pages/vault/[vaultId]/index.vue | 9 + src/plugins/flyonui.client.ts | 13 + src/public/favicon.ico | Bin 0 -> 4286 bytes src/public/itemis.svg | 48 + src/public/logo.svg | 207 + src/public/logo_square.svg | 207 + src/public/robots.txt | 1 + src/stores/browser/extensions.ts | 90 + src/stores/browser/index.ts | 0 src/stores/extensions/index.ts | 57 + src/stores/ui/de.json | 5 + src/stores/ui/en.json | 5 + src/stores/ui/index.ts | 41 + src/stores/ui/notifications.ts | 22 + src/stores/ui/sidebar.ts | 44 + src/stores/vault/index.ts | 231 + src/stores/vault/lastVaults.ts | 80 + src/utils/webview-bridge.js | 60 + tailwind.config.ts | 148 + tsconfig.json | 4 + 126 files changed, 21323 insertions(+) create mode 100644 README.md create mode 100644 drizzle.config.ts create mode 100644 nuxt.config.ts create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 public/tauri.svg create mode 100644 public/vite.svg create mode 100644 src-tauri/.env create mode 100644 src-tauri/.gitignore create mode 100644 src-tauri/.sqlx/query-a73e92ff12dca9b046a6440b9a68b002662b594f7f569ee71de11e00c23ca625.json create mode 100644 src-tauri/Cargo.lock create mode 100644 src-tauri/Cargo.toml create mode 100644 src-tauri/build.rs create mode 100644 src-tauri/capabilities/default.json create mode 100644 src-tauri/database/migrations/0000_zippy_scourge.sql create mode 100644 src-tauri/database/migrations/meta/0000_snapshot.json create mode 100644 src-tauri/database/migrations/meta/_journal.json create mode 100644 src-tauri/database/schemas/vault.ts create mode 100644 src-tauri/database/vault.db create mode 100644 src-tauri/icons/128x128.png create mode 100644 src-tauri/icons/128x128@2x.png create mode 100644 src-tauri/icons/32x32.png create mode 100644 src-tauri/icons/64x64.png create mode 100644 src-tauri/icons/Square107x107Logo.png create mode 100644 src-tauri/icons/Square142x142Logo.png create mode 100644 src-tauri/icons/Square150x150Logo.png create mode 100644 src-tauri/icons/Square284x284Logo.png create mode 100644 src-tauri/icons/Square30x30Logo.png create mode 100644 src-tauri/icons/Square310x310Logo.png create mode 100644 src-tauri/icons/Square44x44Logo.png create mode 100644 src-tauri/icons/Square71x71Logo.png create mode 100644 src-tauri/icons/Square89x89Logo.png create mode 100644 src-tauri/icons/StoreLogo.png create mode 100644 src-tauri/icons/icon.icns create mode 100644 src-tauri/icons/icon.ico create mode 100644 src-tauri/icons/icon.png create mode 100644 src-tauri/icons/ios/AppIcon-20x20@1x.png create mode 100644 src-tauri/icons/ios/AppIcon-20x20@2x-1.png create mode 100644 src-tauri/icons/ios/AppIcon-20x20@2x.png create mode 100644 src-tauri/icons/ios/AppIcon-20x20@3x.png create mode 100644 src-tauri/icons/ios/AppIcon-29x29@1x.png create mode 100644 src-tauri/icons/ios/AppIcon-29x29@2x-1.png create mode 100644 src-tauri/icons/ios/AppIcon-29x29@2x.png create mode 100644 src-tauri/icons/ios/AppIcon-29x29@3x.png create mode 100644 src-tauri/icons/ios/AppIcon-40x40@1x.png create mode 100644 src-tauri/icons/ios/AppIcon-40x40@2x-1.png create mode 100644 src-tauri/icons/ios/AppIcon-40x40@2x.png create mode 100644 src-tauri/icons/ios/AppIcon-40x40@3x.png create mode 100644 src-tauri/icons/ios/AppIcon-512@2x.png create mode 100644 src-tauri/icons/ios/AppIcon-60x60@2x.png create mode 100644 src-tauri/icons/ios/AppIcon-60x60@3x.png create mode 100644 src-tauri/icons/ios/AppIcon-76x76@1x.png create mode 100644 src-tauri/icons/ios/AppIcon-76x76@2x.png create mode 100644 src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png create mode 100644 src-tauri/src/browser/manager.rs create mode 100644 src-tauri/src/browser/middleware.rs create mode 100644 src-tauri/src/browser/mod.rs create mode 100644 src-tauri/src/database/core.rs create mode 100644 src-tauri/src/database/mod.rs create mode 100644 src-tauri/src/extension/database/mod.rs create mode 100644 src-tauri/src/extension/database/permissions.rs create mode 100644 src-tauri/src/extension/mod.rs create mode 100644 src-tauri/src/lib.rs create mode 100644 src-tauri/src/main.rs create mode 100644 src-tauri/src/models.rs create mode 100644 src-tauri/tauri.conf.json create mode 100644 src/app.vue create mode 100644 src/components/haex/browser/index.vue create mode 100644 src/components/haex/browser/tabBar.vue create mode 100644 src/components/haex/browser/urlBar.vue create mode 100644 src/components/ui/button/action.vue create mode 100644 src/components/ui/button/index.vue create mode 100644 src/components/ui/button/types.d.ts create mode 100644 src/components/ui/dialog/index.vue create mode 100644 src/components/ui/dialog/test.vue create mode 100644 src/components/ui/dialog/title.vue create mode 100644 src/components/ui/input/index.vue create mode 100644 src/components/ui/input/password.vue create mode 100644 src/components/ui/input/url.vue create mode 100644 src/components/ui/logo/itemis.vue create mode 100644 src/components/ui/sidebar/button.vue create mode 100644 src/components/ui/sidebar/index.vue create mode 100644 src/components/ui/sidebar/link.vue create mode 100644 src/components/ui/sidebar/test.vue create mode 100644 src/components/ui/text/gradient.vue create mode 100644 src/components/ui/tooltip/index.vue create mode 100644 src/components/vault/button/create.vue create mode 100644 src/components/vault/button/open.vue create mode 100644 src/components/vault/button/schema.ts create mode 100644 src/components/vault/card/edit.vue create mode 100644 src/components/vault/card/index.vue create mode 100644 src/components/vault/dialog/item/create.vue create mode 100644 src/components/vault/group/index.vue create mode 100644 src/components/vault/list/entry.vue create mode 100644 src/components/vault/list/index.vue create mode 100644 src/components/vault/modal/saveChanges.vue create mode 100644 src/composables/helper.ts create mode 100644 src/i18n/i18n.config.ts create mode 100644 src/layouts/app.vue create mode 100644 src/layouts/default.vue create mode 100644 src/pages/index.vue create mode 100644 src/pages/test.vue create mode 100644 src/pages/vault.vue create mode 100644 src/pages/vault/[vaultId]/browser.vue create mode 100644 src/pages/vault/[vaultId]/extensions/[extensionId].vue create mode 100644 src/pages/vault/[vaultId]/extensions/index.vue create mode 100644 src/pages/vault/[vaultId]/index.vue create mode 100644 src/plugins/flyonui.client.ts create mode 100644 src/public/favicon.ico create mode 100644 src/public/itemis.svg create mode 100644 src/public/logo.svg create mode 100644 src/public/logo_square.svg create mode 100644 src/public/robots.txt create mode 100644 src/stores/browser/extensions.ts create mode 100644 src/stores/browser/index.ts create mode 100644 src/stores/extensions/index.ts create mode 100644 src/stores/ui/de.json create mode 100644 src/stores/ui/en.json create mode 100644 src/stores/ui/index.ts create mode 100644 src/stores/ui/notifications.ts create mode 100644 src/stores/ui/sidebar.ts create mode 100644 src/stores/vault/index.ts create mode 100644 src/stores/vault/lastVaults.ts create mode 100644 src/utils/webview-bridge.js create mode 100644 tailwind.config.ts create mode 100644 tsconfig.json diff --git a/README.md b/README.md new file mode 100644 index 0000000..5047afc --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# Tauri + Vue + TypeScript + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + diff --git a/src/components/haex/browser/index.vue b/src/components/haex/browser/index.vue new file mode 100644 index 0000000..e88478e --- /dev/null +++ b/src/components/haex/browser/index.vue @@ -0,0 +1,155 @@ + + + diff --git a/src/components/haex/browser/tabBar.vue b/src/components/haex/browser/tabBar.vue new file mode 100644 index 0000000..bcd2b88 --- /dev/null +++ b/src/components/haex/browser/tabBar.vue @@ -0,0 +1,43 @@ + + + diff --git a/src/components/haex/browser/urlBar.vue b/src/components/haex/browser/urlBar.vue new file mode 100644 index 0000000..17f93d9 --- /dev/null +++ b/src/components/haex/browser/urlBar.vue @@ -0,0 +1,57 @@ + + + diff --git a/src/components/ui/button/action.vue b/src/components/ui/button/action.vue new file mode 100644 index 0000000..b414566 --- /dev/null +++ b/src/components/ui/button/action.vue @@ -0,0 +1,79 @@ + + + diff --git a/src/components/ui/button/index.vue b/src/components/ui/button/index.vue new file mode 100644 index 0000000..b26029f --- /dev/null +++ b/src/components/ui/button/index.vue @@ -0,0 +1,25 @@ + + + diff --git a/src/components/ui/button/types.d.ts b/src/components/ui/button/types.d.ts new file mode 100644 index 0000000..4a9fc13 --- /dev/null +++ b/src/components/ui/button/types.d.ts @@ -0,0 +1,8 @@ +import type { RouteLocationRaw } from 'vue-router'; + +export interface IActionMenuItem { + label: string; + icon?: string; + action?: () => Promise; + to?: RouteLocationRaw; +} diff --git a/src/components/ui/dialog/index.vue b/src/components/ui/dialog/index.vue new file mode 100644 index 0000000..1d24dfb --- /dev/null +++ b/src/components/ui/dialog/index.vue @@ -0,0 +1,121 @@ + + + + + +{ + "de": { + "close": "Schließen" + }, + "en": { + "close": "Close" + } +} + diff --git a/src/components/ui/dialog/test.vue b/src/components/ui/dialog/test.vue new file mode 100644 index 0000000..b37bd4b --- /dev/null +++ b/src/components/ui/dialog/test.vue @@ -0,0 +1,58 @@ + diff --git a/src/components/ui/dialog/title.vue b/src/components/ui/dialog/title.vue new file mode 100644 index 0000000..d31fa39 --- /dev/null +++ b/src/components/ui/dialog/title.vue @@ -0,0 +1,5 @@ + diff --git a/src/components/ui/input/index.vue b/src/components/ui/input/index.vue new file mode 100644 index 0000000..4991ad5 --- /dev/null +++ b/src/components/ui/input/index.vue @@ -0,0 +1,199 @@ + + + diff --git a/src/components/ui/input/password.vue b/src/components/ui/input/password.vue new file mode 100644 index 0000000..d644880 --- /dev/null +++ b/src/components/ui/input/password.vue @@ -0,0 +1,54 @@ + + + + + +{ + "de": { + "password": "Passwort" + }, + "en": { + "password": "Password" + } +} + diff --git a/src/components/ui/input/url.vue b/src/components/ui/input/url.vue new file mode 100644 index 0000000..2e6cc95 --- /dev/null +++ b/src/components/ui/input/url.vue @@ -0,0 +1,56 @@ + + + + + +{ + "de": { + "url": "Url" + }, + "en": { + "url": "Url" + } +} + diff --git a/src/components/ui/logo/itemis.vue b/src/components/ui/logo/itemis.vue new file mode 100644 index 0000000..199194a --- /dev/null +++ b/src/components/ui/logo/itemis.vue @@ -0,0 +1,91 @@ + diff --git a/src/components/ui/sidebar/button.vue b/src/components/ui/sidebar/button.vue new file mode 100644 index 0000000..96799c5 --- /dev/null +++ b/src/components/ui/sidebar/button.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/components/ui/sidebar/index.vue b/src/components/ui/sidebar/index.vue new file mode 100644 index 0000000..b809892 --- /dev/null +++ b/src/components/ui/sidebar/index.vue @@ -0,0 +1,109 @@ + + + diff --git a/src/components/ui/sidebar/link.vue b/src/components/ui/sidebar/link.vue new file mode 100644 index 0000000..74d6fb1 --- /dev/null +++ b/src/components/ui/sidebar/link.vue @@ -0,0 +1,61 @@ + + + diff --git a/src/components/ui/sidebar/test.vue b/src/components/ui/sidebar/test.vue new file mode 100644 index 0000000..02b5deb --- /dev/null +++ b/src/components/ui/sidebar/test.vue @@ -0,0 +1,268 @@ + + + + + +de: + notifications: + label: Benachrichtigungen + view_all: Alle ansehen +en: + notifications: + label: Notifications + view_all: View all + diff --git a/src/components/ui/text/gradient.vue b/src/components/ui/text/gradient.vue new file mode 100644 index 0000000..7ea83ac --- /dev/null +++ b/src/components/ui/text/gradient.vue @@ -0,0 +1,7 @@ + diff --git a/src/components/ui/tooltip/index.vue b/src/components/ui/tooltip/index.vue new file mode 100644 index 0000000..28a173b --- /dev/null +++ b/src/components/ui/tooltip/index.vue @@ -0,0 +1,61 @@ + + + diff --git a/src/components/vault/button/create.vue b/src/components/vault/button/create.vue new file mode 100644 index 0000000..cea0a65 --- /dev/null +++ b/src/components/vault/button/create.vue @@ -0,0 +1,165 @@ + + + + + +{ + "de": { + "database": { + "label": "Datenbankname", + "placeholder": "Passwörter", + "create": "Neue Vault anlegen", + "name": "Passwörter" + }, + "title": "Neue Datenbank anlegen", + "create": "Erstellen", + "abort": "Abbrechen", + "description": "Haex Vault für deine geheimsten Geheimnisse" + }, + + "en": { + "database": { + "label": "Databasename", + "placeholder": "Databasename", + "create": "Create new Vault", + "name": "Passwords" + }, + "title": "Create New Database", + "create": "Create", + "abort": "Abort", + "description": "Haex Vault for your most secret secrets" + } +} + diff --git a/src/components/vault/button/open.vue b/src/components/vault/button/open.vue new file mode 100644 index 0000000..8695722 --- /dev/null +++ b/src/components/vault/button/open.vue @@ -0,0 +1,179 @@ + + + + + +{ + "de": { + "open": "Öffnen", + "abort": "Abbrechen", + "database": { + "open": "Vault öffnen" + } + }, + + "en": { + "open": "Open", + "abort": "Abort", + "database": { + "open": "Open Vault" + } + } +} + diff --git a/src/components/vault/button/schema.ts b/src/components/vault/button/schema.ts new file mode 100644 index 0000000..03a0b52 --- /dev/null +++ b/src/components/vault/button/schema.ts @@ -0,0 +1,7 @@ +import { z } from 'zod'; + +export const vaultDatabaseSchema = { + password: z.string().min(6).max(255), + name: z.string().min(1).max(255), + path: z.string().min(4).endsWith('.db'), +}; diff --git a/src/components/vault/card/edit.vue b/src/components/vault/card/edit.vue new file mode 100644 index 0000000..89e7b81 --- /dev/null +++ b/src/components/vault/card/edit.vue @@ -0,0 +1,250 @@ + + + + + +{ + "de": { + "create": "Anlegen", + "abort": "Abbrechen", + "entry": { + "title": "Titel", + "username": "Nutzername", + "password": "Passwort", + "url": "Url" + }, + "tab": { + "details": "Details", + "keyValue": "Extra", + "history": "Verlauf" + } + }, + "en": { + "create": "Create", + "abort": "Abort", + "entry": { + "title": "Title", + "username": "Username", + "password": "Password", + "url": "Url" + }, + "tab": { + "details": "Details", + "keyValue": "Extra", + "history": "History" + } + } +} + diff --git a/src/components/vault/card/index.vue b/src/components/vault/card/index.vue new file mode 100644 index 0000000..4dc09ba --- /dev/null +++ b/src/components/vault/card/index.vue @@ -0,0 +1,42 @@ + + + diff --git a/src/components/vault/dialog/item/create.vue b/src/components/vault/dialog/item/create.vue new file mode 100644 index 0000000..0d4d0ba --- /dev/null +++ b/src/components/vault/dialog/item/create.vue @@ -0,0 +1,32 @@ + + + + + +{ + "de": { + "title": "Eintrag erstellen" + }, + "en": { + "title": "Create Entry" + } +} + diff --git a/src/components/vault/group/index.vue b/src/components/vault/group/index.vue new file mode 100644 index 0000000..1fe4cc6 --- /dev/null +++ b/src/components/vault/group/index.vue @@ -0,0 +1,117 @@ + + + + + +{ + "de": { + "vaultGroup": { + "name": "Name", + "description": "Beschreibung", + "icon": "Icon", + "color": "Farbe" + } + }, + "en": { + "vaultGroup": { + "name": "Name", + "description": "Description", + "icon": "Icon", + "color": "Color" + } + } +} + diff --git a/src/components/vault/list/entry.vue b/src/components/vault/list/entry.vue new file mode 100644 index 0000000..e0438ec --- /dev/null +++ b/src/components/vault/list/entry.vue @@ -0,0 +1,42 @@ + + + diff --git a/src/components/vault/list/index.vue b/src/components/vault/list/index.vue new file mode 100644 index 0000000..1b036b7 --- /dev/null +++ b/src/components/vault/list/index.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/components/vault/modal/saveChanges.vue b/src/components/vault/modal/saveChanges.vue new file mode 100644 index 0000000..a97f7ed --- /dev/null +++ b/src/components/vault/modal/saveChanges.vue @@ -0,0 +1,78 @@ + + + + + +{ + "de": { + "dialog": { + "title": "Ungespeicherte Änderungen", + "question": "Möchten Sie die Änderungen speichern?", + "reject": "Verwerfen", + "abort": "Abbrechen", + "save": "Speichern" + } + }, + "en": { + "dialog": { + "title": "Unsaved Changes", + "question": "Would you like to save the changes?", + "reject": "Reject", + "abort": "Abort", + "save": "Save" + } + } +} + diff --git a/src/composables/helper.ts b/src/composables/helper.ts new file mode 100644 index 0000000..2d1cfb2 --- /dev/null +++ b/src/composables/helper.ts @@ -0,0 +1,96 @@ +import { H3Error } from 'h3'; + +export const bytesToBase64DataUrlAsync = async ( + bytes: Uint8Array, + type = 'application/octet-stream' +) => { + return await new Promise((resolve, reject) => { + const reader = Object.assign(new FileReader(), { + onload: () => resolve(reader.result), + onerror: () => reject(reader.error), + }); + reader.readAsDataURL(new File([new Blob([bytes])], '', { type })); + }); +}; + +export const blobToImageAsync = (blob: Blob): Promise => { + return new Promise((resolve) => { + console.log('transform blob', blob); + const url = URL.createObjectURL(blob); + let img = new Image(); + img.onload = () => { + URL.revokeObjectURL(url); + resolve(img); + }; + img.src = url; + }); +}; + +export const deepToRaw = >(sourceObj: T): T => { + const objectIterator = (input: any): any => { + if (Array.isArray(input)) { + return input.map((item) => objectIterator(item)); + } + if (isRef(input) || isReactive(input) || isProxy(input)) { + return objectIterator(toRaw(input)); + } + if (input && typeof input === 'object') { + return Object.keys(input).reduce((acc, key) => { + acc[key as keyof typeof acc] = objectIterator(input[key]); + return acc; + }, {} as T); + } + return input; + }; + + return objectIterator(sourceObj); +}; + +export const readableFileSize = (sizeInByte: number | string = 0) => { + if (!sizeInByte) { + return '0 KB'; + } + const size = + typeof sizeInByte === 'string' ? parseInt(sizeInByte) : sizeInByte; + const sizeInKb = size / 1024; + const sizeInMb = sizeInKb / 1024; + const sizeInGb = sizeInMb / 1024; + const sizeInTb = sizeInGb / 1024; + + if (sizeInTb > 1) return `${sizeInTb.toFixed(2)} TB`; + if (sizeInGb > 1) return `${sizeInGb.toFixed(2)} GB`; + if (sizeInMb > 1) return `${sizeInMb.toFixed(2)} MB`; + + return `${sizeInKb.toFixed(2)} KB`; +}; + +import type { LocationQueryValue, RouteLocationRawI18n } from 'vue-router'; + +export const getSingleRouteParam = ( + param: string | string[] | LocationQueryValue | LocationQueryValue[] +): string => { + const _param = Array.isArray(param) ? param.at(0) ?? '' : param ?? ''; + //console.log('found param', _param, param); + return _param; +}; + +export const isRouteActive = ( + to: RouteLocationRawI18n, + exact: boolean = false +) => + computed(() => { + const found = useRouter() + .getRoutes() + .find((route) => route.name === useLocaleRoute()(to)?.name); + //console.log('found route', found, useRouter().currentRoute.value, to); + return exact + ? found?.name === useRouter().currentRoute.value.name + : found?.name === useRouter().currentRoute.value.name || + found?.children.some( + (child) => child.name === useRouter().currentRoute.value.name + ); + }); + +export const isKey = (x: T, k: PropertyKey): k is keyof T => { + return k in x; +}; diff --git a/src/i18n/i18n.config.ts b/src/i18n/i18n.config.ts new file mode 100644 index 0000000..00f3f67 --- /dev/null +++ b/src/i18n/i18n.config.ts @@ -0,0 +1,16 @@ +/* import de from '@/stores/sidebar/de.json'; +import en from '@/stores/sidebar/en.json'; */ + +export default defineI18nConfig(() => { + return { + legacy: false, + messages: { + de: { + //sidebar: de, + }, + en: { + //sidebar: en, + }, + }, + }; +}); diff --git a/src/layouts/app.vue b/src/layouts/app.vue new file mode 100644 index 0000000..e095e6a --- /dev/null +++ b/src/layouts/app.vue @@ -0,0 +1,271 @@ + + + + + +de: + notifications: + label: Benachrichtigungen + view_all: Alle ansehen + vault: + close: Vault schließen +en: + notifications: + label: Notifications + view_all: View all + vault: + close: Close vault + diff --git a/src/layouts/default.vue b/src/layouts/default.vue new file mode 100644 index 0000000..516fc20 --- /dev/null +++ b/src/layouts/default.vue @@ -0,0 +1,5 @@ + diff --git a/src/pages/index.vue b/src/pages/index.vue new file mode 100644 index 0000000..5ed60a1 --- /dev/null +++ b/src/pages/index.vue @@ -0,0 +1,155 @@ + + + + + +{ + "de": { + "welcome": "Viel Spass mit", + "lastUsed": "Zuletzt verwendete Vaults", + "sponsors": "Powered by" + }, + "en": { + "welcome": "Have fun with", + "lastUsed": "Last used Vaults", + "sponsors": "Powered by" + } +} + diff --git a/src/pages/test.vue b/src/pages/test.vue new file mode 100644 index 0000000..9ba44da --- /dev/null +++ b/src/pages/test.vue @@ -0,0 +1,10 @@ + + + diff --git a/src/pages/vault.vue b/src/pages/vault.vue new file mode 100644 index 0000000..30bd29c --- /dev/null +++ b/src/pages/vault.vue @@ -0,0 +1,7 @@ + diff --git a/src/pages/vault/[vaultId]/browser.vue b/src/pages/vault/[vaultId]/browser.vue new file mode 100644 index 0000000..31b763d --- /dev/null +++ b/src/pages/vault/[vaultId]/browser.vue @@ -0,0 +1,127 @@ + + + diff --git a/src/pages/vault/[vaultId]/extensions/[extensionId].vue b/src/pages/vault/[vaultId]/extensions/[extensionId].vue new file mode 100644 index 0000000..f5a5984 --- /dev/null +++ b/src/pages/vault/[vaultId]/extensions/[extensionId].vue @@ -0,0 +1,13 @@ + + + diff --git a/src/pages/vault/[vaultId]/extensions/index.vue b/src/pages/vault/[vaultId]/extensions/index.vue new file mode 100644 index 0000000..e505b2f --- /dev/null +++ b/src/pages/vault/[vaultId]/extensions/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/pages/vault/[vaultId]/index.vue b/src/pages/vault/[vaultId]/index.vue new file mode 100644 index 0000000..d9b4880 --- /dev/null +++ b/src/pages/vault/[vaultId]/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/plugins/flyonui.client.ts b/src/plugins/flyonui.client.ts new file mode 100644 index 0000000..2d2dd3e --- /dev/null +++ b/src/plugins/flyonui.client.ts @@ -0,0 +1,13 @@ +import 'flyonui/flyonui'; +import { type IStaticMethods } from 'flyonui/flyonui'; +declare global { + interface Window { + HSStaticMethods: IStaticMethods; + } +} + +export default defineNuxtPlugin((nuxtApp) => { + nuxtApp.hook('page:finish', () => { + window.HSStaticMethods.autoInit(); + }); +}); diff --git a/src/public/favicon.ico b/src/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..18993ad91cfd43e03b074dd0b5cc3f37ab38e49c GIT binary patch literal 4286 zcmeHLOKuuL5PjK%MHWVi6lD zOGiREbCw`xmFozJ^aNatJY>w+g ze6a2@u~m#^BZm@8wco9#Crlli0uLb^3E$t2-WIc^#(?t)*@`UpuofJ(Uyh@F>b3Ph z$D^m8Xq~pTkGJ4Q`Q2)te3mgkWYZ^Ijq|hkiP^9`De={bQQ%heZC$QU2UpP(-tbl8 zPWD2abEew;oat@w`uP3J^YpsgT%~jT(Dk%oU}sa$7|n6hBjDj`+I;RX(>)%lm_7N{+B7Mu%H?422lE%MBJH!!YTN2oT7xr>>N-8OF$C&qU^ z>vLsa{$0X%q1fjOe3P1mCv#lN{xQ4_*HCSAZjTb1`}mlc+9rl8$B3OP%VT@mch_~G z7Y+4b{r>9e=M+7vSI;BgB?ryZDY4m>&wcHSn81VH1N~`0gvwH{ z8dv#hG|OK`>1;j7tM#B)Z7zDN?{6=dUal}$e