dsh-design-studio 0.10.0 → 0.12.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.
Files changed (98) hide show
  1. package/README.en.md +4 -3
  2. package/README.md +6 -5
  3. package/assets/demo.gif +0 -0
  4. package/assets/hero-sm.jpg +0 -0
  5. package/cordis.patch.yml +5 -0
  6. package/gallery-seed/d/orderg-x__alley-noodles/08e9e40834f9/_shots/menu.jpg +0 -0
  7. package/gallery-seed/d/orderg-x__alley-noodles/08e9e40834f9/app.css +64 -0
  8. package/gallery-seed/d/orderg-x__alley-noodles/08e9e40834f9/cart.html +120 -0
  9. package/gallery-seed/d/orderg-x__alley-noodles/08e9e40834f9/design.json +56 -0
  10. package/gallery-seed/d/orderg-x__alley-noodles/08e9e40834f9/menu.html +200 -0
  11. package/gallery-seed/d/orderg-x__alley-noodles/08e9e40834f9/order.html +135 -0
  12. package/gallery-seed/d/orderg-x__alley-noodles/08e9e40834f9/tokens.css +43 -0
  13. package/gallery-seed/d/orderg-x__autumn-sale/08e9e40834f9/_shots/email.jpg +0 -0
  14. package/gallery-seed/d/orderg-x__autumn-sale/08e9e40834f9/design.json +20 -0
  15. package/gallery-seed/d/orderg-x__autumn-sale/08e9e40834f9/email.html +268 -0
  16. package/gallery-seed/d/orderg-x__little-painter/08e9e40834f9/_shots/courses.jpg +0 -0
  17. package/gallery-seed/d/orderg-x__little-painter/08e9e40834f9/courses.html +364 -0
  18. package/gallery-seed/d/orderg-x__little-painter/08e9e40834f9/design.json +49 -0
  19. package/gallery-seed/d/orderg-x__little-painter/08e9e40834f9/lesson.html +196 -0
  20. package/gallery-seed/d/orderg-x__little-painter/08e9e40834f9/tokens.css +55 -0
  21. package/gallery-seed/d/orderg-x__little-painter/08e9e40834f9/ui.css +255 -0
  22. package/gallery-seed/d/orderg-x__moon-fair/08e9e40834f9/_shots/poster.jpg +0 -0
  23. package/gallery-seed/d/orderg-x__moon-fair/08e9e40834f9/design.json +21 -0
  24. package/gallery-seed/d/orderg-x__moon-fair/08e9e40834f9/poster.html +165 -0
  25. package/gallery-seed/d/orderg-x__moon-fair/08e9e40834f9/tokens.css +35 -0
  26. package/gallery-seed/d/orderg-x__paw-diary/08e9e40834f9/_shots/home.jpg +0 -0
  27. package/gallery-seed/d/orderg-x__paw-diary/08e9e40834f9/app.css +155 -0
  28. package/gallery-seed/d/orderg-x__paw-diary/08e9e40834f9/booking.html +232 -0
  29. package/gallery-seed/d/orderg-x__paw-diary/08e9e40834f9/design.json +57 -0
  30. package/gallery-seed/d/orderg-x__paw-diary/08e9e40834f9/health.html +221 -0
  31. package/gallery-seed/d/orderg-x__paw-diary/08e9e40834f9/home.html +225 -0
  32. package/gallery-seed/d/orderg-x__paw-diary/08e9e40834f9/tokens.css +54 -0
  33. package/gallery-seed/d/orderg-x__pocket-ledger/08e9e40834f9/_shots/overview.jpg +0 -0
  34. package/gallery-seed/d/orderg-x__pocket-ledger/08e9e40834f9/app.css +79 -0
  35. package/gallery-seed/d/orderg-x__pocket-ledger/08e9e40834f9/design.json +51 -0
  36. package/gallery-seed/d/orderg-x__pocket-ledger/08e9e40834f9/entries.html +161 -0
  37. package/gallery-seed/d/orderg-x__pocket-ledger/08e9e40834f9/icons.svg +30 -0
  38. package/gallery-seed/d/orderg-x__pocket-ledger/08e9e40834f9/overview.html +181 -0
  39. package/gallery-seed/d/orderg-x__pocket-ledger/08e9e40834f9/tokens.css +50 -0
  40. package/gallery-seed/d/orderg-x__time-bookshop/08e9e40834f9/_shots/home.jpg +0 -0
  41. package/gallery-seed/d/orderg-x__time-bookshop/08e9e40834f9/book.html +279 -0
  42. package/gallery-seed/d/orderg-x__time-bookshop/08e9e40834f9/design.json +21 -0
  43. package/gallery-seed/d/orderg-x__time-bookshop/08e9e40834f9/home.html +348 -0
  44. package/gallery-seed/d/orderg-x__time-bookshop/08e9e40834f9/style.css +297 -0
  45. package/gallery-seed/d/orderg-x__time-bookshop/08e9e40834f9/tokens.css +49 -0
  46. package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/01-cover.html +133 -0
  47. package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/02-highlights.html +67 -0
  48. package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/03-growth.html +89 -0
  49. package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/04-milestones.html +92 -0
  50. package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/05-next.html +99 -0
  51. package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/06-thanks.html +61 -0
  52. package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/_shots/01-cover.jpg +0 -0
  53. package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/deck.css +67 -0
  54. package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/design.json +25 -0
  55. package/gallery-seed/d/orderg-x__year-review/08e9e40834f9/tokens.css +30 -0
  56. package/gallery-seed/index.json +1 -0
  57. package/gallery-seed/thumbs/orderg-x__alley-noodles.webp +0 -0
  58. package/gallery-seed/thumbs/orderg-x__autumn-sale.webp +0 -0
  59. package/gallery-seed/thumbs/orderg-x__little-painter.webp +0 -0
  60. package/gallery-seed/thumbs/orderg-x__moon-fair.webp +0 -0
  61. package/gallery-seed/thumbs/orderg-x__paw-diary.webp +0 -0
  62. package/gallery-seed/thumbs/orderg-x__pocket-ledger.webp +0 -0
  63. package/gallery-seed/thumbs/orderg-x__time-bookshop.webp +0 -0
  64. package/gallery-seed/thumbs/orderg-x__year-review.webp +0 -0
  65. package/lib/browser.js +23 -9
  66. package/lib/bundle.js +12 -3
  67. package/lib/client.js +3253 -483
  68. package/lib/core.js +231 -7
  69. package/lib/draft-page.js +763 -0
  70. package/lib/draft.js +151 -0
  71. package/lib/gallery/css.js +230 -0
  72. package/lib/gallery/html.js +313 -0
  73. package/lib/gallery/index.js +22 -0
  74. package/lib/gallery/market-routes.js +306 -0
  75. package/lib/gallery/market.js +623 -0
  76. package/lib/gallery/pack.js +311 -0
  77. package/lib/gallery/policy.js +1560 -0
  78. package/lib/gallery/qrfind.js +181 -0
  79. package/lib/gallery/render.js +148 -0
  80. package/lib/gallery/routes.js +360 -0
  81. package/lib/gallery/tar.js +118 -0
  82. package/lib/gallery/use.js +125 -0
  83. package/lib/gallery/zip.js +212 -0
  84. package/lib/handoff.js +190 -36
  85. package/lib/history.js +3 -1
  86. package/lib/index.js +123 -22
  87. package/lib/inspire.js +142 -0
  88. package/lib/offline.js +17 -0
  89. package/lib/picker.js +260 -1
  90. package/lib/serve.js +264 -11
  91. package/lib/tweaks.js +58 -24
  92. package/lib/works.js +238 -0
  93. package/locale/en.json +2 -1
  94. package/locale/offline/en.json +6 -0
  95. package/locale/offline/zh.json +6 -0
  96. package/locale/zh.json +2 -1
  97. package/package.json +9 -2
  98. package/skills/ui-design/SKILL.md +9 -0
@@ -0,0 +1,196 @@
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="tablet">
7
+ <title>上课 · 小画家</title>
8
+ <link rel="stylesheet" href="tokens.css">
9
+ <link rel="stylesheet" href="ui.css">
10
+ </head>
11
+ <body>
12
+ <div class="status" aria-hidden="true">
13
+ <span>9:41&nbsp;&nbsp;11月7日 周六</span>
14
+ <span class="status-r">
15
+ <svg viewBox="0 0 17 12"><path d="M8.5 11.2 6.4 9.1a3 3 0 0 1 4.2 0z" fill="currentColor"/><path d="M3.6 6.4a7 7 0 0 1 9.8 0M1 3.8a10.6 10.6 0 0 1 15 0" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"/></svg>
16
+ 86%
17
+ <svg viewBox="0 0 27 12"><rect x=".7" y=".7" width="22.6" height="10.6" rx="3" fill="none" stroke="currentColor" stroke-opacity=".45" stroke-width="1.2"/><rect x="2.4" y="2.4" width="16.8" height="7.2" rx="1.6" fill="currentColor"/><path d="M25 4.2v3.6c.8-.3 1.3-1 1.3-1.8S25.8 4.5 25 4.2z" fill="currentColor" fill-opacity=".45"/></svg>
18
+ </span>
19
+ </div>
20
+ <div class="lesson">
21
+ <header class="bar">
22
+ <a class="btn btn-ghost" href="courses.html"><svg class="ic" viewBox="0 0 24 24" aria-hidden="true"><path d="m14.5 18-6-6 6-6"/></svg>课程</a>
23
+ <div class="bar-t">
24
+ <p>水彩 · 秋天的银杏 · 第 4 课</p>
25
+ <h1>叶子的渐变</h1>
26
+ </div>
27
+ <div class="bar-r">
28
+ <span class="timer"><svg class="ic ic-sm" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="8.5"/><path d="M12 7.5V12l3 2"/></svg>已画 12 分钟</span>
29
+ <button class="btn btn-ghost" type="button"><svg class="ic" viewBox="0 0 24 24" aria-hidden="true"><path d="M8 12.5V6.8a1.6 1.6 0 0 1 3.2 0v4.7"/><path d="M11.2 11V5.2a1.6 1.6 0 0 1 3.2 0V11"/><path d="M14.4 11.2V7.4a1.6 1.6 0 0 1 3.2 0v6.4a6.7 6.7 0 0 1-6.7 6.7c-2.1 0-3.6-.8-4.9-2.3l-2.6-3.1a1.5 1.5 0 0 1 2.3-2L8 15.6"/></svg>举手提问</button>
30
+ </div>
31
+ </header>
32
+
33
+ <div class="stage">
34
+ <section class="card board" aria-label="画布">
35
+ <div class="paper">
36
+ <svg viewBox="0 0 400 820" preserveAspectRatio="xMidYMid slice" role="img" aria-label="朵朵正在画的银杏叶水彩画">
37
+ <defs>
38
+ <filter id="wc" x="-15%" y="-15%" width="130%" height="130%"><feTurbulence type="fractalNoise" baseFrequency=".04" numOctaves="2" seed="7"/><feDisplacementMap in="SourceGraphic" scale="7"/></filter>
39
+ <linearGradient id="gkA" x1="0" y1="1" x2="0" y2="0"><stop offset="0" stop-color="#F6DA6B"/><stop offset=".55" stop-color="#F1BE4E"/><stop offset="1" stop-color="#EE9B3B"/></linearGradient>
40
+ <linearGradient id="gkB" x1="0" y1="1" x2=".3" y2="0"><stop offset="0" stop-color="#F7DE7A"/><stop offset=".6" stop-color="#F3C557"/><stop offset="1" stop-color="#E98F35"/></linearGradient>
41
+ <radialGradient id="wet" cx=".86" cy=".12" r=".62"><stop offset="0" stop-color="#EE9B3B" stop-opacity=".95"/><stop offset=".5" stop-color="#F1B04A" stop-opacity=".55"/><stop offset="1" stop-color="#F6DA6B" stop-opacity="0"/></radialGradient>
42
+ <radialGradient id="glow" cx=".5" cy=".5" r=".5"><stop offset="0" stop-color="#FBE7A6" stop-opacity=".9"/><stop offset="1" stop-color="#FBE7A6" stop-opacity="0"/></radialGradient>
43
+ <radialGradient id="wash" cx=".5" cy=".5" r=".5"><stop offset="0" stop-color="#D8EBD2" stop-opacity=".9"/><stop offset="1" stop-color="#D8EBD2" stop-opacity="0"/></radialGradient>
44
+ </defs>
45
+ <circle cx="96" cy="132" r="120" fill="url(#glow)"/>
46
+ <ellipse cx="200" cy="770" rx="260" ry="110" fill="url(#wash)"/>
47
+ <g filter="url(#wc)"><circle cx="96" cy="132" r="44" fill="#F6D262"/></g>
48
+ <g stroke="#EBBE45" stroke-width="7" stroke-linecap="round" fill="none">
49
+ <path d="M96 56V34M96 230v-20M24 132H8M188 132h-18M44 80 32 68M148 184l12 12M44 184l-12 12M148 80l14-14"/>
50
+ </g>
51
+ <path d="M80 126q5-6 10 0M104 126q5-6 10 0" stroke="#8A5A2B" stroke-width="3.2" fill="none" stroke-linecap="round"/>
52
+ <path d="M84 144q12 12 24 0" stroke="#8A5A2B" stroke-width="3.2" fill="none" stroke-linecap="round"/>
53
+ <path d="M412 252C356 260 300 284 236 340" stroke="#8A5E3B" stroke-width="10" fill="none" stroke-linecap="round"/>
54
+ <path d="M326 266c-4-18 4-34 16-46M276 298c10 10 14 22 12 36" stroke="#8A5E3B" stroke-width="6" fill="none" stroke-linecap="round"/>
55
+ <g filter="url(#wc)">
56
+ <g transform="translate(244 340) rotate(172) scale(2)"><path d="M0 0Q1.5 8-1 15" stroke="#8A5E3B" stroke-width="2.4" fill="none" stroke-linecap="round"/><path d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="url(#gkA)" /><path d="M0-3-13-33M0-3-5-39M0-3 5-39M0-3 13-33" stroke="#fff" stroke-opacity=".35" stroke-width="1.2" fill="none" stroke-linecap="round"/></g>
57
+ <g transform="translate(342 222) rotate(200) scale(1.5)"><path d="M0 0Q1.5 8-1 15" stroke="#8A5E3B" stroke-width="2.4" fill="none" stroke-linecap="round"/><path d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="url(#gkB)" /><path d="M0-3-13-33M0-3-5-39M0-3 5-39M0-3 13-33" stroke="#fff" stroke-opacity=".35" stroke-width="1.2" fill="none" stroke-linecap="round"/></g>
58
+ <g transform="translate(288 334) rotate(148) scale(1.5)"><path d="M0 0Q1.5 8-1 15" stroke="#8A5E3B" stroke-width="2.4" fill="none" stroke-linecap="round"/><path d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="url(#gkA)" /><path d="M0-3-13-33M0-3-5-39M0-3 5-39M0-3 13-33" stroke="#fff" stroke-opacity=".35" stroke-width="1.2" fill="none" stroke-linecap="round"/></g>
59
+ </g>
60
+ <g transform="translate(368 258)">
61
+ <ellipse cx="0" cy="-14" rx="17" ry="14" fill="#6FAE7E"/>
62
+ <circle cx="-12" cy="-24" r="9" fill="#6FAE7E"/>
63
+ <path d="M-20 -25l-9 3 9 3z" fill="#E9B949"/>
64
+ <circle cx="-14" cy="-26" r="2" fill="#1F2A22"/>
65
+ <path d="M6 -12q-6 6-14 0" stroke="#4E9A5F" stroke-width="3" fill="none" stroke-linecap="round"/>
66
+ </g>
67
+ <g filter="url(#wc)">
68
+ <g transform="translate(168 600) rotate(-22) scale(3)"><path d="M0 0Q1.5 8-1 15" stroke="#B07D2A" stroke-width="2.4" fill="none" stroke-linecap="round"/><path d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="#F6DA6B" /><path d="M0-3-13-33M0-3-5-39M0-3 5-39M0-3 13-33" stroke="#fff" stroke-opacity=".35" stroke-width="1.2" fill="none" stroke-linecap="round"/></g>
69
+ <path transform="translate(168 600) rotate(-22) scale(3)" d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="url(#wet)"/>
70
+ </g>
71
+ <g filter="url(#wc)" opacity=".95">
72
+ <g transform="translate(70 452) rotate(40) scale(1.1)"><path d="M0 0Q1.5 8-1 15" stroke="#B07D2A" stroke-width="2.4" fill="none" stroke-linecap="round"/><path d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="url(#gkA)" /><path d="M0-3-13-33M0-3-5-39M0-3 5-39M0-3 13-33" stroke="#fff" stroke-opacity=".35" stroke-width="1.2" fill="none" stroke-linecap="round"/></g>
73
+ <g transform="translate(340 470) rotate(-52) scale(1)"><path d="M0 0Q1.5 8-1 15" stroke="#B07D2A" stroke-width="2.4" fill="none" stroke-linecap="round"/><path d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="url(#gkB)" /><path d="M0-3-13-33M0-3-5-39M0-3 5-39M0-3 13-33" stroke="#fff" stroke-opacity=".35" stroke-width="1.2" fill="none" stroke-linecap="round"/></g>
74
+ <g transform="translate(326 690) rotate(24) scale(0.9)"><path d="M0 0Q1.5 8-1 15" stroke="#B07D2A" stroke-width="2.4" fill="none" stroke-linecap="round"/><path d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="url(#gkA)" /><path d="M0-3-13-33M0-3-5-39M0-3 5-39M0-3 13-33" stroke="#fff" stroke-opacity=".35" stroke-width="1.2" fill="none" stroke-linecap="round"/></g>
75
+ </g>
76
+ <g transform="translate(246 534) rotate(-38)">
77
+ <rect x="-5" y="0" width="10" height="150" rx="5" fill="#D9B48A"/>
78
+ <rect x="-6.5" y="-26" width="13" height="30" rx="3" fill="#B9C2BD"/>
79
+ <path d="M-6.5 -26c0-14 3-26 6.5-36 3.5 10 6.5 22 6.5 36z" fill="#EE9B3B"/>
80
+ </g>
81
+ <path d="M-10 748q60-26 110-6t110-4 110 2 110-10v100H-10z" fill="#CFE6C9"/>
82
+ <g stroke="#6FAE7E" stroke-width="4" stroke-linecap="round" fill="none">
83
+ <path d="M150 740l-3-16M162 739l5-18M300 741l-4-18M312 740l4-20M370 736l-2-14"/>
84
+ </g>
85
+ <g filter="url(#wc)">
86
+ <g transform="translate(150 760) rotate(-70) scale(1)"><path d="M0 0Q1.5 8-1 15" stroke="#B07D2A" stroke-width="2.4" fill="none" stroke-linecap="round"/><path d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="url(#gkA)" /><path d="M0-3-13-33M0-3-5-39M0-3 5-39M0-3 13-33" stroke="#fff" stroke-opacity=".35" stroke-width="1.2" fill="none" stroke-linecap="round"/></g>
87
+ <g transform="translate(214 766) rotate(64) scale(1.1)"><path d="M0 0Q1.5 8-1 15" stroke="#B07D2A" stroke-width="2.4" fill="none" stroke-linecap="round"/><path d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="url(#gkB)" /><path d="M0-3-13-33M0-3-5-39M0-3 5-39M0-3 13-33" stroke="#fff" stroke-opacity=".35" stroke-width="1.2" fill="none" stroke-linecap="round"/></g>
88
+ <g transform="translate(262 756) rotate(-20) scale(0.9)"><path d="M0 0Q1.5 8-1 15" stroke="#B07D2A" stroke-width="2.4" fill="none" stroke-linecap="round"/><path d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="url(#gkA)" /><path d="M0-3-13-33M0-3-5-39M0-3 5-39M0-3 13-33" stroke="#fff" stroke-opacity=".35" stroke-width="1.2" fill="none" stroke-linecap="round"/></g>
89
+ </g>
90
+ <g transform="translate(64 752)">
91
+ <path d="M-34 0-31-14-25-5-20-22-13-8-5-27 1-10 9-25 14-8 22-19 26-2z" fill="#9A6B44"/>
92
+ <ellipse cx="0" cy="-6" rx="30" ry="15" fill="#9A6B44"/>
93
+ <path d="M16-14q20 2 28 12-14 9-30 4z" fill="#E9C48A"/>
94
+ <circle cx="44" cy="-2" r="3.4" fill="#1F2A22"/>
95
+ <circle cx="30" cy="-8" r="2.2" fill="#1F2A22"/>
96
+ <path d="M-14 8v6M8 8v6" stroke="#6E4A2C" stroke-width="4" stroke-linecap="round"/>
97
+ </g>
98
+ <text x="282" y="806" transform="rotate(-5 282 806)" font-size="24" font-weight="600" fill="#3D7F4C">朵朵 11.7</text>
99
+ </svg>
100
+ <figure class="peek" style="margin:0">
101
+ <svg viewBox="0 0 120 150" aria-hidden="true"><rect width="120" height="150" fill="#FFFEFA"/><circle cx="30" cy="34" r="14" fill="#F6D262"/><path d="M124 40C106 44 90 52 72 70" stroke="#8A5E3B" stroke-width="3.4" fill="none" stroke-linecap="round"/><g transform="translate(74 72) rotate(172) scale(0.6)"><path d="M0 0Q1.5 8-1 15" stroke="#8A5E3B" stroke-width="2.4" fill="none" stroke-linecap="round"/><path d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="#EFAE45" /><path d="M0-3-13-33M0-3-5-39M0-3 5-39M0-3 13-33" stroke="#fff" stroke-opacity=".35" stroke-width="1.2" fill="none" stroke-linecap="round"/></g><g transform="translate(100 50) rotate(196) scale(0.5)"><path d="M0 0Q1.5 8-1 15" stroke="#8A5E3B" stroke-width="2.4" fill="none" stroke-linecap="round"/><path d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="#F1BE4E" /><path d="M0-3-13-33M0-3-5-39M0-3 5-39M0-3 13-33" stroke="#fff" stroke-opacity=".35" stroke-width="1.2" fill="none" stroke-linecap="round"/></g><g transform="translate(52 108) rotate(-22) scale(0.9)"><path d="M0 0Q1.5 8-1 15" stroke="#B07D2A" stroke-width="2.4" fill="none" stroke-linecap="round"/><path d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="#EE9B3B" /><path d="M0-3-13-33M0-3-5-39M0-3 5-39M0-3 13-33" stroke="#fff" stroke-opacity=".35" stroke-width="1.2" fill="none" stroke-linecap="round"/></g><path d="M0 134q30-8 60-2t60-2v20H0z" fill="#CFE6C9"/></svg>
102
+ <span>老师的范画</span>
103
+ </figure>
104
+ <span class="pill pill-green zoom"><svg class="ic ic-sm" viewBox="0 0 24 24" aria-hidden="true"><path d="m5 12.5 4.5 4.5L19 7.5"/></svg>已自动保存</span>
105
+ </div>
106
+ <div class="tools" role="toolbar" aria-label="画笔工具">
107
+ <button class="tool on" type="button" aria-pressed="true"><svg class="ic" viewBox="0 0 24 24" aria-hidden="true"><path d="M20.5 3.5 12 12"/><path d="M12.6 11.4c-1.2-1.2-3.4-1.1-4.7.2C6.4 13.1 6.8 16.6 3.5 19.5c3.6.8 7.4-.1 9-1.8 1.3-1.3 1.4-3.5.1-4.7z"/></svg>水彩笔</button>
108
+ <button class="tool" type="button"><svg class="ic" viewBox="0 0 24 24" aria-hidden="true"><path d="M14.5 4.5 19.5 9.5 10 19H5v-5z"/><path d="m12.5 6.5 5 5"/><path d="M5 14l5 5"/></svg>蜡笔</button>
109
+ <button class="tool" type="button"><svg class="ic" viewBox="0 0 24 24" aria-hidden="true"><path d="M8.5 19.5 4 15a1.6 1.6 0 0 1 0-2.3l8.6-8.6a1.6 1.6 0 0 1 2.3 0L20 9.2a1.6 1.6 0 0 1 0 2.3l-8 8z"/><path d="m9 9.5 5.5 5.5M11.5 19.5H20"/></svg>橡皮</button>
110
+ <span class="tools-sep"></span>
111
+ <button class="tool" type="button"><svg class="ic" viewBox="0 0 24 24" aria-hidden="true"><path d="M9 5.5 4.5 10 9 14.5"/><path d="M5 10h9.5a5 5 0 0 1 0 10H12"/></svg>撤销</button>
112
+ <span class="tools-gap"></span>
113
+ <button class="size" type="button" aria-label="细笔"><i style="width:8px;height:8px"></i></button>
114
+ <button class="size on" type="button" aria-label="中笔" aria-pressed="true"><i style="width:14px;height:14px"></i></button>
115
+ <button class="size" type="button" aria-label="粗笔"><i style="width:20px;height:20px"></i></button>
116
+ </div>
117
+ </section>
118
+
119
+ <aside class="side">
120
+ <a class="demo-v" href="lesson.html" aria-label="看苗苗老师的示范">
121
+ <svg viewBox="0 0 300 168" aria-hidden="true">
122
+ <rect width="300" height="168" fill="#E2EFDF"/>
123
+ <circle cx="250" cy="34" r="56" fill="#F3F7F2" opacity=".7"/>
124
+ <rect x="176" y="22" width="96" height="124" rx="4" fill="#FFFEFA"/>
125
+ <path d="M224 146v22M190 168l12-22M258 168l-12-22" stroke="#9A6B44" stroke-width="4" stroke-linecap="round"/>
126
+ <g transform="translate(210 92) rotate(168) scale(0.75)"><path d="M0 0Q1.5 8-1 15" stroke="#8A5E3B" stroke-width="2.4" fill="none" stroke-linecap="round"/><path d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="#EFAE45" /><path d="M0-3-13-33M0-3-5-39M0-3 5-39M0-3 13-33" stroke="#fff" stroke-opacity=".35" stroke-width="1.2" fill="none" stroke-linecap="round"/></g><g transform="translate(240 70) rotate(192) scale(0.62)"><path d="M0 0Q1.5 8-1 15" stroke="#8A5E3B" stroke-width="2.4" fill="none" stroke-linecap="round"/><path d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="#F1BE4E" /><path d="M0-3-13-33M0-3-5-39M0-3 5-39M0-3 13-33" stroke="#fff" stroke-opacity=".35" stroke-width="1.2" fill="none" stroke-linecap="round"/></g><g transform="translate(226 128) rotate(-18) scale(0.9)"><path d="M0 0Q1.5 8-1 15" stroke="#B07D2A" stroke-width="2.4" fill="none" stroke-linecap="round"/><path d="M0 0C-4-8-22-20-28-34C-20-46-8-48-2-42L0-34L2-42C8-48 20-46 28-34C22-20 4-8 0 0Z" fill="#EE9B3B" /><path d="M0-3-13-33M0-3-5-39M0-3 5-39M0-3 13-33" stroke="#fff" stroke-opacity=".35" stroke-width="1.2" fill="none" stroke-linecap="round"/></g>
127
+ <g transform="translate(-20 0)">
128
+ <path d="M28 168q6-46 64-48 58 2 64 48z" fill="#FFFFFF"/>
129
+ <path d="M58 168q2-34 34-40 32 6 34 40z" fill="#6FAE7E"/>
130
+ <rect x="84" y="102" width="16" height="22" rx="7" fill="#EDC7A5"/>
131
+ <path d="M62 88q-4-40 30-42 34 2 30 42-4 12-8 14V82q-22-2-36-16-4 10-8 22v14q-6-4-8-14z" fill="#3B2A20"/>
132
+ <ellipse cx="92" cy="84" rx="22" ry="24" fill="#F3D2B3"/>
133
+ <path d="M70 76q4-26 22-28 20 2 22 26-14-4-24-16-8 12-20 18z" fill="#3B2A20"/>
134
+ <path d="M81 85q4-4 8 0M96 85q4-4 8 0" stroke="#3B2A20" stroke-width="2.2" fill="none" stroke-linecap="round"/>
135
+ <path d="M86 96q6 6 12 0" stroke="#A0523C" stroke-width="2.2" fill="none" stroke-linecap="round"/>
136
+ <circle cx="79" cy="93" r="3.4" fill="#F2A99A" opacity=".7"/><circle cx="106" cy="93" r="3.4" fill="#F2A99A" opacity=".7"/>
137
+ <path d="M138 146l34-40" stroke="#D9B48A" stroke-width="5" stroke-linecap="round"/>
138
+ <path d="M172 106l7-12-2 13z" fill="#EE9B3B"/>
139
+ <circle cx="140" cy="146" r="9" fill="#F3D2B3"/>
140
+ </g>
141
+ </svg>
142
+ <span class="play"><svg class="ic" viewBox="0 0 24 24" aria-hidden="true"><path d="M7 4.5v15l12.5-7.5z"/></svg></span>
143
+ <span class="cap">苗苗老师示范<span>02:18</span></span>
144
+ </a>
145
+
146
+ <section class="card steps">
147
+ <div class="card-h"><h2>跟着做</h2><span class="pill pill-green">第 3 步 / 共 3 步</span></div>
148
+ <ol>
149
+ <li class="step done"><span class="n">1</span><div class="step-b"><h3>画出叶子的样子</h3></div><svg class="ic ok" viewBox="0 0 24 24" aria-hidden="true"><path d="m5 12.5 4.5 4.5L19 7.5"/></svg></li>
150
+ <li class="step done"><span class="n">2</span><div class="step-b"><h3>铺一层浅浅的柠檬黄</h3></div><svg class="ic ok" viewBox="0 0 24 24" aria-hidden="true"><path d="m5 12.5 4.5 4.5L19 7.5"/></svg></li>
151
+ <li class="step now">
152
+ <span class="n">3</span>
153
+ <div class="step-b">
154
+ <h3>趁湿点上橘黄</h3>
155
+ <p>笔尖蘸一点橘黄,点在叶子的边上。颜色会自己慢慢晕开,像阳光照进来。</p>
156
+ <div class="blend">
157
+ <svg viewBox="0 0 196 36" aria-hidden="true"><defs><linearGradient id="bl" x1="0" x2="1"><stop offset="0" stop-color="#F6DA6B"/><stop offset="1" stop-color="#EE9B3B"/></linearGradient></defs><circle cx="18" cy="18" r="14" fill="#F6DA6B"/><path d="M40 18h10" stroke="#56665A" stroke-width="2" stroke-linecap="round"/><path d="M46 13l5 5-5 5" stroke="#56665A" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/><circle cx="74" cy="18" r="14" fill="#EE9B3B"/><path d="M96 18h10" stroke="#56665A" stroke-width="2" stroke-linecap="round"/><path d="M102 13l5 5-5 5" stroke="#56665A" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/><rect x="120" y="4" width="76" height="28" rx="14" fill="url(#bl)"/></svg>
158
+ </div>
159
+ <p class="tip"><svg class="ic" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2.8v2.4M12 18.8v2.4M2.8 12h2.4M18.8 12h2.4M5.5 5.5l1.7 1.7M16.8 16.8l1.7 1.7M5.5 18.5l1.7-1.7M16.8 7.2l1.7-1.7"/></svg>纸还亮亮的时候点最好看</p>
160
+ <button class="listen" type="button"><i><svg class="ic" viewBox="0 0 24 24" aria-hidden="true"><path d="M4.5 9.5h3l4.5-4v13l-4.5-4h-3z"/><path d="M15.5 9a4 4 0 0 1 0 6M18 6.5a7.5 7.5 0 0 1 0 11"/></svg></i><span>听老师讲</span><span class="wave" aria-hidden="true"><b style="height:8px"></b><b style="height:14px"></b><b style="height:10px"></b><b style="height:18px"></b><b style="height:12px"></b><b style="height:16px"></b><b style="height:8px"></b><b style="height:12px"></b><b style="height:6px"></b><b style="height:10px"></b></span><time>0:24</time></button>
161
+ </div>
162
+ </li>
163
+ </ol>
164
+ </section>
165
+
166
+ <section class="card palette" aria-label="颜色盘">
167
+ <div class="card-h"><h2>颜色盘</h2><span class="legend"><i></i>这一课推荐</span></div>
168
+ <div class="sw-grid">
169
+ <button class="sw" type="button"><i style="background:#F6DA6B"></i><span class="rec" aria-label="推荐"></span>柠檬黄</button>
170
+ <button class="sw on" type="button" aria-pressed="true"><i style="background:#EE9B3B"><svg class="ic" viewBox="0 0 24 24" aria-hidden="true"><path d="m5 12.5 4.5 4.5L19 7.5"/></svg></i><span class="rec" aria-label="推荐"></span>橘黄</button>
171
+ <button class="sw" type="button"><i style="background:#C9962A"></i>土黄</button>
172
+ <button class="sw" type="button"><i style="background:#9A6B44"></i><span class="rec" aria-label="推荐"></span>赭石</button>
173
+ <button class="sw" type="button"><i style="background:#A9D3A6"></i>嫩绿</button>
174
+ <button class="sw" type="button"><i style="background:#4E9A5F"></i>草绿</button>
175
+ <button class="sw" type="button"><i style="background:#8EC5E0"></i>天蓝</button>
176
+ <button class="sw" type="button"><i style="background:#5C7FB8"></i>群青</button>
177
+ </div>
178
+ <div class="water">
179
+ <span class="water-k"><svg class="ic ic-sm" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3.5c3.2 4.1 5.8 7.2 5.8 10.2a5.8 5.8 0 0 1-11.6 0c0-3 2.6-6.1 5.8-10.2z"/></svg>笔上的水</span>
180
+ <span class="drops">
181
+ <button type="button" aria-label="水少"><i style="width:10px;height:10px"></i></button>
182
+ <button class="on" type="button" aria-label="水适中" aria-pressed="true"><i></i></button>
183
+ <button type="button" aria-label="水多"><i style="width:18px;height:18px"></i></button>
184
+ </span>
185
+ </div>
186
+ </section>
187
+
188
+ <div class="finish">
189
+ <a class="btn btn-primary" href="courses.html"><svg class="ic" viewBox="0 0 24 24" aria-hidden="true"><path d="m5 12.5 4.5 4.5L19 7.5"/></svg>我画好了</a>
190
+ <p><svg class="ic" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 19.5C4.6 11 9.5 5.2 19.8 4.2 20.2 14 14.6 19.6 5 19.5z" fill="#C9962A" stroke="none"/><path d="M5.5 19 13 11.5" stroke="#FFF7DF" stroke-width="1.8" stroke-linecap="round"/></svg>画完能收到 3 片小叶子</p>
191
+ </div>
192
+ </aside>
193
+ </div>
194
+ </div>
195
+ </body>
196
+ </html>
@@ -0,0 +1,55 @@
1
+ :root {
2
+ --bg: #F3F7F2;
3
+ --surface: #FFFFFF;
4
+ --surface-2: #EDF4EB;
5
+ --tint: #E2EFDF;
6
+ --sky: #E3F1EE;
7
+ --text: #1F2A22;
8
+ --muted: #56665A;
9
+ --line: #DCE6DA;
10
+ --primary: #2F7D4F;
11
+ --primary-press: #276B43;
12
+ --primary-soft: #DCEEDF;
13
+ --on: #FFFFFF;
14
+ --accent: #C9962A;
15
+ --accent-soft: #F8EDCF;
16
+ --accent-ink: #7A5710;
17
+ --leaf: #6FAE7E;
18
+ --leaf-deep: #4E9A5F;
19
+ --leaf-light: #B9DDB4;
20
+ --sun: #F2C94C;
21
+ --wood: #9A6B44;
22
+
23
+ --font: "PingFang SC", "HarmonyOS Sans SC", "Microsoft YaHei", system-ui, sans-serif;
24
+ --w-head: 600;
25
+
26
+ --fs-xs: 12px;
27
+ --fs-sm: 13px;
28
+ --fs-md: 15px;
29
+ --fs-lg: 18px;
30
+ --fs-xl: 24px;
31
+ --fs-2xl: 32px;
32
+
33
+ --s-1: 4px;
34
+ --s-2: 8px;
35
+ --s-3: 12px;
36
+ --s-4: 16px;
37
+ --s-5: 24px;
38
+ --s-6: 32px;
39
+ --s-7: 48px;
40
+
41
+ --r-sm: 10px;
42
+ --r-md: 14px;
43
+ --r-lg: 20px;
44
+ --r-full: 999px;
45
+
46
+ --shadow: 0 6px 18px rgba(47, 125, 79, .10);
47
+ --shadow-sm: 0 1px 3px rgba(47, 125, 79, .08);
48
+
49
+ --ease: cubic-bezier(.2, .8, .2, 1);
50
+ --dur: 200ms;
51
+ }
52
+
53
+ @media (prefers-reduced-motion: reduce) {
54
+ :root { --dur: 0ms; }
55
+ }
@@ -0,0 +1,255 @@
1
+ * { box-sizing: border-box; }
2
+ html { -webkit-text-size-adjust: 100%; }
3
+ body {
4
+ margin: 0;
5
+ background: var(--bg);
6
+ color: var(--text);
7
+ font-family: var(--font);
8
+ font-size: var(--fs-md);
9
+ line-height: 1.6;
10
+ -webkit-font-smoothing: antialiased;
11
+ position: relative;
12
+ }
13
+ a { color: inherit; text-decoration: none; }
14
+ button { font: inherit; color: inherit; border: 0; background: none; padding: 0; cursor: pointer; }
15
+ h1, h2, h3, p, ol, ul { margin: 0; padding: 0; }
16
+ ol, ul { list-style: none; }
17
+ svg { display: block; }
18
+ :focus-visible { outline: 3px solid var(--accent); outline-offset: 2px; }
19
+
20
+ .ic { width: 22px; height: 22px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; flex-shrink: 0; }
21
+ .ic-sm { width: 16px; height: 16px; }
22
+
23
+ .status {
24
+ position: absolute; top: 0; left: 0; right: 0; z-index: 3;
25
+ height: 24px; padding: 0 24px;
26
+ display: flex; align-items: center; justify-content: space-between;
27
+ font-size: var(--fs-sm); font-weight: 600; line-height: 1;
28
+ pointer-events: none;
29
+ }
30
+ .status-r { display: flex; align-items: center; gap: 6px; }
31
+ .status-r svg { height: 12px; width: auto; }
32
+
33
+ .btn {
34
+ display: inline-flex; align-items: center; justify-content: center; gap: var(--s-2);
35
+ min-height: 44px; padding: 0 var(--s-4);
36
+ border-radius: var(--r-full);
37
+ font-size: var(--fs-md); font-weight: 600; white-space: nowrap;
38
+ transition: transform var(--dur) var(--ease), background-color var(--dur) var(--ease);
39
+ }
40
+ .btn:active { transform: scale(.97); }
41
+ .btn-primary { background: var(--primary); color: var(--on); box-shadow: 0 4px 12px rgba(47, 125, 79, .22); }
42
+ .btn-primary:hover { background: var(--primary-press); }
43
+ .btn-ghost { background: var(--surface); color: var(--text); border: 1px solid var(--line); }
44
+ .btn-ghost:hover { border-color: var(--leaf-light); }
45
+ .btn-round { width: 44px; padding: 0; }
46
+
47
+ .card { background: var(--surface); border-radius: var(--r-lg); box-shadow: var(--shadow); }
48
+ .card-h { display: flex; align-items: center; justify-content: space-between; gap: var(--s-3); }
49
+ .card-h h2 { font-size: var(--fs-lg); font-weight: var(--w-head); line-height: 1.3; }
50
+
51
+ .pill {
52
+ display: inline-flex; align-items: center; gap: 6px;
53
+ height: 28px; padding: 0 var(--s-3);
54
+ border-radius: var(--r-full);
55
+ font-size: var(--fs-xs); font-weight: 600; white-space: nowrap;
56
+ }
57
+ .pill-green { background: var(--primary-soft); color: var(--primary-press); }
58
+ .pill-sun { background: var(--accent-soft); color: var(--accent-ink); }
59
+ .muted { color: var(--muted); }
60
+
61
+ .stars { display: inline-flex; gap: 2px; }
62
+ .stars svg { width: 14px; height: 14px; fill: var(--line); }
63
+ .stars .on { fill: var(--accent); }
64
+
65
+ .shell { display: grid; grid-template-columns: 96px minmax(0, 1fr); min-height: 100vh; }
66
+
67
+ .rail {
68
+ position: sticky; top: 0; align-self: start;
69
+ height: 100vh;
70
+ display: flex; flex-direction: column; align-items: center; gap: var(--s-2);
71
+ padding: 40px 0 32px;
72
+ background: var(--surface);
73
+ border-right: 1px solid var(--line);
74
+ }
75
+ .rail-logo {
76
+ width: 52px; height: 52px; margin-bottom: var(--s-4);
77
+ display: grid; place-items: center;
78
+ border-radius: 16px; background: var(--primary); color: var(--on);
79
+ }
80
+ .rail-logo svg { width: 30px; height: 30px; }
81
+ .rail-item {
82
+ width: 72px; min-height: 64px;
83
+ display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px;
84
+ border-radius: var(--r-md);
85
+ font-size: var(--fs-xs); font-weight: 500; color: var(--muted); line-height: 1.2;
86
+ transition: background-color var(--dur) var(--ease);
87
+ }
88
+ .rail-item:hover { background: var(--surface-2); }
89
+ .rail-item.on { background: var(--primary-soft); color: var(--primary-press); font-weight: 600; }
90
+ .rail-gap { flex: 1; }
91
+
92
+ .main { min-width: 0; padding: 48px 32px 40px; }
93
+
94
+ .hello { display: flex; align-items: center; gap: var(--s-4); }
95
+ .avatar { width: 60px; height: 60px; border-radius: 50%; flex-shrink: 0; box-shadow: 0 0 0 3px var(--surface), var(--shadow-sm); }
96
+ .hello-t { flex: 1; min-width: 0; }
97
+ .hello h1 { font-size: var(--fs-xl); font-weight: var(--w-head); line-height: 1.3; }
98
+ .hello p { font-size: var(--fs-sm); color: var(--muted); }
99
+ .hello-r { display: flex; align-items: center; gap: var(--s-3); }
100
+ .leaf-count { height: 44px; padding: 0 var(--s-4) 0 var(--s-3); font-size: var(--fs-sm); }
101
+ .leaf-count svg { width: 20px; height: 20px; }
102
+
103
+ .week { margin-top: var(--s-5); display: grid; grid-template-columns: minmax(0, 1fr) 248px; gap: var(--s-4); padding: var(--s-5); }
104
+ .week-top { display: flex; justify-content: space-between; align-items: flex-start; gap: var(--s-4); }
105
+ .week-deco { width: 120px; height: 76px; margin: -8px 8px -12px 0; flex-shrink: 0; }
106
+ .week-l { position: relative; }
107
+ .week-k { font-size: var(--fs-sm); color: var(--muted); font-weight: 500; }
108
+ .week-num { margin-top: 2px; display: flex; align-items: baseline; gap: var(--s-2); }
109
+ .week-num b { font-size: var(--fs-2xl); font-weight: 700; line-height: 1.2; letter-spacing: -.01em; }
110
+ .week-num span { font-size: var(--fs-md); color: var(--muted); }
111
+ .days { margin-top: var(--s-4); display: flex; gap: var(--s-2); }
112
+ .day { width: 40px; display: flex; flex-direction: column; align-items: center; gap: 6px; font-size: var(--fs-xs); color: var(--muted); }
113
+ .day i { width: 36px; height: 36px; border-radius: 50%; display: grid; place-items: center; background: var(--surface-2); }
114
+ .day i svg { width: 18px; height: 18px; }
115
+ .day.done i { background: var(--primary); color: var(--on); }
116
+ .day.today { color: var(--text); font-weight: 600; }
117
+ .day.today i { background: var(--accent-soft); box-shadow: inset 0 0 0 2px var(--accent); color: var(--accent-ink); }
118
+ .day.plan i { background: var(--surface); box-shadow: inset 0 0 0 2px var(--line); }
119
+ .week-goal { margin-top: var(--s-4); display: flex; align-items: center; gap: var(--s-2); font-size: var(--fs-sm); color: var(--muted); }
120
+ .week-goal svg { color: var(--accent); }
121
+ .week-goal svg { width: 20px; height: 20px; }
122
+ .week-goal b { color: var(--text); font-weight: 600; }
123
+
124
+ .next { background: var(--surface-2); border-radius: var(--r-md); padding: var(--s-4); display: flex; flex-direction: column; gap: var(--s-3); }
125
+ .next-k { font-size: var(--fs-xs); color: var(--primary-press); font-weight: 600; display: flex; align-items: center; gap: 6px; }
126
+ .next-row { display: flex; gap: var(--s-3); align-items: center; }
127
+ .next-row svg.thumb { width: 56px; height: 56px; border-radius: var(--r-sm); flex-shrink: 0; }
128
+ .next-row h3 { font-size: var(--fs-md); font-weight: var(--w-head); line-height: 1.35; }
129
+ .next-row p { font-size: var(--fs-xs); color: var(--muted); line-height: 1.5; }
130
+ .next .btn { width: 100%; }
131
+
132
+ .chips { margin-top: var(--s-6); display: flex; gap: var(--s-2); flex-wrap: wrap; }
133
+ .chip {
134
+ min-height: 44px; padding: 0 var(--s-4);
135
+ display: inline-flex; align-items: center; gap: 6px;
136
+ border-radius: var(--r-full); background: var(--surface); border: 1px solid var(--line);
137
+ font-size: var(--fs-md); font-weight: 500; white-space: nowrap;
138
+ }
139
+ .chip small { font-size: var(--fs-xs); color: var(--muted); font-weight: 500; }
140
+ .chip.on { background: var(--text); border-color: var(--text); color: var(--on); }
141
+ .chip.on small { color: #C9D6CC; }
142
+
143
+ .group { margin-top: var(--s-6); }
144
+ .group-h { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: var(--s-3); }
145
+ .group-h h2 { font-size: var(--fs-lg); font-weight: var(--w-head); line-height: 1.3; display: flex; align-items: center; gap: var(--s-2); }
146
+ .group-h h2 span { font-size: var(--fs-sm); font-weight: 500; color: var(--muted); }
147
+ .more { display: inline-flex; align-items: center; min-height: 44px; margin: -12px 0; gap: 2px; font-size: var(--fs-sm); font-weight: 500; color: var(--primary-press); }
148
+ .more svg { width: 16px; height: 16px; }
149
+
150
+ .grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--s-4); }
151
+ .course { display: flex; flex-direction: column; background: var(--surface); border-radius: var(--r-md); box-shadow: var(--shadow); overflow: hidden; transition: transform var(--dur) var(--ease); }
152
+ a.course:hover { transform: translateY(-2px); }
153
+ .art { position: relative; aspect-ratio: 208 / 136; }
154
+ .art > svg { width: 100%; height: 100%; }
155
+ .art .tag { position: absolute; left: 10px; top: 10px; }
156
+ .course-b { padding: var(--s-3) 14px 14px; display: flex; flex-direction: column; gap: 6px; }
157
+ .course-b h3 { font-size: var(--fs-md); font-weight: var(--w-head); line-height: 1.35; }
158
+ .course-meta { display: flex; align-items: center; gap: 6px; font-size: var(--fs-xs); color: var(--muted); }
159
+ .course-meta svg { width: 14px; height: 14px; }
160
+ .course-f { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); margin-top: 2px; }
161
+ .lv { display: flex; align-items: center; gap: 6px; font-size: var(--fs-xs); color: var(--muted); }
162
+ .prog { display: flex; align-items: center; gap: 6px; font-size: var(--fs-xs); color: var(--primary-press); font-weight: 600; white-space: nowrap; }
163
+ .prog i { width: 36px; height: 6px; border-radius: 3px; background: var(--primary-soft); overflow: hidden; display: block; }
164
+ .prog i b { display: block; height: 100%; border-radius: 3px; background: var(--primary); }
165
+
166
+ .lesson { min-height: 100vh; padding: 40px 24px 28px; display: flex; flex-direction: column; gap: var(--s-4); }
167
+ .bar { display: flex; align-items: center; gap: var(--s-3); }
168
+ .bar-t { flex: 1; min-width: 0; }
169
+ .bar-t p { font-size: var(--fs-sm); color: var(--muted); line-height: 1.4; }
170
+ .bar-t h1 { font-size: var(--fs-xl); font-weight: var(--w-head); line-height: 1.3; }
171
+ .bar-r { display: flex; align-items: center; gap: var(--s-2); }
172
+ .timer { display: inline-flex; align-items: center; gap: 6px; margin-right: var(--s-2); font-size: var(--fs-sm); color: var(--muted); font-weight: 500; white-space: nowrap; }
173
+
174
+ .stage { flex: 1; display: grid; grid-template-columns: minmax(0, 1fr) 300px; gap: 20px; }
175
+
176
+ .board { display: flex; flex-direction: column; padding: var(--s-3); gap: var(--s-3); }
177
+ .paper { position: relative; flex: 1; min-height: 520px; border-radius: var(--r-md); background: #FFFEFA; box-shadow: inset 0 0 0 1px var(--line); overflow: hidden; }
178
+ .paper > svg { position: absolute; inset: 0; width: 100%; height: 100%; }
179
+ .peek { margin: 0; position: absolute; top: 12px; right: 12px; width: 96px; padding: 6px; border-radius: var(--r-sm); background: var(--surface); box-shadow: var(--shadow); }
180
+ .peek svg { width: 100%; height: auto; border-radius: 6px; }
181
+ .peek span { display: block; margin-top: 4px; text-align: center; font-size: var(--fs-xs); color: var(--muted); font-weight: 500; line-height: 1.4; }
182
+ .zoom { position: absolute; left: 12px; bottom: 12px; }
183
+
184
+ .tools { display: flex; align-items: center; gap: var(--s-1); padding: 0 var(--s-1); }
185
+ .tool {
186
+ width: 56px; min-height: 56px; flex-shrink: 0;
187
+ display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px;
188
+ border-radius: var(--r-sm); font-size: var(--fs-xs); color: var(--muted); font-weight: 500; line-height: 1.3;
189
+ }
190
+ .tool:hover { background: var(--surface-2); }
191
+ .tool.on { background: var(--primary-soft); color: var(--primary-press); font-weight: 600; }
192
+ .tools-sep { width: 1px; height: 32px; background: var(--line); margin: 0 var(--s-2); }
193
+ .tools-gap { flex: 1; }
194
+ .size { width: 44px; height: 44px; flex-shrink: 0; display: grid; place-items: center; border-radius: 50%; }
195
+ .size i { display: block; border-radius: 50%; background: var(--muted); }
196
+ .size.on { box-shadow: inset 0 0 0 2px var(--primary); }
197
+ .size.on i { background: var(--primary); }
198
+
199
+ .side { display: flex; flex-direction: column; gap: var(--s-4); min-width: 0; }
200
+
201
+ .demo-v { position: relative; display: block; border-radius: var(--r-lg); overflow: hidden; box-shadow: var(--shadow); }
202
+ .demo-v > svg { width: 100%; height: auto; }
203
+ .demo-v .play { position: absolute; left: 50%; top: 46%; transform: translate(-50%, -50%); width: 52px; height: 52px; border-radius: 50%; background: rgba(255, 255, 255, .94); color: var(--primary); display: grid; place-items: center; box-shadow: var(--shadow); }
204
+ .demo-v .play svg { width: 22px; height: 22px; fill: currentColor; stroke: none; margin-left: 3px; }
205
+ .demo-v .cap { position: absolute; left: 0; right: 0; bottom: 0; padding: 22px 14px 10px; display: flex; justify-content: space-between; align-items: flex-end; color: var(--on); font-size: var(--fs-sm); font-weight: 600; background: linear-gradient(transparent, rgba(22, 48, 31, .72)); }
206
+ .demo-v .cap span { font-weight: 500; font-variant-numeric: tabular-nums; }
207
+
208
+ .steps { padding: 20px; flex: 1; display: flex; flex-direction: column; }
209
+ .steps ol { margin-top: var(--s-4); display: flex; flex-direction: column; gap: var(--s-2); }
210
+ .step { display: flex; gap: var(--s-3); padding: var(--s-3); border-radius: var(--r-md); }
211
+ .step .n { width: 28px; height: 28px; flex-shrink: 0; border-radius: 50%; display: grid; place-items: center; font-size: var(--fs-sm); font-weight: 700; line-height: 1; }
212
+ .step h3 { font-size: var(--fs-md); font-weight: var(--w-head); line-height: 1.4; padding-top: 2px; }
213
+ .step p { font-size: var(--fs-sm); color: var(--muted); line-height: 1.6; }
214
+ .step-b { flex: 1; min-width: 0; }
215
+ .step.done .n { background: var(--primary-soft); color: var(--primary-press); }
216
+ .step.done h3 { color: var(--muted); font-weight: 500; }
217
+ .step.done .ok { color: var(--primary); margin-top: 3px; }
218
+ .step.now { background: var(--surface-2); box-shadow: inset 0 0 0 2px var(--leaf-light); }
219
+ .step.now .n { background: var(--primary); color: var(--on); }
220
+ .step.now p { color: var(--text); margin-top: 4px; }
221
+ .blend { margin-top: var(--s-3); display: flex; align-items: center; gap: var(--s-2); font-size: var(--fs-xs); color: var(--muted); }
222
+ .blend svg { width: 100%; max-width: 196px; height: auto; }
223
+ .tip { margin-top: var(--s-3); display: flex; gap: var(--s-2); align-items: flex-start; padding: var(--s-2) var(--s-3); border-radius: var(--r-sm); background: var(--accent-soft); color: var(--accent-ink) !important; font-size: var(--fs-sm); line-height: 1.55; }
224
+ .tip svg { width: 18px; height: 18px; margin-top: 1px; }
225
+
226
+ .palette { padding: 20px; }
227
+ .sw-grid { margin-top: var(--s-3); display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--s-2) var(--s-1); }
228
+ .sw { min-height: 64px; display: flex; flex-direction: column; align-items: center; gap: 4px; font-size: var(--fs-xs); color: var(--muted); line-height: 1.3; }
229
+ .sw i { width: 40px; height: 40px; border-radius: 50%; display: grid; place-items: center; box-shadow: inset 0 0 0 1px rgba(31, 42, 34, .08); color: var(--on); }
230
+ .sw.on { color: var(--text); font-weight: 600; }
231
+ .sw.on i { box-shadow: 0 0 0 3px var(--surface), 0 0 0 5px var(--text); }
232
+ .sw i svg { width: 18px; height: 18px; }
233
+ .water { margin-top: var(--s-3); padding-top: var(--s-3); border-top: 1px solid var(--line); display: flex; align-items: center; gap: var(--s-3); font-size: var(--fs-sm); color: var(--muted); }
234
+ .water-k { display: flex; align-items: center; gap: 6px; color: var(--text); font-weight: 500; flex: 1; }
235
+ .water-k svg { color: #4F93AE; }
236
+ .drops { display: flex; gap: 4px; }
237
+ .drops button { width: 44px; height: 44px; display: grid; place-items: center; border-radius: 50%; }
238
+ .drops i { width: 14px; height: 14px; border-radius: 50%; background: var(--line); display: block; }
239
+ .drops .on i { background: #7DB6CC; }
240
+
241
+ .finish { display: flex; flex-direction: column; gap: var(--s-2); }
242
+ .finish .btn-primary { min-height: 56px; border-radius: var(--r-md); font-size: var(--fs-lg); }
243
+ .finish p { display: flex; align-items: center; justify-content: center; gap: 6px; font-size: var(--fs-sm); color: var(--muted); }
244
+ .finish p svg { width: 18px; height: 18px; }
245
+
246
+ .listen { margin-top: var(--s-3); width: 100%; white-space: nowrap; min-height: 44px; display: flex; align-items: center; gap: var(--s-2); padding: 0 var(--s-3) 0 6px; border-radius: var(--r-full); background: var(--surface); box-shadow: inset 0 0 0 1px var(--line); font-size: var(--fs-sm); font-weight: 500; }
247
+ .listen > i { width: 32px; height: 32px; border-radius: 50%; background: var(--primary); color: var(--on); display: grid; place-items: center; flex-shrink: 0; }
248
+ .listen > i svg { width: 16px; height: 16px; }
249
+ .wave { flex: 1; display: flex; align-items: center; gap: 3px; height: 20px; }
250
+ .wave b { width: 3px; border-radius: 2px; background: var(--leaf-light); }
251
+ .listen time { font-size: var(--fs-xs); color: var(--muted); font-variant-numeric: tabular-nums; }
252
+ .legend { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-sm); color: var(--muted); }
253
+ .legend i, .sw .rec { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); display: block; }
254
+ .sw { position: relative; }
255
+ .sw .rec { position: absolute; top: 0; left: calc(50% + 14px); box-shadow: 0 0 0 2px var(--surface); }
@@ -0,0 +1,21 @@
1
+ {
2
+ "format": 1,
3
+ "type": "template",
4
+ "title": { "zh": "月满市集", "en": "Moon Fair" },
5
+ "description": {
6
+ "zh": "中秋夜市的国潮竖版海报:中国红大色块、满月与桂花枝、竖排粗宋体标题、金色细线和印章",
7
+ "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"
8
+ },
9
+ "kind": "poster",
10
+ "size": "1080x1350",
11
+ "screens": [
12
+ { "file": "poster.html", "title": { "zh": "海报", "en": "Poster" } }
13
+ ],
14
+ "style": "guochao",
15
+ "categories": ["event"],
16
+ "tags": ["cover"],
17
+ "lang": "zh",
18
+ "license": "CC0-1.0",
19
+ "author": { "login": "orderg-x", "id": 271418316 },
20
+ "ai": { "generated": true, "tool": "dsh-design-studio@0.11.0" }
21
+ }