@xiaobuyu/nodesign 0.0.1 → 0.0.2

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 (282) hide show
  1. package/README.md +156 -106
  2. package/bin/nodesign.js +0 -0
  3. package/package.json +1 -1
  4. package/server/api/README.md +45 -45
  5. package/server/api/_guard.js +75 -75
  6. package/server/api/admin.js +187 -187
  7. package/server/api/assets/docx-page.js +103 -103
  8. package/server/api/assets/helpers.js +22 -22
  9. package/server/api/assets/notes.js +144 -144
  10. package/server/api/assets.js +896 -896
  11. package/server/api/board.js +57 -57
  12. package/server/api/browse.js +138 -138
  13. package/server/api/canvas.js +444 -444
  14. package/server/api/chatai.js +324 -324
  15. package/server/api/exports/build-standalone.js +980 -980
  16. package/server/api/exports/cards.js +118 -118
  17. package/server/api/exports/docx-pdf.js +46 -46
  18. package/server/api/exports/export-page.js +142 -142
  19. package/server/api/exports/handoff.js +147 -147
  20. package/server/api/exports.js +690 -690
  21. package/server/api/instruction.js +75 -75
  22. package/server/api/me.js +116 -116
  23. package/server/api/memory.js +185 -185
  24. package/server/api/pending-changes.js +366 -366
  25. package/server/api/plugins.js +164 -164
  26. package/server/api/projects.js +220 -220
  27. package/server/api/publish.js +64 -64
  28. package/server/api/recent.js +73 -73
  29. package/server/api/sessions.js +589 -589
  30. package/server/api/skills.js +77 -77
  31. package/server/api/standalone-fit.js +168 -168
  32. package/server/api/turn-compose.js +180 -180
  33. package/server/api/turn-inflight.js +44 -44
  34. package/server/auth/README.md +17 -17
  35. package/server/auth/middleware.js +138 -138
  36. package/server/auth/origin-guard.js +71 -71
  37. package/server/auth/session.js +108 -108
  38. package/server/auth/tier.js +113 -113
  39. package/server/auth/users-store.js +348 -348
  40. package/server/edit/README.md +29 -29
  41. package/server/engine/README.md +113 -113
  42. package/server/engine/agent/agent-shared.js +550 -550
  43. package/server/engine/agent/auto-mode-default-hard-deny.txt +4 -4
  44. package/server/engine/agent/auto-mode-rules.js +78 -78
  45. package/server/engine/agent/context.js +418 -418
  46. package/server/engine/agent/events.js +464 -464
  47. package/server/engine/agent/hooks/canvas-validate.js +199 -199
  48. package/server/engine/agent/hooks/failure.js +120 -120
  49. package/server/engine/agent/hooks/file-events.js +75 -75
  50. package/server/engine/agent/hooks/lifecycle.js +233 -233
  51. package/server/engine/agent/hooks/post-canvas-focus.js +80 -80
  52. package/server/engine/agent/hooks/post-guidance.js +206 -206
  53. package/server/engine/agent/hooks/post-subagent-report.js +104 -104
  54. package/server/engine/agent/hooks/post-trim.js +58 -58
  55. package/server/engine/agent/hooks/pre-board-neighborhood.js +34 -34
  56. package/server/engine/agent/hooks/pre-defaults.js +84 -84
  57. package/server/engine/agent/hooks/pre-injectors.js +277 -277
  58. package/server/engine/agent/hooks/pre-performance-log-guard.js +78 -78
  59. package/server/engine/agent/hooks/pre-starter-files.js +61 -61
  60. package/server/engine/agent/hooks/pre-workspace-scope-guard.js +78 -78
  61. package/server/engine/agent/hooks/site-validate.js +94 -94
  62. package/server/engine/agent/hooks/tool-prompts.js +31 -31
  63. package/server/engine/agent/hooks/turn-state-memory.js +56 -56
  64. package/server/engine/agent/hooks/user-prompt-submit.js +215 -215
  65. package/server/engine/agent/hooks.js +354 -354
  66. package/server/engine/agent/init-contract.js +69 -69
  67. package/server/engine/agent/isolation.js +159 -159
  68. package/server/engine/agent/model-table.js +292 -292
  69. package/server/engine/agent/plugin-loader.js +266 -266
  70. package/server/engine/agent/prompts/nodesign-prelude.md +336 -336
  71. package/server/engine/agent/prompts/tools/ask-user-question-protocol.md +71 -71
  72. package/server/engine/agent/prompts/tools/direct-edit-protocol.md +98 -98
  73. package/server/engine/agent/prompts/tools/generate-image-cookbook.gemini-gateway.md +583 -583
  74. package/server/engine/agent/prompts/tools/generate-image-cookbook.md +483 -483
  75. package/server/engine/agent/prompts/tools/hybrid-reference.md +100 -100
  76. package/server/engine/agent/prompts/tools/paint-still-cookbook.md +270 -270
  77. package/server/engine/agent/prompts/tools/roll-film-cookbook.md +70 -70
  78. package/server/engine/agent/prompts/tools/site-reference.md +106 -106
  79. package/server/engine/agent/prompts/tools/tweaks-syntax.md +125 -125
  80. package/server/engine/agent/prompts/tools/vision-checker-dispatch.md +48 -48
  81. package/server/engine/agent/session-loop.js +1024 -1024
  82. package/server/engine/agent/session-model.js +164 -164
  83. package/server/engine/agent/skill.js +204 -204
  84. package/server/engine/agent/task-events.js +78 -78
  85. package/server/engine/agents/ds-extractor.md +132 -132
  86. package/server/engine/agents/explorer.md +190 -190
  87. package/server/engine/agents/index.js +230 -230
  88. package/server/engine/agents/schemas/design-system.json +156 -156
  89. package/server/engine/agents/schemas/tweak-schema.json +113 -113
  90. package/server/engine/agents/tweak-proposer.md +127 -127
  91. package/server/engine/agents/vision-checker.md +254 -254
  92. package/server/engine/browse/capture.js +422 -422
  93. package/server/engine/browse/card.js +137 -137
  94. package/server/engine/browse/handover.js +59 -59
  95. package/server/engine/browse/page-digest.js +119 -119
  96. package/server/engine/browse/refs.js +196 -196
  97. package/server/engine/browse/registry.js +307 -307
  98. package/server/engine/browse/screencast.js +170 -170
  99. package/server/engine/browse/state.js +121 -121
  100. package/server/engine/chatai/chat-log.js +79 -79
  101. package/server/engine/chatai/index.js +193 -193
  102. package/server/engine/chatai/openai-compat.js +152 -152
  103. package/server/engine/chatai/orchestrate.js +309 -309
  104. package/server/engine/chatai/perform.js +40 -40
  105. package/server/engine/chatai/summarize.js +79 -79
  106. package/server/engine/mcp/capability-gate.js +52 -52
  107. package/server/engine/mcp/index.js +339 -339
  108. package/server/engine/mcp/param-sanitizer.js +142 -142
  109. package/server/engine/mcp/tools/arrange-on-board.js +124 -124
  110. package/server/engine/mcp/tools/artifact-session.js +278 -278
  111. package/server/engine/mcp/tools/browse-computer.js +421 -421
  112. package/server/engine/mcp/tools/browse-find-batch.js +183 -183
  113. package/server/engine/mcp/tools/browse-screenshot.js +157 -157
  114. package/server/engine/mcp/tools/browse.js +480 -480
  115. package/server/engine/mcp/tools/build-docx.js +101 -101
  116. package/server/engine/mcp/tools/clear-pending-changes.js +99 -99
  117. package/server/engine/mcp/tools/create-on-board.js +155 -155
  118. package/server/engine/mcp/tools/crystallize-skill.js +168 -168
  119. package/server/engine/mcp/tools/explain-style.js +237 -237
  120. package/server/engine/mcp/tools/export-handoff.js +133 -133
  121. package/server/engine/mcp/tools/expose-tweaks.js +149 -149
  122. package/server/engine/mcp/tools/generate-image.js +842 -842
  123. package/server/engine/mcp/tools/get-computed-styles.js +164 -164
  124. package/server/engine/mcp/tools/get-pending-changes.js +205 -205
  125. package/server/engine/mcp/tools/h3box-ssh.js +84 -84
  126. package/server/engine/mcp/tools/helpers/acquire-page.js +82 -82
  127. package/server/engine/mcp/tools/helpers/motion-lab.js +554 -554
  128. package/server/engine/mcp/tools/helpers/motion-scroll.js +112 -112
  129. package/server/engine/mcp/tools/helpers/perception-page.js +215 -215
  130. package/server/engine/mcp/tools/helpers/reference-download.js +103 -103
  131. package/server/engine/mcp/tools/helpers/rembg-bridge.py +80 -80
  132. package/server/engine/mcp/tools/helpers/shot-pipeline.js +280 -280
  133. package/server/engine/mcp/tools/highlight.js +68 -68
  134. package/server/engine/mcp/tools/list-pages.js +222 -222
  135. package/server/engine/mcp/tools/lookup-tags.js +59 -59
  136. package/server/engine/mcp/tools/navigate-to-page.js +60 -60
  137. package/server/engine/mcp/tools/organize-board.js +64 -64
  138. package/server/engine/mcp/tools/paint-still.js +434 -434
  139. package/server/engine/mcp/tools/pin-to-board.js +130 -130
  140. package/server/engine/mcp/tools/preview-deck.js +130 -130
  141. package/server/engine/mcp/tools/profile-scroll.js +305 -305
  142. package/server/engine/mcp/tools/publish-site.js +102 -102
  143. package/server/engine/mcp/tools/query-elements.js +195 -195
  144. package/server/engine/mcp/tools/read-board.js +103 -103
  145. package/server/engine/mcp/tools/read-document.js +93 -93
  146. package/server/engine/mcp/tools/read-page.js +264 -264
  147. package/server/engine/mcp/tools/read-tavern-json.js +143 -143
  148. package/server/engine/mcp/tools/record-decision.js +140 -140
  149. package/server/engine/mcp/tools/relate-on-board.js +110 -110
  150. package/server/engine/mcp/tools/report-issue.js +115 -115
  151. package/server/engine/mcp/tools/roll-film.js +266 -266
  152. package/server/engine/mcp/tools/screenshot-docx.js +138 -138
  153. package/server/engine/mcp/tools/screenshot-url.js +195 -195
  154. package/server/engine/mcp/tools/screenshot.js +583 -583
  155. package/server/engine/mcp/tools/tier-gate.js +96 -96
  156. package/server/engine/mcp/tools/trace-motion.js +215 -215
  157. package/server/engine/mcp/tools/web-search.js +548 -548
  158. package/server/engine/motion/inventory.js +349 -349
  159. package/server/engine/perception/session.js +235 -235
  160. package/server/engine/plugins/nodesign/.claude-plugin/plugin.json +5 -5
  161. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/SKILL.md +192 -192
  162. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/canvas.template.html +667 -667
  163. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/hybrid-grid.md +22 -22
  164. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/image-led-cover.md +25 -25
  165. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/portrait.md +23 -23
  166. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/quote-backdrop.md +21 -21
  167. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/section-divider.md +23 -23
  168. package/server/engine/plugins/nodesign/skills/deskskill-engine-mini/patterns/text-led.md +21 -21
  169. package/server/engine/plugins/nodesign/skills/docx-craft/SKILL.md +162 -162
  170. package/server/engine/plugins/nodesign/skills/docx-craft/references/token-schema.md +407 -407
  171. package/server/engine/plugins/nodesign/skills/docx-craft//346/226/207/346/241/243.template.json +80 -80
  172. package/server/engine/plugins/nodesign/skills/rp-craft/SKILL.md +228 -228
  173. package/server/engine/plugins/nodesign/skills/rp-craft/patterns//346/274/224/345/207/272/351/241/265-/346/234/200/345/260/217/345/256/236/347/216/260.html +78 -78
  174. package/server/engine/plugins/nodesign/skills/rp-craft//346/274/224/345/207/272.template.js +268 -268
  175. package/server/engine/plugins/nodesign/skills/site-craft/SKILL.md +323 -323
  176. package/server/engine/plugins/nodesign/skills/site-craft/patterns/build-lane.md +134 -134
  177. package/server/engine/plugins/nodesign/skills/site-craft/patterns/cutout-collage.md +61 -61
  178. package/server/engine/plugins/nodesign/skills/site-craft/patterns/mock-app.md +163 -163
  179. package/server/engine/plugins/nodesign/skills/site-craft/patterns/page-transitions.md +86 -86
  180. package/server/engine/runs/active-runs.js +698 -698
  181. package/server/engine/runs/live-turn.js +252 -252
  182. package/server/engine/runs/store.js +364 -364
  183. package/server/engine/runs/turn-relay.js +217 -217
  184. package/server/engine/runtime/workspace.js +164 -164
  185. package/server/lib/artifact-file-path.js +80 -80
  186. package/server/lib/artifact-target.js +284 -284
  187. package/server/lib/asset-refs.js +239 -239
  188. package/server/lib/async-queue.js +104 -104
  189. package/server/lib/auto-relations.js +130 -130
  190. package/server/lib/binding-types.js +60 -60
  191. package/server/lib/board-kind-sizes.js +62 -62
  192. package/server/lib/board-relations.js +133 -133
  193. package/server/lib/browse-proxy.js +180 -180
  194. package/server/lib/canvas-id.js +36 -36
  195. package/server/lib/cover.js +227 -227
  196. package/server/lib/danbooru-tags.js +291 -291
  197. package/server/lib/doc-extract.js +156 -156
  198. package/server/lib/docx/build-from-source.js +260 -260
  199. package/server/lib/docx/build.js +490 -490
  200. package/server/lib/docx/dump-styles.js +287 -287
  201. package/server/lib/docx/fonts/nodesign-cjk.conf +164 -164
  202. package/server/lib/docx/merge-runs.js +129 -129
  203. package/server/lib/docx/numbering.js +218 -218
  204. package/server/lib/docx/order.js +152 -152
  205. package/server/lib/docx/rawzip.js +172 -172
  206. package/server/lib/docx/render.js +92 -92
  207. package/server/lib/docx/text-lint.js +225 -225
  208. package/server/lib/docx/tokens.js +335 -335
  209. package/server/lib/docx/units.js +29 -29
  210. package/server/lib/docx/xml.js +291 -291
  211. package/server/lib/docx-pages.js +187 -187
  212. package/server/lib/export-collect.js +289 -289
  213. package/server/lib/export-package.js +210 -210
  214. package/server/lib/html-srcset.js +145 -145
  215. package/server/lib/image-variant.js +460 -460
  216. package/server/lib/ingress/forward-openai-chat.js +305 -305
  217. package/server/lib/ingress/openai-chat.js +491 -491
  218. package/server/lib/ingress/session-notice.js +66 -66
  219. package/server/lib/ingress/session-routes.js +68 -68
  220. package/server/lib/ingress/slot-probe.js +130 -130
  221. package/server/lib/ingress/upstream-billing.js +52 -52
  222. package/server/lib/ingress/upstream-fail-streak.js +72 -72
  223. package/server/lib/ingress/upstream-truncation.js +48 -48
  224. package/server/lib/issues-store.js +182 -182
  225. package/server/lib/kinds/deck.js +72 -72
  226. package/server/lib/kinds/docx.js +283 -283
  227. package/server/lib/kinds/file-kinds.js +113 -113
  228. package/server/lib/kinds/index.js +202 -202
  229. package/server/lib/kinds/site.js +161 -161
  230. package/server/lib/model-ingress.js +543 -543
  231. package/server/lib/moderation.js +255 -255
  232. package/server/lib/notice-store.js +103 -103
  233. package/server/lib/plugin-install.js +104 -104
  234. package/server/lib/plugin-validator.js +721 -721
  235. package/server/lib/publish-store.js +115 -115
  236. package/server/lib/quick-summary.js +52 -52
  237. package/server/lib/quota.js +270 -270
  238. package/server/lib/rate-window.js +29 -29
  239. package/server/lib/reference-assets.js +92 -92
  240. package/server/lib/region-shot.js +135 -135
  241. package/server/lib/safe-path.js +73 -73
  242. package/server/lib/sdk-session.js +33 -33
  243. package/server/lib/showcase-store.js +92 -92
  244. package/server/lib/site-publish.js +465 -465
  245. package/server/lib/ssrf-guard.js +432 -432
  246. package/server/lib/task-scan.js +158 -158
  247. package/server/lib/tavern-json.js +154 -154
  248. package/server/lib/video-variant.js +237 -237
  249. package/server/lib/workspace-path.js +33 -33
  250. package/server/ops/fix-sdk-musl.mjs +40 -40
  251. package/server/ops/install-macos-fonts.sh +114 -114
  252. package/server/ops/macos-fonts.conf +336 -336
  253. package/server/ops/sandbox-shim/bwrap +57 -57
  254. package/server/projects/assets-summary.js +119 -119
  255. package/server/projects/auto-name.js +53 -53
  256. package/server/projects/board-store.js +640 -640
  257. package/server/projects/move-entry.js +103 -103
  258. package/server/projects/store.js +270 -270
  259. package/server/projects/ui-config.js +54 -54
  260. package/server/projects/workspace-templates.js +53 -53
  261. package/server/projects/workspace.js +1025 -1025
  262. package/server/runtime/local-config.js +177 -177
  263. package/server/runtime/profile.js +72 -72
  264. package/server/services/rembg-service.py +334 -334
  265. package/server/shared/README.md +25 -25
  266. package/server/shared/deck.js +54 -54
  267. package/server/shared/time.js +49 -49
  268. package/server/style-pipeline/README.md +53 -53
  269. package/server/ws/broker.js +36 -36
  270. package/server/ws/browse-channel.js +177 -177
  271. package/server/ws/index.js +386 -386
  272. package/web/README.md +89 -89
  273. package/web/dist/assets/BrowserWindow-BYCgizHw.js +11 -0
  274. package/web/dist/assets/{DeckWindow-4G0xX7P3.js → DeckWindow-pNydEM4L.js} +1 -1
  275. package/web/dist/assets/{DocxWindow-BXQsoPkh.js → DocxWindow-PPgzh3Gq.js} +1 -1
  276. package/web/dist/assets/{SiteWindow-D6eS-2gM.js → SiteWindow-DM0LQPCO.js} +1 -1
  277. package/web/dist/assets/{index-Cbl3ATvp.js → index-BHTBJlpY.js} +32 -32
  278. package/web/dist/assets/{pending-edit-apply-DTjo2geW.js → pending-edit-apply-C0I13CbD.js} +1 -1
  279. package/web/dist/assets/{rotate-cw-LMT3x1Zj.js → rotate-cw-B1UQ8Hld.js} +1 -1
  280. package/web/dist/assets/{square-dashed-mouse-pointer-CBoAkfhi.js → square-dashed-mouse-pointer-8lrgqmfv.js} +1 -1
  281. package/web/dist/index.html +17 -17
  282. package/web/dist/assets/BrowserWindow-Dc7J7CYc.js +0 -11
@@ -1,134 +1,134 @@
1
- # 构建道 —— 组件库与打包器站点的平台配方
2
-
3
- 手写道(一夹 html + css)解决八成站点。这份配方讲剩下两成:什么时候值得上
4
- 构建,上了之后怎么不跟平台打架。
5
-
6
- ## 什么时候上构建道
7
-
8
- **真信号**(有一条就值得):
9
-
10
- - 同一块 UI 结构在三处以上重复、而且还会继续长 —— 组件复用是唯一还不掉的债
11
- - 交互核心有状态:筛选器 / 计算器 / 播放器 / 小编辑器。手写 DOM 操作超过
12
- 两百行,就该让框架管状态了
13
- - 内容源是数据不是页面:几十篇 md、一份 JSON 目录 —— 页面应该被**生成**,
14
- 不该被逐页维护
15
- - 要用 npm 独占的库(CDN 上没有,或 CDN 版残缺)
16
-
17
- **假信号**(听着像,其实不是):
18
-
19
- - 「显得正经 / 专业」—— 观感由排版和素材决定,不由构建工具决定
20
- - 「以后可能要扩展」—— 到那天再迁。迁移的一次性成本低于工具链税的利息
21
- - 「动效复杂」—— gsap / lenis 走 CDN 就够,动效从来不是上构建的理由
22
-
23
- ## 三条平台硬约束(违反 = 404 或感知失明)
24
-
25
- 1. **`base: './'`**。预览与导出都挂在 `…/artifact-file/<路径>` 深前缀下,打包器
26
- 默认产出的 `/assets/xx.js` 根路径会跳出前缀直接 404。vite 一行 `base: './'`
27
- 解决;选别的工具前先确认它能**全相对**输出(Astro / Next 在这点上很拧,
28
- 别硬掰)。
29
- 2. **页 = html 入口,router 不进站点**。`list_pages`、按页截图、按页刷新、整站
30
- 导出全按 html 文件寻址;SPA + 客户端路由让这些全部失明,深链接发布后照样
31
- 404。多页 = vite `rollupOptions.input` 多入口。例外:纯应用站(整站就是一个
32
- 工具)单页、无路由,随意。
33
- 3. **产物纯静态**照旧(SSR / 常驻进程不行)。`vite build` 落 `dist/`,系统自动
34
- 认作产物根。
35
-
36
- ## 起手:五个文件手写,不用脚手架
37
-
38
- `npm create vite` 是交互式命令(会挂住回合),给的还是单页 App 模板 —— 跟
39
- 约束 2 打架。自己来,30 秒的事:
40
-
41
- ```bash
42
- mkdir 站名 && cd 站名
43
- npm i --no-audit --no-fund react react-dom
44
- npm i -D --no-audit --no-fund vite @vitejs/plugin-react tailwindcss @tailwindcss/vite
45
- ```
46
-
47
- 版本让 npm 解到当前大版本,**别手填猜的版本号**(猜错一个 peer 链全断)。
48
- 发布不满一年的新锐库默认不用 —— 你对它的知识大概率是错版本的。
49
-
50
- ```jsonc
51
- // package.json 里 build 必须写进 scripts ——
52
- // 工程交付包带源不带依赖,接手的人靠 `npm i && npm run build` 续命
53
- { "scripts": { "build": "vite build" } }
54
- ```
55
-
56
- ```js
57
- // vite.config.js
58
- import { defineConfig } from 'vite'
59
- import react from '@vitejs/plugin-react'
60
- import tailwindcss from '@tailwindcss/vite'
61
-
62
- export default defineConfig({
63
- base: './', // 硬约束 1
64
- plugins: [react(), tailwindcss()],
65
- build: { rollupOptions: { input: ['index.html', 'about.html'] } }, // 每页一入口
66
- })
67
- ```
68
-
69
- 其余两件:`index.html`(真内容写在里面,见下节)和 `src/`(每页一个小入口 js)。
70
-
71
- ## html 是骨架,React 是器官
72
-
73
- 平台的感知层读的是 html:`list_pages` 从产物 html 里抓 `<a>` 拼站点结构和断链
74
- 清单,Read 产物页看到的是标签正文。整页 JSX 渲染 = 产物 html 只剩一个
75
- `<div id="root">` —— 结构失明、断链失明,发布后搜索引擎同样瞎。
76
-
77
- 所以:**内容仍写在真 html 里**(或由脚本生成真 html),React 只挂需要状态的
78
- 那一块:
79
-
80
- ```html
81
- <section id="filter-app"></section> <!-- 只有这一块是 React 的 -->
82
- ```
83
-
84
- 每页一个小入口 js 挂自己的器官。纯应用站例外:整页 React,感知靠截图,
85
- 结构靠你自己心里有数。
86
-
87
- ## 组件库:抄进来,不是装进来
88
-
89
- 装一个 kit(MUI / AntD / Chakra)= 把整站气质外包给别人的默认值 —— 反默认
90
- 清单里每一条它都替你答了,答的全是均值;而且它跟你的排版系统(三个数、间距
91
- 刻度、灰梯度)各论各的。需要现成组件时用**抄**的:
92
-
93
- - 行为复杂、样式想自己定的(弹层 / 下拉 / tabs / 无障碍):headless 一层
94
- (radix 系),皮全自己画
95
- - shadcn 式 copy-in:组件**源码落进工作区**才改得动气质;装成依赖的组件
96
- 你只能"配置"它
97
- - 图表(echarts)、3D(three)这类**画布型**库不在此列 —— 它们不带 UI 气质,
98
- 正常装正常 import
99
-
100
- ## Tailwind 的立场(跟手写道不同,不矛盾)
101
-
102
- 手写道不推 utility,理由是**用户自己要改得动**(改行高不能改一百处)。构建道
103
- 上改样式的人是你,这条理由消失,utility 的密度优势成立。但气质旋钮必须还是
104
- 集中的:三个数(字距 / 行高 / 正文宽)、间距刻度、灰梯度、主色,全部进
105
- `@theme`(Tailwind 4 的 CSS-first 配置),页面上只允许出现刻度里的值。
106
- `tracking-[0.06em]` 这类任意值逃逸写法出现在正文上,= 排版系统破产的信号。
107
- 字体链 CJK 规矩照旧。
108
-
109
- ## 回合节奏(一核机器的现实)
110
-
111
- - **凑一批改动跑一次 build**,不是每笔一 build。小工程一次 build 5~15 秒,
112
- 回合里最贵的不是它,是你为它排队的次数
113
- - build 验收后才准截图:`npm run build && echo BUILD_OK` —— 没看到 BUILD_OK
114
- 就去修错,**别截图**。build 失败时 dist 里躺着上一版,截图会"看见"旧画面,
115
- 让你以为改动无效、往错误方向排查 —— 这是构建道最贵的幻觉
116
- - **绝不起 dev server**:`npm run dev` 是常驻进程,会挂死你的命令回合;平台
117
- 预览也不看它 —— 预览只认产物根的静态文件。构建道的"热重载"就是
118
- build + 按页刷新
119
- - 每加一个包先问一句:CDN 一行、或手写三十行,是不是就够 —— node_modules
120
- 不进导出、不进发布,纯粹是工作区里的重量
121
-
122
- ## 素材与内容站
123
-
124
- - 素材放 `public/assets/`(build 原样拷进 dist),页面里按手写道同样的相对
125
- 路径规矩引。生成图落地后要**再 build 一次**才出现在产物里 —— 跟改源同一
126
- 节拍,凑批处理
127
- - 几十篇 md 的内容站:**自写 build 脚本优先**(node + marked,六十行的事)——
128
- 模板全权在你手里,相对路径天然合规。Astro / 11ty 也跑得通,但它们的链接
129
- 与资源默认根路径,你得逆着它们的世界观拧配置;不熟就别选贵的
130
-
131
- ## DirectEdit 回写(构建道上会致命,多提一次)
132
-
133
- 用户在预览里直接改的字落在**产物**上,下一次 build 会冲掉。收到构建型站点的
134
- DirectEdit 变更:先把改动同步回源(JSX / md / 模板里对应那处),再 build。
1
+ # 构建道 —— 组件库与打包器站点的平台配方
2
+
3
+ 手写道(一夹 html + css)解决八成站点。这份配方讲剩下两成:什么时候值得上
4
+ 构建,上了之后怎么不跟平台打架。
5
+
6
+ ## 什么时候上构建道
7
+
8
+ **真信号**(有一条就值得):
9
+
10
+ - 同一块 UI 结构在三处以上重复、而且还会继续长 —— 组件复用是唯一还不掉的债
11
+ - 交互核心有状态:筛选器 / 计算器 / 播放器 / 小编辑器。手写 DOM 操作超过
12
+ 两百行,就该让框架管状态了
13
+ - 内容源是数据不是页面:几十篇 md、一份 JSON 目录 —— 页面应该被**生成**,
14
+ 不该被逐页维护
15
+ - 要用 npm 独占的库(CDN 上没有,或 CDN 版残缺)
16
+
17
+ **假信号**(听着像,其实不是):
18
+
19
+ - 「显得正经 / 专业」—— 观感由排版和素材决定,不由构建工具决定
20
+ - 「以后可能要扩展」—— 到那天再迁。迁移的一次性成本低于工具链税的利息
21
+ - 「动效复杂」—— gsap / lenis 走 CDN 就够,动效从来不是上构建的理由
22
+
23
+ ## 三条平台硬约束(违反 = 404 或感知失明)
24
+
25
+ 1. **`base: './'`**。预览与导出都挂在 `…/artifact-file/<路径>` 深前缀下,打包器
26
+ 默认产出的 `/assets/xx.js` 根路径会跳出前缀直接 404。vite 一行 `base: './'`
27
+ 解决;选别的工具前先确认它能**全相对**输出(Astro / Next 在这点上很拧,
28
+ 别硬掰)。
29
+ 2. **页 = html 入口,router 不进站点**。`list_pages`、按页截图、按页刷新、整站
30
+ 导出全按 html 文件寻址;SPA + 客户端路由让这些全部失明,深链接发布后照样
31
+ 404。多页 = vite `rollupOptions.input` 多入口。例外:纯应用站(整站就是一个
32
+ 工具)单页、无路由,随意。
33
+ 3. **产物纯静态**照旧(SSR / 常驻进程不行)。`vite build` 落 `dist/`,系统自动
34
+ 认作产物根。
35
+
36
+ ## 起手:五个文件手写,不用脚手架
37
+
38
+ `npm create vite` 是交互式命令(会挂住回合),给的还是单页 App 模板 —— 跟
39
+ 约束 2 打架。自己来,30 秒的事:
40
+
41
+ ```bash
42
+ mkdir 站名 && cd 站名
43
+ npm i --no-audit --no-fund react react-dom
44
+ npm i -D --no-audit --no-fund vite @vitejs/plugin-react tailwindcss @tailwindcss/vite
45
+ ```
46
+
47
+ 版本让 npm 解到当前大版本,**别手填猜的版本号**(猜错一个 peer 链全断)。
48
+ 发布不满一年的新锐库默认不用 —— 你对它的知识大概率是错版本的。
49
+
50
+ ```jsonc
51
+ // package.json 里 build 必须写进 scripts ——
52
+ // 工程交付包带源不带依赖,接手的人靠 `npm i && npm run build` 续命
53
+ { "scripts": { "build": "vite build" } }
54
+ ```
55
+
56
+ ```js
57
+ // vite.config.js
58
+ import { defineConfig } from 'vite'
59
+ import react from '@vitejs/plugin-react'
60
+ import tailwindcss from '@tailwindcss/vite'
61
+
62
+ export default defineConfig({
63
+ base: './', // 硬约束 1
64
+ plugins: [react(), tailwindcss()],
65
+ build: { rollupOptions: { input: ['index.html', 'about.html'] } }, // 每页一入口
66
+ })
67
+ ```
68
+
69
+ 其余两件:`index.html`(真内容写在里面,见下节)和 `src/`(每页一个小入口 js)。
70
+
71
+ ## html 是骨架,React 是器官
72
+
73
+ 平台的感知层读的是 html:`list_pages` 从产物 html 里抓 `<a>` 拼站点结构和断链
74
+ 清单,Read 产物页看到的是标签正文。整页 JSX 渲染 = 产物 html 只剩一个
75
+ `<div id="root">` —— 结构失明、断链失明,发布后搜索引擎同样瞎。
76
+
77
+ 所以:**内容仍写在真 html 里**(或由脚本生成真 html),React 只挂需要状态的
78
+ 那一块:
79
+
80
+ ```html
81
+ <section id="filter-app"></section> <!-- 只有这一块是 React 的 -->
82
+ ```
83
+
84
+ 每页一个小入口 js 挂自己的器官。纯应用站例外:整页 React,感知靠截图,
85
+ 结构靠你自己心里有数。
86
+
87
+ ## 组件库:抄进来,不是装进来
88
+
89
+ 装一个 kit(MUI / AntD / Chakra)= 把整站气质外包给别人的默认值 —— 反默认
90
+ 清单里每一条它都替你答了,答的全是均值;而且它跟你的排版系统(三个数、间距
91
+ 刻度、灰梯度)各论各的。需要现成组件时用**抄**的:
92
+
93
+ - 行为复杂、样式想自己定的(弹层 / 下拉 / tabs / 无障碍):headless 一层
94
+ (radix 系),皮全自己画
95
+ - shadcn 式 copy-in:组件**源码落进工作区**才改得动气质;装成依赖的组件
96
+ 你只能"配置"它
97
+ - 图表(echarts)、3D(three)这类**画布型**库不在此列 —— 它们不带 UI 气质,
98
+ 正常装正常 import
99
+
100
+ ## Tailwind 的立场(跟手写道不同,不矛盾)
101
+
102
+ 手写道不推 utility,理由是**用户自己要改得动**(改行高不能改一百处)。构建道
103
+ 上改样式的人是你,这条理由消失,utility 的密度优势成立。但气质旋钮必须还是
104
+ 集中的:三个数(字距 / 行高 / 正文宽)、间距刻度、灰梯度、主色,全部进
105
+ `@theme`(Tailwind 4 的 CSS-first 配置),页面上只允许出现刻度里的值。
106
+ `tracking-[0.06em]` 这类任意值逃逸写法出现在正文上,= 排版系统破产的信号。
107
+ 字体链 CJK 规矩照旧。
108
+
109
+ ## 回合节奏(一核机器的现实)
110
+
111
+ - **凑一批改动跑一次 build**,不是每笔一 build。小工程一次 build 5~15 秒,
112
+ 回合里最贵的不是它,是你为它排队的次数
113
+ - build 验收后才准截图:`npm run build && echo BUILD_OK` —— 没看到 BUILD_OK
114
+ 就去修错,**别截图**。build 失败时 dist 里躺着上一版,截图会"看见"旧画面,
115
+ 让你以为改动无效、往错误方向排查 —— 这是构建道最贵的幻觉
116
+ - **绝不起 dev server**:`npm run dev` 是常驻进程,会挂死你的命令回合;平台
117
+ 预览也不看它 —— 预览只认产物根的静态文件。构建道的"热重载"就是
118
+ build + 按页刷新
119
+ - 每加一个包先问一句:CDN 一行、或手写三十行,是不是就够 —— node_modules
120
+ 不进导出、不进发布,纯粹是工作区里的重量
121
+
122
+ ## 素材与内容站
123
+
124
+ - 素材放 `public/assets/`(build 原样拷进 dist),页面里按手写道同样的相对
125
+ 路径规矩引。生成图落地后要**再 build 一次**才出现在产物里 —— 跟改源同一
126
+ 节拍,凑批处理
127
+ - 几十篇 md 的内容站:**自写 build 脚本优先**(node + marked,六十行的事)——
128
+ 模板全权在你手里,相对路径天然合规。Astro / 11ty 也跑得通,但它们的链接
129
+ 与资源默认根路径,你得逆着它们的世界观拧配置;不熟就别选贵的
130
+
131
+ ## DirectEdit 回写(构建道上会致命,多提一次)
132
+
133
+ 用户在预览里直接改的字落在**产物**上,下一次 build 会冲掉。收到构建型站点的
134
+ DirectEdit 变更:先把改动同步回源(JSX / md / 模板里对应那处),再 build。
@@ -1,61 +1,61 @@
1
- # 抠图叠层(贴纸感拼贴)
2
-
3
- 透明抠图当**版面元素**用,不是当配图。配图待在自己的框里;版面元素参与排版 ——
4
- 压线、越界、垫在文字后面。个人站 / 产品页 / 有吉祥物的品牌最吃这套。
5
-
6
- ## 管线
7
-
8
- 1. `generate_image` 出主体(prompt 里要求简洁背景、主体完整、边缘清晰 ——
9
- 纯色底的图抠得最干净)
10
- 2. `mcp__nodesign__remove_background({ inputPath })` → RGBA PNG
11
- 3. `cp` 进任务本地 `assets/`,站内相对路径引用
12
-
13
- 薄透元素(玻璃 / 烟雾 / 飘发 / 半透明纱)抠不干净是 ML 抠图的物理极限,
14
- 这类主体生图时就避开,或者接受边缘软。
15
-
16
- ## 三种叠法
17
-
18
- **① 骑线**:主体跨在两个区块的分界上,把"分割"变成"衔接"。
19
-
20
- ```css
21
- .divider-figure {
22
- position: relative;
23
- margin-top: -60px; /* 探进上一节 */
24
- margin-bottom: -20px; /* 压住下一节开头 */
25
- z-index: 2;
26
- }
27
- ```
28
-
29
- **② 探出边缘**:吉祥物 / 人物从正文容器边上探出来,打破盒子感。
30
-
31
- ```css
32
- .peek {
33
- position: absolute;
34
- right: -48px; /* 一部分出界 */
35
- bottom: 0;
36
- width: 180px;
37
- transform: rotate(3deg);
38
- }
39
- .text-block { position: relative; overflow: visible; }
40
- ```
41
-
42
- **③ 散落**:小物件(星星 / 邮票 / 道具)随机感地撒在标题周围或节间空白。
43
- 每个带一点不同的旋转和尺寸,两三个就够,撒多了变星空背景。
44
-
45
- ## 让它像贴纸而不是浮着的 PNG
46
-
47
- - **微旋转**:-3° ~ 3°,每张不同。0° 的抠图看着像素材库,歪一点才像人手贴的
48
- - **阴影贴地**:`filter: drop-shadow(0 6px 12px rgba(0,0,0,.18))` ——
49
- 用 drop-shadow 不用 box-shadow(后者会给透明区画一个矩形影子)
50
- - **白边贴纸风**(可选,适合手帐 / 复古气质):
51
- `filter: drop-shadow(0 0 0 #fff) drop-shadow(0 0 1px #fff)` 叠几层出白描边,
52
- 或生图时直接要求 sticker style with white border
53
- - **尺寸克制**:版面元素不是主图,探出的部分占正文宽 15~25% 就有效果
54
-
55
- ## 责任边界
56
-
57
- - 叠层元素一律 `position: absolute` / 负 margin + `z-index`,**别让它参与文档流**,
58
- 不然改一段文字整页元素跟着跳
59
- - 窄屏必须处理:探出屏幕外、盖住正文都是常见事故。`max-width: 860px` 断点里
60
- 要么缩小收回,要么 `display: none` —— 装饰元素在手机上消失是完全正当的
61
- - `screenshot_canvas { device: 'mobile' }` 看一眼再算完成
1
+ # 抠图叠层(贴纸感拼贴)
2
+
3
+ 透明抠图当**版面元素**用,不是当配图。配图待在自己的框里;版面元素参与排版 ——
4
+ 压线、越界、垫在文字后面。个人站 / 产品页 / 有吉祥物的品牌最吃这套。
5
+
6
+ ## 管线
7
+
8
+ 1. `generate_image` 出主体(prompt 里要求简洁背景、主体完整、边缘清晰 ——
9
+ 纯色底的图抠得最干净)
10
+ 2. `mcp__nodesign__remove_background({ inputPath })` → RGBA PNG
11
+ 3. `cp` 进任务本地 `assets/`,站内相对路径引用
12
+
13
+ 薄透元素(玻璃 / 烟雾 / 飘发 / 半透明纱)抠不干净是 ML 抠图的物理极限,
14
+ 这类主体生图时就避开,或者接受边缘软。
15
+
16
+ ## 三种叠法
17
+
18
+ **① 骑线**:主体跨在两个区块的分界上,把"分割"变成"衔接"。
19
+
20
+ ```css
21
+ .divider-figure {
22
+ position: relative;
23
+ margin-top: -60px; /* 探进上一节 */
24
+ margin-bottom: -20px; /* 压住下一节开头 */
25
+ z-index: 2;
26
+ }
27
+ ```
28
+
29
+ **② 探出边缘**:吉祥物 / 人物从正文容器边上探出来,打破盒子感。
30
+
31
+ ```css
32
+ .peek {
33
+ position: absolute;
34
+ right: -48px; /* 一部分出界 */
35
+ bottom: 0;
36
+ width: 180px;
37
+ transform: rotate(3deg);
38
+ }
39
+ .text-block { position: relative; overflow: visible; }
40
+ ```
41
+
42
+ **③ 散落**:小物件(星星 / 邮票 / 道具)随机感地撒在标题周围或节间空白。
43
+ 每个带一点不同的旋转和尺寸,两三个就够,撒多了变星空背景。
44
+
45
+ ## 让它像贴纸而不是浮着的 PNG
46
+
47
+ - **微旋转**:-3° ~ 3°,每张不同。0° 的抠图看着像素材库,歪一点才像人手贴的
48
+ - **阴影贴地**:`filter: drop-shadow(0 6px 12px rgba(0,0,0,.18))` ——
49
+ 用 drop-shadow 不用 box-shadow(后者会给透明区画一个矩形影子)
50
+ - **白边贴纸风**(可选,适合手帐 / 复古气质):
51
+ `filter: drop-shadow(0 0 0 #fff) drop-shadow(0 0 1px #fff)` 叠几层出白描边,
52
+ 或生图时直接要求 sticker style with white border
53
+ - **尺寸克制**:版面元素不是主图,探出的部分占正文宽 15~25% 就有效果
54
+
55
+ ## 责任边界
56
+
57
+ - 叠层元素一律 `position: absolute` / 负 margin + `z-index`,**别让它参与文档流**,
58
+ 不然改一段文字整页元素跟着跳
59
+ - 窄屏必须处理:探出屏幕外、盖住正文都是常见事故。`max-width: 860px` 断点里
60
+ 要么缩小收回,要么 `display: none` —— 装饰元素在手机上消失是完全正当的
61
+ - `screenshot_canvas { device: 'mobile' }` 看一眼再算完成