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,92 @@
|
|
|
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="slides">
|
|
7
|
+
<title>四个节点 · 青禾年度回顾</title>
|
|
8
|
+
<link rel="stylesheet" href="tokens.css">
|
|
9
|
+
<link rel="stylesheet" href="deck.css">
|
|
10
|
+
<style>
|
|
11
|
+
.line {
|
|
12
|
+
position: absolute;
|
|
13
|
+
top: 400px;
|
|
14
|
+
left: var(--margin);
|
|
15
|
+
width: 1152px;
|
|
16
|
+
height: var(--rule);
|
|
17
|
+
background: var(--color-line);
|
|
18
|
+
}
|
|
19
|
+
.events {
|
|
20
|
+
position: absolute;
|
|
21
|
+
top: 272px;
|
|
22
|
+
left: var(--margin);
|
|
23
|
+
width: 1152px;
|
|
24
|
+
}
|
|
25
|
+
.ev { grid-column: span 3; position: relative; }
|
|
26
|
+
.ev .mo { font-size: 104px; height: 104px; }
|
|
27
|
+
.ev .mo small { font-size: var(--text-body); font-weight: 700; letter-spacing: 0; margin-left: 4px; }
|
|
28
|
+
.ev .dot {
|
|
29
|
+
position: absolute;
|
|
30
|
+
top: 116px;
|
|
31
|
+
left: 0;
|
|
32
|
+
width: 32px;
|
|
33
|
+
height: 32px;
|
|
34
|
+
background: var(--color-line);
|
|
35
|
+
}
|
|
36
|
+
.ev h2 { margin-top: 80px; font-size: var(--text-sub); font-weight: 700; line-height: 1.25; letter-spacing: -0.01em; }
|
|
37
|
+
.ev .desc { margin-top: 12px; width: 270px; font-size: var(--text-small); line-height: 1.5; color: var(--color-muted); }
|
|
38
|
+
.ev.hl .mo, .ev.hl h2 { color: var(--color-primary); }
|
|
39
|
+
.ev.hl .dot { background: var(--color-primary); }
|
|
40
|
+
.foot {
|
|
41
|
+
position: absolute;
|
|
42
|
+
left: var(--margin);
|
|
43
|
+
bottom: var(--margin);
|
|
44
|
+
font-size: var(--text-note);
|
|
45
|
+
line-height: 20px;
|
|
46
|
+
color: var(--color-muted);
|
|
47
|
+
}
|
|
48
|
+
</style>
|
|
49
|
+
</head>
|
|
50
|
+
<body>
|
|
51
|
+
<main class="slide">
|
|
52
|
+
<header class="top grid">
|
|
53
|
+
<span class="brand">青禾植物</span>
|
|
54
|
+
<span class="deck">2026 年度回顾</span>
|
|
55
|
+
<span class="sec">03 — 关键节点</span>
|
|
56
|
+
<a class="pg" href="05-next.html">04 / 06</a>
|
|
57
|
+
</header>
|
|
58
|
+
|
|
59
|
+
<h1 class="title">从 3 家店到 7 家,靠的是这四步</h1>
|
|
60
|
+
|
|
61
|
+
<div class="line" aria-hidden="true"></div>
|
|
62
|
+
<ol class="events grid">
|
|
63
|
+
<li class="ev">
|
|
64
|
+
<p class="mo num">03<small>月</small></p>
|
|
65
|
+
<span class="dot" aria-hidden="true"></span>
|
|
66
|
+
<h2>滨江店开业</h2>
|
|
67
|
+
<p class="desc">第 4 家店,<br>开业第一个月就打平</p>
|
|
68
|
+
</li>
|
|
69
|
+
<li class="ev">
|
|
70
|
+
<p class="mo num">05<small>月</small></p>
|
|
71
|
+
<span class="dot" aria-hidden="true"></span>
|
|
72
|
+
<h2>线上商城上线</h2>
|
|
73
|
+
<p class="desc">首月 2,300 单,<br>三成来自老会员</p>
|
|
74
|
+
</li>
|
|
75
|
+
<li class="ev hl">
|
|
76
|
+
<p class="mo num">08<small>月</small></p>
|
|
77
|
+
<span class="dot" aria-hidden="true"></span>
|
|
78
|
+
<h2>育苗温室投用</h2>
|
|
79
|
+
<p class="desc">1,200 平米温室,<br>自育绿植占到 40%</p>
|
|
80
|
+
</li>
|
|
81
|
+
<li class="ev">
|
|
82
|
+
<p class="mo num">11<small>月</small></p>
|
|
83
|
+
<span class="dot" aria-hidden="true"></span>
|
|
84
|
+
<h2>第 7 家店开业</h2>
|
|
85
|
+
<p class="desc">城东社区店,<br>全年第 4 家新店</p>
|
|
86
|
+
</li>
|
|
87
|
+
</ol>
|
|
88
|
+
|
|
89
|
+
<p class="foot">门店开业时间按首个营业日计</p>
|
|
90
|
+
</main>
|
|
91
|
+
</body>
|
|
92
|
+
</html>
|
|
@@ -0,0 +1,99 @@
|
|
|
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="slides">
|
|
7
|
+
<title>明年三件事 · 青禾年度回顾</title>
|
|
8
|
+
<link rel="stylesheet" href="tokens.css">
|
|
9
|
+
<link rel="stylesheet" href="deck.css">
|
|
10
|
+
<style>
|
|
11
|
+
.block {
|
|
12
|
+
position: absolute;
|
|
13
|
+
top: 128px;
|
|
14
|
+
left: 0;
|
|
15
|
+
width: 432px;
|
|
16
|
+
bottom: 0;
|
|
17
|
+
padding: 16px 24px 0 var(--margin);
|
|
18
|
+
background: var(--color-primary);
|
|
19
|
+
color: var(--color-on-primary);
|
|
20
|
+
}
|
|
21
|
+
.block h1 {
|
|
22
|
+
font-size: var(--text-title);
|
|
23
|
+
font-weight: var(--weight-head);
|
|
24
|
+
line-height: 1.15;
|
|
25
|
+
letter-spacing: -0.02em;
|
|
26
|
+
}
|
|
27
|
+
.block .goal {
|
|
28
|
+
position: absolute;
|
|
29
|
+
left: var(--margin);
|
|
30
|
+
bottom: var(--margin);
|
|
31
|
+
}
|
|
32
|
+
.block .goal .k { font-size: var(--text-small); font-weight: 700; line-height: 24px; }
|
|
33
|
+
.block .goal .num { margin-top: 12px; font-size: var(--text-title); }
|
|
34
|
+
.block .goal .d { margin-top: 12px; font-size: var(--text-small); line-height: 24px; }
|
|
35
|
+
|
|
36
|
+
.todo {
|
|
37
|
+
position: absolute;
|
|
38
|
+
top: 144px;
|
|
39
|
+
left: 456px;
|
|
40
|
+
width: 760px;
|
|
41
|
+
}
|
|
42
|
+
.todo li {
|
|
43
|
+
display: grid;
|
|
44
|
+
grid-template-columns: 172px 564px;
|
|
45
|
+
column-gap: var(--gutter);
|
|
46
|
+
height: 168px;
|
|
47
|
+
padding-top: 20px;
|
|
48
|
+
border-top: var(--rule-mid) solid var(--color-line);
|
|
49
|
+
}
|
|
50
|
+
.todo li:first-child { border-top-width: var(--rule); padding-top: 16px; }
|
|
51
|
+
.todo .n { font-size: 72px; }
|
|
52
|
+
.todo h2 { font-size: var(--text-sub); font-weight: 700; line-height: 1.25; letter-spacing: -0.01em; padding-top: 6px; }
|
|
53
|
+
.todo .desc { margin-top: 8px; font-size: var(--text-body); line-height: 1.45; color: var(--color-muted); }
|
|
54
|
+
</style>
|
|
55
|
+
</head>
|
|
56
|
+
<body>
|
|
57
|
+
<main class="slide">
|
|
58
|
+
<header class="top grid">
|
|
59
|
+
<span class="brand">青禾植物</span>
|
|
60
|
+
<span class="deck">2026 年度回顾</span>
|
|
61
|
+
<span class="sec">04 — 2027 计划</span>
|
|
62
|
+
<a class="pg" href="06-thanks.html">05 / 06</a>
|
|
63
|
+
</header>
|
|
64
|
+
|
|
65
|
+
<aside class="block">
|
|
66
|
+
<h1>2027 年,<br>只做三件事</h1>
|
|
67
|
+
<div class="goal">
|
|
68
|
+
<p class="k">全年营收目标 · 万元</p>
|
|
69
|
+
<p class="num">2,800</p>
|
|
70
|
+
<p class="d">比今年多 51%</p>
|
|
71
|
+
</div>
|
|
72
|
+
</aside>
|
|
73
|
+
|
|
74
|
+
<ol class="todo">
|
|
75
|
+
<li>
|
|
76
|
+
<p class="n num">01</p>
|
|
77
|
+
<div>
|
|
78
|
+
<h2>门店开到 12 家</h2>
|
|
79
|
+
<p class="desc">新开 5 家社区店,每家 3 公里内要有 2 万户住户</p>
|
|
80
|
+
</div>
|
|
81
|
+
</li>
|
|
82
|
+
<li>
|
|
83
|
+
<p class="n num">02</p>
|
|
84
|
+
<div>
|
|
85
|
+
<h2>会员复购率做到 55%</h2>
|
|
86
|
+
<p class="desc">上线养护提醒和上门换盆,让会员每个季度回店一次</p>
|
|
87
|
+
</div>
|
|
88
|
+
</li>
|
|
89
|
+
<li>
|
|
90
|
+
<p class="n num">03</p>
|
|
91
|
+
<div>
|
|
92
|
+
<h2>自育绿植占到 60%</h2>
|
|
93
|
+
<p class="desc">温室扩到 3,000 平米,毛利率再提高 6 个点</p>
|
|
94
|
+
</div>
|
|
95
|
+
</li>
|
|
96
|
+
</ol>
|
|
97
|
+
</main>
|
|
98
|
+
</body>
|
|
99
|
+
</html>
|
|
@@ -0,0 +1,61 @@
|
|
|
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="slides">
|
|
7
|
+
<title>谢谢 · 青禾年度回顾</title>
|
|
8
|
+
<link rel="stylesheet" href="tokens.css">
|
|
9
|
+
<link rel="stylesheet" href="deck.css">
|
|
10
|
+
<style>
|
|
11
|
+
body { background: var(--color-primary); color: var(--color-on-primary); }
|
|
12
|
+
.top { border-top-color: var(--color-on-primary); }
|
|
13
|
+
.top .pg:hover { color: var(--color-on-primary); text-decoration: underline; }
|
|
14
|
+
.hero {
|
|
15
|
+
position: absolute;
|
|
16
|
+
top: 160px;
|
|
17
|
+
left: 56px;
|
|
18
|
+
font-size: 200px;
|
|
19
|
+
font-weight: var(--weight-head);
|
|
20
|
+
line-height: 1;
|
|
21
|
+
letter-spacing: -0.05em;
|
|
22
|
+
}
|
|
23
|
+
.sub {
|
|
24
|
+
position: absolute;
|
|
25
|
+
top: 392px;
|
|
26
|
+
left: var(--margin);
|
|
27
|
+
font-size: var(--text-sub);
|
|
28
|
+
line-height: 1.3;
|
|
29
|
+
}
|
|
30
|
+
.info {
|
|
31
|
+
position: absolute;
|
|
32
|
+
left: var(--margin);
|
|
33
|
+
bottom: var(--margin);
|
|
34
|
+
width: 1152px;
|
|
35
|
+
}
|
|
36
|
+
.info div { grid-column: span 4; border-top: var(--rule-thin) solid var(--color-on-primary); padding-top: 12px; }
|
|
37
|
+
.info dt { font-size: var(--text-note); line-height: 20px; }
|
|
38
|
+
.info dt b { display: inline-block; width: 40px; }
|
|
39
|
+
.info dd { margin-top: 8px; font-size: var(--text-body); font-weight: 700; line-height: 1.35; }
|
|
40
|
+
</style>
|
|
41
|
+
</head>
|
|
42
|
+
<body>
|
|
43
|
+
<main class="slide">
|
|
44
|
+
<header class="top grid">
|
|
45
|
+
<span class="brand">青禾植物</span>
|
|
46
|
+
<span class="deck">2026 年度回顾</span>
|
|
47
|
+
<span class="sec">05 — 问答</span>
|
|
48
|
+
<a class="pg" href="01-cover.html">06 / 06</a>
|
|
49
|
+
</header>
|
|
50
|
+
|
|
51
|
+
<h1 class="hero">谢谢大家</h1>
|
|
52
|
+
<p class="sub">接下来 15 分钟,欢迎提问。</p>
|
|
53
|
+
|
|
54
|
+
<dl class="info grid">
|
|
55
|
+
<div><dt><b>01</b>下一场</dt><dd>14:30 滨江店长分享<br>开店第一年怎么打平</dd></div>
|
|
56
|
+
<div><dt><b>02</b>会后资料</dt><dd>年会群文件<br>「2026 年度回顾」</dd></div>
|
|
57
|
+
<div><dt><b>03</b>茶歇</dt><dd>3 楼花房,<br>每人可带走一盆绿萝</dd></div>
|
|
58
|
+
</dl>
|
|
59
|
+
</main>
|
|
60
|
+
</body>
|
|
61
|
+
</html>
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
*, *::before, *::after { box-sizing: border-box; }
|
|
2
|
+
html, body { width: 1280px; height: 720px; margin: 0; overflow: hidden; }
|
|
3
|
+
body {
|
|
4
|
+
background: var(--color-bg);
|
|
5
|
+
color: var(--color-text);
|
|
6
|
+
font-family: var(--font-sans);
|
|
7
|
+
font-size: var(--text-body);
|
|
8
|
+
line-height: 1.5;
|
|
9
|
+
-webkit-font-smoothing: antialiased;
|
|
10
|
+
}
|
|
11
|
+
a { color: inherit; text-decoration: none; }
|
|
12
|
+
h1, h2, h3, p, ol, ul, dl, dd, figure { margin: 0; padding: 0; }
|
|
13
|
+
ol, ul { list-style: none; }
|
|
14
|
+
|
|
15
|
+
.slide { position: relative; width: 1280px; height: 720px; overflow: hidden; }
|
|
16
|
+
|
|
17
|
+
/* 12 栏:边距 64,栏宽 74,栏距 24 */
|
|
18
|
+
.grid {
|
|
19
|
+
display: grid;
|
|
20
|
+
grid-template-columns: repeat(12, var(--col));
|
|
21
|
+
column-gap: var(--gutter);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* 页眉:粗黑线 + 三段标签 + 页码 */
|
|
25
|
+
.top {
|
|
26
|
+
position: absolute;
|
|
27
|
+
top: var(--margin);
|
|
28
|
+
left: var(--margin);
|
|
29
|
+
width: 1152px;
|
|
30
|
+
padding-top: 12px;
|
|
31
|
+
border-top: var(--rule) solid var(--color-line);
|
|
32
|
+
font-size: var(--text-note);
|
|
33
|
+
line-height: 20px;
|
|
34
|
+
}
|
|
35
|
+
.top .brand { grid-column: 1 / 4; font-weight: 700; }
|
|
36
|
+
.top .deck { grid-column: 4 / 7; }
|
|
37
|
+
.top .sec { grid-column: 7 / 10; }
|
|
38
|
+
.top .pg { grid-column: 12 / 13; font-variant-numeric: tabular-nums; }
|
|
39
|
+
.top .pg:hover { color: var(--color-link); }
|
|
40
|
+
|
|
41
|
+
/* 标题位置每页一样 */
|
|
42
|
+
.title {
|
|
43
|
+
position: absolute;
|
|
44
|
+
top: 144px;
|
|
45
|
+
left: var(--margin);
|
|
46
|
+
max-width: 1054px;
|
|
47
|
+
font-size: var(--text-title);
|
|
48
|
+
font-weight: var(--weight-head);
|
|
49
|
+
line-height: 1.15;
|
|
50
|
+
letter-spacing: -0.02em;
|
|
51
|
+
}
|
|
52
|
+
.lede {
|
|
53
|
+
position: absolute;
|
|
54
|
+
top: 220px;
|
|
55
|
+
left: var(--margin);
|
|
56
|
+
color: var(--color-muted);
|
|
57
|
+
font-size: var(--text-body);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.num {
|
|
61
|
+
font-weight: var(--weight-head);
|
|
62
|
+
letter-spacing: -0.04em;
|
|
63
|
+
line-height: 1;
|
|
64
|
+
font-variant-numeric: tabular-nums;
|
|
65
|
+
}
|
|
66
|
+
.red { color: var(--color-primary); }
|
|
67
|
+
.muted { color: var(--color-muted); }
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": 1,
|
|
3
|
+
"type": "template",
|
|
4
|
+
"title": { "zh": "青禾年度回顾", "en": "Qinghe Year in Review" },
|
|
5
|
+
"description": {
|
|
6
|
+
"zh": "植物零售小公司的六页年终汇报:大数字、月度柱状图、时间线和明年计划,瑞士网格风格",
|
|
7
|
+
"en": "A six-slide year-end review for a small plant retailer: big numbers, a monthly bar chart, a timeline and next year's plan, in a Swiss grid style"
|
|
8
|
+
},
|
|
9
|
+
"kind": "slides",
|
|
10
|
+
"screens": [
|
|
11
|
+
{ "file": "01-cover.html", "title": { "zh": "封面", "en": "Cover" } },
|
|
12
|
+
{ "file": "02-highlights.html", "title": { "zh": "三个数字", "en": "Highlights" } },
|
|
13
|
+
{ "file": "03-growth.html", "title": { "zh": "月度营收", "en": "Monthly revenue" } },
|
|
14
|
+
{ "file": "04-milestones.html", "title": { "zh": "四个节点", "en": "Milestones" } },
|
|
15
|
+
{ "file": "05-next.html", "title": { "zh": "明年三件事", "en": "Next year" } },
|
|
16
|
+
{ "file": "06-thanks.html", "title": { "zh": "谢谢", "en": "Thanks" } }
|
|
17
|
+
],
|
|
18
|
+
"style": "swiss",
|
|
19
|
+
"categories": ["business"],
|
|
20
|
+
"tags": ["report", "chart"],
|
|
21
|
+
"lang": "zh",
|
|
22
|
+
"license": "CC0-1.0",
|
|
23
|
+
"author": { "login": "orderg-x", "id": 271418316 },
|
|
24
|
+
"ai": { "generated": true, "tool": "dsh-design-studio@0.11.0" }
|
|
25
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--color-bg: #FFFFFF;
|
|
3
|
+
--color-surface: #F1F1F1;
|
|
4
|
+
--color-text: #0A0A0A;
|
|
5
|
+
--color-muted: #545454;
|
|
6
|
+
--color-line: #0A0A0A;
|
|
7
|
+
--color-primary: #D9001B;
|
|
8
|
+
--color-on-primary: #FFFFFF;
|
|
9
|
+
--color-link: #C2001A;
|
|
10
|
+
--color-bar: #BDBDBD;
|
|
11
|
+
|
|
12
|
+
--font-sans: "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Microsoft YaHei", sans-serif;
|
|
13
|
+
--weight-head: 800;
|
|
14
|
+
|
|
15
|
+
--text-note: 16px;
|
|
16
|
+
--text-small: 20px;
|
|
17
|
+
--text-body: 24px;
|
|
18
|
+
--text-sub: 32px;
|
|
19
|
+
--text-title: 52px;
|
|
20
|
+
--text-num: 120px;
|
|
21
|
+
--text-hero: 136px;
|
|
22
|
+
|
|
23
|
+
--margin: 64px;
|
|
24
|
+
--col: 74px;
|
|
25
|
+
--gutter: 24px;
|
|
26
|
+
--rule: 8px;
|
|
27
|
+
--rule-mid: 4px;
|
|
28
|
+
--rule-thin: 2px;
|
|
29
|
+
--radius: 0;
|
|
30
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"format":1,"serial":2026110601,"generated":"2026-11-06T23:29:23.188Z","commit":"08e9e40834f9","policy":1,"minPlugin":"0.11.0","title":{"zh":"DSH 设计市场","en":"DSH Design Gallery"},"metadata":{"types":["template","system","style"],"kinds":["web","app","miniprogram","tablet","desktop","poster","slides","email"],"styles":["minimal","warm","editorial","dark","playful","fresh","tech","glass","soft","guochao","ink","cyber","cute","retro","sale","japandi","swiss","brutal","cream","sport"],"categories":[{"id":"food","zh":"餐饮","en":"Food & drink"},{"id":"retail","zh":"零售电商","en":"Retail & shop"},{"id":"saas","zh":"工具软件","en":"SaaS & tools"},{"id":"business","zh":"企业官网","en":"Business"},{"id":"education","zh":"教育学习","en":"Education"},{"id":"health","zh":"健康运动","en":"Health & fitness"},{"id":"travel","zh":"旅行出行","en":"Travel"},{"id":"media","zh":"内容资讯","en":"Media & news"},{"id":"social","zh":"社交社区","en":"Social & community"},{"id":"portfolio","zh":"作品集","en":"Portfolio"},{"id":"event","zh":"活动","en":"Events"},{"id":"finance","zh":"记账理财","en":"Personal finance"},{"id":"home","zh":"家居生活","en":"Home & living"},{"id":"kids","zh":"亲子","en":"Kids & family"},{"id":"pets","zh":"宠物","en":"Pets"},{"id":"game","zh":"游戏娱乐","en":"Games & fun"},{"id":"beauty","zh":"美业","en":"Beauty"},{"id":"nonprofit","zh":"公益","en":"Nonprofit"}],"tags":[{"id":"landing","zh":"落地页","en":"Landing"},{"id":"dashboard","zh":"仪表盘","en":"Dashboard"},{"id":"onboarding","zh":"引导页","en":"Onboarding"},{"id":"pricing","zh":"价格","en":"Pricing"},{"id":"checkout","zh":"结算","en":"Checkout"},{"id":"cart","zh":"购物车","en":"Cart"},{"id":"profile","zh":"个人页","en":"Profile"},{"id":"settings","zh":"设置","en":"Settings"},{"id":"list","zh":"列表","en":"List"},{"id":"detail","zh":"详情","en":"Detail"},{"id":"form","zh":"表单","en":"Form"},{"id":"chart","zh":"图表","en":"Charts"},{"id":"map","zh":"地图","en":"Map"},{"id":"chat","zh":"聊天","en":"Chat"},{"id":"calendar","zh":"日历","en":"Calendar"},{"id":"booking","zh":"预约","en":"Booking"},{"id":"menu","zh":"菜单","en":"Menu"},{"id":"search","zh":"搜索","en":"Search"},{"id":"empty-state","zh":"空状态","en":"Empty state"},{"id":"feed","zh":"信息流","en":"Feed"},{"id":"article","zh":"文章","en":"Article"},{"id":"gallery","zh":"图集","en":"Gallery"},{"id":"sale","zh":"促销","en":"Sale"},{"id":"cover","zh":"封面","en":"Cover"},{"id":"report","zh":"报告","en":"Report"},{"id":"newsletter","zh":"简报","en":"Newsletter"},{"id":"bilingual","zh":"双语","en":"Bilingual"},{"id":"dark-mode","zh":"深色","en":"Dark mode"},{"id":"illustration","zh":"插画","en":"Illustration"},{"id":"data-dense","zh":"信息密集","en":"Data-dense"}],"sortKeys":["featured","new","updated"]},"sources":{"registries":["https://registry.npmmirror.com","https://mirrors.cloud.tencent.com/npm","https://repo.huaweicloud.com/repository/npm","https://registry.npmjs.org"],"cdn":["https://cdn.jsdelivr.net/npm","https://fastly.jsdelivr.net/npm"],"packages":{"catalog":"dsh-design-gallery","packs":"dsh-design-gallery-packs"}},"revoked":[],"restored":[],"designs":[{"id":"orderg-x__time-bookshop","type":"template","rev":"08e9e40834f9","title":{"zh":"拾光书店","en":"Shiguang Books"},"description":{"zh":"巷子里的独立书店官网:杂志感首页(本月主推、新书上架、店员推荐、读书会、到店)和一本书的详情页(书摘、作者、店员书评)","en":"Site for an independent bookshop: a magazine-style home page and a book detail page with excerpt, author notes and a staff review"},"kind":"web","style":"editorial","categories":["retail","media"],"tags":["landing","article","detail","list","illustration"],"lang":"zh","license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"screens":[{"file":"home.html","title":{"zh":"首页","en":"Home"}},{"file":"book.html","title":{"zh":"书籍详情","en":"Book detail"}}],"files":[{"p":"book.html","sha256":"14cf1da2ef44ad3d491655ccefcc6aabd816b937e2d55979c69c369e3be8f432","size":18851},{"p":"design.json","sha256":"38509443d4f38d81d99ac412aee6e54804b8e0f59363839d3a06911ae2702179","size":941},{"p":"home.html","sha256":"ab77e7733f17435f59c510e762fed44a21c7cfafe997ea60541087a0f611d7f0","size":22722},{"p":"style.css","sha256":"de2cd1b3ca64478adad9126d26ca73c775d8b4fa7f7d2792107beb5f789463a9","size":24258},{"p":"tokens.css","sha256":"2386f8106a5d97d4e909697abf080c3918dc82b8c20f2420ae463d69b90231e9","size":1149}],"digest":"e2de69c1a6e6c0df1a0aefefe848ee854cde79238c8dbb622b218c4efead4a6f","bytes":67921,"palette":{"bg":"#f4f1ea","text":"#111111","primary":"#c8231b","accent":"#111111"},"disclosure":{"scripts":0,"images":0,"fonts":"system"},"featured":true,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","check":{"severe":0,"warn":0},"thumb":{"p":"thumbs/orderg-x__time-bookshop.webp","sha256":"70e262f87424d194fb207bd340234d8ce8692b9ca3e3bd471f6f9b3360e90f67","size":7158},"pack":{"v":"2026.1106.1","path":"d/orderg-x__time-bookshop/08e9e40834f9/"},"shots":[{"p":"_shots/home.jpg","sha256":"1f27c43ec62661d814d037b1e96edb2469826fe614ec1d8ba1de7cfc0bb28761","size":129166}]},{"id":"orderg-x__paw-diary","type":"template","rev":"08e9e40834f9","title":{"zh":"毛孩日记","en":"Paw Diary"},"description":{"zh":"粉黄糖果色的宠物照护 App:今日待办、健康档案、预约洗护三屏","en":"A candy-pink pet care app: daily to-dos, health records and grooming booking"},"kind":"app","style":"cute","categories":["pets"],"tags":["profile","calendar","booking","chart","illustration"],"lang":"zh","license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"screens":[{"file":"home.html","title":{"zh":"首页","en":"Home"}},{"file":"health.html","title":{"zh":"健康","en":"Health"}},{"file":"booking.html","title":{"zh":"预约洗护","en":"Book grooming"}}],"files":[{"p":"app.css","sha256":"b7fdcd50905f876e122457683d79730fe8d35ee83ef4912cf629104339c7eb91","size":4438},{"p":"booking.html","sha256":"a8c9415f7b054627c6928004bcbe42ee52050e22fd2efbbce360bd83ccdfc91e","size":17186},{"p":"design.json","sha256":"1e46a28415018a2f1e1d69e59ae9fbd5501020ea8408cabeeec9751277a15954","size":1035},{"p":"health.html","sha256":"21b79ac67a99326eae72ff7aacf9b3f5cd5db5025284408b3d684fc59450c1c2","size":17001},{"p":"home.html","sha256":"a5842bd294dd2ad99d96b77932297db24be6c67510148cd106a5d033fdfe35c9","size":17483},{"p":"tokens.css","sha256":"a7fee088d48f59f7388845c022d19bb97b7958b686d6a5652ad1caf69b60423c","size":1168}],"digest":"94697b56df2869c3753c841ee81f3867d95ac33a7e9ea2626932a8516fe02789","bytes":58311,"palette":{"bg":"#fff4f6","text":"#3a2540","primary":"#ff7aa8","accent":"#ffc93c"},"disclosure":{"scripts":0,"images":0,"fonts":"system"},"featured":true,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","check":{"severe":0,"warn":0},"thumb":{"p":"thumbs/orderg-x__paw-diary.webp","sha256":"0f99a7ddee93b76667f5b91807942337f6fad6fb3767b89fc3b553a559431d01","size":19502},"pack":{"v":"2026.1106.1","path":"d/orderg-x__paw-diary/08e9e40834f9/"},"shots":[{"p":"_shots/home.jpg","sha256":"aff2dbb20ca5b64b95fec62b36a60cc608ac9e4f040dd503ca64fce5a084fe63","size":102663}]},{"id":"orderg-x__alley-noodles","type":"template","rev":"08e9e40834f9","title":{"zh":"巷口面馆","en":"Alley Noodles"},"description":{"zh":"街边面馆的点单小程序:分类点单、口味备注、取餐叫号,手绘碗面配纸感底色","en":"An ordering mini program for a street-corner noodle shop: menu by category, taste notes, pickup number, with hand-drawn bowls on paper tones"},"kind":"miniprogram","style":"warm","categories":["food"],"tags":["menu","cart","checkout","illustration"],"lang":"zh","license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"screens":[{"file":"menu.html","title":{"zh":"点单","en":"Menu"}},{"file":"cart.html","title":{"zh":"购物车","en":"Cart"}},{"file":"order.html","title":{"zh":"订单","en":"Order"}}],"files":[{"p":"app.css","sha256":"2c378dab502a9f6130f3ec3e318af99511b0614a9ad23185ee5f67c8357b6473","size":5094},{"p":"cart.html","sha256":"4fa10d749b3a1f5b3e504f00b77e58d0b24cb5883900ab90ee15e2c9488ebcdc","size":14462},{"p":"design.json","sha256":"203156a9c89e448602e768a1e991417d9683a4c968ac211a51dcc2da29c67274","size":1095},{"p":"menu.html","sha256":"cbcf1da0d39d6dbd708065f95b672a460e140fdc64052bba15ef66698f2357ef","size":24384},{"p":"order.html","sha256":"4b8c7c7b682ea899e7bc3133c456a3dfaea3c75f6a4ec9e14c8eea625ca1c4b6","size":11640},{"p":"tokens.css","sha256":"75f914335a72a7930bf7ff1001c42a0f48c99082c2e5c45ee6457478667490bf","size":1091}],"digest":"7839bc6965019563ec719e2f45f88dd68f47b2103192c54462a3f1d153b8b003","bytes":57766,"palette":{"bg":"#f6efe6","text":"#2b1d14","primary":"#a9542a","accent":"#5e7a4a"},"disclosure":{"scripts":0,"images":0,"fonts":"system"},"featured":true,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","check":{"severe":0,"warn":0},"thumb":{"p":"thumbs/orderg-x__alley-noodles.webp","sha256":"fe4cbcaa08b89b384b5ee8bf49800efb27784e32521008376c5b0095d330c86e","size":22540},"pack":{"v":"2026.1106.1","path":"d/orderg-x__alley-noodles/08e9e40834f9/"},"shots":[{"p":"_shots/menu.jpg","sha256":"604ba9d3be206d2ce1b3341bea68882f871495ca6c90d74f94c4009f55789c72","size":122886}]},{"id":"orderg-x__little-painter","type":"template","rev":"08e9e40834f9","title":{"zh":"小画家","en":"Little Painter"},"description":{"zh":"儿童美术网课的平板 App:课程表和跟着画的上课页","en":"A tablet app for kids’ art classes: a course list and a paint-along lesson screen"},"kind":"tablet","style":"fresh","categories":["kids","education"],"tags":["list","detail","illustration"],"lang":"zh","license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"screens":[{"file":"courses.html","title":{"zh":"课程","en":"Courses"}},{"file":"lesson.html","title":{"zh":"上课","en":"Lesson"}}],"files":[{"p":"courses.html","sha256":"37865ec9d3a13f6ac658d5aedea3771d503df745918d85f06a4f60f32670874e","size":38666},{"p":"design.json","sha256":"480645b22b619ca4200113a47588c2eb799581b1ae83d7367d412ad3db0d057a","size":892},{"p":"lesson.html","sha256":"9e2b54c291207f23aefd89ced351c1c3abd38b78282887547d4aa5d4de1a4b17","size":22229},{"p":"tokens.css","sha256":"48579a1c4982c088816f72605c1cbfa4874919f6a0096640f11d49bd224fd313","size":1043},{"p":"ui.css","sha256":"e990cf70381f61e4fd013dfee87a6693ddbbda1282c806c1d613f93f14e0f649","size":16807}],"digest":"57a8728b194cb6b3e8507575738ece2a74594b3e95333c096ecdfbb8fe5f69c0","bytes":79637,"palette":{"bg":"#f3f7f2","text":"#1f2a22","primary":"#2f7d4f","accent":"#c9962a"},"disclosure":{"scripts":0,"images":0,"fonts":"system"},"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","check":{"severe":0,"warn":0},"thumb":{"p":"thumbs/orderg-x__little-painter.webp","sha256":"7730739b44931bb57d494c7e09de08fcbd08b0ca4ced1e4709524d1c6c69c926","size":14320},"pack":{"v":"2026.1106.1","path":"d/orderg-x__little-painter/08e9e40834f9/"},"shots":[{"p":"_shots/courses.jpg","sha256":"c3a3fd869754ce9bf468dadffa3a26b5f44b533107755daa1a178b86e088709b","size":138156}]},{"id":"orderg-x__pocket-ledger","type":"template","rev":"08e9e40834f9","title":{"zh":"小账本","en":"Pocket Ledger"},"description":{"zh":"冷灰蓝、信息密的个人记账桌面软件:总览看本月收支、分类和预算,流水表格配右侧详情","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"},"kind":"desktop","style":"tech","categories":["finance"],"tags":["dashboard","chart","data-dense","list","detail","report"],"lang":"zh","license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"screens":[{"file":"overview.html","title":{"zh":"总览","en":"Overview"}},{"file":"entries.html","title":{"zh":"流水","en":"Entries"}}],"files":[{"p":"app.css","sha256":"502c5b64d92910fc88df4f6b56a44739be375a2032e96d86245e953f0a3fd435","size":6835},{"p":"design.json","sha256":"f3c87fcf0702be1b4854cd070160f64f07f5a19f033e7a769e4b50624fb58cad","size":1035},{"p":"entries.html","sha256":"feb8e995ce4f7c9e447608bec0d055d9ddd03f6d868ff9e57acf1c17b4d2b974","size":19373},{"p":"icons.svg","sha256":"25acc673ee213115e0da92ea48c124d001b05a2c0b60d8577bb75af2e30a5351","size":4205},{"p":"overview.html","sha256":"0ca85f430f04c5624fc58ba5b8a54b8a4dcf3427a5314c7eeab899f2902a5283","size":20247},{"p":"tokens.css","sha256":"705d706ce98bd32a614f06dd6a7d07dd58132ee456dcd767a6640863e4af6078","size":1151}],"digest":"5e162036662104ad2e90c7bc6cc3a36208ada134ce537b7f73bd341729342eb4","bytes":52846,"palette":{"bg":"#f5f7fb","text":"#0f172a","primary":"#2457f5","accent":"#0f8f8e"},"disclosure":{"scripts":0,"images":1,"fonts":"system"},"featured":true,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","check":{"severe":0,"warn":0},"thumb":{"p":"thumbs/orderg-x__pocket-ledger.webp","sha256":"5cc3f6f3ece12fd393e85cb2775c07f82bdb647bc56849454511f2fd98d48025","size":8868},"pack":{"v":"2026.1106.1","path":"d/orderg-x__pocket-ledger/08e9e40834f9/"},"shots":[{"p":"_shots/overview.jpg","sha256":"dfe7e7c6c02dc876c8afe0df2475a893960c5ff2fd127b3c9549c40f31fad0e1","size":164494}]},{"id":"orderg-x__moon-fair","type":"template","rev":"08e9e40834f9","title":{"zh":"月满市集","en":"Moon Fair"},"description":{"zh":"中秋夜市的国潮竖版海报:中国红大色块、满月与桂花枝、竖排粗宋体标题、金色细线和印章","en":"A Guochao-style Mid-Autumn night market poster: big Chinese-red block, full moon with osmanthus, vertical bold Song title, fine gold lines and a seal"},"kind":"poster","size":"1080x1350","style":"guochao","categories":["event"],"tags":["cover"],"lang":"zh","license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"screens":[{"file":"poster.html","title":{"zh":"海报","en":"Poster"}}],"files":[{"p":"design.json","sha256":"c54990918797e6d603c293f32c9a1a64bcf2b6e84abde609721e5b48ae56ecd5","size":788},{"p":"poster.html","sha256":"a8f900a11d04370364aafd581f0dd4db224bb44554eada7ab0c97381dc9514d8","size":12968},{"p":"tokens.css","sha256":"176e956190b7155131b57adec5698a0e35a3eedeb6604658ae01be0706c8c625","size":835}],"digest":"3561fff8ce33df4d0ff909dfe2a7ced48febf0af355422946705bcbff190e190","bytes":14591,"palette":{"bg":"#fbf3e4","text":"#2a1410","primary":"#b8202a","accent":"#c8952e"},"disclosure":{"scripts":0,"images":0,"fonts":"system"},"featured":true,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","check":{"severe":0,"warn":0},"thumb":{"p":"thumbs/orderg-x__moon-fair.webp","sha256":"fd2171f8c0986c933a9cba4b737a044f663c5e834239ead78a085be853d8adcd","size":15204},"pack":{"v":"2026.1106.1","path":"d/orderg-x__moon-fair/08e9e40834f9/"},"shots":[{"p":"_shots/poster.jpg","sha256":"32c6542917a93a99b9f50c2372ef246ce5b275c5b90b6b77652f20b74d14c641","size":192780}]},{"id":"orderg-x__year-review","type":"template","rev":"08e9e40834f9","title":{"zh":"青禾年度回顾","en":"Qinghe Year in Review"},"description":{"zh":"植物零售小公司的六页年终汇报:大数字、月度柱状图、时间线和明年计划,瑞士网格风格","en":"A six-slide year-end review for a small plant retailer: big numbers, a monthly bar chart, a timeline and next year's plan, in a Swiss grid style"},"kind":"slides","style":"swiss","categories":["business"],"tags":["report","chart"],"lang":"zh","license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"screens":[{"file":"01-cover.html","title":{"zh":"封面","en":"Cover"}},{"file":"02-highlights.html","title":{"zh":"三个数字","en":"Highlights"}},{"file":"03-growth.html","title":{"zh":"月度营收","en":"Monthly revenue"}},{"file":"04-milestones.html","title":{"zh":"四个节点","en":"Milestones"}},{"file":"05-next.html","title":{"zh":"明年三件事","en":"Next year"}},{"file":"06-thanks.html","title":{"zh":"谢谢","en":"Thanks"}}],"files":[{"p":"01-cover.html","sha256":"b2b1a768f4a2404a830739a74eed8e404c3138018fbed6efbd340be71eeb862b","size":3561},{"p":"02-highlights.html","sha256":"29a23146beb6e50f2405ac097135c7d278c2d52d511468624b0ed92cd92d77aa","size":2190},{"p":"03-growth.html","sha256":"ee0c18cf357f0a53855fe9d60c02bf5140a9d81e6c413c6bb6128f7cdbfc4369","size":3499},{"p":"04-milestones.html","sha256":"e74416ef740c9f02af05e4d97ecf3e7beaebc323d9890ab0a63593d75f4c14da","size":2902},{"p":"05-next.html","sha256":"5dfa0660622d6a24ed1a8270c75b7969d46a739d76ca01a2bdf541fe51579649","size":2841},{"p":"06-thanks.html","sha256":"3c68c0c35cd7caad4b5cfb05f73efebbd59655173bdb4c53f7c4d364d2ef5232","size":1993},{"p":"deck.css","sha256":"6f4d4b441aed95e4e8cd4f9afa82febf2042f41dd41f266d12da3dacfd21c363","size":1768},{"p":"design.json","sha256":"bcf9ef3f0c4df14eb582557372482caab110c9a7546882e5fe0a6407d9372920","size":1235},{"p":"tokens.css","sha256":"eb2eef0e6524ddd2072f0a98ad1df940eace5ee65dc1f07ecdd119c3c0801c17","size":636}],"digest":"75ca2c84b45a4a70e74f8def948982b50a4415eba2e4a3315f13152f8c35a05b","bytes":20625,"palette":{"bg":"#ffffff","text":"#0a0a0a","primary":"#d9001b"},"disclosure":{"scripts":0,"images":0,"fonts":"system"},"featured":true,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","check":{"severe":0,"warn":0},"thumb":{"p":"thumbs/orderg-x__year-review.webp","sha256":"6d9f7a743a2da5f3637c13a7c4ebec72b925a130964fffe3acac4c88e1ecba5b","size":5754},"pack":{"v":"2026.1106.1","path":"d/orderg-x__year-review/08e9e40834f9/"},"shots":[{"p":"_shots/01-cover.jpg","sha256":"f9d76308d694afba5301ab2bebd5068632f30d6a04924b180f7d80d2bf8fb2c2","size":74359}]},{"id":"orderg-x__autumn-sale","type":"template","rev":"08e9e40834f9","title":{"zh":"秋日上新","en":"Autumn Drop"},"description":{"zh":"服装店的秋季上新促销邮件:红橙头图、金黄锯齿优惠券、倒计时、四件商品网格和通栏主按钮,表格布局、内联样式","en":"An autumn new-arrivals sale email for a clothing shop: red-orange hero, gold notched coupons, countdown, four-product grid and a full-width button, built with tables and inline styles"},"kind":"email","style":"sale","categories":["retail"],"tags":["sale","newsletter"],"lang":"zh","license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"screens":[{"file":"email.html","title":{"zh":"上新邮件","en":"Sale email"}}],"files":[{"p":"design.json","sha256":"f8d7fbcff3b9afbbfd11a7cbbc78017cc825cecc31c48901e916e3b8b182f7a9","size":853},{"p":"email.html","sha256":"d81593603964588d0cf5595d3dc012ab5b700b209a96b7721ee13ca8abe72edd","size":24269}],"digest":"785f7cd7d29c02982869335691b6856a9549c629b26cfc4a68f73d0b77db5097","bytes":25122,"palette":{},"disclosure":{"scripts":0,"images":0,"fonts":"system"},"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","check":{"severe":0,"warn":0},"thumb":{"p":"thumbs/orderg-x__autumn-sale.webp","sha256":"354dad1b5f1a37d5cfbc85446034ccd3e99a33b818c999891187bee769c0fbbb","size":16804},"pack":{"v":"2026.1106.1","path":"d/orderg-x__autumn-sale/08e9e40834f9/"},"shots":[{"p":"_shots/email.jpg","sha256":"a8a14e68ef8217a5b522cf50add8b2ff735541f6ec95b8895f18ce00e93b7e78","size":143609}]}],"systems":[],"styles":[{"id":"orderg-x__brutal","type":"style","rev":"08e9e40834f9","title":{"zh":"粗野主义","en":"Brutalist"},"description":{"zh":"亮黄底、黑粗框、硬阴影、等宽字","en":"Bright yellow, thick black borders, hard shadows, monospace"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"6ff0f2aae8b97f854d34d6b3569d45e19493904623426b808931c55ce16d0bea","bytes":1338,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#FFEF5C","surface":"#FFFFFF","text":"#000000","muted":"#3B3B3B","line":"#000000","primary":"#000000","accent":"#FF5C39","on":"#FFEF5C","link":"#1F3FD1"},"head":"MONO","w":800,"radius":0,"shadow":"5px 5px 0 #000000","dzh":"亮黄底、黑粗框、硬阴影、等宽字","den":"Bright yellow, thick black borders, hard shadows, monospace","nzh":"卡片和按钮 3px 黑粗边框加大偏移硬阴影,不模糊;标题用很大的等宽字;亮黄、白、橙红撞色,元素可故意错位叠放;不用渐变、圆角和柔和阴影,链接带下划线","nen":"3px black borders and big unblurred offset shadows on cards and buttons; large monospace headings; loud yellow, white and red-orange, deliberate offsets and overlaps are fine; no gradients, radius or soft shadows, and links are underlined"}},{"id":"orderg-x__cream","type":"style","rev":"08e9e40834f9","title":{"zh":"奶油风","en":"Cream"},"description":{"zh":"奶白燕麦焦糖、大圆角、柔光","en":"Milk, oat and caramel, big radii, soft light"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"f80b9ec84f4fd6bacecf43fcafb57d1439bd1462e6e54c8e3a4ee581c634942a","bytes":1233,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#FAF5EE","surface":"#FFFDF9","text":"#3A2F28","muted":"#76675C","line":"#EEE3D5","primary":"#8C5E3C","accent":"#E7C9A6","on":"#FFFFFF","link":"#8A5A36"},"head":"ROUND","w":700,"radius":22,"shadow":"0 10px 30px rgba(140,94,60,.10)","dzh":"奶白燕麦焦糖、大圆角、柔光","den":"Milk, oat and caramel, big radii, soft light","nzh":"只用奶白、燕麦、焦糖三色;圆角大,多用圆形和胶囊形;阴影又大又淡、带暖色,字用深咖啡色;照片和插画柔光低对比,整体软、暖、安静","nen":"Milk, oat and caramel only; big radii, lots of circles and pills; large faint warm shadows, dark coffee text instead of black; soft low-contrast photos and illustrations, calm and warm overall"}},{"id":"orderg-x__cute","type":"style","rev":"08e9e40834f9","title":{"zh":"可爱卡通","en":"Cute"},"description":{"zh":"粉黄糖果色、大圆角、圆体字","en":"Candy pink and yellow, big radii, rounded type"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"da6d008b5ab20746e0a633beb185a62a72412569354dafa699b5d09a080fb256","bytes":1216,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#FFF4F6","surface":"#FFFFFF","text":"#3A2540","muted":"#7A5E80","line":"#F3D3DD","primary":"#FF7AA8","accent":"#FFC93C","on":"#3A2540","link":"#C2366F"},"head":"ROUND","w":800,"radius":24,"shadow":"0 6px 0 #F3C4D3","dzh":"粉黄糖果色、大圆角、圆体字","den":"Candy pink and yellow, big radii, rounded type","nzh":"圆角很大、字胖胖的;按钮像糖果,底下一道同色系厚阴影;配简单几何画的小动物或角色插画;只用粉黄两色,主色按钮上用深色字","nen":"Very round corners and chubby type; candy-like buttons with a thick same-hue shadow; small animal or mascot illustrations in simple SVG shapes; pink and yellow only, dark text on the primary button"}},{"id":"orderg-x__cyber","type":"style","rev":"08e9e40834f9","title":{"zh":"赛博朋克","en":"Cyberpunk"},"description":{"zh":"近黑底、品红青色霓虹、等宽字","en":"Near-black, magenta and cyan neon, monospace"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"b6fac9122f82fb5cf736f64d78bb41be49eae782005cae319a98d722e24d7bed","bytes":1316,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#0B0B16","surface":"#151528","text":"#E9E6FF","muted":"#A09CC8","line":"#2E2B52","primary":"#FF2E88","accent":"#22E1FF","on":"#0B0B16","link":"#22E1FF"},"head":"MONO","w":700,"radius":2,"shadow":"0 0 0 1px #FF2E88, 0 0 18px rgba(255,46,136,.45)","dzh":"近黑底、品红青色霓虹、等宽字","den":"Near-black, magenta and cyan neon, monospace","nzh":"标题用等宽字、全大写,可以加一点故障错位(两层彩色 text-shadow);边框是 1px 霓虹线加外发光,发光只给主按钮和关键数字;背景可以叠细网格线;正文照样要清楚","nen":"Monospace, all-caps headings with a slight glitch (two colored text-shadows); 1px neon borders with glow, glow only on the main button and key numbers; a fine grid on the background is fine; body text stays readable"}},{"id":"orderg-x__dark","type":"style","rev":"08e9e40834f9","title":{"zh":"深色高级","en":"Dark luxe"},"description":{"zh":"近黑底、香槟金点缀、大图","en":"Near-black, champagne gold accents, big imagery"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"f42f706ff05ccdac58c06cb075aa1c461fb2b89bb8cfb9bcf69e87402842d5e6","bytes":1111,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#0E0E10","surface":"#18181B","text":"#F2EFE9","muted":"#A19C93","line":"#2C2C30","primary":"#C9A86A","accent":"#E8E2D6","on":"#17140E","link":"#C9A86A"},"head":"SERIF","w":500,"radius":12,"shadow":"0 12px 40px rgba(0,0,0,.45)","dzh":"近黑底、香槟金点缀、大图","den":"Near-black, champagne gold accents, big imagery","nzh":"金色只点在关键按钮和细线上;层级靠表面色深浅,不靠阴影;标题细一点、字距放开;留白要多","nen":"Gold only on key buttons and fine lines; layers from surface shades, not shadows; lighter, tracked-out headings; generous space"}},{"id":"orderg-x__editorial","type":"style","rev":"08e9e40834f9","title":{"zh":"杂志编辑","en":"Editorial"},"description":{"zh":"大标题、黑线栅格、红色点题","en":"Big headlines, black-rule grid, a red accent"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"3d55d9a7f8b655e28be03b63625b0b87172352061a96fcf941364b33fc9e1b35","bytes":1150,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#F4F1EA","surface":"#FFFFFF","text":"#111111","muted":"#555555","line":"#111111","primary":"#C8231B","accent":"#111111","on":"#FFFFFF","link":"#C8231B"},"head":"SERIF","w":700,"radius":2,"shadow":"none","dzh":"大标题、黑线栅格、红色点题","den":"Big headlines, black-rule grid, a red accent","nzh":"标题很大、粗细对比强烈;用粗细两种黑线分栏;版式不对称、留白多;红色只点一两处,几乎不用圆角和阴影","nen":"Very large headlines with strong weight contrast; thick and thin black rules for columns; asymmetric layout with space; red in one or two places, almost no radius or shadow"}},{"id":"orderg-x__fresh","type":"style","rev":"08e9e40834f9","title":{"zh":"清新自然","en":"Fresh"},"description":{"zh":"浅绿底、圆角卡片、轻插画","en":"Pale green, rounded cards, light illustration"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"6bc22a5a9275a4a57fa4cb57ac1ce29335b6533a8c8498ba4540003596f64a9c","bytes":1101,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#F3F7F2","surface":"#FFFFFF","text":"#1F2A22","muted":"#56665A","line":"#DCE6DA","primary":"#2F7D4F","accent":"#C9962A","on":"#FFFFFF","link":"#2F7D4F"},"head":"SANS","w":600,"radius":14,"shadow":"0 6px 18px rgba(47,125,79,.10)","dzh":"浅绿底、圆角卡片、轻插画","den":"Pale green, rounded cards, light illustration","nzh":"大面积浅色、卡片白底;插画用叶子、阳光这类自然元素;黄色只做小点缀;整体轻、透气","nen":"Large light areas with white cards; nature motifs (leaves, sunlight) in illustrations; yellow only as a small accent; light and airy"}},{"id":"orderg-x__glass","type":"style","rev":"08e9e40834f9","title":{"zh":"玻璃质感","en":"Glass"},"description":{"zh":"柔光底、浮层毛玻璃","en":"Soft glow background, frosted overlays"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"e34e0c0501476ea89a1a39cfb7589dde4116d922297d30f5bbab7c05a4fa107e","bytes":1392,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#EAF0F6","surface":"#F7F9FC","text":"#10151C","muted":"#4F5B69","line":"#D5DEE8","primary":"#CC4520","accent":"#2B6CB0","on":"#FFFFFF","link":"#2B6CB0"},"head":"SANS","w":600,"radius":18,"shadow":"0 10px 30px rgba(16,21,28,.10)","dzh":"柔光底、浮层毛玻璃","den":"Soft glow background, frosted overlays","nzh":"底色加两三团柔和光斑,别用紫蓝渐变;只有浮层、卡片、标签栏用毛玻璃;毛玻璃是半透明白加模糊和 1px 白描边;正文区用实色,玻璃上的字照样要够深","nen":"Two or three soft light blobs on the background, not a purple-blue gradient; frosted glass only on overlays, cards and tab bars; glass = translucent white, blur and a 1px white border; solid elsewhere, text on glass stays dark","bgImage":"radial-gradient(circle at 20% 15%, #FFD9C7 0, transparent 45%), radial-gradient(circle at 85% 70%, #C9E2FF 0, transparent 50%)"}},{"id":"orderg-x__guochao","type":"style","rev":"08e9e40834f9","title":{"zh":"国潮","en":"Guochao"},"description":{"zh":"中国红配金、粗宋体、传统纹样","en":"Chinese red and gold, bold Song type, traditional patterns"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"e18af891b87751e1eb6c8a0481c6134b1fb9c8aad2380bb0acb8b2f6a4a3a803","bytes":1260,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#FBF3E4","surface":"#FFFAF0","text":"#2A1410","muted":"#6F4A3A","line":"#E8D3B5","primary":"#B8202A","accent":"#C8952E","on":"#FFF7E6","link":"#A31D26"},"head":"SERIF","w":800,"radius":6,"shadow":"0 6px 18px rgba(140,30,20,.12)","dzh":"中国红配金、粗宋体、传统纹样","den":"Chinese red and gold, bold Song type, traditional patterns","nzh":"中国红的大色块配金色细线;标题用粗宋体,可以竖排;祥云、回纹、印章这类纹样用 SVG 画,只做点缀别铺满;底色是米黄纸色,不用纯白","nen":"Big Chinese-red blocks with fine gold lines; bold Song headings, vertical text allowed; clouds, fret borders and seal stamps drawn in SVG as accents only; rice-paper background, not pure white"}},{"id":"orderg-x__ink","type":"style","rev":"08e9e40834f9","title":{"zh":"中式雅致","en":"Ink & paper"},"description":{"zh":"宣纸底、墨色字、朱砂点缀","en":"Paper white, ink-black type, a touch of cinnabar"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"5bae84b2524b8d17cc63a4a373a0ffed474f4d934eb817bcb27c6992664b603b","bytes":1209,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#F5F2EC","surface":"#FBF9F5","text":"#1E1E1C","muted":"#5F5B54","line":"#DAD4C8","primary":"#2F3B37","accent":"#8C2F2B","on":"#F5F2EC","link":"#8C2F2B"},"head":"SERIF","w":500,"radius":4,"shadow":"none","dzh":"宣纸底、墨色字、朱砂点缀","den":"Paper white, ink-black type, a touch of cinnabar","nzh":"大量留白、细线分隔;标题细宋体、字距放开;朱砂红只像印章一样点一两处;插画用浅灰的水墨晕染(SVG 模糊色块),不用照片堆满","nen":"Lots of space and hairline dividers; light Song headings with open tracking; cinnabar red only in one or two seal-like spots; illustrations as pale ink washes (blurred SVG shapes), not photo walls"}},{"id":"orderg-x__japandi","type":"style","rev":"08e9e40834f9","title":{"zh":"日系原木","en":"Japandi"},"description":{"zh":"米色原木、低饱和、小字大留白","en":"Oat and wood tones, muted, small type and lots of space"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"dbf128dde7c3dab1c80e93e76bd9d193cf42ea716394fa0c0afb7645c982f900","bytes":1293,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#F2EEE6","surface":"#FAF8F3","text":"#2F2B26","muted":"#6B645A","line":"#DDD5C8","primary":"#4F4234","accent":"#8C9A6E","on":"#FAF8F3","link":"#6B4F33"},"head":"SANS","w":500,"radius":6,"shadow":"0 2px 8px rgba(79,66,52,.06)","dzh":"米色原木、低饱和、小字大留白","den":"Oat and wood tones, muted, small type and lots of space","nzh":"像杂货家居品牌:字偏小偏细、留白很多;只用米、原木棕、灰绿,饱和度低;照片柔光、木麻陶这类自然材质;细线分隔几乎不用阴影,主按钮深棕实底","nen":"Like a homeware brand: small light type and lots of space; only oat, wood brown and sage, low saturation; soft-light photos of wood, linen and ceramic; hairlines, almost no shadow, solid dark-brown main button"}},{"id":"orderg-x__minimal","type":"style","rev":"08e9e40834f9","title":{"zh":"极简白","en":"Minimal"},"description":{"zh":"大留白、细线、黑白加一点蓝","en":"Lots of space, hairlines, black and white with a touch of blue"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"64aa6367d2cdde5319f00758104bf68b3baba04698b99f587861a991c6c7e394","bytes":1153,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#FAFAF9","surface":"#FFFFFF","text":"#18181B","muted":"#6B6B73","line":"#E4E4E7","primary":"#18181B","accent":"#2563EB","on":"#FFFFFF","link":"#2563EB"},"head":"SANS","w":600,"radius":10,"shadow":"0 1px 2px rgba(24,24,27,.06)","dzh":"大留白、细线、黑白加一点蓝","den":"Lots of space, hairlines, black and white with a touch of blue","nzh":"靠字号和留白分层级,不靠色块;分隔用 1px 细线;蓝色只给链接和选中态;大标题字距收 -0.02em","nen":"Hierarchy from type size and whitespace, not color blocks; 1px hairlines; blue only for links and selection; tighten big headings to -0.02em"}},{"id":"orderg-x__playful","type":"style","rev":"08e9e40834f9","title":{"zh":"活泼年轻","en":"Playful"},"description":{"zh":"粗描边、硬阴影、贴纸感","en":"Thick outlines, hard shadows, sticker feel"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"3ca588fe2a10b352666719fae279b03432d4abc3977c6af9ae9df15be6b5c3a9","bytes":1125,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#FFF7E8","surface":"#FFFFFF","text":"#1D1B3A","muted":"#5D5A82","line":"#1D1B3A","primary":"#FF6A3D","accent":"#1F9E92","on":"#1D1B3A","link":"#137167"},"head":"ROUND","w":800,"radius":20,"shadow":"4px 4px 0 #1D1B3A","dzh":"粗描边、硬阴影、贴纸感","den":"Thick outlines, hard shadows, sticker feel","nzh":"卡片和按钮 2px 深色描边 + 不模糊的硬阴影;主色按钮上用深色字;元素可以略微倾斜、像贴纸;颜色最多三种","nen":"2px dark outlines and hard, unblurred shadows on cards and buttons; dark text on the primary button; slightly tilted sticker-like bits; three colors max"}},{"id":"orderg-x__retro","type":"style","rev":"08e9e40834f9","title":{"zh":"复古","en":"Retro"},"description":{"zh":"焦橙芥末黄墨绿、粗衬线、颗粒感","en":"Burnt orange, mustard and teal, fat serif, grain"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"6c5b8aa6c4fb14e81a7aa291406812300b910d3f735b3cb8012bfb92a1f41d15","bytes":1177,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#F3E6CF","surface":"#FBF2E2","text":"#2E1F14","muted":"#6A5240","line":"#DDC7A4","primary":"#B5471D","accent":"#E0A526","on":"#FFF6E8","link":"#2F5D50"},"head":"SERIF","w":800,"radius":14,"shadow":"0 4px 0 #2E1F14","dzh":"焦橙芥末黄墨绿、粗衬线、颗粒感","den":"Burnt orange, mustard and teal, fat serif, grain","nzh":"焦橙、芥末黄、墨绿三色,配粗衬线大标题;彩虹条纹、圆形徽章做装饰;底色叠一层很淡的颗粒噪点;图片调成褪色暖调","nen":"Burnt orange, mustard and teal with fat serif headlines; rainbow stripes and round badges as decoration; a very light grain over the background; faded warm photos"}},{"id":"orderg-x__sale","type":"style","rev":"08e9e40834f9","title":{"zh":"电商促销","en":"Sale"},"description":{"zh":"红橙主色、大价格、优惠券","en":"Red-orange, big prices, coupons"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"e0c3cd3ffe82d615ab86555e041c4a54d76e009411b334a39a5c53113d3bb070","bytes":1215,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#FFF5F0","surface":"#FFFFFF","text":"#1F1A17","muted":"#6B5E57","line":"#F5DDD2","primary":"#CF2E0E","accent":"#FFB800","on":"#FFFFFF","link":"#C2290B"},"head":"SANS","w":800,"radius":12,"shadow":"0 4px 12px rgba(207,46,14,.12)","dzh":"红橙主色、大价格、优惠券","den":"Red-orange, big prices, coupons","nzh":"价格用大号粗体数字,原价灰色划线;限时、包邮这类小标签用色块;优惠券金黄色带锯齿边,倒计时醒目;信息多但分区清楚,主按钮通栏","nen":"Big bold price numerals, old price struck through in gray; small colored tags like Limited and Free shipping; gold notched coupons and a prominent countdown; dense but clearly sectioned, full-width main button"}},{"id":"orderg-x__soft","type":"style","rev":"08e9e40834f9","title":{"zh":"柔和立体","en":"Soft UI"},"description":{"zh":"同色底、凸起凹陷的柔光阴影","en":"Same-color surfaces with raised and pressed soft shadows"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"f07a18e0f3761d8cd5d3ecf40842d47f1ebfb45c9523c729a4638c4fa49b9299","bytes":1282,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#E9EDF2","surface":"#E9EDF2","text":"#2D3440","muted":"#556072","line":"#D3D9E1","primary":"#3E5BD8","accent":"#22A06B","on":"#FFFFFF","link":"#3E5BD8"},"head":"ROUND","w":700,"radius":18,"shadow":"6px 6px 14px #C8CED6, -6px -6px 14px #FFFFFF","dzh":"同色底、凸起凹陷的柔光阴影","den":"Same-color surfaces with raised and pressed soft shadows","nzh":"卡片和底同色,靠一亮一暗两道阴影凸起,按下用内阴影;容易看不清,所以主按钮一定用主色实底、文字够深;别整屏都是凸起","nen":"Cards share the background color and rise with a light and a dark shadow; pressed states use inset shadows; it gets low-contrast fast, so the main button is solid primary with strong text; don't make everything raised"}},{"id":"orderg-x__sport","type":"style","rev":"08e9e40834f9","title":{"zh":"运动能量","en":"Sport"},"description":{"zh":"黑底荧光绿、粗斜体、大数字","en":"Black with volt green, heavy italics, big numbers"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"cd3db7af69cd1df1c7f9ef601cf7e45511332f2e2d2a737157e984cdd940585b","bytes":1261,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#0E0F11","surface":"#1A1C20","text":"#F4F5F6","muted":"#A1A5AD","line":"#2B2E35","primary":"#C8FF2E","accent":"#FF5A1F","on":"#0E0F11","link":"#C8FF2E"},"head":"SANS","w":900,"radius":6,"shadow":"none","dzh":"黑底荧光绿、粗斜体、大数字","den":"Black with volt green, heavy italics, big numbers","nzh":"标题超粗斜体、全大写、字距收紧;荧光绿只给主按钮、进度和关键数字;配速心率这类数字做得很大,可用斜切色块;照片高对比有动感,橙色只做警示","nen":"Heavy italic, all-caps, tightly tracked headings; volt green only on the main button, progress and key numbers; big pace and heart-rate numbers, slanted blocks are fine; high-contrast action photos, orange only for alerts"}},{"id":"orderg-x__swiss","type":"style","rev":"08e9e40834f9","title":{"zh":"瑞士网格","en":"Swiss grid"},"description":{"zh":"白底黑字红色块、严格网格","en":"White, black type, red blocks, strict grid"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"82cec2e99d6a88f72704f3915d16a00eb2596641d23efc217d5f82247167f3dd","bytes":1203,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#FFFFFF","surface":"#F1F1F1","text":"#0A0A0A","muted":"#545454","line":"#0A0A0A","primary":"#D9001B","accent":"#0A0A0A","on":"#FFFFFF","link":"#C2001A"},"head":"GROTESK","w":800,"radius":0,"shadow":"none","dzh":"白底黑字红色块、严格网格","den":"White, black type, red blocks, strict grid","nzh":"12 栏严格网格,全部左对齐不居中;标题超大粗无衬线、字距收紧;红色大色块只用一两处,用 01 02 03 编号和粗黑线分区;没有圆角、阴影和渐变","nen":"Strict 12-column grid, everything left-aligned; huge bold tightly tracked sans headings; one or two big red blocks, numbered sections and heavy black rules; no radius, shadow or gradient"}},{"id":"orderg-x__tech","type":"style","rev":"08e9e40834f9","title":{"zh":"专业科技","en":"Pro / tech"},"description":{"zh":"冷灰蓝、信息密、数字清楚","en":"Cool gray-blue, dense info, crisp numbers"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"01bac52a983fa1e46c2e2cfbb2b0d155cd5534bfdc616b8ab7afe96f755f061f","bytes":1113,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#F5F7FB","surface":"#FFFFFF","text":"#0F172A","muted":"#55657D","line":"#E2E8F0","primary":"#2457F5","accent":"#0F8F8E","on":"#FFFFFF","link":"#2457F5"},"head":"SANS","w":600,"radius":8,"shadow":"0 1px 3px rgba(15,23,42,.08)","dzh":"冷灰蓝、信息密、数字清楚","den":"Cool gray-blue, dense info, crisp numbers","nzh":"信息密度高但对齐严格;数字用等宽数字,表格行高 44–48;状态用小色点和标签;主色只给主操作","nen":"Dense but strictly aligned; tabular numbers and 44–48px table rows; status as small dots and tags; primary color only for the main action"}},{"id":"orderg-x__warm","type":"style","rev":"08e9e40834f9","title":{"zh":"温暖手作","en":"Warm craft"},"description":{"zh":"纸感底色、圆润、手绘感","en":"Paper tones, soft and rounded, hand-made feel"},"license":"CC0-1.0","author":{"login":"orderg-x","id":271418316},"ai":{"generated":true,"tool":"dsh-design-studio@0.11.0"},"digest":"c9691b4e498b20b1b1e00fa806a117d22fedf8cc68220ca0545cb3aeaf63f7ad","bytes":1095,"added":"2026-11-07T08:27:20+09:00","updated":"2026-11-07T08:27:20+09:00","minPlugin":"0.11.0","style":{"c":{"bg":"#F6EFE6","surface":"#FFF9F2","text":"#2B1D14","muted":"#6E5A4B","line":"#E7D9C8","primary":"#A9542A","accent":"#5E7A4A","on":"#FFFFFF","link":"#52703F"},"head":"SERIF","w":600,"radius":16,"shadow":"0 8px 24px rgba(120,72,30,.12)","dzh":"纸感底色、圆润、手绘感","den":"Paper tones, soft and rounded, hand-made feel","nzh":"标题用衬线字,正文无衬线;插画用手绘线条和色块;阴影带暖色;中性色都偏暖,不用纯灰","nen":"Serif headings, sans body; hand-drawn line illustrations and color blocks; warm-tinted shadows; warm neutrals, no pure gray"}}]}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/lib/browser.js
CHANGED
|
@@ -77,6 +77,8 @@ export function createBrowser({ bin = findBrowser(), log = () => {}, idleMs = ID
|
|
|
77
77
|
const pending = new Map() // 指令 id → { resolve, reject, timer }
|
|
78
78
|
const waiters = new Set() // 等事件的:{ method, sessionId, done }
|
|
79
79
|
const queue = [] // 等空位开页面的
|
|
80
|
+
// 几个页面同时截图偶尔会截花(整张变成一小块重复铺满):截图一个一个来,截前先把那页切到前台(后台标签页可能还没出新画面)
|
|
81
|
+
let shooting = Promise.resolve()
|
|
80
82
|
|
|
81
83
|
const fail = (err) => {
|
|
82
84
|
for (const p of pending.values()) { clearTimeout(p.timer); p.reject(err) }
|
|
@@ -208,8 +210,9 @@ export function createBrowser({ bin = findBrowser(), log = () => {}, idleMs = ID
|
|
|
208
210
|
* page.pseudo():把伪元素的真实框挂到宿主元素上,体检时用(页面里量不到伪元素)
|
|
209
211
|
* page.shot({ clip, format }):截视口;clip({ x, y, width, height },CSS 像素,按整页坐标 = 视口位置 + 滚动距离)只截那一块 → JPEG Buffer(format: 'png' 无损)
|
|
210
212
|
* allow(网址):给了就只让它说行的页面载入(主页面、iframe,连跳转、脚本改地址都算),别的拦下,记在 page.blocked
|
|
213
|
+
* offline:断网渲染(设计库的检查):所有请求(样式、图片、字体、接口 …)只放行和页面同源的,别的一律拦下,记在 page.blocked
|
|
211
214
|
*/
|
|
212
|
-
async function withPage({ url, w, h, scale = 1, dark = false, allow = null }, fn) {
|
|
215
|
+
async function withPage({ url, w, h, scale = 1, dark = false, allow = null, offline = false }, fn) {
|
|
213
216
|
if (dead) throw new Error('browser closed')
|
|
214
217
|
if (open >= MAX_PAGES) await new Promise((r) => queue.push(r))
|
|
215
218
|
if (dead) throw new Error('browser closed')
|
|
@@ -223,15 +226,21 @@ export function createBrowser({ bin = findBrowser(), log = () => {}, idleMs = ID
|
|
|
223
226
|
;({ targetId } = await call('Target.createTarget', { url: 'about:blank' }))
|
|
224
227
|
const { sessionId } = await call('Target.attachToTarget', { targetId, flatten: true })
|
|
225
228
|
const c = (m, p) => call(m, p, sessionId)
|
|
226
|
-
if (allow) {
|
|
227
|
-
|
|
229
|
+
if (allow || offline) {
|
|
230
|
+
let home = ''
|
|
231
|
+
try { home = new URL(url).origin } catch { home = '' }
|
|
232
|
+
// 每个页面请求(包括 302 之后的每一跳)先停下来问一遍,不行就当被拦了;断网渲染时每个子资源也问
|
|
228
233
|
unlisten = listen('Fetch.requestPaused', sessionId, (q) => {
|
|
229
234
|
let ok = false
|
|
230
|
-
try {
|
|
231
|
-
|
|
235
|
+
try {
|
|
236
|
+
const isDoc = q.resourceType === 'Document'
|
|
237
|
+
const same = (() => { try { return new URL(q.request.url).origin === home } catch { return false } })()
|
|
238
|
+
ok = (!offline || same) && (!isDoc || !allow || !!allow(q.request.url))
|
|
239
|
+
} catch { ok = false }
|
|
240
|
+
if (!ok && blocked.length < 50) blocked.push(q.request.url)
|
|
232
241
|
c(ok ? 'Fetch.continueRequest' : 'Fetch.failRequest', ok ? { requestId: q.requestId } : { requestId: q.requestId, errorReason: 'BlockedByClient' }).catch(() => {})
|
|
233
242
|
})
|
|
234
|
-
await c('Fetch.enable', { patterns: [{ urlPattern: '*', resourceType: 'Document', requestStage: 'Request' }] })
|
|
243
|
+
await c('Fetch.enable', { patterns: offline ? [{ urlPattern: '*', requestStage: 'Request' }] : [{ urlPattern: '*', resourceType: 'Document', requestStage: 'Request' }] })
|
|
235
244
|
}
|
|
236
245
|
await c('Page.enable')
|
|
237
246
|
// 和右侧栏里一样按桌面方式排版(mobile: false):页面宽就是 w,不看 <meta viewport>
|
|
@@ -247,9 +256,14 @@ export function createBrowser({ bin = findBrowser(), log = () => {}, idleMs = ID
|
|
|
247
256
|
if (r.exceptionDetails) throw new Error((r.exceptionDetails.exception && r.exceptionDetails.exception.description) || r.exceptionDetails.text || 'eval failed')
|
|
248
257
|
return r.result ? r.result.value : undefined
|
|
249
258
|
},
|
|
250
|
-
shot:
|
|
251
|
-
const
|
|
252
|
-
|
|
259
|
+
shot: ({ clip, quality = 82, format = 'jpeg' } = {}) => {
|
|
260
|
+
const job = shooting.then(async () => {
|
|
261
|
+
await c('Page.bringToFront').catch(() => {})
|
|
262
|
+
const r = await c('Page.captureScreenshot', { format, ...(format === 'jpeg' ? { quality } : {}), ...(clip ? { clip: { ...clip, scale: 1 } } : {}) })
|
|
263
|
+
return Buffer.from(r.data, 'base64')
|
|
264
|
+
})
|
|
265
|
+
shooting = job.catch(() => {})
|
|
266
|
+
return job
|
|
253
267
|
},
|
|
254
268
|
// 伪元素(::before / ::after)的真实框:页面里的脚本量不到,问浏览器要,挂到宿主元素上(__dshPseudo),
|
|
255
269
|
// 连同当时的滚动位置(__dshPseudoAt);体检在同一滚动位置时直接用,不再按样式推。返回挂了几个宿主
|