feat: integrate dodo brand logo
ci / gitleaks (push) Successful in 7s
ci / docker (push) Successful in 3m28s

This commit is contained in:
2026-09-11 15:09:20 +08:00
parent 8efe982e1e
commit ec6ba56532
20 changed files with 54 additions and 12 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+5
View File
@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" role="img" aria-labelledby="title desc">
<title id="title">Dodo logo</title>
<desc id="desc">A warm orange continuous dodo bird mark with a check-shaped wing.</desc>
<path fill="#F15A29" fill-rule="evenodd" d="M128 22c-50.81 0-92 41.19-92 92 0 29.2 13.61 55.22 34.84 72.07L57.2 214.4a10 10 0 0 0 15.67 11.84l27.42-22.64A92.4 92.4 0 0 0 128 208c50.81 0 92-41.19 92-92 0-15.09-3.63-29.33-10.07-41.89l19.73-11.39a8 8 0 0 0-.83-14.28l-35.1-15.2A91.57 91.57 0 0 0 128 22Zm23.67 49.5a10.5 10.5 0 1 1 21 0 10.5 10.5 0 0 1-21 0Zm-65.9 51.05a11 11 0 0 1 15.56 0l17.08 17.08 39.26-39.25a11 11 0 1 1 15.56 15.55l-47.04 47.04a11 11 0 0 1-15.56 0l-24.9-24.86a11 11 0 0 1 0-15.56Z"/>
</svg>

After

Width:  |  Height:  |  Size: 745 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

+2 -2
View File
@@ -1,3 +1,3 @@
<!doctype html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"><meta name="theme-color" content="#f15a29"><link rel="manifest" href="/manifest.json"><title>dodo</title> <script type="module" crossorigin src="/assets/index-DV6C4yNR.js"></script> <!doctype html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"><meta name="theme-color" content="#f15a29"><link rel="icon" type="image/svg+xml" href="/dodo-logo.svg"><link rel="apple-touch-icon" href="/apple-touch-icon.png"><link rel="manifest" href="/manifest.json"><title>dodo</title> <script type="module" crossorigin src="/assets/index-eDj38Y8E.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-CaNgnksF.css"> <link rel="stylesheet" crossorigin href="/assets/index-HDotoAuF.css">
</head><body><div id="app"></div></body></html> </head><body><div id="app"></div></body></html>
File diff suppressed because one or more lines are too long
+5
View File
@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" role="img" aria-labelledby="title desc">
<title id="title">Dodo logo</title>
<desc id="desc">A warm orange continuous dodo bird mark with a check-shaped wing.</desc>
<path fill="#F15A29" fill-rule="evenodd" d="M128 22c-50.81 0-92 41.19-92 92 0 29.2 13.61 55.22 34.84 72.07L57.2 214.4a10 10 0 0 0 15.67 11.84l27.42-22.64A92.4 92.4 0 0 0 128 208c50.81 0 92-41.19 92-92 0-15.09-3.63-29.33-10.07-41.89l19.73-11.39a8 8 0 0 0-.83-14.28l-35.1-15.2A91.57 91.57 0 0 0 128 22Zm23.67 49.5a10.5 10.5 0 1 1 21 0 10.5 10.5 0 0 1-21 0Zm-65.9 51.05a11 11 0 0 1 15.56 0l17.08 17.08 39.26-39.25a11 11 0 1 1 15.56 15.55l-47.04 47.04a11 11 0 0 1-15.56 0l-24.9-24.86a11 11 0 0 1 0-15.56Z"/>
</svg>

After

Width:  |  Height:  |  Size: 745 B

+4
View File
@@ -0,0 +1,4 @@
#!/bin/sh
set -eu
LC_ALL=C
openssl rand -base64 192 | tr -dc 'A-Za-z0-9' | cut -c1-192
+1 -1
View File
@@ -1 +1 @@
<!doctype html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"><meta name="theme-color" content="#f15a29"><link rel="manifest" href="/manifest.json"><title>dodo</title></head><body><div id="app"></div><script type="module" src="/src/main.ts"></script></body></html> <!doctype html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"><meta name="theme-color" content="#f15a29"><link rel="icon" type="image/svg+xml" href="/dodo-logo.svg"><link rel="apple-touch-icon" href="/apple-touch-icon.png"><link rel="manifest" href="/manifest.json"><title>dodo</title></head><body><div id="app"></div><script type="module" src="/src/main.ts"></script></body></html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

+5
View File
@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" role="img" aria-labelledby="title desc">
<title id="title">Dodo logo</title>
<desc id="desc">A warm orange continuous dodo bird mark with a check-shaped wing.</desc>
<path fill="#F15A29" fill-rule="evenodd" d="M128 22c-50.81 0-92 41.19-92 92 0 29.2 13.61 55.22 34.84 72.07L57.2 214.4a10 10 0 0 0 15.67 11.84l27.42-22.64A92.4 92.4 0 0 0 128 208c50.81 0 92-41.19 92-92 0-15.09-3.63-29.33-10.07-41.89l19.73-11.39a8 8 0 0 0-.83-14.28l-35.1-15.2A91.57 91.57 0 0 0 128 22Zm23.67 49.5a10.5 10.5 0 1 1 21 0 10.5 10.5 0 0 1-21 0Zm-65.9 51.05a11 11 0 0 1 15.56 0l17.08 17.08 39.26-39.25a11 11 0 1 1 15.56 15.55l-47.04 47.04a11 11 0 0 1-15.56 0l-24.9-24.86a11 11 0 0 1 0-15.56Z"/>
</svg>

After

Width:  |  Height:  |  Size: 745 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

+2 -2
View File
@@ -1303,7 +1303,7 @@ onUnmounted(() => {
<div v-if="!authReady" class="center"><span class="loader" />正在打开 dodo</div> <div v-if="!authReady" class="center"><span class="loader" />正在打开 dodo</div>
<div v-else-if="!authenticated" class="auth-shell"> <div v-else-if="!authenticated" class="auth-shell">
<section class="auth-card"> <section class="auth-card">
<div class="brand">do<span>do</span></div><p>{{ initialized ? '欢迎回来,继续把生活理顺。' : '创建你的 dodo' }}</p> <div class="brand brand-lockup"><img class="brand-logo" src="/dodo-logo.svg" alt=""><span class="brand-wordmark">dodo</span></div><p>{{ initialized ? '欢迎回来,继续把生活理顺。' : '创建你的 dodo' }}</p>
<label>用户名<input v-model="username" autocomplete="username" placeholder="你的用户名"></label> <label>用户名<input v-model="username" autocomplete="username" placeholder="你的用户名"></label>
<label>密码<input v-model="password" type="password" autocomplete="current-password" placeholder="至少 12 位" @keyup.enter="submitAuth"></label> <label>密码<input v-model="password" type="password" autocomplete="current-password" placeholder="至少 12 位" @keyup.enter="submitAuth"></label>
<button class="primary" @click="submitAuth">{{ initialized ? '登录' : '开始使用' }}</button> <button class="primary" @click="submitAuth">{{ initialized ? '登录' : '开始使用' }}</button>
@@ -1313,7 +1313,7 @@ onUnmounted(() => {
<div v-else class="shell" :class="{ 'sidebar-collapsed': sidebarCollapsed, 'detail-open': Boolean(selectedTask), 'mobile-sidebar-open': mobileSidebar }"> <div v-else class="shell" :class="{ 'sidebar-collapsed': sidebarCollapsed, 'detail-open': Boolean(selectedTask), 'mobile-sidebar-open': mobileSidebar }">
<div v-if="mobileSidebar || mobileDetail" class="scrim" @click="mobileSidebar=false;mobileDetail=false" /> <div v-if="mobileSidebar || mobileDetail" class="scrim" @click="mobileSidebar=false;mobileDetail=false" />
<aside class="sidebar" :class="{ open: mobileSidebar }" @keydown.esc="sidebarCreateOpen=false;closeArchivedListAction();closeSidebarAction()"> <aside class="sidebar" :class="{ open: mobileSidebar }" @keydown.esc="sidebarCreateOpen=false;closeArchivedListAction();closeSidebarAction()">
<div class="brand-row"><div class="brand small">do<span>do</span></div><button class="icon mobile-only" aria-label="关闭菜单" @click="mobileSidebar=false"><X /></button></div> <div class="brand-row"><div class="brand small brand-lockup"><img class="brand-logo" src="/dodo-logo.svg" alt=""><span class="brand-wordmark">dodo</span></div><button class="icon mobile-only" aria-label="关闭菜单" @click="mobileSidebar=false"><X /></button></div>
<nav class="primary-nav"> <nav class="primary-nav">
<button :class="{ active: activeView==='today' }" @click="switchView('today')"><ListTodo />今天</button> <button :class="{ active: activeView==='today' }" @click="switchView('today')"><ListTodo />今天</button>
<button :class="{ active: activeView==='tasks' && lists.find(l=>l.id===activeList)?.is_inbox }" @click="switchView('tasks', lists.find(l=>l.is_inbox)?.id)"><Inbox />收集箱</button> <button :class="{ active: activeView==='tasks' && lists.find(l=>l.id===activeList)?.is_inbox }" @click="switchView('tasks', lists.find(l=>l.is_inbox)?.id)"><Inbox />收集箱</button>
File diff suppressed because one or more lines are too long
+6
View File
@@ -1100,6 +1100,12 @@ describe('sidebar information hierarchy', () => {
expect(app).toContain('class="mini-icon list-create-trigger" aria-label="新建清单或文件夹"') expect(app).toContain('class="mini-icon list-create-trigger" aria-label="新建清单或文件夹"')
expect(app).not.toContain('aria-label="新建文件夹" @click="createFolder"') expect(app).not.toContain('aria-label="新建文件夹" @click="createFolder"')
expect(css).toContain('.brand-row{height:64px;') expect(css).toContain('.brand-row{height:64px;')
expect(app).toContain('class="brand brand-lockup"')
expect(app).toContain('class="brand small brand-lockup"')
expect(app.match(/src="\/dodo-logo\.svg"/g)).toHaveLength(2)
expect(css).toContain('.brand-logo{width:42px;height:42px;')
expect(css).toContain('.brand.small .brand-logo{width:32px;height:32px}')
expect(css).not.toContain('.brand span{color:var(--accent)}')
expect(css).toContain('.primary-nav button.active::before,.list-row.active::before,.sidebar-management button.active::before{') expect(css).toContain('.primary-nav button.active::before,.list-row.active::before,.sidebar-management button.active::before{')
expect(css).toContain('width:3px;') expect(css).toContain('width:3px;')
}) })