+
+
+
+
+
+ Feature
+
+
+ {{ host.name }}
+
+
+
+
+
+
+ {{ row.feature }}
+
+
+
+ {{ row.values[host.id] ? 'Yes' : 'No' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/components/about/AboutSectionNav.vue b/frontend/src/components/about/AboutSectionNav.vue
new file mode 100644
index 0000000..6429966
--- /dev/null
+++ b/frontend/src/components/about/AboutSectionNav.vue
@@ -0,0 +1,29 @@
+
+
+
+ {{ item.label }}
+
+
+
+
+
diff --git a/frontend/src/components/layout/AppFooter.vue b/frontend/src/components/layout/AppFooter.vue
new file mode 100644
index 0000000..3ab0fe9
--- /dev/null
+++ b/frontend/src/components/layout/AppFooter.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
diff --git a/frontend/src/components/layout/AppHeader.vue b/frontend/src/components/layout/AppHeader.vue
new file mode 100644
index 0000000..53d9e94
--- /dev/null
+++ b/frontend/src/components/layout/AppHeader.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
diff --git a/frontend/src/components/upload/MetadataInspector.vue b/frontend/src/components/upload/MetadataInspector.vue
index 8e6a862..7cf160e 100644
--- a/frontend/src/components/upload/MetadataInspector.vue
+++ b/frontend/src/components/upload/MetadataInspector.vue
@@ -1,25 +1,24 @@
-
- Metadata Inspector
- {{ fileName }}
-
+
Select an image to view its metadata.
-
+
{{ entry.message }}
- Original
- {{ entry.output }}
-
+
-
- {{ activeTab === 'original' ? entry.output : entry.afterStripOutput }}
-
+ {{ tabBody.text }}
+
+ {{ tabBody.text }}
{{ entry.message }}
@@ -28,8 +27,9 @@
diff --git a/frontend/src/components/upload/UploadIntakeControls.vue b/frontend/src/components/upload/UploadIntakeControls.vue
new file mode 100644
index 0000000..cf29350
--- /dev/null
+++ b/frontend/src/components/upload/UploadIntakeControls.vue
@@ -0,0 +1,228 @@
+
+
+
+ Drop anywhere, paste or choose files. Max {{ maxQueueSize }} images, up to {{ maxImageSizeLabel }} each.
+
+
+
+
+ Choose images
+
+
+
+
+ Configure & upload
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/components/upload/UploadPanelHeader.vue b/frontend/src/components/upload/UploadPanelHeader.vue
new file mode 100644
index 0000000..aa424e3
--- /dev/null
+++ b/frontend/src/components/upload/UploadPanelHeader.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
{{ title }}
+
{{ fileName }}
+
+
+
+
+
+
diff --git a/frontend/src/components/upload/UploadQueueList.vue b/frontend/src/components/upload/UploadQueueList.vue
index 49e9a24..da2f95b 100644
--- a/frontend/src/components/upload/UploadQueueList.vue
+++ b/frontend/src/components/upload/UploadQueueList.vue
@@ -3,20 +3,38 @@
- {{ row.file.name }}
-
- {{ prettyBytes(row.file.size, { maximumFractionDigits: 1 }) }}
-
-
- {{ row.metadata.message }}
-
-
- {{ row.upload.message }}
-
+
+
+
+
+ {{ row.file.name }}
+
+ {{ prettyBytes(row.file.size, { maximumFractionDigits: 1 }) }}
+
+
+
+
+ {{ row.metadata.message }}
+
+
+ {{ row.upload.message }}
+
+
+
diff --git a/frontend/src/components/upload/UploadSettingsPanel.vue b/frontend/src/components/upload/UploadSettingsPanel.vue
index a57b000..20ad645 100644
--- a/frontend/src/components/upload/UploadSettingsPanel.vue
+++ b/frontend/src/components/upload/UploadSettingsPanel.vue
@@ -9,12 +9,20 @@
>
- Zero knowledge
+
+ Zero knowledge
+
+ Learn more
+
+
- Images are E2E encrypted. The server has no technical ability to decrypt them. Having the link
- gives permission to view the image. You can additionally password-protect the upload so the
- link alone is not enough. Great for private sharing, but doesn't work with BBCode, HTML,
- etc.
+ E2E encrypted, for direct sharing, can't be embedded.
@@ -24,34 +32,32 @@
>
- Hotlink
+
+ Hotlink
+
+ Learn more
+
+
- Still encrypted at rest, but the server decrypts on the fly. Works with BBCode, HTML,
- etc.
- Encryption here serves mainly as
-
- crypto-shred 1 , because hotlink images are intended to be public.
+ Still encrypted at rest, but support embedding, for forums, websites, etc.
-
-
-
-
+
+
Expiry
{{ option.label }}
@@ -59,11 +65,11 @@
-
+
Max views
{{ option.label }}
@@ -77,9 +83,7 @@
Set password
-
- Requires the link and this password to decrypt. Use when the link alone should not be enough.
-
+ Requires the link and this password to decrypt.
@@ -88,7 +92,7 @@
v-model="settings.password"
type="password"
autocomplete="new-password"
- class="rounded-md border border-input bg-background px-3 py-2 text-sm"
+ class="rounded-md border border-input bg-background px-3 py-2 text-base"
/>
@@ -98,6 +102,7 @@
diff --git a/frontend/src/views/UploadView.vue b/frontend/src/views/UploadView.vue
index d6b7910..d497c80 100644
--- a/frontend/src/views/UploadView.vue
+++ b/frontend/src/views/UploadView.vue
@@ -1,32 +1,16 @@
-
-
-
Upload
-
- Choose up to {{ maxQueueSize }} images, up to
- {{ maxImageSizeFormatted }}
- each.
-
-
-
+
-
-
-
-
- Configure & upload
-
-
+
{{ selectionError }}
@@ -41,22 +25,20 @@
v-if="showShareLinks"
:file-name="selectedFile?.name ?? null"
:upload="selectedUpload"
+ :thumbnail-url="selectedThumbnailUrl"
/>
-
-
-
diff --git a/frontend/src/views/ZkViewerView.vue b/frontend/src/views/ZkViewerView.vue
new file mode 100644
index 0000000..371f92e
--- /dev/null
+++ b/frontend/src/views/ZkViewerView.vue
@@ -0,0 +1,144 @@
+
+
+ Loading image...
+
+
+ This viewing link is incomplete. Use the viewer URL from your upload results.
+
+
+ This image was not found.
+
+
+
+
+
+
+
+