UX: Replace "speed dial" in mobile toolbar with custom context menu

Signed-off-by: Michael Mayer <michael@photoprism.app>
This commit is contained in:
Michael Mayer 2022-08-26 18:15:22 +02:00
parent e7136bdf8e
commit ecadf17d50
9 changed files with 291 additions and 129 deletions

View file

@ -9,57 +9,41 @@
<v-toolbar-title class="nav-title">
<span :class="{'clickable': auth}" @click.stop.prevent="showNavigation()">{{ page.title }}</span>
</v-toolbar-title>
<v-speed-dial
v-model="speedDial"
direction="bottom"
transition="slide-y-transition"
class="mobile-dial"
open-on-hover
dark
<v-btn
fab dark :ripple="false"
color="transparent"
class="mobile-menu-trigger elevation-0"
@click.stop.prevent="speedDial = true"
>
<template #activator>
<v-btn
v-model="speedDial"
dark fab icon flat
:ripple="false"
class="nav-menu-trigger"
>
<v-icon>more_vert</v-icon>
<v-icon>close</v-icon>
</v-btn>
</template>
<v-btn
v-if="!routeName('browse')" to="/browse" class="nav-menu-browse elevation-5 highlight"
fab dark small
>
<v-icon>search</v-icon>
</v-btn>
<v-btn
v-if="auth && !config.readonly && $config.feature('upload')" class="nav-menu-upload elevation-5 highlight"
fab dark small
@click.prevent="openUpload()"
>
<v-icon>cloud_upload</v-icon>
</v-btn>
<v-btn
v-if="!config.disable.settings && !routeName('settings')" to="/settings" class="nav-menu-settings elevation-5"
fab dark small
>
<v-icon>settings</v-icon>
</v-btn>
<v-btn
v-if="auth && !isPublic" class="nav-menu-reload elevation-4"
fab dark small
@click.prevent="reloadApp">
<v-icon>refresh</v-icon>
</v-btn>
<v-btn
v-if="auth && !isPublic" class="nav-menu-logout elevation-4"
fab dark small
@click.prevent="logout">
<v-icon>power_settings_new</v-icon>
</v-btn>
</v-speed-dial>
<v-icon dark>more_vert</v-icon>
</v-btn>
<div id="mobile-menu" :class="{'active': speedDial}" @click.stop="speedDial = false">
<div class="menu-content grow-top-right">
<div class="menu-icons">
<a v-if="auth && !isPublic" href="#" :title="$gettext('Logout')" @click.prevent="logout"><v-icon>power_settings_new</v-icon></a>
<a href="#" :title="$gettext('Reload')" @click.prevent="reloadApp"><v-icon>refresh</v-icon></a>
<router-link v-if="!auth && !isPublic" :to="{ name: 'login' }" :title="$gettext('Login')">
<v-icon>login</v-icon>
</router-link>
<router-link v-if="auth && !routeName('library') && $config.feature('library')" :to="{ name: 'library_logs' }" :title="$gettext('Logs')"><v-icon>feed</v-icon></router-link>
<router-link v-if="auth && !config.disable.settings && !routeName('settings')" to="/settings" :title="$gettext('Settings')">
<v-icon>settings</v-icon>
</router-link>
<a v-if="auth && !config.readonly && $config.feature('upload')" href="#" :title="$gettext('Upload')" @click.prevent="openUpload()"><v-icon>cloud_upload</v-icon></a>
</div>
<div class="menu-actions">
<div v-if="auth && !routeName('browse')" class="menu-action"><router-link to="/browse"><v-icon>search</v-icon> <translate>Search</translate></router-link></div>
<div v-if="auth && !routeName('albums') && $config.feature('albums')" class="menu-action"><router-link to="/albums"><v-icon>bookmark</v-icon> <translate>Albums</translate></router-link></div>
<div v-if="auth && !routeName('library') && $config.feature('library')" class="menu-action"><router-link :to="{ name: 'library' }"><v-icon>camera_roll</v-icon> <translate>Index</translate></router-link></div>
<div v-if="auth && !routeName('files') && $config.feature('library')" class="menu-action"><router-link to="/library/files"><v-icon>folder</v-icon> <translate>Files</translate></router-link></div>
<div v-if="auth && !config.disable.settings && !routeName('settings')" class="menu-action"><router-link :to="{ name: 'settings_sync' }"><v-icon>sync</v-icon> <translate>Connect</translate></router-link></div>
<div v-if="auth && !config.disable.settings && !routeName('settings')" class="menu-action"><router-link :to="{ name: 'settings_account' }"><v-icon>person</v-icon> <translate>Account</translate></router-link></div>
<div class="menu-action"><a href="https://link.photoprism.app/docs" target="_blank"><v-icon>auto_stories</v-icon> <translate>User Guide</translate></a></div>
<div v-if="!isSponsor" class="menu-action"><a href="https://link.photoprism.app/membership" target="_blank"><v-icon>workspace_premium</v-icon> <translate>Become a sponsor</translate></a></div>
<div v-if="config.imprintUrl" class="menu-action"><a :href="config.imprintUrl" target="_blank"><v-icon>info</v-icon> <translate>Legal Information</translate></a></div>
</div>
</div>
</div>
</v-toolbar>
</template>
<template v-else-if="visible && !auth">

View file

@ -100,6 +100,33 @@
animation: stretch 1.5s ease-out 0s alternate infinite none running;
}
@keyframes slide-left {
0% {
transform: translateX(105%);;
}
100% {
transform: translateX(0%);
}
}
#photoprism .animate-slide-left {
animation: slide-left 300ms ease-in-out forwards;
}
@keyframes grow {
0% {
transform: scale(0);
}
100% {
transform: scale(1);
}
}
#photoprism .grow-top-right {
transform-origin: top right;
animation: grow 200ms ease-in-out forwards;
}
#photoprism .select-transition {
-webkit-transition-duration: 15ms !important;
-moz-transition-duration: 15ms !important;

View file

@ -158,27 +158,135 @@ nav .v-list__tile__title.title {
font-size: 19px;
}
/* MOBILE NAV SPEED DIAL */
/* Mobile Menu */
#photoprism .mobile-dial .v-btn.nav-menu-trigger {
#photoprism #p-navigation .mobile-menu-trigger {
width: 48px;
padding: 0;
margin: 0;
}
#photoprism .mobile-dial .v-btn:after,
#photoprism .mobile-dial .v-btn:before {
#photoprism .v-btn.mobile-menu-trigger:after,
#photoprism .v-btn.mobile-menu-trigger:before {
display: none!important;
}
#photoprism .mobile-dial .v-speed-dial__list .v-btn {
color: white!important;
background-color: #8916ff;
#mobile-menu {
display: none;
position: fixed;
overflow: hidden;
z-index: 1;
top: 0;
right: 0;
left: 0;
bottom: 0;
margin: 0;
padding: 0;
width: 0;
height: 0;
}
#photoprism .mobile-dial .v-speed-dial__list .v-btn.highlight {
background-color: #5f30fe;
#mobile-menu.active {
display: block;
width: 100vw;
height: 100vh;
}
#photoprism .mobile-dial .v-speed-dial__list .v-btn:hover,
#photoprism .mobile-dial .v-speed-dial__list .v-btn.highlight:hover {
background-color: #6600cc;
#mobile-menu .menu-content {
display: block;
position: fixed;
top: 0;
right: 0;
left: auto;
width: auto;
height: auto;
margin: 10px;
overflow: hidden;
background: #393a3c;
border-radius: 8px;
}
#mobile-menu .menu-icons {
-ms-flex-pack: distribute;
-webkit-box-orient: horizontal;
-webkit-box-direction: normal;
-webkit-box-align: stretch;
-ms-flex-align: stretch;
-ms-flex-flow: row nowrap;
align-items: stretch;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
flex-flow: row nowrap;
justify-content: space-around;
background: rgba(250, 250, 255,.1);
padding: 0;
margin: 0;
text-align: center;
}
#mobile-menu .menu-icons a {
fill: rgba(255,255,255,.8);
color: rgba(255,255,255,.8);
-webkit-box-flex: 1;
-ms-flex-positive: 1;
cursor: pointer;
display: inline-block;
flex-grow: 1;
overflow: hidden;
padding: 12px 11px 10px 11px;
margin: 0;
position: relative;
text-align: center;
vertical-align: middle;
z-index: 1;
text-decoration: none;
font-weight: bold;
}
#mobile-menu .menu-icons a:hover {
background: rgba(250, 250, 255,.08);
}
#mobile-menu .menu-icons a i {
font-size: 22px;
}
#mobile-menu .menu-actions {
display: block;
overflow-y: auto;
padding: 0;
margin: 0;
}
#mobile-menu .menu-actions .menu-action {
display: block;
padding: 0;
margin: 0;
}
#mobile-menu .menu-actions .menu-action:hover {
background: #3f4042;
}
#mobile-menu .menu-actions .menu-action a {
color: #c2c4c5;
display: inline-block;
min-width: 200px;
font-size: 15px;
line-height: 50px;
text-decoration: none;
padding: 0 20px;
margin: 0;
}
#mobile-menu .menu-actions .menu-action a i {
padding: 0 16px 0 0;
font-size: 20px;
}
#mobile-menu .menu-icons a:hover i,
#mobile-menu .menu-actions .menu-action:hover a,
#mobile-menu .menu-actions .menu-action:hover a i{
color: #ffffff;
}

View file

@ -70,7 +70,7 @@ export default {
this.$emit('close');
},
signUp() {
window.open("https://photoprism.app/membership", "_blank");
window.open("https://link.photoprism.app/membership", "_blank");
this.$emit('close');
},
},

View file

@ -57,10 +57,10 @@ msgstr ""
msgid "A click will copy it to your clipboard."
msgstr ""
#: src/component/navigation.vue:426
#: src/component/navigation.vue:433
#: src/component/navigation.vue:27
#: src/pages/about/about.vue:4
#: src/pages/about/about.vue:193
#: src/pages/about/about.vue:195
#: src/pages/help.vue:45
msgid "About"
msgstr ""
@ -69,6 +69,8 @@ msgstr ""
msgid "Abyss"
msgstr ""
#: src/component/navigation.vue:33
#: src/component/navigation.vue:31
#: src/component/navigation.vue:73
#: src/dialog/share/upload.vue:112
#: src/model/account.js:98
@ -173,10 +175,12 @@ msgstr ""
#: src/app/routes.js:140
#: src/app/routes.js:147
#: src/component/navigation.vue:164
#: src/component/navigation.vue:174
#: src/component/navigation.vue:29
#: src/component/navigation.vue:171
#: src/component/navigation.vue:181
#: src/component/navigation.vue:27
#: src/component/navigation.vue:4
#: src/component/navigation.vue:737
#: src/component/navigation.vue:984
#: src/share/albums.vue:4
msgid "Albums"
msgstr ""
@ -264,7 +268,7 @@ msgstr ""
msgid "An error occurred - are you offline?"
msgstr ""
#: src/component/navigation.vue:118
#: src/component/navigation.vue:125
#: src/component/photo/cards.vue:306
#: src/component/photo/cards.vue:486
#: src/component/photo/list.vue:204
@ -297,7 +301,7 @@ msgid "Approve"
msgstr ""
#: src/app/routes.js:221
#: src/component/navigation.vue:151
#: src/component/navigation.vue:158
#: src/component/photo/cards.vue:387
#: src/component/photo/clipboard.vue:216
#: src/pages/settings/general.vue:294
@ -353,6 +357,8 @@ msgstr ""
msgid "Automatically creates albums of special moments, trips, and places."
msgstr ""
#: src/component/navigation.vue:35
#: src/component/navigation.vue:33
#: src/dialog/sponsor.vue:7
#: src/pages/about/about.vue:33
#: src/pages/auth/login.vue:48
@ -410,8 +416,8 @@ msgstr ""
#: src/app/routes.js:153
#: src/app/routes.js:160
#: src/component/navigation.vue:270
#: src/component/navigation.vue:1099
#: src/component/navigation.vue:277
#: src/component/navigation.vue:1346
msgid "Calendar"
msgstr ""
@ -537,6 +543,8 @@ msgstr ""
msgid "Confidence"
msgstr ""
#: src/component/navigation.vue:32
#: src/component/navigation.vue:30
#: src/dialog/account/add.vue:18
#: src/pages/auth/connect.vue:12
msgid "Connect"
@ -890,7 +898,7 @@ msgid "Enables RAW converter presets. May reduce performance."
msgstr ""
#: src/app/routes.js:266
#: src/component/navigation.vue:393
#: src/component/navigation.vue:400
msgid "Errors"
msgstr ""
@ -915,7 +923,7 @@ msgstr ""
msgid "Exclude hidden"
msgstr ""
#: src/component/navigation.vue:416
#: src/component/navigation.vue:663
msgid "Expand"
msgstr ""
@ -974,8 +982,8 @@ msgid "Favorite"
msgstr ""
#: src/app/routes.js:186
#: src/component/navigation.vue:244
#: src/component/navigation.vue:1011
#: src/component/navigation.vue:251
#: src/component/navigation.vue:1258
msgid "Favorites"
msgstr ""
@ -983,7 +991,7 @@ msgstr ""
msgid "Feature Request"
msgstr ""
#: src/component/navigation.vue:434
#: src/component/navigation.vue:441
#: src/component/navigation.vue:35
msgid "Feedback"
msgstr ""
@ -1005,6 +1013,8 @@ msgstr ""
msgid "Filename"
msgstr ""
#: src/component/navigation.vue:31
#: src/component/navigation.vue:29
#: src/dialog/photo/edit.vue:65
#: src/dialog/photo/edit.vue:6
#: src/dialog/photo/edit.vue:316
@ -1038,8 +1048,8 @@ msgstr ""
#: src/app/routes.js:166
#: src/app/routes.js:173
#: src/component/navigation.vue:330
#: src/component/navigation.vue:1307
#: src/component/navigation.vue:337
#: src/component/navigation.vue:1554
msgid "Folders"
msgstr ""
@ -1108,7 +1118,7 @@ msgstr ""
msgid "Help & Support"
msgstr ""
#: src/component/navigation.vue:384
#: src/component/navigation.vue:391
msgid "Hidden"
msgstr ""
@ -1213,6 +1223,8 @@ msgstr ""
msgid "In case pictures you expect are missing, please rescan your library and wait until indexing has been completed."
msgstr ""
#: src/component/navigation.vue:30
#: src/component/navigation.vue:28
#: src/pages/library.vue:32
#: src/pages/settings/library.vue:6
msgid "Index"
@ -1277,14 +1289,18 @@ msgstr ""
msgid "Keywords"
msgstr ""
#: src/pages/about/about.vue:53
msgid "Knowledge Base"
msgstr ""
#: src/dialog/photo/labels.vue:20
#: src/model/label.js:124
msgid "Label"
msgstr ""
#: src/app/routes.js:272
#: src/component/navigation.vue:317
#: src/component/navigation.vue:1262
#: src/component/navigation.vue:324
#: src/component/navigation.vue:1509
#: src/dialog/photo/edit.vue:39
#: src/dialog/photo/edit.vue:6
#: src/dialog/photo/edit.vue:215
@ -1317,6 +1333,15 @@ msgstr ""
msgid "Lavender"
msgstr ""
#: src/pages/about/about.vue:55
msgid "Learn more"
msgstr ""
#: src/component/navigation.vue:36
#: src/component/navigation.vue:34
msgid "Legal Information"
msgstr ""
#: src/dialog/photo/details.vue:403
msgid "Lens"
msgstr ""
@ -1324,16 +1349,16 @@ msgstr ""
#: src/app/routes.js:304
#: src/app/routes.js:311
#: src/app/routes.js:318
#: src/component/navigation.vue:356
#: src/component/navigation.vue:366
#: src/component/navigation.vue:363
#: src/component/navigation.vue:373
#: src/component/navigation.vue:4
#: src/component/navigation.vue:1399
#: src/component/navigation.vue:1646
#: src/pages/settings.vue:41
#: src/pages/settings/general.vue:404
msgid "Library"
msgstr ""
#: src/component/navigation.vue:442
#: src/component/navigation.vue:449
#: src/component/navigation.vue:43
#: src/dialog/photo/details.vue:544
#: src/pages/about/license.vue:4
@ -1366,7 +1391,7 @@ msgid "List"
msgstr ""
#: src/app/routes.js:193
#: src/component/navigation.vue:217
#: src/component/navigation.vue:224
#: src/component/photo/cards.vue:297
#: src/component/photo/list.vue:195
#: src/component/photo/mosaic.vue:219
@ -1394,17 +1419,20 @@ msgstr ""
msgid "Log messages appear here whenever PhotoPrism comes across broken files, or there are other potential issues."
msgstr ""
#: src/component/navigation.vue:456
#: src/component/navigation.vue:1735
#: src/component/navigation.vue:463
#: src/component/navigation.vue:272
#: src/component/navigation.vue:1982
msgid "Login"
msgstr ""
#: src/component/navigation.vue:503
#: src/component/navigation.vue:1845
#: src/component/navigation.vue:1876
#: src/component/navigation.vue:510
#: src/component/navigation.vue:245
#: src/component/navigation.vue:2092
#: src/component/navigation.vue:2123
msgid "Logout"
msgstr ""
#: src/component/navigation.vue:289
#: src/pages/library.vue:55
#: src/pages/settings/general.vue:426
msgid "Logs"
@ -1452,7 +1480,7 @@ msgstr ""
msgid "Message sent"
msgstr ""
#: src/component/navigation.vue:369
#: src/component/navigation.vue:616
msgid "Minimize"
msgstr ""
@ -1463,13 +1491,13 @@ msgstr ""
#: src/app/routes.js:127
#: src/app/routes.js:134
#: src/component/navigation.vue:257
#: src/component/navigation.vue:1054
#: src/component/navigation.vue:264
#: src/component/navigation.vue:1301
#: src/pages/settings/general.vue:360
msgid "Moments"
msgstr ""
#: src/component/navigation.vue:102
#: src/component/navigation.vue:109
msgid "Monochrome"
msgstr ""
@ -1694,8 +1722,8 @@ msgstr ""
msgid "Nothing to see here yet. Be patient."
msgstr ""
#: src/component/navigation.vue:472
#: src/component/navigation.vue:1780
#: src/component/navigation.vue:479
#: src/component/navigation.vue:2027
#: src/options/options.js:259
msgid "Offline"
msgstr ""
@ -1778,7 +1806,7 @@ msgstr ""
msgid "Original Name"
msgstr ""
#: src/component/navigation.vue:375
#: src/component/navigation.vue:382
#: src/dialog/account/edit.vue:104
#: src/model/file.js:194
#: src/pages/library/files.vue:6
@ -1802,7 +1830,7 @@ msgstr ""
msgid "Panorama"
msgstr ""
#: src/component/navigation.vue:110
#: src/component/navigation.vue:117
msgid "Panoramas"
msgstr ""
@ -1820,8 +1848,8 @@ msgstr ""
#: src/app/routes.js:278
#: src/app/routes.js:298
#: src/component/navigation.vue:231
#: src/component/navigation.vue:966
#: src/component/navigation.vue:238
#: src/component/navigation.vue:1213
#: src/dialog/photo/edit.vue:52
#: src/dialog/photo/edit.vue:6
#: src/dialog/photo/edit.vue:266
@ -1873,10 +1901,10 @@ msgstr ""
#: src/app/routes.js:234
#: src/app/routes.js:240
#: src/app/routes.js:247
#: src/component/navigation.vue:283
#: src/component/navigation.vue:293
#: src/component/navigation.vue:290
#: src/component/navigation.vue:300
#: src/component/navigation.vue:4
#: src/component/navigation.vue:1144
#: src/component/navigation.vue:1391
#: src/pages/settings/general.vue:108
#: src/pages/settings/general.vue:450
msgid "Places"
@ -1930,8 +1958,8 @@ msgid "Primary"
msgstr ""
#: src/app/routes.js:214
#: src/component/navigation.vue:343
#: src/component/navigation.vue:1352
#: src/component/navigation.vue:350
#: src/component/navigation.vue:1599
#: src/dialog/photo/info.vue:102
#: src/pages/settings/general.vue:272
msgid "Private"
@ -1983,6 +2011,10 @@ msgstr ""
msgid "Re-index all originals, including already indexed and unchanged files."
msgstr ""
#: src/pages/about/about.vue:51
msgid "Read the Docs"
msgstr ""
#: src/pages/settings/advanced.vue:99
msgid "Read-Only Mode"
msgstr ""
@ -2018,6 +2050,7 @@ msgid "Red"
msgstr ""
#: src/component/album/toolbar.vue:54
#: src/component/navigation.vue:258
#: src/component/photo/toolbar.vue:60
#: src/dialog/reload.vue:15
#: src/pages/albums.vue:141
@ -2084,7 +2117,7 @@ msgid "Retype Password"
msgstr ""
#: src/app/routes.js:207
#: src/component/navigation.vue:142
#: src/component/navigation.vue:149
msgid "Review"
msgstr ""
@ -2098,14 +2131,16 @@ msgstr ""
msgid "Scan"
msgstr ""
#: src/component/navigation.vue:134
#: src/component/navigation.vue:141
msgid "Scans"
msgstr ""
#: src/component/navigation.vue:82
#: src/component/navigation.vue:92
#: src/component/navigation.vue:28
#: src/component/navigation.vue:89
#: src/component/navigation.vue:99
#: src/component/navigation.vue:26
#: src/component/navigation.vue:4
#: src/component/navigation.vue:448
#: src/component/navigation.vue:695
#: src/component/photo/toolbar.vue:50
#: src/pages/albums.vue:114
#: src/pages/labels.vue:81
@ -2174,12 +2209,13 @@ msgstr ""
#: src/app/routes.js:350
#: src/app/routes.js:362
#: src/app/routes.js:374
#: src/component/navigation.vue:407
#: src/component/navigation.vue:417
#: src/component/navigation.vue:414
#: src/component/navigation.vue:424
#: src/component/navigation.vue:8
#: src/component/navigation.vue:18
#: src/component/navigation.vue:4
#: src/component/navigation.vue:1573
#: src/component/navigation.vue:306
#: src/component/navigation.vue:1820
msgid "Settings"
msgstr ""
@ -2309,7 +2345,7 @@ msgstr ""
msgid "Stackable"
msgstr ""
#: src/component/navigation.vue:126
#: src/component/navigation.vue:133
#: src/pages/settings/library.vue:34
msgid "Stacks"
msgstr ""
@ -2326,7 +2362,7 @@ msgstr ""
msgid "Start/Stop Slideshow"
msgstr ""
#: src/component/navigation.vue:303
#: src/component/navigation.vue:310
msgid "States"
msgstr ""
@ -2511,7 +2547,7 @@ msgid "Unknown"
msgstr ""
#: src/app/routes.js:179
#: src/component/navigation.vue:184
#: src/component/navigation.vue:191
msgid "Unsorted"
msgstr ""
@ -2547,6 +2583,7 @@ msgid "Updating stacks"
msgstr ""
#: src/component/album/toolbar.vue:176
#: src/component/navigation.vue:323
#: src/component/photo/toolbar.vue:128
#: src/dialog/share/upload.vue:35
#: src/dialog/upload.vue:8
@ -2604,6 +2641,12 @@ msgstr ""
msgid "User"
msgstr ""
#: src/component/navigation.vue:34
#: src/component/navigation.vue:32
#: src/pages/about/about.vue:45
msgid "User Guide"
msgstr ""
#: src/pages/settings/general.vue:6
msgid "User Interface"
msgstr ""
@ -2634,10 +2677,10 @@ msgid "Video"
msgstr ""
#: src/app/routes.js:200
#: src/component/navigation.vue:197
#: src/component/navigation.vue:207
#: src/component/navigation.vue:204
#: src/component/navigation.vue:214
#: src/component/navigation.vue:4
#: src/component/navigation.vue:850
#: src/component/navigation.vue:1097
msgid "Videos"
msgstr ""

View file

@ -31,7 +31,7 @@
<div v-if="!sponsor">
<p class="text-xs-center my-4">
<v-btn
href="https://photoprism.app/membership"
href="https://link.photoprism.app/membership"
target="_blank"
color="primary-button"
class="white--text px-3 py-2 action-sponsor"
@ -49,17 +49,17 @@
</p>
</div>
<h3 class="subheading py-2">User Guide</h3>
<h3 class="subheading py-2"><translate>User Guide</translate></h3>
<p class="text-selectable">
<translate>Visit docs.photoprism.app/user-guide to learn how to sync, organize, and share your pictures.</translate>
<translate>Our User Guide also covers many advanced topics, such as migrating from Google Photos and thumbnail quality settings.</translate>
<translate>Common issues can be quickly diagnosed and solved using the troubleshooting checklists we provide.</translate>
</p>
<p><a href="https://docs.photoprism.app/user-guide/" class="text-link" target="_blank">Read the docs </a></p>
<p><a href="https://link.photoprism.app/docs" class="text-link" target="_blank"><translate>Read the Docs</translate> </a></p>
<h3 class="subheading py-2">Knowledge Base</h3>
<h3 class="subheading py-2"><translate>Knowledge Base</translate></h3>
<p class="text-selectable"><translate>Browse the Knowledge Base for detailed information on specific product features, services, and related resources.</translate></p>
<p><a href="https://photoprism.app/kb" class="text-link" target="_blank">Learn more </a></p>
<p><a href="https://photoprism.app/kb" class="text-link" target="_blank"><translate>Learn more</translate> </a></p>
<h3 class="subheading py-2">
<translate>Getting Support</translate>

View file

@ -2,7 +2,7 @@
<div class="p-page p-page-connect">
<v-toolbar flat color="secondary" :dense="$vuetify.breakpoint.smAndDown">
<v-toolbar-title>
<a href="https://photoprism.app/membership" target="_blank">Membership</a> <v-icon>navigate_next</v-icon>
<a href="https://link.photoprism.app/membership" target="_blank">Membership</a> <v-icon>navigate_next</v-icon>
<span v-if="busy">
<translate>Busy, please wait</translate>
</span>

View file

@ -79,7 +79,7 @@
</v-flex>
<v-flex xs12 sm6 class="pa-0 body-2 text-xs-center text-sm-right white--text">
<v-btn
href="https://photoprism.app/membership"
href="https://link.photoprism.app/membership"
target="_blank"
color="transparent"
class="white--text px-3 py-2 ma-0 action-sponsor"

View file

@ -13,7 +13,7 @@ test.meta("testID", "about-001").meta({ mode: "public" })(
await t
.expect(Selector('a[href="https://photoprism.app/"]').visible)
.ok()
.expect(Selector('a[href="https://photoprism.app/membership"]').visible)
.expect(Selector('a[href="https://link.photoprism.app/membership"]').visible)
.ok();
}
);