diff --git a/apps/app-frontend/src/components/ui/instance-page-header/index.vue b/apps/app-frontend/src/components/ui/instance-page-header/index.vue new file mode 100644 index 0000000000..68591e0e39 --- /dev/null +++ b/apps/app-frontend/src/components/ui/instance-page-header/index.vue @@ -0,0 +1,294 @@ + + + diff --git a/apps/app-frontend/src/components/ui/instance-page-header/instance-page-header-server-metadata.vue b/apps/app-frontend/src/components/ui/instance-page-header/instance-page-header-server-metadata.vue new file mode 100644 index 0000000000..b346190310 --- /dev/null +++ b/apps/app-frontend/src/components/ui/instance-page-header/instance-page-header-server-metadata.vue @@ -0,0 +1,63 @@ + + + diff --git a/apps/app-frontend/src/locales/en-US/index.json b/apps/app-frontend/src/locales/en-US/index.json index 7c481d1542..fa1ab6c67c 100644 --- a/apps/app-frontend/src/locales/en-US/index.json +++ b/apps/app-frontend/src/locales/en-US/index.json @@ -779,6 +779,33 @@ "friends.sign-in-to-add-friends": { "message": "Sign in to a Modrinth account to add friends and see what they're playing!" }, + "instance.action.create-shortcut": { + "message": "Create shortcut" + }, + "instance.action.export-modpack": { + "message": "Export modpack" + }, + "instance.action.launch-instance": { + "message": "Launch instance" + }, + "instance.action.more-actions": { + "message": "More actions" + }, + "instance.action.open-folder": { + "message": "Open folder" + }, + "instance.action.repair": { + "message": "Repair" + }, + "instance.action.settings": { + "message": "Instance settings" + }, + "instance.action.starting": { + "message": "Starting..." + }, + "instance.action.stopping": { + "message": "Stopping..." + }, "instance.add-server.add-and-play": { "message": "Add and play" }, @@ -821,6 +848,9 @@ "instance.files.save-as": { "message": "Save as..." }, + "instance.playtime.never-played": { + "message": "Never played" + }, "instance.server-modal.address": { "message": "Address" }, diff --git a/apps/app-frontend/src/pages/instance/Index.vue b/apps/app-frontend/src/pages/instance/Index.vue index 6828483c59..8d7711f15f 100644 --- a/apps/app-frontend/src/pages/instance/Index.vue +++ b/apps/app-frontend/src/pages/instance/Index.vue @@ -13,207 +13,31 @@ @unlinked="fetchInstance" /> - - - - - - +
@@ -272,49 +96,30 @@ import { BoxesIcon, CheckCircleIcon, ClipboardCopyIcon, - DownloadIcon, - DropdownIcon, EditIcon, ExternalIcon, EyeIcon, FolderOpenIcon, GlobeIcon, HashIcon, - MoreVerticalIcon, - PackageIcon, PlayIcon, PlusIcon, - ServerIcon, - SettingsIcon, StopCircleIcon, TerminalSquareIcon, UpdatedIcon, - UserPlusIcon, XIcon, } from '@modrinth/assets' -import { - Avatar, - ButtonStyled, - ContentPageHeader, - injectNotificationManager, - NavTabs, - OverflowMenu, - ServerOnlinePlayers, - ServerPing, - ServerRecentPlays, - ServerRegion, - useLoadingBarToken, -} from '@modrinth/ui' +import { injectNotificationManager, NavTabs, useLoadingBarToken } from '@modrinth/ui' import { useQueryClient } from '@tanstack/vue-query' import { convertFileSrc } from '@tauri-apps/api/core' import dayjs from 'dayjs' -import duration from 'dayjs/plugin/duration' import relativeTime from 'dayjs/plugin/relativeTime' import { computed, onUnmounted, ref, shallowRef, watch } from 'vue' import { useRoute, useRouter } from 'vue-router' import ContextMenu from '@/components/ui/ContextMenu.vue' import ExportModal from '@/components/ui/ExportModal.vue' +import InstancePageHeader from '@/components/ui/instance-page-header/index.vue' import InstanceSettingsModal from '@/components/ui/modal/InstanceSettingsModal.vue' import UpdateToPlayModal from '@/components/ui/modal/UpdateToPlayModal.vue' import { @@ -336,7 +141,6 @@ import { injectServerInstall } from '@/providers/server-install' import { handleSevereError } from '@/store/error.js' import { useBreadcrumbs, useTheming } from '@/store/state' -dayjs.extend(duration) dayjs.extend(relativeTime) const { addNotification, handleError } = injectNotificationManager() @@ -758,22 +562,6 @@ const timePlayed = computed(() => { : 0 }) -const timePlayedHumanized = computed(() => { - const duration = dayjs.duration(timePlayed.value, 'seconds') - const hours = Math.floor(duration.asHours()) - if (hours >= 1) { - return hours + ' hour' + (hours > 1 ? 's' : '') - } - - const minutes = Math.floor(duration.asMinutes()) - if (minutes >= 1) { - return minutes + ' minute' + (minutes > 1 ? 's' : '') - } - - const seconds = Math.floor(duration.asSeconds()) - return seconds + ' second' + (seconds > 1 ? 's' : '') -}) - onUnmounted(() => { unlistenProcesses() unlistenInstances() diff --git a/apps/app-frontend/src/pages/project/Index.vue b/apps/app-frontend/src/pages/project/Index.vue index e14dcc0f33..a4aff5dfa6 100644 --- a/apps/app-frontend/src/pages/project/Index.vue +++ b/apps/app-frontend/src/pages/project/Index.vue @@ -59,142 +59,100 @@ > - - + + diff --git a/apps/frontend/src/components/ui/ProjectCollectionSaveButton.vue b/apps/frontend/src/components/ui/ProjectCollectionSaveButton.vue new file mode 100644 index 0000000000..34752468c0 --- /dev/null +++ b/apps/frontend/src/components/ui/ProjectCollectionSaveButton.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/apps/frontend/src/components/ui/UserPageHeader.vue b/apps/frontend/src/components/ui/UserPageHeader.vue new file mode 100644 index 0000000000..dfa94c475d --- /dev/null +++ b/apps/frontend/src/components/ui/UserPageHeader.vue @@ -0,0 +1,294 @@ + + + diff --git a/apps/frontend/src/locales/cs-CZ/index.json b/apps/frontend/src/locales/cs-CZ/index.json index 22ac79adbd..b5ce1c1bbe 100644 --- a/apps/frontend/src/locales/cs-CZ/index.json +++ b/apps/frontend/src/locales/cs-CZ/index.json @@ -2171,9 +2171,6 @@ "profile.label.collection": { "message": "Kolekce" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {stažení} few {stažení} other {stažení}}" - }, "profile.label.joined": { "message": "Členem od" }, @@ -2192,9 +2189,6 @@ "profile.label.organizations": { "message": "Organizace" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {projekt} few {projekty} other {projektů}}" - }, "profile.label.saving": { "message": "Ukládání..." }, @@ -2528,12 +2522,6 @@ "project.settings.visit-dashboard": { "message": "Přejít na přehled projektů" }, - "project.stats.downloads-label": { - "message": "{count, plural, one {stažení} few {stažení} other {stažení}}" - }, - "project.stats.followers-label": { - "message": "{count, plural, one {# sledující} few {# sledující} other {# sledujících}}" - }, "project.versions.title": { "message": "Verze" }, diff --git a/apps/frontend/src/locales/de-CH/index.json b/apps/frontend/src/locales/de-CH/index.json index b289277e1d..c53e40ec1c 100644 --- a/apps/frontend/src/locales/de-CH/index.json +++ b/apps/frontend/src/locales/de-CH/index.json @@ -3068,9 +3068,6 @@ "profile.label.collection": { "message": "Kollektion" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {Download} other {Downloads}}" - }, "profile.label.joined": { "message": "Beigetreten" }, @@ -3089,9 +3086,6 @@ "profile.label.organizations": { "message": "Organisationen" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {Projekt} other {Projekte}}" - }, "profile.label.saving": { "message": "Speichert..." }, @@ -3656,12 +3650,6 @@ "project.settings.visit-dashboard": { "message": "Projekt-Dashboard besuchen" }, - "project.stats.downloads-label": { - "message": "{count, plural, one {Download} other {Downloads}}" - }, - "project.stats.followers-label": { - "message": "{count, plural, one {Follower} other {Follower}}" - }, "project.status.archived.message": { "message": "{title} wurde archiviert. {title} wird keine weiteren Updates erhalten, es sei denn, der Autor entscheided sich, das Projekt zu Dearchivieren." }, diff --git a/apps/frontend/src/locales/de-DE/index.json b/apps/frontend/src/locales/de-DE/index.json index 68d1d09e5b..3a09588749 100644 --- a/apps/frontend/src/locales/de-DE/index.json +++ b/apps/frontend/src/locales/de-DE/index.json @@ -3068,9 +3068,6 @@ "profile.label.collection": { "message": "Kollektion" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {Download} other {Downloads}}" - }, "profile.label.joined": { "message": "Beigetreten" }, @@ -3089,9 +3086,6 @@ "profile.label.organizations": { "message": "Organisationen" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {Projekt} other {Projekte}}" - }, "profile.label.saving": { "message": "Speichert..." }, @@ -3656,12 +3650,6 @@ "project.settings.visit-dashboard": { "message": "Projekt-Dashboard besuchen" }, - "project.stats.downloads-label": { - "message": "{count, plural, one {Download} other {Downloads}}" - }, - "project.stats.followers-label": { - "message": "{count, plural, one {Follower} other {Follower}}" - }, "project.status.archived.message": { "message": "{title} wurde archiviert. {title} wird keine weiteren Updates erhalten, es sei denn, der Autor entscheidet sich das Projekt zu dearchivieren." }, diff --git a/apps/frontend/src/locales/en-US/index.json b/apps/frontend/src/locales/en-US/index.json index 6073103af0..a3fbe84593 100644 --- a/apps/frontend/src/locales/en-US/index.json +++ b/apps/frontend/src/locales/en-US/index.json @@ -2999,6 +2999,24 @@ "muralpay.warning.wallet-address": { "message": "Double-check your wallet address. Funds sent to an incorrect address cannot be recovered." }, + "organization.button.manage": { + "message": "Manage" + }, + "organization.button.manage-projects": { + "message": "Manage projects" + }, + "organization.label.downloads": { + "message": "downloads" + }, + "organization.label.members": { + "message": "members" + }, + "organization.label.organization": { + "message": "Organization" + }, + "organization.label.projects": { + "message": "projects" + }, "organization.settings.projects.edit-links.affected-projects": { "message": "Changes will be applied to {count, plural, one {# project} other {# projects}}." }, @@ -3068,8 +3086,8 @@ "profile.label.collection": { "message": "Collection" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {download} other {downloads}}" + "profile.label.download-count": { + "message": "{count, plural, one {download} other {downloads}}" }, "profile.label.joined": { "message": "Joined" @@ -3089,8 +3107,8 @@ "profile.label.organizations": { "message": "Organizations" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {project} other {projects}}" + "profile.label.project-count": { + "message": "{count, plural, one {project} other {projects}}" }, "profile.label.saving": { "message": "Saving..." @@ -3254,6 +3272,12 @@ "project.actions.dont-show-again": { "message": "Don't show again" }, + "project.actions.edit-project": { + "message": "Edit project" + }, + "project.actions.rescan-modpack": { + "message": "Rescan modpack" + }, "project.actions.review-project": { "message": "Review project" }, @@ -3656,12 +3680,6 @@ "project.settings.visit-dashboard": { "message": "Visit projects dashboard" }, - "project.stats.downloads-label": { - "message": "{count, plural, one {download} other {downloads}}" - }, - "project.stats.followers-label": { - "message": "{count, plural, one {follower} other {followers}}" - }, "project.status.archived.message": { "message": "{title} has been archived. {title} will not receive any further updates unless the author decides to unarchive the project." }, diff --git a/apps/frontend/src/locales/es-419/index.json b/apps/frontend/src/locales/es-419/index.json index 8d8eed405b..d211245ac2 100644 --- a/apps/frontend/src/locales/es-419/index.json +++ b/apps/frontend/src/locales/es-419/index.json @@ -3068,9 +3068,6 @@ "profile.label.collection": { "message": "Colección" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {descarga} other {descargas}}" - }, "profile.label.joined": { "message": "Se unió" }, @@ -3089,9 +3086,6 @@ "profile.label.organizations": { "message": "Organizaciones" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {proyecto} other {proyectos}}" - }, "profile.label.saving": { "message": "Guardando..." }, @@ -3656,12 +3650,6 @@ "project.settings.visit-dashboard": { "message": "Ver el panel de control de proyectos" }, - "project.stats.downloads-label": { - "message": "{count, plural, one {descarga} other {descargas}}" - }, - "project.stats.followers-label": { - "message": "{count, plural, one {seguidor} other {seguidores}}" - }, "project.status.archived.message": { "message": "{title} se ha archivado. {title} no recibirá más actualizaciones hasta que el autor decida desarchivar el proyecto." }, diff --git a/apps/frontend/src/locales/es-ES/index.json b/apps/frontend/src/locales/es-ES/index.json index cbbf5c2a44..81d4b0a722 100644 --- a/apps/frontend/src/locales/es-ES/index.json +++ b/apps/frontend/src/locales/es-ES/index.json @@ -2891,9 +2891,6 @@ "profile.label.collection": { "message": "Colección" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {descarga} other {descargas}}" - }, "profile.label.joined": { "message": "Se unió hace" }, @@ -2912,9 +2909,6 @@ "profile.label.organizations": { "message": "Organizaciones" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {proyecto} other {proyectos}}" - }, "profile.label.saving": { "message": "Guardando..." }, @@ -3377,12 +3371,6 @@ "project.settings.visit-dashboard": { "message": "Visita el panel de proyectos" }, - "project.stats.downloads-label": { - "message": "{count, plural, one {descarga} other {descargas}}" - }, - "project.stats.followers-label": { - "message": "{count, plural, one {seguidor} other {seguidores}}" - }, "project.status.archived.message": { "message": "{title} ha sido archivado. {title} no recibirá ninguna futura actualización excepto que el autor decida desarchivar el proyecto." }, diff --git a/apps/frontend/src/locales/fil-PH/index.json b/apps/frontend/src/locales/fil-PH/index.json index b7ac746fbf..7f6debba6b 100644 --- a/apps/frontend/src/locales/fil-PH/index.json +++ b/apps/frontend/src/locales/fil-PH/index.json @@ -2213,9 +2213,6 @@ "profile.label.collection": { "message": "Koleksiyon" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {download} other {na download}}" - }, "profile.label.joined": { "message": "Sumali" }, @@ -2234,9 +2231,6 @@ "profile.label.organizations": { "message": "Mga organisasyon" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {proyekto} other {na proyekto}}" - }, "profile.label.saving": { "message": "Sine-save..." }, diff --git a/apps/frontend/src/locales/fr-FR/index.json b/apps/frontend/src/locales/fr-FR/index.json index af14a6f866..11e79bf931 100644 --- a/apps/frontend/src/locales/fr-FR/index.json +++ b/apps/frontend/src/locales/fr-FR/index.json @@ -3068,9 +3068,6 @@ "profile.label.collection": { "message": "Collection" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {téléchargement} other {téléchargements}}" - }, "profile.label.joined": { "message": "Rejoint" }, @@ -3089,9 +3086,6 @@ "profile.label.organizations": { "message": "Organisations" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {projet} other {projets}}" - }, "profile.label.saving": { "message": "Sauvegarde en cours..." }, @@ -3650,12 +3644,6 @@ "project.settings.visit-dashboard": { "message": "Visiter le tableau de contrôle des projets" }, - "project.stats.downloads-label": { - "message": "{count, plural, one {# téléchargement} other {# téléchargements}}" - }, - "project.stats.followers-label": { - "message": "{count, plural, one {# suivi} other {# suivis}}" - }, "project.status.archived.message": { "message": "{title} a été archivé. {title} ne recevra plus de mises à jour jusqu'à ce que l'auteur du projet décide de désarchiver le projet." }, diff --git a/apps/frontend/src/locales/he-IL/index.json b/apps/frontend/src/locales/he-IL/index.json index c99ec27f33..570c6f7b21 100644 --- a/apps/frontend/src/locales/he-IL/index.json +++ b/apps/frontend/src/locales/he-IL/index.json @@ -1823,9 +1823,6 @@ "profile.label.collection": { "message": "אוסף" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {download} other {downloads}}" - }, "profile.label.joined": { "message": "הצטרף ב-" }, @@ -1844,9 +1841,6 @@ "profile.label.organizations": { "message": "ארגונים" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {project} other {projects}}" - }, "profile.label.saving": { "message": "שומר..." }, diff --git a/apps/frontend/src/locales/hu-HU/index.json b/apps/frontend/src/locales/hu-HU/index.json index 0eed49da95..4faa0c0824 100644 --- a/apps/frontend/src/locales/hu-HU/index.json +++ b/apps/frontend/src/locales/hu-HU/index.json @@ -2963,9 +2963,6 @@ "profile.label.collection": { "message": "Gyűjtemény" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {letöltés} other {letöltések}}" - }, "profile.label.joined": { "message": "Csatlakozott" }, @@ -2984,9 +2981,6 @@ "profile.label.organizations": { "message": "Szervezetek" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {projekt} other {projektek}}" - }, "profile.label.saving": { "message": "Mentés..." }, @@ -3458,12 +3452,6 @@ "project.settings.visit-dashboard": { "message": "Projektek irányítópult megnyitása" }, - "project.stats.downloads-label": { - "message": "{count} letöltés" - }, - "project.stats.followers-label": { - "message": "{count} követő" - }, "project.status.archived.message": { "message": "A(z) {title} archiválásra került. A(z) {title} nem kap további frissítéseket, kivéve, ha a fejlesztő úgy dönt, hogy visszavonja a projekt archiválását." }, diff --git a/apps/frontend/src/locales/id-ID/index.json b/apps/frontend/src/locales/id-ID/index.json index 165a65df58..bf545088ae 100644 --- a/apps/frontend/src/locales/id-ID/index.json +++ b/apps/frontend/src/locales/id-ID/index.json @@ -2219,9 +2219,6 @@ "profile.label.collection": { "message": "Koleksi" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, other {pengunduhan}}" - }, "profile.label.joined": { "message": "Telah bergabung" }, @@ -2240,9 +2237,6 @@ "profile.label.organizations": { "message": "Organisasi" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, other {proyek}}" - }, "profile.label.saving": { "message": "Menyimpan..." }, diff --git a/apps/frontend/src/locales/it-IT/index.json b/apps/frontend/src/locales/it-IT/index.json index 9ecb1092ea..fda04f9565 100644 --- a/apps/frontend/src/locales/it-IT/index.json +++ b/apps/frontend/src/locales/it-IT/index.json @@ -3059,9 +3059,6 @@ "profile.label.collection": { "message": "Raccolta" }, - "profile.label.downloads": { - "message": "{count} download" - }, "profile.label.joined": { "message": "Iscrizione" }, @@ -3080,9 +3077,6 @@ "profile.label.organizations": { "message": "Organizzazioni" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {progetto} other {progetti}}" - }, "profile.label.saving": { "message": "Salvando..." }, @@ -3647,12 +3641,6 @@ "project.settings.visit-dashboard": { "message": "Visita bacheca del progetto" }, - "project.stats.downloads-label": { - "message": "{count} download" - }, - "project.stats.followers-label": { - "message": "{count} follower" - }, "project.status.archived.message": { "message": "{title} è stato archiviato. {title} non riceverà più aggiornamenti a meno che l'autore decida di rimuoverlo dall'archivio." }, diff --git a/apps/frontend/src/locales/ja-JP/index.json b/apps/frontend/src/locales/ja-JP/index.json index 8e850ed762..1159d6b175 100644 --- a/apps/frontend/src/locales/ja-JP/index.json +++ b/apps/frontend/src/locales/ja-JP/index.json @@ -2582,9 +2582,6 @@ "profile.label.collection": { "message": "コレクション" }, - "profile.label.downloads": { - "message": "{count}件のダウンロード" - }, "profile.label.joined": { "message": "参加: " }, @@ -2603,9 +2600,6 @@ "profile.label.organizations": { "message": "組織" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {プロジェクト} other {プロジェクト}}" - }, "profile.label.saving": { "message": "保存中…" }, diff --git a/apps/frontend/src/locales/ko-KR/index.json b/apps/frontend/src/locales/ko-KR/index.json index 0fabe722cf..3fede01b51 100644 --- a/apps/frontend/src/locales/ko-KR/index.json +++ b/apps/frontend/src/locales/ko-KR/index.json @@ -2414,9 +2414,6 @@ "profile.label.collection": { "message": "컬렉션" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {다운로드} other {다운로드}}" - }, "profile.label.joined": { "message": "가입" }, @@ -2435,9 +2432,6 @@ "profile.label.organizations": { "message": "조직" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {프로젝트} other {프로젝트}}" - }, "profile.label.saving": { "message": "저장..." }, diff --git a/apps/frontend/src/locales/ms-MY/index.json b/apps/frontend/src/locales/ms-MY/index.json index 32e40ee72a..efcbf9d35a 100644 --- a/apps/frontend/src/locales/ms-MY/index.json +++ b/apps/frontend/src/locales/ms-MY/index.json @@ -2750,9 +2750,6 @@ "profile.label.collection": { "message": "Koleksi" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, other {muat turun}}" - }, "profile.label.joined": { "message": "Telah menyertai" }, @@ -2771,9 +2768,6 @@ "profile.label.organizations": { "message": "Organisasi" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, other {projek}}" - }, "profile.label.saving": { "message": "Sedang menyimpan..." }, @@ -3188,9 +3182,6 @@ "project.settings.visit-dashboard": { "message": "Kunjungi papan pemuka projek" }, - "project.stats.downloads-label": { - "message": "{count, plural, other {muat turun}}" - }, "project.status.archived.message": { "message": "{title} telah diarkibkan. {title} tidak akan menerima sebarang kemas kini lanjut melainkan pengarang memutuskan untuk menyaharkibkan projek." }, diff --git a/apps/frontend/src/locales/nl-NL/index.json b/apps/frontend/src/locales/nl-NL/index.json index 9dfe5ae4c9..3eb9fb3031 100644 --- a/apps/frontend/src/locales/nl-NL/index.json +++ b/apps/frontend/src/locales/nl-NL/index.json @@ -2906,9 +2906,6 @@ "profile.label.collection": { "message": "Collectie" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {download} other {downloads}}" - }, "profile.label.joined": { "message": "Lid geworden" }, @@ -2927,9 +2924,6 @@ "profile.label.organizations": { "message": "Organisaties" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {project} other {projecten}}" - }, "profile.label.saving": { "message": "Opslaan..." }, diff --git a/apps/frontend/src/locales/no-NO/index.json b/apps/frontend/src/locales/no-NO/index.json index 49c35c6ae4..3ed6bb01dd 100644 --- a/apps/frontend/src/locales/no-NO/index.json +++ b/apps/frontend/src/locales/no-NO/index.json @@ -2678,9 +2678,6 @@ "profile.label.collection": { "message": "Samling" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {nedlasting} other {nedlastinger}}" - }, "profile.label.joined": { "message": "Blei med" }, @@ -2699,9 +2696,6 @@ "profile.label.organizations": { "message": "Organisasjoner" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {projekt} other {projekt}}" - }, "profile.label.saving": { "message": "Lagrer..." }, @@ -3038,12 +3032,6 @@ "project.settings.visit-dashboard": { "message": "Besøk prosjekt-dashbordet" }, - "project.stats.downloads-label": { - "message": "{count, plural, one {nedlasting} other {nedlastinger}}" - }, - "project.stats.followers-label": { - "message": "{count, plural, one {følger} other {følgere}}" - }, "project.status.archived.message": { "message": "{title} har blitt arkivert. {title} kommer ikke til å få noen nye oppdateringer, hvis ikke forfatteren bestemmer seg for å dearkivere prosjektet." }, diff --git a/apps/frontend/src/locales/pl-PL/index.json b/apps/frontend/src/locales/pl-PL/index.json index 5cc08d2e19..e4901c3167 100644 --- a/apps/frontend/src/locales/pl-PL/index.json +++ b/apps/frontend/src/locales/pl-PL/index.json @@ -3062,9 +3062,6 @@ "profile.label.collection": { "message": "Kolekcja" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {pobranie} few {pobrania} other {pobrań}}" - }, "profile.label.joined": { "message": "Dołączył(-a)" }, @@ -3083,9 +3080,6 @@ "profile.label.organizations": { "message": "Organizacje" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {projekt} few {projekty} other {projektów}}" - }, "profile.label.saving": { "message": "Zapisywanie..." }, @@ -3647,12 +3641,6 @@ "project.settings.visit-dashboard": { "message": "Odwiedź pulpit projektów" }, - "project.stats.downloads-label": { - "message": "{count, plural, one {pobranie} few {pobrania} other {pobrań}}" - }, - "project.stats.followers-label": { - "message": "{count, plural, one {obserwujący} other {obserwujących}}" - }, "project.status.archived.message": { "message": "{title} zostało zarchiwizowane. {title} nie będzie otrzymywać żadnych dalszych aktualizacji, chyba że autor zdecyduje się przywrócić projekt." }, diff --git a/apps/frontend/src/locales/pt-BR/index.json b/apps/frontend/src/locales/pt-BR/index.json index a1a05fdebc..2c8b824eb3 100644 --- a/apps/frontend/src/locales/pt-BR/index.json +++ b/apps/frontend/src/locales/pt-BR/index.json @@ -3650,12 +3650,6 @@ "project.settings.visit-dashboard": { "message": "Visitar painel de projetos" }, - "project.stats.downloads-label": { - "message": "{count, plural, =0 {Nenhum download} one {# download} other {# downloads}}" - }, - "project.stats.followers-label": { - "message": "{count, plural, =0 {Nenhum seguidor} one {# seguidor} other {# seguidores}}" - }, "project.status.archived.message": { "message": "{title} foi arquivado. {title} não receberá atualizações a menos que o autor decida desarquivar o projeto." }, diff --git a/apps/frontend/src/locales/pt-PT/index.json b/apps/frontend/src/locales/pt-PT/index.json index bc04f4977e..0ca09b38c6 100644 --- a/apps/frontend/src/locales/pt-PT/index.json +++ b/apps/frontend/src/locales/pt-PT/index.json @@ -2561,9 +2561,6 @@ "profile.label.collection": { "message": "Coleção" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {transferência} other {transferências}}" - }, "profile.label.joined": { "message": "Entrou" }, @@ -2582,9 +2579,6 @@ "profile.label.organizations": { "message": "Organizações" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural,one {projeto} other {projetos}}" - }, "profile.label.saving": { "message": "A guardar..." }, diff --git a/apps/frontend/src/locales/ru-RU/index.json b/apps/frontend/src/locales/ru-RU/index.json index a4b964b68c..8c0fcd90da 100644 --- a/apps/frontend/src/locales/ru-RU/index.json +++ b/apps/frontend/src/locales/ru-RU/index.json @@ -3059,9 +3059,6 @@ "profile.label.collection": { "message": "Коллекция" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {скачивание} few {скачивания} other {скачиваний}}" - }, "profile.label.joined": { "message": "Регистрация:" }, @@ -3080,9 +3077,6 @@ "profile.label.organizations": { "message": "Организации" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {проект} few {проекта} other {проектов}}" - }, "profile.label.saving": { "message": "Сохранение..." }, @@ -3647,12 +3641,6 @@ "project.settings.visit-dashboard": { "message": "Управление проектами" }, - "project.stats.downloads-label": { - "message": "{count, plural, one {загрузка} few {загрузки} other {загрузок}}" - }, - "project.stats.followers-label": { - "message": "{count, plural, one {подписчик} few {подписчика} other {подписчиков}}" - }, "project.status.archived.message": { "message": "{title} помещён в архив. {title} больше не будет получать обновления, если только автор не решит разархивировать проект." }, diff --git a/apps/frontend/src/locales/sv-SE/index.json b/apps/frontend/src/locales/sv-SE/index.json index 245b453ba1..5c0339004f 100644 --- a/apps/frontend/src/locales/sv-SE/index.json +++ b/apps/frontend/src/locales/sv-SE/index.json @@ -2672,9 +2672,6 @@ "profile.label.collection": { "message": "Samling" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {nedladdning} other {nedladdningar}}" - }, "profile.label.joined": { "message": "Gick med" }, diff --git a/apps/frontend/src/locales/tr-TR/index.json b/apps/frontend/src/locales/tr-TR/index.json index c00678d69c..0e1c2de246 100644 --- a/apps/frontend/src/locales/tr-TR/index.json +++ b/apps/frontend/src/locales/tr-TR/index.json @@ -3065,9 +3065,6 @@ "profile.label.collection": { "message": "Koleksiyon" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {indirme} other {indirmeler}}" - }, "profile.label.joined": { "message": "Katılma:" }, @@ -3086,9 +3083,6 @@ "profile.label.organizations": { "message": "Organizasyonlar" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {proje} other {projeler}}" - }, "profile.label.saving": { "message": "Kaydediliyor..." }, @@ -3554,12 +3548,6 @@ "project.settings.visit-dashboard": { "message": "Projeler panelini ziyaret et" }, - "project.stats.downloads-label": { - "message": "{count, plural, one {download} other {downloads}}" - }, - "project.stats.followers-label": { - "message": "{count, plural, one {follower} other {followers}}" - }, "project.status.archived.message": { "message": "{title} arşivlenmiş. {title}, yapımcı fikrini değiştirmediği sürece daha fazla güncelleme almayacak." }, diff --git a/apps/frontend/src/locales/uk-UA/index.json b/apps/frontend/src/locales/uk-UA/index.json index fab72ed955..bd53de536e 100644 --- a/apps/frontend/src/locales/uk-UA/index.json +++ b/apps/frontend/src/locales/uk-UA/index.json @@ -2645,9 +2645,6 @@ "profile.label.collection": { "message": "Добірка" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {завантаження} few {завантаження} many {завантажень} other {завантажень}}" - }, "profile.label.joined": { "message": "Приєднався" }, @@ -2666,9 +2663,6 @@ "profile.label.organizations": { "message": "Організації" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {проєкт} few {проєкти} many {проєктів} other {проєктів}}" - }, "profile.label.saving": { "message": "Збереження…" }, diff --git a/apps/frontend/src/locales/vi-VN/index.json b/apps/frontend/src/locales/vi-VN/index.json index 0efc31540d..94d4cdc767 100644 --- a/apps/frontend/src/locales/vi-VN/index.json +++ b/apps/frontend/src/locales/vi-VN/index.json @@ -2855,9 +2855,6 @@ "profile.label.collection": { "message": "Bộ sưu tập" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, one {lượt tải xuống} other {lượt tải xuống}}" - }, "profile.label.joined": { "message": "Đã tham gia" }, @@ -2876,9 +2873,6 @@ "profile.label.organizations": { "message": "Tổ chức" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, one {dự án} other {dự án}}" - }, "profile.label.saving": { "message": "Đang lưu..." }, @@ -3278,12 +3272,6 @@ "project.settings.visit-dashboard": { "message": "Truy cập bảng điều khiển dự án" }, - "project.stats.downloads-label": { - "message": "{count, plural, other {lượt tải}}" - }, - "project.stats.followers-label": { - "message": "{count, plural, other {lượt theo dõi}}" - }, "project.status.archived.message": { "message": "{title} đã được lưu trữ. {title} sẽ không nhận được bất kỳ bản cập nhật nào trong tương lai trừ khi tác giả quyết định hủy lưu trữ dự án." }, diff --git a/apps/frontend/src/locales/zh-CN/index.json b/apps/frontend/src/locales/zh-CN/index.json index a3ac387f50..a7086d5de7 100644 --- a/apps/frontend/src/locales/zh-CN/index.json +++ b/apps/frontend/src/locales/zh-CN/index.json @@ -3062,9 +3062,6 @@ "profile.label.collection": { "message": "收藏夹" }, - "profile.label.downloads": { - "message": "{count} {countPlural, plural, other {次下载}}" - }, "profile.label.joined": { "message": "加入于" }, @@ -3083,9 +3080,6 @@ "profile.label.organizations": { "message": "组织" }, - "profile.label.projects": { - "message": "{count} {countPlural, plural, other {个项目}}" - }, "profile.label.saving": { "message": "正在保存…" }, @@ -3650,12 +3644,6 @@ "project.settings.visit-dashboard": { "message": "访问项目的控制面板" }, - "project.stats.downloads-label": { - "message": "{count, plural, other {下载}}" - }, - "project.stats.followers-label": { - "message": "{count, plural, other {关注者}}" - }, "project.status.archived.message": { "message": "{title} 已归档。除非作者决定取消归档,否则 {title} 将不再更新。" }, diff --git a/apps/frontend/src/locales/zh-TW/index.json b/apps/frontend/src/locales/zh-TW/index.json index 1fd7900bb7..df3d1e4c78 100644 --- a/apps/frontend/src/locales/zh-TW/index.json +++ b/apps/frontend/src/locales/zh-TW/index.json @@ -3068,9 +3068,6 @@ "profile.label.collection": { "message": "收藏" }, - "profile.label.downloads": { - "message": "下載次數:{count}" - }, "profile.label.joined": { "message": "加入時間:" }, @@ -3089,9 +3086,6 @@ "profile.label.organizations": { "message": "組織" }, - "profile.label.projects": { - "message": "{count} 個{countPlural, plural, other {專案}}" - }, "profile.label.saving": { "message": "儲存中..." }, @@ -3656,12 +3650,6 @@ "project.settings.visit-dashboard": { "message": "前往專案資訊主頁" }, - "project.stats.downloads-label": { - "message": "{count, plural, other {下載}}" - }, - "project.stats.followers-label": { - "message": "{count, plural, other {追蹤者}}" - }, "project.status.archived.message": { "message": "{title} 已封存。{title} 將不會再收到任何後續更新,除非作者決定解除封存該專案。" }, diff --git a/apps/frontend/src/pages/[type]/[project].vue b/apps/frontend/src/pages/[type]/[project].vue index b21380e860..7f908b9904 100644 --- a/apps/frontend/src/pages/[type]/[project].vue +++ b/apps/frontend/src/pages/[type]/[project].vue @@ -130,29 +130,27 @@ @set-processing="setProcessing" />
- - + import { - BookmarkIcon, BookTextIcon, CalendarIcon, ChartIcon, @@ -739,7 +605,6 @@ import { ListIcon, MoreVerticalIcon, PlayIcon, - PlusIcon, ReportIcon, ScaleIcon, ScanEyeIcon, @@ -752,7 +617,6 @@ import { Admonition, Avatar, ButtonStyled, - Checkbox, commonMessages, defineMessages, injectModrinthClient, @@ -761,12 +625,10 @@ import { NavTabs, NewModal, OpenInAppModal, - OverflowMenu, - PopoutMenu, PROJECT_DEP_MARKER_QUERY, ProjectBackgroundGradient, ProjectEnvironmentModal, - ProjectHeader, + ProjectPageHeader, ProjectSidebarCompatibility, ProjectSidebarCreators, ProjectSidebarDetails, @@ -774,8 +636,7 @@ import { ProjectSidebarServerInfo, ProjectSidebarTags, provideProjectPageContext, - StyledInput, - TagItem, + TeleportOverflowMenu, useDebugLogger, useFormatDateTime, useFormatPrice, @@ -795,6 +656,7 @@ import MessageBanner from '~/components/ui/MessageBanner.vue' import ModerationChecklist from '~/components/ui/moderation/checklist/ModerationChecklist.vue' import ModerationProjectNags from '~/components/ui/moderation/ModerationProjectNags.vue' import ModpackScanModal from '~/components/ui/moderation/ModpackScanModal.vue' +import ProjectCollectionSaveButton from '~/components/ui/ProjectCollectionSaveButton.vue' import ProjectDownloadModal from '~/components/ui/ProjectDownloadModal/index.vue' import ProjectMemberHeader from '~/components/ui/ProjectMemberHeader.vue' import { getSignInRouteObj } from '~/composables/auth.ts' @@ -851,11 +713,11 @@ const flags = useFeatureFlags() const cosmetics = useCosmetics() const { formatMessage } = useVIntl() -const formatPrice = useFormatPrice() const formatDateTime = useFormatDateTime({ timeStyle: 'short', dateStyle: 'long', }) +const formatPrice = useFormatPrice() const debug = useDebugLogger('DownloadModal') @@ -925,10 +787,6 @@ const messages = defineMessages({ id: 'project.navigation.changelog', defaultMessage: 'Changelog', }, - createNewCollection: { - id: 'project.collections.create-new', - defaultMessage: 'Create new collection', - }, createServer: { id: 'project.actions.create-server', defaultMessage: 'Create a server', @@ -937,6 +795,10 @@ const messages = defineMessages({ id: 'project.actions.create-server-tooltip', defaultMessage: 'Create a server', }, + createNewCollection: { + id: 'project.collections.create-new', + defaultMessage: 'Create new collection', + }, descriptionTab: { id: 'project.description.title', defaultMessage: 'Description', @@ -945,9 +807,9 @@ const messages = defineMessages({ id: 'project.actions.dont-show-again', defaultMessage: "Don't show again", }, - downloadsStat: { - id: 'project.stats.downloads-label', - defaultMessage: '{count, plural, one {download} other {downloads}}', + editProject: { + id: 'project.actions.edit-project', + defaultMessage: 'Edit project', }, errorLoadingProject: { id: 'project.error.loading', @@ -975,10 +837,6 @@ const messages = defineMessages({ id: 'project.environment.migration.learn-more', defaultMessage: 'Learn more about this change', }, - followersStat: { - id: 'project.stats.followers-label', - defaultMessage: '{count, plural, one {follower} other {followers}}', - }, galleryTab: { id: 'project.gallery.title', defaultMessage: 'Gallery', @@ -1039,6 +897,10 @@ const messages = defineMessages({ id: 'project.actions.review-project', defaultMessage: 'Review project', }, + rescanModpack: { + id: 'project.actions.rescan-modpack', + defaultMessage: 'Rescan modpack', + }, serversPromoDescription: { id: 'project.actions.servers-promo.description', defaultMessage: 'Modrinth Hosting is the easiest way to play with your friends without hassle!', @@ -1066,6 +928,7 @@ const messages = defineMessages({ }) const modalLicense = ref(null) +const modalCollection = useTemplateRef('modal_collection') const licenseText = ref('') const createdDate = computed(() => @@ -1104,13 +967,8 @@ async function getLicenseData(event) { } } -const displayCollectionsSearch = ref('') const collections = computed(() => - user.value && user.value.collections - ? user.value.collections.filter((x) => - x.name.toLowerCase().includes(displayCollectionsSearch.value.toLowerCase()), - ) - : [], + user.value && user.value.collections ? user.value.collections : [], ) if ( @@ -1844,6 +1702,89 @@ const canCreateServerFrom = computed(() => { return project.value.project_type === 'modpack' && project.value.server_side !== 'unsupported' }) +const projectSearchUrl = computed( + () => `/discover/${isServerProject.value ? 'servers' : `${project.value?.project_type}s`}`, +) +const projectPath = computed(() => + project.value + ? `/${project.value.project_type}/${project.value.slug ? project.value.slug : project.value.id}` + : '', +) +const projectHeaderPrimaryColor = computed(() => + currentMember.value || route.name === 'type-project-version-version' ? 'standard' : 'brand', +) +const showProjectHeaderCreateServerAction = computed( + () => canCreateServerFrom.value && flags.value.showProjectPageQuickServerButton, +) +const projectHeaderCreateServerTo = computed(() => + project.value ? `/hosting?project=${project.value.id}#plan` : '/hosting', +) +const projectHeaderMoreActions = computed(() => { + const isStaff = !!(auth.value.user && tags.value.staffRoles.includes(auth.value.user.role)) + + return [ + { + id: 'analytics', + label: formatMessage(commonMessages.analyticsButton), + icon: ChartIcon, + link: `${projectPath.value}/settings/analytics`, + shown: !!auth.value.user && !!currentMember.value, + }, + { + divider: true, + shown: !!auth.value.user && !!currentMember.value, + }, + { + id: 'moderation-checklist', + label: formatMessage(messages.reviewProject), + icon: ScaleIcon, + action: openModerationChecklistFromMenu, + color: 'orange', + shown: !!auth.value.user && isStaff && !showModerationChecklist.value, + }, + { + id: 'tech-review', + label: 'Tech review', + icon: ScanEyeIcon, + link: `/moderation/technical-review/${project.value?.id}`, + color: 'orange', + shown: !!auth.value.user && isStaff, + }, + { + id: 'moderation-modpack-rescan', + label: formatMessage(messages.rescanModpack), + icon: FolderSearchIcon, + action: () => scanModal.value?.show(), + color: 'orange', + shown: !!auth.value.user && isStaff && project.value?.actualProjectType === 'modpack', + }, + { + divider: true, + shown: !!auth.value.user && isStaff, + }, + { + id: 'report', + label: formatMessage(commonMessages.reportButton), + icon: ReportIcon, + action: reportProjectFromHeader, + color: 'red', + shown: !isMember.value, + }, + { + id: 'copy-id', + label: formatMessage(commonMessages.copyIdButton), + icon: ClipboardCopyIcon, + action: copyId, + }, + { + id: 'copy-permalink', + label: formatMessage(commonMessages.copyPermalinkButton), + icon: ClipboardCopyIcon, + action: copyPermalink, + }, + ] +}) + const createCanonicalUrl = () => project.value ? `https://modrinth.com/project/${project.value.id}` : undefined @@ -1878,6 +1819,33 @@ if (!route.name.startsWith('type-project-settings')) { const onUserCollectProject = useClientTry(userCollectProject) +function handleProjectHeaderPrimary(event) { + if (isServerProject.value) { + handlePlayServerProject() + } else { + downloadModal.value?.show(event) + } +} + +function dismissProjectHeaderCreateServerPrompt() { + flags.value.showProjectPageCreateServersTooltip = false + saveFeatureFlags() +} + +function followProjectFromHeader() { + if (!project.value) return + userFollowProject(project.value) +} + +function reportProjectFromHeader() { + if (!project.value) return + if (auth.value.user) { + reportProject(project.value.id) + } else { + navigateTo(getSignInRouteObj(route, getReportPath('project', project.value.id))) + } +} + watch( [versionsV3, _versionsV3Error], ([data, error]) => { diff --git a/apps/frontend/src/pages/organization/[organization].vue b/apps/frontend/src/pages/organization/[organization].vue index 78bdb70a68..bb9d42e7c6 100644 --- a/apps/frontend/src/pages/organization/[organization].vue +++ b/apps/frontend/src/pages/organization/[organization].vue @@ -62,86 +62,16 @@ diff --git a/packages/ui/src/components/base/JoinedButtons.vue b/packages/ui/src/components/base/JoinedButtons.vue index 8aab2dc96d..44ffb3a424 100644 --- a/packages/ui/src/components/base/JoinedButtons.vue +++ b/packages/ui/src/components/base/JoinedButtons.vue @@ -33,7 +33,8 @@ import { DropdownIcon } from '@modrinth/assets' import type { Component } from 'vue' import { computed } from 'vue' -import { ButtonStyled, OverflowMenu } from '../index' +import ButtonStyled from './ButtonStyled.vue' +import OverflowMenu from './OverflowMenu.vue' // TODO: This should be moved to a shared types file. type Colors = 'standard' | 'brand' | 'red' | 'orange' | 'green' | 'blue' | 'purple' diff --git a/packages/ui/src/components/base/PageHeader.vue b/packages/ui/src/components/base/PageHeader.vue deleted file mode 100644 index f3bbf04c06..0000000000 --- a/packages/ui/src/components/base/PageHeader.vue +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/packages/ui/src/components/base/TeleportOverflowMenu.vue b/packages/ui/src/components/base/TeleportOverflowMenu.vue index 20d5b354d3..407421461e 100644 --- a/packages/ui/src/components/base/TeleportOverflowMenu.vue +++ b/packages/ui/src/components/base/TeleportOverflowMenu.vue @@ -2,10 +2,13 @@
- {{ option.id }} + {{ option.label ?? option.id }} - {{ option.id }} + {{ option.label ?? option.id }} @@ -95,29 +107,49 @@ diff --git a/packages/ui/src/components/base/index.ts b/packages/ui/src/components/base/index.ts index 7fa6262111..60f9c2bfb3 100644 --- a/packages/ui/src/components/base/index.ts +++ b/packages/ui/src/components/base/index.ts @@ -19,7 +19,6 @@ export { default as CollapsibleAdmonition } from './CollapsibleAdmonition.vue' export { default as CollapsibleRegion } from './CollapsibleRegion.vue' export type { ComboboxOption } from './Combobox.vue' export { default as Combobox } from './Combobox.vue' -export { default as ContentPageHeader } from './ContentPageHeader.vue' export { default as CopyCode } from './CopyCode.vue' export { default as DatePicker } from './DatePicker.vue' export { default as DoubleIcon } from './DoubleIcon.vue' @@ -65,6 +64,23 @@ export { default as OptionGroup } from './OptionGroup.vue' export type { Option as OverflowMenuOption } from './OverflowMenu.vue' export { default as OverflowMenu } from './OverflowMenu.vue' export { default as Page } from './Page.vue' +export { default as PageHeader } from './page-header/index.vue' +export { default as PageHeaderMetadata } from './page-header/metadata/index.vue' +export { default as PageHeaderMetadataItem } from './page-header/metadata/page-header-metadata-item.vue' +export { default as PageHeaderMetadataNumberItem } from './page-header/metadata/page-header-metadata-number-item.vue' +export { default as PageHeaderMetadataTagsItem } from './page-header/metadata/page-header-metadata-tags-item.vue' +export { default as PageHeaderMetadataTimeItem } from './page-header/metadata/page-header-metadata-time-item.vue' +export { default as PageHeaderActions } from './page-header/page-header-actions.vue' +export { default as PageHeaderBadgeItem } from './page-header/page-header-badge-item.vue' +export type { + PageHeaderClass, + PageHeaderClickHandler, + PageHeaderIconProps, + PageHeaderInteractiveProps, + PageHeaderMetadataItemProps, + PageHeaderProps, + PageHeaderTarget, +} from './page-header/types' export { default as Pagination } from './Pagination.vue' export { default as PopoutMenu } from './PopoutMenu.vue' export { default as PreviewSelectButton } from './PreviewSelectButton.vue' @@ -89,6 +105,11 @@ export type { TabsTab, TabsValue } from './Tabs.vue' export { default as Tabs } from './Tabs.vue' export { default as TagItem } from './TagItem.vue' export { default as TagTagItem } from './TagTagItem.vue' +export type { + Item as TeleportOverflowMenuItem, + Option as TeleportOverflowMenuOption, +} from './TeleportOverflowMenu.vue' +export { default as TeleportOverflowMenu } from './TeleportOverflowMenu.vue' export type { TimeFrameLastUnit, TimeFrameLastUnitOption, diff --git a/packages/ui/src/components/base/page-header/index.vue b/packages/ui/src/components/base/page-header/index.vue new file mode 100644 index 0000000000..eef3b8db5b --- /dev/null +++ b/packages/ui/src/components/base/page-header/index.vue @@ -0,0 +1,67 @@ + + + diff --git a/packages/ui/src/components/base/page-header/metadata/index.vue b/packages/ui/src/components/base/page-header/metadata/index.vue new file mode 100644 index 0000000000..c9f14be49a --- /dev/null +++ b/packages/ui/src/components/base/page-header/metadata/index.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/packages/ui/src/components/base/page-header/metadata/page-header-metadata-item.vue b/packages/ui/src/components/base/page-header/metadata/page-header-metadata-item.vue new file mode 100644 index 0000000000..ee8c7e35fd --- /dev/null +++ b/packages/ui/src/components/base/page-header/metadata/page-header-metadata-item.vue @@ -0,0 +1,89 @@ + + + diff --git a/packages/ui/src/components/base/page-header/metadata/page-header-metadata-number-item.vue b/packages/ui/src/components/base/page-header/metadata/page-header-metadata-number-item.vue new file mode 100644 index 0000000000..9187a833cc --- /dev/null +++ b/packages/ui/src/components/base/page-header/metadata/page-header-metadata-number-item.vue @@ -0,0 +1,61 @@ + + + diff --git a/packages/ui/src/components/base/page-header/metadata/page-header-metadata-tags-item.vue b/packages/ui/src/components/base/page-header/metadata/page-header-metadata-tags-item.vue new file mode 100644 index 0000000000..9986801a89 --- /dev/null +++ b/packages/ui/src/components/base/page-header/metadata/page-header-metadata-tags-item.vue @@ -0,0 +1,33 @@ + + + diff --git a/packages/ui/src/components/base/page-header/metadata/page-header-metadata-time-item.vue b/packages/ui/src/components/base/page-header/metadata/page-header-metadata-time-item.vue new file mode 100644 index 0000000000..2b8ac27a1b --- /dev/null +++ b/packages/ui/src/components/base/page-header/metadata/page-header-metadata-time-item.vue @@ -0,0 +1,66 @@ + + + diff --git a/packages/ui/src/components/base/page-header/page-header-actions.vue b/packages/ui/src/components/base/page-header/page-header-actions.vue new file mode 100644 index 0000000000..a515eecb50 --- /dev/null +++ b/packages/ui/src/components/base/page-header/page-header-actions.vue @@ -0,0 +1,5 @@ + diff --git a/packages/ui/src/components/base/page-header/page-header-badge-item.vue b/packages/ui/src/components/base/page-header/page-header-badge-item.vue new file mode 100644 index 0000000000..c7f4a42a39 --- /dev/null +++ b/packages/ui/src/components/base/page-header/page-header-badge-item.vue @@ -0,0 +1,82 @@ + + + diff --git a/packages/ui/src/components/base/page-header/types.ts b/packages/ui/src/components/base/page-header/types.ts new file mode 100644 index 0000000000..646d92f679 --- /dev/null +++ b/packages/ui/src/components/base/page-header/types.ts @@ -0,0 +1,36 @@ +import type { Component, HTMLAttributes } from 'vue' +import type { RouteLocationRaw } from 'vue-router' + +export type PageHeaderTarget = string | RouteLocationRaw +export type PageHeaderClass = HTMLAttributes['class'] + +export type PageHeaderClickHandler = (event: MouseEvent) => void | Promise + +export type PageHeaderIconProps = { + icon?: Component + iconProps?: Record + iconClass?: PageHeaderClass +} + +export type PageHeaderInteractiveProps = { + tooltip?: string + ariaLabel?: string + to?: PageHeaderTarget + action?: PageHeaderClickHandler + disabled?: boolean +} + +export type PageHeaderMetadataItemProps = PageHeaderIconProps & PageHeaderInteractiveProps + +export type PageHeaderProps = { + title: string + summary?: string | null + headerClass?: PageHeaderClass + rowClass?: PageHeaderClass + mainClass?: PageHeaderClass + titleClass?: PageHeaderClass + truncateTitle?: boolean + divider?: boolean + bottomPadding?: boolean + disableLineClamp?: boolean +} diff --git a/packages/ui/src/components/project/ProjectHeader.vue b/packages/ui/src/components/project/ProjectHeader.vue deleted file mode 100644 index 0f5235cf2f..0000000000 --- a/packages/ui/src/components/project/ProjectHeader.vue +++ /dev/null @@ -1,115 +0,0 @@ - - diff --git a/packages/ui/src/components/project/ProjectPageHeader.vue b/packages/ui/src/components/project/ProjectPageHeader.vue new file mode 100644 index 0000000000..86fea39c72 --- /dev/null +++ b/packages/ui/src/components/project/ProjectPageHeader.vue @@ -0,0 +1,117 @@ + + + diff --git a/packages/ui/src/components/project/index.ts b/packages/ui/src/components/project/index.ts index 46cc74f73b..efc797c1d2 100644 --- a/packages/ui/src/components/project/index.ts +++ b/packages/ui/src/components/project/index.ts @@ -6,8 +6,8 @@ export { default as ProjectCard } from './card/ProjectCard.vue' export { default as ProjectBackgroundGradient } from './ProjectBackgroundGradient.vue' export { default as ProjectCardList } from './ProjectCardList.vue' export { default as ProjectCombobox } from './ProjectCombobox.vue' -export { default as ProjectHeader } from './ProjectHeader.vue' export { default as ProjectPageDescription } from './ProjectPageDescription.vue' +export { default as ProjectPageHeader } from './ProjectPageHeader.vue' export { default as ProjectPageVersions } from './ProjectPageVersions.vue' export { default as ProjectSidebarCompatibility } from './ProjectSidebarCompatibility.vue' export { default as ProjectSidebarCreators } from './ProjectSidebarCreators.vue' diff --git a/packages/ui/src/components/servers/server-header/PanelServerOverflowMenu.vue b/packages/ui/src/components/servers/server-header/PanelServerOverflowMenu.vue deleted file mode 100644 index a05c6a8db2..0000000000 --- a/packages/ui/src/components/servers/server-header/PanelServerOverflowMenu.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - diff --git a/packages/ui/src/components/servers/server-header/ServerManageHeader.vue b/packages/ui/src/components/servers/server-header/ServerManageHeader.vue deleted file mode 100644 index 88e6adeb07..0000000000 --- a/packages/ui/src/components/servers/server-header/ServerManageHeader.vue +++ /dev/null @@ -1,182 +0,0 @@ - - - diff --git a/packages/ui/src/components/servers/server-header/index.ts b/packages/ui/src/components/servers/server-header/index.ts index 97bcdcc7f2..2ff43b46e4 100644 --- a/packages/ui/src/components/servers/server-header/index.ts +++ b/packages/ui/src/components/servers/server-header/index.ts @@ -1,3 +1 @@ export { default as PanelServerActionButton } from './PanelServerActionButton.vue' -export { default as PanelServerOverflowMenu } from './PanelServerOverflowMenu.vue' -export { default as ServerManageHeader } from './ServerManageHeader.vue' diff --git a/packages/ui/src/layouts/shared/browse-tab/header.vue b/packages/ui/src/layouts/shared/browse-tab/header.vue index bb976c861a..1ee98cea5c 100644 --- a/packages/ui/src/layouts/shared/browse-tab/header.vue +++ b/packages/ui/src/layouts/shared/browse-tab/header.vue @@ -1,11 +1,11 @@