-
{{ title }}
+
{{ title }}
{{ message }}
diff --git a/apps/frontend/src/components/ui/servers/FileVirtualList.vue b/apps/frontend/src/components/ui/servers/FileVirtualList.vue
index 9381fb77be..800783aa0e 100644
--- a/apps/frontend/src/components/ui/servers/FileVirtualList.vue
+++ b/apps/frontend/src/components/ui/servers/FileVirtualList.vue
@@ -1,11 +1,10 @@
-
+
$emit('contextmenu', item, x, y)"
+ @toggle-select="$emit('toggle-select', item.path)"
/>
@@ -49,15 +52,17 @@ import FileItem from './FileItem.vue'
const props = defineProps<{
items: any[]
+ selectedItems: Set
}>()
const emit = defineEmits<{
(
- e: 'delete' | 'rename' | 'download' | 'move' | 'edit' | 'moveDirectTo' | 'extract',
+ e: 'delete' | 'rename' | 'download' | 'move' | 'edit' | 'moveDirectTo' | 'extract' | 'hover',
item: any,
): void
(e: 'contextmenu', item: any, x: number, y: number): void
(e: 'loadMore'): void
+ (e: 'toggle-select', path: string): void
}>()
const ITEM_HEIGHT = 61
@@ -92,7 +97,7 @@ const visibleItems = computed(() => {
return props.items.slice(visibleRange.value.start, visibleRange.value.end)
})
-const handleScroll = () => {
+function handleScroll() {
windowScrollY.value = window.scrollY
if (!listContainer.value) return
@@ -105,7 +110,7 @@ const handleScroll = () => {
}
}
-const handleResize = () => {
+function handleResize() {
windowHeight.value = window.innerHeight
}
diff --git a/apps/frontend/src/components/ui/servers/FilesBrowseNavbar.vue b/apps/frontend/src/components/ui/servers/FilesBrowseNavbar.vue
index 165d13facf..9d02fac539 100644
--- a/apps/frontend/src/components/ui/servers/FilesBrowseNavbar.vue
+++ b/apps/frontend/src/components/ui/servers/FilesBrowseNavbar.vue
@@ -1,11 +1,6 @@
-
-
-
-
-
-
-
-
- {{ filterLabel }}
-
-
-
- Show all
- Files only
- Folders only
-
-
-
-
-
-
-
-
-
+
+
+
+
-
+
-
-
+
+
New file
New folder
Upload file
@@ -159,7 +121,6 @@ import {
CurseForgeIcon,
DropdownIcon,
FileArchiveIcon,
- FilterIcon,
FolderOpenIcon,
HomeIcon,
LinkIcon,
@@ -168,12 +129,8 @@ import {
UploadIcon,
} from '@modrinth/assets'
import { ButtonStyled, OverflowMenu } from '@modrinth/ui'
-import { useIntersectionObserver } from '@vueuse/core'
-import { computed, ref } from 'vue'
-
-import TeleportOverflowMenu from './TeleportOverflowMenu.vue'
-const props = defineProps<{
+defineProps<{
breadcrumbSegments: string[]
searchQuery: string
currentFilter: string
@@ -183,44 +140,13 @@ const props = defineProps<{
defineEmits<{
(e: 'navigate', index: number): void
(e: 'create', type: 'file' | 'directory'): void
- (e: 'upload' | 'upload-zip'): void
+ (e: 'upload' | 'upload-zip' | 'prefetch-home'): void
(e: 'unzip-from-url', cf: boolean): void
(e: 'update:searchQuery' | 'filter', value: string): void
}>()
-
-const pyroFilesSentinel = ref(null)
-const isStuck = ref(false)
-
-useIntersectionObserver(
- pyroFilesSentinel,
- ([{ isIntersecting }]) => {
- isStuck.value = !isIntersecting
- },
- { threshold: [0, 1] },
-)
-
-const filterLabel = computed(() => {
- switch (props.currentFilter) {
- case 'filesOnly':
- return 'Files only'
- case 'foldersOnly':
- return 'Folders only'
- default:
- return 'Show all'
- }
-})
diff --git a/packages/ui/src/components/base/UnsavedChangesPopup.vue b/packages/ui/src/components/base/UnsavedChangesPopup.vue
index c150f5840a..8f812ea6b9 100644
--- a/packages/ui/src/components/base/UnsavedChangesPopup.vue
+++ b/packages/ui/src/components/base/UnsavedChangesPopup.vue
@@ -5,6 +5,7 @@ import { type Component, computed } from 'vue'
import { commonMessages } from '../../utils'
import ButtonStyled from './ButtonStyled.vue'
+import FloatingActionBar from './FloatingActionBar.vue'
const { formatMessage } = useVIntl()
@@ -53,64 +54,21 @@ function localizeIfPossible(message: MessageDescriptor | string) {
-
-