dsh-design-studio 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +6 -4
- package/README.md +6 -4
- package/assets/demo.gif +0 -0
- package/assets/hero-sm.jpg +0 -0
- package/cordis.patch.yml +5 -0
- package/gallery-seed/d/orderg-x__alley-noodles/08e9e40834f9/_shots/menu.jpg +0 -0
- package/gallery-seed/d/orderg-x__alley-noodles/08e9e40834f9/app.css +64 -0
- package/gallery-seed/d/orderg-x__alley-noodles/08e9e40834f9/cart.html +120 -0
- package/gallery-seed/d/orderg-x__alley-noodles/08e9e40834f9/design.json +56 -0
- package/gallery-seed/d/orderg-x__alley-noodles/08e9e40834f9/menu.html +200 -0
- package/gallery-seed/d/orderg-x__alley-noodles/08e9e40834f9/order.html +135 -0
- package/gallery-seed/d/orderg-x__alley-noodles/08e9e40834f9/tokens.css +43 -0
- package/gallery-seed/d/orderg-x__autumn-sale/08e9e40834f9/_shots/email.jpg +0 -0
- package/gallery-seed/d/orderg-x__autumn-sale/08e9e40834f9/design.json +20 -0
- package/gallery-seed/d/orderg-x__autumn-sale/08e9e40834f9/email.html +268 -0
- package/gallery-seed/d/orderg-x__little-painter/08e9e40834f9/_shots/courses.jpg +0 -0
- package/gallery-seed/d/orderg-x__little-painter/08e9e40834f9/courses.html +364 -0
- package/gallery-seed/d/orderg-x__little-painter/08e9e40834f9/design.json +49 -0
- package/gallery-seed/d/orderg-x__little-painter/08e9e40834f9/lesson.html +196 -0
- package/gallery-seed/d/orderg-x__little-painter/08e9e40834f9/tokens.css +55 -0
- package/gallery-seed/d/orderg-x__little-painter/08e9e40834f9/ui.css +255 -0
- package/gallery-seed/d/orderg-x__moon-fair/08e9e40834f9/_shots/poster.jpg +0 -0
- package/gallery-seed/d/orderg-x__moon-fair/08e9e40834f9/design.json +21 -0
- package/gallery-seed/d/orderg-x__moon-fair/08e9e40834f9/poster.html +165 -0
- package/gallery-seed/d/orderg-x__moon-fair/08e9e40834f9/tokens.css +35 -0
- package/gallery-seed/d/orderg-x__paw-diary/08e9e40834f9/_shots/home.jpg +0 -0
- package/gallery-seed/d/orderg-x__paw-diary/08e9e40834f9/app.css +155 -0
- package/gallery-seed/d/orderg-x__paw-diary/08e9e40834f9/booking.html +232 -0
- package/gallery-seed/d/orderg-x__paw-diary/08e9e40834f9/design.json +57 -0
- package/gallery-seed/d/orderg-x__paw-diary/08e9e40834f9/health.html +221 -0
- package/gallery-seed/d/orderg-x__paw-diary/08e9e40834f9/home.html +225 -0
- package/gallery-seed/d/orderg-x__paw-diary/08e9e40834f9/tokens.css +54 -0
- package/gallery-seed/d/orderg-x__pocket-ledger/08e9e40834f9/_shots/overview.jpg +0 -0
- package/gallery-seed/d/orderg-x__pocket-ledger/08e9e40834f9/app.css +79 -0
- package/gallery-seed/d/orderg-x__pocket-ledger/08e9e40834f9/design.json +51 -0
- package/gallery-seed/d/orderg-x__pocket-ledger/08e9e40834f9/entries.html +161 -0
- package/gallery-seed/d/orderg-x__pocket-ledger/08e9e40834f9/icons.svg +30 -0
- package/gallery-seed/d/orderg-x__pocket-ledger/08e9e40834f9/overview.html +181 -0
- package/gallery-seed/d/orderg-x__pocket-ledger/08e9e40834f9/tokens.css +50 -0
- package/gallery-seed/d/orderg-x__time-bookshop/08e9e40834f9/_shots/home.jpg +0 -0
- package/gallery-seed/d/orderg-x__time-bookshop/08e9e40834f9/book.html +279 -0
- package/gallery-seed/d/orderg-x__time-bookshop/08e9e40834f9/design.json +21 -0
- package/gallery-seed/d/orderg-x__time-bookshop/08e9e40834f9/home.html +348 -0
- package/gallery-seed/d/orderg-x__time-bookshop/08e9e40834f9/style.css +297 -0
- package/gallery-seed/d/orderg-x__time-bookshop/08e9e40834f9/tokens.css +49 -0
- package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/01-cover.html +133 -0
- package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/02-highlights.html +67 -0
- package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/03-growth.html +89 -0
- package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/04-milestones.html +92 -0
- package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/05-next.html +99 -0
- package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/06-thanks.html +61 -0
- package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/_shots/01-cover.jpg +0 -0
- package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/deck.css +67 -0
- package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/design.json +25 -0
- package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/tokens.css +30 -0
- package/gallery-seed/index.json +1 -0
- package/gallery-seed/thumbs/orderg-x__alley-noodles.webp +0 -0
- package/gallery-seed/thumbs/orderg-x__autumn-sale.webp +0 -0
- package/gallery-seed/thumbs/orderg-x__little-painter.webp +0 -0
- package/gallery-seed/thumbs/orderg-x__moon-fair.webp +0 -0
- package/gallery-seed/thumbs/orderg-x__paw-diary.webp +0 -0
- package/gallery-seed/thumbs/orderg-x__pocket-ledger.webp +0 -0
- package/gallery-seed/thumbs/orderg-x__time-bookshop.webp +0 -0
- package/gallery-seed/thumbs/orderg-x__year-review.webp +0 -0
- package/lib/browser.js +23 -9
- package/lib/bundle.js +12 -3
- package/lib/client.js +3106 -111
- package/lib/core.js +44 -11
- package/lib/gallery/css.js +230 -0
- package/lib/gallery/html.js +313 -0
- package/lib/gallery/index.js +22 -0
- package/lib/gallery/market-routes.js +306 -0
- package/lib/gallery/market.js +623 -0
- package/lib/gallery/pack.js +311 -0
- package/lib/gallery/policy.js +1560 -0
- package/lib/gallery/qrfind.js +181 -0
- package/lib/gallery/render.js +148 -0
- package/lib/gallery/routes.js +360 -0
- package/lib/gallery/tar.js +118 -0
- package/lib/gallery/use.js +125 -0
- package/lib/gallery/zip.js +212 -0
- package/lib/handoff.js +291 -29
- package/lib/history.js +3 -1
- package/lib/index.js +118 -24
- package/lib/inspire.js +142 -0
- package/lib/offline.js +17 -0
- package/lib/picker.js +425 -32
- package/lib/serve.js +88 -11
- package/lib/works.js +238 -0
- package/locale/en.json +2 -1
- package/locale/offline/en.json +6 -0
- package/locale/offline/zh.json +6 -0
- package/locale/zh.json +2 -1
- package/package.json +10 -3
- package/skills/ui-design/SKILL.md +9 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
* { box-sizing: border-box; }
|
|
2
|
+
html, body { height: 100%; margin: 0; }
|
|
3
|
+
body {
|
|
4
|
+
font: var(--fs-md)/1.5 var(--font);
|
|
5
|
+
color: var(--text);
|
|
6
|
+
background: var(--bg);
|
|
7
|
+
overflow: hidden;
|
|
8
|
+
font-variant-numeric: tabular-nums;
|
|
9
|
+
-webkit-font-smoothing: antialiased;
|
|
10
|
+
}
|
|
11
|
+
a { color: inherit; text-decoration: none; }
|
|
12
|
+
button { font: inherit; color: inherit; }
|
|
13
|
+
svg.i { width: 16px; height: 16px; flex: none; fill: none; stroke: currentColor; stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; }
|
|
14
|
+
.num { font-variant-numeric: tabular-nums; white-space: nowrap; }
|
|
15
|
+
.mono { font-family: var(--mono); font-size: var(--fs-sm); }
|
|
16
|
+
.muted { color: var(--muted); }
|
|
17
|
+
.in { color: var(--accent-ink); }
|
|
18
|
+
:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
|
|
19
|
+
|
|
20
|
+
.win { display: grid; grid-template-columns: 232px minmax(0, 1fr); height: 100vh; }
|
|
21
|
+
|
|
22
|
+
.side { background: var(--side); border-right: 1px solid var(--side-line); display: flex; flex-direction: column; padding: 52px 12px 12px; overflow: auto; }
|
|
23
|
+
.brand { display: flex; align-items: center; gap: var(--space-2); padding: 0 8px; height: 32px; margin-bottom: var(--space-3); }
|
|
24
|
+
.brand .logo { width: 24px; height: 24px; border-radius: var(--radius-sm); background: var(--primary); color: var(--on); display: grid; place-items: center; }
|
|
25
|
+
.brand b { font-size: var(--fs-lg); font-weight: 600; }
|
|
26
|
+
.brand .book { margin-left: auto; display: flex; align-items: center; gap: 2px; color: var(--muted); font-size: var(--fs-sm); }
|
|
27
|
+
.side h3 { margin: var(--space-4) 8px var(--space-1); font-size: var(--fs-sm); font-weight: 500; color: var(--muted); }
|
|
28
|
+
.nav { display: flex; flex-direction: column; gap: 2px; }
|
|
29
|
+
.nav a, .nav span.item { display: flex; align-items: center; gap: 10px; height: 30px; padding: 0 8px; border-radius: var(--radius-sm); color: var(--text); transition: background .15s var(--ease); }
|
|
30
|
+
.nav a:hover, .nav span.item:hover { background: rgba(15, 23, 42, .05); }
|
|
31
|
+
.nav .on { background: rgba(36, 87, 245, .11); font-weight: 600; }
|
|
32
|
+
.nav .on svg { color: var(--primary); }
|
|
33
|
+
.nav svg { color: var(--muted); }
|
|
34
|
+
.nav .count { margin-left: auto; font-size: var(--fs-sm); color: var(--muted); font-weight: 400; }
|
|
35
|
+
.nav .flag { margin-left: auto; display: inline-flex; align-items: center; gap: 4px; font-size: var(--fs-sm); color: var(--danger); font-weight: 500; }
|
|
36
|
+
.dot { width: 8px; height: 8px; border-radius: 50%; flex: none; display: inline-block; }
|
|
37
|
+
.acct { display: flex; align-items: center; gap: 10px; height: 30px; padding: 0 8px; border-radius: var(--radius-sm); }
|
|
38
|
+
.acct svg { color: var(--muted); }
|
|
39
|
+
.acct .num { margin-left: auto; }
|
|
40
|
+
.net { margin: var(--space-2) 8px 0; padding-top: var(--space-2); border-top: 1px solid var(--side-line); display: flex; justify-content: space-between; color: var(--muted); }
|
|
41
|
+
.net b { color: var(--text); font-weight: 600; }
|
|
42
|
+
.side-foot { margin-top: auto; display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) 8px 0; color: var(--muted); font-size: var(--fs-sm); }
|
|
43
|
+
.side-foot .ok { width: 6px; height: 6px; border-radius: 50%; background: var(--accent); }
|
|
44
|
+
.side-foot .gear { margin-left: auto; width: 28px; height: 28px; display: grid; place-items: center; border-radius: var(--radius-sm); }
|
|
45
|
+
.side-foot .gear:hover { background: rgba(15, 23, 42, .05); }
|
|
46
|
+
|
|
47
|
+
.main { display: flex; flex-direction: column; min-width: 0; height: 100vh; }
|
|
48
|
+
.toolbar { height: 52px; flex: none; display: flex; align-items: center; gap: var(--space-3); padding: 0 var(--space-4) 0 var(--space-5); border-bottom: 1px solid var(--line); background: var(--surface); }
|
|
49
|
+
.toolbar h1 { margin: 0; font-size: var(--fs-lg); font-weight: 600; white-space: nowrap; }
|
|
50
|
+
.toolbar .sub { color: var(--muted); white-space: nowrap; }
|
|
51
|
+
.spacer { flex: 1; }
|
|
52
|
+
.month { display: flex; align-items: center; gap: 2px; margin-left: var(--space-2); }
|
|
53
|
+
.month b { font-weight: 500; padding: 0 6px; white-space: nowrap; }
|
|
54
|
+
.ib { width: 28px; height: 28px; border-radius: var(--radius-sm); border: 0; background: transparent; display: grid; place-items: center; color: var(--muted); cursor: default; flex: none; }
|
|
55
|
+
.ib:hover { background: var(--hover); color: var(--text); }
|
|
56
|
+
.search { display: flex; align-items: center; gap: var(--space-2); width: 220px; height: 28px; padding: 0 8px; border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--bg); color: var(--muted); }
|
|
57
|
+
.search span { flex: 1; white-space: nowrap; }
|
|
58
|
+
kbd { font: 500 11px/1 var(--font); color: var(--muted); padding: 3px 5px; border-radius: var(--radius-xs); background: var(--surface); border: 1px solid var(--line); }
|
|
59
|
+
.btn { height: 28px; padding: 0 12px; border-radius: var(--radius-sm); border: 1px solid var(--line); background: var(--surface); display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; cursor: default; flex: none; transition: background .15s var(--ease); }
|
|
60
|
+
.btn:hover { background: var(--hover); }
|
|
61
|
+
.btn.primary { background: var(--primary); border-color: var(--primary); color: var(--on); font-weight: 500; }
|
|
62
|
+
.btn.primary:hover { background: var(--primary-hover); }
|
|
63
|
+
.btn.primary kbd { background: rgba(8, 20, 70, .28); border-color: transparent; color: var(--on); }
|
|
64
|
+
.btn.danger { color: var(--danger); }
|
|
65
|
+
|
|
66
|
+
.card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow); min-width: 0; }
|
|
67
|
+
.card-h { display: flex; align-items: center; gap: var(--space-2); height: 44px; padding: 0 var(--space-4); }
|
|
68
|
+
.card-h h2 { margin: 0; font-size: var(--fs-md); font-weight: 600; white-space: nowrap; }
|
|
69
|
+
.card-h .more { margin-left: auto; color: var(--link); display: inline-flex; align-items: center; gap: 2px; height: 28px; padding: 0 4px; margin-right: -4px; border-radius: var(--radius-xs); white-space: nowrap; }
|
|
70
|
+
.card-h .more:hover { text-decoration: underline; }
|
|
71
|
+
.tag { display: inline-flex; align-items: center; gap: 4px; height: 20px; padding: 0 6px; border-radius: var(--radius-xs); background: var(--bg); border: 1px solid var(--line); font-size: var(--fs-sm); color: var(--muted); white-space: nowrap; }
|
|
72
|
+
.tag.warn { background: var(--danger-soft); border-color: transparent; color: var(--danger); font-weight: 500; }
|
|
73
|
+
.tag.good { background: var(--accent-soft); border-color: transparent; color: var(--accent-ink); font-weight: 500; }
|
|
74
|
+
|
|
75
|
+
.statusbar { position: sticky; bottom: 0; height: 24px; flex: none; display: flex; align-items: center; gap: var(--space-4); padding: 0 var(--space-4); border-top: 1px solid var(--line); background: var(--surface); color: var(--muted); font-size: var(--fs-sm); white-space: nowrap; }
|
|
76
|
+
.statusbar .ok { display: inline-flex; align-items: center; gap: 6px; margin-left: auto; }
|
|
77
|
+
.statusbar .ok i { width: 6px; height: 6px; border-radius: 50%; background: var(--accent); }
|
|
78
|
+
|
|
79
|
+
@media (prefers-reduced-motion: reduce) { * { transition: none !important; } }
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": 1,
|
|
3
|
+
"type": "template",
|
|
4
|
+
"title": {
|
|
5
|
+
"zh": "小账本",
|
|
6
|
+
"en": "Pocket Ledger"
|
|
7
|
+
},
|
|
8
|
+
"description": {
|
|
9
|
+
"zh": "冷灰蓝、信息密的个人记账桌面软件:总览看本月收支、分类和预算,流水表格配右侧详情",
|
|
10
|
+
"en": "A dense, cool gray-blue personal finance desktop app: a monthly overview with categories and budgets, and an entries table with a detail panel"
|
|
11
|
+
},
|
|
12
|
+
"kind": "desktop",
|
|
13
|
+
"screens": [
|
|
14
|
+
{
|
|
15
|
+
"file": "overview.html",
|
|
16
|
+
"title": {
|
|
17
|
+
"zh": "总览",
|
|
18
|
+
"en": "Overview"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"file": "entries.html",
|
|
23
|
+
"title": {
|
|
24
|
+
"zh": "流水",
|
|
25
|
+
"en": "Entries"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"style": "tech",
|
|
30
|
+
"categories": [
|
|
31
|
+
"finance"
|
|
32
|
+
],
|
|
33
|
+
"tags": [
|
|
34
|
+
"dashboard",
|
|
35
|
+
"chart",
|
|
36
|
+
"data-dense",
|
|
37
|
+
"list",
|
|
38
|
+
"detail",
|
|
39
|
+
"report"
|
|
40
|
+
],
|
|
41
|
+
"lang": "zh",
|
|
42
|
+
"license": "CC0-1.0",
|
|
43
|
+
"author": {
|
|
44
|
+
"login": "orderg-x",
|
|
45
|
+
"id": 271418316
|
|
46
|
+
},
|
|
47
|
+
"ai": {
|
|
48
|
+
"generated": true,
|
|
49
|
+
"tool": "dsh-design-studio@0.11.0"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<meta name="dsh-design" content="desktop">
|
|
7
|
+
<title>流水 · 小账本</title>
|
|
8
|
+
<link rel="stylesheet" href="tokens.css">
|
|
9
|
+
<link rel="stylesheet" href="app.css">
|
|
10
|
+
<style>
|
|
11
|
+
.filters { height: 44px; flex: none; display: flex; align-items: center; gap: var(--space-2); padding: 0 var(--space-4) 0 var(--space-5); border-bottom: 1px solid var(--line); background: var(--surface); }
|
|
12
|
+
.seg { display: inline-flex; padding: 2px; background: var(--bg); border: 1px solid var(--line); border-radius: var(--radius-sm); }
|
|
13
|
+
.seg span { height: 22px; padding: 0 10px; display: inline-flex; align-items: center; border-radius: var(--radius-xs); color: var(--muted); white-space: nowrap; }
|
|
14
|
+
.seg .on { background: var(--surface); color: var(--text); font-weight: 500; box-shadow: var(--shadow); }
|
|
15
|
+
.chip { height: 28px; display: inline-flex; align-items: center; gap: 4px; padding: 0 8px 0 10px; border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--surface); white-space: nowrap; flex: none; }
|
|
16
|
+
.chip:hover { background: var(--hover); }
|
|
17
|
+
.chip .k { color: var(--muted); }
|
|
18
|
+
.chip svg { width: 14px; height: 14px; color: var(--muted); }
|
|
19
|
+
.chip.set { border-color: rgba(36, 87, 245, .35); background: var(--primary-soft); }
|
|
20
|
+
.totals { margin-left: auto; display: flex; gap: var(--space-4); white-space: nowrap; }
|
|
21
|
+
.totals b { font-weight: 600; }
|
|
22
|
+
|
|
23
|
+
.split { flex: 1; min-height: 0; display: grid; grid-template-columns: minmax(0, 1fr) 320px; grid-template-rows: minmax(0, 1fr); overflow: hidden; }
|
|
24
|
+
.table { min-width: 0; overflow: auto; background: var(--surface); }
|
|
25
|
+
.th, .tr { display: grid; grid-template-columns: 16px 52px 76px minmax(0, 1fr) 56px 104px; align-items: center; gap: var(--space-3); padding: 0 var(--space-4) 0 var(--space-5); }
|
|
26
|
+
.th { position: sticky; top: 0; z-index: 1; height: 32px; background: var(--bg); border-bottom: 1px solid var(--line); color: var(--muted); font-size: var(--fs-sm); font-weight: 500; }
|
|
27
|
+
.th .s { display: inline-flex; align-items: center; gap: 2px; color: var(--text); }
|
|
28
|
+
.th .s svg { width: 12px; height: 12px; }
|
|
29
|
+
.th .r { text-align: right; justify-self: end; }
|
|
30
|
+
.g { display: flex; align-items: center; height: 32px; padding: 0 var(--space-4) 0 var(--space-5); background: var(--bg); border-bottom: 1px solid var(--line); font-weight: 600; white-space: nowrap; }
|
|
31
|
+
.g .gsum { margin-left: auto; display: flex; gap: var(--space-3); color: var(--muted); font-weight: 400; font-size: var(--fs-sm); }
|
|
32
|
+
.tr { position: relative; height: 40px; border-bottom: 1px solid var(--line); transition: background .15s var(--ease); }
|
|
33
|
+
.tr:hover { background: var(--hover); }
|
|
34
|
+
.tr.sel { background: var(--primary-soft); }
|
|
35
|
+
.tr.sel::before { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: var(--primary); }
|
|
36
|
+
.chk { width: 14px; height: 14px; border: 1.5px solid #A3AFC0; border-radius: 4px; background: var(--surface); }
|
|
37
|
+
.chk { display: grid; place-items: center; }
|
|
38
|
+
.chk.on { background: var(--primary); border-color: var(--primary); color: var(--on); }
|
|
39
|
+
.chk.on svg { width: 11px; height: 11px; stroke-width: 3; }
|
|
40
|
+
.tr .cat { display: flex; align-items: center; gap: 6px; white-space: nowrap; }
|
|
41
|
+
.tr .note { display: flex; align-items: center; gap: 6px; min-width: 0; overflow: hidden; }
|
|
42
|
+
.tr .note .tx { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
43
|
+
.tr .acc { white-space: nowrap; color: var(--muted); }
|
|
44
|
+
.tr .amt { text-align: right; font-weight: 600; }
|
|
45
|
+
|
|
46
|
+
.detail { border-left: 1px solid var(--line); background: var(--surface); overflow: auto; display: flex; flex-direction: column; }
|
|
47
|
+
.d-h { display: flex; align-items: center; gap: 4px; height: 44px; padding: 0 var(--space-2) 0 var(--space-4); border-bottom: 1px solid var(--line); }
|
|
48
|
+
.d-h .tag { margin-right: auto; }
|
|
49
|
+
.d-top { padding: var(--space-4) var(--space-4) var(--space-3); }
|
|
50
|
+
.d-top .amt { font-size: var(--fs-xl); font-weight: 600; line-height: 1.15; letter-spacing: -.01em; }
|
|
51
|
+
.d-top h2 { margin: var(--space-1) 0 0; font-size: var(--fs-lg); font-weight: 600; }
|
|
52
|
+
.fields { margin: 0; padding: 0 var(--space-4); }
|
|
53
|
+
.fields div { display: grid; grid-template-columns: 56px minmax(0, 1fr); gap: var(--space-3); align-items: center; min-height: 32px; border-top: 1px solid var(--line); }
|
|
54
|
+
.fields dt { color: var(--muted); }
|
|
55
|
+
.fields dd { margin: 0; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0; }
|
|
56
|
+
.split-box { margin: var(--space-3) var(--space-4) 0; padding: var(--space-3); border-radius: var(--radius); background: var(--bg); display: flex; flex-direction: column; gap: var(--space-2); }
|
|
57
|
+
.split-box .row { display: flex; align-items: center; gap: var(--space-2); }
|
|
58
|
+
.split-box .row .num { margin-left: auto; }
|
|
59
|
+
.ava { width: 20px; height: 20px; border-radius: 50%; display: grid; place-items: center; font-size: 11px; font-weight: 600; color: var(--on); flex: none; }
|
|
60
|
+
.receipt { margin: var(--space-3) var(--space-4) 0; display: flex; gap: var(--space-3); align-items: center; padding: var(--space-2); border: 1px dashed #C5CEDB; border-radius: var(--radius); }
|
|
61
|
+
.receipt svg.pic { width: 44px; height: 56px; flex: none; }
|
|
62
|
+
.receipt .t { display: flex; flex-direction: column; min-width: 0; }
|
|
63
|
+
.mini { margin: var(--space-3) var(--space-4) 0; display: flex; flex-direction: column; gap: 6px; }
|
|
64
|
+
.mini .row { display: flex; align-items: baseline; gap: var(--space-2); }
|
|
65
|
+
.mini .row .num { margin-left: auto; }
|
|
66
|
+
.bar { height: 6px; border-radius: 999px; background: var(--track); overflow: hidden; }
|
|
67
|
+
.bar i { display: block; height: 100%; border-radius: 999px; }
|
|
68
|
+
.d-foot { margin-top: auto; display: flex; gap: var(--space-2); padding: var(--space-4); }
|
|
69
|
+
.d-foot .btn.danger { margin-left: auto; }
|
|
70
|
+
@media (max-width: 1200px) {
|
|
71
|
+
.totals { display: none; }
|
|
72
|
+
.split { grid-template-columns: minmax(0, 1fr) 280px; }
|
|
73
|
+
.tr .note .tag { display: none; }
|
|
74
|
+
.d-foot kbd { display: none; }
|
|
75
|
+
}
|
|
76
|
+
</style>
|
|
77
|
+
</head>
|
|
78
|
+
<body>
|
|
79
|
+
<div class="win">
|
|
80
|
+
<aside class="side" aria-label="侧栏">
|
|
81
|
+
<div class="brand"><span class="logo"><svg class="i" aria-hidden="true"><use href="icons.svg#book"></use></svg></span><b>小账本</b><span class="book">日常<svg class="i" style="width:12px;height:12px" aria-hidden="true"><use href="icons.svg#down"></use></svg></span></div>
|
|
82
|
+
<nav class="nav" aria-label="主导航">
|
|
83
|
+
<a href="overview.html" class=""><svg class="i" aria-hidden="true"><use href="icons.svg#overview"></use></svg>总览</a>
|
|
84
|
+
<a href="entries.html" class="on"><svg class="i" aria-hidden="true"><use href="icons.svg#list"></use></svg>流水<span class="count num">86</span></a>
|
|
85
|
+
<span class="item"><svg class="i" aria-hidden="true"><use href="icons.svg#budget"></use></svg>预算<span class="flag"><i class="dot" style="background:var(--danger);width:6px;height:6px"></i>1 项超支</span></span>
|
|
86
|
+
<span class="item"><svg class="i" aria-hidden="true"><use href="icons.svg#report"></use></svg>报表</span>
|
|
87
|
+
</nav>
|
|
88
|
+
<h3>账户</h3>
|
|
89
|
+
<div class="acct"><svg class="i" aria-hidden="true"><use href="icons.svg#cash"></use></svg>现金<span class="num">¥1,286.40</span></div>
|
|
90
|
+
<div class="acct"><svg class="i" aria-hidden="true"><use href="icons.svg#save"></use></svg>储蓄<span class="num">¥48,200.00</span></div>
|
|
91
|
+
<div class="acct"><svg class="i" aria-hidden="true"><use href="icons.svg#credit"></use></svg>信用<span class="num">−¥3,412.80</span></div>
|
|
92
|
+
<div class="net"><span>净资产</span><b class="num">¥46,073.60</b></div>
|
|
93
|
+
<h3>常用分类</h3>
|
|
94
|
+
<div class="nav">
|
|
95
|
+
<span class="item"><i class="dot" style="background:var(--cat-food)"></i>餐饮</span>
|
|
96
|
+
<span class="item"><i class="dot" style="background:var(--cat-shopping)"></i>购物</span>
|
|
97
|
+
<span class="item"><i class="dot" style="background:var(--cat-transit)"></i>交通</span>
|
|
98
|
+
<span class="item"><i class="dot" style="background:var(--cat-fun)"></i>娱乐</span>
|
|
99
|
+
</div>
|
|
100
|
+
<div class="side-foot"><i class="ok"></i>本地已保存 · 刚刚<span class="gear" title="设置"><svg class="i" aria-hidden="true"><use href="icons.svg#gear"></use></svg></span></div>
|
|
101
|
+
</aside>
|
|
102
|
+
<div class="main">
|
|
103
|
+
<header class="toolbar">
|
|
104
|
+
<h1>流水</h1>
|
|
105
|
+
<span class="sub">10 月 · 86 笔</span>
|
|
106
|
+
<div class="spacer"></div>
|
|
107
|
+
<div class="search"><svg class="i" aria-hidden="true"><use href="icons.svg#search"></use></svg><span>搜索备注、分类、标签</span><kbd>⌘F</kbd></div>
|
|
108
|
+
<button class="ib" aria-label="导出"><svg class="i" aria-hidden="true"><use href="icons.svg#copy"></use></svg></button>
|
|
109
|
+
<button class="btn primary"><svg class="i" aria-hidden="true"><use href="icons.svg#plus"></use></svg>记一笔<kbd>⌘N</kbd></button>
|
|
110
|
+
</header>
|
|
111
|
+
<div class="filters">
|
|
112
|
+
<span class="seg"><span class="on">全部</span><span>支出</span><span>收入</span></span>
|
|
113
|
+
<span class="chip"><svg class="i" aria-hidden="true"><use href="icons.svg#calendar"></use></svg><span class="k">日期</span>10月1日 – 31日<svg class="i" aria-hidden="true"><use href="icons.svg#down"></use></svg></span>
|
|
114
|
+
<span class="chip"><span class="k">分类</span>全部<svg class="i" aria-hidden="true"><use href="icons.svg#down"></use></svg></span>
|
|
115
|
+
<span class="chip"><span class="k">账户</span>全部<svg class="i" aria-hidden="true"><use href="icons.svg#down"></use></svg></span>
|
|
116
|
+
<span class="chip"><span class="k">标签</span>全部<svg class="i" aria-hidden="true"><use href="icons.svg#down"></use></svg></span>
|
|
117
|
+
<div class="totals"><span class="muted">支出 <b class="num" style="color:var(--text)">¥9,327.50</b></span><span class="muted">收入 <b class="num in">¥18,640.00</b></span></div>
|
|
118
|
+
</div>
|
|
119
|
+
<div class="split">
|
|
120
|
+
<div class="table" role="table" aria-label="10 月流水">
|
|
121
|
+
<div class="th" role="row"><span class="chk" aria-hidden="true"></span><span class="s">日期<svg class="i" aria-hidden="true"><use href="icons.svg#dn"></use></svg></span><span>分类</span><span>备注</span><span>账户</span><span class="r">金额</span></div>
|
|
122
|
+
<div class="g"><span>10月28日<span class="muted"> 周三</span></span><span class="gsum num"><span>支出 ¥64.00</span></span></div><div class="tr"><span class="chk" aria-hidden="true"></span><span class="muted num">18:52</span><span class="cat"><i class="dot" style="background:var(--cat-food)"></i>餐饮</span><span class="note"><span class="tx">晚饭 · 楼下沙县</span></span><span class="acc">信用</span><span class="num amt">−¥28.00</span></div><div class="tr"><span class="chk" aria-hidden="true"></span><span class="muted num">12:36</span><span class="cat"><i class="dot" style="background:var(--cat-food)"></i>餐饮</span><span class="note"><span class="tx">午饭 · 牛肉粉</span></span><span class="acc">信用</span><span class="num amt">−¥32.00</span></div><div class="tr"><span class="chk" aria-hidden="true"></span><span class="muted num">08:15</span><span class="cat"><i class="dot" style="background:var(--cat-transit)"></i>交通</span><span class="note"><span class="tx">地铁</span></span><span class="acc">储蓄</span><span class="num amt">−¥4.00</span></div><div class="g"><span>10月27日<span class="muted"> 周二</span></span><span class="gsum num"><span class="in">收入 +¥1,200.00</span><span>支出 ¥649.50</span></span></div><div class="tr"><span class="chk" aria-hidden="true"></span><span class="muted num">21:04</span><span class="cat"><i class="dot" style="background:var(--cat-shopping)"></i>购物</span><span class="note"><span class="tx">冬季被子</span><span class="tag">换季</span></span><span class="acc">信用</span><span class="num amt">−¥459.00</span></div><div class="tr sel"><span class="chk on" aria-hidden="true"><svg class="i" aria-hidden="true"><use href="icons.svg#check"></use></svg></span><span class="muted num">19:30</span><span class="cat"><i class="dot" style="background:var(--cat-food)"></i>餐饮</span><span class="note"><span class="tx">和小林吃火锅</span><span class="tag">朋友</span><span class="tag">AA</span></span><span class="acc">信用</span><span class="num amt">−¥186.50</span></div><div class="tr"><span class="chk" aria-hidden="true"></span><span class="muted num">15:10</span><span class="cat"><i class="dot" style="background:var(--accent)"></i>收入</span><span class="note"><span class="tx">稿费 · 十月专栏</span></span><span class="acc">储蓄</span><span class="num amt in">+¥1,200.00</span></div><div class="tr"><span class="chk" aria-hidden="true"></span><span class="muted num">08:20</span><span class="cat"><i class="dot" style="background:var(--cat-transit)"></i>交通</span><span class="note"><span class="tx">地铁</span></span><span class="acc">储蓄</span><span class="num amt">−¥4.00</span></div><div class="g"><span>10月26日<span class="muted"> 周一</span></span><span class="gsum num"><span>支出 ¥167.00</span></span></div><div class="tr"><span class="chk" aria-hidden="true"></span><span class="muted num">22:40</span><span class="cat"><i class="dot" style="background:var(--cat-fun)"></i>娱乐</span><span class="note"><span class="tx">电影《雾港》两张</span><span class="tag">朋友</span></span><span class="acc">信用</span><span class="num amt">−¥96.00</span></div><div class="tr"><span class="chk" aria-hidden="true"></span><span class="muted num">12:05</span><span class="cat"><i class="dot" style="background:var(--cat-food)"></i>餐饮</span><span class="note"><span class="tx">午饭 · 便当</span></span><span class="acc">现金</span><span class="num amt">−¥26.00</span></div><div class="tr"><span class="chk" aria-hidden="true"></span><span class="muted num">09:30</span><span class="cat"><i class="dot" style="background:var(--cat-other)"></i>其他</span><span class="note"><span class="tx">理发</span></span><span class="acc">现金</span><span class="num amt">−¥45.00</span></div><div class="g"><span>10月25日<span class="muted"> 周日</span></span><span class="gsum num"><span>支出 ¥268.90</span></span></div><div class="tr"><span class="chk" aria-hidden="true"></span><span class="muted num">16:20</span><span class="cat"><i class="dot" style="background:var(--cat-shopping)"></i>购物</span><span class="note"><span class="tx">超市 · 日用品</span></span><span class="acc">储蓄</span><span class="num amt">−¥138.60</span></div><div class="tr"><span class="chk" aria-hidden="true"></span><span class="muted num">11:40</span><span class="cat"><i class="dot" style="background:var(--cat-transit)"></i>交通</span><span class="note"><span class="tx">打车去火车站</span></span><span class="acc">信用</span><span class="num amt">−¥72.30</span></div><div class="tr"><span class="chk" aria-hidden="true"></span><span class="muted num">10:05</span><span class="cat"><i class="dot" style="background:var(--cat-food)"></i>餐饮</span><span class="note"><span class="tx">早午餐</span></span><span class="acc">信用</span><span class="num amt">−¥58.00</span></div><div class="g"><span>10月24日<span class="muted"> 周六</span></span><span class="gsum num"><span>支出 ¥142.00</span></span></div><div class="tr"><span class="chk" aria-hidden="true"></span><span class="muted num">20:15</span><span class="cat"><i class="dot" style="background:var(--cat-food)"></i>餐饮</span><span class="note"><span class="tx">外卖 · 麻辣烫</span></span><span class="acc">信用</span><span class="num amt">−¥42.00</span></div><div class="tr"><span class="chk" aria-hidden="true"></span><span class="muted num">15:30</span><span class="cat"><i class="dot" style="background:var(--cat-fun)"></i>娱乐</span><span class="note"><span class="tx">桌游店</span></span><span class="acc">现金</span><span class="num amt">−¥88.00</span></div><div class="tr"><span class="chk" aria-hidden="true"></span><span class="muted num">09:10</span><span class="cat"><i class="dot" style="background:var(--cat-other)"></i>其他</span><span class="note"><span class="tx">快递寄书</span></span><span class="acc">现金</span><span class="num amt">−¥12.00</span></div>
|
|
123
|
+
</div>
|
|
124
|
+
<aside class="detail" aria-label="这一笔的详情">
|
|
125
|
+
<div class="d-h"><span class="tag"><i class="dot" style="background:var(--cat-food)"></i>餐饮 › 聚餐</span><button class="ib" aria-label="编辑"><svg class="i" aria-hidden="true"><use href="icons.svg#edit"></use></svg></button><button class="ib" aria-label="更多"><svg class="i" aria-hidden="true"><use href="icons.svg#more"></use></svg></button></div>
|
|
126
|
+
<div class="d-top">
|
|
127
|
+
<div class="amt num">−¥186.50</div>
|
|
128
|
+
<h2>和小林吃火锅</h2>
|
|
129
|
+
</div>
|
|
130
|
+
<dl class="fields">
|
|
131
|
+
<div><dt>时间</dt><dd class="num">2026-10-27 周二 19:30</dd></div>
|
|
132
|
+
<div><dt>账户</dt><dd><svg class="i" style="color:var(--muted)" aria-hidden="true"><use href="icons.svg#credit"></use></svg>信用</dd></div>
|
|
133
|
+
<div><dt>地点</dt><dd>老街火锅 · 二楼</dd></div>
|
|
134
|
+
<div><dt>标签</dt><dd><span class="tag">朋友</span><span class="tag">AA</span></dd></div>
|
|
135
|
+
</dl>
|
|
136
|
+
<div class="split-box">
|
|
137
|
+
<div class="row"><svg class="i" style="color:var(--muted)" aria-hidden="true"><use href="icons.svg#people"></use></svg><b style="font-weight:600">AA 两人</b><span class="muted num">每人 ¥93.25</span></div>
|
|
138
|
+
<div class="row"><span class="ava" style="background:var(--primary)">我</span>我付了<span class="num">¥186.50</span></div>
|
|
139
|
+
<div class="row"><span class="ava" style="background:var(--accent-ink)">林</span>小林应付<span class="num">¥93.25</span><span class="tag warn">未收</span></div>
|
|
140
|
+
</div>
|
|
141
|
+
<div class="receipt">
|
|
142
|
+
<svg class="pic" viewBox="0 0 44 56" aria-label="小票缩略图"><rect x=".5" y=".5" width="43" height="55" rx="4" fill="#F5F7FB" stroke="#E2E8F0"/><path d="M10 12h24M10 19h16M10 24h20M10 29h12M10 38h24" stroke="#A3AFC0" stroke-width="2" stroke-linecap="round"/><path d="M26 45h8" stroke="#55657D" stroke-width="2.5" stroke-linecap="round"/></svg>
|
|
143
|
+
<div class="t"><span>小票.jpg</span><span class="muted">拍于 19:58 · 已识别 6 项</span></div>
|
|
144
|
+
</div>
|
|
145
|
+
<div class="mini">
|
|
146
|
+
<div class="row"><span>本月餐饮</span><span class="num">¥2,148.60<span class="muted"> / 2,500</span></span></div>
|
|
147
|
+
<div class="bar"><i style="width:85.9%;background:var(--cat-food)"></i></div>
|
|
148
|
+
<span class="muted">还剩 ¥351.40,比 9 月同期少 6%</span>
|
|
149
|
+
</div>
|
|
150
|
+
<div class="d-foot">
|
|
151
|
+
<button class="btn"><svg class="i" aria-hidden="true"><use href="icons.svg#edit"></use></svg>编辑<kbd>⌘E</kbd></button>
|
|
152
|
+
<button class="btn"><svg class="i" aria-hidden="true"><use href="icons.svg#copy"></use></svg>再记一笔</button>
|
|
153
|
+
<button class="btn danger" aria-label="删除"><svg class="i" aria-hidden="true"><use href="icons.svg#trash"></use></svg></button>
|
|
154
|
+
</div>
|
|
155
|
+
</aside>
|
|
156
|
+
</div>
|
|
157
|
+
<footer class="statusbar"><span>10 月共 86 笔</span><span>已选 1 笔 · −¥186.50</span><span>按日期倒序</span><span class="ok"><i></i>本地已保存</span></footer>
|
|
158
|
+
</div>
|
|
159
|
+
</div>
|
|
160
|
+
</body>
|
|
161
|
+
</html>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<symbol id="book" viewBox="0 0 24 24"><path d="M5 4.5h10.5a3 3 0 0 1 3 3V20H8a3 3 0 0 1-3-3V4.5Z"/><path d="M5 17a3 3 0 0 1 3-3h10.5"/><path d="M9 8.5h5"/></symbol>
|
|
3
|
+
<symbol id="overview" viewBox="0 0 24 24"><rect x="3.5" y="3.5" width="7" height="8" rx="1.5"/><rect x="13.5" y="3.5" width="7" height="5" rx="1.5"/><rect x="13.5" y="11.5" width="7" height="9" rx="1.5"/><rect x="3.5" y="14.5" width="7" height="6" rx="1.5"/></symbol>
|
|
4
|
+
<symbol id="list" viewBox="0 0 24 24"><path d="M9 6h11M9 12h11M9 18h11"/><circle cx="4.5" cy="6" r=".9"/><circle cx="4.5" cy="12" r=".9"/><circle cx="4.5" cy="18" r=".9"/></symbol>
|
|
5
|
+
<symbol id="budget" viewBox="0 0 24 24"><circle cx="12" cy="12" r="8.5"/><circle cx="12" cy="12" r="4.5"/><path d="M12 3.5V7.5"/></symbol>
|
|
6
|
+
<symbol id="report" viewBox="0 0 24 24"><path d="M4 20h16"/><path d="M7 16v-5M12 16V6M17 16v-8"/></symbol>
|
|
7
|
+
<symbol id="cash" viewBox="0 0 24 24"><rect x="2.5" y="6" width="19" height="12" rx="2"/><circle cx="12" cy="12" r="2.6"/><path d="M6 9.5v5M18 9.5v5"/></symbol>
|
|
8
|
+
<symbol id="save" viewBox="0 0 24 24"><path d="M4 9.5 12 5l8 4.5"/><path d="M5.5 10v7M10 10v7M14 10v7M18.5 10v7"/><path d="M4 19.5h16"/></symbol>
|
|
9
|
+
<symbol id="credit" viewBox="0 0 24 24"><rect x="3" y="5.5" width="18" height="13" rx="2"/><path d="M3 10h18M7 15h3"/></symbol>
|
|
10
|
+
<symbol id="gear" viewBox="0 0 24 24"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1Z"/></symbol>
|
|
11
|
+
<symbol id="search" viewBox="0 0 24 24"><circle cx="11" cy="11" r="6.5"/><path d="m20 20-4.2-4.2"/></symbol>
|
|
12
|
+
<symbol id="plus" viewBox="0 0 24 24"><path d="M12 5v14M5 12h14"/></symbol>
|
|
13
|
+
<symbol id="left" viewBox="0 0 24 24"><path d="m14.5 6-6 6 6 6"/></symbol>
|
|
14
|
+
<symbol id="right" viewBox="0 0 24 24"><path d="m9.5 6 6 6-6 6"/></symbol>
|
|
15
|
+
<symbol id="down" viewBox="0 0 24 24"><path d="m6 9.5 6 6 6-6"/></symbol>
|
|
16
|
+
<symbol id="filter" viewBox="0 0 24 24"><path d="M4 6h16M7 12h10M10 18h4"/></symbol>
|
|
17
|
+
<symbol id="edit" viewBox="0 0 24 24"><path d="M4 20h4L19 9a2.8 2.8 0 0 0-4-4L4 16v4Z"/><path d="m13.5 6.5 4 4"/></symbol>
|
|
18
|
+
<symbol id="more" viewBox="0 0 24 24"><circle cx="5.5" cy="12" r="1"/><circle cx="12" cy="12" r="1"/><circle cx="18.5" cy="12" r="1"/></symbol>
|
|
19
|
+
<symbol id="copy" viewBox="0 0 24 24"><rect x="8.5" y="8.5" width="11" height="11" rx="2"/><path d="M15.5 8.5V6a1.5 1.5 0 0 0-1.5-1.5H6A1.5 1.5 0 0 0 4.5 6v8A1.5 1.5 0 0 0 6 15.5h2.5"/></symbol>
|
|
20
|
+
<symbol id="trash" viewBox="0 0 24 24"><path d="M4.5 7h15M9.5 7V4.5h5V7M6.5 7l1 13h9l1-13"/><path d="M10 11v5.5M14 11v5.5"/></symbol>
|
|
21
|
+
<symbol id="receipt" viewBox="0 0 24 24"><path d="M6 3.5h12V21l-2-1.3-2 1.3-2-1.3-2 1.3-2-1.3L6 21V3.5Z"/><path d="M9 8h6M9 12h6M9 16h3"/></symbol>
|
|
22
|
+
<symbol id="up" viewBox="0 0 24 24"><path d="m7 14 5-5 5 5"/></symbol>
|
|
23
|
+
<symbol id="dn" viewBox="0 0 24 24"><path d="m7 10 5 5 5-5"/></symbol>
|
|
24
|
+
<symbol id="x" viewBox="0 0 24 24"><path d="m7 7 10 10M17 7 7 17"/></symbol>
|
|
25
|
+
<symbol id="check" viewBox="0 0 24 24"><path d="m5.5 12.5 4.2 4.2 8.8-9.4"/></symbol>
|
|
26
|
+
<symbol id="pin" viewBox="0 0 24 24"><path d="M12 21s-6.5-5.6-6.5-11a6.5 6.5 0 0 1 13 0c0 5.4-6.5 11-6.5 11Z"/><circle cx="12" cy="10" r="2.3"/></symbol>
|
|
27
|
+
<symbol id="people" viewBox="0 0 24 24"><circle cx="9" cy="8.5" r="3.2"/><path d="M3.5 19.5c.6-3.2 2.8-5 5.5-5s4.9 1.8 5.5 5"/><circle cx="16.8" cy="9.5" r="2.5"/><path d="M15.5 14.6c2.6-.3 4.5 1.4 5 4.4"/></symbol>
|
|
28
|
+
<symbol id="calendar" viewBox="0 0 24 24"><rect x="3.5" y="5" width="17" height="15.5" rx="2"/><path d="M3.5 10h17M8 3v4M16 3v4"/></symbol>
|
|
29
|
+
<symbol id="sort" viewBox="0 0 24 24"><path d="M7 4v16M3.5 16.5 7 20l3.5-3.5M17 20V4M13.5 7.5 17 4l3.5 3.5"/></symbol>
|
|
30
|
+
</svg>
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<meta name="dsh-design" content="desktop">
|
|
7
|
+
<title>总览 · 小账本</title>
|
|
8
|
+
<link rel="stylesheet" href="tokens.css">
|
|
9
|
+
<link rel="stylesheet" href="app.css">
|
|
10
|
+
<style>
|
|
11
|
+
.content { flex: 1; overflow: auto; padding: var(--space-5); display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); grid-auto-rows: min-content; gap: var(--space-4); align-content: start; }
|
|
12
|
+
.kpi { grid-column: span 3; padding: var(--space-4); display: flex; flex-direction: column; gap: 6px; }
|
|
13
|
+
.kpi .lb { display: flex; align-items: center; gap: 6px; color: var(--muted); }
|
|
14
|
+
.kpi .v { font-size: var(--fs-xl); font-weight: 600; line-height: 1.15; letter-spacing: -.01em; white-space: nowrap; }
|
|
15
|
+
.kpi .v small { font-size: var(--fs-lg); font-weight: 500; margin-left: 1px; }
|
|
16
|
+
.kpi .d { display: flex; align-items: center; gap: 6px; color: var(--muted); font-size: var(--fs-sm); white-space: nowrap; }
|
|
17
|
+
.kpi .d .tag { height: 18px; padding: 0 4px; gap: 1px; }
|
|
18
|
+
.kpi .d .tag svg { width: 12px; height: 12px; stroke-width: 2.25; }
|
|
19
|
+
.mix { grid-column: span 5; }
|
|
20
|
+
.daily { grid-column: span 7; display: flex; flex-direction: column; }
|
|
21
|
+
.budget { grid-column: span 5; }
|
|
22
|
+
.recent { grid-column: span 7; }
|
|
23
|
+
|
|
24
|
+
.mix-body { display: flex; align-items: center; gap: var(--space-5); padding: 4px var(--space-4) var(--space-4); }
|
|
25
|
+
.donut { position: relative; width: 160px; height: 160px; flex: none; }
|
|
26
|
+
.donut svg { width: 160px; height: 160px; transform: rotate(-90deg); }
|
|
27
|
+
.donut circle { fill: none; stroke-width: 18; }
|
|
28
|
+
.donut .c { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; }
|
|
29
|
+
.donut .c b { font-size: var(--fs-lg); font-weight: 600; }
|
|
30
|
+
.donut .c span { font-size: var(--fs-sm); color: var(--muted); }
|
|
31
|
+
.legend { list-style: none; margin: 0; padding: 0; flex: 1; min-width: 0; display: flex; flex-direction: column; }
|
|
32
|
+
.legend li { display: flex; align-items: center; gap: var(--space-2); height: 28px; border-bottom: 1px solid var(--line); }
|
|
33
|
+
.legend li:last-child { border-bottom: 0; }
|
|
34
|
+
.legend .nm { flex: 1; white-space: nowrap; }
|
|
35
|
+
.legend .amt { width: 84px; text-align: right; }
|
|
36
|
+
.legend .pc { width: 48px; text-align: right; color: var(--muted); }
|
|
37
|
+
|
|
38
|
+
.seg { display: inline-flex; padding: 2px; background: var(--bg); border: 1px solid var(--line); border-radius: var(--radius-sm); margin-left: auto; }
|
|
39
|
+
.seg span { height: 22px; padding: 0 10px; display: inline-flex; align-items: center; border-radius: var(--radius-xs); color: var(--muted); font-size: var(--fs-sm); white-space: nowrap; }
|
|
40
|
+
.seg .on { background: var(--surface); color: var(--text); font-weight: 500; box-shadow: var(--shadow); }
|
|
41
|
+
.chart { position: relative; flex: 1; min-height: 168px; margin: 0 var(--space-4) 0 56px; }
|
|
42
|
+
.grid-l { position: absolute; left: 0; right: 0; border-top: 1px solid var(--line); }
|
|
43
|
+
.grid-l span { position: absolute; right: calc(100% + 8px); top: -9px; font-size: var(--fs-sm); color: var(--muted); white-space: nowrap; }
|
|
44
|
+
.grid-l.ref { border-top: 1px dashed var(--muted); }
|
|
45
|
+
.grid-l.ref em { position: absolute; right: 0; top: -20px; font-style: normal; font-size: var(--fs-sm); color: var(--muted); background: var(--surface); padding: 0 0 0 6px; white-space: nowrap; }
|
|
46
|
+
.bars { position: absolute; inset: 0; display: flex; align-items: flex-end; gap: 4px; }
|
|
47
|
+
.b { position: relative; flex: 1; height: 100%; display: flex; align-items: flex-end; justify-content: center; }
|
|
48
|
+
.b i { display: block; width: 100%; max-width: 12px; background: var(--primary); opacity: .78; border-radius: 4px 4px 0 0; transition: opacity .15s var(--ease); }
|
|
49
|
+
.b:hover i { opacity: 1; }
|
|
50
|
+
.b.top i { opacity: 1; }
|
|
51
|
+
.b.future i { background: transparent; border: 1px dashed #B8C2D1; border-bottom: 0; opacity: 1; }
|
|
52
|
+
.b em { position: absolute; bottom: calc(92.8% + 4px); font-style: normal; font-size: var(--fs-sm); font-weight: 600; white-space: nowrap; }
|
|
53
|
+
.xaxis { position: relative; height: 18px; margin: 6px var(--space-4) var(--space-3) 56px; font-size: var(--fs-sm); color: var(--muted); }
|
|
54
|
+
.xaxis span { position: absolute; top: 0; width: 0; display: flex; justify-content: center; white-space: nowrap; }
|
|
55
|
+
|
|
56
|
+
.btotal { padding: 0 var(--space-4) var(--space-3); }
|
|
57
|
+
.btotal .row { display: flex; align-items: baseline; gap: var(--space-2); margin-bottom: 6px; white-space: nowrap; }
|
|
58
|
+
.btotal .row b { font-size: var(--fs-lg); font-weight: 600; }
|
|
59
|
+
.btotal .row .r { margin-left: auto; color: var(--muted); white-space: nowrap; }
|
|
60
|
+
.btotal .bar { height: 8px; }
|
|
61
|
+
.bar { flex: 1; height: 6px; border-radius: 999px; background: var(--track); overflow: hidden; min-width: 40px; }
|
|
62
|
+
.bar i { display: block; height: 100%; border-radius: 999px; }
|
|
63
|
+
.blist { list-style: none; margin: 0; padding: 0 var(--space-4) var(--space-3); border-top: 1px solid var(--line); padding-top: var(--space-2); }
|
|
64
|
+
.blist li { display: flex; align-items: center; gap: var(--space-3); height: 30px; }
|
|
65
|
+
.blist .nm { width: 52px; display: flex; align-items: center; gap: 6px; white-space: nowrap; }
|
|
66
|
+
.blist .val { width: 132px; text-align: right; }
|
|
67
|
+
.blist .pc { width: 72px; text-align: right; color: var(--muted); }
|
|
68
|
+
.blist .tag { width: 72px; justify-content: center; }
|
|
69
|
+
|
|
70
|
+
.rlist { border-top: 1px solid var(--line); }
|
|
71
|
+
.r { display: grid; grid-template-columns: 108px 72px minmax(0, 1fr) 48px 96px; align-items: center; gap: var(--space-3); height: 40px; padding: 0 var(--space-4); border-bottom: 1px solid var(--line); transition: background .15s var(--ease); }
|
|
72
|
+
.r:last-child { border-bottom: 0; }
|
|
73
|
+
.r:hover { background: var(--hover); }
|
|
74
|
+
.r .when { display: flex; gap: 6px; white-space: nowrap; }
|
|
75
|
+
.r .cat { display: flex; align-items: center; gap: 6px; white-space: nowrap; }
|
|
76
|
+
.r .note { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
77
|
+
.r .amt { text-align: right; font-weight: 600; }
|
|
78
|
+
.kpi .d { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
79
|
+
@media (max-width: 1200px) {
|
|
80
|
+
.kpi { grid-column: span 6; }
|
|
81
|
+
.mix, .daily, .budget, .recent { grid-column: span 12; }
|
|
82
|
+
}
|
|
83
|
+
</style>
|
|
84
|
+
</head>
|
|
85
|
+
<body>
|
|
86
|
+
<div class="win">
|
|
87
|
+
<aside class="side" aria-label="侧栏">
|
|
88
|
+
<div class="brand"><span class="logo"><svg class="i" aria-hidden="true"><use href="icons.svg#book"></use></svg></span><b>小账本</b><span class="book">日常<svg class="i" style="width:12px;height:12px" aria-hidden="true"><use href="icons.svg#down"></use></svg></span></div>
|
|
89
|
+
<nav class="nav" aria-label="主导航">
|
|
90
|
+
<a href="overview.html" class="on"><svg class="i" aria-hidden="true"><use href="icons.svg#overview"></use></svg>总览</a>
|
|
91
|
+
<a href="entries.html" class=""><svg class="i" aria-hidden="true"><use href="icons.svg#list"></use></svg>流水<span class="count num">86</span></a>
|
|
92
|
+
<span class="item"><svg class="i" aria-hidden="true"><use href="icons.svg#budget"></use></svg>预算<span class="flag"><i class="dot" style="background:var(--danger);width:6px;height:6px"></i>1 项超支</span></span>
|
|
93
|
+
<span class="item"><svg class="i" aria-hidden="true"><use href="icons.svg#report"></use></svg>报表</span>
|
|
94
|
+
</nav>
|
|
95
|
+
<h3>账户</h3>
|
|
96
|
+
<div class="acct"><svg class="i" aria-hidden="true"><use href="icons.svg#cash"></use></svg>现金<span class="num">¥1,286.40</span></div>
|
|
97
|
+
<div class="acct"><svg class="i" aria-hidden="true"><use href="icons.svg#save"></use></svg>储蓄<span class="num">¥48,200.00</span></div>
|
|
98
|
+
<div class="acct"><svg class="i" aria-hidden="true"><use href="icons.svg#credit"></use></svg>信用<span class="num">−¥3,412.80</span></div>
|
|
99
|
+
<div class="net"><span>净资产</span><b class="num">¥46,073.60</b></div>
|
|
100
|
+
<h3>常用分类</h3>
|
|
101
|
+
<div class="nav">
|
|
102
|
+
<span class="item"><i class="dot" style="background:var(--cat-food)"></i>餐饮</span>
|
|
103
|
+
<span class="item"><i class="dot" style="background:var(--cat-shopping)"></i>购物</span>
|
|
104
|
+
<span class="item"><i class="dot" style="background:var(--cat-transit)"></i>交通</span>
|
|
105
|
+
<span class="item"><i class="dot" style="background:var(--cat-fun)"></i>娱乐</span>
|
|
106
|
+
</div>
|
|
107
|
+
<div class="side-foot"><i class="ok"></i>本地已保存 · 刚刚<span class="gear" title="设置"><svg class="i" aria-hidden="true"><use href="icons.svg#gear"></use></svg></span></div>
|
|
108
|
+
</aside>
|
|
109
|
+
<div class="main">
|
|
110
|
+
<header class="toolbar">
|
|
111
|
+
<h1>总览</h1>
|
|
112
|
+
<div class="month">
|
|
113
|
+
<button class="ib" aria-label="上个月"><svg class="i" aria-hidden="true"><use href="icons.svg#left"></use></svg></button>
|
|
114
|
+
<b>2026 年 10 月</b>
|
|
115
|
+
<button class="ib" aria-label="下个月"><svg class="i" aria-hidden="true"><use href="icons.svg#right"></use></svg></button>
|
|
116
|
+
</div>
|
|
117
|
+
<span class="tag">还剩 3 天</span>
|
|
118
|
+
<div class="spacer"></div>
|
|
119
|
+
<div class="search"><svg class="i" aria-hidden="true"><use href="icons.svg#search"></use></svg><span>搜索流水</span><kbd>⌘F</kbd></div>
|
|
120
|
+
<button class="btn primary"><svg class="i" aria-hidden="true"><use href="icons.svg#plus"></use></svg>记一笔<kbd>⌘N</kbd></button>
|
|
121
|
+
</header>
|
|
122
|
+
<main class="content">
|
|
123
|
+
<section class="card kpi">
|
|
124
|
+
<span class="lb">本月支出</span>
|
|
125
|
+
<span class="v num">¥9,327<small>.50</small></span>
|
|
126
|
+
<span class="d"><span class="tag good"><svg class="i" aria-hidden="true"><use href="icons.svg#dn"></use></svg>8.4%</span>比 9 月少花 ¥855.40</span>
|
|
127
|
+
</section>
|
|
128
|
+
<section class="card kpi">
|
|
129
|
+
<span class="lb">本月收入</span>
|
|
130
|
+
<span class="v num">¥18,640<small>.00</small></span>
|
|
131
|
+
<span class="d"><span class="tag good"><svg class="i" aria-hidden="true"><use href="icons.svg#up"></use></svg>3.2%</span>工资、稿费、理财收益</span>
|
|
132
|
+
</section>
|
|
133
|
+
<section class="card kpi">
|
|
134
|
+
<span class="lb">结余</span>
|
|
135
|
+
<span class="v num">¥9,312<small>.50</small></span>
|
|
136
|
+
<span class="d"><span class="tag">存下 50.0%</span>比 9 月多 ¥1,433.40</span>
|
|
137
|
+
</section>
|
|
138
|
+
<section class="card kpi">
|
|
139
|
+
<span class="lb">日均还能花</span>
|
|
140
|
+
<span class="v num">¥390<small>.83</small></span>
|
|
141
|
+
<span class="d">预算剩 ¥1,172.50 · 3 天</span>
|
|
142
|
+
</section>
|
|
143
|
+
|
|
144
|
+
<section class="card mix">
|
|
145
|
+
<div class="card-h"><h2>支出构成</h2><span class="muted">按分类</span></div>
|
|
146
|
+
<div class="mix-body">
|
|
147
|
+
<div class="donut"><svg viewBox="0 0 160 160" role="img" aria-label="10 月支出按分类:住房 40.7%,餐饮 23.0%,购物 18.1%,交通 6.9%,娱乐 6.3%,其他 5.0%"><circle cx="80" cy="80" r="60" stroke="var(--cat-housing)" stroke-dasharray="151.59 225.41" stroke-dashoffset="0.00"/><circle cx="80" cy="80" r="60" stroke="var(--cat-food)" stroke-dasharray="84.84 292.15" stroke-dashoffset="-153.59"/><circle cx="80" cy="80" r="60" stroke="var(--cat-shopping)" stroke-dasharray="66.07 310.92" stroke-dashoffset="-240.43"/><circle cx="80" cy="80" r="60" stroke="var(--cat-transit)" stroke-dasharray="23.98 353.01" stroke-dashoffset="-308.50"/><circle cx="80" cy="80" r="60" stroke="var(--cat-fun)" stroke-dasharray="21.68 355.31" stroke-dashoffset="-334.48"/><circle cx="80" cy="80" r="60" stroke="var(--cat-other)" stroke-dasharray="16.83 360.16" stroke-dashoffset="-358.16"/></svg><div class="c"><b class="num">¥9,327.50</b><span>6 个分类</span></div></div>
|
|
148
|
+
<ul class="legend"><li><i class="dot" style="background:var(--cat-housing)"></i><span class="nm">住房</span><span class="num amt">¥3,800.00</span><span class="num pc">40.7%</span></li><li><i class="dot" style="background:var(--cat-food)"></i><span class="nm">餐饮</span><span class="num amt">¥2,148.60</span><span class="num pc">23.0%</span></li><li><i class="dot" style="background:var(--cat-shopping)"></i><span class="nm">购物</span><span class="num amt">¥1,684.30</span><span class="num pc">18.1%</span></li><li><i class="dot" style="background:var(--cat-transit)"></i><span class="nm">交通</span><span class="num amt">¥642.80</span><span class="num pc">6.9%</span></li><li><i class="dot" style="background:var(--cat-fun)"></i><span class="nm">娱乐</span><span class="num amt">¥586.00</span><span class="num pc">6.3%</span></li><li><i class="dot" style="background:var(--cat-other)"></i><span class="nm">其他</span><span class="num amt">¥465.80</span><span class="num pc">5.0%</span></li></ul>
|
|
149
|
+
</div>
|
|
150
|
+
</section>
|
|
151
|
+
|
|
152
|
+
<section class="card daily">
|
|
153
|
+
<div class="card-h"><h2>每日支出</h2><span class="muted">不含房租</span><span class="seg"><span class="on">日</span><span>周</span><span>月</span></span></div>
|
|
154
|
+
<div class="chart" role="img" aria-label="10 月每日支出柱状图,最高 10 月 27 日 ¥649.50">
|
|
155
|
+
<div class="grid-l" style="bottom:85.7%"><span>600</span></div>
|
|
156
|
+
<div class="grid-l" style="bottom:57.1%"><span>400</span></div>
|
|
157
|
+
<div class="grid-l ref" style="bottom:30.9%"><span>216</span><em>日均预算</em></div>
|
|
158
|
+
<div class="grid-l" style="bottom:0"><span>0</span></div>
|
|
159
|
+
<div class="bars"><div class="b" title="10月1日 ¥342.00"><i style="height:48.9%"></i></div><div class="b" title="10月2日 ¥438.00"><i style="height:62.6%"></i></div><div class="b" title="10月3日 ¥356.00"><i style="height:50.9%"></i></div><div class="b" title="10月4日 ¥262.00"><i style="height:37.4%"></i></div><div class="b" title="10月5日 ¥298.00"><i style="height:42.6%"></i></div><div class="b" title="10月6日 ¥188.00"><i style="height:26.9%"></i></div><div class="b" title="10月7日 ¥142.00"><i style="height:20.3%"></i></div><div class="b" title="10月8日 ¥96.00"><i style="height:13.7%"></i></div><div class="b" title="10月9日 ¥132.00"><i style="height:18.9%"></i></div><div class="b" title="10月10日 ¥188.10"><i style="height:26.9%"></i></div><div class="b" title="10月11日 ¥226.00"><i style="height:32.3%"></i></div><div class="b" title="10月12日 ¥84.00"><i style="height:12.0%"></i></div><div class="b" title="10月13日 ¥118.00"><i style="height:16.9%"></i></div><div class="b" title="10月14日 ¥76.00"><i style="height:10.9%"></i></div><div class="b" title="10月15日 ¥162.00"><i style="height:23.1%"></i></div><div class="b" title="10月16日 ¥128.00"><i style="height:18.3%"></i></div><div class="b" title="10月17日 ¥198.00"><i style="height:28.3%"></i></div><div class="b" title="10月18日 ¥184.00"><i style="height:26.3%"></i></div><div class="b" title="10月19日 ¥72.00"><i style="height:10.3%"></i></div><div class="b" title="10月20日 ¥98.00"><i style="height:14.0%"></i></div><div class="b" title="10月21日 ¥136.00"><i style="height:19.4%"></i></div><div class="b" title="10月22日 ¥88.00"><i style="height:12.6%"></i></div><div class="b" title="10月23日 ¥154.00"><i style="height:22.0%"></i></div><div class="b" title="10月24日 ¥212.00"><i style="height:30.3%"></i></div><div class="b" title="10月25日 ¥268.90"><i style="height:38.4%"></i></div><div class="b" title="10月26日 ¥167.00"><i style="height:23.9%"></i></div><div class="b top" title="10月27日 ¥649.50"><i style="height:92.8%"></i><em class="num">¥649.50</em></div><div class="b" title="10月28日 ¥64.00"><i style="height:9.1%"></i></div><div class="b future" title="10月29日"><i style="height:10%"></i></div><div class="b future" title="10月30日"><i style="height:10%"></i></div><div class="b future" title="10月31日"><i style="height:10%"></i></div></div>
|
|
160
|
+
</div>
|
|
161
|
+
<div class="xaxis"><span style="left:1.61%">1日</span><span style="left:24.19%">8日</span><span style="left:46.77%">15日</span><span style="left:69.35%">22日</span><span style="left:91.94%">29日</span></div>
|
|
162
|
+
</section>
|
|
163
|
+
|
|
164
|
+
<section class="card budget">
|
|
165
|
+
<div class="card-h"><h2>预算</h2><span class="tag warn">购物超支</span><span class="muted" style="margin-left:auto">月预算 ¥10,500</span></div>
|
|
166
|
+
<div class="btotal">
|
|
167
|
+
<div class="row"><b class="num">88.8%</b><span class="muted">已用 ¥9,327.50</span><span class="r num">剩 ¥1,172.50</span></div>
|
|
168
|
+
<div class="bar"><i style="width:88.8%;background:var(--primary)"></i></div>
|
|
169
|
+
</div>
|
|
170
|
+
<ul class="blist"><li><span class="nm"><i class="dot" style="background:var(--cat-housing)"></i>住房</span><span class="bar"><i style="width:100.0%;background:var(--cat-housing)"></i></span><span class="num val">3,800.00<span class="muted"> / 3,800</span></span><span class="num pc">100%</span></li><li><span class="nm"><i class="dot" style="background:var(--cat-food)"></i>餐饮</span><span class="bar"><i style="width:85.9%;background:var(--cat-food)"></i></span><span class="num val">2,148.60<span class="muted"> / 2,500</span></span><span class="num pc">86%</span></li><li class="over"><span class="nm"><i class="dot" style="background:var(--cat-shopping)"></i>购物</span><span class="bar"><i style="width:100.0%;background:var(--danger)"></i></span><span class="num val">1,684.30<span class="muted"> / 1,500</span></span><span class="tag warn">超 ¥184.30</span></li><li><span class="nm"><i class="dot" style="background:var(--cat-transit)"></i>交通</span><span class="bar"><i style="width:71.4%;background:var(--cat-transit)"></i></span><span class="num val">642.80<span class="muted"> / 900</span></span><span class="num pc">71%</span></li><li><span class="nm"><i class="dot" style="background:var(--cat-fun)"></i>娱乐</span><span class="bar"><i style="width:73.3%;background:var(--cat-fun)"></i></span><span class="num val">586.00<span class="muted"> / 800</span></span><span class="num pc">73%</span></li><li><span class="nm"><i class="dot" style="background:var(--cat-other)"></i>其他</span><span class="bar"><i style="width:46.6%;background:var(--cat-other)"></i></span><span class="num val">465.80<span class="muted"> / 1,000</span></span><span class="num pc">47%</span></li></ul>
|
|
171
|
+
</section>
|
|
172
|
+
|
|
173
|
+
<section class="card recent">
|
|
174
|
+
<div class="card-h"><h2>最近几笔</h2><a class="more" href="entries.html">全部流水<svg class="i" style="width:14px;height:14px" aria-hidden="true"><use href="icons.svg#right"></use></svg></a></div>
|
|
175
|
+
<div class="rlist"><a class="r" href="entries.html"><span class="when"><span>10月28日</span><span class="muted num">18:52</span></span><span class="cat"><i class="dot" style="background:var(--cat-food)"></i>餐饮</span><span class="note">晚饭 · 楼下沙县</span><span class="acc muted">信用</span><span class="num amt">−¥28.00</span></a><a class="r" href="entries.html"><span class="when"><span>10月28日</span><span class="muted num">12:36</span></span><span class="cat"><i class="dot" style="background:var(--cat-food)"></i>餐饮</span><span class="note">午饭 · 牛肉粉</span><span class="acc muted">信用</span><span class="num amt">−¥32.00</span></a><a class="r" href="entries.html"><span class="when"><span>10月28日</span><span class="muted num">08:15</span></span><span class="cat"><i class="dot" style="background:var(--cat-transit)"></i>交通</span><span class="note">地铁</span><span class="acc muted">储蓄</span><span class="num amt">−¥4.00</span></a><a class="r" href="entries.html"><span class="when"><span>10月27日</span><span class="muted num">21:04</span></span><span class="cat"><i class="dot" style="background:var(--cat-shopping)"></i>购物</span><span class="note">冬季被子</span><span class="acc muted">信用</span><span class="num amt">−¥459.00</span></a><a class="r" href="entries.html"><span class="when"><span>10月27日</span><span class="muted num">19:30</span></span><span class="cat"><i class="dot" style="background:var(--cat-food)"></i>餐饮</span><span class="note">和小林吃火锅</span><span class="acc muted">信用</span><span class="num amt">−¥186.50</span></a><a class="r" href="entries.html"><span class="when"><span>10月27日</span><span class="muted num">15:10</span></span><span class="cat"><i class="dot" style="background:var(--accent)"></i>收入</span><span class="note">稿费 · 十月专栏</span><span class="acc muted">储蓄</span><span class="num amt in">+¥1,200.00</span></a></div>
|
|
176
|
+
</section>
|
|
177
|
+
</main>
|
|
178
|
+
</div>
|
|
179
|
+
</div>
|
|
180
|
+
</body>
|
|
181
|
+
</html>
|