先截图审视现状,再针对性修改。主要问题与改动如下。 工具栏 - 标签筛选从「平铺全部标签」改为下拉面板,标签多时不再换行挤爆工具栏 - 备份与快捷键帮助移到导航栏 —— 它们是应用级操作,不该挤在看板工具栏里, 顺带修好了「? 帮助只在看板可用」的问题 - 到期统计(今日到期 / 逾期)合并为可点击的筛选入口,去掉两个独立控件 - 移动端工具栏从占半屏降到三行紧凑布局 卡片 - 优先级从彩色胶囊改为左侧色条,扫视一列时比读文字更快分辨轻重 - 元信息改为「优先级 · 日期 · 标签」的轻量文本行,不再三种胶囊叠在一起 - 完成态用勾选图标 + 降低不透明度 布局 - 今日视图限宽居中(max-w-3xl):此前 1440px 下卡片被拉满整屏, 标题与元信息之间出现大片空白 - 修复移动端卡片被压成细条:TaskCard 的 overflow-hidden(用于裁切左侧色条) 会让 flex 项的最小尺寸解析为 0,补 shrink-0 修正; 同时改为移动端按内容高度堆叠、桌面端列内滚动 其他 - 导航栏品牌改用看板图标,消除「看板」重复出现两次 - 统一卡片阴影、圆角与键盘焦点样式 - 新增 scripts/screenshot.mjs,便于后续对照审视视觉改动 验证:单元测试 452 个、端到端测试 23 个全部通过,lint 与构建无错误。
64 lines
1.9 KiB
Vue
64 lines
1.9 KiB
Vue
<script setup lang="ts">
|
|
import { onMounted } from 'vue'
|
|
import { RouterView } from 'vue-router'
|
|
|
|
import AppNav from '@/components/AppNav.vue'
|
|
import BackupPanel from '@/components/BackupPanel.vue'
|
|
import PwaUpdatePrompt from '@/components/PwaUpdatePrompt.vue'
|
|
import SideDrawer from '@/components/SideDrawer.vue'
|
|
import ToastHost from '@/components/ToastHost.vue'
|
|
import { useKeyboardShortcuts } from '@/composables/useKeyboardShortcuts'
|
|
import { useTaskStore } from '@/stores/tasks'
|
|
import { useUiStore } from '@/stores/ui'
|
|
|
|
const SHORTCUTS = [
|
|
{ keys: 'N', description: '聚焦「待办」列的快速新增输入框' },
|
|
{ keys: '/', description: '聚焦搜索框' },
|
|
{ keys: '?', description: '打开本帮助' },
|
|
{ keys: 'Esc', description: '关闭当前面板' },
|
|
] as const
|
|
|
|
const store = useTaskStore()
|
|
const ui = useUiStore()
|
|
|
|
onMounted(() => {
|
|
store.init()
|
|
})
|
|
|
|
// 帮助面板是应用级的,因此在任何视图下都能用 ?
|
|
useKeyboardShortcuts({
|
|
'?': () => {
|
|
if (!ui.anyPanelOpen) ui.openHelp()
|
|
},
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<div class="flex h-full min-h-0 flex-col bg-slate-100">
|
|
<AppNav />
|
|
|
|
<main class="flex min-h-0 flex-1 flex-col">
|
|
<RouterView />
|
|
</main>
|
|
</div>
|
|
|
|
<BackupPanel :open="ui.backupOpen" @close="ui.closeBackup()" />
|
|
|
|
<SideDrawer :open="ui.helpOpen" title="快捷键" @close="ui.closeHelp()">
|
|
<dl class="flex flex-col gap-3 text-sm">
|
|
<div v-for="item in SHORTCUTS" :key="item.keys" class="flex items-center gap-3">
|
|
<dt
|
|
class="w-14 shrink-0 rounded-md border border-slate-200 bg-slate-50 px-2 py-0.5 text-center font-mono text-xs text-slate-600"
|
|
>
|
|
{{ item.keys }}
|
|
</dt>
|
|
<dd class="text-slate-600">{{ item.description }}</dd>
|
|
</div>
|
|
</dl>
|
|
<p class="mt-4 text-xs text-slate-400">在输入框内输入时不会触发快捷键。</p>
|
|
</SideDrawer>
|
|
|
|
<ToastHost />
|
|
<PwaUpdatePrompt />
|
|
</template>
|