refactor(admin-web): tighten schedule cover picker layout

Replace the labeled cover button + meta column with a compact preview
tile and an overlaid remove button, dropping the now-unused cover-meta
typography rules.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-01 11:04:28 +08:00
parent b18a562b32
commit 2436f50c1f
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { PlusOutlined } from "@ant-design/icons-vue";
import { MinusCircleFilled, PlusOutlined } from "@ant-design/icons-vue";
import { useMutation, useQuery, useQueryClient } from "@tanstack/vue-query";
import { message } from "ant-design-vue";
import type { PromptRuleSimple, ScheduleTask } from "@geo/shared-types";
@@ -503,26 +503,28 @@ function padTime(value: string): string {
{{ scheduleCoverRequired ? t("custom.task.scheduleCoverRequiredHint") : t("custom.task.scheduleCoverHint") }}
</p>
<div v-if="effectiveScheduleCoverEnabled" class="generate-task-drawer__cover-row">
<button type="button" class="generate-task-drawer__cover" @click="coverPickerOpen = true">
<template v-if="form.coverAssetUrl">
<img :src="form.coverAssetUrl" alt="cover preview" />
</template>
<template v-else>
<span class="generate-task-drawer__cover-plus">+</span>
<strong>{{ t("custom.task.coverUpload") }}</strong>
<small>{{ t("custom.task.scheduleCoverUploadHint") }}</small>
</template>
</button>
<div v-if="effectiveScheduleCoverEnabled" class="generate-task-drawer__cover-body">
<div class="generate-task-drawer__cover-preview-wrap">
<button type="button" class="generate-task-drawer__cover-preview" @click="coverPickerOpen = true">
<template v-if="form.coverAssetUrl">
<img :src="form.coverAssetUrl" alt="cover preview" />
</template>
<template v-else>
<span class="generate-task-drawer__cover-plus">+</span>
<span>{{ t("custom.task.coverUpload") }}</span>
</template>
</button>
<div v-if="form.coverAssetUrl" class="generate-task-drawer__cover-meta">
<strong>{{ form.coverFileName || t("custom.task.cover") }}</strong>
<a-button size="small" @click="coverPickerOpen = true">
{{ t("article.editor.coverReplace") }}
</a-button>
<a-button size="small" danger @click="handleRemoveScheduleCover">
{{ t("article.editor.coverRemove") }}
</a-button>
<button
v-if="form.coverAssetUrl"
type="button"
class="generate-task-drawer__cover-remove"
:aria-label="t('article.editor.coverRemove')"
:title="t('article.editor.coverRemove')"
@click.stop="handleRemoveScheduleCover"
>
<MinusCircleFilled />
</button>
</div>
</div>
</div>
@@ -806,8 +808,7 @@ function padTime(value: string): string {
gap: 4px;
}
.generate-task-drawer__account-copy strong,
.generate-task-drawer__cover-meta strong {
.generate-task-drawer__account-copy strong {
overflow: hidden;
color: #1f2937;
font-size: 14px;
@@ -846,7 +847,7 @@ function padTime(value: string): string {
.generate-task-drawer__cover-head {
display: flex;
align-items: center;
justify-content: space-between;
justify-content: flex-start;
gap: 12px;
}
@@ -875,71 +876,72 @@ function padTime(value: string): string {
line-height: 1.7;
}
.generate-task-drawer__cover-row {
.generate-task-drawer__cover-body {
display: flex;
align-items: center;
gap: 16px;
flex-wrap: wrap;
margin-top: 12px;
}
.generate-task-drawer__cover {
.generate-task-drawer__cover-preview-wrap {
position: relative;
width: 176px;
flex: 0 0 176px;
}
.generate-task-drawer__cover-preview {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 8px;
width: 228px;
min-height: 172px;
width: 100%;
min-height: 124px;
padding: 0;
border: 1px dashed #cfd9e8;
border: 1px dashed #d1d5db;
border-radius: 8px;
background: #fbfcff;
color: #1f2937;
background: #f9fafb;
color: #6b7280;
font-size: 13px;
cursor: pointer;
overflow: hidden;
transition: all 0.2s ease;
}
.generate-task-drawer__cover:hover {
border-color: #9db7ff;
background: #f7faff;
.generate-task-drawer__cover-preview:hover {
border-color: #6366f1;
background: #f5f3ff;
color: #6366f1;
}
.generate-task-drawer__cover img {
.generate-task-drawer__cover-preview img {
display: block;
width: 100%;
height: 172px;
height: 124px;
object-fit: cover;
}
.generate-task-drawer__cover strong {
font-size: 16px;
font-weight: 700;
}
.generate-task-drawer__cover small {
color: #667085;
font-size: 13px;
}
.generate-task-drawer__cover-plus {
display: inline-flex;
align-items: center;
justify-content: center;
width: 40px;
height: 40px;
border-radius: 999px;
background: #eef4ff;
color: #355dff;
font-size: 28px;
font-size: 20px;
line-height: 1;
}
.generate-task-drawer__cover-meta {
display: flex;
min-width: 220px;
max-width: 360px;
flex-direction: column;
align-items: flex-start;
gap: 8px;
.generate-task-drawer__cover-remove {
position: absolute;
top: 8px;
right: 8px;
display: inline-flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
border: none;
border-radius: 999px;
background: rgba(17, 24, 39, 0.7);
color: #fff;
cursor: pointer;
transition: background 0.2s ease;
}
.generate-task-drawer__cover-remove:hover {
background: rgba(17, 24, 39, 0.9);
}
.generate-task-drawer__time-wrapper {