diff --git a/apps/app-frontend/src/App.vue b/apps/app-frontend/src/App.vue index 258f762c2..8e79597d8 100644 --- a/apps/app-frontend/src/App.vue +++ b/apps/app-frontend/src/App.vue @@ -57,6 +57,7 @@ import PromotionWrapper from '@/components/ui/PromotionWrapper.vue' import { hide_ads_window, show_ads_window } from '@/helpers/ads.js' import FriendsList from '@/components/ui/friends/FriendsList.vue' import { openUrl } from '@tauri-apps/plugin-opener' +import QuickInstanceSwitcher from '@/components/ui/QuickInstanceSwitcher.vue' const themeStore = useTheming() @@ -393,6 +394,9 @@ function handleAuxClick(e) {
+ + + diff --git a/apps/app-frontend/src/assets/stylesheets/global.scss b/apps/app-frontend/src/assets/stylesheets/global.scss index af5dcbb8e..29876cc20 100644 --- a/apps/app-frontend/src/assets/stylesheets/global.scss +++ b/apps/app-frontend/src/assets/stylesheets/global.scss @@ -117,4 +117,8 @@ img { -ms-user-select: none; } +.card-shadow { + box-shadow: var(--shadow-card); +} + @import '@modrinth/assets/omorphia.scss'; diff --git a/apps/app-frontend/src/components/GridDisplay.vue b/apps/app-frontend/src/components/GridDisplay.vue index 481768a9e..df174741d 100644 --- a/apps/app-frontend/src/components/GridDisplay.vue +++ b/apps/app-frontend/src/components/GridDisplay.vue @@ -363,9 +363,9 @@ const filteredResults = computed(() => { .instances { display: grid; - grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr)); + grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr)); width: 100%; - gap: 1rem; + gap: 0.75rem; margin-right: auto; scroll-behavior: smooth; overflow-y: auto; diff --git a/apps/app-frontend/src/components/RowDisplay.vue b/apps/app-frontend/src/components/RowDisplay.vue index 06891b0e1..36a1f7be8 100644 --- a/apps/app-frontend/src/components/RowDisplay.vue +++ b/apps/app-frontend/src/components/RowDisplay.vue @@ -181,6 +181,7 @@ const handleOptionsClick = async (args) => { } } +const maxInstancesPerCompactRow = ref(1) const maxInstancesPerRow = ref(1) const maxProjectsPerRow = ref(1) @@ -190,8 +191,20 @@ const calculateCardsPerRow = () => { // Convert container width from pixels to rem const containerWidthInRem = containerWidth / parseFloat(getComputedStyle(document.documentElement).fontSize) - maxInstancesPerRow.value = Math.floor((containerWidthInRem + 1) / 11) - maxProjectsPerRow.value = Math.floor((containerWidthInRem + 1) / 19) + + maxInstancesPerCompactRow.value = Math.floor((containerWidthInRem + 0.75) / 18.75) + maxInstancesPerRow.value = Math.floor((containerWidthInRem + 0.75) / 20.75) + maxProjectsPerRow.value = Math.floor((containerWidthInRem + 0.75) / 18.75) + + if (maxInstancesPerRow.value < 5) { + maxInstancesPerRow.value *= 2 + } + if (maxInstancesPerCompactRow.value < 5) { + maxInstancesPerCompactRow.value *= 2 + } + if (maxProjectsPerRow.value < 3) { + maxProjectsPerRow.value *= 2 + } } onMounted(() => { @@ -213,17 +226,33 @@ onUnmounted(() => { proceed-label="Delete" @proceed="deleteProfile" /> -
-
-
- {{ row.label }} - -
-
+
+
+ + {{ row.label }} + + +
@@ -308,16 +337,21 @@ onUnmounted(() => { .instances { display: grid; - grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr)); - grid-gap: 1rem; + grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr)); + grid-gap: 0.75rem; width: 100%; + + &.compact { + grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr)); + gap: 0.75rem; + } } .projects { display: grid; width: 100%; grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr)); - grid-gap: 1rem; + grid-gap: 0.75rem; .item { width: 100%; diff --git a/apps/app-frontend/src/components/ui/Instance.vue b/apps/app-frontend/src/components/ui/Instance.vue index 7630f0e9c..7d0249486 100644 --- a/apps/app-frontend/src/components/ui/Instance.vue +++ b/apps/app-frontend/src/components/ui/Instance.vue @@ -1,8 +1,8 @@ - - - - diff --git a/apps/app-frontend/src/components/ui/InstanceCreationModal.vue b/apps/app-frontend/src/components/ui/InstanceCreationModal.vue index 041506a15..ed38e6fcc 100644 --- a/apps/app-frontend/src/components/ui/InstanceCreationModal.vue +++ b/apps/app-frontend/src/components/ui/InstanceCreationModal.vue @@ -237,7 +237,7 @@ const display_icon = ref(null) const showAdvanced = ref(false) const creating = ref(false) const showSnapshots = ref(false) -const creationType = ref('from file') +const creationType = ref('custom') const isShowing = ref(false) defineExpose({ diff --git a/apps/app-frontend/src/components/ui/NavButton.vue b/apps/app-frontend/src/components/ui/NavButton.vue index d42ff227f..81300b6e0 100644 --- a/apps/app-frontend/src/components/ui/NavButton.vue +++ b/apps/app-frontend/src/components/ui/NavButton.vue @@ -38,6 +38,7 @@ defineProps<{ to: (() => void) | string isPrimary?: RouteFunction isSubpage?: RouteFunction + highlightOverride?: boolean }>() defineOptions({ diff --git a/apps/app-frontend/src/components/ui/NavTabs.vue b/apps/app-frontend/src/components/ui/NavTabs.vue index fa739af38..72e772538 100644 --- a/apps/app-frontend/src/components/ui/NavTabs.vue +++ b/apps/app-frontend/src/components/ui/NavTabs.vue @@ -157,8 +157,4 @@ watch(route, () => { all 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s, opacity 250ms cubic-bezier(0.5, 0, 0.2, 1) 50ms; } - -.card-shadow { - box-shadow: var(--shadow-card); -} diff --git a/apps/app-frontend/src/components/ui/ProjectCard.vue b/apps/app-frontend/src/components/ui/ProjectCard.vue index b3e680d61..1d0c3928e 100644 --- a/apps/app-frontend/src/components/ui/ProjectCard.vue +++ b/apps/app-frontend/src/components/ui/ProjectCard.vue @@ -1,17 +1,15 @@ - + diff --git a/apps/app-frontend/src/components/ui/QuickInstanceSwitcher.vue b/apps/app-frontend/src/components/ui/QuickInstanceSwitcher.vue new file mode 100644 index 000000000..a555c286d --- /dev/null +++ b/apps/app-frontend/src/components/ui/QuickInstanceSwitcher.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/apps/app-frontend/src/components/ui/RunningAppBar.vue b/apps/app-frontend/src/components/ui/RunningAppBar.vue index ad600fc7f..dbb9e77bb 100644 --- a/apps/app-frontend/src/components/ui/RunningAppBar.vue +++ b/apps/app-frontend/src/components/ui/RunningAppBar.vue @@ -14,7 +14,7 @@
- +
Offline
@@ -108,7 +108,13 @@ diff --git a/packages/ui/src/components/index.ts b/packages/ui/src/components/index.ts index d412069d1..8fe546bc9 100644 --- a/packages/ui/src/components/index.ts +++ b/packages/ui/src/components/index.ts @@ -50,6 +50,7 @@ export { default as Modal } from './modal/Modal.vue' export { default as ConfirmModal } from './modal/ConfirmModal.vue' export { default as ShareModal } from './modal/ShareModal.vue' export { default as TabbedModal } from './modal/TabbedModal.vue' +export type { Tab as TabbedModalTab } from './modal/TabbedModal.vue' // Navigation export { default as Breadcrumbs } from './nav/Breadcrumbs.vue' diff --git a/packages/ui/src/components/modal/TabbedModal.vue b/packages/ui/src/components/modal/TabbedModal.vue index 4b1720c75..a7292113c 100644 --- a/packages/ui/src/components/modal/TabbedModal.vue +++ b/packages/ui/src/components/modal/TabbedModal.vue @@ -4,7 +4,7 @@ import { useVIntl, type MessageDescriptor } from '@vintl/vintl' const { formatMessage } = useVIntl() -type Tab = { +export type Tab = { name: MessageDescriptor icon: Component content: Component @@ -12,7 +12,8 @@ type Tab = { } defineProps<{ - tabs: Tab[] + // eslint-disable-next-line @typescript-eslint/no-explicit-any + tabs: Tab[] }>() const selectedTab = ref(0)