├── .changeset ├── README.md └── config.json ├── .editorconfig ├── .github ├── assets │ ├── banne-bg-light.png │ ├── banner-bg-dark.png │ ├── banner-dark.png │ ├── banner-dark.svg │ ├── banner.png │ ├── banner.svg │ ├── logo- bg-light.png │ ├── logo-bg-dark.png │ ├── logo-dark.png │ ├── logo-dark.svg │ ├── logo.png │ ├── logo.svg │ ├── wechat.jpg │ └── wechat_self.jpg └── workflows │ ├── release.yml │ └── version.yml ├── .gitignore ├── .husky ├── commit-msg └── pre-commit ├── .lintstagedrc.json ├── .vscode └── settings.json ├── LICENSE ├── README-zh_CN.md ├── README.md ├── biome.json ├── commitlint.config.js ├── docs ├── .vitepress │ ├── cache │ │ └── deps │ │ │ ├── @vueuse_core.js │ │ │ ├── @vueuse_core.js.map │ │ │ ├── _metadata.json │ │ │ ├── chunk-6Y7CYOCB.js │ │ │ ├── chunk-6Y7CYOCB.js.map │ │ │ ├── chunk-LZXTVE33.js │ │ │ ├── chunk-LZXTVE33.js.map │ │ │ ├── package.json │ │ │ ├── vitepress___@vue_devtools-api.js │ │ │ ├── vitepress___@vue_devtools-api.js.map │ │ │ ├── vitepress___@vueuse_core.js │ │ │ ├── vitepress___@vueuse_core.js.map │ │ │ ├── vitepress___@vueuse_integrations_useFocusTrap.js │ │ │ ├── vitepress___@vueuse_integrations_useFocusTrap.js.map │ │ │ ├── vitepress___mark__js_src_vanilla__js.js │ │ │ ├── vitepress___mark__js_src_vanilla__js.js.map │ │ │ ├── vitepress___minisearch.js │ │ │ ├── vitepress___minisearch.js.map │ │ │ ├── vue.js │ │ │ └── vue.js.map │ ├── config │ │ ├── en.ts │ │ ├── index.ts │ │ ├── shared.ts │ │ └── zh.ts │ └── theme │ │ ├── Layout.vue │ │ ├── components │ │ ├── RainbowAnimationSwitcher.vue │ │ └── RainbowSwitcher.vue │ │ ├── index.ts │ │ ├── overrides.css │ │ ├── rainbow.css │ │ └── vars.css ├── components.d.ts ├── design │ ├── editor.md │ ├── overview.md │ ├── plugin.md │ ├── renderer.md │ ├── setter.md │ └── specs.md ├── en │ ├── design │ │ ├── editor.md │ │ ├── overview.md │ │ ├── plugin.md │ │ ├── renderer.md │ │ ├── setter.md │ │ └── specs.md │ ├── guide │ │ ├── core-concepts.md │ │ ├── extension │ │ │ ├── material.md │ │ │ ├── plugin.md │ │ │ └── setter.md │ │ ├── getting-started.md │ │ ├── renderer │ │ │ ├── custom.md │ │ │ ├── editor.md │ │ │ ├── index.md │ │ │ └── runtime.md │ │ ├── scenarios │ │ │ ├── dashboard │ │ │ │ ├── getting-started.md │ │ │ │ └── index.md │ │ │ └── form │ │ │ │ ├── getting-started.md │ │ │ │ └── index.md │ │ └── why.md │ ├── index.md │ └── reference │ │ ├── core │ │ └── index.md │ │ ├── overview.md │ │ ├── plugin │ │ └── index.md │ │ └── renderer │ │ └── index.md ├── guide │ ├── core-concepts.md │ ├── extension │ │ ├── material.md │ │ ├── plugin.md │ │ └── setter.md │ ├── getting-started.md │ ├── renderer │ │ ├── custom.md │ │ ├── editor.md │ │ ├── index.md │ │ └── runtime.md │ ├── scenarios │ │ ├── dashboard │ │ │ ├── getting-started.md │ │ │ └── index.md │ │ └── form │ │ │ ├── getting-started.md │ │ │ └── index.md │ └── why.md ├── index.md ├── package.json ├── public │ ├── favicon.svg │ ├── logo-dark.svg │ ├── logo.svg │ ├── relationship.png │ └── relationship_dark.png ├── reference │ ├── core │ │ └── index.md │ ├── overview.md │ ├── plugin │ │ └── index.md │ └── renderer │ │ └── index.md ├── uno.config.ts ├── vercel.json └── vite.config.ts ├── examples └── dashboard │ ├── .editorconfig │ ├── README.md │ ├── components.json │ ├── index.html │ ├── package.json │ ├── public │ └── logo.svg │ ├── src │ ├── App.tsx │ ├── assets │ │ ├── banner.png │ │ ├── logo.svg │ │ └── react.svg │ ├── components │ │ ├── ai-chat │ │ │ ├── AiChatButton.tsx │ │ │ ├── AiChatDialog.tsx │ │ │ ├── index.tsx │ │ │ ├── prompt.ts │ │ │ ├── use-custom-chat.ts │ │ │ └── utils.ts │ │ ├── theme-provider.tsx │ │ ├── theme-toggle.tsx │ │ └── ui │ │ │ ├── accordion.tsx │ │ │ ├── avatar.tsx │ │ │ ├── button.tsx │ │ │ ├── card.tsx │ │ │ ├── chart.tsx │ │ │ ├── collapsible.tsx │ │ │ ├── context-menu.tsx │ │ │ ├── dropdown-menu.tsx │ │ │ ├── input.tsx │ │ │ ├── label.tsx │ │ │ ├── popover.tsx │ │ │ ├── progress.tsx │ │ │ ├── radio-group.tsx │ │ │ ├── scroll-area.tsx │ │ │ ├── select.tsx │ │ │ ├── separator.tsx │ │ │ ├── sheet.tsx │ │ │ ├── sidebar-extra.tsx │ │ │ ├── sidebar.tsx │ │ │ ├── skeleton.tsx │ │ │ ├── sonner.tsx │ │ │ ├── switch.tsx │ │ │ ├── tabs.tsx │ │ │ ├── textarea.tsx │ │ │ └── tooltip.tsx │ ├── editor │ │ ├── const.ts │ │ ├── index.ts │ │ ├── materials │ │ │ ├── basic │ │ │ │ ├── image │ │ │ │ │ ├── component.tsx │ │ │ │ │ ├── configure.ts │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── snippets.ts │ │ │ │ └── text │ │ │ │ │ ├── component.tsx │ │ │ │ │ ├── configure.ts │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── snippets.ts │ │ │ ├── chart │ │ │ │ ├── area-chart │ │ │ │ │ ├── component.tsx │ │ │ │ │ ├── configure.ts │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── snippets.ts │ │ │ │ ├── bar-chart │ │ │ │ │ ├── component.tsx │ │ │ │ │ ├── configure.ts │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── snippets.ts │ │ │ │ ├── line-chart │ │ │ │ │ ├── component.tsx │ │ │ │ │ ├── configure.ts │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── snippets.ts │ │ │ │ ├── pie-chart │ │ │ │ │ ├── component.tsx │ │ │ │ │ ├── configure.ts │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── snippets.ts │ │ │ │ ├── radar-chart │ │ │ │ │ ├── component.tsx │ │ │ │ │ ├── configure.ts │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── snippets.ts │ │ │ │ └── radial-chart │ │ │ │ │ ├── component.tsx │ │ │ │ │ ├── configure.ts │ │ │ │ │ ├── meta.ts │ │ │ │ │ └── snippets.ts │ │ │ ├── component.ts │ │ │ ├── configure.ts │ │ │ ├── index.ts │ │ │ ├── inner │ │ │ │ └── group │ │ │ │ │ ├── component.tsx │ │ │ │ │ ├── configure.ts │ │ │ │ │ └── meta.ts │ │ │ ├── meta.ts │ │ │ ├── root │ │ │ │ ├── component.tsx │ │ │ │ ├── configure.ts │ │ │ │ └── meta.ts │ │ │ └── type.ts │ │ ├── overrides.css │ │ ├── plugins │ │ │ ├── index.ts │ │ │ └── plugin-hotkey-move-node │ │ │ │ └── index.ts │ │ ├── setters │ │ │ ├── basic │ │ │ │ ├── color-setter │ │ │ │ │ └── index.tsx │ │ │ │ ├── id-setter │ │ │ │ │ └── index.tsx │ │ │ │ ├── number-setter │ │ │ │ │ └── index.tsx │ │ │ │ ├── rect-setter │ │ │ │ │ └── index.tsx │ │ │ │ ├── string-setter │ │ │ │ │ └── index.tsx │ │ │ │ ├── switch-setter │ │ │ │ │ └── index.tsx │ │ │ │ └── upload-setter │ │ │ │ │ └── index.tsx │ │ │ ├── custom-field-item.tsx │ │ │ ├── group │ │ │ │ ├── collapse-setter │ │ │ │ │ └── index.tsx │ │ │ │ └── tab-setter │ │ │ │ │ └── index.tsx │ │ │ └── index.ts │ │ ├── type.ts │ │ └── utils.ts │ ├── hooks │ │ ├── useDebounceFn.ts │ │ └── useMobile.ts │ ├── lib │ │ ├── schema.ts │ │ └── utils.ts │ ├── main.tsx │ ├── pages │ │ ├── editor │ │ │ ├── AIChat.tsx │ │ │ ├── ContextMenu.tsx │ │ │ ├── Header.tsx │ │ │ ├── Renderer.tsx │ │ │ ├── SettingRenderer.tsx │ │ │ ├── Sidebar │ │ │ │ ├── Components.tsx │ │ │ │ ├── Outline.tsx │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ │ └── preview │ │ │ └── index.tsx │ ├── styles │ │ └── global.css │ └── vite-env.d.ts │ ├── tailwind.config.js │ ├── tsconfig.app.json │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.mts ├── package.json ├── packages ├── core │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── rollup.config.js │ ├── src │ │ ├── config.ts │ │ ├── designer │ │ │ ├── active-tracker.ts │ │ │ ├── clipboard.ts │ │ │ ├── designer.ts │ │ │ ├── detecting.ts │ │ │ ├── dragon.ts │ │ │ ├── index.ts │ │ │ ├── location.ts │ │ │ ├── offset-observer.ts │ │ │ ├── scroller.ts │ │ │ ├── selection.ts │ │ │ ├── sensor.ts │ │ │ └── setting │ │ │ │ ├── index.ts │ │ │ │ ├── setting-entry.ts │ │ │ │ ├── setting-field.ts │ │ │ │ ├── setting-manager.ts │ │ │ │ ├── setting-prop-entry.ts │ │ │ │ └── setting-top-entry.ts │ │ ├── document │ │ │ ├── document.ts │ │ │ ├── history.ts │ │ │ ├── index.ts │ │ │ ├── node │ │ │ │ ├── node-children.ts │ │ │ │ └── node.ts │ │ │ └── prop │ │ │ │ ├── prop.ts │ │ │ │ ├── props.ts │ │ │ │ └── value-to-source.ts │ │ ├── engine │ │ │ ├── editor.ts │ │ │ ├── engine.ts │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── materials │ │ │ ├── component-meta.ts │ │ │ ├── index.ts │ │ │ └── materials.ts │ │ ├── plugin │ │ │ ├── index.ts │ │ │ ├── plugin-context.ts │ │ │ ├── plugin-extend-mobx.ts │ │ │ ├── plugin-extend.ts │ │ │ ├── plugin-runtime.ts │ │ │ ├── plugins.ts │ │ │ └── sequencify.ts │ │ ├── project │ │ │ ├── index.ts │ │ │ └── project.ts │ │ ├── setters │ │ │ ├── index.ts │ │ │ └── setters.ts │ │ ├── simulator │ │ │ ├── index.ts │ │ │ ├── simulator-renderer.ts │ │ │ ├── simulator.ts │ │ │ └── viewport.ts │ │ ├── types │ │ │ ├── common.ts │ │ │ ├── component.ts │ │ │ ├── data-source.ts │ │ │ ├── editor.ts │ │ │ ├── event.ts │ │ │ ├── index.ts │ │ │ ├── meta.ts │ │ │ ├── schema.ts │ │ │ └── setter.ts │ │ └── utils │ │ │ ├── common.ts │ │ │ ├── event-bus.ts │ │ │ ├── event.ts │ │ │ ├── hotkey.ts │ │ │ ├── index.ts │ │ │ ├── is.ts │ │ │ ├── logger.ts │ │ │ └── unique-id.ts │ ├── tsconfig.build.json │ ├── tsconfig.json │ └── tsconfig.test.json ├── create-easy-editor │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── rollup.config.js │ ├── src │ │ ├── const.ts │ │ ├── index.ts │ │ └── utils.ts │ ├── template │ │ └── dashboard │ │ │ └── react │ │ │ ├── .editorconfig │ │ │ ├── README.md │ │ │ ├── biome.json │ │ │ ├── components.json │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── public │ │ │ └── logo.svg │ │ │ ├── src │ │ │ ├── App.tsx │ │ │ ├── assets │ │ │ │ ├── banner.png │ │ │ │ ├── logo.svg │ │ │ │ └── react.svg │ │ │ ├── components │ │ │ │ ├── theme-provider.tsx │ │ │ │ ├── theme-toggle.tsx │ │ │ │ └── ui │ │ │ │ │ ├── accordion.tsx │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── card.tsx │ │ │ │ │ ├── chart.tsx │ │ │ │ │ ├── collapsible.tsx │ │ │ │ │ ├── context-menu.tsx │ │ │ │ │ ├── dropdown-menu.tsx │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── label.tsx │ │ │ │ │ ├── popover.tsx │ │ │ │ │ ├── progress.tsx │ │ │ │ │ ├── radio-group.tsx │ │ │ │ │ ├── select.tsx │ │ │ │ │ ├── separator.tsx │ │ │ │ │ ├── sheet.tsx │ │ │ │ │ ├── sidebar-extra.tsx │ │ │ │ │ ├── sidebar.tsx │ │ │ │ │ ├── skeleton.tsx │ │ │ │ │ ├── sonner.tsx │ │ │ │ │ ├── switch.tsx │ │ │ │ │ ├── tabs.tsx │ │ │ │ │ └── tooltip.tsx │ │ │ ├── editor │ │ │ │ ├── const.ts │ │ │ │ ├── index.ts │ │ │ │ ├── materials │ │ │ │ │ ├── basic │ │ │ │ │ │ ├── image │ │ │ │ │ │ │ ├── component.tsx │ │ │ │ │ │ │ ├── configure.ts │ │ │ │ │ │ │ ├── meta.ts │ │ │ │ │ │ │ └── snippets.ts │ │ │ │ │ │ └── text │ │ │ │ │ │ │ ├── component.tsx │ │ │ │ │ │ │ ├── configure.ts │ │ │ │ │ │ │ ├── meta.ts │ │ │ │ │ │ │ └── snippets.ts │ │ │ │ │ ├── chart │ │ │ │ │ │ ├── area-chart │ │ │ │ │ │ │ ├── component.tsx │ │ │ │ │ │ │ ├── configure.ts │ │ │ │ │ │ │ ├── meta.ts │ │ │ │ │ │ │ └── snippets.ts │ │ │ │ │ │ ├── bar-chart │ │ │ │ │ │ │ ├── component.tsx │ │ │ │ │ │ │ ├── configure.ts │ │ │ │ │ │ │ ├── meta.ts │ │ │ │ │ │ │ └── snippets.ts │ │ │ │ │ │ ├── line-chart │ │ │ │ │ │ │ ├── component.tsx │ │ │ │ │ │ │ ├── configure.ts │ │ │ │ │ │ │ ├── meta.ts │ │ │ │ │ │ │ └── snippets.ts │ │ │ │ │ │ ├── pie-chart │ │ │ │ │ │ │ ├── component.tsx │ │ │ │ │ │ │ ├── configure.ts │ │ │ │ │ │ │ ├── meta.ts │ │ │ │ │ │ │ └── snippets.ts │ │ │ │ │ │ ├── radar-chart │ │ │ │ │ │ │ ├── component.tsx │ │ │ │ │ │ │ ├── configure.ts │ │ │ │ │ │ │ ├── meta.ts │ │ │ │ │ │ │ └── snippets.ts │ │ │ │ │ │ └── radial-chart │ │ │ │ │ │ │ ├── component.tsx │ │ │ │ │ │ │ ├── configure.ts │ │ │ │ │ │ │ ├── meta.ts │ │ │ │ │ │ │ └── snippets.ts │ │ │ │ │ ├── component.ts │ │ │ │ │ ├── configure.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── inner │ │ │ │ │ │ └── group │ │ │ │ │ │ │ ├── component.tsx │ │ │ │ │ │ │ ├── configure.ts │ │ │ │ │ │ │ └── meta.ts │ │ │ │ │ ├── meta.ts │ │ │ │ │ ├── root │ │ │ │ │ │ ├── component.tsx │ │ │ │ │ │ ├── configure.ts │ │ │ │ │ │ └── meta.ts │ │ │ │ │ └── type.ts │ │ │ │ ├── overrides.css │ │ │ │ ├── plugins │ │ │ │ │ ├── index.ts │ │ │ │ │ └── plugin-hotkey-move-node │ │ │ │ │ │ └── index.ts │ │ │ │ ├── setters │ │ │ │ │ ├── basic │ │ │ │ │ │ ├── color-setter │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── id-setter │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── number-setter │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── rect-setter │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── string-setter │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── switch-setter │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ └── upload-setter │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── custom-field-item.tsx │ │ │ │ │ ├── group │ │ │ │ │ │ ├── collapse-setter │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ └── tab-setter │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── type.ts │ │ │ │ └── utils.ts │ │ │ ├── hooks │ │ │ │ ├── useDebounceFn.ts │ │ │ │ └── useMobile.ts │ │ │ ├── lib │ │ │ │ ├── schema.ts │ │ │ │ └── utils.ts │ │ │ ├── main.tsx │ │ │ ├── pages │ │ │ │ ├── editor │ │ │ │ │ ├── ContextMenu.tsx │ │ │ │ │ ├── Header.tsx │ │ │ │ │ ├── Renderer.tsx │ │ │ │ │ ├── SettingRenderer.tsx │ │ │ │ │ ├── Sidebar │ │ │ │ │ │ ├── Components.tsx │ │ │ │ │ │ ├── Outline.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── index.tsx │ │ │ │ └── preview │ │ │ │ │ └── index.tsx │ │ │ ├── styles │ │ │ │ └── global.css │ │ │ └── vite-env.d.ts │ │ │ ├── tailwind.config.js │ │ │ ├── tsconfig.app.json │ │ │ ├── tsconfig.json │ │ │ ├── tsconfig.node.json │ │ │ └── vite.config.mts │ └── tsconfig.json ├── plugin-dashboard │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── rollup.config.js │ ├── src │ │ ├── designer │ │ │ └── guideline.ts │ │ ├── index.ts │ │ ├── type.ts │ │ └── utils.ts │ ├── tsconfig.build.json │ ├── tsconfig.json │ └── tsconfig.test.json ├── plugin-datasource │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── rollup.config.js │ ├── src │ │ ├── core │ │ │ ├── RuntimeDataSourceItem.ts │ │ │ ├── adapter.ts │ │ │ ├── index.ts │ │ │ └── reloadDataSourceFactory.ts │ │ ├── handlers │ │ │ └── fetch.ts │ │ ├── helpers │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── interpret │ │ │ ├── DataSourceEngineFactory.ts │ │ │ └── index.ts │ │ ├── runtime │ │ │ ├── RuntimeDataSourceEngineFactory.ts │ │ │ └── index.ts │ │ ├── type.ts │ │ ├── types │ │ │ ├── data-source-handlers.ts │ │ │ ├── data-source-interpret.ts │ │ │ ├── data-source-runtime.ts │ │ │ ├── data-source.ts │ │ │ └── index.ts │ │ └── utils.ts │ ├── tsconfig.build.json │ ├── tsconfig.json │ └── tsconfig.test.json ├── plugin-hotkey │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── rollup.config.js │ ├── src │ │ ├── const.ts │ │ ├── index.ts │ │ └── utils.ts │ ├── tsconfig.build.json │ ├── tsconfig.json │ └── tsconfig.test.json ├── react-renderer-dashboard │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── rollup.config.js │ ├── src │ │ ├── css │ │ │ └── theme.css │ │ ├── index.ts │ │ ├── loading.css │ │ ├── renderer-core │ │ │ ├── hoc │ │ │ │ └── dashboard.tsx │ │ │ ├── index.tsx │ │ │ ├── renderer.ts │ │ │ └── renderer │ │ │ │ └── base.ts │ │ ├── renderer │ │ │ ├── index.css │ │ │ └── index.tsx │ │ ├── simulator-renderer │ │ │ ├── RendererView.tsx │ │ │ ├── SimulatorRenderer │ │ │ │ ├── BemTools │ │ │ │ │ ├── BorderDetecting.tsx │ │ │ │ │ ├── BorderResizing.tsx │ │ │ │ │ ├── BorderSelecting.tsx │ │ │ │ │ ├── GuideLine.tsx │ │ │ │ │ ├── drag-resize-engine.ts │ │ │ │ │ ├── index.css │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── tools.css │ │ │ │ │ └── utils.ts │ │ │ │ ├── DesignView.tsx │ │ │ │ ├── ProjectView.tsx │ │ │ │ ├── SimulatorView.tsx │ │ │ │ ├── css │ │ │ │ │ └── theme.css │ │ │ │ ├── hooks │ │ │ │ │ └── useResizeObserver.ts │ │ │ │ ├── index.css │ │ │ │ ├── index.tsx │ │ │ │ └── loading.css │ │ │ ├── document-instance.ts │ │ │ ├── index.ts │ │ │ ├── simulator-renderer.ts │ │ │ └── utils.ts │ │ └── type.ts │ ├── tsconfig.build.json │ ├── tsconfig.json │ └── tsconfig.test.json ├── react-renderer │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── rollup.config.js │ ├── src │ │ ├── adapter │ │ │ └── index.ts │ │ ├── base.tsx │ │ ├── component.tsx │ │ ├── components │ │ │ ├── FaultComponent.tsx │ │ │ └── NotFoundComponent.tsx │ │ ├── context.ts │ │ ├── hoc │ │ │ ├── comp.tsx │ │ │ ├── index.ts │ │ │ └── leaf.tsx │ │ ├── index.ts │ │ ├── page.tsx │ │ ├── renderer.tsx │ │ ├── setting-renderer │ │ │ ├── SettingSetter.tsx │ │ │ ├── context.ts │ │ │ └── index.tsx │ │ ├── types.ts │ │ └── utils │ │ │ ├── hoc.ts │ │ │ ├── index.ts │ │ │ └── is.ts │ ├── tsconfig.build.json │ ├── tsconfig.json │ └── tsconfig.test.json └── renderer-core │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── rollup.config.js │ ├── src │ ├── index.ts │ ├── types │ │ ├── components.ts │ │ ├── index.ts │ │ ├── renderer.ts │ │ └── setting-renderer.ts │ └── utils │ │ ├── classnames.ts │ │ ├── common.ts │ │ ├── data-helper.ts │ │ ├── index.ts │ │ ├── logger.ts │ │ └── request.ts │ ├── tsconfig.build.json │ ├── tsconfig.json │ └── tsconfig.test.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── tsconfig.json ├── tsconfig.test.json └── turbo.json /.changeset/README.md: -------------------------------------------------------------------------------- 1 | # Changesets 2 | 3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works 4 | with multi-package repos, or single-package repos to help you version and publish your code. You can 5 | find the full documentation for it [in our repository](https://github.com/changesets/changesets) 6 | 7 | We have a quick list of common questions to get you started engaging with this project in 8 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) 9 | -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@3.0.4/schema.json", 3 | "changelog": "@changesets/cli/changelog", 4 | "commit": false, 5 | "fixed": [], 6 | "linked": [], 7 | "access": "public", 8 | "baseBranch": "main", 9 | "updateInternalDependencies": "patch", 10 | "ignore": ["example-dashboard"] 11 | } 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_style = space 7 | indent_size = 2 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | -------------------------------------------------------------------------------- /.github/assets/banne-bg-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Easy-Editor/EasyEditor/9a78628033a43168c497607cbaed145c0dc4d989/.github/assets/banne-bg-light.png -------------------------------------------------------------------------------- /.github/assets/banner-bg-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Easy-Editor/EasyEditor/9a78628033a43168c497607cbaed145c0dc4d989/.github/assets/banner-bg-dark.png -------------------------------------------------------------------------------- /.github/assets/banner-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Easy-Editor/EasyEditor/9a78628033a43168c497607cbaed145c0dc4d989/.github/assets/banner-dark.png -------------------------------------------------------------------------------- /.github/assets/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Easy-Editor/EasyEditor/9a78628033a43168c497607cbaed145c0dc4d989/.github/assets/banner.png -------------------------------------------------------------------------------- /.github/assets/logo- bg-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Easy-Editor/EasyEditor/9a78628033a43168c497607cbaed145c0dc4d989/.github/assets/logo- bg-light.png -------------------------------------------------------------------------------- /.github/assets/logo-bg-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Easy-Editor/EasyEditor/9a78628033a43168c497607cbaed145c0dc4d989/.github/assets/logo-bg-dark.png -------------------------------------------------------------------------------- /.github/assets/logo-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Easy-Editor/EasyEditor/9a78628033a43168c497607cbaed145c0dc4d989/.github/assets/logo-dark.png -------------------------------------------------------------------------------- /.github/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Easy-Editor/EasyEditor/9a78628033a43168c497607cbaed145c0dc4d989/.github/assets/logo.png -------------------------------------------------------------------------------- /.github/assets/wechat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Easy-Editor/EasyEditor/9a78628033a43168c497607cbaed145c0dc4d989/.github/assets/wechat.jpg -------------------------------------------------------------------------------- /.github/assets/wechat_self.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Easy-Editor/EasyEditor/9a78628033a43168c497607cbaed145c0dc4d989/.github/assets/wechat_self.jpg -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | permissions: write-all 9 | 10 | jobs: 11 | release: 12 | name: Release 13 | runs-on: ubuntu-latest 14 | 15 | strategy: 16 | matrix: 17 | node-version: [18] 18 | 19 | steps: 20 | - name: Checkout Branch 21 | uses: actions/checkout@v3 22 | 23 | - name: Install pnpm 24 | uses: pnpm/action-setup@v4 25 | 26 | - name: Use Node.js ${{ matrix.node-version }} 27 | uses: actions/setup-node@v3 28 | with: 29 | node-version: ${{ matrix.node-version }} 30 | cache: 'pnpm' 31 | 32 | - name: Install Dependencies 33 | run: pnpm install 34 | 35 | - name: Setup 36 | run: pnpm run pub:build 37 | 38 | - name: Publish to npm 39 | id: changesets 40 | uses: changesets/action@v1 41 | with: 42 | version: pnpm run pub:version 43 | commit: 'chore: update versions' 44 | title: 'chore: update versions' 45 | publish: pnpm run pub:release 46 | createGithubReleases: true 47 | env: 48 | GITHUB_TOKEN: ${{ secrets.PERSONAL_GITHUB_TOKEN }} 49 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 50 | -------------------------------------------------------------------------------- /.github/workflows/version.yml: -------------------------------------------------------------------------------- 1 | name: Version 2 | 3 | on: 4 | push: 5 | branches: 6 | - release/** 7 | - release 8 | 9 | permissions: write-all 10 | 11 | jobs: 12 | version: 13 | name: Version 14 | runs-on: ubuntu-latest 15 | 16 | strategy: 17 | matrix: 18 | node-version: [18] 19 | 20 | steps: 21 | - name: Checkout Branch 22 | uses: actions/checkout@v3 23 | 24 | - name: Install pnpm 25 | uses: pnpm/action-setup@v4 26 | 27 | - name: Use Node.js ${{ matrix.node-version }} 28 | uses: actions/setup-node@v3 29 | with: 30 | node-version: ${{ matrix.node-version }} 31 | cache: 'pnpm' 32 | 33 | - name: Install Dependencies 34 | run: pnpm install 35 | 36 | - name: Create Release Pull Request 37 | uses: changesets/action@v1 38 | with: 39 | version: pnpm run pub:version 40 | commit: 'chore: update versions' 41 | title: 'chore: update versions' 42 | env: 43 | GITHUB_TOKEN: ${{ secrets.PERSONAL_GITHUB_TOKEN }} 44 | -------------------------------------------------------------------------------- /.husky/commit-msg: -------------------------------------------------------------------------------- 1 | pnpm commitlint --edit $1 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | pnpm lint-staged 2 | -------------------------------------------------------------------------------- /.lintstagedrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "*.{ts,tsx,js,jsx,json}": "biome format --write ." 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "biomejs.biome", 3 | "editor.codeActionsOnSave": { 4 | "source.organizeImports": "explicit", 5 | "quickfix.biome": "explicit" 6 | }, 7 | "editor.formatOnSave": true, 8 | "[javascript]": { 9 | "editor.defaultFormatter": "biomejs.biome" 10 | }, 11 | "[typescript]": { 12 | "editor.defaultFormatter": "biomejs.biome" 13 | }, 14 | "[javascriptreact]": { 15 | "editor.defaultFormatter": "biomejs.biome" 16 | }, 17 | "[typescriptreact]": { 18 | "editor.defaultFormatter": "biomejs.biome" 19 | }, 20 | "[json]": { 21 | "editor.defaultFormatter": "biomejs.biome" 22 | }, 23 | "cSpell.words": [ 24 | "autorun", 25 | "deactive", 26 | "easyeditor", 27 | "inited", 28 | "Metas" 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright © 2024-PRESENT JinSo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /commitlint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['@commitlint/config-conventional'], 3 | } 4 | -------------------------------------------------------------------------------- /docs/.vitepress/cache/deps/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module" 3 | } 4 | -------------------------------------------------------------------------------- /docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /docs/.vitepress/cache/deps/vue.js.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "sources": [], 4 | "sourcesContent": [], 5 | "mappings": "", 6 | "names": [] 7 | } 8 | -------------------------------------------------------------------------------- /docs/.vitepress/config/index.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitepress' 2 | import { en } from './en' 3 | import { shared } from './shared' 4 | import { zh } from './zh' 5 | 6 | export default defineConfig({ 7 | ...shared, 8 | locales: { 9 | root: { label: '简体中文', ...zh }, 10 | en: { label: 'English', ...en }, 11 | }, 12 | }) 13 | -------------------------------------------------------------------------------- /docs/.vitepress/config/shared.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitepress' 2 | import { groupIconMdPlugin, groupIconVitePlugin } from 'vitepress-plugin-group-icons' 3 | 4 | const title = 'EasyEditor' 5 | 6 | export const shared = defineConfig({ 7 | lang: 'zh', 8 | title, 9 | titleTemplate: title, 10 | outDir: './dist', 11 | head: [ 12 | ['link', { rel: 'icon', href: '/favicon.svg', type: 'image/svg+xml' }], 13 | ['link', { rel: 'alternate icon', href: '/favicon.ico', type: 'image/png', sizes: '16x16' }], 14 | ['meta', { name: 'author', content: 'JinSo' }], 15 | [ 16 | 'link', 17 | { rel: 'search', type: 'application/opensearchdescription+xml', href: '/search.xml', title: 'EasyEditor' }, 18 | ], 19 | ], 20 | lastUpdated: true, 21 | cleanUrls: true, 22 | 23 | themeConfig: { 24 | logo: '/logo-dark.svg', 25 | search: { 26 | provider: 'local', 27 | }, 28 | outline: [2, 3], 29 | socialLinks: [{ icon: 'github', link: 'https://github.com/Easy-Editor/EasyEditor' }], 30 | footer: { 31 | message: 'Released under the MIT License.', 32 | copyright: 'Copyright © 2024-PRESENT JinSo', 33 | }, 34 | }, 35 | 36 | markdown: { 37 | // math: true, 38 | config(md) { 39 | md.use(groupIconMdPlugin) 40 | }, 41 | }, 42 | 43 | vite: { 44 | plugins: [groupIconVitePlugin()], 45 | }, 46 | }) 47 | -------------------------------------------------------------------------------- /docs/.vitepress/theme/Layout.vue: -------------------------------------------------------------------------------- 1 | 44 | 45 | 48 | -------------------------------------------------------------------------------- /docs/components.d.ts: -------------------------------------------------------------------------------- 1 | export {} 2 | 3 | declare module 'vue' { 4 | export interface GlobalComponents { 5 | RainbowAnimationSwitcher: typeof import('./.vitepress/theme/components/RainbowAnimationSwitcher.vue')['default'] 6 | RainbowSwitcher: typeof import('./.vitepress/theme/components/RainbowSwitcher.vue')['default'] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /docs/design/editor.md: -------------------------------------------------------------------------------- 1 | # 编排模块 2 | 3 | :::tip 4 | 我们正在编写 EasyEditor 特有的架构设计文档,敬请期待。 5 | ::: 6 | 7 | :::info 8 | EasyEditor 是基于 [lowcode-engine](https://github.com/alibaba/lowcode-engine) 进行修改和扩展的,大体功能上基本一致。 9 | 10 | 可以先参考 [lowcode-engine 的编排模块设计文档](https://lowcode-engine.cn/site/docs/guide/design/editor)。 11 | ::: 12 | -------------------------------------------------------------------------------- /docs/design/overview.md: -------------------------------------------------------------------------------- 1 | # 架构综述 2 | 3 | :::tip 4 | 我们正在编写 EasyEditor 特有的架构设计文档,敬请期待。 5 | ::: 6 | 7 | :::info 8 | EasyEditor 是基于 [lowcode-engine](https://github.com/alibaba/lowcode-engine) 进行修改和扩展的,大体功能上基本一致。 9 | 10 | 可以先参考 [lowcode-engine 的架构综述文档](https://lowcode-engine.cn/site/docs/guide/design/summary)。 11 | ::: 12 | -------------------------------------------------------------------------------- /docs/design/plugin.md: -------------------------------------------------------------------------------- 1 | # 插件系统 2 | 3 | :::tip 4 | 我们正在编写 EasyEditor 特有的架构设计文档,敬请期待。 5 | ::: 6 | -------------------------------------------------------------------------------- /docs/design/renderer.md: -------------------------------------------------------------------------------- 1 | # 渲染模块 2 | 3 | :::tip 4 | 我们正在编写 EasyEditor 特有的架构设计文档,敬请期待。 5 | ::: 6 | 7 | :::info 8 | EasyEditor 是基于 [lowcode-engine](https://github.com/alibaba/lowcode-engine) 进行修改和扩展的,大体功能上基本一致。 9 | 10 | 可以先参考 [lowcode-engine 的渲染模块设计文档](https://lowcode-engine.cn/site/docs/guide/design/renderer)。 11 | ::: 12 | -------------------------------------------------------------------------------- /docs/design/setter.md: -------------------------------------------------------------------------------- 1 | # 设置器模块 2 | 3 | :::tip 4 | 我们正在编写 EasyEditor 特有的架构设计文档,敬请期待。 5 | ::: 6 | 7 | :::info 8 | EasyEditor 是基于 [lowcode-engine](https://github.com/alibaba/lowcode-engine) 进行修改和扩展的,大体功能上基本一致。 9 | 10 | 可以先参考 [lowcode-engine 的设置器设计文档](https://lowcode-engine.cn/site/docs/guide/design/setter)。 11 | ::: 12 | -------------------------------------------------------------------------------- /docs/design/specs.md: -------------------------------------------------------------------------------- 1 | # 协议栈简介 2 | 3 | :::tip 4 | 我们正在编写 EasyEditor 特有的架构设计文档,敬请期待。 5 | ::: 6 | 7 | :::info 8 | EasyEditor 是基于 [lowcode-engine](https://github.com/alibaba/lowcode-engine) 进行修改和扩展的,大体功能上基本一致。 9 | 10 | 可以先参考 [lowcode-engine 的协议栈简介文档](https://lowcode-engine.cn/site/docs/guide/design/specs)。 11 | ::: 12 | -------------------------------------------------------------------------------- /docs/en/design/editor.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Editor Module 3 | description: Overview of EasyEditor's editor module 4 | --- 5 | 6 | # Editor Module 7 | 8 | ::: tip 9 | We are currently working on editor module documentation specific to EasyEditor. Stay tuned! 10 | ::: 11 | 12 | ::: info 13 | EasyEditor is based on [lowcode-engine](https://github.com/alibaba/lowcode-engine) with modifications and extensions, though the core functionality remains similar. 14 | 15 | You can refer to the [lowcode-engine editor module documentation](https://lowcode-engine.cn/site/docs/guide/design/editor) in the meantime. 16 | ::: 17 | 18 | 19 | -------------------------------------------------------------------------------- /docs/en/design/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Architecture Overview 3 | description: Overview of EasyEditor's architecture 4 | --- 5 | 6 | # Architecture Overview 7 | 8 | ::: tip 9 | We are currently working on architecture design documentation specific to EasyEditor. Stay tuned! 10 | ::: 11 | 12 | ::: info 13 | EasyEditor is based on [lowcode-engine](https://github.com/alibaba/lowcode-engine) with modifications and extensions, though the core functionality remains similar. 14 | 15 | You can refer to the [lowcode-engine architecture overview documentation](https://lowcode-engine.cn/site/docs/guide/design/summary) in the meantime. 16 | ::: 17 | 18 | 19 | -------------------------------------------------------------------------------- /docs/en/design/plugin.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Plugin System 3 | description: Overview of EasyEditor's plugin system 4 | --- 5 | 6 | # Plugin System 7 | 8 | ::: tip 9 | We are currently working on plugin system documentation specific to EasyEditor. Stay tuned! 10 | ::: 11 | 12 | 13 | -------------------------------------------------------------------------------- /docs/en/design/renderer.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Renderer Module 3 | description: Overview of EasyEditor's renderer module 4 | --- 5 | 6 | # Renderer Module 7 | 8 | ::: tip 9 | We are currently working on renderer module documentation specific to EasyEditor. Stay tuned! 10 | ::: 11 | 12 | ::: info 13 | EasyEditor is based on [lowcode-engine](https://github.com/alibaba/lowcode-engine) with modifications and extensions, though the core functionality remains similar. 14 | 15 | You can refer to the [lowcode-engine renderer module documentation](https://lowcode-engine.cn/site/docs/guide/design/renderer) in the meantime. 16 | ::: 17 | 18 | 19 | -------------------------------------------------------------------------------- /docs/en/design/setter.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Setter Module 3 | description: Overview of EasyEditor's setter module 4 | --- 5 | 6 | # Setter Module 7 | 8 | ::: tip 9 | We are currently working on setter module documentation specific to EasyEditor. Stay tuned! 10 | ::: 11 | 12 | ::: info 13 | EasyEditor is based on [lowcode-engine](https://github.com/alibaba/lowcode-engine) with modifications and extensions, though the core functionality remains similar. 14 | 15 | You can refer to the [lowcode-engine setter module documentation](https://lowcode-engine.cn/site/docs/guide/design/setter) in the meantime. 16 | ::: 17 | 18 | 19 | -------------------------------------------------------------------------------- /docs/en/design/specs.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Protocol Stack 3 | description: Introduction to EasyEditor's protocol stack 4 | --- 5 | 6 | # Protocol Stack 7 | 8 | ::: tip 9 | We are currently working on protocol stack documentation specific to EasyEditor. Stay tuned! 10 | ::: 11 | 12 | ::: info 13 | EasyEditor is based on [lowcode-engine](https://github.com/alibaba/lowcode-engine) with modifications and extensions, though the core functionality remains similar. 14 | 15 | You can refer to the [lowcode-engine protocol stack documentation](https://lowcode-engine.cn/site/docs/guide/design/specs) in the meantime. 16 | ::: 17 | 18 | 19 | -------------------------------------------------------------------------------- /docs/en/guide/scenarios/form/getting-started.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Form Design Getting Started 3 | description: Getting started with form design in EasyEditor 4 | --- 5 | 6 | # Getting Started 7 | 8 | :::info Under Development 9 | The getting started guide for form design scenarios is under development. Stay tuned! 10 | ::: 11 | -------------------------------------------------------------------------------- /docs/en/guide/scenarios/form/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Form Design Introduction 3 | description: Introduction to form design with EasyEditor 4 | --- 5 | 6 | # Introduction 7 | 8 | :::info Under Development 9 | Form design scenario functionality is actively under development. Stay tuned! 10 | ::: 11 | -------------------------------------------------------------------------------- /docs/guide/scenarios/dashboard/index.md: -------------------------------------------------------------------------------- 1 | # 介绍 2 | 3 | EasyEditor 的大屏设计场景是基于插件化架构实现的,通过 `@easy-editor/plugin-dashboard` 和 `@easy-editor/react-renderer-dashboard` 两个核心包,为开发者提供了完整的大屏设计能力。 4 | 5 | ## 核心价值 6 | 7 | 大屏设计场景致力于解决以下问题: 8 | 9 | 1. **开发效率** 10 | - 通过可视化拖拽快速构建大屏应用 11 | - 内置丰富的组件库,开箱即用 12 | - 支持组件复用和模板管理 13 | 14 | 2. **技术门槛** 15 | - 降低大屏开发的技术门槛 16 | - 无需深入掌握复杂的数据可视化技术 17 | - 提供友好的可视化配置界面 18 | 19 | 3. **维护成本** 20 | - 统一的组件管理机制 21 | - 标准化的数据接入方案 22 | - 可复用的主题配置系统 23 | 24 | ## 技术架构 25 | 26 | 大屏设计场景的核心是 `@easy-editor/plugin-dashboard` 插件,它扩展了 `@easy-editor/core` 的基础能力,提供了: 27 | 28 | - 大屏专用的设计器逻辑 29 | - 大屏组件物料体系 30 | - 大屏特有的布局系统 31 | - 分组功能 32 | - ... 33 | 34 | ### 渲染引擎 35 | 36 | `@easy-editor/react-renderer-dashboard` 是基于 React 的大屏渲染引擎,它扩展了 `@easy-editor/react-renderer` 的基础能力,提供了: 37 | 38 | - 大屏特有的布局系统 39 | - 多页面能力 40 | - 组件增强能力 41 | - 性能优化 42 | 43 | ## 应用场景 44 | 45 | 大屏设计场景适用于: 46 | 47 | - 数据可视化大屏 48 | - 监控中心 49 | - 指挥中心 50 | - 展示大屏 51 | - 数据看板 52 | 53 | ## 最佳实践 54 | 55 | 我们提供了一个完整的大屏设计案例 [EasyDashboard](https://github.com/Easy-Editor/EasyDashboard),展示了如何基于 EasyEditor 构建专业的大屏应用。该案例包含了: 56 | 57 | - 完整的大屏设计流程 58 | - 丰富的组件示例 59 | - 数据源接入示例 60 | - 主题配置示例 61 | - 性能优化实践 62 | -------------------------------------------------------------------------------- /docs/guide/scenarios/form/getting-started.md: -------------------------------------------------------------------------------- 1 | # 快速开始 2 | 3 | :::info 开发中 4 | 表单设计场景的快速开始指南正在开发中,敬请期待! 5 | ::: 6 | -------------------------------------------------------------------------------- /docs/guide/scenarios/form/index.md: -------------------------------------------------------------------------------- 1 | # 介绍 2 | 3 | :::info 开发中 4 | 表单设计场景功能正在积极开发中,敬请期待! 5 | ::: 6 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: home 3 | title: "EasyEditor: 用于构建可视化应用平台的插件化跨框架低代码引擎" 4 | 5 | hero: 6 | name: EasyEditor 7 | text: 低代码引擎 8 | tagline: 用于构建可视化应用平台的插件化跨框架低代码引擎 9 | image: 10 | light: /logo.svg 11 | dark: /logo-dark.svg 12 | alt: EasyEditor 13 | actions: 14 | - theme: brand 15 | text: 什么是 EasyEditor? 16 | link: /guide/why 17 | - theme: alt 18 | text: 快速开始 19 | link: /guide/getting-started 20 | - theme: alt 21 | text: API 参考 22 | link: /reference/overview 23 | 24 | features: 25 | - title: 解耦设计 26 | icon: 🔌 27 | details: 引擎核心与框架无关,支持多种框架渲染扩展 28 | - title: 插件化架构 29 | icon: 🧩 30 | details: 灵活的插件系统设计,生命周期管理、热键绑定、类扩展机制、依赖注入... 31 | - title: 渲染引擎 32 | icon: ⚡ 33 | details: 多框架支持、实时预览、Schema 驱动、组件隔离沙箱 34 | - title: 可视化设计 35 | icon: 🎨 36 | details: 完整的设计器实现,拖拽布局、吸附对齐、多设备预览、撤销/重做栈... 37 | - title: 企业级能力 38 | icon: 🏢 39 | details: 数据源管理、多语言支持、版本控制、在线协作 40 | - title: 组件生态体系 41 | icon: 📦 42 | details: 内置物料市场、组件封装规范、物料开发工具、组件版本管理... 43 | --- 44 | 45 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docs", 3 | "type": "module", 4 | "version": "0.0.1", 5 | "private": true, 6 | "scripts": { 7 | "docs:dev": "vitepress dev", 8 | "docs:build": "vitepress build", 9 | "docs:preview": "vitepress preview" 10 | }, 11 | "devDependencies": { 12 | "unocss": "^0.64.1", 13 | "vite": "^6.0.1", 14 | "vitepress": "^1.6.3" 15 | }, 16 | "dependencies": { 17 | "@vueuse/core": "^13.0.0", 18 | "vitepress-plugin-group-icons": "^1.4.1", 19 | "vue": "^3.5.13" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /docs/public/relationship.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Easy-Editor/EasyEditor/9a78628033a43168c497607cbaed145c0dc4d989/docs/public/relationship.png -------------------------------------------------------------------------------- /docs/public/relationship_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Easy-Editor/EasyEditor/9a78628033a43168c497607cbaed145c0dc4d989/docs/public/relationship_dark.png -------------------------------------------------------------------------------- /docs/reference/overview.md: -------------------------------------------------------------------------------- 1 | # API 总览 2 | 3 | :::warning 注意 4 | 目前 API 文档仅提供核心的 Editor、Plugin、Renderer 的 API 参考,其他 API 文档仍在开发中。我们会持续更新和完善文档内容,以提供更全面的开发指南。 5 | ::: 6 | 7 | 8 | EasyEditor 提供了一系列强大的 API,用于构建和扩展低代码编辑器。本节将概述 EasyEditor 的 API 体系结构,帮助您了解如何使用这些 API 构建自己的低代码应用。 9 | 10 | ## API 分类 11 | 12 | EasyEditor 的 API 主要分为以下几个部分: 13 | 14 | ### 核心 API(Core) 15 | 16 | 核心 API 是 EasyEditor 的基础,提供了编辑器的基本功能和数据结构。主要包括: 17 | 18 | - **项目管理**:`Project`、`Document` - 管理低代码项目和文档 19 | - **节点操作**:`Node`、`Props` - 处理组件树和属性 20 | - **编辑器设计**:`Designer`、`Selection`、`Dragon` - 设计器核心功能 21 | - **组件元数据**:`ComponentMeta`、`Setting` - 组件配置和设置 22 | - **模拟器**:`Simulator`、`SimulatorRenderer` - 页面渲染和预览 23 | 24 | [了解更多核心 API](./core/index) 25 | 26 | ### 插件 API(Plugin) 27 | 28 | 插件 API 允许开发者扩展 EasyEditor 的功能,创建自定义插件。包括: 29 | 30 | - **插件生命周期**:插件的注册、初始化和卸载 31 | - **插件上下文**:访问编辑器内部功能 32 | - **扩展点**:在特定位置扩展编辑器功能 33 | 34 | [了解更多插件 API](./plugin/index) 35 | 36 | ### 渲染器 API(Renderer) 37 | 38 | 渲染器 API 用于自定义组件的渲染方式,支持多框架渲染。包括: 39 | 40 | - **渲染引擎**:将 Schema 转换为实际 UI 41 | - **渲染适配器**:适配不同前端框架 42 | - **渲染钩子**:自定义渲染过程 43 | 44 | [了解更多渲染器 API](./renderer/index) 45 | 46 | ## 开始使用 47 | 48 | 根据您的需求,选择对应的 API 类别查看详细文档。每个 API 文档都提供了详细的接口说明和使用示例。 49 | 50 | - 查看编辑器核心功能?查看[核心 API](./core/index) 51 | - 查看插件开发指南?查看[插件 API](./plugin/index) 52 | - 查看渲染器配置?查看[渲染器 API](./renderer/index) 53 | -------------------------------------------------------------------------------- /docs/uno.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig, presetAttributify, presetIcons, presetWind, transformerDirectives } from 'unocss' 2 | 3 | export default defineConfig({ 4 | theme: { 5 | animation: { 6 | keyframes: { 7 | custom: '{0%, 100% { transform: scale(0.5); } 50% { transform: scale(1); }}', 8 | }, 9 | durations: { 10 | custom: '2s', 11 | }, 12 | timingFns: { 13 | custom: 'cubic-bezier(0.4,0,.6,1)', 14 | }, 15 | properties: { 16 | custom: { 'transform-origin': 'center' }, 17 | }, 18 | counts: { 19 | custom: 'infinite', 20 | }, 21 | }, 22 | }, 23 | presets: [presetWind(), presetIcons(), presetAttributify()], 24 | transformers: [transformerDirectives()], 25 | }) 26 | -------------------------------------------------------------------------------- /docs/vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "cleanUrls": true 3 | } -------------------------------------------------------------------------------- /docs/vite.config.ts: -------------------------------------------------------------------------------- 1 | import UnoCSS from 'unocss/vite' 2 | import { defineConfig } from 'vite' 3 | 4 | export default defineConfig({ 5 | plugins: [UnoCSS()], 6 | }) 7 | -------------------------------------------------------------------------------- /examples/dashboard/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_style = space 7 | indent_size = 2 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | -------------------------------------------------------------------------------- /examples/dashboard/README.md: -------------------------------------------------------------------------------- 1 | # React + Dashboard 2 | -------------------------------------------------------------------------------- /examples/dashboard/components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": false, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.js", 8 | "css": "src/styles/global.css", 9 | "baseColor": "zinc", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | }, 20 | "iconLibrary": "lucide" 21 | } 22 | -------------------------------------------------------------------------------- /examples/dashboard/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | easy-editor-react-dashboard 11 | 12 | 13 |
14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /examples/dashboard/src/App.tsx: -------------------------------------------------------------------------------- 1 | import { lazy } from 'react' 2 | import { BrowserRouter, Navigate, Route, Routes } from 'react-router' 3 | import { ThemeProvider } from './components/theme-provider' 4 | 5 | const Preview = lazy(() => import('./pages/preview')) 6 | const Editor = lazy(() => import('./pages/editor')) 7 | 8 | function App() { 9 | return ( 10 | 11 | 12 | 13 | } /> 14 | } /> 15 | } /> 16 | 17 | 18 | 19 | ) 20 | } 21 | 22 | export default App 23 | -------------------------------------------------------------------------------- /examples/dashboard/src/assets/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Easy-Editor/EasyEditor/9a78628033a43168c497607cbaed145c0dc4d989/examples/dashboard/src/assets/banner.png -------------------------------------------------------------------------------- /examples/dashboard/src/components/ai-chat/AiChatButton.tsx: -------------------------------------------------------------------------------- 1 | import logo from '@/assets/logo.svg' 2 | import { Button } from '@/components/ui/button' 3 | import { cn } from '@/lib/utils' 4 | import type * as React from 'react' 5 | 6 | interface AiChatButtonProps { 7 | onClick: () => void 8 | className?: string 9 | } 10 | 11 | export const AiChatButton: React.FC = ({ onClick, className }) => { 12 | return ( 13 | 28 | ) 29 | } 30 | -------------------------------------------------------------------------------- /examples/dashboard/src/components/ai-chat/index.tsx: -------------------------------------------------------------------------------- 1 | export { AiChatButton } from './AiChatButton' 2 | export { AiChatDialog } from './AiChatDialog' 3 | -------------------------------------------------------------------------------- /examples/dashboard/src/components/theme-toggle.tsx: -------------------------------------------------------------------------------- 1 | import { Moon, Sun } from 'lucide-react' 2 | 3 | import { useTheme } from '@/components/theme-provider' 4 | import { Button } from '@/components/ui/button' 5 | import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' 6 | 7 | export const ThemeToggle = () => { 8 | const { setTheme } = useTheme() 9 | 10 | return ( 11 | 12 | 13 | 18 | 19 | 20 | setTheme('light')}>Light 21 | setTheme('dark')}>Dark 22 | setTheme('system')}>System 23 | 24 | 25 | ) 26 | } 27 | -------------------------------------------------------------------------------- /examples/dashboard/src/components/ui/avatar.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react' 2 | 3 | import { cn } from '@/lib/utils' 4 | 5 | interface AvatarProps extends React.HTMLAttributes { 6 | className?: string 7 | } 8 | 9 | interface AvatarImageProps extends React.ImgHTMLAttributes { 10 | className?: string 11 | } 12 | 13 | interface AvatarFallbackProps extends React.HTMLAttributes { 14 | className?: string 15 | } 16 | 17 | const Avatar = React.forwardRef(({ className, ...props }, ref) => ( 18 |
23 | )) 24 | Avatar.displayName = 'Avatar' 25 | 26 | const AvatarImage = React.forwardRef(({ className, ...props }, ref) => ( 27 | 28 | )) 29 | AvatarImage.displayName = 'AvatarImage' 30 | 31 | const AvatarFallback = React.forwardRef(({ className, ...props }, ref) => ( 32 |
40 | )) 41 | AvatarFallback.displayName = 'AvatarFallback' 42 | 43 | export { Avatar, AvatarFallback, AvatarImage } 44 | -------------------------------------------------------------------------------- /examples/dashboard/src/components/ui/collapsible.tsx: -------------------------------------------------------------------------------- 1 | import * as CollapsiblePrimitive from '@radix-ui/react-collapsible' 2 | 3 | function Collapsible({ ...props }: React.ComponentProps) { 4 | return 5 | } 6 | 7 | function CollapsibleTrigger({ ...props }: React.ComponentProps) { 8 | return 9 | } 10 | 11 | function CollapsibleContent({ ...props }: React.ComponentProps) { 12 | return 13 | } 14 | 15 | export { Collapsible, CollapsibleTrigger, CollapsibleContent } 16 | -------------------------------------------------------------------------------- /examples/dashboard/src/components/ui/input.tsx: -------------------------------------------------------------------------------- 1 | import type * as React from 'react' 2 | 3 | import { cn } from '@/lib/utils' 4 | 5 | function Input({ className, type, ...props }: React.ComponentProps<'input'>) { 6 | return ( 7 | 16 | ) 17 | } 18 | 19 | export { Input } 20 | -------------------------------------------------------------------------------- /examples/dashboard/src/components/ui/label.tsx: -------------------------------------------------------------------------------- 1 | import * as LabelPrimitive from '@radix-ui/react-label' 2 | import type * as React from 'react' 3 | 4 | import { cn } from '@/lib/utils' 5 | 6 | function Label({ className, ...props }: React.ComponentProps) { 7 | return ( 8 | 16 | ) 17 | } 18 | 19 | export { Label } 20 | -------------------------------------------------------------------------------- /examples/dashboard/src/components/ui/progress.tsx: -------------------------------------------------------------------------------- 1 | import * as ProgressPrimitive from '@radix-ui/react-progress' 2 | import type * as React from 'react' 3 | 4 | import { cn } from '@/lib/utils' 5 | 6 | function Progress({ className, value, ...props }: React.ComponentProps) { 7 | return ( 8 | 13 | 18 | 19 | ) 20 | } 21 | 22 | export { Progress } 23 | -------------------------------------------------------------------------------- /examples/dashboard/src/components/ui/scroll-area.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react' 2 | 3 | import { cn } from '@/lib/utils' 4 | 5 | interface ScrollAreaProps extends React.HTMLAttributes { 6 | className?: string 7 | } 8 | 9 | const ScrollArea = React.forwardRef(({ className, children, ...props }, ref) => ( 10 |
11 | {children} 12 |
13 | )) 14 | ScrollArea.displayName = 'ScrollArea' 15 | 16 | export { ScrollArea } 17 | -------------------------------------------------------------------------------- /examples/dashboard/src/components/ui/separator.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react' 2 | import * as SeparatorPrimitive from '@radix-ui/react-separator' 3 | 4 | import { cn } from '@/lib/utils' 5 | 6 | function Separator({ 7 | className, 8 | orientation = 'horizontal', 9 | decorative = true, 10 | ...props 11 | }: React.ComponentProps) { 12 | return ( 13 | 23 | ) 24 | } 25 | 26 | export { Separator } 27 | -------------------------------------------------------------------------------- /examples/dashboard/src/components/ui/sidebar-extra.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from '@/lib/utils' 2 | import React from 'react' 3 | 4 | const SidebarMenuExtra = React.forwardRef>( 5 | ({ className, ...props }, ref) => ( 6 |
12 | ), 13 | ) 14 | SidebarMenuExtra.displayName = 'SidebarMenuExtra' 15 | 16 | const SidebarMenuExtraItem = React.forwardRef>( 17 | ({ className, ...props }, ref) => ( 18 |
svg]:size-4', 26 | className, 27 | )} 28 | {...props} 29 | /> 30 | ), 31 | ) 32 | SidebarMenuExtraItem.displayName = 'SidebarMenuExtraItem' 33 | 34 | export { SidebarMenuExtra, SidebarMenuExtraItem } 35 | -------------------------------------------------------------------------------- /examples/dashboard/src/components/ui/skeleton.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from '@/lib/utils' 2 | 3 | function Skeleton({ className, ...props }: React.ComponentProps<'div'>) { 4 | return
5 | } 6 | 7 | export { Skeleton } 8 | -------------------------------------------------------------------------------- /examples/dashboard/src/components/ui/sonner.tsx: -------------------------------------------------------------------------------- 1 | import { useTheme } from 'next-themes' 2 | import { Toaster as Sonner, type ToasterProps } from 'sonner' 3 | 4 | const Toaster = ({ ...props }: ToasterProps) => { 5 | const { theme = 'system' } = useTheme() 6 | 7 | return ( 8 | 22 | ) 23 | } 24 | 25 | export { Toaster } 26 | -------------------------------------------------------------------------------- /examples/dashboard/src/components/ui/switch.tsx: -------------------------------------------------------------------------------- 1 | import * as SwitchPrimitive from '@radix-ui/react-switch' 2 | import type * as React from 'react' 3 | 4 | import { cn } from '@/lib/utils' 5 | 6 | function Switch({ className, ...props }: React.ComponentProps) { 7 | return ( 8 | 16 | 22 | 23 | ) 24 | } 25 | 26 | export { Switch } 27 | -------------------------------------------------------------------------------- /examples/dashboard/src/components/ui/textarea.tsx: -------------------------------------------------------------------------------- 1 | import type * as React from 'react' 2 | 3 | import { cn } from '@/lib/utils' 4 | 5 | function Textarea({ className, ...props }: React.ComponentProps<'textarea'>) { 6 | return ( 7 |