weifuwu 0.85.0 → 0.87.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 (655) hide show
  1. package/README.md +56 -45
  2. package/content/apps/admin.md +55 -0
  3. package/content/apps/agent-platform.md +35 -0
  4. package/content/apps/auth.md +49 -0
  5. package/content/apps/multi.md +44 -0
  6. package/content/apps/todo.md +51 -0
  7. package/content/backend/ai.md +28 -0
  8. package/content/backend/auth.md +20 -0
  9. package/content/backend/email.md +23 -0
  10. package/content/backend/graphql.md +23 -0
  11. package/content/backend/http.md +23 -0
  12. package/content/backend/limit.md +23 -0
  13. package/content/backend/middleware.md +17 -0
  14. package/content/backend/queue.md +23 -0
  15. package/content/backend/redis.md +26 -0
  16. package/content/backend/router.md +23 -0
  17. package/content/backend/schedule.md +23 -0
  18. package/content/backend/sql.md +27 -0
  19. package/content/backend/sse.md +26 -0
  20. package/content/backend/ws.md +26 -0
  21. package/content/capabilities/app-node.md +21 -0
  22. package/content/capabilities/data.md +21 -0
  23. package/content/capabilities/events.md +21 -0
  24. package/content/capabilities/hooks.md +22 -0
  25. package/content/capabilities/i18n.md +21 -0
  26. package/content/capabilities/popup.md +21 -0
  27. package/content/capabilities/render-only.md +23 -0
  28. package/content/capabilities/router.md +22 -0
  29. package/content/capabilities/self-id.md +21 -0
  30. package/content/capabilities/store.md +21 -0
  31. package/content/capabilities/theme.md +21 -0
  32. package/content/capabilities/two-phase.md +21 -0
  33. package/content/components/accordion.md +50 -0
  34. package/content/components/actionsheet.md +46 -0
  35. package/content/components/affix.md +51 -0
  36. package/content/components/aichat.md +57 -0
  37. package/content/components/alert.md +52 -0
  38. package/content/components/alertgroup.md +45 -0
  39. package/content/components/anchor.md +52 -0
  40. package/content/components/app.md +37 -0
  41. package/content/components/approvalcard.md +56 -0
  42. package/content/components/appshell.md +50 -0
  43. package/content/components/aspectratio.md +47 -0
  44. package/content/components/authpage.md +61 -0
  45. package/content/components/autocomplete-v2.md +40 -0
  46. package/content/components/autocomplete.md +56 -0
  47. package/content/components/avatar.md +51 -0
  48. package/content/components/avatargroup.md +47 -0
  49. package/content/components/backtop.md +53 -0
  50. package/content/components/badge.md +55 -0
  51. package/content/components/breadcrumb.md +49 -0
  52. package/content/components/button.md +63 -0
  53. package/content/components/calendar-v2.md +40 -0
  54. package/content/components/calendar.md +50 -0
  55. package/content/components/card.md +58 -0
  56. package/content/components/carousel.md +52 -0
  57. package/content/components/cascader-v2.md +39 -0
  58. package/content/components/cascader.md +54 -0
  59. package/content/components/chart.md +53 -0
  60. package/content/components/chatinput.md +63 -0
  61. package/content/components/checkbox.md +51 -0
  62. package/content/components/checkboxgroup.md +52 -0
  63. package/content/components/citationcard.md +48 -0
  64. package/content/components/codeblock.md +48 -0
  65. package/content/components/codeeditor.md +47 -0
  66. package/content/components/collapse.md +49 -0
  67. package/content/components/colorpicker.md +50 -0
  68. package/content/components/command.md +50 -0
  69. package/content/components/confirm.md +57 -0
  70. package/content/components/contextmenu.md +48 -0
  71. package/content/components/copybutton.md +51 -0
  72. package/content/components/datepicker.md +52 -0
  73. package/content/components/descriptions-v2.md +39 -0
  74. package/content/components/descriptions.md +52 -0
  75. package/content/components/diffview-v2.md +39 -0
  76. package/content/components/diffview.md +50 -0
  77. package/content/components/divider.md +48 -0
  78. package/content/components/drawer.md +55 -0
  79. package/content/components/dropdown.md +53 -0
  80. package/content/components/editor.md +49 -0
  81. package/content/components/emptystate.md +51 -0
  82. package/content/components/exportcsv.md +38 -0
  83. package/content/components/field.md +54 -0
  84. package/content/components/filepreview-office.md +37 -0
  85. package/content/components/filepreview.md +49 -0
  86. package/content/components/filetree.md +56 -0
  87. package/content/components/fileupload-v2.md +39 -0
  88. package/content/components/fileupload.md +57 -0
  89. package/content/components/floatbutton.md +52 -0
  90. package/content/components/form-v2.md +41 -0
  91. package/content/components/form.md +60 -0
  92. package/content/components/grid.md +51 -0
  93. package/content/components/highlight-v2.md +39 -0
  94. package/content/components/highlight.md +46 -0
  95. package/content/components/hovercard.md +51 -0
  96. package/content/components/icon.md +50 -0
  97. package/content/components/imagecropper.md +45 -0
  98. package/content/components/img.md +56 -0
  99. package/content/components/infinitescroll-v2.md +40 -0
  100. package/content/components/infinitescroll.md +54 -0
  101. package/content/components/input.md +65 -0
  102. package/content/components/inputnumber.md +58 -0
  103. package/content/components/inview.md +56 -0
  104. package/content/components/jsonschemaform.md +53 -0
  105. package/content/components/jsonviewer-v2.md +39 -0
  106. package/content/components/jsonviewer.md +49 -0
  107. package/content/components/kanban.md +46 -0
  108. package/content/components/label.md +48 -0
  109. package/content/components/layout.md +54 -0
  110. package/content/components/layoutcontent.md +43 -0
  111. package/content/components/layoutheader.md +43 -0
  112. package/content/components/layoutsider.md +43 -0
  113. package/content/components/link.md +52 -0
  114. package/content/components/list.md +44 -0
  115. package/content/components/loading.md +45 -0
  116. package/content/components/logviewer-v2.md +39 -0
  117. package/content/components/logviewer.md +53 -0
  118. package/content/components/markdown.md +51 -0
  119. package/content/components/markdowneditor.md +47 -0
  120. package/content/components/math.md +42 -0
  121. package/content/components/mentions-v2.md +39 -0
  122. package/content/components/mentions.md +52 -0
  123. package/content/components/menu.md +56 -0
  124. package/content/components/menubar.md +44 -0
  125. package/content/components/messagebubble.md +50 -0
  126. package/content/components/modal.md +59 -0
  127. package/content/components/navmenu.md +47 -0
  128. package/content/components/notification.md +51 -0
  129. package/content/components/pageheader.md +53 -0
  130. package/content/components/pagination.md +49 -0
  131. package/content/components/paragraph.md +45 -0
  132. package/content/components/passwordinput.md +57 -0
  133. package/content/components/pininput-v2.md +39 -0
  134. package/content/components/pininput.md +50 -0
  135. package/content/components/pipeline.md +49 -0
  136. package/content/components/popconfirm.md +58 -0
  137. package/content/components/popover.md +61 -0
  138. package/content/components/progressbar.md +50 -0
  139. package/content/components/prompttemplate.md +49 -0
  140. package/content/components/qrcode.md +50 -0
  141. package/content/components/radiogroup.md +53 -0
  142. package/content/components/rate.md +53 -0
  143. package/content/components/reasoningblock.md +47 -0
  144. package/content/components/relationgraph.md +52 -0
  145. package/content/components/resizable.md +53 -0
  146. package/content/components/result.md +49 -0
  147. package/content/components/scrollbar.md +49 -0
  148. package/content/components/searchinput.md +51 -0
  149. package/content/components/segmentedcontrol.md +59 -0
  150. package/content/components/select-searchable.md +47 -0
  151. package/content/components/select.md +66 -0
  152. package/content/components/sessionlist.md +52 -0
  153. package/content/components/sheetgrid.md +44 -0
  154. package/content/components/skeleton.md +55 -0
  155. package/content/components/slidecanvas.md +44 -0
  156. package/content/components/slider.md +62 -0
  157. package/content/components/sortablelist.md +39 -0
  158. package/content/components/space.md +52 -0
  159. package/content/components/sparkline.md +52 -0
  160. package/content/components/statcard-countdown.md +39 -0
  161. package/content/components/statcard.md +56 -0
  162. package/content/components/steps.md +48 -0
  163. package/content/components/switch.md +50 -0
  164. package/content/components/tabbar.md +45 -0
  165. package/content/components/table-v2.md +40 -0
  166. package/content/components/table.md +66 -0
  167. package/content/components/tabs.md +56 -0
  168. package/content/components/tag.md +51 -0
  169. package/content/components/tagsinput-v2.md +39 -0
  170. package/content/components/tagsinput.md +54 -0
  171. package/content/components/text.md +45 -0
  172. package/content/components/textarea.md +57 -0
  173. package/content/components/themeswitch.md +69 -0
  174. package/content/components/timeline.md +50 -0
  175. package/content/components/title.md +45 -0
  176. package/content/components/toast.md +52 -0
  177. package/content/components/toggle-togglegroup.md +52 -0
  178. package/content/components/togglegroup.md +47 -0
  179. package/content/components/toolcallcard.md +51 -0
  180. package/content/components/tooltip.md +50 -0
  181. package/content/components/tour.md +50 -0
  182. package/content/components/transfer.md +52 -0
  183. package/content/components/tree-v2.md +39 -0
  184. package/content/components/tree.md +59 -0
  185. package/content/components/treeselect.md +54 -0
  186. package/content/components/typography.md +51 -0
  187. package/content/components/videoplayer.md +52 -0
  188. package/content/components/virtuallist.md +52 -0
  189. package/content/components/virtualtable-v2.md +39 -0
  190. package/content/components/virtualtable.md +55 -0
  191. package/content/components/watermark.md +53 -0
  192. package/content/components/wave.md +43 -0
  193. package/content/guides/ai-chat-family.md +24 -0
  194. package/content/guides/choose.md +67 -0
  195. package/content/guides/component-model.md +32 -0
  196. package/content/guides/component-standards.md +123 -0
  197. package/{docs/components.md → content/guides/components-guide.md} +153 -7
  198. package/{docs/custom-components.md → content/guides/custom-component.md} +70 -55
  199. package/{docs/data.md → content/guides/data-guide.md} +5 -2
  200. package/content/guides/file-preview-family.md +18 -0
  201. package/{docs → content/guides}/frontend.md +122 -52
  202. package/content/guides/layout-choice.md +64 -0
  203. package/{docs/layout.md → content/guides/layout-guide.md} +12 -8
  204. package/{docs/frontend-middleware.md → content/guides/middleware.md} +34 -3
  205. package/{docs/mobile.md → content/guides/mobile-guide.md} +20 -24
  206. package/content/guides/page-building.md +98 -0
  207. package/content/guides/production.md +37 -0
  208. package/content/guides/quality.md +60 -0
  209. package/{docs/realtime.md → content/guides/realtime-guide.md} +6 -3
  210. package/content/guides/render-only.md +44 -0
  211. package/{docs/saas.md → content/guides/saas-guide.md} +8 -5
  212. package/{docs/server.md → content/guides/server-guide.md} +5 -2
  213. package/content/guides/start.md +41 -0
  214. package/{docs → content/guides}/styling.md +5 -1
  215. package/{docs/frontend-ui-dom.md → content/guides/ui-dom-guide.md} +7 -1
  216. package/content/index.json +4344 -0
  217. package/content/index.md +181 -0
  218. package/content/layout/align.md +20 -0
  219. package/content/layout/anchor.md +19 -0
  220. package/content/layout/app-shell.md +23 -0
  221. package/content/layout/border.md +20 -0
  222. package/content/layout/center.md +19 -0
  223. package/content/layout/cluster.md +19 -0
  224. package/content/layout/container.md +19 -0
  225. package/content/layout/fill.md +19 -0
  226. package/content/layout/grid.md +19 -0
  227. package/content/layout/hidden.md +22 -0
  228. package/content/layout/layer.md +19 -0
  229. package/content/layout/position.md +22 -0
  230. package/content/layout/row.md +23 -0
  231. package/content/layout/safe-area.md +20 -0
  232. package/content/layout/scroll.md +21 -0
  233. package/content/layout/spacing.md +22 -0
  234. package/content/layout/split.md +19 -0
  235. package/content/layout/stack.md +19 -0
  236. package/content/layout/surface.md +23 -0
  237. package/content/layout/text.md +22 -0
  238. package/content/patterns/app-shell.md +34 -0
  239. package/content/patterns/dashboard.md +36 -0
  240. package/content/patterns/data-screen.md +30 -0
  241. package/content/patterns/detail-page.md +31 -0
  242. package/content/patterns/docs.md +34 -0
  243. package/content/patterns/focus-task.md +34 -0
  244. package/content/patterns/landing.md +35 -0
  245. package/content/patterns/list-page.md +32 -0
  246. package/content/patterns/mobile.md +31 -0
  247. package/content/patterns/settings-page.md +33 -0
  248. package/content/patterns/workspace.md +32 -0
  249. package/dist/cli/apps-typecheck.test.d.ts +11 -0
  250. package/dist/cli/docs.d.ts +2 -0
  251. package/dist/cli/docs.mjs +10961 -0
  252. package/dist/cli/home-flash.test.d.ts +1 -0
  253. package/dist/{components → client/components}/Accordion/Accordion.d.ts +1 -1
  254. package/dist/client/components/ActionSheet/ActionSheet.d.ts +37 -0
  255. package/dist/{components → client/components}/Affix/Affix.d.ts +1 -1
  256. package/dist/{components → client/components}/AiChat/AiChat.d.ts +3 -3
  257. package/dist/{components → client/components}/Alert/Alert.d.ts +1 -1
  258. package/dist/{components → client/components}/AlertGroup/AlertGroup.d.ts +1 -1
  259. package/dist/{components → client/components}/Anchor/Anchor.d.ts +1 -1
  260. package/dist/client/components/AppShell/AppShell.d.ts +55 -0
  261. package/dist/{components → client/components}/ApprovalCard/ApprovalCard.d.ts +2 -2
  262. package/dist/{components → client/components}/AspectRatio/AspectRatio.d.ts +1 -1
  263. package/dist/{components → client/components}/AuthPage/AuthPage.d.ts +2 -2
  264. package/dist/{components → client/components}/AutoComplete/AutoComplete.d.ts +1 -1
  265. package/dist/{components → client/components}/Avatar/Avatar.d.ts +1 -1
  266. package/dist/{components → client/components}/AvatarGroup/AvatarGroup.d.ts +1 -1
  267. package/dist/{components → client/components}/BackTop/BackTop.d.ts +1 -1
  268. package/dist/{components → client/components}/Badge/Badge.d.ts +1 -1
  269. package/dist/{components → client/components}/Breadcrumb/Breadcrumb.d.ts +1 -1
  270. package/dist/{components → client/components}/Button/Button.d.ts +1 -1
  271. package/dist/{components → client/components}/Calendar/Calendar.d.ts +1 -1
  272. package/dist/{components → client/components}/Card/Card.d.ts +1 -1
  273. package/dist/{components → client/components}/Carousel/Carousel.d.ts +1 -1
  274. package/dist/{components → client/components}/Cascader/Cascader.d.ts +1 -1
  275. package/dist/{components → client/components}/Chart/Chart.d.ts +1 -1
  276. package/dist/{components → client/components}/Chart/chart-utils.d.ts +5 -1
  277. package/dist/{components → client/components}/ChatInput/ChatInput.d.ts +7 -7
  278. package/dist/{components → client/components}/Checkbox/Checkbox.d.ts +1 -1
  279. package/dist/{components → client/components}/CheckboxGroup/CheckboxGroup.d.ts +1 -1
  280. package/dist/{components → client/components}/CitationCard/CitationCard.d.ts +3 -3
  281. package/dist/{components → client/components}/CodeBlock/CodeBlock.d.ts +1 -1
  282. package/dist/client/components/CodeEditor/CodeEditor.d.ts +18 -0
  283. package/dist/{components → client/components}/Collapse/Collapse.d.ts +1 -1
  284. package/dist/{components → client/components}/ColorPicker/ColorPicker.d.ts +1 -1
  285. package/dist/{components → client/components}/Command/Command.d.ts +1 -1
  286. package/dist/{components → client/components}/Confirm/Confirm.d.ts +2 -7
  287. package/dist/{components → client/components}/ContextMenu/ContextMenu.d.ts +1 -1
  288. package/dist/{components → client/components}/CopyButton/CopyButton.d.ts +1 -1
  289. package/dist/{components → client/components}/DatePicker/DatePicker.d.ts +2 -2
  290. package/dist/{components → client/components}/Descriptions/Descriptions.d.ts +1 -1
  291. package/dist/{components → client/components}/DiffView/DiffView.d.ts +1 -1
  292. package/dist/{components → client/components}/Divider/Divider.d.ts +1 -1
  293. package/dist/{components → client/components}/Drawer/Drawer.d.ts +1 -1
  294. package/dist/{components → client/components}/Dropdown/Dropdown.d.ts +1 -1
  295. package/dist/client/components/Editor/Editor.d.ts +14 -0
  296. package/dist/client/components/Editor/edit-events.d.ts +27 -0
  297. package/dist/client/components/Editor/model/apply.d.ts +23 -0
  298. package/dist/client/components/Editor/model/diff.d.ts +25 -0
  299. package/dist/client/components/Editor/model/dom.d.ts +27 -0
  300. package/dist/client/components/Editor/model/history.d.ts +21 -0
  301. package/dist/client/components/Editor/model/html.d.ts +16 -0
  302. package/dist/client/components/Editor/model/inverse.d.ts +20 -0
  303. package/dist/client/components/Editor/model/types.d.ts +116 -0
  304. package/dist/client/components/Editor/tools/table.d.ts +10 -0
  305. package/dist/{components → client/components}/Editor/tools/toolbar.d.ts +2 -2
  306. package/dist/client/components/Editor/tools/types.d.ts +40 -0
  307. package/dist/{components → client/components}/EmptyState/EmptyState.d.ts +1 -1
  308. package/dist/client/components/ExportCSV/ExportCSV.d.ts +30 -0
  309. package/dist/{components → client/components}/Field/Field.d.ts +1 -1
  310. package/dist/client/components/FilePreview/FilePreview.d.ts +42 -0
  311. package/dist/client/components/FilePreview/markdown.d.ts +23 -0
  312. package/dist/client/components/FileTree/FileTree.d.ts +57 -0
  313. package/dist/{components → client/components}/FileUpload/FileUpload.d.ts +1 -1
  314. package/dist/{components → client/components}/FloatButton/FloatButton.d.ts +1 -1
  315. package/dist/{components → client/components}/Form/Form.d.ts +1 -1
  316. package/dist/{components → client/components}/Grid/Grid.d.ts +1 -1
  317. package/dist/{components → client/components}/Highlight/Highlight.d.ts +1 -1
  318. package/dist/{components → client/components}/HoverCard/HoverCard.d.ts +5 -4
  319. package/dist/{components → client/components}/Icon/Icon.d.ts +2 -2
  320. package/dist/client/components/ImageCropper/ImageCropper.d.ts +17 -0
  321. package/dist/{components → client/components}/Img/Img.d.ts +1 -1
  322. package/dist/{components → client/components}/InView/InView.d.ts +1 -1
  323. package/dist/{components → client/components}/InfiniteScroll/InfiniteScroll.d.ts +1 -1
  324. package/dist/{components → client/components}/Input/Input.d.ts +1 -1
  325. package/dist/{components → client/components}/InputNumber/InputNumber.d.ts +1 -1
  326. package/dist/{components → client/components}/JSONViewer/JSONViewer.d.ts +1 -1
  327. package/dist/{components → client/components}/JsonSchemaForm/JsonSchemaForm.d.ts +3 -3
  328. package/dist/{components → client/components}/Kanban/Kanban.d.ts +1 -1
  329. package/dist/{components → client/components}/Label/Label.d.ts +1 -1
  330. package/dist/{components → client/components}/Layout/Layout.d.ts +1 -1
  331. package/dist/{components → client/components}/Link/Link.d.ts +1 -1
  332. package/dist/{components → client/components}/List/List.d.ts +1 -1
  333. package/dist/{components → client/components}/Loading/Loading.d.ts +1 -1
  334. package/dist/{components → client/components}/LogViewer/LogViewer.d.ts +1 -1
  335. package/dist/{components → client/components}/Markdown/Markdown.d.ts +1 -1
  336. package/dist/client/components/MarkdownEditor/MarkdownEditor.d.ts +18 -0
  337. package/dist/client/components/Math/Math.d.ts +15 -0
  338. package/dist/{components → client/components}/Mentions/Mentions.d.ts +1 -1
  339. package/dist/{components → client/components}/Menu/Menu.d.ts +1 -1
  340. package/dist/{components → client/components}/Menubar/Menubar.d.ts +1 -1
  341. package/dist/{components → client/components}/MessageBubble/MessageBubble.d.ts +1 -1
  342. package/dist/{components → client/components}/Modal/Modal.d.ts +1 -1
  343. package/dist/{components → client/components}/NavMenu/NavMenu.d.ts +2 -2
  344. package/dist/{components → client/components}/Notification/Notification.d.ts +7 -2
  345. package/dist/client/components/OfficeEditor/ai/ai-bridge.d.ts +39 -0
  346. package/dist/client/components/OfficeEditor/model/apply.d.ts +25 -0
  347. package/dist/client/components/OfficeEditor/model/types.d.ts +224 -0
  348. package/dist/{components → client/components}/PageHeader/PageHeader.d.ts +1 -1
  349. package/dist/{components → client/components}/Pagination/Pagination.d.ts +1 -1
  350. package/dist/{components → client/components}/PasswordInput/PasswordInput.d.ts +1 -1
  351. package/dist/{components → client/components}/PinInput/PinInput.d.ts +1 -1
  352. package/dist/{components → client/components}/Pipeline/Pipeline.d.ts +1 -1
  353. package/dist/{components → client/components}/Popconfirm/Popconfirm.d.ts +2 -2
  354. package/dist/{components → client/components}/Popover/Popover.d.ts +5 -4
  355. package/dist/{components → client/components}/ProgressBar/ProgressBar.d.ts +1 -1
  356. package/dist/client/components/PromptTemplate/PromptTemplate.d.ts +37 -0
  357. package/dist/{components → client/components}/QRCode/QRCode.d.ts +1 -1
  358. package/dist/{components → client/components}/RadioGroup/RadioGroup.d.ts +1 -1
  359. package/dist/{components → client/components}/Rate/Rate.d.ts +1 -1
  360. package/dist/{components → client/components}/ReasoningBlock/ReasoningBlock.d.ts +3 -3
  361. package/dist/client/components/RelationGraph/RelationGraph.d.ts +59 -0
  362. package/dist/{components → client/components}/Resizable/Resizable.d.ts +1 -1
  363. package/dist/{components → client/components}/Result/Result.d.ts +1 -1
  364. package/dist/{components → client/components}/Scrollbar/Scrollbar.d.ts +1 -1
  365. package/dist/{components → client/components}/SearchInput/SearchInput.d.ts +1 -1
  366. package/dist/{components → client/components}/SegmentedControl/SegmentedControl.d.ts +1 -1
  367. package/dist/{components → client/components}/Select/Select.d.ts +1 -1
  368. package/dist/{components → client/components}/SessionList/SessionList.d.ts +3 -3
  369. package/dist/client/components/SheetGrid/SheetGrid.d.ts +30 -0
  370. package/dist/{components → client/components}/Skeleton/Skeleton.d.ts +1 -1
  371. package/dist/client/components/SlideCanvas/SlideCanvas.d.ts +28 -0
  372. package/dist/client/components/Slider/Slider.d.ts +27 -0
  373. package/dist/client/components/SortableList/SortableList.d.ts +23 -0
  374. package/dist/{components → client/components}/Space/Space.d.ts +1 -1
  375. package/dist/{components → client/components}/Sparkline/Sparkline.d.ts +1 -1
  376. package/dist/{components → client/components}/StatCard/StatCard.d.ts +1 -1
  377. package/dist/{components → client/components}/Steps/Steps.d.ts +1 -1
  378. package/dist/{components → client/components}/Switch/Switch.d.ts +1 -1
  379. package/dist/client/components/TabBar/TabBar.d.ts +35 -0
  380. package/dist/{components → client/components}/Table/Table.d.ts +7 -1
  381. package/dist/client/components/Tabs/Tabs.d.ts +22 -0
  382. package/dist/{components → client/components}/Tag/Tag.d.ts +1 -1
  383. package/dist/{components → client/components}/TagsInput/TagsInput.d.ts +1 -1
  384. package/dist/{components → client/components}/Textarea/Textarea.d.ts +1 -1
  385. package/dist/{components → client/components}/ThemeSwitch/ThemeSwitch.d.ts +1 -1
  386. package/dist/{components → client/components}/Timeline/Timeline.d.ts +1 -1
  387. package/dist/{components → client/components}/Toast/Toast.d.ts +1 -1
  388. package/dist/{components → client/components}/ToggleGroup/ToggleGroup.d.ts +1 -1
  389. package/dist/{components → client/components}/ToolCallCard/ToolCallCard.d.ts +2 -2
  390. package/dist/{components → client/components}/Tooltip/Tooltip.d.ts +4 -3
  391. package/dist/{components → client/components}/Tour/Tour.d.ts +1 -1
  392. package/dist/{components → client/components}/Transfer/Transfer.d.ts +1 -1
  393. package/dist/{components → client/components}/Tree/Tree.d.ts +5 -1
  394. package/dist/{components → client/components}/TreeSelect/TreeSelect.d.ts +5 -1
  395. package/dist/{components → client/components}/Typography/Typography.d.ts +1 -1
  396. package/dist/client/components/VideoPlayer/VideoPlayer.d.ts +25 -0
  397. package/dist/{components → client/components}/VirtualList/VirtualList.d.ts +1 -1
  398. package/dist/{components → client/components}/VirtualTable/VirtualTable.d.ts +1 -1
  399. package/dist/{components → client/components}/Watermark/Watermark.d.ts +1 -1
  400. package/dist/client/components/Wave/Wave.d.ts +15 -0
  401. package/dist/{components → client/components}/index.d.ts +48 -2
  402. package/dist/client/components/index.js +57 -0
  403. package/dist/{components → client/components}/style.css +3554 -1896
  404. package/dist/{layout → client/layout}/weifuwu-layout.css +60 -6
  405. package/dist/client/office/docx.d.ts +33 -0
  406. package/dist/client/office/pptx.d.ts +24 -0
  407. package/dist/client/office/xlsx.d.ts +25 -0
  408. package/dist/client/office/xml-serialize.d.ts +18 -0
  409. package/dist/client/office/xml.d.ts +21 -0
  410. package/dist/client/office/zip.d.ts +21 -0
  411. package/dist/client/vdom/browser/Browser.d.ts +73 -0
  412. package/dist/client/vdom/browser/create-client-browser.d.ts +11 -0
  413. package/dist/client/vdom/commands.d.ts +19 -0
  414. package/dist/client/vdom/context/UIContext.d.ts +61 -0
  415. package/dist/client/vdom/context/data.d.ts +17 -0
  416. package/dist/client/vdom/core/async-guard.d.ts +20 -0
  417. package/dist/client/vdom/core/build.d.ts +36 -0
  418. package/dist/client/vdom/core/command/create.d.ts +25 -0
  419. package/dist/client/vdom/core/command/index.d.ts +15 -0
  420. package/dist/client/vdom/core/command/insert.d.ts +32 -0
  421. package/dist/client/vdom/core/command/lifecycle.d.ts +47 -0
  422. package/dist/client/vdom/core/command/props.d.ts +22 -0
  423. package/dist/client/vdom/core/diff/attrs.d.ts +10 -0
  424. package/dist/client/vdom/core/diff/children.d.ts +29 -0
  425. package/dist/client/vdom/core/diff/cleanup.d.ts +44 -0
  426. package/dist/client/vdom/core/diff/index.d.ts +22 -0
  427. package/dist/client/vdom/core/diff/output.d.ts +30 -0
  428. package/dist/client/vdom/core/diff/same.d.ts +22 -0
  429. package/dist/client/vdom/core/field/attributes.d.ts +15 -0
  430. package/dist/client/vdom/core/field/events.d.ts +54 -0
  431. package/dist/client/vdom/core/field/index.d.ts +19 -0
  432. package/dist/client/vdom/core/field/key.d.ts +16 -0
  433. package/dist/client/vdom/core/field/props.d.ts +15 -0
  434. package/dist/client/vdom/core/field/ref.d.ts +38 -0
  435. package/dist/client/vdom/core/field/style.d.ts +17 -0
  436. package/dist/client/vdom/core/node/children.d.ts +20 -0
  437. package/dist/client/vdom/core/node/component.d.ts +93 -0
  438. package/dist/client/vdom/core/node/fragment.d.ts +14 -0
  439. package/dist/client/vdom/core/node/hole.d.ts +22 -0
  440. package/dist/client/vdom/core/node/index.d.ts +35 -0
  441. package/dist/client/vdom/core/node/keyed.d.ts +64 -0
  442. package/dist/client/vdom/core/node/native.d.ts +20 -0
  443. package/dist/client/vdom/core/node/portal.d.ts +11 -0
  444. package/dist/client/vdom/core/patch/fields.d.ts +15 -0
  445. package/dist/client/vdom/core/patch/index.d.ts +51 -0
  446. package/dist/client/vdom/core/patch/processors.d.ts +75 -0
  447. package/dist/client/vdom/core/patch/state-machine.d.ts +38 -0
  448. package/dist/client/vdom/core/patch/verify.d.ts +17 -0
  449. package/dist/client/vdom/core/router.d.ts +31 -0
  450. package/dist/client/vdom/core/serve.d.ts +75 -0
  451. package/dist/client/vdom/core/ssr/absorb.d.ts +53 -0
  452. package/dist/client/vdom/core/ssr/html.d.ts +32 -0
  453. package/dist/client/vdom/core/ssr/index.d.ts +25 -0
  454. package/dist/client/vdom/core/transform/component.d.ts +23 -0
  455. package/dist/client/vdom/core/transform/element.d.ts +21 -0
  456. package/dist/client/vdom/core/transform/fragment.d.ts +21 -0
  457. package/dist/client/vdom/core/transform/hole.d.ts +13 -0
  458. package/dist/client/vdom/core/transform/index.d.ts +46 -0
  459. package/dist/client/vdom/core/transform/states.d.ts +22 -0
  460. package/dist/client/vdom/core/transform/table.d.ts +28 -0
  461. package/dist/client/vdom/core/transform/text.d.ts +10 -0
  462. package/dist/client/vdom/core/vnode.d.ts +45 -0
  463. package/dist/client/vdom/dev/effect-guard.d.ts +8 -0
  464. package/dist/client/vdom/hooks/ai-stream.d.ts +46 -0
  465. package/dist/client/vdom/hooks/basic.d.ts +42 -0
  466. package/dist/client/vdom/hooks/chat.d.ts +91 -0
  467. package/dist/client/vdom/hooks/controlled.d.ts +27 -0
  468. package/dist/client/vdom/hooks/drag-media.d.ts +52 -0
  469. package/dist/client/vdom/hooks/env.d.ts +119 -0
  470. package/dist/client/vdom/hooks/input.d.ts +43 -0
  471. package/dist/client/vdom/hooks/observe.d.ts +60 -0
  472. package/dist/client/vdom/hooks/popup-manager.d.ts +92 -0
  473. package/dist/client/vdom/hooks/popup.d.ts +52 -0
  474. package/dist/client/vdom/hooks/stable.d.ts +45 -0
  475. package/dist/client/vdom/index.d.ts +67 -0
  476. package/dist/client/vdom/index.js +8 -0
  477. package/dist/client/vdom/jsx-runtime.d.ts +28 -0
  478. package/dist/client/vdom/jsx-runtime.js +1 -0
  479. package/dist/client/vdom/middlewares/api.d.ts +38 -0
  480. package/dist/client/vdom/middlewares/auth-i18n.d.ts +66 -0
  481. package/dist/client/vdom/middlewares/ws.d.ts +37 -0
  482. package/dist/client/vdom/store.d.ts +49 -0
  483. package/dist/client/vdom/testing.d.ts +46 -0
  484. package/dist/client/vdom/testing.js +2 -0
  485. package/dist/dev/index.d.ts +12 -0
  486. package/dist/dev/index.js +4 -4
  487. package/dist/{ai → server/ai}/contracts.d.ts +1 -1
  488. package/dist/{ai → server/ai}/index.d.ts +2 -2
  489. package/dist/{ai → server/ai}/types.d.ts +1 -1
  490. package/dist/{core → server/core}/router.d.ts +2 -4
  491. package/dist/{db → server/db}/contracts.d.ts +1 -1
  492. package/dist/server/db/postgres-server.d.ts +37 -0
  493. package/dist/server/db/redis-server.d.ts +32 -0
  494. package/dist/server/db/server.d.ts +30 -0
  495. package/dist/server/db/test-servers.d.ts +21 -0
  496. package/dist/{email → server/email}/contracts.d.ts +1 -1
  497. package/dist/{index.js → server/index.js} +3147 -2462
  498. package/dist/{ui → server/ui}/index.d.ts +2 -2
  499. package/dist/{user → server/user}/token.d.ts +1 -1
  500. package/dist/shared/router/trie.d.ts +61 -0
  501. package/docs/components-map.md +16 -4
  502. package/docs/style-guide.md +14 -2
  503. package/examples/apps/admin/README.md +23 -0
  504. package/examples/apps/admin/api.ts +27 -0
  505. package/examples/apps/admin/app.tsx +144 -0
  506. package/examples/apps/admin/main.tsx +8 -0
  507. package/examples/apps/admin/server.ts +37 -0
  508. package/examples/apps/auth/README.md +23 -0
  509. package/examples/apps/auth/api.ts +49 -0
  510. package/examples/apps/auth/app.tsx +137 -0
  511. package/examples/apps/auth/main.tsx +8 -0
  512. package/examples/apps/auth/server.ts +37 -0
  513. package/examples/apps/multi/README.md +23 -0
  514. package/examples/apps/multi/app.tsx +83 -0
  515. package/examples/apps/multi/main.tsx +8 -0
  516. package/examples/apps/multi/server.ts +33 -0
  517. package/examples/apps/todo/README.md +23 -0
  518. package/examples/apps/todo/api.ts +26 -0
  519. package/examples/apps/todo/app.tsx +128 -0
  520. package/examples/apps/todo/main.tsx +9 -0
  521. package/examples/apps/todo/server.ts +39 -0
  522. package/examples/hello-world/README.md +9 -0
  523. package/examples/hello-world/client.ts +14 -0
  524. package/examples/hello-world/routes.tsx +26 -0
  525. package/examples/hello-world/server.ts +46 -0
  526. package/examples/patterns/AppShell.tsx +224 -0
  527. package/examples/patterns/Dashboard.tsx +153 -0
  528. package/examples/patterns/DataScreen.tsx +104 -0
  529. package/examples/patterns/DetailPage.tsx +79 -0
  530. package/examples/patterns/Docs.tsx +105 -0
  531. package/examples/patterns/FocusTask.tsx +67 -0
  532. package/examples/patterns/Landing.tsx +90 -0
  533. package/examples/patterns/ListPage.tsx +77 -0
  534. package/examples/patterns/Mobile.tsx +154 -0
  535. package/examples/patterns/SettingsPage.tsx +98 -0
  536. package/examples/patterns/SplitWorkspace.tsx +113 -0
  537. package/package.json +61 -29
  538. package/dist/components/Editor/Editor.d.ts +0 -13
  539. package/dist/components/Editor/tools/format.d.ts +0 -11
  540. package/dist/components/Editor/tools/table.d.ts +0 -7
  541. package/dist/components/Editor/tools/types.d.ts +0 -15
  542. package/dist/components/Slider/Slider.d.ts +0 -19
  543. package/dist/components/Tabs/Tabs.d.ts +0 -12
  544. package/dist/components/index.js +0 -15
  545. package/dist/ui-dom/Confirm.d.ts +0 -8
  546. package/dist/ui-dom/Notification.d.ts +0 -8
  547. package/dist/ui-dom/Toast.d.ts +0 -8
  548. package/dist/ui-dom/ai.d.ts +0 -59
  549. package/dist/ui-dom/browser.d.ts +0 -10
  550. package/dist/ui-dom/debug.d.ts +0 -21
  551. package/dist/ui-dom/hooks/chat.d.ts +0 -11
  552. package/dist/ui-dom/hooks/events.d.ts +0 -30
  553. package/dist/ui-dom/hooks/external.d.ts +0 -20
  554. package/dist/ui-dom/hooks/index.d.ts +0 -29
  555. package/dist/ui-dom/hooks/input.d.ts +0 -33
  556. package/dist/ui-dom/hooks/media.d.ts +0 -17
  557. package/dist/ui-dom/hooks/popup.d.ts +0 -30
  558. package/dist/ui-dom/hooks/stable.d.ts +0 -35
  559. package/dist/ui-dom/hooks/types.d.ts +0 -77
  560. package/dist/ui-dom/i18n.d.ts +0 -31
  561. package/dist/ui-dom/index.d.ts +0 -47
  562. package/dist/ui-dom/index.js +0 -41
  563. package/dist/ui-dom/jsx-runtime.d.ts +0 -4
  564. package/dist/ui-dom/jsx-runtime.js +0 -1
  565. package/dist/ui-dom/locale/en_US.d.ts +0 -55
  566. package/dist/ui-dom/locale/zh_CN.d.ts +0 -55
  567. package/dist/ui-dom/middleware/api.d.ts +0 -91
  568. package/dist/ui-dom/middleware/auth.d.ts +0 -30
  569. package/dist/ui-dom/middleware/ws.d.ts +0 -33
  570. package/dist/ui-dom/motion.d.ts +0 -8
  571. package/dist/ui-dom/popup-tracker.d.ts +0 -36
  572. package/dist/ui-dom/popup.d.ts +0 -42
  573. package/dist/ui-dom/store.d.ts +0 -24
  574. package/dist/ui-dom/testing.d.ts +0 -68
  575. package/dist/ui-dom/testing.js +0 -7
  576. package/dist/ui-dom/types.d.ts +0 -632
  577. package/dist/ui-dom/use-chat.d.ts +0 -95
  578. package/dist/ui-dom/vdom3/README.d.ts +0 -32
  579. package/dist/ui-dom/vdom3/app.d.ts +0 -20
  580. package/dist/ui-dom/vdom3/audit.d.ts +0 -29
  581. package/dist/ui-dom/vdom3/build.d.ts +0 -20
  582. package/dist/ui-dom/vdom3/commands.d.ts +0 -21
  583. package/dist/ui-dom/vdom3/comp-index.d.ts +0 -18
  584. package/dist/ui-dom/vdom3/delegate.d.ts +0 -48
  585. package/dist/ui-dom/vdom3/events.d.ts +0 -17
  586. package/dist/ui-dom/vdom3/index.d.ts +0 -42
  587. package/dist/ui-dom/vdom3/jsx.d.ts +0 -32
  588. package/dist/ui-dom/vdom3/record.d.ts +0 -16
  589. package/dist/ui-dom/vdom3/registry.d.ts +0 -30
  590. package/dist/ui-dom/vdom3/render.d.ts +0 -39
  591. package/dist/ui-dom/vdom3/replay.d.ts +0 -28
  592. package/dist/ui-dom/vdom3/root.d.ts +0 -24
  593. package/dist/ui-dom/vdom3/router.d.ts +0 -31
  594. package/dist/ui-dom/vdom3/scheduler.d.ts +0 -23
  595. package/dist/ui-dom/vdom3/ssr.d.ts +0 -27
  596. package/dist/ui-dom/vdom3/sync.d.ts +0 -22
  597. package/dist/ui-dom/vdom3/types.d.ts +0 -173
  598. package/dist/ui-dom/vdom3/ui.d.ts +0 -16
  599. package/dist/ui-dom/vdom3.js +0 -41
  600. package/dist/ui-dom/vnode.d.ts +0 -13
  601. /package/dist/{make-executable-schema.test.d.ts → cli/content-sync.test.d.ts} +0 -0
  602. /package/dist/{ui-dom/testing.test.d.ts → cli/docs-cli.test.d.ts} +0 -0
  603. /package/dist/{components → client/components}/CodeBlock/highlight.d.ts +0 -0
  604. /package/dist/{components → client/components}/DatePicker/calendar-utils.d.ts +0 -0
  605. /package/dist/{components → client/components}/DiffView/diff-utils.d.ts +0 -0
  606. /package/dist/{components → client/components}/Markdown/parser.d.ts +0 -0
  607. /package/dist/{components → client/components}/Pipeline/dag-utils.d.ts +0 -0
  608. /package/dist/{components → client/components}/QRCode/qr.d.ts +0 -0
  609. /package/dist/{components → client/components}/Sparkline/sparkline-utils.d.ts +0 -0
  610. /package/dist/{ai → server/ai}/agent.d.ts +0 -0
  611. /package/dist/{ai → server/ai}/client.d.ts +0 -0
  612. /package/dist/{ai → server/ai}/sse.d.ts +0 -0
  613. /package/dist/{core → server/core}/serve.d.ts +0 -0
  614. /package/dist/{core → server/core}/ws.d.ts +0 -0
  615. /package/dist/{db → server/db}/errors.d.ts +0 -0
  616. /package/dist/{db → server/db}/memory-redis.d.ts +0 -0
  617. /package/dist/{db → server/db}/memory-sql.d.ts +0 -0
  618. /package/dist/{db → server/db}/postgres/connection.d.ts +0 -0
  619. /package/dist/{db → server/db}/postgres/pool.d.ts +0 -0
  620. /package/dist/{db → server/db}/postgres/protocol.d.ts +0 -0
  621. /package/dist/{db → server/db}/postgres/schema.d.ts +0 -0
  622. /package/dist/{db → server/db}/query-builder.d.ts +0 -0
  623. /package/dist/{db → server/db}/query.d.ts +0 -0
  624. /package/dist/{db → server/db}/redis/client.d.ts +0 -0
  625. /package/dist/{db → server/db}/redis/commands.d.ts +0 -0
  626. /package/dist/{db → server/db}/redis/connection.d.ts +0 -0
  627. /package/dist/{db → server/db}/redis/pipeline.d.ts +0 -0
  628. /package/dist/{db → server/db}/redis/pool.d.ts +0 -0
  629. /package/dist/{db → server/db}/redis/resp.d.ts +0 -0
  630. /package/dist/{db → server/db}/redis/subscriber.d.ts +0 -0
  631. /package/dist/{db → server/db}/sql-parser.d.ts +0 -0
  632. /package/dist/{email → server/email}/index.d.ts +0 -0
  633. /package/dist/{email → server/email}/smtp.d.ts +0 -0
  634. /package/dist/{graphql.d.ts → server/graphql.d.ts} +0 -0
  635. /package/dist/{index.d.ts → server/index.d.ts} +0 -0
  636. /package/dist/{make-executable-schema.d.ts → server/make-executable-schema.d.ts} +0 -0
  637. /package/dist/{messager → server/messager}/index.d.ts +0 -0
  638. /package/dist/{middleware → server/middleware}/cors.d.ts +0 -0
  639. /package/dist/{middleware → server/middleware}/rate-limit.d.ts +0 -0
  640. /package/dist/{middleware → server/middleware}/static.d.ts +0 -0
  641. /package/dist/{postgres → server/postgres}/client.d.ts +0 -0
  642. /package/dist/{postgres → server/postgres}/index.d.ts +0 -0
  643. /package/dist/{postgres → server/postgres}/types.d.ts +0 -0
  644. /package/dist/{queue → server/queue}/index.d.ts +0 -0
  645. /package/dist/{redis → server/redis}/client.d.ts +0 -0
  646. /package/dist/{redis → server/redis}/index.d.ts +0 -0
  647. /package/dist/{redis → server/redis}/types.d.ts +0 -0
  648. /package/dist/{request.d.ts → server/request.d.ts} +0 -0
  649. /package/dist/{response.d.ts → server/response.d.ts} +0 -0
  650. /package/dist/{scheduler → server/scheduler}/cron.d.ts +0 -0
  651. /package/dist/{scheduler → server/scheduler}/index.d.ts +0 -0
  652. /package/dist/{types.d.ts → server/types.d.ts} +0 -0
  653. /package/dist/{ui → server/ui}/html-safe.d.ts +0 -0
  654. /package/dist/{user → server/user}/index.d.ts +0 -0
  655. /package/dist/{user → server/user}/password.d.ts +0 -0
@@ -0,0 +1,37 @@
1
+ /**
2
+ * auth 独立 server——内存用户 + 会话(契约层:生产换 postgres() + userSystem)
3
+ * cd examples/apps/auth && node server.ts → http://localhost:3301
4
+ */
5
+ import { serve, Router, ui, createMemorySql } from 'weifuwu'
6
+ import { resolve, dirname } from 'node:path'
7
+ import { fileURLToPath } from 'node:url'
8
+ import { registerAuthApi, ensureAuthTables } from './api.ts'
9
+
10
+ const __dirname = dirname(fileURLToPath(import.meta.url))
11
+ const sql = createMemorySql()
12
+ await ensureAuthTables(sql)
13
+
14
+ const app = new Router()
15
+ app.use(ui())
16
+ app.get('/app.js', (req, ctx) => ctx.ui.js(resolve(__dirname, 'main.tsx')))
17
+ registerAuthApi(app, sql)
18
+
19
+ app.get('/*', async (req, ctx) => ctx.ui.html`
20
+ <!DOCTYPE html>
21
+ <html lang="zh-CN">
22
+ <head>
23
+ <meta charset="UTF-8">
24
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
25
+ <link rel="stylesheet" href="/components.css">
26
+ <title>auth 应用模板</title>
27
+ </head>
28
+ <body>
29
+ <div id="root"></div>
30
+ <script src="/app.js"></script>
31
+ </body>
32
+ </html>
33
+ `)
34
+ app.get('/components.css', (req, ctx) => ctx.ui.css('weifuwu/components/style.css'))
35
+
36
+ serve(app, { port: 3301 })
37
+ console.log('auth 模板 → http://localhost:3301')
@@ -0,0 +1,23 @@
1
+ # multi 应用模板(复制即用)
2
+
3
+ ```bash
4
+ # 1. 安装依赖(weifuwu 包——含 content/ 离线文档 + examples/ 模板源码)
5
+ npm i weifuwu
6
+
7
+ # 2. 复制本目录到你的项目(或直接在 examples/apps/multi 内开发)
8
+ # 3. 启动
9
+ node server.ts # → http://localhost:multi/3300 3301 3302 3303
10
+ ```
11
+
12
+ ## 改造指南
13
+
14
+ 见 `node_modules/weifuwu/content/apps/multi.md`(目录结构 + 逐步改造步骤)。
15
+
16
+ ## 结构
17
+
18
+ | 文件 | 职责 |
19
+ |------|------|
20
+ | app.tsx | 前端:路由表 + 页面组件 + 状态 |
21
+ | api.ts | 后端:API 注册函数(独立/嵌入共享) |
22
+ | server.ts | 独立入口(MemorySql——生产换 postgres() 一行) |
23
+ | main.tsx | 独立前端入口 |
@@ -0,0 +1,83 @@
1
+ /**
2
+ * multi 应用模板——应用编排(父应用嵌子应用:registerApp/hApp + 独立状态)
3
+ *
4
+ * 演示能力(design/vdom3-app-node.md):
5
+ * - registerApp 注册子应用(工厂闭包持有实例状态——appId 复用不重跑)
6
+ * - hApp(<App appId />)在父树渲染子应用——app:mount/update 边界事件
7
+ * - 子应用独立状态:各自 let + render(),互不干扰
8
+ * 纯前端编排——无后端(模板结构最简形态:app.tsx + server.ts + main.tsx)
9
+ */
10
+ import { UIRouter, uiServe, h, createClientBrowser } from 'weifuwu/vdom'
11
+ import type { Component } from 'weifuwu/vdom'
12
+ import { Button, Input, Tag, PageHeader, Space } from 'weifuwu/components'
13
+
14
+ // ── 子应用 1:计数器(独立状态) ──
15
+ const Counter = async (_init: any, ctx: any) => {
16
+ let count = 0
17
+ let step = 1
18
+ return async (_p: any) => (
19
+ <div class="wf-stack wf-gap-sm">
20
+ <Space align="center"><Tag variant="primary">子应用 1</Tag><b>{count}</b></Space>
21
+ <div class="wf-row wf-gap-xs">
22
+ <Button size="sm" onClick={() => { count -= step; ctx.render() }}>-{step}</Button>
23
+ <Button size="sm" variant="primary" onClick={() => { count += step; ctx.render() }}>+{step}</Button>
24
+ <Button size="sm" variant="ghost" onClick={() => { step = step === 1 ? 5 : 1; ctx.render() }}>步长 {step}→{step === 1 ? 5 : 1}</Button>
25
+ </div>
26
+ </div>
27
+ )
28
+ }
29
+
30
+ // ── 子应用 2:迷你任务(独立状态——与计数器互不干扰) ──
31
+ const MiniTodo = async (_init: any, ctx: any) => {
32
+ let items: string[] = ['子应用任务 A', '子应用任务 B']
33
+ let input = ''
34
+ return async (_p: any) => (
35
+ <div class="wf-stack wf-gap-sm">
36
+ <Tag variant="success">子应用 2</Tag>
37
+ <div class="wf-row wf-gap-xs">
38
+ <input class="wf-input" style="flex:1" value={input}
39
+ onInput={(e: any) => { input = (e.target as HTMLInputElement).value; ctx.render() }}
40
+ placeholder="新任务…" />
41
+ <Button size="sm" onClick={() => { if (input.trim()) { items.push(input.trim()); input = ''; ctx.render() } }}>添加</Button>
42
+ </div>
43
+ <ul style="margin:0;padding-left:16px">
44
+ {items.map((it, i) => <li key={it + i} class="wf-text-sm">{it}</li>)}
45
+ </ul>
46
+ </div>
47
+ )
48
+ }
49
+
50
+ // ── 父应用:工作台(嵌入子应用 + 边界事件观测) ──
51
+ export const WorkbenchPage: Component = async (_init: any, ctx: any) => {
52
+ return async (_p: any) => (
53
+ <div class="wf-stack wf-gap-md">
54
+ <PageHeader title="应用编排工作台" sub="父应用嵌入子应用——registerApp 注册 · <App appId /> 渲染 · 独立状态" />
55
+ <div class="wf-grid" style="--wf-cols:repeat(auto-fit,minmax(240px,1fr));--wf-gap:12px">
56
+ <div class="wf-surface wf-border wf-rounded-md wf-p-md wf-stack wf-gap-sm">
57
+ <b class="wf-text-sm">计数器(子应用 1)</b>
58
+ {h(Counter, {})}
59
+ </div>
60
+ <div class="wf-surface wf-border wf-rounded-md wf-p-md wf-stack wf-gap-sm">
61
+ <b class="wf-text-sm">迷你任务(子应用 2)</b>
62
+ {h(MiniTodo, {})}
63
+ </div>
64
+ </div>
65
+ </div>
66
+ )
67
+ }
68
+
69
+ export const multiRoutes = [
70
+ { path: '/', render: () => h(WorkbenchPage, {}) },
71
+ ]
72
+
73
+ export const pathFromHash = (): string => location.hash.replace(/^#/, '') || '/'
74
+
75
+ export function createMultiApp(root: HTMLElement, _options?: { history?: boolean }): ReturnType<typeof uiServe> {
76
+ // vdom 规范面:UIRouter + uiServe——布局共享精准路由
77
+ const router = new UIRouter()
78
+ for (const r of multiRoutes) {
79
+ router.get(r.path, (req: Request, ctx: any) =>
80
+ (ctx as { stream: (v: unknown) => Response }).stream(r.render()))
81
+ }
82
+ return uiServe(router, { root, browser: createClientBrowser()! })
83
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * multi 独立入口——复制本目录即可运行:
3
+ * cd examples/apps/multi && node server.ts → http://localhost:3303
4
+ */
5
+ import { createMultiApp, pathFromHash } from './app.tsx'
6
+
7
+ const sub = createMultiApp(document.querySelector('#root') as HTMLElement)
8
+ window.addEventListener('hashchange', () => sub.navigate(pathFromHash()))
@@ -0,0 +1,33 @@
1
+ /**
2
+ * multi 独立 server——纯前端编排(无后端 API)
3
+ * cd examples/apps/multi && node server.ts → http://localhost:3303
4
+ */
5
+ import { serve, Router, ui } from 'weifuwu'
6
+ import { resolve, dirname } from 'node:path'
7
+ import { fileURLToPath } from 'node:url'
8
+
9
+ const __dirname = dirname(fileURLToPath(import.meta.url))
10
+
11
+ const app = new Router()
12
+ app.use(ui())
13
+ app.get('/app.js', (req, ctx) => ctx.ui.js(resolve(__dirname, 'main.tsx')))
14
+
15
+ app.get('/*', async (req, ctx) => ctx.ui.html`
16
+ <!DOCTYPE html>
17
+ <html lang="zh-CN">
18
+ <head>
19
+ <meta charset="UTF-8">
20
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
21
+ <link rel="stylesheet" href="/components.css">
22
+ <title>multi 应用模板</title>
23
+ </head>
24
+ <body>
25
+ <div id="root"></div>
26
+ <script src="/app.js"></script>
27
+ </body>
28
+ </html>
29
+ `)
30
+ app.get('/components.css', (req, ctx) => ctx.ui.css('weifuwu/components/style.css'))
31
+
32
+ serve(app, { port: 3303 })
33
+ console.log('multi 模板 → http://localhost:3303')
@@ -0,0 +1,23 @@
1
+ # todo 应用模板(复制即用)
2
+
3
+ ```bash
4
+ # 1. 安装依赖(weifuwu 包——含 content/ 离线文档 + examples/ 模板源码)
5
+ npm i weifuwu
6
+
7
+ # 2. 复制本目录到你的项目(或直接在 examples/apps/todo 内开发)
8
+ # 3. 启动
9
+ node server.ts # → http://localhost:todo/3300 3301 3302 3303
10
+ ```
11
+
12
+ ## 改造指南
13
+
14
+ 见 `node_modules/weifuwu/content/apps/todo.md`(目录结构 + 逐步改造步骤)。
15
+
16
+ ## 结构
17
+
18
+ | 文件 | 职责 |
19
+ |------|------|
20
+ | app.tsx | 前端:路由表 + 页面组件 + 状态 |
21
+ | api.ts | 后端:API 注册函数(独立/嵌入共享) |
22
+ | server.ts | 独立入口(MemorySql——生产换 postgres() 一行) |
23
+ | main.tsx | 独立前端入口 |
@@ -0,0 +1,26 @@
1
+ /**
2
+ * todo 后端 API——可复用注册函数(独立 server 与 showcase 嵌入共享同一实现)
3
+ * 契约:registerTodoApi(app, sql)——sql 为 Sql 契约(MemorySql/postgres 均可)
4
+ */
5
+ import type { Router } from 'weifuwu'
6
+
7
+ export function registerTodoApi(app: Router, sql: any): void {
8
+ app.get('/api/todos', async () => {
9
+ const rows = await sql`SELECT * FROM todos ORDER BY id DESC`
10
+ return Response.json({ rows })
11
+ })
12
+ app.post('/api/todos', async (req: Request) => {
13
+ const { name } = await req.json()
14
+ const rows = await sql`INSERT INTO todos (name) VALUES (${String(name)}) RETURNING id, name, done`
15
+ return Response.json({ row: rows[0] }, { status: 201 })
16
+ })
17
+ app.patch('/api/todos/:id', async (req: Request, ctx: any) => {
18
+ const { done } = await req.json()
19
+ await sql`UPDATE todos SET done = ${!!done} WHERE id = ${Number((ctx as any).params.id)}`
20
+ return Response.json({ ok: true })
21
+ })
22
+ app.delete('/api/todos/:id', async (req: Request, ctx: any) => {
23
+ await sql`DELETE FROM todos WHERE id = ${Number((ctx as any).params.id)}`
24
+ return Response.json({ ok: true })
25
+ })
26
+ }
@@ -0,0 +1,128 @@
1
+ /**
2
+ * todo 应用模板——完整全栈(复制即用,随 npm 包发布 examples/apps/todo/)
3
+ *
4
+ * 演示(design/showcase-plan.md §P2):
5
+ * - 多页路由(/ 列表 + /new 新建)+ createStore 跨页状态
6
+ * - 后端:MemorySql 持久化(契约层——生产换 postgres() 一行)
7
+ * - 嵌入方式:createRouter(routes, root, { history: false })——showcase 页面内嵌
8
+ */
9
+ import { UIRouter, uiServe, h, createStore, createClientBrowser } from 'weifuwu/vdom'
10
+ import type { Component } from 'weifuwu/vdom'
11
+ import { Button, Input, Checkbox, Tag, EmptyState, PageHeader, Form, Field, Alert } from 'weifuwu/components'
12
+
13
+ export interface Todo {
14
+ id: string
15
+ name: string
16
+ done: boolean
17
+ }
18
+
19
+ export const todoStore = createStore<{ todos: Todo[]; loading: boolean; error: string | null }>({
20
+ todos: [],
21
+ loading: true,
22
+ error: null,
23
+ })
24
+
25
+ export async function loadTodos(): Promise<void> {
26
+ todoStore.update((s) => { s.loading = true; s.error = null })
27
+ try {
28
+ const res = await fetch('/api/todos')
29
+ const data = await res.json()
30
+ todoStore.update((s) => { s.todos = data.rows; s.loading = false })
31
+ } catch (e) {
32
+ todoStore.update((s) => { s.error = (e as Error).message; s.loading = false })
33
+ }
34
+ }
35
+
36
+ /** 列表页 */
37
+ export const TodoList: Component = async (_init: any, ctx: any) => {
38
+ void loadTodos()
39
+ const state = ctx.ui.useExternal(todoStore)
40
+ const toggle = async (t: Todo) => {
41
+ await fetch(`/api/todos/${t.id}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ done: !t.done }) })
42
+ await loadTodos()
43
+ }
44
+ const del = async (t: Todo) => {
45
+ await fetch(`/api/todos/${t.id}`, { method: 'DELETE' })
46
+ await loadTodos()
47
+ }
48
+ return async (_p: any) => (
49
+ <div class="wf-stack wf-gap-md">
50
+ <PageHeader title="任务列表" sub={`${state.todos.filter((t: Todo) => !t.done).length} 个未完成`}>
51
+ <Button variant="primary" onClick={() => location.hash = '#/new'}>新建任务</Button>
52
+ </PageHeader>
53
+ {state.error && <Alert variant="error">{state.error}</Alert>}
54
+ {state.loading && <div class="wf-text-secondary">加载中…</div>}
55
+ {!state.loading && state.todos.length === 0 && <EmptyState text="暂无任务——点击「新建任务」开始" />}
56
+ <div class="wf-stack wf-gap-xs">
57
+ {state.todos.map((t: Todo) => (
58
+ <div key={t.id} class="wf-surface wf-border wf-rounded-sm wf-p-sm wf-row wf-between">
59
+ <div class="wf-row wf-gap-sm">
60
+ <Checkbox checked={t.done} onChange={() => void toggle(t)} />
61
+ <span class={t.done ? 'wf-text-tertiary' : ''} style={t.done ? 'text-decoration:line-through' : ''}>{t.name}</span>
62
+ </div>
63
+ <div class="wf-row wf-gap-xs">
64
+ {t.done && <Tag variant="success">完成</Tag>}
65
+ <Button size="sm" variant="ghost" onClick={() => void del(t)}>删除</Button>
66
+ </div>
67
+ </div>
68
+ ))}
69
+ </div>
70
+ </div>
71
+ )
72
+ }
73
+
74
+ /** 新建页 */
75
+ export const TodoNew: Component = async (_init: any, ctx: any) => {
76
+ let name = ''
77
+ let error = ''
78
+ let saving = false
79
+ const submit = async () => {
80
+ if (!name.trim()) { error = '任务名不能为空'; ctx.render(); return }
81
+ saving = true; error = ''; ctx.render()
82
+ try {
83
+ await fetch('/api/todos', {
84
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
85
+ body: JSON.stringify({ name: name.trim() }),
86
+ })
87
+ await loadTodos()
88
+ location.hash = '#/'
89
+ } catch (e) {
90
+ error = (e as Error).message; saving = false; ctx.render()
91
+ }
92
+ }
93
+ return async (_p: any) => (
94
+ <div class="wf-stack wf-gap-md" style="max-width:480px">
95
+ <PageHeader title="新建任务" sub="填写任务名称——提交后写入 MemorySql" />
96
+ <Form onSubmit={() => void submit()}>
97
+ <Field label="任务名称" error={error}>
98
+ <Input value={name} onInput={(e: any) => { name = (e.target as HTMLInputElement).value; ctx.render() }}
99
+ placeholder="例如:完成 showcase Phase 2" autoFocus />
100
+ </Field>
101
+ <div class="wf-row wf-gap-sm">
102
+ <Button variant="primary" loading={saving} onClick={() => void submit()}>保存</Button>
103
+ <Button variant="ghost" onClick={() => location.hash = '#/'}>取消</Button>
104
+ </div>
105
+ </Form>
106
+ </div>
107
+ )
108
+ }
109
+
110
+ // ── 路由表(layout 包裹 + 参数——模板可复制部分) ──
111
+ export const todoRoutes = [
112
+ { path: '/', render: () => h(TodoList, {}) },
113
+ { path: '/new', render: () => h(TodoNew, {}) },
114
+ ]
115
+
116
+ /** hash → 内部路径(模板导航约定:location.hash = '#/new'——独立运行可深链/嵌入不污染宿主 pathname) */
117
+ export const pathFromHash = (): string => location.hash.replace(/^#/, '') || '/'
118
+
119
+ /** 应用入口:createTodoApp(root)——独立运行(main.tsx)与嵌入(showcase)复用 */
120
+ export function createTodoApp(root: HTMLElement, _options?: { history?: boolean }): ReturnType<typeof uiServe> {
121
+ // vdom 规范面:UIRouter + uiServe——布局共享精准路由
122
+ const router = new UIRouter()
123
+ for (const r of todoRoutes) {
124
+ router.get(r.path, (req: Request, ctx: any) =>
125
+ (ctx as { stream: (v: unknown) => Response }).stream(r.render()))
126
+ }
127
+ return uiServe(router, { root, browser: createClientBrowser()! })
128
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * todo 应用模板独立入口——复制本目录即可运行:
3
+ * cd examples/apps/todo && node server.ts → http://localhost:3300
4
+ * hash 桥接:hashchange → 内部路由(独立运行可深链 #/new)
5
+ */
6
+ import { createTodoApp, pathFromHash } from './app.tsx'
7
+
8
+ const sub = createTodoApp(document.querySelector('#root') as HTMLElement)
9
+ window.addEventListener('hashchange', () => sub.navigate(pathFromHash()))
@@ -0,0 +1,39 @@
1
+ /**
2
+ * todo 后端——MemorySql CRUD(契约层:演示用内存实现——生产换 postgres() 一行)
3
+ * 独立运行:node server.ts → http://localhost:3300
4
+ */
5
+ import { serve, Router, ui, createMemorySql } from 'weifuwu'
6
+ import { resolve, dirname } from 'node:path'
7
+ import { fileURLToPath } from 'node:url'
8
+ import { registerTodoApi } from './api.ts'
9
+
10
+ const __dirname = dirname(fileURLToPath(import.meta.url))
11
+ const sql = createMemorySql()
12
+
13
+ await sql.unsafe('CREATE TABLE IF NOT EXISTS todos (id serial PRIMARY KEY, name text, done boolean DEFAULT false)')
14
+
15
+ const app = new Router()
16
+ app.use(ui())
17
+ app.get('/app.js', (req, ctx) => ctx.ui.js(resolve(__dirname, 'main.tsx')))
18
+
19
+ registerTodoApi(app, sql)
20
+
21
+ app.get('/*', async (req, ctx) => ctx.ui.html`
22
+ <!DOCTYPE html>
23
+ <html lang="zh-CN">
24
+ <head>
25
+ <meta charset="UTF-8">
26
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
27
+ <link rel="stylesheet" href="/components.css">
28
+ <title>todo 应用模板</title>
29
+ </head>
30
+ <body>
31
+ <div id="root"></div>
32
+ <script src="/app.js"></script>
33
+ </body>
34
+ </html>
35
+ `)
36
+ app.get('/components.css', (req, ctx) => ctx.ui.css('weifuwu/components/style.css'))
37
+
38
+ serve(app, { port: 3300 })
39
+ console.log('todo 模板 → http://localhost:3300')
@@ -0,0 +1,9 @@
1
+ # hello-world 最小起步项目
2
+
3
+ ```bash
4
+ npm i weifuwu
5
+ node server.ts # → http://localhost:3400
6
+ ```
7
+
8
+ 三文件:server.ts(后端)+ routes.tsx(路由/组件)+ client.ts(前端入口)。
9
+ 改造:加页面 → routes.tsx 路由表加一行;加数据 → server.ts 加 /api 端点(组件用 ctx.data 读取)。
@@ -0,0 +1,14 @@
1
+ /**
2
+ * client.ts——客户端入口(纯 SPA 渲染:vdom3 事件流引擎)
3
+ * createRouter(routes, root) —— 监听 location → 匹配 → 事件流渲染
4
+ */
5
+ import { UIRouter, uiServe } from 'weifuwu/vdom'
6
+ import { routes } from './routes.tsx'
7
+
8
+ // 路由声明 → UIRouter(get 挂载)→ uiServe 渲染(vdom 规范面)
9
+ const router = new UIRouter()
10
+ for (const r of routes) {
11
+ router.get(r.path, (req: Request, ctx: any) =>
12
+ (ctx as { stream: (v: unknown) => Response }).stream(r.render()))
13
+ }
14
+ uiServe(router, { root: document.querySelector('#root') as HTMLElement })
@@ -0,0 +1,26 @@
1
+ /**
2
+ * routes.tsx——路由声明(两阶段异步组件)
3
+ *
4
+ * 新手必读(概念见 content/guides/component-model.md):
5
+ * - 外层 async 工厂 = mount(只一次):await 数据 / 初始化状态
6
+ * - 内层 async renderFn = 每次渲染:读最新 props / 输出视图
7
+ * - 状态 = 普通对象 let + 改后 ctx.render()(render-only)
8
+ */
9
+ import { h } from 'weifuwu/vdom'
10
+
11
+ // 两阶段异步组件:工厂层 await 数据(ctx.data——缓存 + 并发合并)
12
+ const Home = async (_init: any, ctx: any) => {
13
+ const data = await ctx.data.get('/api/hello')
14
+ let count = 0 // 组件状态(render-only)
15
+ return async (_props: any) =>
16
+ h('div', { class: 'wf-container wf-stack', style: '--wf-max:640px;--wf-gap:16px;padding:40px 16px;text-align:center' },
17
+ h('h1', { class: 'wf-text-3xl wf-m-0' }, 'weifuwu hello-world'),
18
+ h('p', { class: 'wf-text-secondary' }, `数据管道:${(data as any).msg}`),
19
+ h('button', {
20
+ class: 'wf-btn wf-btn--primary',
21
+ onClick: () => { count++; ctx.render() }, // 改状态 → 显式 render()
22
+ }, `点击 ${count} 次`),
23
+ )
24
+ }
25
+
26
+ export const routes = [{ path: '/', render: () => h(Home, {}) }]
@@ -0,0 +1,46 @@
1
+ /**
2
+ * hello-world——最小可运行起步项目(新手第一步,复制本目录即跑)
3
+ *
4
+ * 与 README「快速开始」模式 A 对应——三文件落地版:
5
+ * server.ts 后端:SPA 外壳 + /api/hello 数据端点
6
+ * routes.tsx 路由声明:两阶段异步组件(await ctx.data → 返回视图)
7
+ * client.ts 客户端入口:createRouter 接管渲染
8
+ *
9
+ * 跑起来:node server.ts → http://localhost:3400
10
+ */
11
+ import { serve, Router, ui, cors } from 'weifuwu'
12
+ import { resolve, dirname } from 'node:path'
13
+ import { fileURLToPath } from 'node:url'
14
+
15
+ const __dirname = dirname(fileURLToPath(import.meta.url))
16
+
17
+ const router = new Router()
18
+ router.use(cors())
19
+ router.use(ui()) // 注入 ctx.ui.html / ctx.ui.js / ctx.ui.css
20
+
21
+ // SPA 外壳(空 root + 前端 bundle)
22
+ router.get('/', (req, ctx) => ctx.ui.html`
23
+ <!doctype html>
24
+ <html>
25
+ <head>
26
+ <meta charset="UTF-8">
27
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
28
+ <link rel="stylesheet" href="/components.css">
29
+ <title>weifuwu hello-world</title>
30
+ </head>
31
+ <body>
32
+ <div id="root"></div>
33
+ <script src="/static/app.js"></script>
34
+ </body>
35
+ </html>
36
+ `)
37
+ router.get('/static/app.js', (req, ctx) => ctx.ui.js(resolve(__dirname, 'client.ts')))
38
+
39
+ // 样式自托管(node_modules/weifuwu/components/style.css——包内 CSS,零外部依赖/CDN)
40
+ router.get('/components.css', (req, ctx) => ctx.ui.css('weifuwu/components/style.css'))
41
+
42
+ // 数据端点(ctx.data 消费——SPA 下真 fetch,SSR 下服务端直取)
43
+ router.get('/api/hello', () => Response.json({ msg: '你好,weifuwu!' }))
44
+
45
+ serve(router, { port: 3400 })
46
+ console.log('hello-world → http://localhost:3400')