feat: integrate dodo brand logo
|
After Width: | Height: | Size: 7.7 KiB |
@@ -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 |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 25 KiB |
@@ -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>
|
||||||
@@ -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 |
@@ -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 @@
|
|||||||
<!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>
|
||||||
|
After Width: | Height: | Size: 7.7 KiB |
@@ -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 |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 25 KiB |
@@ -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>
|
||||||
|
|||||||
@@ -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;')
|
||||||
})
|
})
|
||||||
|
|||||||