diff --git a/.env.example b/.env.example index a3a47bc..5f00fc5 100644 --- a/.env.example +++ b/.env.example @@ -31,7 +31,9 @@ # WEBP_QUALITY=80 # 上传限制(也可在设置 → 访问控制配置;环境变量优先级更高) -# UPLOAD_MAX_FILE_SIZE_MB=10 +# UPLOAD_IMAGE_MAX_FILE_SIZE_MB=10 +# UPLOAD_VIDEO_MAX_FILE_SIZE_MB=500 +# UPLOAD_FILE_MAX_FILE_SIZE_MB=100 # ALLOWED_MIME_TYPES=image/jpeg,image/png,image/webp,image/gif,image/svg+xml,image/x-icon # UPLOAD_RATE_IP_MAX=60 # UPLOAD_RATE_TOKEN_MAX=120 diff --git a/app/assets/css/main.css b/app/assets/css/main.css index eea00f0..519e45a 100644 --- a/app/assets/css/main.css +++ b/app/assets/css/main.css @@ -7,22 +7,44 @@ .upload-card-flip-inner { position: relative; - transition: transform 0.55s cubic-bezier(0.4, 0, 0.2, 1); + transition: + transform 0.55s cubic-bezier(0.4, 0, 0.2, 1), + min-height 0.35s ease; transform-style: preserve-3d; } .upload-card-flip.is-flipped .upload-card-flip-inner { + min-height: min(40rem, calc(100vh - 11rem)); transform: rotateY(180deg); } +.upload-card-flip--file.is-flipped .upload-card-flip-inner { + min-height: min(27rem, calc(100vh - 11rem)); +} + +.upload-card-flip.is-flipped .upload-card-face--front { + visibility: hidden; + pointer-events: none; +} + +.upload-card-flip.is-flipped .upload-settings-btn { + display: none; +} + .upload-card-face { backface-visibility: hidden; -webkit-backface-visibility: hidden; } +.upload-card-face--front { + position: relative; + z-index: 1; +} + .upload-card-face--back { position: absolute; inset: 0; + z-index: 2; transform: rotateY(180deg); } @@ -33,6 +55,7 @@ .upload-card-flip.is-flipped .upload-card-flip-inner { transform: none; + min-height: 0; } .upload-card-flip .upload-card-face--back { diff --git a/app/components/FileCard.vue b/app/components/FileCard.vue index 8546c78..992adcb 100644 --- a/app/components/FileCard.vue +++ b/app/components/FileCard.vue @@ -74,16 +74,7 @@ function fileIcon(item: FileItem): string {

{{ uploadedLabel }} · {{ formatSize(item.size) }}

-
- -
+
diff --git a/app/components/FileLibraryPanel.vue b/app/components/FileLibraryPanel.vue index eabc5f5..ecc7fdf 100644 --- a/app/components/FileLibraryPanel.vue +++ b/app/components/FileLibraryPanel.vue @@ -633,20 +633,11 @@ defineExpose({ refresh }) {{ uploadedLabel(item) }} -
- -
- {{ t('tags.unlabeled') }} +
diff --git a/app/components/MediaUploadPanel.vue b/app/components/MediaUploadPanel.vue index 1359bc2..d4195df 100644 --- a/app/components/MediaUploadPanel.vue +++ b/app/components/MediaUploadPanel.vue @@ -32,24 +32,28 @@ onMounted(() => { const text = computed(() => { const allowedVideos = uploadPolicy.value?.allowedVideoExtensions ?? [] const forbiddenFiles = uploadPolicy.value?.forbiddenFileExtensions ?? [] + const videoMaxFileSizeMb = uploadPolicy.value?.videoMaxFileSizeMb ?? 500 + const fileMaxFileSizeMb = uploadPolicy.value?.fileMaxFileSizeMb ?? 100 return props.kind === 'video' ? { uploadTitle: t('library.video.uploadTitle'), uploadHint: t('library.video.uploadHint'), uploadFormats: allowedVideos.length ? t('library.video.uploadFormatsAllowed', { - formats: allowedVideos.map(item => item.toUpperCase()).join(' / ') + formats: allowedVideos.map(item => item.toUpperCase()).join(' / '), + size: videoMaxFileSizeMb }) - : t('library.video.uploadFormats') + : t('library.video.uploadFormats', { size: videoMaxFileSizeMb }) } : { uploadTitle: t('library.file.uploadTitle'), uploadHint: t('library.file.uploadHint'), uploadFormats: forbiddenFiles.length ? t('library.file.uploadFormatsBlocked', { - formats: forbiddenFiles.map(item => item.toUpperCase()).join(' / ') + formats: forbiddenFiles.map(item => item.toUpperCase()).join(' / '), + size: fileMaxFileSizeMb }) - : t('library.file.uploadFormatsUnrestricted') + : t('library.file.uploadFormatsUnrestricted', { size: fileMaxFileSizeMb }) } }) diff --git a/app/components/TagAssignPanel.vue b/app/components/TagAssignPanel.vue index c997972..acc6c91 100644 --- a/app/components/TagAssignPanel.vue +++ b/app/components/TagAssignPanel.vue @@ -17,7 +17,7 @@ const emit = defineEmits<{ 'created': [tag: ImageTag] }>() -const COMMON_LIMIT = 12 +const COMMON_LIMIT = 10 const { t } = useI18n() const toast = useToast() const { createTag } = useTags() diff --git a/app/components/TagBadgeList.vue b/app/components/TagBadgeList.vue new file mode 100644 index 0000000..1a2ff67 --- /dev/null +++ b/app/components/TagBadgeList.vue @@ -0,0 +1,70 @@ + + + diff --git a/app/components/UploadFlipCard.vue b/app/components/UploadFlipCard.vue index 9bb0074..3799fd3 100644 --- a/app/components/UploadFlipCard.vue +++ b/app/components/UploadFlipCard.vue @@ -43,7 +43,7 @@ function onBack() {