diff --git a/frontend/src/App.vue b/frontend/src/App.vue
index f21bd91..4abd6d9 100644
--- a/frontend/src/App.vue
+++ b/frontend/src/App.vue
@@ -133,4 +133,3 @@ onUnmounted(() => {
})
export type { Path }
-@/stores/main
diff --git a/frontend/src/assets/main.css b/frontend/src/assets/main.css
index 8080aa6..5af8f6c 100644
--- a/frontend/src/assets/main.css
+++ b/frontend/src/assets/main.css
@@ -14,7 +14,7 @@
/* The following are overridden by responsive layouts */
--root-font-size: 1rem;
--header-font-size: 1rem;
- --header-height: calc(6.5 * var(--header-font-size));
+ --header-height: 4rem;
}
@media (prefers-color-scheme: dark) {
:root {
@@ -48,6 +48,7 @@
:root {
--header-font-size: calc(10px + 10 * 100vh / 600); /* 20px at 600px height */
--root-font-size: 0.8rem;
+ --header-height: 2rem;
}
header .breadcrumb > * {
padding-top: calc(8 + 8 * 100vh / 600) !important;
diff --git a/frontend/src/components/FileExplorer.vue b/frontend/src/components/FileExplorer.vue
index cb9ad5a..cdd4b10 100644
--- a/frontend/src/components/FileExplorer.vue
+++ b/frontend/src/components/FileExplorer.vue
@@ -28,11 +28,11 @@
-
+ |
{ if (doc.dir) (ev.target as HTMLElement).click() }"
>{{ doc.name }}
- Nothing to see here
+
+
diff --git a/frontend/src/components/GalleryFigure.vue b/frontend/src/components/GalleryFigure.vue
new file mode 100644
index 0000000..d27116b
--- /dev/null
+++ b/frontend/src/components/GalleryFigure.vue
@@ -0,0 +1,99 @@
+
+ {
+ if (media) { media.play(); ev.preventDefault() }
+ }"
+ >
+
+
+
+
+
+
+
diff --git a/frontend/src/components/HeaderMain.vue b/frontend/src/components/HeaderMain.vue
index 251b30f..ae82434 100644
--- a/frontend/src/components/HeaderMain.vue
+++ b/frontend/src/components/HeaderMain.vue
@@ -72,6 +72,7 @@ watchEffect(() => {
const settingsMenu = (e: Event) => {
// show the context menu
const items = []
+ items.push({ label: 'Gallery', onClick: () => store.gallery = !store.gallery })
if (store.user.isLoggedIn) {
items.push({ label: `Logout ${store.user.username ?? ''}`, onClick: () => store.logout() })
} else {
diff --git a/frontend/src/components/MediaPreview.vue b/frontend/src/components/MediaPreview.vue
new file mode 100644
index 0000000..f402c38
--- /dev/null
+++ b/frontend/src/components/MediaPreview.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/components/SelectBox.vue b/frontend/src/components/SelectBox.vue
new file mode 100644
index 0000000..dbda660
--- /dev/null
+++ b/frontend/src/components/SelectBox.vue
@@ -0,0 +1,23 @@
+
+ {
+ if ((ev.target as HTMLInputElement).checked) {
+ store.selected.add(doc.key)
+ } else {
+ store.selected.delete(doc.key)
+ }
+ }"
+ >
+
+
+
diff --git a/frontend/src/repositories/Document.ts b/frontend/src/repositories/Document.ts
index 7607083..9887dd6 100644
--- a/frontend/src/repositories/Document.ts
+++ b/frontend/src/repositories/Document.ts
@@ -36,6 +36,14 @@ export class Doc {
get urlrouter(): string {
return this.url.replace(/^\/#/, '')
}
+ get img(): boolean {
+ const ext = this.name.split('.').pop()?.toLowerCase()
+ return ['jpg', 'jpeg', 'png', 'gif', 'webp', 'avif', 'svg'].includes(ext || '')
+ }
+ get ext(): string {
+ const ext = this.name.split('.').pop()
+ return ext ? ext.toLowerCase() : ''
+ }
}
export type errorEvent = {
error: {
diff --git a/frontend/src/stores/main.ts b/frontend/src/stores/main.ts
index bcdb5a2..70f461b 100644
--- a/frontend/src/stores/main.ts
+++ b/frontend/src/stores/main.ts
@@ -23,6 +23,8 @@ export const useMainStore = defineStore({
fileExplorer: null as any,
error: '' as string,
connected: false,
+ gallery: false,
+ cursor: shallowRef(null),
server: {} as Record,
prefs: {
sortListing: '' as SortOrder,
diff --git a/frontend/src/views/ExplorerView.vue b/frontend/src/views/ExplorerView.vue
index 78f6021..e283ffe 100644
--- a/frontend/src/views/ExplorerView.vue
+++ b/frontend/src/views/ExplorerView.vue
@@ -1,19 +1,40 @@
-
+
+ No Connection
+ Waiting for Files
+ No matches!
+ Folder not found.
+ Empty folder
+
+
+
+
+ Media files found. Would you like a gallery view?
+ { store.gallery = true }">Gallery
+
+
+
|