diff --git a/components.d.ts b/components.d.ts index b0ea7f817e..eceb239f32 100644 --- a/components.d.ts +++ b/components.d.ts @@ -42,7 +42,9 @@ declare module 'vue' { AppNamedSwitch: typeof import('./src/components/ui/AppNamedSwitch.vue')['default'] AppNamedTextField: typeof import('./src/components/ui/AppNamedTextField.vue')['default'] AppNavDrawer: typeof import('./src/components/layout/AppNavDrawer.vue')['default'] + AppNavExternalItem: typeof import('./src/components/ui/AppNavExternalItem.vue')['default'] AppNavItem: typeof import('./src/components/ui/AppNavItem.vue')['default'] + AppNavLinkIcon: typeof import('./src/components/ui/AppNavLinkIcon.vue')['default'] AppNotificationMenu: typeof import('./src/components/layout/AppNotificationMenu.vue')['default'] AppObservedColumn: typeof import('./src/components/layout/AppObservedColumn.vue')['default'] AppQrCode: typeof import('./src/components/ui/AppQrCode.vue')['default'] @@ -79,6 +81,7 @@ declare module 'vue' { VAlert: typeof import('vuetify/lib')['VAlert'] VApp: typeof import('vuetify/lib')['VApp'] VAppBar: typeof import('vuetify/lib')['VAppBar'] + VAutocomplete: typeof import('vuetify/lib')['VAutocomplete'] VBadge: typeof import('vuetify/lib')['VBadge'] VBtn: typeof import('vuetify/lib')['VBtn'] VBtnToggle: typeof import('vuetify/lib')['VBtnToggle'] diff --git a/public/config.json b/public/config.json index cf8db19e7d..b7207bf914 100644 --- a/public/config.json +++ b/public/config.json @@ -12,32 +12,40 @@ "color": "#2196F3", "isDark": true, "logo": { - "src": "logo_fluidd.svg" - } + "src": "logo_fluidd.svg", + "icon": "icon_fluidd.svg" + }, + "links": [{ "title": "Fluidd", "url": "https://docs.fluidd.xyz/" }] }, { "name": "Annex", "color": "#96CC4A", "isDark": true, "logo": { - "src": "logo_annex.svg" - } + "src": "logo_annex.svg", + "icon": "icon_annex.svg" + }, + "links": [{ "title": "Annex", "url": "https://annex-engineering.eu/" }] }, { "name": "BTT", "color": "#475A91", "isDark": true, "logo": { - "src": "logo_btt.svg" - } + "src": "logo_btt.svg", + "icon": "icon_btt.svg" + }, + "links": [{ "title": "BTT", "url": "https://bigtree-tech.com/" }] }, { "name": "Cocoa Press", "color": "#F27121", "isDark": true, "logo": { - "src": "logo_cocoapress.svg" - } + "src": "logo_cocoapress.svg", + "icon": "icon_cocoapress.svg" + }, + "links": [{ "title": "Cocoa Press", "url": "https://cocoapress.com/" }] }, { "name": "EVA", @@ -46,72 +54,90 @@ "logo": { "src": "logo_eva.svg", "dark": "#232323", - "light": "#ffffff" - } + "light": "#ffffff", + "icon": "icon_eva.svg" + }, + "links": [{ "title": "EVA", "url": "https://main.eva-3d.page/" }] }, { "name": "HevORT", "color": "#dfff3e", "isDark": true, "logo": { - "src": "logo_hevort.svg" - } + "src": "logo_hevort.svg", + "icon": "icon_hevort.svg" + }, + "links": [{ "title": "HevORT", "url": "https://hevort.com/" }] }, { "name": "Kingroon", "color": "#DA7A2C", "isDark": true, "logo": { - "src": "logo_kingroon.svg" - } + "src": "logo_kingroon.svg", + "icon": "icon_kingroon.svg" + }, + "links": [{ "title": "Kingroon", "url": "https://kingroon.com/" }] }, { "name": "Klipper", "color": "#B12F36", "isDark": true, "logo": { - "src": "logo_klipper.svg" - } + "src": "logo_klipper.svg", + "icon": "icon_klipper.svg" + }, + "links": [{ "title": "Klipper", "url": "https://www.klipper3d.org/" }] }, { "name": "LDO", "color": "#326799", "isDark": true, "logo": { - "src": "logo_ldo.svg" - } + "src": "logo_ldo.svg", + "icon": "icon_ldo.svg" + }, + "links": [{ "title": "LDO", "url": "https://ldomotion.com/" }] }, { "name": "Mellow", "color": "#003DFF", "isDark": true, "logo": { - "src": "logo_mellow.svg" - } + "src": "logo_mellow.svg", + "icon": "icon_mellow.svg" + }, + "links": [{ "title": "Mellow", "url": "https://3dmellow.com/" }] }, { "name": "Peopoly", "color": "#007CC2", "isDark": true, "logo": { - "src": "logo_peopoly.svg" - } + "src": "logo_peopoly.svg", + "icon": "icon_peopoly.svg" + }, + "links": [{ "title": "Peopoly", "url": "https://peopoly.net/" }] }, { "name": "Prusa", "color": "#E05D2D", "isDark": false, "logo": { - "src": "logo_prusa.svg" - } + "src": "logo_prusa.svg", + "icon": "icon_prusa.svg" + }, + "links": [{ "title": "Prusa", "url": "https://www.prusa3d.com/" }] }, { "name": "Qidi Tech", - "color": "#5B7AEA", + "color": "#3885EA", "isDark": true, "logo": { - "src": "logo_qidi.svg" - } + "src": "logo_qidi.svg", + "icon": "icon_qidi.svg" + }, + "links": [{ "title": "Qidi Tech", "url": "https://qidi3d.com/" }] }, { "name": "RatRig", @@ -120,82 +146,100 @@ "logo": { "src": "logo_ratrig.svg", "dark": "#232323", - "light": "#ffffff" - } + "light": "#ffffff", + "icon": "icon_ratrig.svg" + }, + "links": [{ "title": "RatRig", "url": "https://ratrig.com/" }] }, { "name": "Siboor", "color": "#32E0DF", "isDark": true, "logo": { - "src": "logo_siboor.svg" - } + "src": "logo_siboor.svg", + "icon": "icon_siboor.svg" + }, + "links": [{ "title": "Siboor", "url": "https://www.siboor.com/" }] }, { "name": "Voron", "color": "#FF2300", "isDark": true, "logo": { - "src": "logo_voron.svg" - } + "src": "logo_voron.svg", + "icon": "icon_voron.svg" + }, + "links": [{ "title": "Voron", "url": "https://vorondesign.com/" }] }, { "name": "VzBot", "color": "#FF2300", "isDark": true, "logo": { - "src": "logo_vzbot.svg" - } + "src": "logo_vzbot.svg", + "icon": "icon_vzbot.svg" + }, + "links": [{ "title": "VzBot", "url": "https://vez3d.com/" }] }, { "name": "Z-Bolt", - "color": "#2196F3", + "color": "#FFFFFF", "isDark": true, "logo": { "src": "logo_z-bolt.svg", - "dark": "#232323", - "light": "#ffffff" - } + "icon": "icon_z-bolt.svg" + }, + "links": [{ "title": "Z-Bolt", "url": "https://z-bolt.ru/" }] }, { "name": "ZeroG", "color": "#e34234", "isDark": true, "logo": { - "src": "logo_zerog.svg" - } + "src": "logo_zerog.svg", + "icon": "icon_zerog.svg" + }, + "links": [{ "title": "ZeroG", "url": "https://zerog.one/" }] }, { "name": "SnakeOil", "color": "#4bc3ca", "isDark": true, "logo": { - "src": "logo_snakeoil.svg" - } + "src": "logo_snakeoil.svg", + "icon": "icon_snakeoil.svg" + }, + "links": [{ "title": "SnakeOil", "url": "https://github.com/SnakeOilXY/SnakeOil-XY" }] }, { "name": "Printers for Ants", "color": "#42d62c", "isDark": true, "logo": { - "src": "logo_pfa.svg" - } + "src": "logo_pfa.svg", + "icon": "icon_pfa.svg" + }, + "links": [{ "title": "Printers for Ants", "url": "https://3dprintersforants.com/" }] }, { "name": "Micron", "color": "#42d62c", "isDark": true, "logo": { - "src": "logo_micron.svg" - } + "src": "logo_micron.svg", + "icon": "icon_micron.svg" + }, + "links": [{ "title": "Micron", "url": "https://3dprintersforants.com/" }] }, { "name": "Salad Fork", "color": "#0cff28", "isDark": true, "logo": { - "src": "logo_salad_fork.svg" - } + "src": "logo_salad_fork.svg", + "icon": "icon_salad_fork.svg" + }, + "links": [{ "title": "Salad Fork", "url": "https://3dprintersforants.com/" }] } ] } diff --git a/public/icon_annex.svg b/public/icon_annex.svg new file mode 100644 index 0000000000..ebbbd8e524 --- /dev/null +++ b/public/icon_annex.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icon_btt.svg b/public/icon_btt.svg new file mode 100644 index 0000000000..e2f008ab6c --- /dev/null +++ b/public/icon_btt.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icon_cocoapress.svg b/public/icon_cocoapress.svg new file mode 100644 index 0000000000..34b48d8cab --- /dev/null +++ b/public/icon_cocoapress.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icon_eva.svg b/public/icon_eva.svg new file mode 100644 index 0000000000..f908d63151 --- /dev/null +++ b/public/icon_eva.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icon_fluidd.svg b/public/icon_fluidd.svg new file mode 100644 index 0000000000..01cdbf7615 --- /dev/null +++ b/public/icon_fluidd.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icon_hevort.svg b/public/icon_hevort.svg new file mode 100644 index 0000000000..41f3bf80a4 --- /dev/null +++ b/public/icon_hevort.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icon_kingroon.svg b/public/icon_kingroon.svg new file mode 100644 index 0000000000..40b63a686c --- /dev/null +++ b/public/icon_kingroon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/icon_klipper.svg b/public/icon_klipper.svg new file mode 100644 index 0000000000..8e9a1152ab --- /dev/null +++ b/public/icon_klipper.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icon_ldo.svg b/public/icon_ldo.svg new file mode 100644 index 0000000000..c6c1461ebb --- /dev/null +++ b/public/icon_ldo.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icon_mellow.svg b/public/icon_mellow.svg new file mode 100644 index 0000000000..585ab120cd --- /dev/null +++ b/public/icon_mellow.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icon_micron.svg b/public/icon_micron.svg new file mode 100644 index 0000000000..8c94327beb --- /dev/null +++ b/public/icon_micron.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icon_peopoly.svg b/public/icon_peopoly.svg new file mode 100644 index 0000000000..a8f00e3df5 --- /dev/null +++ b/public/icon_peopoly.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icon_pfa.svg b/public/icon_pfa.svg new file mode 100644 index 0000000000..0776e76b27 --- /dev/null +++ b/public/icon_pfa.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icon_prusa.svg b/public/icon_prusa.svg new file mode 100644 index 0000000000..78210f6bd9 --- /dev/null +++ b/public/icon_prusa.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icon_qidi.svg b/public/icon_qidi.svg new file mode 100644 index 0000000000..4db270db86 --- /dev/null +++ b/public/icon_qidi.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icon_ratrig.svg b/public/icon_ratrig.svg new file mode 100644 index 0000000000..d3c6e8feeb --- /dev/null +++ b/public/icon_ratrig.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icon_salad_fork.svg b/public/icon_salad_fork.svg new file mode 100644 index 0000000000..9d8fe3b8bf --- /dev/null +++ b/public/icon_salad_fork.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icon_siboor.svg b/public/icon_siboor.svg new file mode 100644 index 0000000000..af22f2df77 --- /dev/null +++ b/public/icon_siboor.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icon_snakeoil.svg b/public/icon_snakeoil.svg new file mode 100644 index 0000000000..9794d01244 --- /dev/null +++ b/public/icon_snakeoil.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icon_voron.svg b/public/icon_voron.svg new file mode 100644 index 0000000000..e76b91e4ac --- /dev/null +++ b/public/icon_voron.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icon_vzbot.svg b/public/icon_vzbot.svg new file mode 100644 index 0000000000..02b5550a80 --- /dev/null +++ b/public/icon_vzbot.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/icon_z-bolt.svg b/public/icon_z-bolt.svg new file mode 100644 index 0000000000..7ee075454a --- /dev/null +++ b/public/icon_z-bolt.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icon_zerog.svg b/public/icon_zerog.svg new file mode 100644 index 0000000000..c40915f194 --- /dev/null +++ b/public/icon_zerog.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/logo_eva.svg b/public/logo_eva.svg index 7fb291b7f5..99420b1e3b 100644 --- a/public/logo_eva.svg +++ b/public/logo_eva.svg @@ -1,3 +1,3 @@ - + diff --git a/public/logo_ratrig.svg b/public/logo_ratrig.svg index cb40a3b423..9196e7fb6f 100644 --- a/public/logo_ratrig.svg +++ b/public/logo_ratrig.svg @@ -1,3 +1,3 @@ - + diff --git a/public/logo_z-bolt.svg b/public/logo_z-bolt.svg index a17dbad594..a6a29cce6a 100644 --- a/public/logo_z-bolt.svg +++ b/public/logo_z-bolt.svg @@ -1,3 +1,3 @@ - + diff --git a/server/config.json b/server/config.json index 66fca972f2..78ed789ed7 100644 --- a/server/config.json +++ b/server/config.json @@ -12,24 +12,40 @@ "color": "#2196F3", "isDark": true, "logo": { - "src": "logo_fluidd.svg" - } + "src": "logo_fluidd.svg", + "icon": "icon_fluidd.svg" + }, + "links": [{ "title": "Fluidd", "url": "https://docs.fluidd.xyz/" }] }, { "name": "Annex", "color": "#96CC4A", "isDark": true, "logo": { - "src": "logo_annex.svg" - } + "src": "logo_annex.svg", + "icon": "icon_annex.svg" + }, + "links": [{ "title": "Annex", "url": "https://annex-engineering.eu/" }] }, { "name": "BTT", "color": "#475A91", "isDark": true, "logo": { - "src": "logo_btt.svg" - } + "src": "logo_btt.svg", + "icon": "icon_btt.svg" + }, + "links": [{ "title": "BTT", "url": "https://bigtree-tech.com/" }] + }, + { + "name": "Cocoa Press", + "color": "#F27121", + "isDark": true, + "logo": { + "src": "logo_cocoapress.svg", + "icon": "icon_cocoapress.svg" + }, + "links": [{ "title": "Cocoa Press", "url": "https://cocoapress.com/" }] }, { "name": "EVA", @@ -38,72 +54,90 @@ "logo": { "src": "logo_eva.svg", "dark": "#232323", - "light": "#ffffff" - } + "light": "#ffffff", + "icon": "icon_eva.svg" + }, + "links": [{ "title": "EVA", "url": "https://main.eva-3d.page/" }] }, { "name": "HevORT", "color": "#dfff3e", "isDark": true, "logo": { - "src": "logo_hevort.svg" - } + "src": "logo_hevort.svg", + "icon": "icon_hevort.svg" + }, + "links": [{ "title": "HevORT", "url": "https://hevort.com/" }] }, { "name": "Kingroon", "color": "#DA7A2C", "isDark": true, "logo": { - "src": "logo_kingroon.svg" - } + "src": "logo_kingroon.svg", + "icon": "icon_kingroon.svg" + }, + "links": [{ "title": "Kingroon", "url": "https://kingroon.com/" }] }, { "name": "Klipper", "color": "#B12F36", "isDark": true, "logo": { - "src": "logo_klipper.svg" - } + "src": "logo_klipper.svg", + "icon": "icon_klipper.svg" + }, + "links": [{ "title": "Klipper", "url": "https://www.klipper3d.org/" }] }, { "name": "LDO", "color": "#326799", "isDark": true, "logo": { - "src": "logo_ldo.svg" - } + "src": "logo_ldo.svg", + "icon": "icon_ldo.svg" + }, + "links": [{ "title": "LDO", "url": "https://ldomotion.com/" }] }, { "name": "Mellow", "color": "#003DFF", "isDark": true, "logo": { - "src": "logo_mellow.svg" - } + "src": "logo_mellow.svg", + "icon": "icon_mellow.svg" + }, + "links": [{ "title": "Mellow", "url": "https://3dmellow.com/" }] }, { "name": "Peopoly", "color": "#007CC2", "isDark": true, "logo": { - "src": "logo_peopoly.svg" - } + "src": "logo_peopoly.svg", + "icon": "icon_peopoly.svg" + }, + "links": [{ "title": "Peopoly", "url": "https://peopoly.net/" }] }, { "name": "Prusa", "color": "#E05D2D", "isDark": false, "logo": { - "src": "logo_prusa.svg" - } + "src": "logo_prusa.svg", + "icon": "icon_prusa.svg" + }, + "links": [{ "title": "Prusa", "url": "https://www.prusa3d.com/" }] }, { "name": "Qidi Tech", - "color": "#5B7AEA", + "color": "#3885EA", "isDark": true, "logo": { - "src": "logo_qidi.svg" - } + "src": "logo_qidi.svg", + "icon": "icon_qidi.svg" + }, + "links": [{ "title": "Qidi Tech", "url": "https://qidi3d.com/" }] }, { "name": "RatRig", @@ -112,82 +146,100 @@ "logo": { "src": "logo_ratrig.svg", "dark": "#232323", - "light": "#ffffff" - } + "light": "#ffffff", + "icon": "icon_ratrig.svg" + }, + "links": [{ "title": "RatRig", "url": "https://ratrig.com/" }] }, { "name": "Siboor", "color": "#32E0DF", "isDark": true, "logo": { - "src": "logo_siboor.svg" - } + "src": "logo_siboor.svg", + "icon": "icon_siboor.svg" + }, + "links": [{ "title": "Siboor", "url": "https://www.siboor.com/" }] }, { "name": "Voron", "color": "#FF2300", "isDark": true, "logo": { - "src": "logo_voron.svg" - } + "src": "logo_voron.svg", + "icon": "icon_voron.svg" + }, + "links": [{ "title": "Voron", "url": "https://vorondesign.com/" }] }, { "name": "VzBot", "color": "#FF2300", "isDark": true, "logo": { - "src": "logo_vzbot.svg" - } + "src": "logo_vzbot.svg", + "icon": "icon_vzbot.svg" + }, + "links": [{ "title": "VzBot", "url": "https://vez3d.com/" }] }, { "name": "Z-Bolt", - "color": "#2196F3", + "color": "#FFFFFF", "isDark": true, "logo": { "src": "logo_z-bolt.svg", - "dark": "#232323", - "light": "#ffffff" - } + "icon": "icon_z-bolt.svg" + }, + "links": [{ "title": "Z-Bolt", "url": "https://z-bolt.ru/" }] }, { "name": "ZeroG", "color": "#e34234", "isDark": true, "logo": { - "src": "logo_zerog.svg" - } + "src": "logo_zerog.svg", + "icon": "icon_zerog.svg" + }, + "links": [{ "title": "ZeroG", "url": "https://zerog.one/" }] }, { "name": "SnakeOil", "color": "#4bc3ca", "isDark": true, "logo": { - "src": "logo_snakeoil.svg" - } + "src": "logo_snakeoil.svg", + "icon": "icon_snakeoil.svg" + }, + "links": [{ "title": "SnakeOil", "url": "https://github.com/SnakeOilXY/SnakeOil-XY" }] }, { "name": "Printers for Ants", "color": "#42d62c", "isDark": true, "logo": { - "src": "logo_pfa.svg" - } + "src": "logo_pfa.svg", + "icon": "icon_pfa.svg" + }, + "links": [{ "title": "Printers for Ants", "url": "https://3dprintersforants.com/" }] }, { "name": "Micron", "color": "#42d62c", "isDark": true, "logo": { - "src": "logo_micron.svg" - } + "src": "logo_micron.svg", + "icon": "icon_micron.svg" + }, + "links": [{ "title": "Micron", "url": "https://3dprintersforants.com/" }] }, { "name": "Salad Fork", "color": "#0cff28", "isDark": true, "logo": { - "src": "logo_salad_fork.svg" - } + "src": "logo_salad_fork.svg", + "icon": "icon_salad_fork.svg" + }, + "links": [{ "title": "Salad Fork", "url": "https://3dprintersforants.com/" }] } ] } diff --git a/src/App.vue b/src/App.vue index 3024a6cf57..97f955185b 100644 --- a/src/App.vue +++ b/src/App.vue @@ -4,7 +4,10 @@ :class="{ 'no-pointer-events': dragState }" > - + - +
@@ -13,9 +15,11 @@ > @@ -201,4 +965,13 @@ export default class AppNavDrawer extends Mixins(StateMixin, BrowserMixin) { :deep(.v-navigation-drawer.no-subnav > .v-navigation-drawer__border) { display: none; } + + // GPU acceleration hints for smoother transitions + :deep(.v-navigation-drawer) { + will-change: width, transform; + } + + :deep(.v-navigation-drawer__content) { + will-change: transform; + } diff --git a/src/components/layout/AppSettingsNav.vue b/src/components/layout/AppSettingsNav.vue index b2b3d2b450..af981dbd92 100644 --- a/src/components/layout/AppSettingsNav.vue +++ b/src/components/layout/AppSettingsNav.vue @@ -37,6 +37,7 @@ export default class AppSettingsNav extends Vue { { name: this.$t('app.setting.title.general'), hash: '#general', visible: true }, { name: this.$t('app.setting.title.warnings'), hash: '#warnings', visible: true }, { name: this.$t('app.setting.title.theme'), hash: '#theme', visible: true }, + { name: this.$t('app.setting.title.navigation'), hash: '#navigation', visible: true }, { name: this.$t('app.setting.title.authentication'), hash: '#auth', visible: true }, { name: this.$t('app.setting.title.console'), hash: '#console', visible: true }, { name: this.$t('app.setting.title.file_browser'), hash: '#browser', visible: true }, diff --git a/src/components/settings/navigation/NavLinkDialog.vue b/src/components/settings/navigation/NavLinkDialog.vue new file mode 100644 index 0000000000..1bf01e4747 --- /dev/null +++ b/src/components/settings/navigation/NavLinkDialog.vue @@ -0,0 +1,546 @@ + + + + + diff --git a/src/components/settings/navigation/NavigationSettings.vue b/src/components/settings/navigation/NavigationSettings.vue new file mode 100644 index 0000000000..7f086adc0d --- /dev/null +++ b/src/components/settings/navigation/NavigationSettings.vue @@ -0,0 +1,496 @@ + + + diff --git a/src/components/ui/AppNavExternalItem.vue b/src/components/ui/AppNavExternalItem.vue new file mode 100644 index 0000000000..b95541afb6 --- /dev/null +++ b/src/components/ui/AppNavExternalItem.vue @@ -0,0 +1,115 @@ + + + diff --git a/src/components/ui/AppNavItem.vue b/src/components/ui/AppNavItem.vue index 273c6a0b20..2ec57acb48 100644 --- a/src/components/ui/AppNavItem.vue +++ b/src/components/ui/AppNavItem.vue @@ -1,16 +1,18 @@