weifuwu 0.87.0 → 0.89.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +111 -135
- package/dist/client/components/ActionSheet/ActionSheet.d.ts +1 -1
- package/dist/client/components/AiChat/AiChat.d.ts +3 -4
- package/dist/client/components/ChatInput/ChatInput.d.ts +5 -0
- package/dist/client/components/CitationCard/CitationCard.d.ts +1 -1
- package/dist/client/components/Command/Command.d.ts +1 -1
- package/dist/client/components/ContextMenu/ContextMenu.d.ts +1 -1
- package/dist/client/components/DatePicker/DatePicker.d.ts +1 -1
- package/dist/client/components/Dropdown/Dropdown.d.ts +1 -1
- package/dist/client/components/Editor/model/html.d.ts +10 -0
- package/dist/client/components/ImageCropper/ImageCropper.d.ts +6 -2
- package/dist/client/components/Menu/Menu.d.ts +1 -1
- package/dist/client/components/NavMenu/NavMenu.d.ts +1 -1
- package/dist/client/components/Popconfirm/Popconfirm.d.ts +1 -1
- package/dist/client/components/SlideCanvas/SlideCanvas.d.ts +1 -1
- package/dist/client/components/Tour/Tour.d.ts +1 -1
- package/dist/client/components/TreeSelect/TreeSelect.d.ts +1 -1
- package/dist/client/components/index.js +41 -41
- package/dist/client/components/style.css +298 -644
- package/dist/client/layout/weifuwu-layout.css +286 -640
- package/dist/client/vdom/browser/Browser.d.ts +2 -0
- package/dist/client/vdom/commands.d.ts +4 -1
- package/dist/client/vdom/context/UIContext.d.ts +8 -0
- package/dist/client/vdom/core/diff/attrs.d.ts +10 -2
- package/dist/client/vdom/core/field/attributes.d.ts +12 -0
- package/dist/client/vdom/core/field/events.d.ts +8 -0
- package/dist/client/vdom/core/field/input-sync.d.ts +14 -0
- package/dist/client/vdom/core/field/key.d.ts +3 -0
- package/dist/client/vdom/core/field/props.d.ts +13 -1
- package/dist/client/vdom/core/field/ref.d.ts +6 -0
- package/dist/client/vdom/core/field/style.d.ts +7 -1
- package/dist/client/vdom/core/node/component.d.ts +3 -4
- package/dist/client/vdom/core/node/native.d.ts +6 -1
- package/dist/client/vdom/core/patch/index.d.ts +24 -1
- package/dist/client/vdom/core/patch/processors.d.ts +8 -1
- package/dist/client/vdom/core/protocol.d.ts +45 -0
- package/dist/client/vdom/core/router.d.ts +7 -0
- package/dist/client/vdom/core/ssr/absorb.d.ts +31 -4
- package/dist/client/vdom/core/transform/index.d.ts +6 -6
- package/dist/client/vdom/core/v2/cycle.d.ts +54 -0
- package/dist/client/vdom/core/v2/diff.d.ts +80 -0
- package/dist/client/vdom/core/v2/integrate.d.ts +24 -0
- package/dist/client/vdom/core/v2/render.d.ts +28 -0
- package/dist/client/vdom/core/v2/schedule.d.ts +33 -0
- package/dist/client/vdom/core/v2/serve.d.ts +4 -0
- package/dist/client/vdom/core/v2/spy.d.ts +21 -0
- package/dist/client/vdom/core/v2/ssr.d.ts +14 -0
- package/dist/client/vdom/core/vnode.d.ts +9 -6
- package/dist/client/vdom/dev/error-counter.d.ts +27 -0
- package/dist/client/vdom/dev/render-health.d.ts +60 -0
- package/dist/client/vdom/hooks/chat.d.ts +32 -5
- package/dist/client/vdom/hooks/drag-media.d.ts +3 -1
- package/dist/client/vdom/hooks/env.d.ts +32 -0
- package/dist/client/vdom/hooks/popup-manager.d.ts +21 -0
- package/dist/client/vdom/hooks/popup.d.ts +4 -1
- package/dist/client/vdom/hooks/stable.d.ts +4 -0
- package/dist/client/vdom/hooks/use-observable.d.ts +13 -0
- package/dist/client/vdom/index.d.ts +14 -6
- package/dist/client/vdom/index.js +4 -7
- package/dist/client/vdom/jsx-runtime.js +1 -1
- package/dist/client/vdom/middlewares/api.d.ts +8 -0
- package/dist/client/vdom/middlewares/auth-i18n.d.ts +7 -0
- package/dist/client/vdom/middlewares/ws.d.ts +41 -1
- package/dist/client/vdom/observable/index.d.ts +13 -0
- package/dist/client/vdom/observable/observable.d.ts +26 -0
- package/dist/client/vdom/observable/operators.d.ts +76 -0
- package/dist/client/vdom/observable/sources.d.ts +54 -0
- package/dist/client/vdom/observable/types.d.ts +45 -0
- package/dist/client/vdom/store.d.ts +17 -2
- package/dist/client/vdom/testing.js +2 -2
- package/dist/server/ai/agent.d.ts +18 -0
- package/dist/server/ai/client.d.ts +14 -2
- package/dist/server/ai/contracts.d.ts +2 -2
- package/dist/server/ai/sse.d.ts +6 -0
- package/dist/server/core/collect.d.ts +31 -0
- package/dist/server/core/error-counter.d.ts +11 -0
- package/dist/server/core/hub.d.ts +2 -0
- package/dist/server/core/router.d.ts +12 -9
- package/dist/server/db/contracts.d.ts +24 -0
- package/dist/server/db/memory-redis.d.ts +3 -4
- package/dist/server/db/memory-sql.d.ts +20 -4
- package/dist/server/db/postgres-server.d.ts +2 -0
- package/dist/server/db/query.d.ts +21 -0
- package/dist/server/db/redis-server.d.ts +4 -2
- package/dist/server/db/sql-parser.d.ts +2 -1
- package/dist/server/email/index.d.ts +2 -0
- package/dist/server/index.d.ts +4 -1
- package/dist/server/index.js +3927 -1982
- package/dist/server/messager/index.d.ts +21 -2
- package/dist/server/middleware/compress.d.ts +25 -0
- package/dist/server/ui/index.d.ts +8 -1
- package/dist/server/user/index.d.ts +4 -0
- package/dist/shared/router/chain.d.ts +9 -0
- package/dist/shared/router/context.d.ts +35 -0
- package/dist/shared/router/ctx-fields.d.ts +20 -0
- package/dist/shared/router/pipeline.d.ts +70 -0
- package/dist/shared/router/trie.d.ts +11 -3
- package/dist/shared/router/types.d.ts +23 -0
- package/docs/style-guide.md +44 -41
- package/package.json +13 -10
- package/content/apps/admin.md +0 -55
- package/content/apps/agent-platform.md +0 -35
- package/content/apps/auth.md +0 -49
- package/content/apps/multi.md +0 -44
- package/content/apps/todo.md +0 -51
- package/content/backend/ai.md +0 -28
- package/content/backend/auth.md +0 -20
- package/content/backend/email.md +0 -23
- package/content/backend/graphql.md +0 -23
- package/content/backend/http.md +0 -23
- package/content/backend/limit.md +0 -23
- package/content/backend/middleware.md +0 -17
- package/content/backend/queue.md +0 -23
- package/content/backend/redis.md +0 -26
- package/content/backend/router.md +0 -23
- package/content/backend/schedule.md +0 -23
- package/content/backend/sql.md +0 -27
- package/content/backend/sse.md +0 -26
- package/content/backend/ws.md +0 -26
- package/content/capabilities/app-node.md +0 -21
- package/content/capabilities/data.md +0 -21
- package/content/capabilities/events.md +0 -21
- package/content/capabilities/hooks.md +0 -22
- package/content/capabilities/i18n.md +0 -21
- package/content/capabilities/popup.md +0 -21
- package/content/capabilities/render-only.md +0 -23
- package/content/capabilities/router.md +0 -22
- package/content/capabilities/self-id.md +0 -21
- package/content/capabilities/store.md +0 -21
- package/content/capabilities/theme.md +0 -21
- package/content/capabilities/two-phase.md +0 -21
- package/content/components/accordion.md +0 -50
- package/content/components/actionsheet.md +0 -46
- package/content/components/affix.md +0 -51
- package/content/components/aichat.md +0 -57
- package/content/components/alert.md +0 -52
- package/content/components/alertgroup.md +0 -45
- package/content/components/anchor.md +0 -52
- package/content/components/app.md +0 -37
- package/content/components/approvalcard.md +0 -56
- package/content/components/appshell.md +0 -50
- package/content/components/aspectratio.md +0 -47
- package/content/components/authpage.md +0 -61
- package/content/components/autocomplete-v2.md +0 -40
- package/content/components/autocomplete.md +0 -56
- package/content/components/avatar.md +0 -51
- package/content/components/avatargroup.md +0 -47
- package/content/components/backtop.md +0 -53
- package/content/components/badge.md +0 -55
- package/content/components/breadcrumb.md +0 -49
- package/content/components/button.md +0 -63
- package/content/components/calendar-v2.md +0 -40
- package/content/components/calendar.md +0 -50
- package/content/components/card.md +0 -58
- package/content/components/carousel.md +0 -52
- package/content/components/cascader-v2.md +0 -39
- package/content/components/cascader.md +0 -54
- package/content/components/chart.md +0 -53
- package/content/components/chatinput.md +0 -63
- package/content/components/checkbox.md +0 -51
- package/content/components/checkboxgroup.md +0 -52
- package/content/components/citationcard.md +0 -48
- package/content/components/codeblock.md +0 -48
- package/content/components/codeeditor.md +0 -47
- package/content/components/collapse.md +0 -49
- package/content/components/colorpicker.md +0 -50
- package/content/components/command.md +0 -50
- package/content/components/confirm.md +0 -57
- package/content/components/contextmenu.md +0 -48
- package/content/components/copybutton.md +0 -51
- package/content/components/datepicker.md +0 -52
- package/content/components/descriptions-v2.md +0 -39
- package/content/components/descriptions.md +0 -52
- package/content/components/diffview-v2.md +0 -39
- package/content/components/diffview.md +0 -50
- package/content/components/divider.md +0 -48
- package/content/components/drawer.md +0 -55
- package/content/components/dropdown.md +0 -53
- package/content/components/editor.md +0 -49
- package/content/components/emptystate.md +0 -51
- package/content/components/exportcsv.md +0 -38
- package/content/components/field.md +0 -54
- package/content/components/filepreview-office.md +0 -37
- package/content/components/filepreview.md +0 -49
- package/content/components/filetree.md +0 -56
- package/content/components/fileupload-v2.md +0 -39
- package/content/components/fileupload.md +0 -57
- package/content/components/floatbutton.md +0 -52
- package/content/components/form-v2.md +0 -41
- package/content/components/form.md +0 -60
- package/content/components/grid.md +0 -51
- package/content/components/highlight-v2.md +0 -39
- package/content/components/highlight.md +0 -46
- package/content/components/hovercard.md +0 -51
- package/content/components/icon.md +0 -50
- package/content/components/imagecropper.md +0 -45
- package/content/components/img.md +0 -56
- package/content/components/infinitescroll-v2.md +0 -40
- package/content/components/infinitescroll.md +0 -54
- package/content/components/input.md +0 -65
- package/content/components/inputnumber.md +0 -58
- package/content/components/inview.md +0 -56
- package/content/components/jsonschemaform.md +0 -53
- package/content/components/jsonviewer-v2.md +0 -39
- package/content/components/jsonviewer.md +0 -49
- package/content/components/kanban.md +0 -46
- package/content/components/label.md +0 -48
- package/content/components/layout.md +0 -54
- package/content/components/layoutcontent.md +0 -43
- package/content/components/layoutheader.md +0 -43
- package/content/components/layoutsider.md +0 -43
- package/content/components/link.md +0 -52
- package/content/components/list.md +0 -44
- package/content/components/loading.md +0 -45
- package/content/components/logviewer-v2.md +0 -39
- package/content/components/logviewer.md +0 -53
- package/content/components/markdown.md +0 -51
- package/content/components/markdowneditor.md +0 -47
- package/content/components/math.md +0 -42
- package/content/components/mentions-v2.md +0 -39
- package/content/components/mentions.md +0 -52
- package/content/components/menu.md +0 -56
- package/content/components/menubar.md +0 -44
- package/content/components/messagebubble.md +0 -50
- package/content/components/modal.md +0 -59
- package/content/components/navmenu.md +0 -47
- package/content/components/notification.md +0 -51
- package/content/components/pageheader.md +0 -53
- package/content/components/pagination.md +0 -49
- package/content/components/paragraph.md +0 -45
- package/content/components/passwordinput.md +0 -57
- package/content/components/pininput-v2.md +0 -39
- package/content/components/pininput.md +0 -50
- package/content/components/pipeline.md +0 -49
- package/content/components/popconfirm.md +0 -58
- package/content/components/popover.md +0 -61
- package/content/components/progressbar.md +0 -50
- package/content/components/prompttemplate.md +0 -49
- package/content/components/qrcode.md +0 -50
- package/content/components/radiogroup.md +0 -53
- package/content/components/rate.md +0 -53
- package/content/components/reasoningblock.md +0 -47
- package/content/components/relationgraph.md +0 -52
- package/content/components/resizable.md +0 -53
- package/content/components/result.md +0 -49
- package/content/components/scrollbar.md +0 -49
- package/content/components/searchinput.md +0 -51
- package/content/components/segmentedcontrol.md +0 -59
- package/content/components/select-searchable.md +0 -47
- package/content/components/select.md +0 -66
- package/content/components/sessionlist.md +0 -52
- package/content/components/sheetgrid.md +0 -44
- package/content/components/skeleton.md +0 -55
- package/content/components/slidecanvas.md +0 -44
- package/content/components/slider.md +0 -62
- package/content/components/sortablelist.md +0 -39
- package/content/components/space.md +0 -52
- package/content/components/sparkline.md +0 -52
- package/content/components/statcard-countdown.md +0 -39
- package/content/components/statcard.md +0 -56
- package/content/components/steps.md +0 -48
- package/content/components/switch.md +0 -50
- package/content/components/tabbar.md +0 -45
- package/content/components/table-v2.md +0 -40
- package/content/components/table.md +0 -66
- package/content/components/tabs.md +0 -56
- package/content/components/tag.md +0 -51
- package/content/components/tagsinput-v2.md +0 -39
- package/content/components/tagsinput.md +0 -54
- package/content/components/text.md +0 -45
- package/content/components/textarea.md +0 -57
- package/content/components/themeswitch.md +0 -69
- package/content/components/timeline.md +0 -50
- package/content/components/title.md +0 -45
- package/content/components/toast.md +0 -52
- package/content/components/toggle-togglegroup.md +0 -52
- package/content/components/togglegroup.md +0 -47
- package/content/components/toolcallcard.md +0 -51
- package/content/components/tooltip.md +0 -50
- package/content/components/tour.md +0 -50
- package/content/components/transfer.md +0 -52
- package/content/components/tree-v2.md +0 -39
- package/content/components/tree.md +0 -59
- package/content/components/treeselect.md +0 -54
- package/content/components/typography.md +0 -51
- package/content/components/videoplayer.md +0 -52
- package/content/components/virtuallist.md +0 -52
- package/content/components/virtualtable-v2.md +0 -39
- package/content/components/virtualtable.md +0 -55
- package/content/components/watermark.md +0 -53
- package/content/components/wave.md +0 -43
- package/content/guides/ai-chat-family.md +0 -24
- package/content/guides/choose.md +0 -67
- package/content/guides/component-model.md +0 -32
- package/content/guides/component-standards.md +0 -123
- package/content/guides/components-guide.md +0 -813
- package/content/guides/custom-component.md +0 -321
- package/content/guides/data-guide.md +0 -281
- package/content/guides/file-preview-family.md +0 -18
- package/content/guides/frontend.md +0 -968
- package/content/guides/layout-choice.md +0 -64
- package/content/guides/layout-guide.md +0 -241
- package/content/guides/middleware.md +0 -459
- package/content/guides/mobile-guide.md +0 -105
- package/content/guides/page-building.md +0 -98
- package/content/guides/production.md +0 -37
- package/content/guides/quality.md +0 -60
- package/content/guides/realtime-guide.md +0 -296
- package/content/guides/render-only.md +0 -44
- package/content/guides/saas-guide.md +0 -253
- package/content/guides/server-guide.md +0 -359
- package/content/guides/start.md +0 -41
- package/content/guides/styling.md +0 -154
- package/content/guides/ui-dom-guide.md +0 -157
- package/content/index.json +0 -4344
- package/content/index.md +0 -181
- package/content/layout/align.md +0 -20
- package/content/layout/anchor.md +0 -19
- package/content/layout/app-shell.md +0 -23
- package/content/layout/border.md +0 -20
- package/content/layout/center.md +0 -19
- package/content/layout/cluster.md +0 -19
- package/content/layout/container.md +0 -19
- package/content/layout/fill.md +0 -19
- package/content/layout/grid.md +0 -19
- package/content/layout/hidden.md +0 -22
- package/content/layout/layer.md +0 -19
- package/content/layout/position.md +0 -22
- package/content/layout/row.md +0 -23
- package/content/layout/safe-area.md +0 -20
- package/content/layout/scroll.md +0 -21
- package/content/layout/spacing.md +0 -22
- package/content/layout/split.md +0 -19
- package/content/layout/stack.md +0 -19
- package/content/layout/surface.md +0 -23
- package/content/layout/text.md +0 -22
- package/content/patterns/app-shell.md +0 -34
- package/content/patterns/dashboard.md +0 -36
- package/content/patterns/data-screen.md +0 -30
- package/content/patterns/detail-page.md +0 -31
- package/content/patterns/docs.md +0 -34
- package/content/patterns/focus-task.md +0 -34
- package/content/patterns/landing.md +0 -35
- package/content/patterns/list-page.md +0 -32
- package/content/patterns/mobile.md +0 -31
- package/content/patterns/settings-page.md +0 -33
- package/content/patterns/workspace.md +0 -32
- package/dist/cli/content-sync.test.d.ts +0 -1
- package/dist/cli/docs-cli.test.d.ts +0 -1
- package/dist/cli/docs.d.ts +0 -2
- package/dist/cli/docs.mjs +0 -10961
- package/dist/client/vdom/core/build.d.ts +0 -36
- package/dist/client/vdom/core/diff/children.d.ts +0 -29
- package/dist/client/vdom/core/diff/index.d.ts +0 -22
- package/dist/client/vdom/core/diff/output.d.ts +0 -30
- package/dist/client/vdom/core/diff/same.d.ts +0 -22
- package/dist/client/vdom/core/serve.d.ts +0 -75
- package/dist/client/vdom/core/ssr/index.d.ts +0 -25
- package/examples/apps/admin/README.md +0 -23
- package/examples/apps/admin/api.ts +0 -27
- package/examples/apps/admin/app.tsx +0 -144
- package/examples/apps/admin/main.tsx +0 -8
- package/examples/apps/admin/server.ts +0 -37
- package/examples/apps/auth/README.md +0 -23
- package/examples/apps/auth/api.ts +0 -49
- package/examples/apps/auth/app.tsx +0 -137
- package/examples/apps/auth/main.tsx +0 -8
- package/examples/apps/auth/server.ts +0 -37
- package/examples/apps/multi/README.md +0 -23
- package/examples/apps/multi/app.tsx +0 -83
- package/examples/apps/multi/main.tsx +0 -8
- package/examples/apps/multi/server.ts +0 -33
- package/examples/apps/todo/README.md +0 -23
- package/examples/apps/todo/api.ts +0 -26
- package/examples/apps/todo/app.tsx +0 -128
- package/examples/apps/todo/main.tsx +0 -9
- package/examples/apps/todo/server.ts +0 -39
- package/examples/hello-world/README.md +0 -9
- package/examples/hello-world/client.ts +0 -14
- package/examples/hello-world/routes.tsx +0 -26
- package/examples/hello-world/server.ts +0 -46
- package/examples/patterns/AppShell.tsx +0 -224
- package/examples/patterns/Dashboard.tsx +0 -153
- package/examples/patterns/DataScreen.tsx +0 -104
- package/examples/patterns/DetailPage.tsx +0 -79
- package/examples/patterns/Docs.tsx +0 -105
- package/examples/patterns/FocusTask.tsx +0 -67
- package/examples/patterns/Landing.tsx +0 -90
- package/examples/patterns/ListPage.tsx +0 -77
- package/examples/patterns/Mobile.tsx +0 -154
- package/examples/patterns/SettingsPage.tsx +0 -98
- package/examples/patterns/SplitWorkspace.tsx +0 -113
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
# 样式体系指南
|
|
2
|
-
|
|
3
|
-
> 从 docs/styling.md 迁移(content/ 文档库——随 npm 包发布,与框架版本同步)。
|
|
4
|
-
> 本页为叙述性指南——组件/能力逐项参考见 content/ 各域目录。
|
|
5
|
-
|
|
6
|
-
# 主题配置指南(三档)
|
|
7
|
-
|
|
8
|
-
> 主题配置按复杂度分三档——**90% 的项目止步于第一档**。
|
|
9
|
-
|
|
10
|
-
## 第一档:1 个值换肤(90% 项目)
|
|
11
|
-
|
|
12
|
-
改 `--wf-brand-seed` **一个值**,亮/暗全站色板自动跟随(50/500/600/700 色阶经
|
|
13
|
-
`color-mix()` 派生;不支持 color-mix 的旧浏览器自动回退默认色板——渐进增强,零 JS):
|
|
14
|
-
|
|
15
|
-
```html
|
|
16
|
-
<style>
|
|
17
|
-
:root {
|
|
18
|
-
--wf-brand-seed: #7c3aed; /* 品牌主色(亮色)——一个值全站跟随 */
|
|
19
|
-
--wf-dark-brand-seed: #a78bfa; /* 暗色品牌(可选,不设则暗色沿用亮色色板) */
|
|
20
|
-
}
|
|
21
|
-
</style>
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
品牌换色 = 改 `--wf-brand-seed`;组件定制 = 设一个钩子变量:
|
|
25
|
-
|
|
26
|
-
```html
|
|
27
|
-
<style>
|
|
28
|
-
:root {
|
|
29
|
-
--wf-modal-width: 640px; /* 组件定制钩子 */
|
|
30
|
-
--wf-btn-radius: 999px;
|
|
31
|
-
--wf-field-height: 44px;
|
|
32
|
-
--wf-card-shadow: 0 8px 24px rgba(0,0,0,.12);
|
|
33
|
-
}
|
|
34
|
-
</style>
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
钩子清单:`--wf-btn-*` `--wf-card-*` `--wf-field-*` `--wf-modal-*` `--wf-drawer-width` `--wf-toast-*` `--wf-alert-radius` `--wf-badge-radius` `--wf-tag-radius` `--wf-switch-radius` `--wf-popover-*` `--wf-tooltip-radius` `--wf-dropdown-min-width` `--wf-datepicker-*`。
|
|
38
|
-
|
|
39
|
-
## 第二档:预设主题(开箱即用)
|
|
40
|
-
|
|
41
|
-
`<html data-preset="minimal|compact|rounded">` 一键切换预设(与暗色 `data-theme` 正交,可组合):
|
|
42
|
-
|
|
43
|
-
| 预设 | 语义 | 适用 |
|
|
44
|
-
|------|------|------|
|
|
45
|
-
| `minimal` | 品牌弱化:中性蓝灰主色 | 内容/文档型产品(Geist 式克制) |
|
|
46
|
-
| `compact` | 紧凑密度:控件/间距/字号缩一档 | 数据密集型工具(管理后台/监控) |
|
|
47
|
-
| `rounded` | 大圆角:radius 全升一档 + 按钮胶囊 | 亲和/消费型产品 |
|
|
48
|
-
|
|
49
|
-
```html
|
|
50
|
-
<html data-theme="dark" data-preset="compact">
|
|
51
|
-
<!-- 暗色 + 紧凑密度可同时生效 -->
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
React/JS 侧:`<ThemeSwitch preset onPresetChange={...} />` 渲染模式 + 预设双行切换
|
|
55
|
-
(localStorage 持久化,`wf_theme_preset` key)。
|
|
56
|
-
|
|
57
|
-
## 第三档:深度定制
|
|
58
|
-
|
|
59
|
-
**组件级覆盖**(@layer 友好,未分层用户 CSS 天然最高优先级):
|
|
60
|
-
|
|
61
|
-
```css
|
|
62
|
-
/* 覆盖 Button 主色 */
|
|
63
|
-
.wf-btn--primary {
|
|
64
|
-
background: #06b6d4;
|
|
65
|
-
border-color: #06b6d4;
|
|
66
|
-
}
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
**作用域主题**(CSS 变量沿 DOM 继承——多主题共存):
|
|
70
|
-
|
|
71
|
-
```html
|
|
72
|
-
<div style="--wf-color-primary: #f59e0b;">
|
|
73
|
-
<!-- 此区域内组件使用金色主题,外部不受影响 -->
|
|
74
|
-
<button class="wf-btn wf-btn--primary">金色按钮</button>
|
|
75
|
-
</div>
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
**全局语义变量**:直接覆盖 `--wf-*` 语义层:
|
|
79
|
-
|
|
80
|
-
```css
|
|
81
|
-
:root {
|
|
82
|
-
--wf-radius: 8px;
|
|
83
|
-
--wf-font-sans: 'Inter', system-ui, sans-serif;
|
|
84
|
-
}
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## 暗色模式
|
|
88
|
-
|
|
89
|
-
两种激活方式(显式 `data-theme` 优先级高于系统偏好):
|
|
90
|
-
|
|
91
|
-
```ts
|
|
92
|
-
document.documentElement.setAttribute('data-theme', 'dark') // 手动切换
|
|
93
|
-
document.documentElement.setAttribute('data-theme', 'light') // 强制亮色
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
未设置 `data-theme` 时自动跟随系统偏好。所有 `--wf-*` 变量暗色自动切换;自定义暗色变量:
|
|
97
|
-
|
|
98
|
-
```css
|
|
99
|
-
[data-theme="dark"] {
|
|
100
|
-
--wf-color-bg: #1a1a2e;
|
|
101
|
-
--wf-color-text: #e0e0e0;
|
|
102
|
-
--wf-color-border: #2a2a4a;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/* 系统自动暗色需与上面同步 */
|
|
106
|
-
@media (prefers-color-scheme: dark) {
|
|
107
|
-
:root:not([data-theme="light"]) {
|
|
108
|
-
--wf-color-bg: #1a1a2e;
|
|
109
|
-
--wf-color-text: #e0e0e0;
|
|
110
|
-
--wf-color-border: #2a2a4a;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
## 状态层与表面层级(设计语言内建)
|
|
116
|
-
|
|
117
|
-
组件交互反馈统一走**状态层 token**(可覆盖定制):
|
|
118
|
-
|
|
119
|
-
```
|
|
120
|
-
--wf-state-hover rgba(0,0,0,.04) 亮色 / rgba(255,255,255,.06) 暗色
|
|
121
|
-
--wf-state-pressed rgba(0,0,0,.08) 亮色 / rgba(255,255,255,.10) 暗色
|
|
122
|
-
--wf-state-selected 品牌浅底(--wf-color-primary-bg)
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
浮层(Modal/Drawer/Popover/Dropdown/Select/DatePicker 等)统一用
|
|
126
|
-
`--wf-color-bg-elevated` 面板底色——暗色下自动抬升一级(Material tonal elevation 思想)。
|
|
127
|
-
|
|
128
|
-
## 覆盖优先级(@layer)
|
|
129
|
-
|
|
130
|
-
`@layer tokens, base, layout, utilities, components`——你写的未分层 CSS 天然最高优先级;
|
|
131
|
-
也可用 `@layer utilities` 精准覆盖。
|
|
132
|
-
|
|
133
|
-
## 零自定义 CSS 模式(推荐)
|
|
134
|
-
|
|
135
|
-
一个项目只需要引用**一个 CSS 文件**(`weifuwu/components/style.css`,内含 Token + 布局原语 + 组件样式),
|
|
136
|
-
业务代码全部由组件 + `wf-*` 原语承担,**不需要再写 `style.css`**:
|
|
137
|
-
|
|
138
|
-
```tsx
|
|
139
|
-
// 组件 → 页面功能块;wf-* 原语 → 块之间的空间关系;--wf-* → 业务色值
|
|
140
|
-
<PageHeader title="仪表盘" sub="欢迎回来">
|
|
141
|
-
<Button variant="primary">+ 新建</Button>
|
|
142
|
-
</PageHeader>
|
|
143
|
-
<div class="wf-row wf-gap-lg">
|
|
144
|
-
<StatCard label="总用户" value="1,234" trend="up" trendLabel="12%" />
|
|
145
|
-
</div>
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
主题定制(品牌色/圆角/字体)不需要独立文件——**内联在 HTML 的 `<style>` 里即可**。
|
|
149
|
-
完整的零样式示例:`apps/components-demo`(组件 + 原语即插即用,无手写样式)。
|
|
150
|
-
|
|
151
|
-
诚实例外(合理场景,仍可内联 `<style>` 解决):打印/PDF 导出规则、第三方库宿主样式、
|
|
152
|
-
业务特有的一次性视觉(如色板选择器交互)。
|
|
153
|
-
|
|
154
|
-
---
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
# 前端运行时指南(UIRouter/渲染器)
|
|
2
|
-
|
|
3
|
-
> 从 docs/frontend-ui-dom.md 迁移(content/ 文档库——随 npm 包发布,与框架版本同步)。
|
|
4
|
-
> 本页为叙述性指南——组件/能力逐项参考见 content/ 各域目录。
|
|
5
|
-
|
|
6
|
-
# ui-dom — 前端运行时(vdom3 精准事件流引擎)
|
|
7
|
-
|
|
8
|
-
> **createRouter(路由)+ createRoot(挂载)+ 精准事件流(渲染本体)**,
|
|
9
|
-
> 组件 = 两阶段异步组件(`async (initProps, ctx) => (props) => VNode`),
|
|
10
|
-
> **params 在 ctx**(对齐后端 `ctx.params`),渲染全链路可观测/可回放/可断言。
|
|
11
|
-
|
|
12
|
-
## 架构:vdom3 事件流引擎
|
|
13
|
-
|
|
14
|
-
```
|
|
15
|
-
用户操作(ctx.render())
|
|
16
|
-
→ 决策层事件(jsx/vdom):comp:render → vnode:patch(reuse/rebuild 决策)
|
|
17
|
-
→ 执行层事件(dom):node:create/insert/remove/move、prop:update、
|
|
18
|
-
text:update、event:bind/unbind、ref:cleanup
|
|
19
|
-
→ DOM(精准状态变化——事件数 = 实际变化数)
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
- **统一命名**:对象 + 动作 + 参数(`{ entity, action, target, payload }`——键 `entity:action`)——location(`route:change`)/ jsx(`comp:render`/`props:update`)/ vdom(`vnode:patch`)/ dom(`node:insert` 等)四层同构
|
|
23
|
-
- **DOM = fold(事件流)**:初始 DOM + 事件序列 = 任意时刻 DOM——可记录(`stream.events()`)、回放(`replay`)、断言(`expectEventSequence`/`eventsOf`)
|
|
24
|
-
- **不变量:无事件流不渲染**——所有状态变化都通过事件流(DOM 操作/组件生命周期/索引/事件注册/错误/挂起/内部决策/文本操作/副作用)——静态审计 + 运行时对照审计(`__WF_VDOM_AUDIT='1'`)守护
|
|
25
|
-
- **render-only**:渲染唯一触发 `ctx.render()`(组件级——只重跑该组件 renderFn + patch 其输出,兄弟零执行);`ctx.ui.render()` 为兼容面(同义)
|
|
26
|
-
- **组件级精准更新**:`ctx.render()` 只刷新自身——组件 O(1) 索引定位——props 未变的子组件剪枝——事件数 = 实际变化数
|
|
27
|
-
|
|
28
|
-
### 事件代理(所有监听统一注册表)
|
|
29
|
-
|
|
30
|
-
元素事件/全局监听/动画钩子全部收敛到**代理注册表**(`delegate.ts`):
|
|
31
|
-
- 元素事件(onClick 等 props)→ 挂载点监听(每挂载点每事件一次——O(1))+ 按 data-v3-id 祖先链分发(handler 更新 = Map 覆盖——**零重绑零噪音**)
|
|
32
|
-
- 全局监听(keydown/mousedown/pointer/popstate/scroll/选区/剪贴板)→ `addGlobalListener`(同事件聚合——EventTarget 每事件一次)
|
|
33
|
-
- 动画钩子(animationend)→ `bindElementListener`(once 自动解绑)
|
|
34
|
-
- 不冒泡事件(error/load)→ 捕获监听;`e.currentTarget` 还原为绑定元素(与元素级语义一致)
|
|
35
|
-
|
|
36
|
-
## 快速开始(SPA)
|
|
37
|
-
|
|
38
|
-
```tsx
|
|
39
|
-
import { createRouter, h } from 'weifuwu/ui-dom'
|
|
40
|
-
import { Button } from 'weifuwu/components'
|
|
41
|
-
|
|
42
|
-
// 两阶段异步组件:外层工厂(mount 一次——状态/数据),内层 renderFn(每次渲染)
|
|
43
|
-
const Counter = async (_init, ctx) => {
|
|
44
|
-
let count = 0
|
|
45
|
-
return async () =>
|
|
46
|
-
h('div', {},
|
|
47
|
-
h('button', {
|
|
48
|
-
onClick: () => { count++; ctx.render() }, // render-only:显式触发
|
|
49
|
-
}, `count:${count}`),
|
|
50
|
-
)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
createRouter(
|
|
54
|
-
[{ path: '/', render: () => h(Counter, {}) }],
|
|
55
|
-
document.querySelector('#root') as HTMLElement,
|
|
56
|
-
)
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
- 页面组件 ctx:`ctx.render()`(页面级刷新)/ `ctx.route`(`{ path, params }`——动态参数)/ `ctx.ui`(24 hooks)
|
|
60
|
-
- 中间件面注入:`createRouter(routes, root, { ctx })`——`ctx` 为中间件展开结果(`api/auth/toast/confirm/i18n` 等——与后端 `app.use` 同理念):
|
|
61
|
-
|
|
62
|
-
```ts
|
|
63
|
-
let ctx: any = {}
|
|
64
|
-
ctx = await api({ baseURL: '', token: ... })(ctx)
|
|
65
|
-
ctx = auth({ ... })(ctx)
|
|
66
|
-
ctx = v3Toast()(ctx)
|
|
67
|
-
ctx = v3Notification()(ctx)
|
|
68
|
-
createRouter([...], root, { ctx })
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## 无路由挂载(createRoot)
|
|
72
|
-
|
|
73
|
-
组件树直接挂载(弹窗宿主、微前端片段、非路由页面):
|
|
74
|
-
|
|
75
|
-
```ts
|
|
76
|
-
import { createRoot, h } from 'weifuwu/ui-dom'
|
|
77
|
-
const handle = createRoot(h(App, {}), document.getElementById('root')!, { ctx })
|
|
78
|
-
await handle.ready // 首帧完成
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
## ctx.ui(组件库消费面——24 hooks)
|
|
82
|
-
|
|
83
|
-
`useExternal`(共享状态)/ `useControlled`/`useControlledInput`(受控原语)/ `useOpen`/`usePopup`(弹层组合器——portal 定位/Escape/外部点击)/ `usePopupPosition` / `useTween` / `useInView` / `useScrollPosition` / `useGlobalKey` / `useDrag`/`useDragDrop` / `useMedia`/`useBreakpoint` / `useReducedMotion` / `useStableRef` / `useAnimationEnd` / `usePresence`(退场状态机)/ `useLongPress` / `useHoverCapable` / `useVisualViewport` / `useAsync` / `useChat`(AI 会话——消息/工具调用/审批)。
|
|
84
|
-
|
|
85
|
-
组件库(weifuwu/components)零引擎耦合:只消费 `ctx.ui` 契约——vdom3 与未来引擎可无缝替换。
|
|
86
|
-
|
|
87
|
-
## 事件流可观测(调试/测试)
|
|
88
|
-
|
|
89
|
-
```ts
|
|
90
|
-
import { stream, evKey } from 'weifuwu/ui-dom'
|
|
91
|
-
import { eventsOf, expectEventSequence } from 'weifuwu/ui-dom'
|
|
92
|
-
|
|
93
|
-
const events = stream.events()
|
|
94
|
-
eventsOf(events, 'node:create').length // 创建了几个节点
|
|
95
|
-
// 决策层事件解释"为什么"(reuse/rebuild),执行层事件是"做了什么"——完全可断言
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
**完整事件覆盖**(任何问题都在事件流可定位):
|
|
99
|
-
- **错误**:`error:throw/caught`(工厂/renderFn/挂载/更新失败——phase 定位)+ **挂起超时**(renderFn/buildVNode 永不 resolve → 3s 检测——静默失败不再静默)
|
|
100
|
-
- **内部决策**:`internal:queue/notfound/skip`(busy 排队/组件未定位)
|
|
101
|
-
- **事件流自身**:`stream:overflow`(溢出可审计)/ `stream:watermark`(水位预警)/ `size()`/`capacity()`/`overflowCount()`/`subscribe(filter, fn)`(按层过滤订阅)
|
|
102
|
-
- **文本操作**:`text:input`(输入/组合)/ `text:select`(选区)/ `text:copy/cut/paste`(剪贴板摘要)
|
|
103
|
-
- **组件副作用**:`ref:mount` + `effect:animate/lock/unlock/focus/scroll`(动画/滚动锁/焦点 trap/滚动)
|
|
104
|
-
|
|
105
|
-
测试纪律(jsdom):`renderVNode`(VNode 层)/ `mountComponent`(同实例 re-render)/ `expectEventSequence`(精确事件序列)——渲染 = 事件序列断言。
|
|
106
|
-
|
|
107
|
-
### 多应用加载(app 节点)
|
|
108
|
-
|
|
109
|
-
```ts
|
|
110
|
-
import { registerApp, App } from 'weifuwu/ui-dom'
|
|
111
|
-
|
|
112
|
-
// 注册子应用(工厂——可 await 初始化——appId 复用不重跑)
|
|
113
|
-
registerApp('mini-todo', (props, ctx) => h(MiniTodo, {}))
|
|
114
|
-
// 父树中嵌入(不隔离设计——共享流/全局 id——天然归属唯一)
|
|
115
|
-
h(App, { appId: 'mini-todo', props: { title } })
|
|
116
|
-
```
|
|
117
|
-
- 边界事件(同流):`app:mount` / `app:update`(props keys)/ `app:unmount` / `app:error`(unknown-app)——payload 带 appId 可区分
|
|
118
|
-
- 子应用独立状态(工厂闭包)——渲染/事件与父同流(全链路可观测——调试一条流)
|
|
119
|
-
|
|
120
|
-
## SSR(事件流形态——DOM = fold 不变量)
|
|
121
|
-
|
|
122
|
-
vdom3 SSR 不是 HTML 字符串 + 游标收养,而是**事件流序列化**:
|
|
123
|
-
|
|
124
|
-
```ts
|
|
125
|
-
// 服务端:构建 → 事件流 → HTML + 序列化事件
|
|
126
|
-
import { renderToEvents, eventsToHtml, serializeEvents } from 'weifuwu/ui-dom'
|
|
127
|
-
const events = await renderToEvents(vnode) // 事件流(node:create/insert/...)
|
|
128
|
-
const html = eventsToHtml(events) // 首帧 HTML
|
|
129
|
-
const data = serializeEvents(events) // 序列化事件(__DATA__)
|
|
130
|
-
// 客户端:replay(events, root) —— 零 DOM 猜测,与服务端 HTML 同构
|
|
131
|
-
import { deserializeEvents, replay } from 'weifuwu/ui-dom'
|
|
132
|
-
replay(deserializeEvents(data), root)
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
`ctx.data.get(key, fetcher)` 三场景自动适配(SSR 真 fetch → 序列化进 `__DATA__` → 客户端种子命中 → SPA 未命中触发 fetcher)。
|
|
136
|
-
|
|
137
|
-
## 组件纪律速查(事故沉淀——详见 AGENTS.md)
|
|
138
|
-
|
|
139
|
-
- **render-only**:状态是普通对象(`let` + 显式 `render()`)——禁止隐式触发
|
|
140
|
-
- **mount/render 分工**:只依赖稳定引用的回调(ctx/挂载闭包)→ mount 定义(零重绑);依赖最新 props → render 内定义(重绑是正确性要求)
|
|
141
|
-
- **ref 稳定**:带清理的 ref 定义在 mount 作用域(内联 ref 每次渲染新函数 → ref(null) 反复触发)
|
|
142
|
-
- **浮层**:`ctx.ui.openPopup`(命令式——#__wf_portal 统一容器)——禁止 absolute 相对父容器
|
|
143
|
-
- **浏览器环境**:组件用 `ctx.browser`(禁裸 window/document)——SSR 安全三态
|
|
144
|
-
- **事件 handler**:代理 Map 覆盖——handler 更新零重绑零事件(稳定引用仅为性能建议——结构共享收益前提)
|
|
145
|
-
- **props 不可变(红线——Chat 空 bubble 事故)**:**禁止原地修改 props 引用的对象**(`m.content += text`)——vdom3 剪枝按 props 浅比较判断"未变"→ 复用旧输出 → 渲染不更新。**状态更新必须新建对象**(`$.msgs[i] = { ...m, content: ... }`——引用变 → 剪枝不命中 → 重渲染)。排查"渲染没更新"时看 `__wf_tail` 的 `comp:build` 事件 `reason: 'reuse-skip'`(= 契约:props 引用未变)
|
|
146
|
-
|
|
147
|
-
## 与后端共享
|
|
148
|
-
|
|
149
|
-
- 中间件理念同构:后端 `app.use`(ctx.sql/redis/api/...)↔ 前端 `createRouter(routes, root, { ctx })`(ctx.api/auth/...)
|
|
150
|
-
- 路由参数:`ctx.route.params`(对齐后端 `ctx.params`)
|
|
151
|
-
- `weifuwu/dev`(Node loader):服务端直接跑 `.tsx`——与 `ctx.ui.js` 前端动态编译对称,两端同一 JSX 运行时
|
|
152
|
-
|
|
153
|
-
## 参考
|
|
154
|
-
|
|
155
|
-
- 组件库蓝本:`apps/components-demo`(115 组件 + createRouter 装配)
|
|
156
|
-
- 完整应用:`apps/agent-platform`(多租户 AI 平台——认证守卫/嵌套布局/AI 会话)
|
|
157
|
-
- 布局蓝本:`apps/layouts-demo`(8 种布局模式)
|