News
diff --git a/apps/app-frontend/src/components/ui/InstanceIndicator.vue b/apps/app-frontend/src/components/ui/InstanceIndicator.vue
new file mode 100644
index 000000000..61adcfa2e
--- /dev/null
+++ b/apps/app-frontend/src/components/ui/InstanceIndicator.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatCategory(instance.loader) }} {{ instance.game_version }}
+
+
+
+
+
+
+ Back to instance
+
+
+
+
+
+
diff --git a/apps/app-frontend/src/components/ui/NavTabs.vue b/apps/app-frontend/src/components/ui/NavTabs.vue
index 9bd48695b..fa739af38 100644
--- a/apps/app-frontend/src/components/ui/NavTabs.vue
+++ b/apps/app-frontend/src/components/ui/NavTabs.vue
@@ -29,7 +29,7 @@
+
+
+
+ You have no friends :C
+
+
+
+
+
{{ friend.username }}
+
+
+
+
+
+
+
+
+
+ You have no pending friend requests :C
+
+
+
+
+
+
+
+ {{ friend.username }} sent you a friend request
+
+
+ You sent {{ friend.username }} a friend request
+
+
+
{{ friend.created.fromNow() }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Username
+
You can add friends with their Modrinth username.
+
+
+
+
+
+
+
+
Friends
+
+
+
+
+
+ Add friend
+
+
+
+ Manage friends
+
+ {{ acceptedFriends.length }}
+
+
+
+
+ View friend requests
+
+ {{ pendingFriends.length }}
+
+
+
+
+
+
+
+
+
+
+
+
You have no friends :C
+
+ Sign in to add friends!
+
+
+ Why don't you
+ add one?
+
+
+
+
+
+ Remove friend
+
+
+ friendOptions.showMenu(event, friend, [
+ {
+ name: 'remove-friend',
+ color: 'danger',
+ },
+ ])
+ "
+ >
+
+
+
+ {{ friend.username }}
+
+ {{ friend.status }}
+
+
+
+
+
diff --git a/apps/app-frontend/src/components/ui/install_flow/ModInstallModal.vue b/apps/app-frontend/src/components/ui/install_flow/ModInstallModal.vue
index 00ae74dc0..70c49e879 100644
--- a/apps/app-frontend/src/components/ui/install_flow/ModInstallModal.vue
+++ b/apps/app-frontend/src/components/ui/install_flow/ModInstallModal.vue
@@ -243,7 +243,7 @@ const createInstance = async () => {
"
>
diff --git a/apps/app-frontend/src/components/ui/modal/AppSettingsModal.vue b/apps/app-frontend/src/components/ui/modal/AppSettingsModal.vue
index a1763a45f..b6a23ec02 100644
--- a/apps/app-frontend/src/components/ui/modal/AppSettingsModal.vue
+++ b/apps/app-frontend/src/components/ui/modal/AppSettingsModal.vue
@@ -119,20 +119,27 @@ const osVersion = getOsVersion()
-
{{ formatMessage(developerModeEnabled) }}
+
+ {{ formatMessage(developerModeEnabled) }}
+
diff --git a/apps/app-frontend/src/components/ui/settings/FeatureFlagSettings.vue b/apps/app-frontend/src/components/ui/settings/FeatureFlagSettings.vue
index 5a6ea02a3..65ca0f8af 100644
--- a/apps/app-frontend/src/components/ui/settings/FeatureFlagSettings.vue
+++ b/apps/app-frontend/src/components/ui/settings/FeatureFlagSettings.vue
@@ -6,24 +6,23 @@ import type { Ref } from 'vue'
const themeStore = useTheming()
-type ThemeStoreKeys = keyof typeof themeStore;
+type ThemeStoreKeys = keyof typeof themeStore
const options: Ref
= computed(() => {
- return Object.keys(themeStore).filter((key) => key.startsWith('featureFlag_')) as ThemeStoreKeys[];
+ return Object.keys(themeStore).filter((key) => key.startsWith('featureFlag_')) as ThemeStoreKeys[]
})
-function getStoreValue(key: K): typeof themeStore[K] {
- return themeStore[key];
+function getStoreValue(key: K): (typeof themeStore)[K] {
+ return themeStore[key]
}
-function setStoreValue(key: K, value: typeof themeStore[K]) {
- themeStore[key] = value;
+function setStoreValue(key: K, value: (typeof themeStore)[K]) {
+ themeStore[key] = value
}
function formatFlagName(name: string) {
- return name.replace('featureFlag_', '');
+ return name.replace('featureFlag_', '')
}
-
diff --git a/apps/app-frontend/src/helpers/events.js b/apps/app-frontend/src/helpers/events.js
index 3bc07bcb9..0ed288365 100644
--- a/apps/app-frontend/src/helpers/events.js
+++ b/apps/app-frontend/src/helpers/events.js
@@ -93,3 +93,7 @@ export async function command_listener(callback) {
export async function warning_listener(callback) {
return await listen('warning', (event) => callback(event.payload))
}
+
+export async function friend_listener(callback) {
+ return await listen('friend', (event) => callback(event.payload))
+}
diff --git a/apps/app-frontend/src/helpers/friends.js b/apps/app-frontend/src/helpers/friends.js
new file mode 100644
index 000000000..168c93837
--- /dev/null
+++ b/apps/app-frontend/src/helpers/friends.js
@@ -0,0 +1,17 @@
+import { invoke } from '@tauri-apps/api/core'
+
+export async function friends() {
+ return await invoke('plugin:friends|friends')
+}
+
+export async function friend_statuses() {
+ return await invoke('plugin:friends|friend_statuses')
+}
+
+export async function add_friend(userId) {
+ return await invoke('plugin:friends|add_friend', { userId })
+}
+
+export async function remove_friend(userId) {
+ return await invoke('plugin:friends|remove_friend', { userId })
+}
diff --git a/apps/app-frontend/src/pages/Browse.vue b/apps/app-frontend/src/pages/Browse.vue
index 929171bc5..607d7c1d5 100644
--- a/apps/app-frontend/src/pages/Browse.vue
+++ b/apps/app-frontend/src/pages/Browse.vue
@@ -1,29 +1,18 @@
@@ -419,37 +404,7 @@ await refreshSearch()
-
-
-
-
-
-
-
-
- {{ formatCategory(instance.loader) }} {{ instance.game_version }}
-
-
-
-
-
-
- Back to instance
-
-
-
+
Install content to instance
Discover content
diff --git a/apps/app-frontend/src/pages/Index.vue b/apps/app-frontend/src/pages/Index.vue
index bec117c88..501f40e92 100644
--- a/apps/app-frontend/src/pages/Index.vue
+++ b/apps/app-frontend/src/pages/Index.vue
@@ -100,7 +100,7 @@ onUnmounted(() => {
-
Welcome back, Prospector!
+
Welcome back!
0" label="Instances" :instances="instances.filter(i => !i.linked_data)" />
+
diff --git a/apps/app-frontend/src/pages/library/Downloaded.vue b/apps/app-frontend/src/pages/library/Downloaded.vue
index d2239c919..4fa48812c 100644
--- a/apps/app-frontend/src/pages/library/Downloaded.vue
+++ b/apps/app-frontend/src/pages/library/Downloaded.vue
@@ -9,5 +9,9 @@ defineProps({
})
-
+
diff --git a/apps/app-frontend/src/pages/library/Index.vue b/apps/app-frontend/src/pages/library/Index.vue
index e508043a5..823b20f6b 100644
--- a/apps/app-frontend/src/pages/library/Index.vue
+++ b/apps/app-frontend/src/pages/library/Index.vue
@@ -37,11 +37,17 @@ onUnmounted(() => {
Library
-
+
-
+
diff --git a/apps/app-frontend/src/pages/project/Index.vue b/apps/app-frontend/src/pages/project/Index.vue
index 9b02e1362..c707fe974 100644
--- a/apps/app-frontend/src/pages/project/Index.vue
+++ b/apps/app-frontend/src/pages/project/Index.vue
@@ -23,24 +23,7 @@
/>
-
-
-
-
- {{
- instance.name.length > 20 ? instance.name.substring(0, 20) + '...' : instance.name
- }}
-
- {{ instance.loader.charAt(0).toUpperCase() + instance.loader.slice(1) }}
- {{ instance.game_version }}
-
-
-
-
+
@@ -62,33 +45,33 @@
{},
+ },
+ {
+ id: 'save',
+ disabled: true,
+ tooltip: 'Coming soon',
+ action: () => {},
+ },
+ {
+ id: 'open-in-browser',
+ link: `https://modrinth.com/${data.project_type}/${data.slug}`,
+ external: true,
+ },
+ {
+ divider: true,
+ },
+ {
+ id: 'report',
+ color: 'red',
+ hoverFilled: true,
+ link: `https://modrinth.com/report?item=project&itemID=${data.id}`,
+ },
+ ]"
aria-label="More options"
>
@@ -109,7 +92,7 @@
{
label: 'Versions',
href: `/project/${$route.params.id}/versions`,
- subpages: [ 'version' ]
+ subpages: ['version'],
},
{
label: 'Gallery',
@@ -152,15 +135,14 @@ import {
ClipboardCopyIcon,
} from '@modrinth/assets'
import {
- Card,
- Avatar,
ProjectHeader,
ProjectSidebarCompatibility,
ButtonStyled,
OverflowMenu,
ProjectSidebarLinks,
ProjectSidebarCreators,
- ProjectSidebarDetails, ProjectBackgroundGradient
+ ProjectSidebarDetails,
+ ProjectBackgroundGradient,
} from '@modrinth/ui'
import { get_categories, get_game_versions, get_loaders } from '@/helpers/tags'
@@ -171,12 +153,12 @@ import { useRoute } from 'vue-router'
import { ref, shallowRef, watch } from 'vue'
import { useBreadcrumbs } from '@/store/breadcrumbs'
import { handleError } from '@/store/notifications.js'
-import { convertFileSrc } from '@tauri-apps/api/core'
import ContextMenu from '@/components/ui/ContextMenu.vue'
import { install as installVersion } from '@/store/install.js'
import { get_project, get_team, get_version_many } from '@/helpers/cache.js'
import NavTabs from '@/components/ui/NavTabs.vue'
import { useTheming } from '@/store/state.js'
+import InstanceIndicator from '@/components/ui/InstanceIndicator.vue'
dayjs.extend(relativeTime)
@@ -439,30 +421,6 @@ const handleOptionsClick = (args) => {
}
}
-.small-instance {
- padding: var(--gap-lg);
- border-radius: var(--radius-md);
- margin-bottom: var(--gap-md);
-
- .instance {
- display: flex;
- gap: 0.5rem;
- margin-bottom: 0;
-
- .title {
- font-weight: 600;
- color: var(--color-contrast);
- }
- }
-
- .small-instance_info {
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- padding: 0.25rem 0;
- }
-}
-
.project-sidebar-section {
@apply p-4 flex flex-col gap-2 border-0 border-b-[1px] border-[--brand-gradient-border] border-solid;
}
diff --git a/apps/app-frontend/src/pages/project/Versions.vue b/apps/app-frontend/src/pages/project/Versions.vue
index ab48f3983..33f8c55dc 100644
--- a/apps/app-frontend/src/pages/project/Versions.vue
+++ b/apps/app-frontend/src/pages/project/Versions.vue
@@ -1,13 +1,20 @@
-
+
-