dsh-design-studio 0.10.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.
Files changed (95) hide show
  1. package/README.en.md +4 -3
  2. package/README.md +4 -3
  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 +1455 -39
  68. package/lib/core.js +22 -2
  69. package/lib/gallery/css.js +230 -0
  70. package/lib/gallery/html.js +313 -0
  71. package/lib/gallery/index.js +22 -0
  72. package/lib/gallery/market-routes.js +306 -0
  73. package/lib/gallery/market.js +623 -0
  74. package/lib/gallery/pack.js +311 -0
  75. package/lib/gallery/policy.js +1560 -0
  76. package/lib/gallery/qrfind.js +181 -0
  77. package/lib/gallery/render.js +148 -0
  78. package/lib/gallery/routes.js +360 -0
  79. package/lib/gallery/tar.js +118 -0
  80. package/lib/gallery/use.js +125 -0
  81. package/lib/gallery/zip.js +212 -0
  82. package/lib/handoff.js +190 -36
  83. package/lib/history.js +3 -1
  84. package/lib/index.js +106 -19
  85. package/lib/inspire.js +142 -0
  86. package/lib/offline.js +17 -0
  87. package/lib/picker.js +33 -0
  88. package/lib/serve.js +88 -11
  89. package/lib/works.js +238 -0
  90. package/locale/en.json +2 -1
  91. package/locale/offline/en.json +6 -0
  92. package/locale/offline/zh.json +6 -0
  93. package/locale/zh.json +2 -1
  94. package/package.json +9 -2
  95. package/skills/ui-design/SKILL.md +9 -0
package/README.en.md CHANGED
@@ -1,6 +1,6 @@
1
1
  <div align="center">
2
2
 
3
- <img src="assets/hero.jpg" alt="Design Studio: one sentence gives three directions; pick one, get the full set, click to edit" width="480" />
3
+ ![Design Studio: one sentence gives three directions; pick one, get the full set, click to edit](assets/hero-sm.jpg)
4
4
 
5
5
  <p>
6
6
  <a href="https://github.com/OrderG-X/dsh-design-studio/releases"><img src="https://img.shields.io/github/v/release/OrderG-X/dsh-design-studio?label=release&color=4D6BFE" alt="release" /></a>
@@ -27,7 +27,7 @@
27
27
 
28
28
  **Requirements:** works in the DSH desktop app and the web version, on Mac and Windows. The design check needs Chrome or Edge on your computer.
29
29
 
30
- If DSH can't reach the npm registry, it falls back to a mirror in China. To update, uninstall on the Plugins page and add it again. A new version installs by package name about a day after release; to get it right away, enter the release tarball `https://github.com/OrderG-X/dsh-design-studio/releases/latest/download/dsh-design-studio.tgz` (needs GitHub access).
30
+ If DSH can't reach the npm registry, it falls back to a mirror in China. To update on DSH 0.2.2 or later, open it on the Plugins page and click "Update to …"; on older DSH, uninstall it and add it again. A new version installs by package name about a day after release; to get it right away, uninstall it and enter the release tarball `https://github.com/OrderG-X/dsh-design-studio/releases/latest/download/dsh-design-studio.tgz` (needs GitHub access) — a tarball install can't use Update later.
31
31
 
32
32
  ## Quick start
33
33
 
@@ -43,7 +43,8 @@ If DSH can't reach the npm registry, it falls back to a mirror in China. To upda
43
43
  - **Design check:** one click finds overflowing text, low contrast, small tap targets and tiny text, marked right on the page. In Design mode the model also checks its own work and fixes what it finds.
44
44
  - **Versions and compare:** every turn is saved; drag a slider to compare, and go back to any version.
45
45
  - **Export and phone preview:** showcase images, PDF and PowerPoint (links between screens still work); scan a QR code to see it on your phone at real size.
46
- - **Your brand, and real code:** give a site URL to extract a brand design system and design with it from then on; turn a finished design into React / Vue / HTML, compared screen by screen against the design.
46
+ - **Design library and gallery:** everything you've designed, plus saved references and styles, lives in the Library. Browse templates, design systems and style cards others shared, and "Start from this" copies one for you to keep editing. Share your own with "Share to the gallery": it's checked, zipped and submitted on a web page, and listed once reviewed. The gallery catalog comes from npm mirrors and is used only when its signature and checksums match; to keep it offline, turn on "Design library offline" on the Plugins page.
47
+ - **Your brand, and real code:** give a site URL to extract a brand design system and design with it from then on; turn a finished design into React / Vue / HTML (mini programs straight into uni-app or native WeChat code, HBuilderX projects included), compared screen by screen against the design.
47
48
 
48
49
  See [all features](https://github.com/OrderG-X/dsh-design-studio/blob/main/docs/features.md) for every feature, the tool parameters and the security design, and [development](https://github.com/OrderG-X/dsh-design-studio/blob/main/docs/development.md) for dev setup and tests.
49
50
 
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  <div align="center">
2
2
 
3
- <img src="assets/hero.jpg" alt="设计工作台:一句话做出三个方向,挑一个做全套,点一下就改" width="480" />
3
+ ![设计工作台:一句话做出三个方向,挑一个做全套,点一下就改](assets/hero-sm.jpg)
4
4
 
5
5
  <p>
6
6
  <a href="https://github.com/OrderG-X/dsh-design-studio/releases"><img src="https://img.shields.io/github/v/release/OrderG-X/dsh-design-studio?label=release&color=4D6BFE" alt="release" /></a>
@@ -27,7 +27,7 @@
27
27
 
28
28
  **需要什么**:DSH 桌面版、网页版都能用,Mac、Windows 都行。「设计体检」要电脑上装着 Chrome 或 Edge。
29
29
 
30
- 连不上 npm 时 DSH 会自动换国内镜像。更新:在「插件」页卸载,再添加一次。新版发布后大约一天,按包名才装得到;急的话填发布包地址 `https://github.com/OrderG-X/dsh-design-studio/releases/latest/download/dsh-design-studio.tgz`(要能连上 GitHub)。
30
+ 连不上 npm 时 DSH 会自动换国内镜像。更新:DSH 0.2.2 起,在「插件」页点开它,点「更新到 …」;更老的 DSH 先卸载,再添加一次。新版发布后大约一天,按包名才装得到;急的话卸载后填发布包地址 `https://github.com/OrderG-X/dsh-design-studio/releases/latest/download/dsh-design-studio.tgz`(要能连上 GitHub),不过这样装的以后不能点更新。
31
31
 
32
32
  ## 三步上手
33
33
 
@@ -43,7 +43,8 @@
43
43
  - **设计体检**:一键查文字溢出、对比度不够、按钮太小、字太小,问题直接标在页面上;模型做完也会自己查一遍再改。
44
44
  - **版本和对比**:每轮自动存一版,左右拖动对比,随时回到任意一版。
45
45
  - **导出和手机上看**:导出展示图、PDF、PPT(屏和屏之间的跳转照样能点);扫码在手机上按真机尺寸看。
46
- - **照品牌风格做、转成代码**:给官网地址,提一套品牌设计系统,以后都照它做;做好的设计转成 React / Vue / HTML,逐屏和设计稿比对。
46
+ - **设计库和设计市场**:以前做过的设计、收的参考图和风格都在「设计库」里;市场里逛大家分享的模板、设计系统和风格卡,点「用这个开始」复制一份接着改。自己做的点「分享到设计市场」,查过打成 zip,在网页里交上去,审过就上架。市场目录从 npm 镜像取,签了名、核对过才用;不想让它联网,在插件页打开「设计库不联网」。
47
+ - **照品牌风格做、转成代码**:给官网地址,提一套品牌设计系统,以后都照它做;做好的设计转成 React / Vue / HTML,小程序直接转成 uni-app 或原生小程序代码(HBuilderX 建的项目也认得出),逐屏和设计稿比对。
47
48
 
48
49
  全部功能、工具参数和安全设计见[完整功能](https://github.com/OrderG-X/dsh-design-studio/blob/main/docs/功能详解.md);开发和测试见[开发说明](https://github.com/OrderG-X/dsh-design-studio/blob/main/docs/开发.md)。
49
50
 
Binary file
Binary file
package/cordis.patch.yml CHANGED
@@ -7,6 +7,11 @@
7
7
  # 自动打开预览(模型写了设计用的 HTML、开发服务器起来时)
8
8
  - id: dsh-design-studio-auto
9
9
  name: dsh-design-studio/auto
10
+ # 设计库不联网(默认关):打开后「市场」不访问任何网址,只看下载过的。
11
+ # 反着来是故意的:老版本升级上来没有这一行时,市场照常联网
12
+ - id: dsh-design-studio-offline
13
+ name: dsh-design-studio/offline
14
+ disabled: true
10
15
  # 其他模式(标准、创造 …)也能用预览工具、设计技能;设计模式里自带一份,不受这两行影响
11
16
  - id: dsh-design-studio-tool
12
17
  name: dsh-design-studio/tool
@@ -0,0 +1,64 @@
1
+ * { box-sizing: border-box; }
2
+ html, body { margin: 0; }
3
+ body { font-family: var(--font-sans); font-size: var(--text-body); line-height: 1.5; color: var(--color-text); -webkit-font-smoothing: antialiased; }
4
+ .paper, body {
5
+ background-color: var(--color-bg);
6
+ background-image: radial-gradient(rgba(120, 72, 30, .07) .8px, transparent 1.3px), radial-gradient(rgba(120, 72, 30, .05) .8px, transparent 1.3px);
7
+ background-size: 9px 9px, 13px 13px;
8
+ background-position: 0 0, 4px 6px;
9
+ }
10
+ h1, h2, h3, p, ol, ul { margin: 0; padding: 0; }
11
+ ol, ul { list-style: none; }
12
+ a { color: inherit; text-decoration: none; }
13
+ button { font: inherit; color: inherit; background: none; border: 0; padding: 0; margin: 0; cursor: pointer; }
14
+ svg { display: block; }
15
+ .ico { width: 24px; height: 24px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; flex-shrink: 0; }
16
+ .ico.sm { width: 16px; height: 16px; stroke-width: 2; }
17
+ .serif { font-family: var(--font-serif); }
18
+ .num { font-family: -apple-system, "SF Pro Text", var(--font-sans); font-variant-numeric: tabular-nums; }
19
+
20
+ /* 小程序骨架:状态栏 44 + 导航栏 44,右边 101 让给胶囊 */
21
+ .mp-top { position: sticky; top: 0; z-index: 10; }
22
+ .mp-status { height: 44px; display: flex; align-items: center; justify-content: space-between; padding: 0 26px 0 32px; font: 600 15px/1 -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif; }
23
+ .mp-sys { display: flex; align-items: center; gap: 6px; }
24
+ .mp-sys svg { fill: currentColor; }
25
+ .mp-nav { position: relative; height: 44px; display: flex; align-items: center; justify-content: center; padding: 0 101px; }
26
+ .mp-nav h1 { font-family: var(--font-serif); font-size: var(--text-lg); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
27
+ .mp-nav.custom { justify-content: flex-start; padding-left: 16px; gap: 8px; }
28
+ .mp-back { position: absolute; left: 4px; top: 0; width: 44px; height: 44px; display: grid; place-items: center; }
29
+ .mp-page { padding: 0 16px 100px; }
30
+
31
+ .mp-tabbar { position: fixed; left: 0; right: 0; bottom: 0; z-index: 10; height: 84px; padding-bottom: 34px; display: flex; background: var(--color-surface); border-top: 1px solid var(--color-line); }
32
+ .mp-tabbar > a, .mp-tabbar > .tab { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; font-size: var(--text-xs); color: var(--color-muted); }
33
+ .mp-tabbar > .on { color: var(--color-primary); font-weight: 600; }
34
+ .mp-tabbar > .on .ico { fill: var(--color-primary-soft); }
35
+
36
+ .mp-actionbar { position: fixed; left: 0; right: 0; bottom: 0; z-index: 10; display: flex; align-items: center; gap: 12px; padding: 8px 16px 42px; background: var(--color-surface); box-shadow: 0 -1px 0 var(--color-line), 0 -8px 24px rgba(120, 72, 30, .08); }
37
+
38
+ /* 通用件 */
39
+ .card { background: var(--color-surface); border-radius: var(--radius-md); padding: 16px; }
40
+ .card + .card { margin-top: 12px; }
41
+ .card-head { display: flex; align-items: center; justify-content: space-between; min-height: 24px; margin-bottom: 12px; }
42
+ .card-head h2 { font-family: var(--font-serif); font-size: var(--text-lg); font-weight: 600; }
43
+ .muted { color: var(--color-muted); }
44
+ .btn-primary { display: inline-flex; align-items: center; justify-content: center; height: 48px; padding: 0 28px; border-radius: var(--radius-full); background: var(--color-primary); color: var(--color-on-primary); font-size: var(--text-body); font-weight: 600; box-shadow: 0 6px 16px rgba(169, 84, 42, .28); white-space: nowrap; }
45
+ .btn-ghost { display: inline-flex; align-items: center; justify-content: center; gap: 6px; height: 44px; padding: 0 20px; border-radius: var(--radius-full); border: 1.5px solid var(--color-text); font-size: var(--text-md); font-weight: 600; white-space: nowrap; }
46
+ .price { font-family: -apple-system, "SF Pro Text", var(--font-sans); font-weight: 700; color: var(--color-primary); white-space: nowrap; }
47
+ .price small { font-size: var(--text-sm); margin-right: 1px; }
48
+ .dash { border: 0; border-top: 1.5px dashed var(--color-line); margin: 12px 0; }
49
+
50
+ /* 步进器:看得见的圆 26,点击区 44 */
51
+ .stepper { display: flex; align-items: center; margin-right: -9px; }
52
+ .step { width: 44px; height: 44px; display: grid; place-items: center; }
53
+ .step i { width: 26px; height: 26px; border-radius: 50%; display: grid; place-items: center; }
54
+ .step.minus i { border: 1.5px solid var(--color-muted); color: var(--color-muted); }
55
+ .step.plus i { background: var(--color-primary); color: var(--color-on-primary); }
56
+ .step .ico { width: 16px; height: 16px; stroke-width: 2.2; }
57
+ .qty { min-width: 18px; text-align: center; font-weight: 600; font-size: var(--text-body); }
58
+ .stepper.solo { margin-right: -9px; }
59
+
60
+ /* 碗面小图 */
61
+ .pic { position: relative; flex-shrink: 0; width: 76px; height: 76px; border-radius: var(--radius-hand); background: var(--color-primary-soft); display: grid; place-items: center; }
62
+ .pic.green { background: var(--color-accent-soft); }
63
+ .pic.paper { background-color: var(--color-paper); }
64
+ .bowl { width: 70px; height: 70px; }
@@ -0,0 +1,120 @@
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="miniprogram">
7
+ <title>购物车 · 巷口面馆</title>
8
+ <link rel="stylesheet" href="tokens.css">
9
+ <link rel="stylesheet" href="app.css">
10
+ </head>
11
+ <body class="cart-page">
12
+ <header class="mp-top paper">
13
+ <div class="mp-status"><span>9:41</span><span class="mp-sys"><svg width="18" height="12" viewBox="0 0 18 12" aria-hidden="true"><rect x="0" y="8" width="3" height="4" rx="1"/><rect x="5" y="5.5" width="3" height="6.5" rx="1"/><rect x="10" y="3" width="3" height="9" rx="1"/><rect x="15" y="0" width="3" height="12" rx="1"/></svg><svg width="16" height="12" viewBox="0 0 16 12" aria-hidden="true"><path d="M8 2.2c2.5 0 4.8 1 6.5 2.6l1.2-1.3A11 11 0 0 0 8 .4 11 11 0 0 0 .3 3.5l1.2 1.3A9.3 9.3 0 0 1 8 2.2z"/><path d="M8 5.8c1.5 0 2.9.6 3.9 1.5l1.2-1.3A7.4 7.4 0 0 0 8 4a7.4 7.4 0 0 0-5.1 2l1.2 1.3c1-.9 2.4-1.5 3.9-1.5z"/><path d="M8 9.3c.6 0 1.2.2 1.6.6L8 11.6 6.4 9.9c.4-.4 1-.6 1.6-.6z"/></svg><svg width="27" height="13" viewBox="0 0 27 13" aria-hidden="true"><rect x=".5" y=".5" width="23" height="12" rx="3.5" fill="none" stroke="currentColor" opacity=".45"/><rect x="2" y="2" width="18" height="9" rx="2"/><path d="M25 4.5v4c.8-.3 1.5-1.1 1.5-2s-.7-1.7-1.5-2z" opacity=".5"/></svg></span></div>
14
+ <div class="mp-nav"><a class="mp-back" href="menu.html" aria-label="返回点单"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M15 5l-7 7 7 7"/></svg></a><h1>购物车</h1></div>
15
+ </header>
16
+ <main class="mp-page">
17
+ <div class="seg" role="tablist" aria-label="用餐方式">
18
+ <button class="seg-item on" role="tab" aria-selected="true"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M3.5 11.5h17a8.5 8.5 0 0 1-17 0z"/><path d="M9 20.5h6"/><path d="M12.5 3.5l-2.5 8M18.5 4l-4.5 7.5"/></svg><span><b>堂食</b><small>到店吃,叫号取面</small></span></button>
19
+ <button class="seg-item" role="tab" aria-selected="false"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M5.5 8.5h13l-1 12h-11z"/><path d="M9 10.5V7a3 3 0 0 1 6 0v3.5"/></svg><span><b>外带</b><small>打包 +¥1</small></span></button>
20
+ </div>
21
+
22
+ <section class="card items">
23
+ <header class="card-head"><h2>已选 4 件</h2><button class="text-btn">清空</button></header>
24
+ <div class="line">
25
+ <div class="pic"><svg class="bowl" viewBox="0 0 80 80" aria-hidden="true"><path d="M31 21c-3.5-4 3-6.5-.5-11M40.5 18.5c-3.5-4 3-6.5-.5-11M50 21c-3.5-4 3-6.5-.5-11" fill="none" stroke="#C2A48B" stroke-width="2" stroke-linecap="round"/><path d="M9.5 39.5c1 16.5 13.5 27 30.5 27s29.5-10.5 30.5-27" fill="#FFF9F2" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/><path d="M16.5 52.5q2.9-2.7 5.8 0t5.8 0 5.8 0 5.8 0 5.8 0 5.8 0 5.8 0 5.8 0" fill="none" stroke="#A9542A" stroke-width="1.7" stroke-linecap="round"/><path d="M30 66.6c1.5 3 18.5 3 20 0" fill="none" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/><ellipse cx="40" cy="39.5" rx="31" ry="10" fill="#9C4A26" stroke="#2B1D14" stroke-width="2"/><path d="M17 41.5c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0 6 2 9 0" fill="none" stroke="#F2D795" stroke-width="2.2" stroke-linecap="round"/><path d="M20 37.5c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0" fill="none" stroke="#F2D795" stroke-width="2.2" stroke-linecap="round"/><path transform="translate(27 36) rotate(-8)" d="M-6 0c3.5-2.6 9-2.3 11.6.3C4 3.2-2.4 3.8-6 0z" fill="#6E3218" stroke="#2B1D14" stroke-width="1.2" stroke-linejoin="round"/><path transform="translate(38 33.5) rotate(6)" d="M-6 0c3.5-2.6 9-2.3 11.6.3C4 3.2-2.4 3.8-6 0z" fill="#6E3218" stroke="#2B1D14" stroke-width="1.2" stroke-linejoin="round"/><path transform="translate(33 42) rotate(2)" d="M-6 0c3.5-2.6 9-2.3 11.6.3C4 3.2-2.4 3.8-6 0z" fill="#6E3218" stroke="#2B1D14" stroke-width="1.2" stroke-linejoin="round"/><path d="M48 34c4-3.2 9.5-2.4 12 .8-3 2.6-8.6 2.8-12-.8z" fill="#7C9A5E" stroke="#2B1D14" stroke-width="1.2"/><path d="M49.5 34.2l9 .3" stroke="#E4EAD8" stroke-width="1.2" stroke-linecap="round"/><circle cx="46" cy="42" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/><circle cx="52" cy="40.5" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/><circle cx="24" cy="41.5" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/><circle cx="56" cy="43.5" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/><circle cx="42" cy="45" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/><circle cx="20" cy="38" r="1.1" fill="#E0763A"/><circle cx="58" cy="39" r="1.1" fill="#E0763A"/></svg></div>
26
+ <div class="line-body">
27
+ <h3>红烧牛肉面</h3>
28
+ <p class="spec-txt">中碗 · 微辣 · 加煎蛋</p>
29
+ <div class="line-foot"><span class="price"><small>¥</small>29</span><div class="stepper"><button class="step minus" aria-label="红烧牛肉面减一份"><i><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M6.5 12h11"/></svg></i></button><span class="qty">1</span><button class="step plus" aria-label="红烧牛肉面加一份"><i><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 6.5v11M6.5 12h11"/></svg></i></button></div></div>
30
+ </div>
31
+ </div>
32
+ <div class="opts">
33
+ <p class="opt-label">辣度</p>
34
+ <div class="opt-row"><button class="chip"><span>不辣</span></button><button class="chip on" aria-pressed="true"><span>微辣</span></button><button class="chip"><span>中辣</span></button><button class="chip"><span>特辣</span></button></div>
35
+ <p class="opt-label">加料</p>
36
+ <div class="opt-row"><button class="chip on" aria-pressed="true"><span>煎蛋 +3</span></button><button class="chip"><span>牛肉 +8</span></button><button class="chip"><span>青菜 +2</span></button><button class="chip"><span>加面 +2</span></button></div>
37
+ </div>
38
+ <hr class="dash">
39
+ <div class="line">
40
+ <div class="pic green"><svg class="bowl" viewBox="0 0 80 80" aria-hidden="true"><path d="M9.5 39.5c1 16.5 13.5 27 30.5 27s29.5-10.5 30.5-27" fill="#FFF9F2" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/><path d="M16.5 52.5q2.9-2.7 5.8 0t5.8 0 5.8 0 5.8 0 5.8 0 5.8 0 5.8 0 5.8 0" fill="none" stroke="#A9542A" stroke-width="1.7" stroke-linecap="round"/><path d="M30 66.6c1.5 3 18.5 3 20 0" fill="none" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/><ellipse cx="40" cy="39.5" rx="31" ry="10" fill="#E6BE72" stroke="#2B1D14" stroke-width="2"/><path d="M17 40c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0 6 2 9 0M19 36c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0M22 44c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0" fill="none" stroke="#C99A4E" stroke-width="1.6" stroke-linecap="round"/><path d="M27 34.5l9 3.2M40 33.5l8.4 4.4M31 41l8 1.6M45 40.5l8-2.2" stroke="#3F5A2A" stroke-width="2.4" stroke-linecap="round"/><path d="M28 38.5c4 1 9 .6 13-1.2" fill="none" stroke="#8A4A22" stroke-width="1.6" stroke-linecap="round" opacity=".8"/></svg></div>
41
+ <div class="line-body">
42
+ <h3>葱油拌面</h3>
43
+ <p class="spec-txt">标准份</p>
44
+ <div class="line-foot"><span class="price"><small>¥</small>28</span><div class="stepper"><button class="step minus" aria-label="葱油拌面减一份"><i><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M6.5 12h11"/></svg></i></button><span class="qty">2</span><button class="step plus" aria-label="葱油拌面加一份"><i><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 6.5v11M6.5 12h11"/></svg></i></button></div></div>
45
+ </div>
46
+ </div>
47
+ <hr class="dash">
48
+ <div class="line">
49
+ <div class="pic green"><svg class="bowl" viewBox="0 0 80 80" aria-hidden="true"><ellipse cx="40" cy="47" rx="32" ry="13" fill="#FFF9F2" stroke="#2B1D14" stroke-width="2"/><ellipse cx="40" cy="45.5" rx="22" ry="7.5" fill="none" stroke="#A9542A" stroke-width="1.4" stroke-dasharray="2.5 3"/><g transform="translate(27 40) rotate(-12)"><rect x="-5" y="-3.4" width="10" height="6.8" rx="2.4" fill="#6F9150" stroke="#2B1D14" stroke-width="1.1"/><rect x="-3" y="-1.6" width="6" height="3.2" rx="1.4" fill="#DCE7C6"/></g><g transform="translate(37 37) rotate(8)"><rect x="-5" y="-3.4" width="10" height="6.8" rx="2.4" fill="#6F9150" stroke="#2B1D14" stroke-width="1.1"/><rect x="-3" y="-1.6" width="6" height="3.2" rx="1.4" fill="#DCE7C6"/></g><g transform="translate(47 40) rotate(-4)"><rect x="-5" y="-3.4" width="10" height="6.8" rx="2.4" fill="#6F9150" stroke="#2B1D14" stroke-width="1.1"/><rect x="-3" y="-1.6" width="6" height="3.2" rx="1.4" fill="#DCE7C6"/></g><g transform="translate(33 46) rotate(14)"><rect x="-5" y="-3.4" width="10" height="6.8" rx="2.4" fill="#6F9150" stroke="#2B1D14" stroke-width="1.1"/><rect x="-3" y="-1.6" width="6" height="3.2" rx="1.4" fill="#DCE7C6"/></g><g transform="translate(44 46) rotate(-10)"><rect x="-5" y="-3.4" width="10" height="6.8" rx="2.4" fill="#6F9150" stroke="#2B1D14" stroke-width="1.1"/><rect x="-3" y="-1.6" width="6" height="3.2" rx="1.4" fill="#DCE7C6"/></g><g transform="translate(53 44) rotate(6)"><rect x="-5" y="-3.4" width="10" height="6.8" rx="2.4" fill="#6F9150" stroke="#2B1D14" stroke-width="1.1"/><rect x="-3" y="-1.6" width="6" height="3.2" rx="1.4" fill="#DCE7C6"/></g><circle cx="31" cy="42.5" r="1.2" fill="#D9452B"/><circle cx="50" cy="38.5" r="1.2" fill="#D9452B"/><circle cx="42" cy="42" r="1.1" fill="#FFFDF7" stroke="#2B1D14" stroke-width=".6"/></svg></div>
50
+ <div class="line-body">
51
+ <h3>凉拌黄瓜</h3>
52
+ <p class="spec-txt">蒜香 · 微辣</p>
53
+ <div class="line-foot"><span class="price"><small>¥</small>8</span><div class="stepper"><button class="step minus" aria-label="凉拌黄瓜减一份"><i><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M6.5 12h11"/></svg></i></button><span class="qty">1</span><button class="step plus" aria-label="凉拌黄瓜加一份"><i><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 6.5v11M6.5 12h11"/></svg></i></button></div></div>
54
+ </div>
55
+ </div>
56
+ </section>
57
+
58
+ <section class="card">
59
+ <header class="card-head"><h2>口味备注</h2><span class="muted small">给煮面师傅看</span></header>
60
+ <div class="quick"><button class="chip on" aria-pressed="true"><span>不要香菜</span></button><button class="chip on" aria-pressed="true"><span>汤多一点</span></button><button class="chip"><span>面硬一点</span></button><button class="chip"><span>不要葱</span></button></div>
61
+ <div class="note"><p>面煮软一点,谢谢老板</p><span class="num">10/50</span></div>
62
+ </section>
63
+
64
+ <section class="card sum">
65
+ <p><span>商品小计</span><span class="num">¥65</span></p>
66
+ <p><span><svg class="ico sm" viewBox="0 0 24 24" aria-hidden="true"><path d="M3.5 12.5V4.5h8l9 9-8 8z"/><circle cx="8" cy="9" r="1.4"/></svg>满 60 减 5</span><span class="num minus">−¥5</span></p>
67
+ <p><span>打包费</span><span class="muted">堂食不收</span></p>
68
+ </section>
69
+ </main>
70
+
71
+ <div class="mp-actionbar">
72
+ <div class="total"><p>合计 <b class="num">¥60</b></p><small>已优惠 ¥5</small></div>
73
+ <a class="btn-primary go" href="order.html">去结算</a>
74
+ </div>
75
+
76
+ <style>
77
+ .cart-page .mp-page { padding-top: 8px; padding-bottom: 132px; }
78
+ .small { font-size: var(--text-sm); }
79
+ .seg { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; padding: 6px; border-radius: var(--radius-lg); background: var(--color-paper); margin-bottom: 12px; }
80
+ .seg-item { display: flex; align-items: center; gap: 10px; min-height: 56px; padding: 8px 12px; border-radius: 14px; color: var(--color-muted); text-align: left; }
81
+ .seg-item b { display: block; font-family: var(--font-serif); font-size: var(--text-body); color: var(--color-text); line-height: 1.3; }
82
+ .seg-item small { display: block; font-size: var(--text-xs); line-height: 1.3; }
83
+ .seg-item.on { background: var(--color-surface); color: var(--color-primary); box-shadow: var(--shadow-sm); }
84
+ .seg-item.on small { color: var(--color-muted); }
85
+
86
+ .text-btn { height: 44px; min-width: 44px; padding: 0 2px 0 12px; margin: -10px -2px -10px 0; font-size: var(--text-md); color: var(--color-muted); }
87
+ .line { display: flex; gap: 12px; }
88
+ .line .pic { width: 68px; height: 68px; }
89
+ .line .bowl { width: 62px; height: 62px; }
90
+ .line-body { flex: 1; min-width: 0; }
91
+ .line-body h3 { font-family: var(--font-serif); font-size: var(--text-body); font-weight: 700; line-height: 1.35; }
92
+ .spec-txt { font-size: var(--text-sm); color: var(--color-muted); }
93
+ .line-foot { display: flex; align-items: center; justify-content: space-between; height: 40px; margin-top: 2px; }
94
+ .line-foot .price { font-size: var(--text-lg); }
95
+
96
+ .opts { margin-top: 10px; padding: 8px 12px 4px; border-radius: 12px; background: var(--color-bg); }
97
+ .opt-label { font-size: var(--text-sm); color: var(--color-muted); margin-top: 2px; }
98
+ .opt-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
99
+ .chip { height: 44px; display: grid; place-items: stretch; align-content: center; }
100
+ .chip > span { display: grid; place-items: center; height: 32px; padding: 0 6px; border-radius: 10px; border: 1px solid var(--color-line); background: var(--color-surface); font-size: var(--text-sm); color: var(--color-text); white-space: nowrap; }
101
+ .chip.on > span { border-color: var(--color-primary); background: var(--color-primary-soft); color: var(--color-primary-deep); font-weight: 600; }
102
+
103
+ .quick { display: flex; flex-wrap: wrap; gap: 0 8px; }
104
+ .quick .chip > span { padding: 0 12px; border-radius: var(--radius-full); }
105
+ .note { position: relative; margin-top: 8px; min-height: 72px; padding: 12px 14px; border-radius: 12px; border: 1px solid var(--color-line); background: var(--color-bg); font-size: var(--text-md); }
106
+ .note span { position: absolute; right: 12px; bottom: 8px; font-size: var(--text-xs); color: var(--color-muted); }
107
+
108
+ .sum p { display: flex; align-items: center; justify-content: space-between; font-size: var(--text-md); line-height: 2; }
109
+ .sum p > span:first-child { display: inline-flex; align-items: center; gap: 6px; }
110
+ .sum .ico { color: var(--color-primary); }
111
+ .sum .minus { color: var(--color-primary-deep); font-weight: 600; }
112
+
113
+ .total { flex: 1; }
114
+ .total p { font-size: var(--text-md); }
115
+ .total b { font-size: var(--text-xl); color: var(--color-primary); }
116
+ .total small { display: block; font-size: var(--text-sm); color: var(--color-muted); line-height: 1.2; }
117
+ .go { min-width: 148px; }
118
+ </style>
119
+ </body>
120
+ </html>
@@ -0,0 +1,56 @@
1
+ {
2
+ "format": 1,
3
+ "type": "template",
4
+ "title": {
5
+ "zh": "巷口面馆",
6
+ "en": "Alley Noodles"
7
+ },
8
+ "description": {
9
+ "zh": "街边面馆的点单小程序:分类点单、口味备注、取餐叫号,手绘碗面配纸感底色",
10
+ "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"
11
+ },
12
+ "kind": "miniprogram",
13
+ "screens": [
14
+ {
15
+ "file": "menu.html",
16
+ "title": {
17
+ "zh": "点单",
18
+ "en": "Menu"
19
+ }
20
+ },
21
+ {
22
+ "file": "cart.html",
23
+ "title": {
24
+ "zh": "购物车",
25
+ "en": "Cart"
26
+ }
27
+ },
28
+ {
29
+ "file": "order.html",
30
+ "title": {
31
+ "zh": "订单",
32
+ "en": "Order"
33
+ }
34
+ }
35
+ ],
36
+ "style": "warm",
37
+ "categories": [
38
+ "food"
39
+ ],
40
+ "tags": [
41
+ "menu",
42
+ "cart",
43
+ "checkout",
44
+ "illustration"
45
+ ],
46
+ "lang": "zh",
47
+ "license": "CC0-1.0",
48
+ "author": {
49
+ "login": "orderg-x",
50
+ "id": 271418316
51
+ },
52
+ "ai": {
53
+ "generated": true,
54
+ "tool": "dsh-design-studio@0.11.0"
55
+ }
56
+ }
@@ -0,0 +1,200 @@
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="miniprogram">
7
+ <title>点单 · 巷口面馆</title>
8
+ <link rel="stylesheet" href="tokens.css">
9
+ <link rel="stylesheet" href="app.css">
10
+ </head>
11
+ <body>
12
+ <header class="mp-top paper">
13
+ <div class="mp-status"><span>9:41</span><span class="mp-sys"><svg width="18" height="12" viewBox="0 0 18 12" aria-hidden="true"><rect x="0" y="8" width="3" height="4" rx="1"/><rect x="5" y="5.5" width="3" height="6.5" rx="1"/><rect x="10" y="3" width="3" height="9" rx="1"/><rect x="15" y="0" width="3" height="12" rx="1"/></svg><svg width="16" height="12" viewBox="0 0 16 12" aria-hidden="true"><path d="M8 2.2c2.5 0 4.8 1 6.5 2.6l1.2-1.3A11 11 0 0 0 8 .4 11 11 0 0 0 .3 3.5l1.2 1.3A9.3 9.3 0 0 1 8 2.2z"/><path d="M8 5.8c1.5 0 2.9.6 3.9 1.5l1.2-1.3A7.4 7.4 0 0 0 8 4a7.4 7.4 0 0 0-5.1 2l1.2 1.3c1-.9 2.4-1.5 3.9-1.5z"/><path d="M8 9.3c.6 0 1.2.2 1.6.6L8 11.6 6.4 9.9c.4-.4 1-.6 1.6-.6z"/></svg><svg width="27" height="13" viewBox="0 0 27 13" aria-hidden="true"><rect x=".5" y=".5" width="23" height="12" rx="3.5" fill="none" stroke="currentColor" opacity=".45"/><rect x="2" y="2" width="18" height="9" rx="2"/><path d="M25 4.5v4c.8-.3 1.5-1.1 1.5-2s-.7-1.7-1.5-2z" opacity=".5"/></svg></span></div>
14
+ <div class="mp-nav custom">
15
+ <span class="seal serif" aria-hidden="true">巷</span>
16
+ <span class="brand serif">巷口面馆</span>
17
+ <button class="branch">老街店<svg class="ico sm" viewBox="0 0 24 24" aria-hidden="true"><path d="M7 10l5 5 5-5"/></svg></button>
18
+ </div>
19
+ </header>
20
+ <main class="menu">
21
+ <section class="shop">
22
+ <div class="shop-main">
23
+ <p class="shop-status"><i class="dot" aria-hidden="true"></i>营业中 · 10:00–21:30 · 距你 280 米</p>
24
+ <p class="shop-note serif">牛骨汤每天现熬 8 小时</p>
25
+ <div class="coupons"><span class="coupon">满 60 减 5</span><span class="coupon">满 99 减 12</span></div>
26
+ </div>
27
+ <svg class="shopfront" viewBox="0 0 96 84" aria-hidden="true">
28
+ <path d="M14 31v45h68V31" fill="#F3E3D0" stroke="#2B1D14" stroke-width="2" stroke-linejoin="round"/>
29
+ <path d="M8 28l7-15h66l7 15z" fill="#A9542A" stroke="#2B1D14" stroke-width="2" stroke-linejoin="round"/>
30
+ <path d="M26.5 13.5L24 28M40 13.5L39 28M54 13.5l.6 14.5M68 13.5l2 14.5" stroke="#FFF9F2" stroke-width="3.2" stroke-linecap="round"/>
31
+ <path d="M8 28q5 7 10 0t10 0 10 0 10 0 10 0 10 0 10 0 10 0" fill="#FFF9F2" stroke="#2B1D14" stroke-width="2" stroke-linejoin="round"/>
32
+ <rect x="34" y="3" width="28" height="11" rx="2" fill="#FFF9F2" stroke="#2B1D14" stroke-width="1.8"/>
33
+ <path d="M39 8.5h3M45 7v3.5M49 8.5h3M55.5 7.5v2.5" stroke="#A9542A" stroke-width="1.8" stroke-linecap="round"/>
34
+ <rect x="21" y="44" width="24" height="18" rx="2" fill="#FFF9F2" stroke="#2B1D14" stroke-width="1.8"/>
35
+ <path d="M25 52h16c-.6 4.6-3.6 7-8 7s-7.4-2.4-8-7z" fill="#F4DFD0" stroke="#2B1D14" stroke-width="1.4"/><path d="M31 49.5c-1-1.4 1-2.2 0-3.6M35.5 49.5c-1-1.4 1-2.2 0-3.6" fill="none" stroke="#C2A48B" stroke-width="1.4" stroke-linecap="round"/>
36
+ <path d="M55 76V52a7 7 0 0 1 14 0v24" fill="#6E5A4B" stroke="#2B1D14" stroke-width="1.8"/><circle cx="65" cy="65" r="1.2" fill="#F3E3D0"/>
37
+ <path d="M88 30v4" stroke="#2B1D14" stroke-width="1.6"/><ellipse cx="88" cy="41" rx="5.5" ry="7" fill="#D9652F" stroke="#2B1D14" stroke-width="1.6"/><path d="M85 41h6" stroke="#2B1D14" stroke-width="1" opacity=".5"/><path d="M88 48v4" stroke="#2B1D14" stroke-width="1.6"/>
38
+ <path d="M3 76.5h90" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/>
39
+ <path d="M76 76c0-6 5-6 5-11M80 76c0-4 3-4 3-7" fill="none" stroke="#5E7A4A" stroke-width="1.8" stroke-linecap="round"/>
40
+ </svg>
41
+ </section>
42
+
43
+ <div class="board">
44
+ <aside class="cats" aria-label="分类">
45
+ <button class="cat"><svg class="ico sm" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 21c3.9 0 6.5-2.6 6.5-6.2 0-3.3-2.3-5.6-3.9-7.8-.4 2-1.4 3.2-2.6 3.8.2-3-1.2-5.6-3.8-7.3.2 3.1-1.6 5-3 7A7.3 7.3 0 0 0 5.5 15c0 3.5 2.6 6 6.5 6z"/></svg>热卖</button>
46
+ <button class="cat on" aria-current="true">招牌面<b class="cat-n">1</b></button>
47
+ <button class="cat">汤面</button>
48
+ <button class="cat">拌面<b class="cat-n">2</b></button>
49
+ <button class="cat">浇头加料</button>
50
+ <button class="cat">小菜<b class="cat-n">1</b></button>
51
+ <button class="cat">饮品</button>
52
+ </aside>
53
+ <div class="list">
54
+ <header class="sec-head"><h2 class="serif">招牌面</h2><span>老汤慢熬,面现切</span></header>
55
+
56
+ <article class="dish">
57
+ <div class="pic "><svg class="bowl" viewBox="0 0 80 80" aria-hidden="true"><path d="M31 21c-3.5-4 3-6.5-.5-11M40.5 18.5c-3.5-4 3-6.5-.5-11M50 21c-3.5-4 3-6.5-.5-11" fill="none" stroke="#C2A48B" stroke-width="2" stroke-linecap="round"/><path d="M9.5 39.5c1 16.5 13.5 27 30.5 27s29.5-10.5 30.5-27" fill="#FFF9F2" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/><path d="M16.5 52.5q2.9-2.7 5.8 0t5.8 0 5.8 0 5.8 0 5.8 0 5.8 0 5.8 0 5.8 0" fill="none" stroke="#A9542A" stroke-width="1.7" stroke-linecap="round"/><path d="M30 66.6c1.5 3 18.5 3 20 0" fill="none" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/><ellipse cx="40" cy="39.5" rx="31" ry="10" fill="#9C4A26" stroke="#2B1D14" stroke-width="2"/><path d="M17 41.5c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0 6 2 9 0" fill="none" stroke="#F2D795" stroke-width="2.2" stroke-linecap="round"/><path d="M20 37.5c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0" fill="none" stroke="#F2D795" stroke-width="2.2" stroke-linecap="round"/><path transform="translate(27 36) rotate(-8)" d="M-6 0c3.5-2.6 9-2.3 11.6.3C4 3.2-2.4 3.8-6 0z" fill="#6E3218" stroke="#2B1D14" stroke-width="1.2" stroke-linejoin="round"/><path transform="translate(38 33.5) rotate(6)" d="M-6 0c3.5-2.6 9-2.3 11.6.3C4 3.2-2.4 3.8-6 0z" fill="#6E3218" stroke="#2B1D14" stroke-width="1.2" stroke-linejoin="round"/><path transform="translate(33 42) rotate(2)" d="M-6 0c3.5-2.6 9-2.3 11.6.3C4 3.2-2.4 3.8-6 0z" fill="#6E3218" stroke="#2B1D14" stroke-width="1.2" stroke-linejoin="round"/><path d="M48 34c4-3.2 9.5-2.4 12 .8-3 2.6-8.6 2.8-12-.8z" fill="#7C9A5E" stroke="#2B1D14" stroke-width="1.2"/><path d="M49.5 34.2l9 .3" stroke="#E4EAD8" stroke-width="1.2" stroke-linecap="round"/><circle cx="46" cy="42" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/><circle cx="52" cy="40.5" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/><circle cx="24" cy="41.5" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/><circle cx="56" cy="43.5" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/><circle cx="42" cy="45" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/><circle cx="20" cy="38" r="1.1" fill="#E0763A"/><circle cx="58" cy="39" r="1.1" fill="#E0763A"/></svg></div>
58
+ <div class="dish-body">
59
+ <h3 class="dish-name">红烧牛肉面</h3>
60
+ <p class="dish-desc">牛腱慢炖四小时,汤浓肉烂</p>
61
+ <p class="dish-meta"><span class="hot">招牌</span>月售 1200+</p>
62
+ <div class="dish-foot">
63
+ <span class="price"><small>¥</small>26</span>
64
+ <button class="spec"><span>选规格<b class="spec-n">1</b></span></button>
65
+ </div>
66
+ </div>
67
+ </article>
68
+
69
+ <article class="dish">
70
+ <div class="pic "><svg class="bowl" viewBox="0 0 80 80" aria-hidden="true"><path d="M31 21c-3.5-4 3-6.5-.5-11M40.5 18.5c-3.5-4 3-6.5-.5-11M50 21c-3.5-4 3-6.5-.5-11" fill="none" stroke="#C2A48B" stroke-width="2" stroke-linecap="round"/><path d="M9.5 39.5c1 16.5 13.5 27 30.5 27s29.5-10.5 30.5-27" fill="#FFF9F2" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/><path d="M16.5 52.5q2.9-2.7 5.8 0t5.8 0 5.8 0 5.8 0 5.8 0 5.8 0 5.8 0 5.8 0" fill="none" stroke="#A9542A" stroke-width="1.7" stroke-linecap="round"/><path d="M30 66.6c1.5 3 18.5 3 20 0" fill="none" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/><ellipse cx="40" cy="39.5" rx="31" ry="10" fill="#C85A32" stroke="#2B1D14" stroke-width="2"/><path d="M17 41.5c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0 6 2 9 0" fill="none" stroke="#F4DDA4" stroke-width="2.2" stroke-linecap="round"/><path d="M20 37.5c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0" fill="none" stroke="#F4DDA4" stroke-width="2.2" stroke-linecap="round"/><path d="M24 34.5a5.4 5.4 0 0 1 10 2.2z" fill="#D9452B" stroke="#2B1D14" stroke-width="1.2" stroke-linejoin="round"/><path d="M44 33a5.4 5.4 0 0 1 9.6 3.4z" fill="#D9452B" stroke="#2B1D14" stroke-width="1.2" stroke-linejoin="round"/><rect x="33" y="38" width="7" height="6" rx="1.6" fill="#7A3A1C" stroke="#2B1D14" stroke-width="1.2" transform="rotate(-8 36 41)"/><rect x="47" y="39" width="7" height="6" rx="1.6" fill="#7A3A1C" stroke="#2B1D14" stroke-width="1.2" transform="rotate(10 50 42)"/><circle cx="28" cy="42" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/><circle cx="57" cy="37" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/><circle cx="42" cy="35" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/><circle cx="22" cy="39" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/></svg></div>
71
+ <div class="dish-body">
72
+ <h3 class="dish-name">番茄牛腩面</h3>
73
+ <p class="dish-desc">整颗番茄熬汤,酸甜开胃</p>
74
+ <p class="dish-meta">月售 860</p>
75
+ <div class="dish-foot">
76
+ <span class="price"><small>¥</small>28</span>
77
+ <button class="spec"><span>选规格</span></button>
78
+ </div>
79
+ </div>
80
+ </article>
81
+
82
+ <article class="dish">
83
+ <div class="pic green"><svg class="bowl" viewBox="0 0 80 80" aria-hidden="true"><path d="M31 21c-3.5-4 3-6.5-.5-11M40.5 18.5c-3.5-4 3-6.5-.5-11M50 21c-3.5-4 3-6.5-.5-11" fill="none" stroke="#C2A48B" stroke-width="2" stroke-linecap="round"/><path d="M9.5 39.5c1 16.5 13.5 27 30.5 27s29.5-10.5 30.5-27" fill="#FFF9F2" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/><path d="M16.5 52.5q2.9-2.7 5.8 0t5.8 0 5.8 0 5.8 0 5.8 0 5.8 0 5.8 0 5.8 0" fill="none" stroke="#A9542A" stroke-width="1.7" stroke-linecap="round"/><path d="M30 66.6c1.5 3 18.5 3 20 0" fill="none" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/><ellipse cx="40" cy="39.5" rx="31" ry="10" fill="#EAD8B4" stroke="#2B1D14" stroke-width="2"/><path d="M17 41.5c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0 6 2 9 0" fill="none" stroke="#F7E6B8" stroke-width="2.2" stroke-linecap="round"/><path d="M20 37.5c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0" fill="none" stroke="#F7E6B8" stroke-width="2.2" stroke-linecap="round"/><path d="M24 35.5c2-1.5 4 .8 6-.4M27 40.5c2.4-1.2 4 1 6.4-.2M45 35c2-1.4 4 1 6-.2M50 41c2.2-1.3 4 .8 6.2-.3" fill="none" stroke="#5E7A4A" stroke-width="2" stroke-linecap="round"/><path d="M35 37l6 1.5M37 41.5l6.4.8M41 34.5l5 1.8" stroke="#C98D63" stroke-width="2.2" stroke-linecap="round"/></svg></div>
84
+ <div class="dish-body">
85
+ <h3 class="dish-name">雪菜肉丝面</h3>
86
+ <p class="dish-desc">清汤打底,雪菜脆口</p>
87
+ <p class="dish-meta">月售 540</p>
88
+ <div class="dish-foot">
89
+ <span class="price"><small>¥</small>18</span>
90
+ <button class="spec"><span>选规格</span></button>
91
+ </div>
92
+ </div>
93
+ </article>
94
+ <article class="dish soldout">
95
+ <div class="pic paper"><div class="fade"><svg class="bowl" viewBox="0 0 80 80" aria-hidden="true"><path d="M9.5 39.5c1 16.5 13.5 27 30.5 27s29.5-10.5 30.5-27" fill="#FFF9F2" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/><path d="M16.5 52.5q2.9-2.7 5.8 0t5.8 0 5.8 0 5.8 0 5.8 0 5.8 0 5.8 0 5.8 0" fill="none" stroke="#A9542A" stroke-width="1.7" stroke-linecap="round"/><path d="M30 66.6c1.5 3 18.5 3 20 0" fill="none" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/><ellipse cx="40" cy="39.5" rx="31" ry="10" fill="#B9774A" stroke="#2B1D14" stroke-width="2"/><path d="M17 41.5c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0 6 2 9 0" fill="none" stroke="#F2D795" stroke-width="2.2" stroke-linecap="round"/><path d="M20 37.5c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0" fill="none" stroke="#F2D795" stroke-width="2.2" stroke-linecap="round"/><path d="M23 37c2-3.2 8-3.6 11-.6-1.4 3.4-8.6 4-11 .6z" fill="#5A2A14" stroke="#2B1D14" stroke-width="1.2"/><path d="M38 35c2-3.4 8.4-3.6 11.4-.4-1.6 3.4-9 4-11.4.4z" fill="#5A2A14" stroke="#2B1D14" stroke-width="1.2"/><path d="M26 36.2l3.6-.8M41.4 34l4-.8" stroke="#C98D63" stroke-width="1.1" stroke-linecap="round"/><circle cx="52" cy="41" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/><circle cx="30" cy="42.5" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/><circle cx="57" cy="37.5" r="1.7" fill="#9DB97A" stroke="#4E6B3A" stroke-width=".8"/></svg></div><span class="stamp serif">售罄</span></div>
96
+ <div class="dish-body">
97
+ <h3 class="dish-name">苏式爆鱼面</h3>
98
+ <p class="dish-desc">青鱼现炸,甜口酱汁</p>
99
+ <p class="dish-meta">每天限 30 碗</p>
100
+ <div class="dish-foot"><span class="price off"><small>¥</small>24</span><span class="later">明早 10 点再来</span></div>
101
+ </div>
102
+ </article>
103
+ <header class="sec-head"><h2 class="serif">拌面</h2><span>拌匀了再吃</span></header>
104
+
105
+ <article class="dish">
106
+ <div class="pic green"><svg class="bowl" viewBox="0 0 80 80" aria-hidden="true"><path d="M9.5 39.5c1 16.5 13.5 27 30.5 27s29.5-10.5 30.5-27" fill="#FFF9F2" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/><path d="M16.5 52.5q2.9-2.7 5.8 0t5.8 0 5.8 0 5.8 0 5.8 0 5.8 0 5.8 0 5.8 0" fill="none" stroke="#A9542A" stroke-width="1.7" stroke-linecap="round"/><path d="M30 66.6c1.5 3 18.5 3 20 0" fill="none" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/><ellipse cx="40" cy="39.5" rx="31" ry="10" fill="#E6BE72" stroke="#2B1D14" stroke-width="2"/><path d="M17 40c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0 6 2 9 0M19 36c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0M22 44c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0" fill="none" stroke="#C99A4E" stroke-width="1.6" stroke-linecap="round"/><path d="M27 34.5l9 3.2M40 33.5l8.4 4.4M31 41l8 1.6M45 40.5l8-2.2" stroke="#3F5A2A" stroke-width="2.4" stroke-linecap="round"/><path d="M28 38.5c4 1 9 .6 13-1.2" fill="none" stroke="#8A4A22" stroke-width="1.6" stroke-linecap="round" opacity=".8"/></svg></div>
107
+ <div class="dish-body">
108
+ <h3 class="dish-name">葱油拌面</h3>
109
+ <p class="dish-desc">小葱慢熬出油,酱香浓</p>
110
+ <p class="dish-meta"><span class="hot">人气</span>月售 980</p>
111
+ <div class="dish-foot">
112
+ <span class="price"><small>¥</small>14</span>
113
+ <div class="stepper"><button class="step minus" aria-label="葱油拌面减一份"><i><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M6.5 12h11"/></svg></i></button><span class="qty">2</span><button class="step plus" aria-label="葱油拌面加一份"><i><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 6.5v11M6.5 12h11"/></svg></i></button></div>
114
+ </div>
115
+ </div>
116
+ </article>
117
+
118
+ <article class="dish">
119
+ <div class="pic "><svg class="bowl" viewBox="0 0 80 80" aria-hidden="true"><path d="M9.5 39.5c1 16.5 13.5 27 30.5 27s29.5-10.5 30.5-27" fill="#FFF9F2" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/><path d="M16.5 52.5q2.9-2.7 5.8 0t5.8 0 5.8 0 5.8 0 5.8 0 5.8 0 5.8 0 5.8 0" fill="none" stroke="#A9542A" stroke-width="1.7" stroke-linecap="round"/><path d="M30 66.6c1.5 3 18.5 3 20 0" fill="none" stroke="#2B1D14" stroke-width="2" stroke-linecap="round"/><ellipse cx="40" cy="39.5" rx="31" ry="10" fill="#EDD39A" stroke="#2B1D14" stroke-width="2"/><path d="M17 40c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0 6 2 9 0M20 36c3-2.4 6 2 9 0s6 2 9 0 6 2 9 0 6 2 9 0" fill="none" stroke="#C99A4E" stroke-width="1.6" stroke-linecap="round"/><path d="M29 38.5c0-4.6 5-6.8 11-6.8s11 2.2 11 6.8c-3 2.4-19 2.4-22 0z" fill="#5A3420" stroke="#2B1D14" stroke-width="1.2"/><path d="M53 37.5l8 2.6M54 41.5l7.4 1M20 38l7 2.6M22 42.5l6-.4" stroke="#8FAE6E" stroke-width="2.2" stroke-linecap="round"/></svg></div>
120
+ <div class="dish-body">
121
+ <h3 class="dish-name">老式炸酱面</h3>
122
+ <p class="dish-desc">黄酱干炸,配黄瓜丝</p>
123
+ <p class="dish-meta">月售 410</p>
124
+ <div class="dish-foot">
125
+ <span class="price"><small>¥</small>19</span>
126
+ <div class="stepper solo"><button class="step plus" aria-label="老式炸酱面加一份"><i><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 6.5v11M6.5 12h11"/></svg></i></button></div>
127
+ </div>
128
+ </div>
129
+ </article>
130
+ </div>
131
+ </div>
132
+ </main>
133
+
134
+ <div class="fade-tail" aria-hidden="true"></div>
135
+ <a class="cartbar" href="cart.html" aria-label="购物车,4 件,去结算">
136
+ <span class="cart-ico"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M5.5 8.5h13l-1 12h-11z"/><path d="M9 10.5V7a3 3 0 0 1 6 0v3.5"/></svg><b class="cart-n">4</b></span>
137
+ <span class="cart-sum"><b class="num">¥60</b><small>已减 ¥5 · 堂食</small></span>
138
+ <span class="cart-go">选好了</span>
139
+ </a>
140
+ <nav class="mp-tabbar" aria-label="主导航">
141
+ <a class="on" href="menu.html" aria-current="page"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M3.5 11.5h17a8.5 8.5 0 0 1-17 0z"/><path d="M9 20.5h6"/><path d="M12.5 3.5l-2.5 8M18.5 4l-4.5 7.5"/></svg><span>点单</span></a>
142
+ <a href="order.html"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M6 3.5h12v17l-2.4-1.5-2.4 1.5-2.4-1.5-2.4 1.5L6 20.5z"/><path d="M9 8.5h6M9 12.5h6M9 16h3"/></svg><span>订单</span></a>
143
+ <span class="tab"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="8.5" r="3.8"/><path d="M4.5 20.5c1.3-3.8 4.1-5.6 7.5-5.6s6.2 1.8 7.5 5.6"/></svg><span>我的</span></span>
144
+ </nav>
145
+
146
+ <style>
147
+ .seal { width: 30px; height: 30px; display: grid; place-items: center; border-radius: 9px 11px 8px 12px; background: var(--color-primary); color: var(--color-on-primary); font-size: var(--text-lg); font-weight: 700; transform: rotate(-4deg); box-shadow: 0 2px 0 var(--color-primary-deep); }
148
+ .brand { font-size: var(--text-xl); font-weight: 700; letter-spacing: .04em; }
149
+ .branch { display: inline-flex; align-items: center; gap: 2px; height: 44px; padding: 0 4px 0 6px; font-size: var(--text-sm); color: var(--color-muted); }
150
+
151
+ .shop { position: relative; display: flex; align-items: flex-end; gap: 8px; margin: 8px 16px 0; padding: 14px 12px 12px 16px; border-radius: var(--radius-hand); background: var(--color-surface); box-shadow: var(--shadow); }
152
+ .shop-main { flex: 1; min-width: 0; }
153
+ .shop-status { display: flex; align-items: center; gap: 6px; font-size: var(--text-sm); color: var(--color-muted); white-space: nowrap; }
154
+ .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--color-accent); box-shadow: 0 0 0 3px var(--color-accent-soft); }
155
+ .shop-note { margin-top: 6px; font-size: var(--text-lg); font-weight: 600; }
156
+ .coupons { display: flex; gap: 8px; margin-top: 10px; }
157
+ .coupon { padding: 2px 8px; border: 1px dashed var(--color-primary); border-radius: 6px; font-size: var(--text-sm); color: var(--color-primary-deep); background: var(--color-primary-soft); white-space: nowrap; }
158
+ .shopfront { width: 88px; height: 77px; flex-shrink: 0; margin-bottom: -4px; }
159
+
160
+ .board { display: grid; grid-template-columns: 84px 1fr; margin-top: 16px; padding-bottom: 196px; background: var(--color-surface); border-radius: 20px 20px 0 0; box-shadow: 0 -1px 0 var(--color-line); min-height: 640px; }
161
+ .cats { background: var(--color-paper); border-radius: 20px 0 0 0; padding: 8px 0; }
162
+ .cat { position: relative; width: 100%; min-height: 52px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; padding: 6px 8px; font-size: var(--text-md); color: var(--color-muted); text-align: center; line-height: 1.3; }
163
+ .cat .ico { color: var(--color-primary); }
164
+ .cat.on { background: var(--color-surface); color: var(--color-text); font-weight: 600; }
165
+ .cat.on::before { content: ""; position: absolute; left: 5px; top: 50%; width: 4px; height: 20px; margin-top: -10px; border-radius: 2px; background: var(--color-primary); }
166
+ .cat-n { position: absolute; top: 6px; right: 8px; min-width: 16px; height: 16px; padding: 0 4px; border-radius: 8px; background: var(--color-primary); color: var(--color-on-primary); font-size: var(--text-xs); line-height: 16px; font-weight: 600; }
167
+
168
+ .list { padding: 4px 12px 0; min-width: 0; }
169
+ .sec-head { display: flex; align-items: baseline; gap: 8px; padding: 12px 0 4px; }
170
+ .sec-head h2 { font-size: var(--text-lg); font-weight: 700; }
171
+ .sec-head span { font-size: var(--text-sm); color: var(--color-muted); }
172
+ .dish { display: flex; gap: 12px; padding: 12px 0; }
173
+ .dish + .dish { border-top: 1.5px dashed var(--color-line); }
174
+ .dish-body { flex: 1; min-width: 0; display: flex; flex-direction: column; }
175
+ .dish-name { font-family: var(--font-serif); font-size: var(--text-body); font-weight: 700; line-height: 1.35; }
176
+ .dish-desc { margin-top: 2px; font-size: var(--text-sm); color: var(--color-muted); line-height: 1.4; }
177
+ .dish-meta { display: flex; align-items: center; gap: 6px; margin-top: 4px; font-size: var(--text-xs); color: var(--color-muted); }
178
+ .hot { padding: 0 5px; border-radius: 4px; background: var(--color-primary); color: var(--color-on-primary); font-weight: 600; line-height: 16px; }
179
+ .dish-foot { display: flex; align-items: center; justify-content: space-between; margin-top: 2px; height: 44px; margin-bottom: -8px; }
180
+ .dish-foot .price { font-size: var(--text-lg); }
181
+ .spec { position: relative; height: 44px; display: grid; place-items: center; margin-right: -2px; }
182
+ .spec > span { position: relative; display: inline-flex; align-items: center; height: 28px; padding: 0 12px; border-radius: var(--radius-full); background: var(--color-primary); color: var(--color-on-primary); font-size: var(--text-sm); font-weight: 600; }
183
+ .spec-n { position: absolute; top: -7px; right: -5px; min-width: 18px; height: 18px; padding: 0 4px; border-radius: 9px; background: var(--color-text); color: var(--color-surface); border: 2px solid var(--color-surface); font-size: var(--text-xs); line-height: 14px; text-align: center; }
184
+ .soldout .dish-name, .soldout .dish-desc { color: var(--color-muted); }
185
+ .fade { opacity: .42; filter: grayscale(.6); }
186
+ .stamp { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%) rotate(-14deg); padding: 1px 8px; border: 2px solid var(--color-primary); border-radius: 6px; color: var(--color-primary-deep); background: rgba(255, 249, 242, .92); font-size: var(--text-md); font-weight: 700; letter-spacing: .2em; text-indent: .2em; white-space: nowrap; }
187
+ .price.off { color: var(--color-muted); }
188
+ .later { font-size: var(--text-sm); color: var(--color-muted); }
189
+
190
+ .fade-tail { position: fixed; left: 0; right: 0; bottom: 84px; height: 88px; z-index: 9; pointer-events: none; background: linear-gradient(rgba(255, 249, 242, 0), var(--color-surface) 62%); }
191
+ .cartbar { position: fixed; left: 12px; right: 12px; bottom: 96px; z-index: 11; height: 56px; display: flex; align-items: center; gap: 12px; padding: 0 6px 0 16px; border-radius: var(--radius-full); background: var(--color-text); color: var(--color-surface); box-shadow: 0 10px 24px rgba(43, 29, 20, .28); }
192
+ .cart-ico { position: relative; width: 40px; height: 40px; margin-top: -18px; display: grid; place-items: center; border-radius: 50%; background: var(--color-primary); color: var(--color-on-primary); border: 3px solid var(--color-text); }
193
+ .cart-n { position: absolute; top: -4px; right: -6px; min-width: 18px; height: 18px; padding: 0 4px; border-radius: 9px; background: var(--color-surface); color: var(--color-primary-deep); font-size: var(--text-xs); line-height: 18px; text-align: center; }
194
+ .cart-sum { flex: 1; display: flex; flex-direction: column; line-height: 1.2; }
195
+ .cart-sum b { font-size: var(--text-xl); }
196
+ .cart-sum small { font-size: var(--text-xs); color: var(--color-line); }
197
+ .cart-go { height: 44px; display: grid; place-items: center; padding: 0 22px; border-radius: var(--radius-full); background: var(--color-primary); color: var(--color-on-primary); font-weight: 600; font-size: var(--text-body); }
198
+ </style>
199
+ </body>
200
+ </html>