From e99a9fb274ffbe37ae580dc312eebc7e6b0c8216 Mon Sep 17 00:00:00 2001 From: oneao Date: Thu, 8 Oct 2026 22:38:34 +0800 Subject: [PATCH] u --- .../plans/g3-ui-重写-参照fms-vue_084cfb52.md | 334 ++++++ code/g3soft-libs/.gitignore | 4 + code/g3soft-libs/CODEBUDDY.md | 79 +- code/g3soft-libs/README.md | 13 +- .../docs/app/components/app/AppHeaderCTA.vue | 6 + .../docs/app/components/content/ApiTable.vue | 137 --- .../docs/content/framework/.navigation.yml | 2 + .../framework/1.layout/.navigation.yml | 2 + .../docs/content/framework/1.layout/index.md | 21 + code/g3soft-libs/docs/content/index.md | 28 +- .../content/ui/1.usage/getting-started.md | 3 +- .../docs/content/ui/2.general/button-group.md | 64 ++ .../docs/content/ui/2.general/button.md | 187 ++- .../docs/content/ui/2.general/grid.md | 123 ++ .../docs/content/ui/2.general/segmented.md | 123 ++ .../docs/content/ui/2.general/space.md | 107 ++ .../docs/content/ui/2.general/tag.md | 111 ++ .../docs/content/ui/3.form/.navigation.yml | 2 + .../docs/content/ui/3.form/checkbox.md | 102 ++ .../docs/content/ui/3.form/form.md | 187 +++ .../docs/content/ui/3.form/input.md | 167 +++ .../docs/content/ui/3.form/radio.md | 106 ++ .../docs/content/ui/3.form/select.md | 159 +++ .../docs/content/ui/3.form/switch.md | 97 ++ .../docs/content/ui/4.overlay/.navigation.yml | 2 + .../docs/content/ui/4.overlay/drawer.md | 114 ++ .../docs/content/ui/4.overlay/dropdown.md | 158 +++ .../docs/content/ui/4.overlay/modal.md | 183 +++ .../docs/content/ui/4.overlay/popover.md | 123 ++ .../docs/content/ui/4.overlay/tooltip.md | 105 ++ .../content/ui/5.feedback/.navigation.yml | 2 + .../docs/content/ui/5.feedback/message.md | 131 +++ .../content/ui/5.feedback/notification.md | 113 ++ .../docs/content/ui/5.feedback/scrollbar.md | 89 ++ .../docs/content/ui/5.feedback/spin.md | 90 ++ .../docs/content/ui/6.data/.navigation.yml | 2 + .../docs/content/ui/6.data/date.md | 172 +++ .../docs/content/ui/6.data/pagination.md | 123 ++ .../docs/content/ui/6.data/splitter.md | 116 ++ .../docs/content/ui/6.data/tabs.md | 137 +++ .../docs/content/ui/6.data/tree.md | 205 ++++ code/g3soft-libs/docs/data/api/button.json | 66 -- .../docs/data/api/config-provider.json | 50 - .../docs/examples/button-group/basic.vue | 12 + .../docs/examples/button-group/variant.vue | 28 + .../docs/examples/button-group/vertical.vue | 12 + .../docs/examples/button/basic.vue | 4 +- .../docs/examples/button/block.vue | 16 +- .../docs/examples/button/disabled.vue | 14 + .../docs/examples/button/event.vue | 22 + .../docs/examples/button/global-defaults.vue | 21 + .../docs/examples/button/html-type.vue | 32 + .../g3soft-libs/docs/examples/button/icon.vue | 28 +- .../docs/examples/button/loading.vue | 30 + .../g3soft-libs/docs/examples/button/size.vue | 11 +- .../docs/examples/button/state.vue | 20 - .../g3soft-libs/docs/examples/button/type.vue | 11 - .../docs/examples/button/variant.vue | 16 + .../docs/examples/checkbox/basic.vue | 14 + .../docs/examples/checkbox/disabled.vue | 12 + .../docs/examples/checkbox/indeterminate.vue | 55 + .../docs/examples/checkbox/rich-label.vue | 20 + .../docs/examples/date/date-basic.vue | 14 + .../docs/examples/date/date-disabled.vue | 36 + .../docs/examples/date/date-format.vue | 31 + .../docs/examples/date/manual-input.vue | 19 + .../docs/examples/date/range-basic.vue | 21 + .../docs/examples/date/time-select.vue | 28 + .../docs/examples/drawer/basic.vue | 18 + .../docs/examples/drawer/footer.vue | 32 + .../docs/examples/drawer/placement.vue | 25 + .../g3soft-libs/docs/examples/drawer/size.vue | 30 + .../docs/examples/dropdown/basic.vue | 21 + .../docs/examples/dropdown/declarative.vue | 19 + .../docs/examples/dropdown/header-slot.vue | 56 + .../docs/examples/dropdown/item-types.vue | 33 + .../docs/examples/dropdown/keyboard.vue | 27 + .../docs/examples/dropdown/trigger.vue | 23 + code/g3soft-libs/docs/examples/form/basic.vue | 26 + code/g3soft-libs/docs/examples/form/grid.vue | 46 + code/g3soft-libs/docs/examples/form/group.vue | 33 + .../g3soft-libs/docs/examples/form/layout.vue | 37 + code/g3soft-libs/docs/examples/form/rules.vue | 61 + .../g3soft-libs/docs/examples/form/submit.vue | 47 + .../docs/examples/form/validate-trigger.vue | 38 + code/g3soft-libs/docs/examples/grid/align.vue | 32 + code/g3soft-libs/docs/examples/grid/basic.vue | 25 + code/g3soft-libs/docs/examples/grid/flex.vue | 29 + .../g3soft-libs/docs/examples/grid/gutter.vue | 33 + .../docs/examples/grid/no-wrap.vue | 24 + .../g3soft-libs/docs/examples/grid/offset.vue | 33 + .../g3soft-libs/docs/examples/input/basic.vue | 14 + .../docs/examples/input/clearable.vue | 18 + .../docs/examples/input/methods.vue | 22 + .../docs/examples/input/number.vue | 16 + .../docs/examples/input/password.vue | 13 + .../g3soft-libs/docs/examples/input/slots.vue | 25 + .../docs/examples/input/status.vue | 16 + .../docs/examples/input/textarea.vue | 22 + .../docs/examples/layout/basic.vue | 163 +++ .../docs/examples/message/basic.vue | 13 + .../docs/examples/message/options.vue | 23 + .../docs/examples/message/placement.vue | 27 + .../g3soft-libs/docs/examples/modal/basic.vue | 32 + .../docs/examples/modal/confirm-async.vue | 35 + .../docs/examples/modal/confirm.vue | 34 + .../docs/examples/modal/footer-slot.vue | 33 + code/g3soft-libs/docs/examples/modal/form.vue | 44 + code/g3soft-libs/docs/examples/modal/mask.vue | 37 + .../docs/examples/modal/resize.vue | 29 + .../docs/examples/notification/basic.vue | 26 + .../docs/examples/notification/close.vue | 23 + .../docs/examples/notification/placement.vue | 20 + .../docs/examples/pagination/basic.vue | 14 + .../examples/pagination/hide-on-single.vue | 26 + .../docs/examples/pagination/quick-jumper.vue | 14 + .../docs/examples/pagination/size-changer.vue | 25 + .../docs/examples/pagination/total.vue | 20 + .../docs/examples/popover/arrow-width.vue | 24 + .../docs/examples/popover/basic.vue | 17 + .../docs/examples/popover/controlled.vue | 26 + .../docs/examples/popover/placement.vue | 21 + .../docs/examples/popover/trigger.vue | 40 + .../g3soft-libs/docs/examples/radio/basic.vue | 18 + .../g3soft-libs/docs/examples/radio/cards.vue | 31 + .../docs/examples/radio/vertical.vue | 24 + .../docs/examples/scrollbar/autohide.vue | 23 + .../docs/examples/scrollbar/basic.vue | 12 + .../docs/examples/segmented/basic.vue | 14 + .../docs/examples/segmented/block.vue | 20 + .../docs/examples/segmented/custom-label.vue | 33 + .../docs/examples/segmented/options.vue | 19 + .../docs/examples/segmented/shape.vue | 15 + .../docs/examples/segmented/uncontrolled.vue | 18 + .../docs/examples/segmented/vertical.vue | 19 + .../docs/examples/select/basic.vue | 20 + .../docs/examples/select/custom-option.vue | 43 + .../docs/examples/select/field-names.vue | 26 + .../docs/examples/select/filterable.vue | 38 + .../docs/examples/select/load-more.vue | 47 + .../docs/examples/select/multiple.vue | 21 + .../docs/examples/select/remote.vue | 40 + .../g3soft-libs/docs/examples/space/basic.vue | 12 + .../docs/examples/space/empty-children.vue | 19 + .../docs/examples/space/separator.vue | 16 + code/g3soft-libs/docs/examples/space/size.vue | 29 + .../docs/examples/space/vertical.vue | 12 + code/g3soft-libs/docs/examples/space/wrap.vue | 14 + code/g3soft-libs/docs/examples/spin/basic.vue | 25 + code/g3soft-libs/docs/examples/spin/delay.vue | 40 + .../docs/examples/spin/standalone.vue | 12 + .../docs/examples/splitter/basic.vue | 34 + .../docs/examples/splitter/constraints.vue | 33 + .../docs/examples/splitter/nested.vue | 30 + .../docs/examples/splitter/vertical.vue | 34 + .../docs/examples/switch/basic.vue | 14 + .../docs/examples/switch/disabled.vue | 12 + .../docs/examples/switch/in-form.vue | 25 + code/g3soft-libs/docs/examples/tabs/basic.vue | 15 + code/g3soft-libs/docs/examples/tabs/items.vue | 17 + .../docs/examples/tabs/nav-only.vue | 33 + .../docs/examples/tabs/placement.vue | 15 + code/g3soft-libs/docs/examples/tabs/type.vue | 21 + .../docs/examples/tag/closable.vue | 22 + code/g3soft-libs/docs/examples/tag/icon.vue | 25 + code/g3soft-libs/docs/examples/tag/link.vue | 11 + .../docs/examples/tag/prevent-close.vue | 20 + .../g3soft-libs/docs/examples/tag/variant.vue | 15 + .../docs/examples/tooltip/basic.vue | 10 + .../docs/examples/tooltip/disabled.vue | 26 + .../docs/examples/tooltip/placement.vue | 14 + .../docs/examples/tooltip/rich.vue | 20 + code/g3soft-libs/docs/examples/tree/basic.vue | 27 + .../docs/examples/tree/checkable.vue | 36 + .../docs/examples/tree/context-menu.vue | 44 + .../g3soft-libs/docs/examples/tree/custom.vue | 53 + .../docs/examples/tree/draggable.vue | 73 ++ .../g3soft-libs/docs/examples/tree/expand.vue | 40 + .../g3soft-libs/docs/examples/tree/filter.vue | 35 + code/g3soft-libs/docs/examples/tree/lazy.vue | 30 + code/g3soft-libs/docs/nuxt.config.ts | 7 + code/g3soft-libs/package.json | 10 +- code/g3soft-libs/packages/framework/README.md | 83 ++ .../packages/framework/package.json | 47 + .../framework/src/core/_utils/deep-merge.ts | 38 + .../packages/framework/src/core/index.ts | 75 ++ .../packages/framework/src/core/install.ts | 39 + .../framework/src/core/layout/G3Layout.vue | 312 +++++ .../src/core/layout/G3LayoutBreadcrumb.vue | 69 ++ .../src/core/layout/G3LayoutHeader.vue | 135 +++ .../src/core/layout/G3LayoutLogo.vue | 66 ++ .../src/core/layout/G3LayoutMenu.vue | 241 ++++ .../src/core/layout/G3LayoutSidebar.vue | 357 ++++++ .../src/core/layout/G3LayoutTabbar.vue | 151 +++ .../framework/src/core/layout/context.ts | 32 + .../framework/src/core/layout/index.ts | 13 + .../framework/src/core/layout/modes.ts | 96 ++ .../framework/src/core/preferences/apply.ts | 52 + .../src/core/preferences/defaults.ts | 104 ++ .../framework/src/core/preferences/index.ts | 4 + .../framework/src/core/preferences/store.ts | 185 +++ .../framework/src/core/types/layout.ts | 171 +++ .../framework/src/core/types/preferences.ts | 212 ++++ .../framework/src/core/types/slots.ts | 44 + .../packages/framework/src/index.ts | 3 + .../packages/framework/tsconfig.json | 18 + .../packages/framework/vite.config.ts | 40 + .../packages/tokens/src/scss/theme.scss | 35 + code/g3soft-libs/packages/ui/e2e/data.spec.ts | 171 +++ .../packages/ui/e2e/drawer.spec.ts | 131 +++ .../packages/ui/e2e/feedback.spec.ts | 138 +++ code/g3soft-libs/packages/ui/e2e/form.spec.ts | 113 ++ .../g3soft-libs/packages/ui/e2e/layer.spec.ts | 121 ++ .../packages/ui/e2e/select.spec.ts | 81 ++ .../packages/ui/e2e/ui-regressions.spec.ts | 224 ++++ code/g3soft-libs/packages/ui/package.json | 17 +- .../packages/ui/playground/index.html | 53 + .../packages/ui/playground/main.ts | 420 +++++++ .../packages/ui/playground/vite.config.ts | 45 + .../packages/ui/playwright.config.ts | 41 + .../src/_composables/useComponentDefaults.ts | 34 + .../ui/src/_composables/useFloating.ts | 162 +++ .../ui/src/_composables/usePopupContainer.ts | 35 + .../src/_composables/useUnwrappedTrigger.ts | 108 ++ .../packages/ui/src/_utils/drag.ts | 207 ++++ .../packages/ui/src/_utils/focus.ts | 50 + .../packages/ui/src/_utils/global-config.ts | 2 + .../packages/ui/src/_utils/position.test.ts | 158 +++ .../packages/ui/src/_utils/position.ts | 173 +++ .../packages/ui/src/_utils/scroll.ts | 43 + .../packages/ui/src/_utils/z-index.test.ts | 68 ++ .../packages/ui/src/_utils/z-index.ts | 89 +- .../ui/src/button-group/ButtonGroup.vue | 91 ++ .../src/button-group/ButtonGroupSeparator.vue | 41 + .../packages/ui/src/button-group/index.ts | 7 + .../packages/ui/src/button-group/types.ts | 12 + .../packages/ui/src/button/Button.vue | 275 +++-- .../packages/ui/src/button/types.ts | 15 +- .../packages/ui/src/checkbox/Checkbox.vue | 158 +++ .../packages/ui/src/checkbox/index.ts | 2 + .../packages/ui/src/checkbox/types.ts | 12 + .../packages/ui/src/date/CalendarPanel.vue | 825 ++++++++++++++ .../packages/ui/src/date/DatePicker.vue | 350 ++++++ .../packages/ui/src/date/RangePicker.vue | 372 ++++++ .../packages/ui/src/date/TimeSelect.vue | 242 ++++ .../packages/ui/src/date/date-utils.test.ts | 344 ++++++ .../packages/ui/src/date/date-utils.ts | 764 +++++++++++++ .../g3soft-libs/packages/ui/src/date/index.ts | 46 + .../g3soft-libs/packages/ui/src/date/types.ts | 77 ++ .../packages/ui/src/drawer/Drawer.vue | 520 +++++++++ .../packages/ui/src/drawer/index.ts | 2 + .../packages/ui/src/drawer/types.ts | 31 + .../packages/ui/src/dropdown/Dropdown.test.ts | 219 ++++ .../packages/ui/src/dropdown/Dropdown.vue | 332 ++++++ .../packages/ui/src/dropdown/DropdownItem.vue | 39 + .../packages/ui/src/dropdown/DropdownMenu.vue | 116 ++ .../packages/ui/src/dropdown/context.ts | 12 + .../packages/ui/src/dropdown/index.ts | 8 + .../packages/ui/src/dropdown/types.ts | 58 + .../g3soft-libs/packages/ui/src/form/Form.vue | 169 +++ .../packages/ui/src/form/FormGroup.vue | 184 +++ .../packages/ui/src/form/FormItem.test.ts | 158 +++ .../packages/ui/src/form/FormItem.vue | 304 +++++ .../packages/ui/src/form/context.ts | 37 + .../packages/ui/src/form/form-utils.test.ts | 31 + .../packages/ui/src/form/form-utils.ts | 26 + .../g3soft-libs/packages/ui/src/form/index.ts | 19 + .../g3soft-libs/packages/ui/src/form/types.ts | 123 ++ .../packages/ui/src/form/validate.test.ts | 119 ++ .../packages/ui/src/form/validate.ts | 152 +++ code/g3soft-libs/packages/ui/src/grid/Col.vue | 48 + code/g3soft-libs/packages/ui/src/grid/Row.vue | 174 +++ .../g3soft-libs/packages/ui/src/grid/index.ts | 3 + .../g3soft-libs/packages/ui/src/grid/types.ts | 40 + code/g3soft-libs/packages/ui/src/index.ts | 136 ++- .../packages/ui/src/input/Input.test.ts | 126 +++ .../packages/ui/src/input/Input.vue | 583 ++++++++++ .../packages/ui/src/input/index.ts | 2 + .../packages/ui/src/input/types.ts | 38 + .../packages/ui/src/locale/index.ts | 158 ++- .../packages/ui/src/message/Message.vue | 141 +++ .../ui/src/message/MessageContainer.test.ts | 81 ++ .../ui/src/message/MessageContainer.vue | 155 +++ .../packages/ui/src/message/index.ts | 12 + .../packages/ui/src/message/manager.ts | 85 ++ .../packages/ui/src/message/store.ts | 15 + .../packages/ui/src/message/types.ts | 51 + .../packages/ui/src/modal/Modal.vue | 539 +++++++++ .../packages/ui/src/modal/ModalConfirm.vue | 93 ++ .../packages/ui/src/modal/confirm.ts | 39 + .../packages/ui/src/modal/index.ts | 8 + .../packages/ui/src/modal/types.ts | 61 + .../ui/src/notification/Notification.vue | 157 +++ .../notification/NotificationContainer.vue | 131 +++ .../packages/ui/src/notification/index.ts | 12 + .../packages/ui/src/notification/manager.ts | 85 ++ .../packages/ui/src/notification/store.ts | 15 + .../packages/ui/src/notification/types.ts | 47 + .../packages/ui/src/pagination/Pagination.vue | 364 ++++++ .../packages/ui/src/pagination/index.ts | 2 + .../packages/ui/src/pagination/types.ts | 29 + .../packages/ui/src/popover/Popover.vue | 401 +++++++ .../packages/ui/src/popover/index.ts | 2 + .../packages/ui/src/popover/types.ts | 34 + .../packages/ui/src/radio/Radio.vue | 135 +++ .../packages/ui/src/radio/RadioGroup.vue | 61 + .../packages/ui/src/radio/context.ts | 18 + .../packages/ui/src/radio/index.ts | 5 + .../packages/ui/src/radio/types.ts | 17 + .../packages/ui/src/scrollbar/Scrollbar.vue | 329 ++++++ .../packages/ui/src/scrollbar/index.ts | 2 + .../packages/ui/src/scrollbar/types.ts | 16 + .../packages/ui/src/segmented/Segmented.vue | 330 ++++++ .../packages/ui/src/segmented/index.ts | 8 + .../packages/ui/src/segmented/types.ts | 39 + .../packages/ui/src/select/Select.vue | 788 +++++++++++++ .../packages/ui/src/select/index.ts | 2 + .../packages/ui/src/select/types.ts | 31 + .../packages/ui/src/space/Space.vue | 151 +++ .../packages/ui/src/space/index.ts | 2 + .../packages/ui/src/space/types.ts | 21 + .../g3soft-libs/packages/ui/src/spin/Spin.vue | 165 +++ .../g3soft-libs/packages/ui/src/spin/index.ts | 2 + .../g3soft-libs/packages/ui/src/spin/types.ts | 8 + .../packages/ui/src/splitter/Panel.vue | 48 + .../packages/ui/src/splitter/Splitter.vue | 409 +++++++ .../packages/ui/src/splitter/index.ts | 3 + .../packages/ui/src/splitter/types.ts | 25 + .../packages/ui/src/switch/Switch.vue | 130 +++ .../packages/ui/src/switch/index.ts | 2 + .../packages/ui/src/switch/types.ts | 6 + .../packages/ui/src/tabs/TabPane.vue | 17 + .../packages/ui/src/tabs/Tabs.test.ts | 114 ++ .../g3soft-libs/packages/ui/src/tabs/Tabs.vue | 464 ++++++++ .../g3soft-libs/packages/ui/src/tabs/index.ts | 3 + .../g3soft-libs/packages/ui/src/tabs/types.ts | 48 + code/g3soft-libs/packages/ui/src/tag/Tag.vue | 165 +++ code/g3soft-libs/packages/ui/src/tag/index.ts | 2 + code/g3soft-libs/packages/ui/src/tag/types.ts | 13 + .../packages/ui/src/tooltip/Tooltip.vue | 69 ++ .../packages/ui/src/tooltip/index.ts | 2 + .../packages/ui/src/tooltip/types.ts | 20 + .../g3soft-libs/packages/ui/src/tree/Tree.vue | 812 +++++++++++++ .../packages/ui/src/tree/TreeNode.vue | 422 +++++++ .../packages/ui/src/tree/context.ts | 5 + .../g3soft-libs/packages/ui/src/tree/index.ts | 24 + .../g3soft-libs/packages/ui/src/tree/types.ts | 156 +++ .../packages/ui/src/tree/utils.test.ts | 173 +++ .../g3soft-libs/packages/ui/src/tree/utils.ts | 216 ++++ code/g3soft-libs/packages/ui/tests/setup.ts | 41 + code/g3soft-libs/packages/ui/vite.config.ts | 3 +- code/g3soft-libs/packages/ui/vitest.config.ts | 51 + code/g3soft-libs/pnpm-lock.yaml | 1002 +++++++++-------- code/g3soft-libs/pnpm-workspace.yaml | 2 +- code/g3soft-libs/scripts/gen-api.mjs | 95 -- code/g3soft-libs/sel.yaml | 2 + 356 files changed, 28877 insertions(+), 1055 deletions(-) create mode 100644 code/g3soft-libs/.codebuddy/plans/g3-ui-重写-参照fms-vue_084cfb52.md delete mode 100644 code/g3soft-libs/docs/app/components/content/ApiTable.vue create mode 100644 code/g3soft-libs/docs/content/framework/.navigation.yml create mode 100644 code/g3soft-libs/docs/content/framework/1.layout/.navigation.yml create mode 100644 code/g3soft-libs/docs/content/framework/1.layout/index.md create mode 100644 code/g3soft-libs/docs/content/ui/2.general/button-group.md create mode 100644 code/g3soft-libs/docs/content/ui/2.general/grid.md create mode 100644 code/g3soft-libs/docs/content/ui/2.general/segmented.md create mode 100644 code/g3soft-libs/docs/content/ui/2.general/space.md create mode 100644 code/g3soft-libs/docs/content/ui/2.general/tag.md create mode 100644 code/g3soft-libs/docs/content/ui/3.form/.navigation.yml create mode 100644 code/g3soft-libs/docs/content/ui/3.form/checkbox.md create mode 100644 code/g3soft-libs/docs/content/ui/3.form/form.md create mode 100644 code/g3soft-libs/docs/content/ui/3.form/input.md create mode 100644 code/g3soft-libs/docs/content/ui/3.form/radio.md create mode 100644 code/g3soft-libs/docs/content/ui/3.form/select.md create mode 100644 code/g3soft-libs/docs/content/ui/3.form/switch.md create mode 100644 code/g3soft-libs/docs/content/ui/4.overlay/.navigation.yml create mode 100644 code/g3soft-libs/docs/content/ui/4.overlay/drawer.md create mode 100644 code/g3soft-libs/docs/content/ui/4.overlay/dropdown.md create mode 100644 code/g3soft-libs/docs/content/ui/4.overlay/modal.md create mode 100644 code/g3soft-libs/docs/content/ui/4.overlay/popover.md create mode 100644 code/g3soft-libs/docs/content/ui/4.overlay/tooltip.md create mode 100644 code/g3soft-libs/docs/content/ui/5.feedback/.navigation.yml create mode 100644 code/g3soft-libs/docs/content/ui/5.feedback/message.md create mode 100644 code/g3soft-libs/docs/content/ui/5.feedback/notification.md create mode 100644 code/g3soft-libs/docs/content/ui/5.feedback/scrollbar.md create mode 100644 code/g3soft-libs/docs/content/ui/5.feedback/spin.md create mode 100644 code/g3soft-libs/docs/content/ui/6.data/.navigation.yml create mode 100644 code/g3soft-libs/docs/content/ui/6.data/date.md create mode 100644 code/g3soft-libs/docs/content/ui/6.data/pagination.md create mode 100644 code/g3soft-libs/docs/content/ui/6.data/splitter.md create mode 100644 code/g3soft-libs/docs/content/ui/6.data/tabs.md create mode 100644 code/g3soft-libs/docs/content/ui/6.data/tree.md delete mode 100644 code/g3soft-libs/docs/data/api/button.json delete mode 100644 code/g3soft-libs/docs/data/api/config-provider.json create mode 100644 code/g3soft-libs/docs/examples/button-group/basic.vue create mode 100644 code/g3soft-libs/docs/examples/button-group/variant.vue create mode 100644 code/g3soft-libs/docs/examples/button-group/vertical.vue create mode 100644 code/g3soft-libs/docs/examples/button/disabled.vue create mode 100644 code/g3soft-libs/docs/examples/button/event.vue create mode 100644 code/g3soft-libs/docs/examples/button/global-defaults.vue create mode 100644 code/g3soft-libs/docs/examples/button/html-type.vue create mode 100644 code/g3soft-libs/docs/examples/button/loading.vue delete mode 100644 code/g3soft-libs/docs/examples/button/state.vue delete mode 100644 code/g3soft-libs/docs/examples/button/type.vue create mode 100644 code/g3soft-libs/docs/examples/button/variant.vue create mode 100644 code/g3soft-libs/docs/examples/checkbox/basic.vue create mode 100644 code/g3soft-libs/docs/examples/checkbox/disabled.vue create mode 100644 code/g3soft-libs/docs/examples/checkbox/indeterminate.vue create mode 100644 code/g3soft-libs/docs/examples/checkbox/rich-label.vue create mode 100644 code/g3soft-libs/docs/examples/date/date-basic.vue create mode 100644 code/g3soft-libs/docs/examples/date/date-disabled.vue create mode 100644 code/g3soft-libs/docs/examples/date/date-format.vue create mode 100644 code/g3soft-libs/docs/examples/date/manual-input.vue create mode 100644 code/g3soft-libs/docs/examples/date/range-basic.vue create mode 100644 code/g3soft-libs/docs/examples/date/time-select.vue create mode 100644 code/g3soft-libs/docs/examples/drawer/basic.vue create mode 100644 code/g3soft-libs/docs/examples/drawer/footer.vue create mode 100644 code/g3soft-libs/docs/examples/drawer/placement.vue create mode 100644 code/g3soft-libs/docs/examples/drawer/size.vue create mode 100644 code/g3soft-libs/docs/examples/dropdown/basic.vue create mode 100644 code/g3soft-libs/docs/examples/dropdown/declarative.vue create mode 100644 code/g3soft-libs/docs/examples/dropdown/header-slot.vue create mode 100644 code/g3soft-libs/docs/examples/dropdown/item-types.vue create mode 100644 code/g3soft-libs/docs/examples/dropdown/keyboard.vue create mode 100644 code/g3soft-libs/docs/examples/dropdown/trigger.vue create mode 100644 code/g3soft-libs/docs/examples/form/basic.vue create mode 100644 code/g3soft-libs/docs/examples/form/grid.vue create mode 100644 code/g3soft-libs/docs/examples/form/group.vue create mode 100644 code/g3soft-libs/docs/examples/form/layout.vue create mode 100644 code/g3soft-libs/docs/examples/form/rules.vue create mode 100644 code/g3soft-libs/docs/examples/form/submit.vue create mode 100644 code/g3soft-libs/docs/examples/form/validate-trigger.vue create mode 100644 code/g3soft-libs/docs/examples/grid/align.vue create mode 100644 code/g3soft-libs/docs/examples/grid/basic.vue create mode 100644 code/g3soft-libs/docs/examples/grid/flex.vue create mode 100644 code/g3soft-libs/docs/examples/grid/gutter.vue create mode 100644 code/g3soft-libs/docs/examples/grid/no-wrap.vue create mode 100644 code/g3soft-libs/docs/examples/grid/offset.vue create mode 100644 code/g3soft-libs/docs/examples/input/basic.vue create mode 100644 code/g3soft-libs/docs/examples/input/clearable.vue create mode 100644 code/g3soft-libs/docs/examples/input/methods.vue create mode 100644 code/g3soft-libs/docs/examples/input/number.vue create mode 100644 code/g3soft-libs/docs/examples/input/password.vue create mode 100644 code/g3soft-libs/docs/examples/input/slots.vue create mode 100644 code/g3soft-libs/docs/examples/input/status.vue create mode 100644 code/g3soft-libs/docs/examples/input/textarea.vue create mode 100644 code/g3soft-libs/docs/examples/layout/basic.vue create mode 100644 code/g3soft-libs/docs/examples/message/basic.vue create mode 100644 code/g3soft-libs/docs/examples/message/options.vue create mode 100644 code/g3soft-libs/docs/examples/message/placement.vue create mode 100644 code/g3soft-libs/docs/examples/modal/basic.vue create mode 100644 code/g3soft-libs/docs/examples/modal/confirm-async.vue create mode 100644 code/g3soft-libs/docs/examples/modal/confirm.vue create mode 100644 code/g3soft-libs/docs/examples/modal/footer-slot.vue create mode 100644 code/g3soft-libs/docs/examples/modal/form.vue create mode 100644 code/g3soft-libs/docs/examples/modal/mask.vue create mode 100644 code/g3soft-libs/docs/examples/modal/resize.vue create mode 100644 code/g3soft-libs/docs/examples/notification/basic.vue create mode 100644 code/g3soft-libs/docs/examples/notification/close.vue create mode 100644 code/g3soft-libs/docs/examples/notification/placement.vue create mode 100644 code/g3soft-libs/docs/examples/pagination/basic.vue create mode 100644 code/g3soft-libs/docs/examples/pagination/hide-on-single.vue create mode 100644 code/g3soft-libs/docs/examples/pagination/quick-jumper.vue create mode 100644 code/g3soft-libs/docs/examples/pagination/size-changer.vue create mode 100644 code/g3soft-libs/docs/examples/pagination/total.vue create mode 100644 code/g3soft-libs/docs/examples/popover/arrow-width.vue create mode 100644 code/g3soft-libs/docs/examples/popover/basic.vue create mode 100644 code/g3soft-libs/docs/examples/popover/controlled.vue create mode 100644 code/g3soft-libs/docs/examples/popover/placement.vue create mode 100644 code/g3soft-libs/docs/examples/popover/trigger.vue create mode 100644 code/g3soft-libs/docs/examples/radio/basic.vue create mode 100644 code/g3soft-libs/docs/examples/radio/cards.vue create mode 100644 code/g3soft-libs/docs/examples/radio/vertical.vue create mode 100644 code/g3soft-libs/docs/examples/scrollbar/autohide.vue create mode 100644 code/g3soft-libs/docs/examples/scrollbar/basic.vue create mode 100644 code/g3soft-libs/docs/examples/segmented/basic.vue create mode 100644 code/g3soft-libs/docs/examples/segmented/block.vue create mode 100644 code/g3soft-libs/docs/examples/segmented/custom-label.vue create mode 100644 code/g3soft-libs/docs/examples/segmented/options.vue create mode 100644 code/g3soft-libs/docs/examples/segmented/shape.vue create mode 100644 code/g3soft-libs/docs/examples/segmented/uncontrolled.vue create mode 100644 code/g3soft-libs/docs/examples/segmented/vertical.vue create mode 100644 code/g3soft-libs/docs/examples/select/basic.vue create mode 100644 code/g3soft-libs/docs/examples/select/custom-option.vue create mode 100644 code/g3soft-libs/docs/examples/select/field-names.vue create mode 100644 code/g3soft-libs/docs/examples/select/filterable.vue create mode 100644 code/g3soft-libs/docs/examples/select/load-more.vue create mode 100644 code/g3soft-libs/docs/examples/select/multiple.vue create mode 100644 code/g3soft-libs/docs/examples/select/remote.vue create mode 100644 code/g3soft-libs/docs/examples/space/basic.vue create mode 100644 code/g3soft-libs/docs/examples/space/empty-children.vue create mode 100644 code/g3soft-libs/docs/examples/space/separator.vue create mode 100644 code/g3soft-libs/docs/examples/space/size.vue create mode 100644 code/g3soft-libs/docs/examples/space/vertical.vue create mode 100644 code/g3soft-libs/docs/examples/space/wrap.vue create mode 100644 code/g3soft-libs/docs/examples/spin/basic.vue create mode 100644 code/g3soft-libs/docs/examples/spin/delay.vue create mode 100644 code/g3soft-libs/docs/examples/spin/standalone.vue create mode 100644 code/g3soft-libs/docs/examples/splitter/basic.vue create mode 100644 code/g3soft-libs/docs/examples/splitter/constraints.vue create mode 100644 code/g3soft-libs/docs/examples/splitter/nested.vue create mode 100644 code/g3soft-libs/docs/examples/splitter/vertical.vue create mode 100644 code/g3soft-libs/docs/examples/switch/basic.vue create mode 100644 code/g3soft-libs/docs/examples/switch/disabled.vue create mode 100644 code/g3soft-libs/docs/examples/switch/in-form.vue create mode 100644 code/g3soft-libs/docs/examples/tabs/basic.vue create mode 100644 code/g3soft-libs/docs/examples/tabs/items.vue create mode 100644 code/g3soft-libs/docs/examples/tabs/nav-only.vue create mode 100644 code/g3soft-libs/docs/examples/tabs/placement.vue create mode 100644 code/g3soft-libs/docs/examples/tabs/type.vue create mode 100644 code/g3soft-libs/docs/examples/tag/closable.vue create mode 100644 code/g3soft-libs/docs/examples/tag/icon.vue create mode 100644 code/g3soft-libs/docs/examples/tag/link.vue create mode 100644 code/g3soft-libs/docs/examples/tag/prevent-close.vue create mode 100644 code/g3soft-libs/docs/examples/tag/variant.vue create mode 100644 code/g3soft-libs/docs/examples/tooltip/basic.vue create mode 100644 code/g3soft-libs/docs/examples/tooltip/disabled.vue create mode 100644 code/g3soft-libs/docs/examples/tooltip/placement.vue create mode 100644 code/g3soft-libs/docs/examples/tooltip/rich.vue create mode 100644 code/g3soft-libs/docs/examples/tree/basic.vue create mode 100644 code/g3soft-libs/docs/examples/tree/checkable.vue create mode 100644 code/g3soft-libs/docs/examples/tree/context-menu.vue create mode 100644 code/g3soft-libs/docs/examples/tree/custom.vue create mode 100644 code/g3soft-libs/docs/examples/tree/draggable.vue create mode 100644 code/g3soft-libs/docs/examples/tree/expand.vue create mode 100644 code/g3soft-libs/docs/examples/tree/filter.vue create mode 100644 code/g3soft-libs/docs/examples/tree/lazy.vue create mode 100644 code/g3soft-libs/packages/framework/README.md create mode 100644 code/g3soft-libs/packages/framework/package.json create mode 100644 code/g3soft-libs/packages/framework/src/core/_utils/deep-merge.ts create mode 100644 code/g3soft-libs/packages/framework/src/core/index.ts create mode 100644 code/g3soft-libs/packages/framework/src/core/install.ts create mode 100644 code/g3soft-libs/packages/framework/src/core/layout/G3Layout.vue create mode 100644 code/g3soft-libs/packages/framework/src/core/layout/G3LayoutBreadcrumb.vue create mode 100644 code/g3soft-libs/packages/framework/src/core/layout/G3LayoutHeader.vue create mode 100644 code/g3soft-libs/packages/framework/src/core/layout/G3LayoutLogo.vue create mode 100644 code/g3soft-libs/packages/framework/src/core/layout/G3LayoutMenu.vue create mode 100644 code/g3soft-libs/packages/framework/src/core/layout/G3LayoutSidebar.vue create mode 100644 code/g3soft-libs/packages/framework/src/core/layout/G3LayoutTabbar.vue create mode 100644 code/g3soft-libs/packages/framework/src/core/layout/context.ts create mode 100644 code/g3soft-libs/packages/framework/src/core/layout/index.ts create mode 100644 code/g3soft-libs/packages/framework/src/core/layout/modes.ts create mode 100644 code/g3soft-libs/packages/framework/src/core/preferences/apply.ts create mode 100644 code/g3soft-libs/packages/framework/src/core/preferences/defaults.ts create mode 100644 code/g3soft-libs/packages/framework/src/core/preferences/index.ts create mode 100644 code/g3soft-libs/packages/framework/src/core/preferences/store.ts create mode 100644 code/g3soft-libs/packages/framework/src/core/types/layout.ts create mode 100644 code/g3soft-libs/packages/framework/src/core/types/preferences.ts create mode 100644 code/g3soft-libs/packages/framework/src/core/types/slots.ts create mode 100644 code/g3soft-libs/packages/framework/src/index.ts create mode 100644 code/g3soft-libs/packages/framework/tsconfig.json create mode 100644 code/g3soft-libs/packages/framework/vite.config.ts create mode 100644 code/g3soft-libs/packages/ui/e2e/data.spec.ts create mode 100644 code/g3soft-libs/packages/ui/e2e/drawer.spec.ts create mode 100644 code/g3soft-libs/packages/ui/e2e/feedback.spec.ts create mode 100644 code/g3soft-libs/packages/ui/e2e/form.spec.ts create mode 100644 code/g3soft-libs/packages/ui/e2e/layer.spec.ts create mode 100644 code/g3soft-libs/packages/ui/e2e/select.spec.ts create mode 100644 code/g3soft-libs/packages/ui/e2e/ui-regressions.spec.ts create mode 100644 code/g3soft-libs/packages/ui/playground/index.html create mode 100644 code/g3soft-libs/packages/ui/playground/main.ts create mode 100644 code/g3soft-libs/packages/ui/playground/vite.config.ts create mode 100644 code/g3soft-libs/packages/ui/playwright.config.ts create mode 100644 code/g3soft-libs/packages/ui/src/_composables/useComponentDefaults.ts create mode 100644 code/g3soft-libs/packages/ui/src/_composables/useFloating.ts create mode 100644 code/g3soft-libs/packages/ui/src/_composables/usePopupContainer.ts create mode 100644 code/g3soft-libs/packages/ui/src/_composables/useUnwrappedTrigger.ts create mode 100644 code/g3soft-libs/packages/ui/src/_utils/drag.ts create mode 100644 code/g3soft-libs/packages/ui/src/_utils/focus.ts create mode 100644 code/g3soft-libs/packages/ui/src/_utils/position.test.ts create mode 100644 code/g3soft-libs/packages/ui/src/_utils/position.ts create mode 100644 code/g3soft-libs/packages/ui/src/_utils/scroll.ts create mode 100644 code/g3soft-libs/packages/ui/src/_utils/z-index.test.ts create mode 100644 code/g3soft-libs/packages/ui/src/button-group/ButtonGroup.vue create mode 100644 code/g3soft-libs/packages/ui/src/button-group/ButtonGroupSeparator.vue create mode 100644 code/g3soft-libs/packages/ui/src/button-group/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/button-group/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/checkbox/Checkbox.vue create mode 100644 code/g3soft-libs/packages/ui/src/checkbox/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/checkbox/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/date/CalendarPanel.vue create mode 100644 code/g3soft-libs/packages/ui/src/date/DatePicker.vue create mode 100644 code/g3soft-libs/packages/ui/src/date/RangePicker.vue create mode 100644 code/g3soft-libs/packages/ui/src/date/TimeSelect.vue create mode 100644 code/g3soft-libs/packages/ui/src/date/date-utils.test.ts create mode 100644 code/g3soft-libs/packages/ui/src/date/date-utils.ts create mode 100644 code/g3soft-libs/packages/ui/src/date/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/date/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/drawer/Drawer.vue create mode 100644 code/g3soft-libs/packages/ui/src/drawer/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/drawer/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/dropdown/Dropdown.test.ts create mode 100644 code/g3soft-libs/packages/ui/src/dropdown/Dropdown.vue create mode 100644 code/g3soft-libs/packages/ui/src/dropdown/DropdownItem.vue create mode 100644 code/g3soft-libs/packages/ui/src/dropdown/DropdownMenu.vue create mode 100644 code/g3soft-libs/packages/ui/src/dropdown/context.ts create mode 100644 code/g3soft-libs/packages/ui/src/dropdown/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/dropdown/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/form/Form.vue create mode 100644 code/g3soft-libs/packages/ui/src/form/FormGroup.vue create mode 100644 code/g3soft-libs/packages/ui/src/form/FormItem.test.ts create mode 100644 code/g3soft-libs/packages/ui/src/form/FormItem.vue create mode 100644 code/g3soft-libs/packages/ui/src/form/context.ts create mode 100644 code/g3soft-libs/packages/ui/src/form/form-utils.test.ts create mode 100644 code/g3soft-libs/packages/ui/src/form/form-utils.ts create mode 100644 code/g3soft-libs/packages/ui/src/form/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/form/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/form/validate.test.ts create mode 100644 code/g3soft-libs/packages/ui/src/form/validate.ts create mode 100644 code/g3soft-libs/packages/ui/src/grid/Col.vue create mode 100644 code/g3soft-libs/packages/ui/src/grid/Row.vue create mode 100644 code/g3soft-libs/packages/ui/src/grid/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/grid/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/input/Input.test.ts create mode 100644 code/g3soft-libs/packages/ui/src/input/Input.vue create mode 100644 code/g3soft-libs/packages/ui/src/input/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/input/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/message/Message.vue create mode 100644 code/g3soft-libs/packages/ui/src/message/MessageContainer.test.ts create mode 100644 code/g3soft-libs/packages/ui/src/message/MessageContainer.vue create mode 100644 code/g3soft-libs/packages/ui/src/message/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/message/manager.ts create mode 100644 code/g3soft-libs/packages/ui/src/message/store.ts create mode 100644 code/g3soft-libs/packages/ui/src/message/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/modal/Modal.vue create mode 100644 code/g3soft-libs/packages/ui/src/modal/ModalConfirm.vue create mode 100644 code/g3soft-libs/packages/ui/src/modal/confirm.ts create mode 100644 code/g3soft-libs/packages/ui/src/modal/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/modal/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/notification/Notification.vue create mode 100644 code/g3soft-libs/packages/ui/src/notification/NotificationContainer.vue create mode 100644 code/g3soft-libs/packages/ui/src/notification/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/notification/manager.ts create mode 100644 code/g3soft-libs/packages/ui/src/notification/store.ts create mode 100644 code/g3soft-libs/packages/ui/src/notification/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/pagination/Pagination.vue create mode 100644 code/g3soft-libs/packages/ui/src/pagination/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/pagination/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/popover/Popover.vue create mode 100644 code/g3soft-libs/packages/ui/src/popover/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/popover/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/radio/Radio.vue create mode 100644 code/g3soft-libs/packages/ui/src/radio/RadioGroup.vue create mode 100644 code/g3soft-libs/packages/ui/src/radio/context.ts create mode 100644 code/g3soft-libs/packages/ui/src/radio/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/radio/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/scrollbar/Scrollbar.vue create mode 100644 code/g3soft-libs/packages/ui/src/scrollbar/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/scrollbar/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/segmented/Segmented.vue create mode 100644 code/g3soft-libs/packages/ui/src/segmented/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/segmented/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/select/Select.vue create mode 100644 code/g3soft-libs/packages/ui/src/select/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/select/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/space/Space.vue create mode 100644 code/g3soft-libs/packages/ui/src/space/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/space/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/spin/Spin.vue create mode 100644 code/g3soft-libs/packages/ui/src/spin/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/spin/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/splitter/Panel.vue create mode 100644 code/g3soft-libs/packages/ui/src/splitter/Splitter.vue create mode 100644 code/g3soft-libs/packages/ui/src/splitter/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/splitter/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/switch/Switch.vue create mode 100644 code/g3soft-libs/packages/ui/src/switch/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/switch/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/tabs/TabPane.vue create mode 100644 code/g3soft-libs/packages/ui/src/tabs/Tabs.test.ts create mode 100644 code/g3soft-libs/packages/ui/src/tabs/Tabs.vue create mode 100644 code/g3soft-libs/packages/ui/src/tabs/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/tabs/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/tag/Tag.vue create mode 100644 code/g3soft-libs/packages/ui/src/tag/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/tag/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/tooltip/Tooltip.vue create mode 100644 code/g3soft-libs/packages/ui/src/tooltip/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/tooltip/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/tree/Tree.vue create mode 100644 code/g3soft-libs/packages/ui/src/tree/TreeNode.vue create mode 100644 code/g3soft-libs/packages/ui/src/tree/context.ts create mode 100644 code/g3soft-libs/packages/ui/src/tree/index.ts create mode 100644 code/g3soft-libs/packages/ui/src/tree/types.ts create mode 100644 code/g3soft-libs/packages/ui/src/tree/utils.test.ts create mode 100644 code/g3soft-libs/packages/ui/src/tree/utils.ts create mode 100644 code/g3soft-libs/packages/ui/tests/setup.ts create mode 100644 code/g3soft-libs/packages/ui/vitest.config.ts delete mode 100644 code/g3soft-libs/scripts/gen-api.mjs create mode 100644 code/g3soft-libs/sel.yaml diff --git a/code/g3soft-libs/.codebuddy/plans/g3-ui-重写-参照fms-vue_084cfb52.md b/code/g3soft-libs/.codebuddy/plans/g3-ui-重写-参照fms-vue_084cfb52.md new file mode 100644 index 00000000..3021c70f --- /dev/null +++ b/code/g3soft-libs/.codebuddy/plans/g3-ui-重写-参照fms-vue_084cfb52.md @@ -0,0 +1,334 @@ +--- +name: g3-ui-重写-参照fms-vue +overview: 以 fms-vue 的 `src/components/ui` 为原型,全量重写 `packages/ui`(@g3soft/ui)组件库:25 个组件按「基础→表单→浮层→反馈→数据展示」分批实现,全部 TypeScript 化并遵守 g3 约定(非 scoped SCSS + `g3-` BEM + `--g3-*` 令牌 + types.ts + gen:api + 文档示例)。确认语义统一从 fms 的 `ok/onOk/okText` 改为 `confirm/onConfirm/confirmText`。 +design: + styleKeywords: + - 中性克制 + - shadcn 风格主色派生 + - 层次靠面不靠线 + - 轻描边 + - 微动效反馈 + - 三层 z 轴秩序 + fontSystem: + fontFamily: PingFang SC + heading: + size: 24px + weight: 600 + subheading: + size: 16px + weight: 500 + body: + size: 14px + weight: 400 + colorSystem: + primary: + - "#18181B" + - "#E5E5E5" + background: + - "#FFFFFF" + - "#141414" + text: + - "#000000" + - "#FFFFFF" + functional: + - "#45B114" + - "#E79A0D" + - "#EC4246" +todos: + - id: infra-setup + content: 扩展 tokens 8 个变量、TS 化 _utils、改造 z-index 分层、加 @lucide/vue 依赖与 external + status: completed + - id: genapi-and-config + content: 改造 gen-api 只解析目录主组件,扩充 locale 并实现 useComponentDefaults + status: completed + dependencies: + - infra-setup + - id: base-components + content: 用 [skill:ui-ux-pro-max] 重写 Button 变体体系,实现 button-group/space/grid/tag/segmented/scrollbar/spin + status: completed + dependencies: + - genapi-and-config + - id: overlay-popover + content: 用 [subagent:code-explorer] 移植浮层工具,实现 useFloating 与 popover/tooltip/dropdown + status: completed + dependencies: + - base-components + - id: form-components + content: 移植 input/checkbox/radio/switch/select 与 form 校验体系 + status: completed + dependencies: + - overlay-popover + - id: modal-drawer-feedback + content: 参照 [skill:antdv-next] 实现 modal(confirm 语义+命令式)、drawer、message/notification + status: completed + dependencies: + - overlay-popover + - id: data-display + content: 实现 tree/tabs/pagination/splitter 与 date-picker/range-picker/time-select + status: completed + dependencies: + - overlay-popover + - id: docs-and-verify + content: 补齐示例与文档页,跑 gen:api、tokens/ui 全量构建冒烟 + status: completed + dependencies: + - base-components + - form-components + - modal-drawer-feedback + - data-display +--- + +## 产品概述 + +将 `packages/ui`(@g3soft/ui)从一个只有 Button + ConfigProvider 的雏形,重写为一套完整的 Vue 3 组件库。实现原型来自 `D:\workspace\code\fms\fms-vue\src\components\ui` 的 25 个组件目录,但必须全部落在 g3soft 自身的技术约定上:TypeScript、非 scoped SCSS + `g3-` BEM、 `--g3-*` 设计令牌、`types.ts` + `gen:api` 生成文档、docs 示例与 md 页面。 + +## 核心范围 + +- 全量迁移 fms-vue 的组件能力,按「基础 → 浮层 → 表单 → 覆盖层与反馈 → 数据展示」分批落地,每批可独立构建验证。 +- 共规划 28 个组件目录:button、button-group、space、grid、scrollbar、spin、tag、segmented、input、checkbox、radio(+radio-group)、switch、select、form(+form-item/form-group)、date-picker、range-picker、time-select、popover、tooltip、dropdown、modal、drawer、message、notification、tree、tabs、pagination、splitter。 + +## 确认语义(本次重写的关键变更) + +fms 的 `ok` 风格一律改为 `confirm` 风格: + +- `okText` → `confirmText`、`okButtonProps` → `confirmButtonProps`、`onOk` → `onConfirm` +- 事件 `ok` → `confirm`(`update:open` / `cancel` / `closed` 保持不变) +- 命令式仍为 `G3Modal.confirm({ ..., onConfirm })`,返回 `{ destroy }` +- `confirmLoading` 语义不变予以保留;「只有点取消按钮才触发 `onCancel`,点遮罩/Esc/右上角 X 为静默关闭」的行为保留 + +## 其他已确认决策 + +- Button 改用 fms 变体体系:`primary | secondary | outline | ghost | danger | danger-outline | link | icon`(破坏性变更,现有 `docs/examples/button/*` 与 `button.md` 一并重写)。 +- 图标新增 `@lucide/vue` 运行时依赖,照搬 fms 用法。 +- 扩展 `@g3soft/tokens`,但只补跨组件共享的少量语义变量,组件私有尺寸一律用 `v()` 兜底不进令牌;**z-index 不进令牌**,继续走 `packages/ui/src/_utils/z-index.ts`,并改造为分层分配。 + +## 技术栈 + +- 组件库:Vue 3.5(` - - - - diff --git a/code/g3soft-libs/docs/content/framework/.navigation.yml b/code/g3soft-libs/docs/content/framework/.navigation.yml new file mode 100644 index 00000000..30a9bf80 --- /dev/null +++ b/code/g3soft-libs/docs/content/framework/.navigation.yml @@ -0,0 +1,2 @@ +title: 框架 +icon: i-lucide-layout-dashboard diff --git a/code/g3soft-libs/docs/content/framework/1.layout/.navigation.yml b/code/g3soft-libs/docs/content/framework/1.layout/.navigation.yml new file mode 100644 index 00000000..7cc790da --- /dev/null +++ b/code/g3soft-libs/docs/content/framework/1.layout/.navigation.yml @@ -0,0 +1,2 @@ +title: 布局 +icon: i-lucide-panel-left diff --git a/code/g3soft-libs/docs/content/framework/1.layout/index.md b/code/g3soft-libs/docs/content/framework/1.layout/index.md new file mode 100644 index 00000000..9615df10 --- /dev/null +++ b/code/g3soft-libs/docs/content/framework/1.layout/index.md @@ -0,0 +1,21 @@ +--- +title: Layout 布局框架 +description: G3 框架的布局骨架,支持 7 种布局模式,菜单/页签数据由宿主注入 +--- + +# Layout 布局框架 + +`G3Layout` 是 `@g3soft/framework` 的布局骨架。它只负责「怎么摆」,不关心菜单从哪来 —— 菜单、用户、页签都由宿主通过 props / 插槽注入。 + +点击下方按钮切换 7 种布局模式: + +:::demo{name="layout/basic"} +::: + +## 说明 + +- **7 种模式**:`sidebar-nav`(垂直,默认)/ `header-nav`(顶部)/ `sidebar-mixed-nav`(双列)/ `mixed-nav` / `header-sidebar-nav` / `header-mixed-nav` / `full-content`。 +- **一个组件 + 模式表驱动**:内部按 `layout` prop 条件渲染,不拆成 7 个组件。 +- **菜单数据注入**:`:menus` 直接给数组,或 `:menu-source` 给函数(framework 接管加载态)。 +- **插槽宁可多不要少**:`logo` / `header-left` / `header-right` / `sidebar-top` / `sidebar-footer` / `tabbar-extra` / `breadcrumb-extra` / `page` / `default`。 +- **主题**:偏好里的主色 / 暗色最终经 `@g3soft/ui` 的 `ConfigProvider` 派生,不另起一套变量系统。 diff --git a/code/g3soft-libs/docs/content/index.md b/code/g3soft-libs/docs/content/index.md index 82bd2435..fc70d4fb 100644 --- a/code/g3soft-libs/docs/content/index.md +++ b/code/g3soft-libs/docs/content/index.md @@ -36,7 +36,7 @@ to: /ui/general/button :::u-page-section #title -四个内容域 +内容板块 #features :::u-page-feature @@ -60,30 +60,42 @@ to: /ui/general/button 参考 #description -组件库 API 自动生成,另有 Hooks 与后端接口文档。 +每个组件的手写 API 与可运行示例,含 props / events / slots 与类型定义。 +::: + +:::u-page-feature +--- +icon: i-lucide-layout-dashboard +to: /framework/layout +--- +#title +框架 + +#description +应用框架:布局骨架(7 种模式)、偏好设置与主题,供业务项目引用。 ::: :::u-page-feature --- icon: i-lucide-ruler -to: /standard/code-style +to: /ui/usage/getting-started --- #title -规范 +使用规范 #description -代码风格、命名约定、Git 与发布流程等团队工程规范。 +安装与引入方式、换肤与暗色主题、全局默认值配置。 ::: :::u-page-feature --- icon: i-lucide-lightbulb -to: /explain/why-tokens +to: /ui/overlay/modal --- #title -解释 +浮层与反馈 #description -设计决策背后的取舍与常见问题解答。 +对话框、抽屉、下拉与提示:层级管理与确认语义的统一约定。 ::: ::: diff --git a/code/g3soft-libs/docs/content/ui/1.usage/getting-started.md b/code/g3soft-libs/docs/content/ui/1.usage/getting-started.md index d3819358..58aed3cf 100644 --- a/code/g3soft-libs/docs/content/ui/1.usage/getting-started.md +++ b/code/g3soft-libs/docs/content/ui/1.usage/getting-started.md @@ -67,4 +67,5 @@ document.documentElement.dataset.g3Theme = 'dark' ## 下一步 - 浏览[组件参考](/ui/general/button) -- 了解[设计变量](/explain/why-tokens)的设计取舍 +- 了解[全局默认值(componentDefaults)](/ui/general/button#全局默认值)的用法 +- 需要弹窗时先看[对话框与确认语义](/ui/overlay/modal) diff --git a/code/g3soft-libs/docs/content/ui/2.general/button-group.md b/code/g3soft-libs/docs/content/ui/2.general/button-group.md new file mode 100644 index 00000000..9a245ba8 --- /dev/null +++ b/code/g3soft-libs/docs/content/ui/2.general/button-group.md @@ -0,0 +1,64 @@ +--- +title: ButtonGroup 按钮组 +description: 把多个按钮贴合排列成一组,适用于工具条与互斥动作 +--- + +# ButtonGroup 按钮组 + +按钮组把多个 `G3Button` 贴合排列:组内按钮去掉相邻圆角、边框重叠 1px,视觉上成为一整块。它只负责**布局**,每个按钮的 `type` / `size` / `disabled` 仍由自己决定。 + +## 何时使用 + +- 多个同层级操作成排出现(工具栏、卡片操作区)时,用按钮组把它们的关联关系表达出来; +- 一组图标动作(左对齐 / 居中 / 右对齐)时使用,避免按钮之间出现缝隙; +- 只是想给按钮之间加间距,请用 [Space 间距](/ui/general/space),不要用按钮组。 + +## 基础用法 + +默认水平排列,组内按钮共用一套圆角与边框。 + +:::demo{name="button-group/basic"} +::: + +## 纵向排列 + +`orientation="vertical"` 时纵向贴合,组内按钮宽度一致,常作为侧边操作组。 + +:::demo{name="button-group/vertical"} +::: + +## 组合不同变体与尺寸 + +组内按钮各自保留 `type` / `size`;混排时建议统一变体,否则视觉层次会混乱。 + +:::demo{name="button-group/variant"} +::: + +## API + +### Props(ButtonGroup) + +| 名称 | 类型 | 默认值 | 说明 | +| --- | --- | --- | --- | +| `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` | 排列方向。`vertical` 时纵向贴合、按钮等宽 | + +### Slots + +| 名称 | 参数 | 说明 | +| --- | --- | --- | +| `default` | — | 组内的 `G3Button`。非按钮元素不会被索引到圆角规则里,请勿放置 | + +### 类型定义 + +```ts +export interface ButtonGroupProps { + orientation?: 'horizontal' | 'vertical' +} +``` + +## 实现说明 + +- 组内按钮通过 `margin-left: -1px` 让相邻边框重叠,避免出现 2px 的双线; +- 首尾按钮单独恢复圆角,因此**中间的按钮不要插非按钮元素**(会被 CSS 的 `:first-child` / `:last-child` 规则错位); +- 分组用 `role="group"` 标注,屏幕阅读器会把它们视为一组操作; +- 按钮聚焦时会 `z-index: 1` 浮到上层,避免焦点环被相邻按钮挡住。 diff --git a/code/g3soft-libs/docs/content/ui/2.general/button.md b/code/g3soft-libs/docs/content/ui/2.general/button.md index 5bb5dcc8..9f0b1189 100644 --- a/code/g3soft-libs/docs/content/ui/2.general/button.md +++ b/code/g3soft-libs/docs/content/ui/2.general/button.md @@ -1,42 +1,191 @@ --- title: Button 按钮 -description: 常用的操作按钮,支持多种视觉类型与状态 +description: 触发一个操作,支持 8 种视觉变体、3 档尺寸与加载态 --- # Button 按钮 -常用的操作按钮,支持 7 种视觉类型、3 种尺寸与加载、禁用等状态。 +按钮用于触发一个即时操作。它承载「点击后发生什么」,因此同一区域里应当只有一个视觉上最重的按钮,其余操作降级表达。 + +## 何时使用 + +- 用户点击后即时触发一个动作(提交、保存、删除、导出)时使用; +- 表单、对话框、工具条的最终动作使用 `primary`(或危险动作使用 `danger`); +- 面板头部、表格行内的图标类动作使用 `type="icon"`; +- 只是页面跳转且不需要按钮外观时,直接用 ``,或使用 `type="link"` 保持按钮语义。 ## 基础用法 -::demo{name="button/basic"} -:: +不传 `type` 时使用 `primary`;按钮内容写在默认插槽里。 -## 视觉类型 +:::demo{name="button/basic"} +::: -语义化类型用于表达操作的风险等级。 +按钮是原生 `