From 058f353965dff534f03966c98dac611d6ca2b24e Mon Sep 17 00:00:00 2001 From: bboysoul Date: Wed, 23 Sep 2026 05:41:16 +0800 Subject: [PATCH] feat: unify design tokens, five font weights, radius scale, restrained motion, AA contrast --- .../inbox-mobile-390.png | Bin 32845 -> 33488 bytes frontend/src/App.vue | 23 +- frontend/src/TodaySections.test.ts | 6 +- frontend/src/calendar.css | 18 +- frontend/src/components/AppSheet.vue | 2 + .../CalendarPicker.integration.test.ts | 4 +- frontend/src/components/CalendarPicker.vue | 13 +- .../components/TodayEnvironmentStrip.test.ts | 12 +- frontend/src/memo.css | 2 +- frontend/src/style.css | 241 +++++++++--------- frontend/src/style.test.ts | 78 +++--- frontend/src/today-sections.css | 18 +- frontend/src/visual-polish.test.ts | 24 +- frontend/vite.config.ts | 2 +- frontend/vitest.setup.ts | 11 + 15 files changed, 264 insertions(+), 190 deletions(-) create mode 100644 frontend/vitest.setup.ts diff --git a/frontend/e2e/visual-regression.spec.ts-snapshots/inbox-mobile-390.png b/frontend/e2e/visual-regression.spec.ts-snapshots/inbox-mobile-390.png index 5fc7310d51461e3e01328174efed23132f56fbe3..8c6a4decadabebb20aea917f70fcfc40f7543f48 100644 GIT binary patch literal 33488 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 literal 32845 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 diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 0b7dbe2..c82d829 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -111,6 +111,7 @@ const markdownPreview = ref(false) const taskNoteEditor = ref(null) const SHOW_COMPLETED_STORAGE_KEY = 'dodo.show-completed' const showCompleted = ref(readStoredBoolean(window.localStorage, SHOW_COMPLETED_STORAGE_KEY, true)) +const completedFilterReveal = ref(false) const TODAY_SECTION_COLLAPSE_KEY = 'dodo.today-section-collapse.v1' const todaySectionCollapse = ref(readTodaySectionCollapse(window.localStorage, TODAY_SECTION_COLLAPSE_KEY)) const page = ref(1) @@ -449,6 +450,10 @@ watch(taskReorderAvailable, () => { }) watch(showCompleted, (value) => { writeStoredBoolean(window.localStorage, SHOW_COMPLETED_STORAGE_KEY, value) + if (value) { + completedFilterReveal.value = true + window.setTimeout(() => { completedFilterReveal.value = false }, 500) + } if (isTaskView(activeView.value)) { page.value = 1; loadAll() } }) @@ -1819,15 +1824,15 @@ onUnmounted(() => {

回收站

删除的任务保留在这里,可整组恢复或永久删除。

@@ -1846,9 +1851,10 @@ onUnmounted(() => {
-
+
+
已隐藏已完成任务
{{ activeView==='trash' ? '回收站是空的' : hiddenCompletedTaskCount > 0 ? '已完成任务已隐藏' : '这里还很安静' }}{{activeView==='trash' ? '删除的任务会显示在这里' : hiddenCompletedTaskCount > 0 ? '开启“显示已完成”即可查看。':'写下第一件想完成的小事吧'}}
+
- -
+ +
diff --git a/frontend/src/TodaySections.test.ts b/frontend/src/TodaySections.test.ts index 65a0c97..03b09a0 100644 --- a/frontend/src/TodaySections.test.ts +++ b/frontend/src/TodaySections.test.ts @@ -36,14 +36,14 @@ describe('Today independent collapsible sections', () => { expect(app.match(/class="today-section-toggle(?: today-section-anchor)?"/g)).toHaveLength(3) expect(app).toContain('{{totalTasks}}') expect(app).not.toContain('{{taskTree.length}} 项') - expect(app).toContain("{{ todaySectionCollapse.overdue ? '›' : '⌄' }}") + expect(app).toContain('') expect(app).not.toContain(' { - expect(app).toContain('
') - expect(app).toContain('
') + expect(app).toContain('
', app.indexOf('i,.calendar-event-detail dd i,.calendar-source-copy i{width:9px;height:9px;display:inline-block;flex:0 0 auto;border-radius:50%}.calendar-agenda{display:grid;gap:20px}.calendar-agenda section{display:grid}.calendar-agenda h2{min-height:40px;margin:0;display:flex;align-items:center;border-bottom:1px solid #e8e0d5;font-size:13px}.calendar-event-row{min-height:62px;display:grid;grid-template-columns:10px 54px minmax(0,1fr) 24px;align-items:center;gap:10px;padding:0 4px;border:0;border-bottom:1px solid #e8e0d5;background:transparent;text-align:left}.calendar-event-row:hover{background:#fff8ee}.calendar-event-row time{color:var(--muted);font-size:12px}.calendar-event-row span{min-width:0;display:grid;gap:4px}.calendar-event-row b,.calendar-event-row small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.calendar-event-row b{font-size:14px;font-weight:620}.calendar-event-row small{color:var(--muted);font-size:11px}.calendar-event-row>svg{color:#aa9f92}.calendar-empty{min-height:260px;display:grid;place-items:center;align-content:center;gap:9px;color:var(--muted);text-align:center}.calendar-empty svg{width:32px;height:32px}.calendar-empty b{color:var(--text-primary)}.calendar-event-detail,.calendar-sources-sheet{width:min(520px,100%);max-height:min(88dvh,760px)}.calendar-event-detail .app-sheet__header{padding:24px 24px 18px;align-items:flex-start;border-bottom:0}.calendar-event-detail .app-sheet__header h3{max-width:calc(100% - 48px);font-size:22px;font-weight:720;line-height:1.38;letter-spacing:-.02em}.calendar-event-detail .app-sheet__body{padding:0 24px 32px}.calendar-event-detail__meta{display:flex;flex-wrap:wrap;gap:8px 14px;padding:0 0 20px;border-bottom:1px solid #e8e0d5;color:var(--muted);font-size:12px;line-height:1.45}.calendar-event-detail__meta span{display:inline-flex;align-items:center;gap:7px;min-width:0}.calendar-event-detail__meta i{width:8px;height:8px;display:inline-block;flex:0 0 auto;border-radius:50%}.calendar-event-detail__content{padding-top:22px}.calendar-event-detail__content p{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text);font-size:14px;line-height:1.9}.calendar-event-detail__empty{margin:0;padding-top:22px;color:var(--muted);font-size:13px}.calendar-source-add{justify-self:start}.calendar-source-list{display:grid}.calendar-source-list article{min-height:72px;display:grid;grid-template-columns:minmax(0,1fr) auto 44px 44px 44px;align-items:center;gap:4px;border-bottom:1px solid #e8e0d5}.calendar-source-copy{min-width:0;display:grid;gap:3px}.calendar-source-copy b{display:flex;align-items:center;gap:7px;font-size:13px}.calendar-source-copy small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:10px}.calendar-source-copy .calendar-source-error{color:var(--danger);white-space:normal}.calendar-source-list article>button{width:44px;height:44px;display:grid;place-items:center;border:0;background:transparent;border-radius:9px}.calendar-source-toggle{min-height:44px;display:flex;align-items:center;gap:5px;font-size:11px}.calendar-subscription-form{width:min(460px,100%)}.calendar-subscription-form .app-sheet__body label{display:grid;gap:6px;color:#756d61;font-size:12px;font-weight:650}.calendar-subscription-form input{min-height:44px;width:100%;padding:8px 11px;border:1px solid var(--border-cream)}.calendar-subscription-form input[type=color]{padding:5px;width:72px}.calendar-subscription-form .calendar-form-toggle{display:flex;align-items:center;min-height:44px}.calendar-subscription-form .calendar-form-toggle input{width:18px;min-height:18px}.calendar-view.loading{opacity:.72}@media(max-width:930px){.calendar-view{width:min(100%,630px)}.calendar-event-detail,.calendar-sources-sheet,.calendar-subscription-form{width:100%;max-width:100%;border-radius:20px 20px 0 0!important}}@media(max-width:720px){.calendar-view{width:100%;gap:13px}.calendar-heading .calendar-manage{font-size:0;padding:0;width:44px}.calendar-heading .calendar-manage svg{width:19px;height:19px}.calendar-toolbar{grid-template-columns:44px 54px minmax(0,1fr) 44px}.calendar-toolbar .calendar-today{width:54px}.calendar-week-strip{gap:3px;padding:7px}.calendar-week-day{min-height:64px}.calendar-week-day i{right:4px;top:4px;min-width:16px;height:16px}.calendar-source-list article{grid-template-columns:minmax(0,1fr) 44px 44px 44px}.calendar-source-toggle{grid-column:1/-1;grid-row:2}.calendar-event-row{grid-template-columns:9px 48px minmax(0,1fr) 20px}.calendar-filters{width:100%;margin-inline:-4px;padding-inline:4px}}@media(max-width:390px){.calendar-week-strip{display:flex;overflow-x:auto;scroll-snap-type:x proximity}.calendar-week-day{flex:0 0 44px;scroll-snap-align:start}.calendar-event-row{gap:7px}.calendar-source-list article{gap:1px}}@media(min-width:931px){.calendar-view{padding-top:4px}.calendar-event-detail{grid-column:3;grid-row:1;width:var(--detail-width,350px);height:100vh;max-height:none;padding:0;border-radius:0;border-top:0;border-right:0;border-bottom:0;box-shadow:inset 1px 0 0 #fff;overflow:hidden;display:flex;flex-direction:column}.calendar-event-detail .app-sheet__body{flex:1 1 auto;overflow-y:auto}.calendar-sources-sheet{border-radius:var(--radius-panel)}}@media(min-width:1440px){.calendar-view{width:min(100%,1040px)}} +.calendar-view{min-width:0;width:min(100%,900px);margin:0 auto;padding-bottom:42px;display:grid;gap:16px}.calendar-heading{display:flex;align-items:center;justify-content:space-between;gap:16px}.calendar-heading p{margin:0;color:var(--text-secondary);font-size:13px}.calendar-manage{min-height:44px}.calendar-toolbar{min-height:48px;display:grid;grid-template-columns:44px 64px minmax(0,1fr) 44px;align-items:center;border-block:1px solid var(--border-hairline)}.calendar-toolbar button{width:44px;height:44px;display:grid;place-items:center;border:0;background:transparent;border-radius:var(--radius-control)}.calendar-toolbar .calendar-today{width:64px}.calendar-toolbar strong{text-align:center;font-size:16px}.calendar-week-strip{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:8px;padding:10px;border:1px solid var(--border-cream);border-radius:var(--radius-list);background:var(--surface-raised);box-shadow:inset 0 1px rgba(255,255,255,.9)}.calendar-week-day{position:relative;min-width:0;min-height:76px;display:grid;place-items:center;align-content:center;gap:4px;border:0;border-radius:var(--radius-control);background:transparent}.calendar-week-day small{color:var(--text-secondary);font-size:11px}.calendar-week-day b{font-size:18px}.calendar-week-day i{position:absolute;right:7px;top:7px;min-width:18px;height:18px;display:grid;place-items:center;border-radius:999px;background:var(--calendar-week-day-bg);color:var(--calendar-week-day-ink);font-size:11px;font-style:normal}.calendar-week-day.is-selected{background:var(--accent);color:var(--white);box-shadow:0 8px 18px rgba(241,90,41,.22)}.calendar-week-day.is-selected small{color:var(--white)}.calendar-week-day.is-selected i{background:var(--calendar-week-day-bg-2);color:var(--accent)}.calendar-week-day.is-today:not(.is-selected){box-shadow:inset 0 0 0 1px var(--calendar-week-day-shadow)}.calendar-filters{min-width:0;max-width:100%;display:flex;gap:8px;overflow-x:auto;overflow-y:hidden;contain:layout paint;padding-bottom:2px;overscroll-behavior-inline:contain}.calendar-filters label{min-height:44px;display:flex;align-items:center;gap:7px;padding:0 12px;border:1px solid var(--border-cream);border-radius:999px;background:var(--surface-raised);font-size:12px;white-space:nowrap}.calendar-filters input{position:absolute;opacity:0;pointer-events:none}.calendar-filters label:has(input:not(:checked)){opacity:.48}.calendar-filters i,.calendar-event-row>i,.calendar-event-detail dd i,.calendar-source-copy i{width:9px;height:9px;display:inline-block;flex:0 0 auto;border-radius:50%}.calendar-agenda{display:grid;gap:20px}.calendar-agenda section{display:grid}.calendar-agenda h2{min-height:40px;margin:0;display:flex;align-items:center;border-bottom:1px solid var(--border-hairline);font-size:13px}.calendar-event-row{min-height:62px;display:grid;grid-template-columns:10px 54px minmax(0,1fr) 24px;align-items:center;gap:10px;padding:0 4px;border:0;border-bottom:1px solid var(--border-hairline);background:transparent;text-align:left}.calendar-event-row:hover{background:var(--event-hover)}.calendar-event-row time{color:var(--text-secondary);font-size:12px}.calendar-event-row span{min-width:0;display:grid;gap:4px}.calendar-event-row b,.calendar-event-row small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.calendar-event-row b{font-size:14px;font-weight:600}.calendar-event-row small{color:var(--text-secondary);font-size:11px}.calendar-event-row>svg{color:var(--calendar-event-row-ink)}.calendar-empty{min-height:260px;display:grid;place-items:center;align-content:center;gap:9px;color:var(--text-secondary);text-align:center}.calendar-empty svg{width:32px;height:32px}.calendar-empty b{color:var(--text-primary)}.calendar-event-detail,.calendar-sources-sheet{width:min(520px,100%);max-height:min(88dvh,760px)}.calendar-event-detail .app-sheet__header{padding:24px 24px 18px;align-items:flex-start;border-bottom:0}.calendar-event-detail .app-sheet__header h3{max-width:calc(100% - 48px);font-size:22px;font-weight:700;line-height:1.38;letter-spacing:-.02em}.calendar-event-detail .app-sheet__body{padding:0 24px 32px}.calendar-event-detail__meta{display:flex;flex-wrap:wrap;gap:8px 14px;padding:0 0 20px;border-bottom:1px solid var(--border-hairline);color:var(--text-secondary);font-size:12px;line-height:1.45}.calendar-event-detail__meta span{display:inline-flex;align-items:center;gap:7px;min-width:0}.calendar-event-detail__meta i{width:8px;height:8px;display:inline-block;flex:0 0 auto;border-radius:50%}.calendar-event-detail__content{padding-top:22px}.calendar-event-detail__content p{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text-primary);font-size:14px;line-height:1.9}.calendar-event-detail__empty{margin:0;padding-top:22px;color:var(--text-secondary);font-size:13px}.calendar-source-add{justify-self:start}.calendar-source-list{display:grid}.calendar-source-list article{min-height:72px;display:grid;grid-template-columns:minmax(0,1fr) auto 44px 44px 44px;align-items:center;gap:4px;border-bottom:1px solid var(--border-hairline)}.calendar-source-copy{min-width:0;display:grid;gap:3px}.calendar-source-copy b{display:flex;align-items:center;gap:7px;font-size:13px}.calendar-source-copy small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-secondary);font-size:11px}.calendar-source-copy .calendar-source-error{color:var(--danger);white-space:normal}.calendar-source-list article>button{width:44px;height:44px;display:grid;place-items:center;border:0;background:transparent;border-radius:var(--radius-control)}.calendar-source-toggle{min-height:44px;display:flex;align-items:center;gap:5px;font-size:11px}.calendar-subscription-form{width:min(460px,100%)}.calendar-subscription-form .app-sheet__body label{display:grid;gap:6px;color:var(--text-secondary);font-size:12px;font-weight:600}.calendar-subscription-form input{min-height:44px;width:100%;padding:8px 11px;border:1px solid var(--border-cream)}.calendar-subscription-form input[type=color]{padding:5px;width:72px}.calendar-subscription-form .calendar-form-toggle{display:flex;align-items:center;min-height:44px}.calendar-subscription-form .calendar-form-toggle input{width:18px;min-height:18px}.calendar-view.loading{opacity:.72}@media(max-width:930px){.calendar-view{width:min(100%,630px)}.calendar-event-detail,.calendar-sources-sheet,.calendar-subscription-form{width:100%;max-width:100%;border-radius:var(--radius-panel) var(--radius-panel) 0 0!important}}@media(max-width:720px){.calendar-view{width:100%;gap:13px}.calendar-heading .calendar-manage{font-size:0;padding:0;width:44px}.calendar-heading .calendar-manage svg{width:19px;height:19px}.calendar-toolbar{grid-template-columns:44px 54px minmax(0,1fr) 44px}.calendar-toolbar .calendar-today{width:54px}.calendar-week-strip{gap:3px;padding:7px}.calendar-week-day{min-height:64px}.calendar-week-day i{right:4px;top:4px;min-width:16px;height:16px}.calendar-source-list article{grid-template-columns:minmax(0,1fr) 44px 44px 44px}.calendar-source-toggle{grid-column:1/-1;grid-row:2}.calendar-event-row{grid-template-columns:9px 48px minmax(0,1fr) 20px}.calendar-filters{width:100%;margin-inline:-4px;padding-inline:4px}}@media(max-width:390px){.calendar-week-strip{display:flex;overflow-x:auto;scroll-snap-type:x proximity}.calendar-week-day{flex:0 0 44px;scroll-snap-align:start}.calendar-event-row{gap:7px}.calendar-source-list article{gap:1px}}@media(min-width:931px){.calendar-view{padding-top:4px}.calendar-event-detail{grid-column:3;grid-row:1;width:var(--detail-width,350px);height:100vh;max-height:none;padding:0;border-radius:0;border-top:0;border-right:0;border-bottom:0;box-shadow:inset 1px 0 0 var(--white);overflow:hidden;display:flex;flex-direction:column}.calendar-event-detail .app-sheet__body{flex:1 1 auto;overflow-y:auto}.calendar-sources-sheet{border-radius:var(--radius-panel)}}@media(min-width:1440px){.calendar-view{width:min(100%,1040px)}} + + +/* Restrained motion: picker open (scale 140ms desktop / rise 180ms mobile) and month shift crossfade. */ +.calendar-picker-enter-active,.calendar-picker-leave-active{transition:opacity 140ms cubic-bezier(.2,.8,.3,1)} +.calendar-picker-enter-from,.calendar-picker-leave-to{opacity:0} +.calendar-picker-enter-active .calendar-picker{transition:transform 140ms cubic-bezier(.2,.8,.3,1),opacity 140ms cubic-bezier(.2,.8,.3,1)} +.calendar-picker-enter-from .calendar-picker{transform:scale(.98);opacity:0} +.calendar-picker-leave-active .calendar-picker{transition:opacity 160ms cubic-bezier(.2,.8,.3,1)} +@media(max-width:600px){ +.calendar-picker-enter-active .calendar-picker{transition:transform 180ms ease-out,opacity 180ms ease-out} +.calendar-picker-enter-from .calendar-picker{transform:translateY(16px);opacity:0} +} +.calendar-picker__grid.shift-next{animation:calendar-month-next 140ms ease-out} +.calendar-picker__grid.shift-prev{animation:calendar-month-prev 140ms ease-out} +@keyframes calendar-month-next{from{opacity:0;transform:translateX(8px)}to{opacity:1;transform:none}} +@keyframes calendar-month-prev{from{opacity:0;transform:translateX(-8px)}to{opacity:1;transform:none}} diff --git a/frontend/src/components/AppSheet.vue b/frontend/src/components/AppSheet.vue index 9bc7d95..9eeb157 100644 --- a/frontend/src/components/AppSheet.vue +++ b/frontend/src/components/AppSheet.vue @@ -74,11 +74,13 @@ onBeforeUnmount(deactivate)