Repository: hlerenow/chameleon Branch: master Commit: d31a9474e3a1 Files: 502 Total size: 1.7 MB Directory structure: gitextract_um330eu0/ ├── .github/ │ ├── FUNDING.yml │ └── workflows/ │ └── static.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .npmrc ├── .prettierignore ├── .prettierrc.json ├── .vscode/ │ └── settings.json ├── BUILD_FIX_SUMMARY.md ├── CHANGELOG.md ├── DEV_README.md ├── LICENSE ├── README.md ├── changelog.config.cjs ├── design/ │ └── chameleon.drawio ├── eslint.config.js ├── lerna.json ├── package.json ├── packages/ │ ├── build-script/ │ │ ├── .eslintignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── bin/ │ │ │ └── run.js │ │ ├── client.d.ts │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── scripts/ │ │ │ └── build.cjs │ │ ├── src/ │ │ │ ├── config/ │ │ │ │ ├── base.ts │ │ │ │ ├── vite.build.ts │ │ │ │ ├── vite.common.ts │ │ │ │ └── vite.dev.ts │ │ │ ├── core/ │ │ │ │ ├── devServer.ts │ │ │ │ └── doBuild.ts │ │ │ └── index.ts │ │ ├── test/ │ │ │ └── demo.test.ts │ │ └── tsconfig.json │ ├── demo-page/ │ │ ├── .gitignore │ │ ├── .prettierrc.json │ │ ├── CHANGELOG.md │ │ ├── __tests__/ │ │ │ └── demo.test.ts │ │ ├── build.config.js │ │ ├── index.html │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── material/ │ │ │ │ ├── advanceCustomButton.ts │ │ │ │ ├── button.tsx │ │ │ │ ├── col.ts │ │ │ │ ├── index.ts │ │ │ │ ├── input.ts │ │ │ │ ├── layout/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── modal.ts │ │ │ │ ├── native.ts │ │ │ │ ├── row.ts │ │ │ │ └── table.ts │ │ │ ├── pages/ │ │ │ │ ├── basePage-b-client.ts │ │ │ │ ├── basePage.ts │ │ │ │ ├── emptyPage.ts │ │ │ │ ├── layout.ts │ │ │ │ └── simplePage.ts │ │ │ └── vite-env.d.ts │ │ └── tsconfig.json │ ├── docs-app/ │ │ ├── .gitignore │ │ ├── .vscode/ │ │ │ ├── extensions.json │ │ │ └── launch.json │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── astro.config.mjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── codeSnippets/ │ │ │ │ ├── ButtonMeta.tsx │ │ │ │ ├── Editor.tsx │ │ │ │ ├── GridItemMeta.tsx │ │ │ │ ├── GridLayoutComponent.tsx │ │ │ │ ├── GridLayoutMeta.tsx │ │ │ │ ├── GridLayoutWrap.tsx │ │ │ │ ├── index.css │ │ │ │ └── render.tsx │ │ │ ├── components/ │ │ │ │ └── Link.tsx │ │ │ ├── content/ │ │ │ │ ├── config.ts │ │ │ │ └── docs/ │ │ │ │ ├── guides/ │ │ │ │ │ ├── addCustomComponent.mdx │ │ │ │ │ ├── index.mdx │ │ │ │ │ └── useRender.mdx │ │ │ │ ├── index.mdx │ │ │ │ └── reference/ │ │ │ │ ├── Engine/ │ │ │ │ │ ├── _category_.json │ │ │ │ │ ├── api.mdx │ │ │ │ │ ├── introduction.mdx │ │ │ │ │ └── usage.mdx │ │ │ │ ├── Material/ │ │ │ │ │ ├── _category_.json │ │ │ │ │ ├── advanceDevelopMaterial.mdx │ │ │ │ │ ├── developMaterial.mdx │ │ │ │ │ └── introduction.mdx │ │ │ │ ├── PageSchema/ │ │ │ │ │ ├── built-in-setter.mdx │ │ │ │ │ ├── material.mdx │ │ │ │ │ └── page.mdx │ │ │ │ └── Plugin/ │ │ │ │ ├── built-in-plugins-usage.mdx │ │ │ │ ├── custom-plugin-guide.mdx │ │ │ │ ├── custom-setter.mdx │ │ │ │ ├── innder-plugin-list.mdx │ │ │ │ └── plugin-develop.mdx │ │ │ └── env.d.ts │ │ └── tsconfig.json │ ├── engine/ │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── .storybook/ │ │ │ ├── main.js │ │ │ └── preview.js │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── __tests__/ │ │ │ └── demo.test.ts │ │ ├── build.common.config.ts │ │ ├── build.config.ts │ │ ├── index.html │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Engine.module.scss │ │ │ ├── _dev_/ │ │ │ │ ├── index.css │ │ │ │ ├── index.tsx │ │ │ │ ├── lib/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── page/ │ │ │ │ │ ├── Editor/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Preview/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── componentEditor/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── render.html │ │ │ │ ├── render.tsx │ │ │ │ └── router.tsx │ │ │ ├── assets/ │ │ │ │ └── styles/ │ │ │ │ └── mixin.scss │ │ │ ├── build-script-env.d.ts │ │ │ ├── component/ │ │ │ │ ├── CSSCodeEditor/ │ │ │ │ │ ├── helper.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.module.scss │ │ │ │ ├── CSSEditor/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.module.scss │ │ │ │ ├── CSSPropertiesEditor/ │ │ │ │ │ ├── cssProperties.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── signleProperty.tsx │ │ │ │ │ ├── style.module.scss │ │ │ │ │ └── util.ts │ │ │ │ ├── CSSPropertiesVariableBindEditor/ │ │ │ │ │ ├── SingleProperty.tsx │ │ │ │ │ ├── cssProperties.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── style.module.scss │ │ │ │ │ └── util.ts │ │ │ │ ├── CSSSizeInput/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.module.scss │ │ │ │ ├── ClassNameEditor/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.module.scss │ │ │ │ ├── CustomColorPicker/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── CustomSchemaForm/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── CFiledWithSwitchSetter/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.module.scss │ │ │ │ │ │ ├── Form/ │ │ │ │ │ │ │ ├── Field/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── style.module.scss │ │ │ │ │ │ │ ├── context.ts │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── SetterSwitcher/ │ │ │ │ │ │ │ ├── core.tsx │ │ │ │ │ │ │ ├── helper.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.module.scss │ │ │ │ │ │ └── Setters/ │ │ │ │ │ │ ├── ActionFlowSetter/ │ │ │ │ │ │ │ ├── component/ │ │ │ │ │ │ │ │ ├── CreateNewNodePopup/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── initData.ts │ │ │ │ │ │ │ │ ├── InputHandle/ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ ├── NodeCard/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ └── style.module.scss │ │ │ │ │ │ │ │ ├── OutputHandle/ │ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ │ ├── SelectNodeByTree/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── modal.tsx │ │ │ │ │ │ │ │ │ └── util.ts │ │ │ │ │ │ │ │ └── SelectNodeState/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── util.ts │ │ │ │ │ │ │ ├── config.ts │ │ │ │ │ │ │ ├── context.ts │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── node/ │ │ │ │ │ │ │ │ ├── AssignValueNode/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── style.module.scss │ │ │ │ │ │ │ │ │ └── util.ts │ │ │ │ │ │ │ │ ├── CallNodeMethodNode/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── style.module.scss │ │ │ │ │ │ │ │ │ └── util.ts │ │ │ │ │ │ │ │ ├── JumpLinkNode.tsx │ │ │ │ │ │ │ │ ├── RequestAPINode/ │ │ │ │ │ │ │ │ │ ├── helper.ts │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── style.module.scss │ │ │ │ │ │ │ │ │ └── util.ts │ │ │ │ │ │ │ │ ├── RunCodeNode/ │ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ │ ├── style.module.scss │ │ │ │ │ │ │ │ │ └── util.ts │ │ │ │ │ │ │ │ ├── StartNode.tsx │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ └── util.ts │ │ │ │ │ │ ├── AdvanceSetterList.ts │ │ │ │ │ │ ├── AntDColorSetter/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── ArraySetter/ │ │ │ │ │ │ │ ├── ArrayItem.tsx │ │ │ │ │ │ │ ├── SortItemOrderModal.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.module.scss │ │ │ │ │ │ ├── BooleanSetter/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── CSSSizeSetter/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── CSSValueSetter/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.module.scss │ │ │ │ │ │ ├── ColorSetter/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── EmptyValueSetter/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── ExpressionSetter/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.module.scss │ │ │ │ │ │ ├── FastLayoutSetter/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── FunctionSetter/ │ │ │ │ │ │ │ ├── defaultDts.ts │ │ │ │ │ │ │ ├── helper.ts │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── JSONSetter/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── NumberSetter/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── RadioGroupSetter/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── SelectSetter/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── ShapeSetter/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── SliderSetter/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── StringSetter/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── TextAreaSetter/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── type.ts │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── style.module.scss │ │ │ │ │ └── utils.ts │ │ │ │ ├── DesignerSizer/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── InputNumberPlus/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.module.scss │ │ │ │ ├── MonacoEditor/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── MoveableModal/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── StylePanel/ │ │ │ │ │ ├── BackgroundInput/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── BorderInput/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── DimensionInput/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── FontInput/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── MarginAndPaddingInput/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ShadowInput/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── style.module.scss │ │ │ │ │ └── type.ts │ │ │ │ ├── Workbench/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.module.scss │ │ │ │ └── index.tsx │ │ │ ├── config/ │ │ │ │ └── colorPickerColorList.ts │ │ │ ├── core/ │ │ │ │ ├── assetPackagesListManage.ts │ │ │ │ └── pluginManager.ts │ │ │ ├── i18n/ │ │ │ │ ├── en_US/ │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── zh_CN/ │ │ │ │ └── index.ts │ │ │ ├── index.tsx │ │ │ ├── material/ │ │ │ │ ├── container.meta.ts │ │ │ │ └── innerMaterial.tsx │ │ │ ├── plugins/ │ │ │ │ ├── AdvancePanel/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.module.scss │ │ │ │ ├── ComponentLibrary/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── DragItem/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.module.scss │ │ │ │ │ │ └── ListView/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── style.module.scss │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── localize/ │ │ │ │ │ │ ├── en_US/ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── zh_CN/ │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── style.module.scss │ │ │ │ │ └── util.ts │ │ │ │ ├── ComponentStatePanel/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── Designer/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── Canvas/ │ │ │ │ │ │ │ ├── advanceCustomHook.ts │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.module.scss │ │ │ │ │ │ ├── DefaultSelectToolBar/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.module.scss │ │ │ │ │ │ └── GhostView/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── config.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── localize/ │ │ │ │ │ │ ├── en_US/ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── zh_CN/ │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── type.ts │ │ │ │ │ └── util.ts │ │ │ │ ├── DisplaySourceSchema/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── EventPanel/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── panel.tsx │ │ │ │ │ └── style.module.scss │ │ │ │ ├── GlobalStatePanel/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── localize/ │ │ │ │ │ │ ├── en_US/ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── zh_CN/ │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── style.module.scss │ │ │ │ ├── History/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── type.ts │ │ │ │ ├── Hotkeys/ │ │ │ │ │ ├── action.ts │ │ │ │ │ ├── hotKeyManager.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── keymap.ts │ │ │ │ │ ├── localize/ │ │ │ │ │ │ ├── en_US/ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── zh_CN/ │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── type.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── OutlineTree/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── TreeView/ │ │ │ │ │ │ ├── context.ts │ │ │ │ │ │ ├── dataStruct.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── style.module.scss │ │ │ │ │ │ └── treeNode.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── localize/ │ │ │ │ │ │ ├── en_US/ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── zh_CN/ │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── util.tsx │ │ │ │ ├── PropertyPanel/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── style.module.scss │ │ │ │ │ ├── utils.ts │ │ │ │ │ └── view.tsx │ │ │ │ ├── RightPanel/ │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── style.module.scss │ │ │ │ │ ├── type.ts │ │ │ │ │ └── view.tsx │ │ │ │ ├── VisualPanelPlus/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.module.scss │ │ │ │ └── index.tsx │ │ │ ├── stories/ │ │ │ │ ├── Button.jsx │ │ │ │ ├── Button.stories.js │ │ │ │ ├── Configure.mdx │ │ │ │ ├── Header.jsx │ │ │ │ ├── Header.stories.js │ │ │ │ ├── Page.jsx │ │ │ │ ├── Page.stories.js │ │ │ │ ├── assets/ │ │ │ │ │ └── avif-test-image.avif │ │ │ │ ├── button.css │ │ │ │ ├── components/ │ │ │ │ │ ├── CustomSchemaForm/ │ │ │ │ │ │ └── components/ │ │ │ │ │ │ └── Setters/ │ │ │ │ │ │ ├── actionFlow.stories.tsx │ │ │ │ │ │ └── mock.ts │ │ │ │ │ └── inputPlus.stories.tsx │ │ │ │ ├── header.css │ │ │ │ ├── page.css │ │ │ │ ├── plugins/ │ │ │ │ │ ├── CSSEditor.stories.tsx │ │ │ │ │ └── VisualPanelPlus.stories.tsx │ │ │ │ └── setters/ │ │ │ │ └── colorSetter.stories.tsx │ │ │ ├── style.d.ts │ │ │ ├── type.ts │ │ │ ├── typing.d.ts │ │ │ └── utils/ │ │ │ ├── css.ts │ │ │ ├── defaultEngineConfig.tsx │ │ │ ├── index.ts │ │ │ └── logger.ts │ │ └── tsconfig.json │ ├── engine-website-app/ │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── build.common.config.js │ │ ├── build.config.js │ │ ├── index.html │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── build-script-env.d.ts │ │ │ ├── index.css │ │ │ ├── index.tsx │ │ │ ├── lib/ │ │ │ │ └── index.tsx │ │ │ ├── page/ │ │ │ │ ├── Editor/ │ │ │ │ │ └── index.tsx │ │ │ │ └── Preview/ │ │ │ │ └── index.tsx │ │ │ ├── render.html │ │ │ ├── render.tsx │ │ │ ├── router.tsx │ │ │ └── typing.d.ts │ │ └── tsconfig.json │ ├── layout/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── __tests__/ │ │ │ └── demo.test.ts │ │ ├── build.config.js │ │ ├── index.html │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── public/ │ │ │ └── render.umd.js │ │ ├── src/ │ │ │ ├── _dev_/ │ │ │ │ ├── dev.css │ │ │ │ ├── dev.tsx │ │ │ │ ├── render.html │ │ │ │ └── render.tsx │ │ │ ├── build-script-env.d.ts │ │ │ ├── components/ │ │ │ │ ├── DefaultDropPlaceholder/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── DropAnchor/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── style.module.scss │ │ │ │ │ └── util.ts │ │ │ │ └── HighlightBox/ │ │ │ │ ├── index.tsx │ │ │ │ └── style.module.scss │ │ │ ├── core/ │ │ │ │ ├── dragAndDrop/ │ │ │ │ │ ├── common.ts │ │ │ │ │ ├── emitter.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── sensor.ts │ │ │ │ └── iframeContainer/ │ │ │ │ └── index.tsx │ │ │ ├── index.module.scss │ │ │ ├── index.tsx │ │ │ ├── render.ts │ │ │ ├── types/ │ │ │ │ ├── dragAndDrop.ts │ │ │ │ └── index.ts │ │ │ ├── typing.d.ts │ │ │ └── utils/ │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── material/ │ │ ├── .gitignore │ │ ├── .prettierrc.json │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── __tests__/ │ │ │ └── demo.test.ts │ │ ├── build.config.ts │ │ ├── index.html │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── _dev_/ │ │ │ │ ├── editor.tsx │ │ │ │ ├── index.scss │ │ │ │ ├── index.tsx │ │ │ │ ├── preview.tsx │ │ │ │ ├── react.ts │ │ │ │ ├── render.html │ │ │ │ ├── render.tsx │ │ │ │ └── router.tsx │ │ │ ├── components/ │ │ │ │ ├── ReactGridLayout/ │ │ │ │ │ ├── GridItem.tsx │ │ │ │ │ ├── config.ts │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── edit/ │ │ │ │ │ │ └── layoutWrap.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── item.meta.tsx │ │ │ │ │ ├── layout.scss │ │ │ │ │ ├── meta.tsx │ │ │ │ │ ├── snippets.ts │ │ │ │ │ ├── style.module.scss │ │ │ │ │ └── type.ts │ │ │ │ └── index.ts │ │ │ ├── index.tsx │ │ │ ├── meta.tsx │ │ │ └── vite-env.d.ts │ │ └── tsconfig.json │ ├── model/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── __tests__/ │ │ │ ├── Material/ │ │ │ │ └── index.test.ts │ │ │ ├── Page/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── index.test.ts.snap │ │ │ │ ├── editMethods.test.ts │ │ │ │ └── index.test.ts │ │ │ ├── Schema/ │ │ │ │ └── Node.test.ts │ │ │ └── demo.test.ts │ │ ├── build.config.js │ │ ├── index.html │ │ ├── jest.config.js │ │ ├── jest.setup.js │ │ ├── mockPage/ │ │ │ ├── basePage.ts │ │ │ ├── material.ts │ │ │ └── simplePage.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Material/ │ │ │ │ ├── index.test.ts │ │ │ │ └── index.ts │ │ │ ├── Page/ │ │ │ │ ├── RootNode/ │ │ │ │ │ ├── Node/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── prop.ts │ │ │ │ │ │ └── slot.ts │ │ │ │ │ └── index.ts │ │ │ │ └── index.ts │ │ │ ├── build-script-env.d.ts │ │ │ ├── const/ │ │ │ │ ├── eventList.ts │ │ │ │ └── schema.ts │ │ │ ├── index.ts │ │ │ ├── types/ │ │ │ │ ├── base.ts │ │ │ │ ├── material.ts │ │ │ │ ├── node.ts │ │ │ │ ├── page.ts │ │ │ │ └── rootNode.ts │ │ │ └── util/ │ │ │ ├── dataCheck.ts │ │ │ ├── index.ts │ │ │ ├── lodash.ts │ │ │ └── modelEmitter.ts │ │ └── tsconfig.json │ └── render/ │ ├── .gitignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── __tests__/ │ │ └── demo.test.ts │ ├── build.config.ts │ ├── index.html │ ├── jest.config.js │ ├── package.json │ ├── src/ │ │ ├── _dev_/ │ │ │ ├── components.tsx │ │ │ ├── dev.tsx │ │ │ ├── index.css │ │ │ ├── page/ │ │ │ │ ├── DesignerRenderDemo.tsx │ │ │ │ └── RenderDemo.tsx │ │ │ ├── router.tsx │ │ │ └── testPageData.ts │ │ ├── build-script-env.d.ts │ │ ├── commonComponent/ │ │ │ └── index.tsx │ │ ├── const/ │ │ │ └── index.ts │ │ ├── core/ │ │ │ ├── ReactAdapter/ │ │ │ │ ├── buildComponent.ts │ │ │ │ ├── convertModelToComponent.ts │ │ │ │ ├── help.ts │ │ │ │ ├── index.ts │ │ │ │ ├── transformProps/ │ │ │ │ │ ├── actionNode.ts │ │ │ │ │ └── index.ts │ │ │ │ └── type.ts │ │ │ ├── ReactErrorBoundary.ts │ │ │ ├── adapter.ts │ │ │ ├── designReactRender.ts │ │ │ ├── refManager.ts │ │ │ ├── render.ts │ │ │ ├── storeManager.ts │ │ │ ├── type.ts │ │ │ └── variableManager.ts │ │ ├── index.ts │ │ └── util/ │ │ ├── assetsLoader.ts │ │ ├── codeRuntimeHelper.ts │ │ ├── index.ts │ │ └── reactHelp.ts │ └── tsconfig.json └── pnpm-workspace.yaml ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms github: [hlerenow] patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry custom: # ['https://github.com/sponsors/hlerenow?frequency=one-time&sponsor=hlerenow'] ================================================ FILE: .github/workflows/static.yml ================================================ name: Deploy static content to Pages on: push: branches: [master] workflow_dispatch: concurrency: group: 'pages' cancel-in-progress: true jobs: build: permissions: write-all runs-on: ubuntu-latest steps: - name: Use Node.js 18.x uses: actions/setup-node@v3 with: node-version: 18.20.8 - name: Checkout code uses: actions/checkout@v3 - uses: pnpm/action-setup@v2 with: version: 8 - run: | pnpm -v node -v npm -v pnpm install --no-frozen-lockfile pnpm run build cd packages/engine-website-app/dist mkdir documents cp -r ../../docs-app/dist/* ./documents - name: Upload build artifacts uses: actions/upload-pages-artifact@v3 with: name: github-pages path: 'packages/engine-website-app/dist' deploy: runs-on: ubuntu-latest needs: build # Ensure deployment happens after build permissions: write-all environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} steps: - name: Download build artifact uses: actions/download-artifact@v4 with: name: github-pages - name: Setup Pages uses: actions/configure-pages@v2 - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 ================================================ FILE: .gitignore ================================================ # See http://help.github.com/ignore-files/ for more about ignoring files. # compiled output dist tmp /out-tsc # dependencies node_modules # JetBrains IDEs .idea *.iml *.iws # IDEs and editors /.idea .project .classpath .c9/ *.launch .settings/ *.sublime-workspace # IDE - VSCode .vscode/* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json # misc /.sass-cache /connect.lock /coverage /libpeerconnection.log npm-debug.log yarn-error.log testem.log /typings # System Files .DS_Store Thumbs.db # Generated Docusaurus files .docusaurus/ .cache-loader/ *.js.map *error.log packages/build-script/lib/* stats.html example # drawio *.bkp *.dtmp *.eslintcache ================================================ FILE: .husky/pre-commit ================================================ #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" npx lint-staged ================================================ FILE: .npmrc ================================================ registry=https://registry.npmjs.org/ ================================================ FILE: .prettierignore ================================================ # Ignore artifacts: build coverage # Ignore all HTML files: *.html **/.git **/.svn **/.hg **/node_modules ================================================ FILE: .prettierrc.json ================================================ { "trailingComma": "es5", "tabWidth": 2, "semi": true, "singleQuote": true, "printWidth": 120 } ================================================ FILE: .vscode/settings.json ================================================ { "cSpell.words": [ "chamn", "crossorigin", "CSSUI", "JSEXPRESSION", "lowcode", "monac", "PNPM", "superstruct" ] } ================================================ FILE: BUILD_FIX_SUMMARY.md ================================================ # 构建配置修复总结 ## 问题描述 1. **CommonJS 引入问题**:错误提示 `Missing "./src/types/material" specifier in "@chamn/model" package` 2. **ES 模块不纯净**:构建出的 ES 模块将 React 及其运行时打包进去,而不是作为外部依赖 ## 根本原因 ### 1. 源码路径导入 代码中使用了 `@chamn/model/src/types/material` 这样的源码路径,但 package.json 的 `exports` 字段未定义该路径。 ### 2. External 配置不完整 - `external: ['react', 'react-dom']` 只能匹配精确的模块名 - 无法匹配 `react/jsx-runtime`、`react-dom/client` 等子路径 - 导致 React JSX 运行时被打包进最终产物 ### 3. 构建配置覆盖问题 `vite.build.rollupOptions` 会覆盖而非合并基础配置中的 `external`。 ## 修复方案 ### 1. 修复源码导入路径 **修改文件:** - `packages/engine/src/component/CustomSchemaForm/index.tsx` - `packages/engine/src/plugins/OutlineTree/util.tsx` **修改前:** ```typescript import { getMTitle } from '@chamn/model/src/types/material'; import { ShapeSetterObjType } from '@chamn/model/src/types/material'; ``` **修改后:** ```typescript import { getMTitle, ShapeSetterObjType } from '@chamn/model'; ``` ### 2. 更新 Package.json 导出配置 **修改文件:** - `packages/engine/package.json` - `packages/layout/package.json` **修改内容:** ```json { "main": "dist/index.cjs.js", "module": "dist/index.es.js", "exports": { ".": { "types": "./dist/index.d.ts", "module-sync": "./dist/index.es.js", "import": "./dist/index.es.js", "require": "./dist/index.cjs.js" } } } ``` ### 3. 使用函数形式自动外部化所有 node_modules(最佳实践) **修改文件:** - `packages/build-script/src/config/base.ts` - `packages/engine/build.config.ts` - `packages/model/build.config.js` - `packages/layout/build.config.js` - `packages/render/build.config.ts` **关键修改:** ```typescript // build-script/src/config/base.ts export type BuildScriptConfig = { external?: (string | RegExp)[] | ((id: string, importer?: string, isResolved?: boolean) => boolean); // ... 其他配置 }; ``` ```typescript // engine/build.config.ts external: (id) => { // 排除相对路径、绝对路径和别名路径(项目内部文件) if (id.startsWith('.') || id.startsWith('/') || id.startsWith('@/')) { return false; } // 外部化所有 node_modules 中的包 return true; }, ``` **优势:** - ✅ 自动外部化所有 node_modules 依赖,无需手动维护列表 - ✅ 支持子路径(如 `react/jsx-runtime`、`antd/es/tag/CheckableTag`) - ✅ 避免遗漏新增的依赖包 ### 4. 简化构建配置 **修改前(engine/build.config.ts):** ```typescript vite: { build: { rollupOptions: { external: [...], // 这会覆盖基础配置 } } } ``` **修改后:** ```typescript // 顶层配置 external,由 vite.common.ts 自动转换 external: [/^react($|\/)/, ...], vite: { // 不再重复配置 build.rollupOptions define: { ... } } ``` ## 验证结果 ### 构建输出对比 **修复前:** - `index.es.js`: 100,520 行 - 包含内联的 react-jsx-runtime 代码 - 文件大小:~3.5MB **第一次修复后(使用正则表达式):** - `index.es.js`: 94,484 行(减少 6,036 行) - 正确使用 `import { jsx, jsxs } from "react/jsx-runtime"` - 文件大小:~3.49MB(减少约 10KB) **最终修复后(自动外部化所有 node_modules):** - `index.es.js`: 11,551 行(减少 88,969 行,88.5% 体积减少!) - 所有依赖都被正确外部化 - 文件大小:327KB(减少 3.17MB,90.7% 体积减少!) ### 构建日志 ``` No name was provided for external module "react/jsx-runtime" in "output.globals" – guessing "jsxRuntime". ``` 这条警告证明 `react/jsx-runtime` 被正确识别为外部依赖。 ### 代码检查 ```javascript // 修复后的 dist/index.es.js 开头 import { jsx as W, jsxs as He, Fragment as Ht } from "react/jsx-runtime"; import * as We from "react"; import he, { memo, useCallback, ... } from "react"; import BR, { flushSync, createPortal, ... } from "react-dom"; ``` ## 最佳实践 1. **External 配置(推荐)**:使用函数形式自动外部化所有 node_modules ```typescript external: (id) => { if (id.startsWith('.') || id.startsWith('/') || id.startsWith('@/')) { return false; } return true; } ``` 2. **导入路径**:始终从包的主入口导入,避免使用源码路径 3. **Package.json**:确保 `main`、`module`、`exports` 字段与实际构建输出一致 4. **构建配置**:在顶层配置 `external`,避免在 `vite.build.rollupOptions` 中重复配置 5. **别名路径**:确保项目内部的别名路径(如 `@/`)不被外部化 ## 相关文件清单 ### 修改的文件 - `packages/build-script/src/config/base.ts` - `packages/build-script/src/config/vite.build.ts` - `packages/engine/build.config.ts` - `packages/engine/package.json` - `packages/engine/src/component/CustomSchemaForm/index.tsx` - `packages/engine/src/plugins/OutlineTree/util.tsx` - `packages/model/build.config.js` - `packages/layout/build.config.js` - `packages/layout/package.json` - `packages/render/build.config.ts` ### 构建命令 ```bash # 重新构建所有包 npm run build # 或单独构建 cd packages/engine && npm run build cd packages/model && npm run build cd packages/layout && npm run build cd packages/render && npm run build ``` ## 注意事项 1. 所有依赖包都需要重新构建 2. 确保 peerDependencies 中的 react 版本与项目一致 3. UMD 格式需要在 `global` 配置中为外部依赖提供全局变量名 ================================================ FILE: CHANGELOG.md ================================================ # Change Log All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. ## [0.10.4](https://github.com/ByteCrazy/chameleon/compare/v0.10.3...v0.10.4) (2026-01-17) ### 🐛 Bug Fixes | Bug 修复 * **engine, engine-website-app:** 🐛 fixed pkg deps ([22b0000](https://github.com/ByteCrazy/chameleon/commit/22b0000a921ed3bd63cdf3366687184d51ee9dc5)) ## [0.10.3](https://github.com/ByteCrazy/chameleon/compare/v0.10.2...v0.10.3) (2026-01-17) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed engine deps ([c1addf4](https://github.com/ByteCrazy/chameleon/commit/c1addf43214d016e466019a5aabb8960881b6418)) ## [0.10.2](https://github.com/ByteCrazy/chameleon/compare/v0.10.1...v0.10.2) (2026-01-17) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed string and text can not input chinese text ([3821d00](https://github.com/ByteCrazy/chameleon/commit/3821d00d5dffd7d70e995690df5358f5a596ae93)) ## [0.10.1](https://github.com/ByteCrazy/chameleon/compare/v0.10.0...v0.10.1) (2026-01-11) ### ✨ Features | 新功能 * **build-script, demo-page, engine, render:** 🎸 update build script dts & optimize modal root selector ([024d5ab](https://github.com/ByteCrazy/chameleon/commit/024d5ab26d19fc5f50172c328638a551fb99c129)) * **docs-app, render:** 🎸 adapte ssr render ([7f19d8f](https://github.com/ByteCrazy/chameleon/commit/7f19d8f9084e16de27460bc1e5dea28eba31d6dd)) ## [0.10.0](https://github.com/hlerenow/chameleon/compare/v0.9.3...v0.10.0) (2025-12-25) ### ✨ Features | 新功能 * **engine:** 🎸 optimize emptyValueSetter auto trigger value update ([a2b0409](https://github.com/hlerenow/chameleon/commit/a2b04094035d421638d4657d31fd2b417906e9c6)) ### 🐛 Bug Fixes | Bug 修复 * 优化构建配置,修复 ES 模块外部化问题 ([866f0ae](https://github.com/hlerenow/chameleon/commit/866f0ae39472625137d73d143625d88d873f6c00)) ### 📝 Documentation | 文档 * 添加 GridLayout 代码示例和插件开发文档 ([cade905](https://github.com/hlerenow/chameleon/commit/cade90591efff604a8ab3395c905c4f713ba2b93)) * **build-script:** 添加完整的 README 使用文档 ([fcd6172](https://github.com/hlerenow/chameleon/commit/fcd6172e381364f010986864593264b160380342)) ## [0.9.3](https://github.com/ByteCrazy/chameleon/compare/v0.9.2...v0.9.3) (2025-07-20) ### ✨ Features | 新功能 * **engine, render:** 🎸 add $EVENT_PARAMS and remove $Event $PARAMS_RUNTIME ([b8e58c1](https://github.com/ByteCrazy/chameleon/commit/b8e58c1e5e98d2e4b3d31e2ba52a26fda256eb47)) ### 🐛 Bug Fixes | Bug 修复 * **render:** 🐛 fixed style props not apply to dom from props ([2e0c80a](https://github.com/ByteCrazy/chameleon/commit/2e0c80ad02881319089b1b08225c325e37a41c6c)) ## [0.9.2](https://github.com/ByteCrazy/chameleon/compare/v0.9.1...v0.9.2) (2025-07-13) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed call node method setting ([27ea497](https://github.com/ByteCrazy/chameleon/commit/27ea49747ca8dd24f862304ec552e805c9057e62)) * **render:** 🐛 fixed ref get not correct on designer mode ([14544f4](https://github.com/ByteCrazy/chameleon/commit/14544f45a5dadeacfab5a711504b9a736ee7835e)) ## [0.9.1](https://github.com/ByteCrazy/chameleon/compare/v0.9.0...v0.9.1) (2025-07-13) ### 🐛 Bug Fixes | Bug 修复 * **engine, render:** 🐛 fixed CustomSchemaForm title ([178cddd](https://github.com/ByteCrazy/chameleon/commit/178cddd3e8d9147822e91fcd1ce7d8e08c70d924)) ## [0.9.0](https://github.com/ByteCrazy/chameleon/compare/v0.8.6...v0.9.0) (2025-07-13) ### 👷 Continuous Integration | CI 配置 * 🎡 upgrade node version to 18.20.8 ([0a68c22](https://github.com/ByteCrazy/chameleon/commit/0a68c22dc7d320c3139687c956c126816b453fb4)) ### ✨ Features | 新功能 * **engine, model:** 🎸 support EmptyValueSetter ([da1e36f](https://github.com/ByteCrazy/chameleon/commit/da1e36f9915282b3f7cb40672cf2a000bd4162e5)) ## [0.8.6](https://github.com/ByteCrazy/chameleon/compare/v0.8.5...v0.8.6) (2025-06-21) ### 🐛 Bug Fixes | Bug 修复 * **demo-page, engine, render:** 🐛 fixed action flow failed node not connect correct ([e235a2b](https://github.com/ByteCrazy/chameleon/commit/e235a2be2d1e1935dfc40b56936de763efc4fb67)) * **render:** 🐛 fixed $RESPONSE value is error ([dee9906](https://github.com/ByteCrazy/chameleon/commit/dee9906c967eb079d5a7e53431dc9d29458195c8)) ## [0.8.5](https://github.com/ByteCrazy/chameleon/compare/v0.8.4...v0.8.5) (2025-04-13) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed custom seeter not register success ([19d739a](https://github.com/ByteCrazy/chameleon/commit/19d739a97000641846c02ec19555926fe88ce3b4)) ## [0.8.4](https://github.com/ByteCrazy/chameleon/compare/v0.8.3...v0.8.4) (2025-04-13) ### ✨ Features | 新功能 * **engine:** 🎸 optimize action flow layout ([9c970c9](https://github.com/ByteCrazy/chameleon/commit/9c970c9482274d4d5cf6beb76912a10784e62c79)) ### 🐛 Bug Fixes | Bug 修复 * **engine, render:** 🐛 CSS editor value update error ([209106a](https://github.com/ByteCrazy/chameleon/commit/209106a6a71819862626ee39c887d1835a8b5611)) * **engine, render:** 🐛 fixed event not trigger when loop ([e3a10a8](https://github.com/ByteCrazy/chameleon/commit/e3a10a8ab77a3c5321f47440c7bdc2ad52e82ee2)) ## [0.8.3](https://github.com/ByteCrazy/chameleon/compare/v0.8.2...v0.8.3) (2025-04-12) **Note:** Version bump only for package chameleon ## [0.8.2](https://github.com/ByteCrazy/chameleon/compare/v0.8.1...v0.8.2) (2025-04-11) ### 🐛 Bug Fixes | Bug 修复 * **engine, render:** 🐛 fixed functionSeter and expressionSetter dts ([1e326e2](https://github.com/ByteCrazy/chameleon/commit/1e326e288f8d072497c01c1ccb0c06bed0521949)) ## [0.8.1](https://github.com/ByteCrazy/chameleon/compare/v0.8.0...v0.8.1) (2025-04-10) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed globalStateDts ([03c0b71](https://github.com/ByteCrazy/chameleon/commit/03c0b714343a7cf76710b164a43008af430b1d7c)) ## [0.8.0](https://github.com/ByteCrazy/chameleon/compare/v0.7.0...v0.8.0) (2025-04-10) ### ✨ Features | 新功能 * **demo-page, engine, render:** 🎸 update run time var for function ([d8fb90a](https://github.com/ByteCrazy/chameleon/commit/d8fb90ac72a233d7fdb5fcb36e0b7963f83c5acf)) * **engine, model, render:** 🎸 fixed cycle update when update value in mount ([9b30922](https://github.com/ByteCrazy/chameleon/commit/9b30922ffac4a5b4fb1fe123c4604cc0fff63911)) * **engine, render:** 🎸 optimize expression setter ([07c11e9](https://github.com/ByteCrazy/chameleon/commit/07c11e9bdf011f70763623d6a2f185a3c3830e5e)) * **engine, render:** 🎸 optimize globalState update ([4e7bb6a](https://github.com/ByteCrazy/chameleon/commit/4e7bb6ab68cd69fe6d429abe417587c3ac26eb18)) * **engine:** 🎸 dynamic generate page dts ([2dc1a0b](https://github.com/ByteCrazy/chameleon/commit/2dc1a0bca0a53223b61b8c4ce216b26a70887c96)) * **engine:** 🎸 optimize express setter ([37141f9](https://github.com/ByteCrazy/chameleon/commit/37141f97a98e53e0050e328c2de03341984b3ad5)) ## [0.7.0](https://github.com/ByteCrazy/chameleon/compare/v0.6.0...v0.7.0) (2025-04-06) ### ✨ Features | 新功能 * **engine, layout:** 🎸 optimize select node interactive time ([41d105c](https://github.com/ByteCrazy/chameleon/commit/41d105c2408458b38cda0c9fac601dd89fd744aa)) * **engine:** 🎸 add css code editor ([7715f29](https://github.com/ByteCrazy/chameleon/commit/7715f29cd49d530e54941c85659ca3c671be91e3)) * **engine:** 🎸 optimize style UI panel ([0d6f239](https://github.com/ByteCrazy/chameleon/commit/0d6f2394281bf4add5437b0c6e4c681f5d64d6e3)) ### 🐛 Bug Fixes | Bug 修复 * **engine, layout:** 🐛 optimize select active box ([b1a6041](https://github.com/ByteCrazy/chameleon/commit/b1a604140652f1c0871a463bc32020c39a07846c)) ## [0.6.0](https://github.com/ByteCrazy/chameleon/compare/v0.5.2...v0.6.0) (2025-03-30) ### ✨ Features | 新功能 * **engine:** 🎸 support config monacoEdito cdn url ([32d08bc](https://github.com/ByteCrazy/chameleon/commit/32d08bcaec7ebe8a187d0b2eae8bd5e4b64b3dc9)) ## [0.5.2](https://github.com/ByteCrazy/chameleon/compare/v0.5.1...v0.5.2) (2025-03-30) ### ✨ Features | 新功能 * **model:** 🎸 support export sxtra ([272de8d](https://github.com/ByteCrazy/chameleon/commit/272de8d989c3085830bf37469885c7a92abaf0da)) ## [0.5.1](https://github.com/ByteCrazy/chameleon/compare/v0.5.0...v0.5.1) (2025-03-30) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed search status reset ([994b36c](https://github.com/ByteCrazy/chameleon/commit/994b36ce744fd10002cf2996ae26702a959ef5b4)) ## [0.5.0](https://github.com/ByteCrazy/chameleon/compare/v0.4.0...v0.5.0) (2025-03-30) ### ✨ Features | 新功能 * **engine:** 🎸 componentLib add search and customSearchBar ([4801f40](https://github.com/ByteCrazy/chameleon/commit/4801f403da1af705d5dc5eef579e7dba6560b08f)) ## [0.4.0](https://github.com/ByteCrazy/chameleon/compare/v0.3.21...v0.4.0) (2025-03-29) ### ✨ Features | 新功能 * **model:** 🎸 update model define, add extra T ([f098ad2](https://github.com/ByteCrazy/chameleon/commit/f098ad26dc7525749d280445202971ede12490f4)) ## [0.3.21](https://github.com/ByteCrazy/chameleon/compare/v0.3.20...v0.3.21) (2025-03-26) ### 🐛 Bug Fixes | Bug 修复 * **engine, material:** 🐛 fixed RGLEL cycle update item ([f045818](https://github.com/ByteCrazy/chameleon/commit/f045818d6d1e1b4dbcf107d727976f6d92600b94)) ## [0.3.20](https://github.com/ByteCrazy/chameleon/compare/v0.3.19...v0.3.20) (2025-03-26) ### 🐛 Bug Fixes | Bug 修复 * **material:** 🐛 fixed meterial meta not export ([aaea9bd](https://github.com/ByteCrazy/chameleon/commit/aaea9bd8fb95aa007b3b6ccd06e4b3171af35926)) ## [0.3.19](https://github.com/ByteCrazy/chameleon/compare/v0.3.18...v0.3.19) (2025-03-26) **Note:** Version bump only for package chameleon ## [0.3.18](https://github.com/ByteCrazy/chameleon/compare/v0.3.17...v0.3.18) (2025-03-26) **Note:** Version bump only for package chameleon ## [0.3.17](https://github.com/ByteCrazy/chameleon/compare/v0.3.16...v0.3.17) (2025-03-25) ### 🐛 Bug Fixes | Bug 修复 * **engine, material, model, render:** 🐛 fixed node update value material is undefined ([969174d](https://github.com/ByteCrazy/chameleon/commit/969174da968aec4a1ee1fec7ca44a5e459be56bc)) ## [0.3.16](https://github.com/ByteCrazy/chameleon/compare/v0.3.15...v0.3.16) (2025-03-24) ### ✨ Features | 新功能 * **engine:** 🎸 setter supprot get current nodemodel ([f59a136](https://github.com/ByteCrazy/chameleon/commit/f59a136cc134388c382827d731f683e9d9a298e5)) ## [0.3.15](https://github.com/ByteCrazy/chameleon/compare/v0.3.14...v0.3.15) (2025-03-23) ### 🐛 Bug Fixes | Bug 修复 * **layout:** 🐛 fixed canvas default css ([41d0ebd](https://github.com/ByteCrazy/chameleon/commit/41d0ebd91b0d9a9fa2d1b7892ec1ec82ecd44a33)) ## [0.3.14](https://github.com/ByteCrazy/chameleon/compare/v0.3.13...v0.3.14) (2025-03-23) ### ✨ Features | 新功能 * **layout:** 🎸 ban drag img audio viewo el at editor canvas ([0f2624b](https://github.com/ByteCrazy/chameleon/commit/0f2624bd45eada0290610f7bb52e1683c0c84189)) ## [0.3.13](https://github.com/ByteCrazy/chameleon/compare/v0.3.12...v0.3.13) (2025-03-23) ### ✨ Features | 新功能 * **render:** 🎸 redner support config document context ([8d3c041](https://github.com/ByteCrazy/chameleon/commit/8d3c041263ed567a1e91087abcde382519876b2e)) ## [0.3.12](https://github.com/ByteCrazy/chameleon/compare/v0.3.11...v0.3.12) (2025-03-23) ### 🐛 Bug Fixes | Bug 修复 * **engine, layout:** 🐛 fixed drag interactive and fixed accetpNode action ([c15d03c](https://github.com/ByteCrazy/chameleon/commit/c15d03cc0406533e5eab55e27ce5eb1223d91c72)) ## [0.3.11](https://github.com/ByteCrazy/chameleon/compare/v0.3.10...v0.3.11) (2025-03-22) ### 🐛 Bug Fixes | Bug 修复 * **render:** 🐛 fixed PlaceHoder UI ([349a951](https://github.com/ByteCrazy/chameleon/commit/349a951ac9e2351acb0c556bc0ecb4295367e94e)) ## [0.3.10](https://github.com/ByteCrazy/chameleon/compare/v0.3.9...v0.3.10) (2025-03-22) ### 🐛 Bug Fixes | Bug 修复 * **layout:** 🐛 fixed placeholder UI ([7134583](https://github.com/ByteCrazy/chameleon/commit/71345836c5575399f2fadcd4be5773c593efb95f)) ## [0.3.9](https://github.com/ByteCrazy/chameleon/compare/v0.3.8...v0.3.9) (2025-03-22) ### ✨ Features | 新功能 * **engine, layout:** 🎸 optimize drag interactive ([f512f14](https://github.com/ByteCrazy/chameleon/commit/f512f14ecf3caaa148279543999a74d35ae44701)) ## [0.3.8](https://github.com/ByteCrazy/chameleon/compare/v0.3.7...v0.3.8) (2025-03-16) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed customAdvanceHook not rect on outline and hotkey ([c21bdb0](https://github.com/ByteCrazy/chameleon/commit/c21bdb0e275ebe4ae096d18b90bd406874c9de79)) ## [0.3.7](https://github.com/ByteCrazy/chameleon/compare/v0.3.6...v0.3.7) (2025-03-16) ### ✨ Features | 新功能 * **demo-page, engine, model, render:** 🎸 support inject eng inner env to runtime ([baa5c11](https://github.com/ByteCrazy/chameleon/commit/baa5c11d389019a7e4e4b8e000433a99038b4ae3)) ## [0.3.6](https://github.com/ByteCrazy/chameleon/compare/v0.3.5...v0.3.6) (2025-03-09) ### ✨ Features | 新功能 * **engine:** 🎸 add hiddenWidget for eng and optimize setter ([42b9846](https://github.com/ByteCrazy/chameleon/commit/42b984681a9efc7cdee7dc4287cd994fd37c592c)) ## [0.3.5](https://github.com/ByteCrazy/chameleon/compare/v0.3.4...v0.3.5) (2025-03-09) ### ✨ Features | 新功能 * **engine, layout:** 🎸 support controll preview mode ([97b83e5](https://github.com/ByteCrazy/chameleon/commit/97b83e58f0f22c76da51e5a3d22db2c82a2f70d2)) * **engine:** 🎸 add workbench widget control config ([0fcab5b](https://github.com/ByteCrazy/chameleon/commit/0fcab5b5ad715762327c26d3f7eae4680604644b)) ### 🐛 Bug Fixes | Bug 修复 * **demo-page, engine, render:** 🐛 fixed action flow only run first node ([c4bdb85](https://github.com/ByteCrazy/chameleon/commit/c4bdb85d0ca6ed09c6c66d15847de5bd14da556e)) * **engine, model:** 🐛 update select setter name ([054fd48](https://github.com/ByteCrazy/chameleon/commit/054fd48f49ec1d1bdb79d7bac44acedb601d6fdf)) * **engine:** 🐛 fixed last connect line not save ([2bacb15](https://github.com/ByteCrazy/chameleon/commit/2bacb1541cbc753df15a0216df9d6d6aac86cb1d)) ## [0.3.4](https://github.com/ByteCrazy/chameleon/compare/v0.3.3...v0.3.4) (2025-02-16) ### ✨ Features | 新功能 * **engine, layout, render:** 🎸 action node express support $response ([9bf1570](https://github.com/ByteCrazy/chameleon/commit/9bf1570c3b80404be78a5d3ca2c401464e7645d3)) ## [0.3.3](https://github.com/ByteCrazy/chameleon/compare/v0.3.2...v0.3.3) (2025-02-16) ### ✨ Features | 新功能 * **engine:** 🎸 JSON setter support reactive value ([0262067](https://github.com/ByteCrazy/chameleon/commit/0262067fc641b8dd3c812cd3cf1f114df7e33f9c)) ## [0.3.2](https://github.com/ByteCrazy/chameleon/compare/v0.3.1...v0.3.2) (2025-02-16) ### ✨ Features | 新功能 * **engine:** 🎸 optimize TCustomAPIInput type ([1b33f75](https://github.com/ByteCrazy/chameleon/commit/1b33f75a8b6e324b1f7695a62dfa1ae97d115cc7)) ## [0.3.1](https://github.com/ByteCrazy/chameleon/compare/v0.3.0...v0.3.1) (2025-02-16) ### ✨ Features | 新功能 * **engine, render:** 🎸 optimize CustomAPISelectInput from and event list label ([8dbf5af](https://github.com/ByteCrazy/chameleon/commit/8dbf5af08e50c60c5ff7adc5c7e644c4ca1a9c08)) ## [0.3.0](https://github.com/ByteCrazy/chameleon/compare/v0.2.4...v0.3.0) (2025-02-15) ### ♻️ Code Refactoring | 代码重构 * **render:** 💡 optimize convertModelToComponent code logic ([3334dd5](https://github.com/ByteCrazy/chameleon/commit/3334dd5f421b0d1b78ccde403c9673cadcea91da)) ### 🐛 Bug Fixes | Bug 修复 * **engine, engine-website-app, material, model, render:** 🐛 fixed GRL hidden offsetY loop add size ([3df132b](https://github.com/ByteCrazy/chameleon/commit/3df132b6493026b42435d4868d77915b9f7316b2)) * **engine:** 🐛 fixed ActionFlowSetter cicle deps ([b9bd177](https://github.com/ByteCrazy/chameleon/commit/b9bd177e38be054a8860d19516651d9ab813e27b)) * **engine:** 🐛 fixed ActionFlowSetter cycle deps ([e69dfd7](https://github.com/ByteCrazy/chameleon/commit/e69dfd7df7129a88c54e238a05b96bb3270fbb2f)) * **engine:** 🐛 fixed ActionFlowSetter update problem ([0034848](https://github.com/ByteCrazy/chameleon/commit/0034848e31c3b30b6782723af10e7f8e0152390a)) * **engine:** 🐛 fixed outline drag excepetion after remove page ([82ff3fd](https://github.com/ByteCrazy/chameleon/commit/82ff3fd80ffce58b2b840ae219d29e61dd34a6e4)) * **engine:** 🐛 resolve hot key confict with action flow setter ([e91898c](https://github.com/ByteCrazy/chameleon/commit/e91898c8deae98805ea2df7a1e8f3bc382bd3873)) ### ✨ Features | 新功能 * **demo-page, engine, model, render:** 🎸 action node use link struct ([599ece4](https://github.com/ByteCrazy/chameleon/commit/599ece4927523f7c0e330cac722c9c9e6976ea3c)) * **demo-page, engine, model, render:** 🎸 add event panel ([e8c5648](https://github.com/ByteCrazy/chameleon/commit/e8c5648017b40cbae42c576267d1e3b9d9660918)) * **demo-page, engine, model, render:** 🎸 support TActionLogicItem prop ([e1b9d1e](https://github.com/ByteCrazy/chameleon/commit/e1b9d1e150ae810750249322ddf906b62eee9969)) * **demo-page, model, render:** 🎸 optimize afterResponse ([b4060ba](https://github.com/ByteCrazy/chameleon/commit/b4060ba0a0a01960ae5f8dffea159e2d5ea680b6)) * **demo-page, model, render:** 🎸 support ASSIGN_VALUE node ([74c395b](https://github.com/ByteCrazy/chameleon/commit/74c395baec55911de734e47d4a270f9cf016ee21)) * **demo-page, model:** 🎸 define action and event type ([f7ca5d3](https://github.com/ByteCrazy/chameleon/commit/f7ca5d3b8ad7610f840845f555bfcdb2adddae0a)) * **demo-page, render:** 🎸 getMethods support get methods from ref ([0a26967](https://github.com/ByteCrazy/chameleon/commit/0a2696739eee29c3e30b805d537605a06496ebc5)) * **demo-page, render:** 🎸 support eventListener attr ([fa0977f](https://github.com/ByteCrazy/chameleon/commit/fa0977fab37b961d1b7a0b04c8e528e43ab9503f)) * **demo-page, render:** 🎸 support ON_DID_RENDER and ON_WILL_DESTROY inner event ([b4743e8](https://github.com/ByteCrazy/chameleon/commit/b4743e855766b69a8c5bc58ea3849694948bd501)) * **docs-app, engine, engine-website-app, layout, material, model, render:** 🎸 do ActionFlowSetter 50% ([6399466](https://github.com/ByteCrazy/chameleon/commit/6399466c7253436591e071df25828a357bb7089e)) * **engine, engine-website-app, render:** 🎸 RequestAPINode support custom select ([5b72385](https://github.com/ByteCrazy/chameleon/commit/5b72385673bb646aff3ad2c5a9d8fffa142733dd)) * **engine, model:** 🎸 add call node method node ([1a5e79c](https://github.com/ByteCrazy/chameleon/commit/1a5e79c49964c589da167b64985327a3cbb03da8)) * **engine, model:** 🎸 add run code node ([7ac6182](https://github.com/ByteCrazy/chameleon/commit/7ac61829586a19d4fcdc1765fa878d6a16008858)) * **engine, model:** 🎸 request API 70% ([cee1228](https://github.com/ByteCrazy/chameleon/commit/cee1228c2a3265320cb32579f6f7b532b6962908)) * **engine:** 🎸 add react-flow ([fafaaf9](https://github.com/ByteCrazy/chameleon/commit/fafaaf95c589c0c99ce0953f285bf53a0e423e21)) * **engine:** 🎸 JumpLinkNode 100% ([ed0707e](https://github.com/ByteCrazy/chameleon/commit/ed0707e0232bf82bedc7b0db569c908d2001e6d7)) * **engine:** 🎸 optimize ActionFlowSetter ([fa9af2f](https://github.com/ByteCrazy/chameleon/commit/fa9af2fba32f921411ed05e8d7e68293de5dde88)) * **engine:** 🎸 optimize call node method node ([0b00029](https://github.com/ByteCrazy/chameleon/commit/0b00029627d6f90381b658ccc7f125e9b6116dcf)) * **engine:** 🎸 optimize MoveableModal interactive ([2eccb94](https://github.com/ByteCrazy/chameleon/commit/2eccb942b447fa4e54bcd6f9207a2ed053e06526)) * **engine:** 🎸 optimize RequestAPINode custom ([0440695](https://github.com/ByteCrazy/chameleon/commit/044069501608b1a8b62a08600c3c2d293e1ebe54)) * **engine:** 🎸 optimize selectNodeByTree ([b6959d9](https://github.com/ByteCrazy/chameleon/commit/b6959d98714a16669b3896b677ebb78aa080d8f3)) * **engine:** 🎸 optimize SetterSwitcher code struct ([d481fe6](https://github.com/ByteCrazy/chameleon/commit/d481fe68665f4fc7b1034e8b1ef9e2bfbe517012)) * **engine:** 🎸 parseActionLogicToNodeList 30% ([f120154](https://github.com/ByteCrazy/chameleon/commit/f1201549a5537f170dbdce7efca7c85ce3add2ad)) * **engine:** 🎸 support labelAlign config ([9590f86](https://github.com/ByteCrazy/chameleon/commit/9590f861fe8efebcd81ba38df3b159a528e066b6)) * **engine:** 🎸 support render flow by schema data ([e04e76d](https://github.com/ByteCrazy/chameleon/commit/e04e76d23115c64823dc6fbf5d460f589df98b3d)) * **model, render:** 🎸 add acion logic type defined ([a7c32a3](https://github.com/ByteCrazy/chameleon/commit/a7c32a33f80a00458fe16fbc4d0c34631c103b61)) * **model, render:** 🎸 optimize render react adapter code struct ([d9fa3d0](https://github.com/ByteCrazy/chameleon/commit/d9fa3d0a72e4d7e04e4e86e62d2a4f6f31bd808e)) * **render:** 🎸 add findDOMNode API ([2898452](https://github.com/ByteCrazy/chameleon/commit/2898452491554afddf36a795876182ff0d1bfc59)) ## [0.2.4](https://github.com/ByteCrazy/chameleon/compare/v0.2.3...v0.2.4) (2024-12-08) ### 🐛 Bug Fixes | Bug 修复 * **engine, material:** 🐛 fixed RGL init layout not correcnt and upgrade gridstack ([6b66b47](https://github.com/ByteCrazy/chameleon/commit/6b66b47b37e1fcd96602132bb44373a01d5de946)) ## [0.2.3](https://github.com/ByteCrazy/chameleon/compare/v0.2.2...v0.2.3) (2024-12-08) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed CVideo interactive ([4b1dabf](https://github.com/ByteCrazy/chameleon/commit/4b1dabfe89efbe2a3dfbb642e77ae10e74daaf0e)) * **engine:** 🐛 fixed hotkey not work sometimes ([d029841](https://github.com/ByteCrazy/chameleon/commit/d029841679183d5cffcbb991cf64cfcfea9de34e)) ## [0.2.2](https://github.com/ByteCrazy/chameleon/compare/v0.2.1...v0.2.2) (2024-12-07) ### ✨ Features | 新功能 * **material:** 🎸 optimize RGL ([518402f](https://github.com/ByteCrazy/chameleon/commit/518402ff0d173e60fd31430222aea8e5856fa0da)) ## [0.2.1](https://github.com/ByteCrazy/chameleon/compare/v0.2.0...v0.2.1) (2024-12-07) ### ✨ Features | 新功能 * **build-script, engine, engine-website-app, material, model, render:** 🎸 fixed RGL component and optimize project struct ([99f0679](https://github.com/ByteCrazy/chameleon/commit/99f0679d93a2fd696034ebed8f1abcd9d9e601d4)) ## [0.2.0](https://github.com/ByteCrazy/chameleon/compare/v0.1.1...v0.2.0) (2024-12-07) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed inner meta image drag problem ([f752d9e](https://github.com/ByteCrazy/chameleon/commit/f752d9ecf611cfc3f55576d0758905c6ac322a4e)) * **layout:** 🐛 fixed canvas scroll ([9f4c5b9](https://github.com/ByteCrazy/chameleon/commit/9f4c5b9afaf5e3370a72256f2484b9390354f5a3)) ### ✨ Features | 新功能 * **build-script, demo-page, engine, engine-website-app, layout, material, model, render:** 🎸 upgrade vite to 6.0 ([bcac2b1](https://github.com/ByteCrazy/chameleon/commit/bcac2b15b83b41a7042ca37368c1b45302ad81d5)) * **engine, layout, render:** 🎸 replace findDOMNode API ([af2531a](https://github.com/ByteCrazy/chameleon/commit/af2531a095124ac55d4f6dc6896d430f52f5da82)) ## [0.1.1](https://github.com/ByteCrazy/chameleon/compare/v0.1.0...v0.1.1) (2024-11-11) ### ✨ Features | 新功能 * **material:** 🎸 optimize material gridItem UI ([34b8b8e](https://github.com/ByteCrazy/chameleon/commit/34b8b8e1b09aac22e538eff44488dc2021a5add6)) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed cycle dependencies ([cefa3f0](https://github.com/ByteCrazy/chameleon/commit/cefa3f0a4a9c72c81b5337bbdb6e0429ca247252)) * **render:** 🐛 fixeds useRender not memory ([d579bfa](https://github.com/ByteCrazy/chameleon/commit/d579bfa401c39810a5dadc55e3fa1f3a0f407322)) ## [0.1.0](https://github.com/ByteCrazy/chameleon/compare/v0.0.46...v0.1.0) (2024-09-07) ### 👷 Continuous Integration | CI 配置 * 🎡 update ci ([7a1abc2](https://github.com/ByteCrazy/chameleon/commit/7a1abc21a7a9b80f53db1579ee928488ef678970)) * 🎡 update ci ([f21d4f9](https://github.com/ByteCrazy/chameleon/commit/f21d4f96266bb66adf02f961e2bee6aed59c7716)) * **build-script, docs-website, material, render:** 🎡 not build docs ([37aa10a](https://github.com/ByteCrazy/chameleon/commit/37aa10abf0324f3465a6921a9a014875e9500f8f)) * **engine, engine-website-app, layout, model:** 🎡 update github ci ([259e9db](https://github.com/ByteCrazy/chameleon/commit/259e9db229576cd09c5aae1f28a2c228927011c7)) ### 🐛 Bug Fixes | Bug 修复 * **demo-page, docs-app, engine, engine-website-app, layout, material:** 🐛 fixed material meta not correct ([55b755c](https://github.com/ByteCrazy/chameleon/commit/55b755ce0c833e594b46447b2d6608cf56f7a593)) * **docs-website, engine, layout:** 🐛 fixed higligh toolbar pos ([0356109](https://github.com/ByteCrazy/chameleon/commit/0356109e8a11a5a85ab90d1610ef7ef8549db0a9)) * **engine-website-app:** 🐛 fixed demo-app assets path ([4cc071e](https://github.com/ByteCrazy/chameleon/commit/4cc071ecfe77e93b46645b5e4a7d806acf78d896)) * **engine, engine-website-app, material:** 🐛 fixed ReactGridLayout edit mode lable not correct ([9801839](https://github.com/ByteCrazy/chameleon/commit/9801839d9ff6a6548b0e23f1e31850cd56e7fff0)) * **engine, layout:** 🐛 fixed toolbox width not correct ([4dc159a](https://github.com/ByteCrazy/chameleon/commit/4dc159a1931a853ba4cdb664638f27ba71b1ecf2)) * **engine:** 🐛 fixed advanceCustom hook logic ([5fb2619](https://github.com/ByteCrazy/chameleon/commit/5fb261962af141affef0e8e2cf1f0b62d16b0d45)) * **engine:** 🐛 fixed BackgroundInput color input ([944517c](https://github.com/ByteCrazy/chameleon/commit/944517c9078b29c5076784a1df66752494125e9f)) * **engine:** 🐛 fixed CSSUIPanel value not corrent ([1a4dc64](https://github.com/ByteCrazy/chameleon/commit/1a4dc645171253b261a3d2c9ebd3cf27ec692d34)) * **engine:** 🐛 fixed github build ([a4ace81](https://github.com/ByteCrazy/chameleon/commit/a4ace818d20c657a255fd25d5771113e5191d55d)) * **engine:** 🐛 fixed render url ([27736de](https://github.com/ByteCrazy/chameleon/commit/27736de41f239b4911535097c7334b73eea35224)) * **engine:** 🐛 fixed shadow UI Input ([3fbb753](https://github.com/ByteCrazy/chameleon/commit/3fbb753bb26b03dd5a25bce0fc6621f2d8b778e1)) * **material:** 🐛 fixed GridItem copy ([70f9f68](https://github.com/ByteCrazy/chameleon/commit/70f9f6811da3dd46707e0a7304182b807eb745c9)) * **material:** 🐛 remove inner pkg version ([eefcf7e](https://github.com/ByteCrazy/chameleon/commit/eefcf7e11e8405e1d96fdf0c1abdd8959473db1c)) * **model:** 🐛 fixed export meta repeat ([614bedd](https://github.com/ByteCrazy/chameleon/commit/614beddb464f6e66d1d77bcccd1f9b996702c344)) ### ✨ Features | 新功能 * **build-script, demo-page, engine, layout, render:** 🎸 add lang switch ([29da65e](https://github.com/ByteCrazy/chameleon/commit/29da65ee1aa09550d910ddfbbcb9d8b4db983373)) * **demo-page, engine, engine-website-app, layout, material, model:** 🎸 add hot action ([c7a405b](https://github.com/ByteCrazy/chameleon/commit/c7a405b35fedcbe47e163d32a8550bb82c9ae7d6)) * **demo-page, engine, engine-website-app, material:** 🎸 add designerSizer and fixed GridItem bug ([4665aed](https://github.com/ByteCrazy/chameleon/commit/4665aed300d54c77be4abcb9a8cc0f1710ac2145)) * **demo-page, engine, render:** 🎸 add getGlobalState and optimize node udpate ([4d3934f](https://github.com/ByteCrazy/chameleon/commit/4d3934fd8febe616a44e5d39da0e10964f3c800d)) * **docs-app, engine, layout, material, model, render:** 🎸 optimize GL layout ([02274b4](https://github.com/ByteCrazy/chameleon/commit/02274b432903dc247c5613873f14715dd806decd)) * **docs-app:** 🎸 use docs-app to do doc website ([2504946](https://github.com/ByteCrazy/chameleon/commit/25049463fdd2de507f19017be4e5269b7b5f7a2d)) * **engine-website-app, material:** 🎸 optimize RGL ([dd04999](https://github.com/ByteCrazy/chameleon/commit/dd04999a1509e29d6d738ea3a4250a146bfc295e)) * **engine, layout:** 🎸 add set canvas width method ([a18369f](https://github.com/ByteCrazy/chameleon/commit/a18369f0d4bbb4bcf04ce2695be313d767d4bbe5)) * **engine, material:** 🎸 add GRL meterial ([ae15c34](https://github.com/ByteCrazy/chameleon/commit/ae15c34a3f2736db61a933dc7d09166d9a619473)) * **engine, model:** 🎸 add advanceOptions property ([d75f178](https://github.com/ByteCrazy/chameleon/commit/d75f178fa70d4c49b451dff9dddfb30d4c061196)) * **engine, model:** 🎸 add hotKey plugin and fixed reloadPage event not trigge ([1cbf1e1](https://github.com/ByteCrazy/chameleon/commit/1cbf1e1a345d94c3b758b26cfbf1ecde69ce051c)) * **engine:** 🎸 add canvas size change button ([19ebdf8](https://github.com/ByteCrazy/chameleon/commit/19ebdf8d635b6b412979db81dc5d4f1b43d793a9)) * **engine:** 🎸 add hotAction ([c82bd21](https://github.com/ByteCrazy/chameleon/commit/c82bd21243aed9371a8576f572f600f1894f60bf)) * **engine:** 🎸 add width input ([c38422d](https://github.com/ByteCrazy/chameleon/commit/c38422d0848c4d60e8cb5b5b480671515c1d6101)) * **engine:** 🎸 optimize hotkeys methods ([bc83dba](https://github.com/ByteCrazy/chameleon/commit/bc83dba17fa4a23fa25548a284bbd69858bf15a0)) ### 📝 Documentation | 文档 * **demo-page, engine-website-app:** ✏️ demo app add switch page ([c098997](https://github.com/ByteCrazy/chameleon/commit/c098997e2c53bbe135ce263fcd1912ddc53146fe)) * **docs-app, engine-website-app:** ✏️ fixed doc url path ([181aa3f](https://github.com/ByteCrazy/chameleon/commit/181aa3f0fe1f329d8c2e8bd83759781468edcf5d)) * **docs-app:** ✏️ update doc link ([dc5759d](https://github.com/ByteCrazy/chameleon/commit/dc5759dd962ac910df3f3a1650ec48f2d7ee92d8)) * **engine:** ✏️ add layout resource ([15f4325](https://github.com/ByteCrazy/chameleon/commit/15f4325e418d63bb3f046d58766e9bb1d2c96344)) * **engine:** ✏️ update md resource ([de95460](https://github.com/ByteCrazy/chameleon/commit/de954609bbc4dc24dbf704d809ffb1de9a9116b2)) ## [0.0.46](https://github.com/ByteCrazy/chameleon/compare/v0.0.45...v0.0.46) (2024-06-30) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed registerCustomSetter method not valid ([9bdaa3b](https://github.com/ByteCrazy/chameleon/commit/9bdaa3b9feb1610a754b9aaa0925530f474dd3c3)) ## [0.0.45](https://github.com/ByteCrazy/chameleon/compare/v0.0.44...v0.0.45) (2024-06-30) ### 🐛 Bug Fixes | Bug 修复 * **model:** 🐛 fixed addMaterials method logic ([b7b1d14](https://github.com/ByteCrazy/chameleon/commit/b7b1d14737b2b25362809fc15a7b9ae25cba18fc)) ## [0.0.44](https://github.com/ByteCrazy/chameleon/compare/v0.0.43...v0.0.44) (2024-06-30) ### ✨ Features | 新功能 * **engine, model, render:** 🎸 optimize addMaterials and fixed inner mat schema ([aa77803](https://github.com/ByteCrazy/chameleon/commit/aa77803c75b203ee2a098fbee143f4a9581e15fa)) ## [0.0.43](https://github.com/ByteCrazy/chameleon/compare/v0.0.42...v0.0.43) (2024-06-29) ### ✨ Features | 新功能 * **build-script, engine, layout:** 🎸 remove scss dts generate ([9ba7af3](https://github.com/ByteCrazy/chameleon/commit/9ba7af30601804f94e90a0408745fd48de38d8b5)) ## [0.0.42](https://github.com/ByteCrazy/chameleon/compare/v0.0.41...v0.0.42) (2024-06-01) ### 🐛 Bug Fixes | Bug 修复 * **engine, layout:** 🐛 fixed drag and drop problem on chrome ([5c655c3](https://github.com/ByteCrazy/chameleon/commit/5c655c3a2f288bd90b70212f0f114adf3c23f8a1)) ## [0.0.41](https://github.com/ByteCrazy/chameleon/compare/v0.0.40...v0.0.41) (2024-05-26) ### ✨ Features | 新功能 * **build-script, engine, layout, material, model, render:** 🎸 optimize build script ([0a60cc4](https://github.com/ByteCrazy/chameleon/commit/0a60cc4f5e5635d9e544b5141eaed5b8433901a5)) ## [0.0.40](https://github.com/ByteCrazy/chameleon/compare/v0.0.39...v0.0.40) (2024-04-28) ### 🐛 Bug Fixes | Bug 修复 * fixed collectVariable logic ([e51bce9](https://github.com/ByteCrazy/chameleon/commit/e51bce9db030f8657575900406200972eee2e928)) ## [0.0.39](https://github.com/ByteCrazy/chameleon/compare/v0.0.38...v0.0.39) (2024-04-27) ### 🐛 Bug Fixes | Bug 修复 * **build-script, demo-page, engine, layout, material, model, render:** 🐛 fix flatObject collectVariable refeer pos ([1c4163a](https://github.com/ByteCrazy/chameleon/commit/1c4163aeeb89176a1ff5b50f76930889df7751fe)) ## [0.0.38](https://github.com/ByteCrazy/chameleon/compare/v0.0.37...v0.0.38) (2024-04-27) ### 🐛 Bug Fixes | Bug 修复 * **engine, layout:** 🐛 fixed assets load iuess when relaod ([3eccc60](https://github.com/ByteCrazy/chameleon/commit/3eccc60bb7be5a469704a9c4f769161e525481f4)) ## [0.0.37](https://github.com/ByteCrazy/chameleon/compare/v0.0.36...v0.0.37) (2024-04-27) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed updateMaterials components map problem ([b868e88](https://github.com/ByteCrazy/chameleon/commit/b868e884a9b65021effdee8872a462fd8539c9c4)) ## [0.0.36](https://github.com/ByteCrazy/chameleon/compare/v0.0.35...v0.0.36) (2024-04-27) ### 🐛 Bug Fixes | Bug 修复 * **render:** 🐛 fixed collectVariable method bug ([d5b7c5f](https://github.com/ByteCrazy/chameleon/commit/d5b7c5f274da52de09875cb9a9acf263ff051e59)) ## [0.0.35](https://github.com/ByteCrazy/chameleon/compare/v0.0.34...v0.0.35) (2024-04-27) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed onPluginReadyOk return value ([8550591](https://github.com/ByteCrazy/chameleon/commit/85505913af29459882caef5b83d17c2a8aca45b3)) ### ✨ Features | 新功能 * **render:** 🎸 support comp name with '.' and adapte __esModule prop ([0020e9e](https://github.com/ByteCrazy/chameleon/commit/0020e9e0db01cc08895c042c54253d133676a672)) ## [0.0.34](https://github.com/ByteCrazy/chameleon/compare/v0.0.33...v0.0.34) (2024-04-27) ### ✨ Features | 新功能 * **docs-website, engine, model:** 🎸 add update assetsPackageList logic ([2bce2f4](https://github.com/ByteCrazy/chameleon/commit/2bce2f4758b203695ec119d6e201e3186d7fab84)) ## [0.0.33](https://github.com/ByteCrazy/chameleon/compare/v0.0.32...v0.0.33) (2024-04-27) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fix css editor initial value not correct problem ([96c3e58](https://github.com/ByteCrazy/chameleon/commit/96c3e58755ed4fdfa3e200f3049b5024cb9c6719)) ### ✨ Features | 新功能 * **engine, layout, render:** 🎸 optimize history step save ([dca964a](https://github.com/ByteCrazy/chameleon/commit/dca964a990a3cc0c5fd853d853a55a4957999644)) * **engine, render:** 🎸 designer plugin add updateComponent method ([f161177](https://github.com/ByteCrazy/chameleon/commit/f16117793402681a1eda8f8cba9c06e2ee5247ad)) ## [0.0.32](https://github.com/ByteCrazy/chameleon/compare/v0.0.31...v0.0.32) (2024-01-30) ### ✨ Features | 新功能 * **docs-website, engine, model, render:** 🎸 add updateMaterials、updatePage methods ([39ed2b6](https://github.com/ByteCrazy/chameleon/commit/39ed2b692a8a7379a79b96cb3fd8cdb76a4f01f2)) ## [0.0.31](https://github.com/ByteCrazy/chameleon/compare/v0.0.30...v0.0.31) (2023-10-17) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed arraySetter delete bug ([1b53538](https://github.com/ByteCrazy/chameleon/commit/1b53538a67ff35a6cfedffe661126f6912e78bbf)) ## [0.0.30](https://github.com/ByteCrazy/chameleon/compare/v0.0.29...v0.0.30) (2023-10-17) ### 🐛 Bug Fixes | Bug 修复 * **render:** 🐛 remove child node cache ([0bca7b6](https://github.com/ByteCrazy/chameleon/commit/0bca7b6b1577c79e219f57ff9699b49000bb17ab)) ## [0.0.29](https://github.com/ByteCrazy/chameleon/compare/v0.0.28...v0.0.29) (2023-10-17) ### ✨ Features | 新功能 * **build-script, engine:** 🎸 optimize css editor ([66c0541](https://github.com/ByteCrazy/chameleon/commit/66c0541eaee12b2eb0ceb4fb3a7748e1bf69768d)) * **demo-page, engine, model:** 🎸 add ant color setter ([830de46](https://github.com/ByteCrazy/chameleon/commit/830de46babdf40a740248c37d8e6dc2043db1434)) * **demo-page, engine, model:** 🎸 add ColorSetter ([e72b7f1](https://github.com/ByteCrazy/chameleon/commit/e72b7f15dd8bba498b776226d5debd07c8fd4234)) * **demo-page, engine, model:** 🎸 add radio setter ([e6f9b1d](https://github.com/ByteCrazy/chameleon/commit/e6f9b1d9dba7cd3a9a82116bf5a1068c06a5a1d6)) * **demo-page, engine:** 🎸 add cssSize setter ([74bf136](https://github.com/ByteCrazy/chameleon/commit/74bf136047000a67795e1360f2a923902366a513)) * **demo-page, engine:** 🎸 add slider setter ([0fe1d29](https://github.com/ByteCrazy/chameleon/commit/0fe1d29257f214e69ca9fed6e5e4c11ccccb56bb)) * **demo-page, render:** 🎸 compatible new style schema ([8165453](https://github.com/ByteCrazy/chameleon/commit/816545302e4d88a0976e8fdf3b17ed8a9a2978bd)) * **engine, model, render:** 🎸 cssEditor support cssText ([3dc74b4](https://github.com/ByteCrazy/chameleon/commit/3dc74b4895d414a718c00911a39d8491fafcfaee)) * **engine, model:** 🎸 optimize style editor ([9c660ce](https://github.com/ByteCrazy/chameleon/commit/9c660ce694a32059450f19c824bcde9889049db8)) * **engine, model:** 🎸 style varible、c s scss editor support styles text ([c988fcf](https://github.com/ByteCrazy/chameleon/commit/c988fcf17a2dbbc486e809a03c642726f02cf547)) * **engine:** 🎸 add border input ([ae7d3c3](https://github.com/ByteCrazy/chameleon/commit/ae7d3c3e1c07bf68cfa74ef15ab8f499c9b7afc3)) * **engine:** 🎸 add CSSSizeInput componrnt ([cd70933](https://github.com/ByteCrazy/chameleon/commit/cd70933fbb044058b65c402465a69139da4d8a4a)) * **engine:** 🎸 add DimensionInput、FontInput、MarginInput、PaddingInput ([08aa4e5](https://github.com/ByteCrazy/chameleon/commit/08aa4e5a959ace882312b77a15ab5c973d2015b8)) * **engine:** 🎸 CSSUI editor sync value ([549fa7e](https://github.com/ByteCrazy/chameleon/commit/549fa7ea676d9f31d10e3b78888ec2318df2cdc2)) * **engine:** 🎸 optimize style setter ([eba569c](https://github.com/ByteCrazy/chameleon/commit/eba569cb5871f6cf8cce459c69d3d3beb7e0459a)) * **engine:** 🎸 style UI finish ([a38fb84](https://github.com/ByteCrazy/chameleon/commit/a38fb846475631caa1a6253af7de11fd30027c48)) ### 🐛 Bug Fixes | Bug 修复 * **build-script, engine:** 🐛 recocer build-script bin file ([5a2ca69](https://github.com/ByteCrazy/chameleon/commit/5a2ca69c4e5c48b3b0686478f6e5c40cd21c08ad)) * **engine, render:** 🐛 fixed build error and add child cache for render ([9026474](https://github.com/ByteCrazy/chameleon/commit/90264746fe99b8cdd4d055f2d778e67aae38af87)) * **engine:** 🐛 fixed MonacoEditor not trigger value change event ([0f6c3ee](https://github.com/ByteCrazy/chameleon/commit/0f6c3ee82a31b1a23388486f4cb12f9d7424ae66)) * **engine:** 🐛 fixed updatePanelValue not dispose problem ([b648986](https://github.com/ByteCrazy/chameleon/commit/b6489860398fe672de0e8009d91525dcc54909f2)) ## [0.0.28](https://github.com/ByteCrazy/chameleon/compare/v0.0.27...v0.0.28) (2023-08-29) ### ✨ Features | 新功能 * **model, render:** 🎸 node support custom dropPlaceholder ([dabdbc0](https://github.com/ByteCrazy/chameleon/commit/dabdbc00b375d5b8491ff3498075caac45473a98)) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed click can't add component into canvas ([b8e8c2c](https://github.com/ByteCrazy/chameleon/commit/b8e8c2c703f20c2bc2836dc2e1f91b02b994e5ca)) * **layout:** 🐛 fixed not auto inert component when drag on a empty aera ([45d9ae3](https://github.com/ByteCrazy/chameleon/commit/45d9ae3b0b874a225e068f378f6be07584bb2f87)) ## [0.0.27](https://github.com/ByteCrazy/chameleon/compare/v0.0.26...v0.0.27) (2023-08-28) ### ✨ Features | 新功能 * **engine:** 🎸 plugin system support add addCustomView method ([ce6db8f](https://github.com/ByteCrazy/chameleon/commit/ce6db8fcf1b87e6e3e14ed7464e7615c0ecc852b)) ## [0.0.26](https://github.com/ByteCrazy/chameleon/compare/v0.0.25...v0.0.26) (2023-08-27) ### 🐛 Bug Fixes | Bug 修复 * **render:** 🐛 fixed process is not defined in render ([03e258f](https://github.com/ByteCrazy/chameleon/commit/03e258f5674bdb54da6dee8dd7a68c31f7432a69)) ## [0.0.25](https://github.com/ByteCrazy/chameleon/compare/v0.0.24...v0.0.25) (2023-08-27) **Note:** Version bump only for package chameleon ## [0.0.24](https://github.com/ByteCrazy/chameleon/compare/v0.0.23...v0.0.24) (2023-08-27) ### ✨ Features | 新功能 * **engine, model, render:** 🎸 fixed node maybe is null on rightPanel ([aee551e](https://github.com/ByteCrazy/chameleon/commit/aee551e77454f61900318003f9e3a3ffb1ef9427)) ## [0.0.23](https://github.com/ByteCrazy/chameleon/compare/v0.0.22...v0.0.23) (2023-08-26) ### 🐛 Bug Fixes | Bug 修复 * **engine, render:** 🐛 fixed CSSPropertiesVariableBindEditor value not update ([9084c32](https://github.com/ByteCrazy/chameleon/commit/9084c32bb919c2e6191c29b871f9d1537d139050)) ### ✨ Features | 新功能 * **engine, model:** 🎸 support custom rightPanel ([803d731](https://github.com/ByteCrazy/chameleon/commit/803d731819faa03430b2a17a154d3ff1e0daca28)) * **engine, model:** 🎸 support inject custom setter ([a49ec4a](https://github.com/ByteCrazy/chameleon/commit/a49ec4ae4a98b42cf1cfb768990b64c981539881)) ## [0.0.22](https://github.com/ByteCrazy/chameleon/compare/v0.0.21...v0.0.22) (2023-08-24) ### ✨ Features | 新功能 * **demo-page, engine, layout, model:** 🎸 add disableEditorDragDom config ([1779f44](https://github.com/ByteCrazy/chameleon/commit/1779f44aff20370ea3336e72352032c6416f7dd3)) ## [0.0.21](https://github.com/ByteCrazy/chameleon/compare/v0.0.20...v0.0.21) (2023-08-19) ### 🐛 Bug Fixes | Bug 修复 * **render:** 🐛 fixed assetsLoader resource is empty problem ([1e7ec0a](https://github.com/ByteCrazy/chameleon/commit/1e7ec0ab966c4b618638ac519401f4df5cfc8f82)) ### ✨ Features | 新功能 * **engine, layout, model, render:** 🎸 optimize wrapComponent config ([d5916a7](https://github.com/ByteCrazy/chameleon/commit/d5916a7e6ee3cf79a32d4d23663b6873d86fe671)) ## [0.0.20](https://github.com/ByteCrazy/chameleon/compare/v0.0.19...v0.0.20) (2023-08-19) ### ✨ Features | 新功能 * **model, render:** 🎸 support wrapComponent meterial config ([73fa19c](https://github.com/ByteCrazy/chameleon/commit/73fa19cd698bd61ef8079ae71dfd284600796ad2)) ## [0.0.19](https://github.com/ByteCrazy/chameleon/compare/v0.0.18...v0.0.19) (2023-08-17) ### 🐛 Bug Fixes | Bug 修复 * **engine, render:** 🐛 fixed if assets is empty, loader will not success ([169d9ad](https://github.com/ByteCrazy/chameleon/commit/169d9ad9e5791353ad3a68dd0212c6ecfda64a29)) ### ✨ Features | 新功能 * **engine:** 🎸 add HistoryPlugin type definition ([13a66fb](https://github.com/ByteCrazy/chameleon/commit/13a66fb5141b308af191394b6c377a0d387ea628)) * **engine:** 🎸 use @monaco-editor/react replace monaco-editor ([848ee87](https://github.com/ByteCrazy/chameleon/commit/848ee87dedbccc71d3a7366320ad03122ed15d38)) ## [0.0.18](https://github.com/ByteCrazy/chameleon/compare/v0.0.17...v0.0.18) (2023-08-14) ### 🐛 Bug Fixes | Bug 修复 * **render:** 🐛 fixed page reload assets load failed ([b9eb815](https://github.com/ByteCrazy/chameleon/commit/b9eb815e75e1cd1738112ee18147f6faf0035155)) ### ✨ Features | 新功能 * **engine:** 🎸 add className and style for engine ([c2b7ef3](https://github.com/ByteCrazy/chameleon/commit/c2b7ef3c1c68708963dece239528889701eb0fd7)) * **engine:** 🎸 add onMount for engine ([17c80ae](https://github.com/ByteCrazy/chameleon/commit/17c80aecc09f13da5f33d7a59b5849d73d99d12a)) ## [0.0.17](https://github.com/ByteCrazy/chameleon/compare/v0.0.16...v0.0.17) (2023-08-06) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed types error ([1b68777](https://github.com/ByteCrazy/chameleon/commit/1b68777eb58225d750f40b16a7d263acb385477a)) * **layout:** 🐛 fixed Cannot read properties of undefined (reading 'id') ([008655c](https://github.com/ByteCrazy/chameleon/commit/008655c35bb73a93c48f35bbbd5eac0a515d7163)) ## [0.0.16](https://github.com/ByteCrazy/chameleon/compare/v0.0.15...v0.0.16) (2023-08-06) ### 👷 Continuous Integration | CI 配置 * 🎡 update ci build ([081fbde](https://github.com/ByteCrazy/chameleon/commit/081fbde6bb840f3682e86ad7cbbcdc1e04e89c36)) * 🎡 update ci script ([099f032](https://github.com/ByteCrazy/chameleon/commit/099f03220711d0542081f462c517aae8ce4dea32)) ### 🐛 Bug Fixes | Bug 修复 * **engine, layout:** 🐛 fixed some node not exits querySelector method ([2ddc186](https://github.com/ByteCrazy/chameleon/commit/2ddc1863e6eb207ae2e2b705a9fef4d23bece37c)) ### ✨ Features | 新功能 * **build-script-example, demo-page, engine, layout, material, model, render:** 🎸 support direct import render from package on dev mode ([6bb38e2](https://github.com/ByteCrazy/chameleon/commit/6bb38e29678a8a4d08a7fcf9548fa548399259b0)) * **demo-page, engine, layout, model:** 🎸 support advanceCustom drag and drop hooks ([fb21e15](https://github.com/ByteCrazy/chameleon/commit/fb21e1501f6829e4f13a35ea7be942ff72b0be91)) * **demo-page, engine, layout, model:** 🎸 support toolbarViewRender and ghostViewRedner ([43ced37](https://github.com/ByteCrazy/chameleon/commit/43ced371cfb7dbb58a96fc15e1bf635092307fa8)) * **demo-page, engine, layout:** 🎸 support DropViewRender ([1c025a6](https://github.com/ByteCrazy/chameleon/commit/1c025a6d1f57f450b2de262a787375f3f4891008)) * **demo-page, engine, model:** 🎸 support onDelete onCopy ([b6a76bb](https://github.com/ByteCrazy/chameleon/commit/b6a76bb244bbe2c050de17157bda97cb7ad21abc)) * **engine, layout, model:** 🎸 add customDropViewRender prop ([cea7f1e](https://github.com/ByteCrazy/chameleon/commit/cea7f1e3c2b0a8a13aef7cdcb0191593414615aa)) * **engine, layout, model:** 🎸 finish layout transform ([73ead35](https://github.com/ByteCrazy/chameleon/commit/73ead357b9aded2b5ee2b545da6f2b3677ce8393)) * **engine:** 🎸 optimze plugin type definition ([da9c107](https://github.com/ByteCrazy/chameleon/commit/da9c107b20646714834642ad09b2cbdfcb6eb7cd)) * **layout, model:** 🎸 optimize advanceCustom type definition ([0f529d1](https://github.com/ByteCrazy/chameleon/commit/0f529d1a8d8adbfd0970ba13a75a116a26e4d2f8)) * **layout, model:** 🎸 optimize advanceCustom type definition ([8cd11aa](https://github.com/ByteCrazy/chameleon/commit/8cd11aa9fb0dca0b605d9ed8504c2e827109dc8f)) * **layout, model:** 🎸 update meterial types definition ([fcf4e82](https://github.com/ByteCrazy/chameleon/commit/fcf4e827942afe4df8ad4210a0a3134138a5b10e)) * **layout:** 🎸 select hightlight use outline ([00654d0](https://github.com/ByteCrazy/chameleon/commit/00654d082c2823a6b01f109571f25a18bc51f5c5)) * **layout:** 🎸 setCanDrag add hook ([04ec3b6](https://github.com/ByteCrazy/chameleon/commit/04ec3b687310f689bbaaaa4a037b25d9ae5f8b9a)) ## [0.0.15](https://github.com/ByteCrazy/chameleon/compare/v0.0.14...v0.0.15) (2023-07-01) ### 🐛 Bug Fixes | Bug 修复 * **engine, layout:** 🐛 fixed component will be add repeatedly after reload page ([1507549](https://github.com/ByteCrazy/chameleon/commit/1507549632c3c6e09d8555fd0286fcc72855c358)) ### ✨ Features | 新功能 * auto detect toolbox dir ([#13](https://github.com/ByteCrazy/chameleon/issues/13)) ([4047408](https://github.com/ByteCrazy/chameleon/commit/404740870a658fa1740abe29ca50feac4a4028e4)) * **demo-page, docs-website, engine, model, render:** 🎸 optimize assets load ([3ee6d58](https://github.com/ByteCrazy/chameleon/commit/3ee6d58a88e5af3fc631723240783d5c97a273b0)) * **demo-page, engine:** 🎸 setter support initialValue ([794d807](https://github.com/ByteCrazy/chameleon/commit/794d8072518cb3b1a897b04a2e96f5ca53fdb365)) * **docs-website, engine, layout, material, render:** 🎸 support inject thridLib on $context ([ca2f074](https://github.com/ByteCrazy/chameleon/commit/ca2f07492b713c32e5a41d1f250f7888763cb665)) * **engine, render:** 🎸 change internal api ([0c0c7c3](https://github.com/ByteCrazy/chameleon/commit/0c0c7c3fa8f86c08ab0cefb0396107ed8c52dcd5)) * **render:** 🎸 render support store reactive ([61c7485](https://github.com/ByteCrazy/chameleon/commit/61c74857ba9541bb20d3722d351019c0ad97ac81)) ## [0.0.14](https://github.com/ByteCrazy/chameleon/compare/v0.0.13...v0.0.14) (2023-05-10) ### ✨ Features | 新功能 * **engine:** 🎸 add node id in advance panel ([d457203](https://github.com/ByteCrazy/chameleon/commit/d45720316ab95f75f6f67a5dbf31bb0030ceb3f1)) ### 🐛 Bug Fixes | Bug 修复 * **engine, layout:** 🐛 fixed new component can not be add into canvas ([4057fa9](https://github.com/ByteCrazy/chameleon/commit/4057fa925c18bf06325de04b270be5f6c23351c8)) * **engine, layout:** 🐛 fixed type problem ([751a392](https://github.com/ByteCrazy/chameleon/commit/751a39244228f74138acf7f567d23e888b8ff687)) * **engine, render:** 🐛 fixed removeMediaCSS method run failed ([9127ec3](https://github.com/ByteCrazy/chameleon/commit/9127ec3d13f43a1c8763b2350bc0224d683da85c)) ## [0.0.13](https://github.com/ByteCrazy/chameleon/compare/v0.0.12...v0.0.13) (2023-05-03) ### ✨ Features | 新功能 * add-nearby-component ([85a301c](https://github.com/ByteCrazy/chameleon/commit/85a301c3d95e785c116ab38c0b3a452ceb33742f)) * **build-script, build-script-example, demo-page, engine, layout, material, model, render:** 🎸 config code style config ([2325504](https://github.com/ByteCrazy/chameleon/commit/23255048fa4a3d4fc8f5cfa1312db5abd6cac70d)) * **build-script, demo-page, engine, layout, model, render:** 🎸 update meterial schema ([14f4e5c](https://github.com/ByteCrazy/chameleon/commit/14f4e5caf0a4f6eca131e139d0c34ea21969dc0b)) * **demo-page, docs-website, engine, layout, model, render:** 🎸 node support methods config ([e080b20](https://github.com/ByteCrazy/chameleon/commit/e080b20cea3cea27b95def196e078c1c225d3a83)) * **demo-page, engine, layout, model:** 🎸 finish customEvent config ([84640e3](https://github.com/ByteCrazy/chameleon/commit/84640e3d06b79858590b9fe92ef4764fbe3f4f7b)) * **demo-page, engine, layout:** 🎸 outline support cancel drag by node material ([cd428d3](https://github.com/ByteCrazy/chameleon/commit/cd428d362a8bfe7d5b6e58ed2b6290e19c00672b)) * **demo-page, engine, layout:** 🎸 support cancel drag and custom node drag event ([825717e](https://github.com/ByteCrazy/chameleon/commit/825717e063846b72f95b0e41d8cba279ef5270c8)) * **demo-page, engine:** 🎸 complete advanceCustom material feature ([98cf273](https://github.com/ByteCrazy/chameleon/commit/98cf273543f2fd534c254990d61052534a6649da)) * **demo-page, engine:** 🎸 supprot onSelectNode ([f496a82](https://github.com/ByteCrazy/chameleon/commit/f496a82920cab7ae8704335b2ecd02a7887de3b2)) * **engine, layout, model:** 🎸 support supportDispatchNativeEvent field ([489fd05](https://github.com/ByteCrazy/chameleon/commit/489fd05b588e85ed4cea81cc33ab27739a1bac59)) * **engine, layout:** 🎸 optimize layout event system ([56f35ef](https://github.com/ByteCrazy/chameleon/commit/56f35ef83cc7e1658bfeba9081f997ff457cf09e)) * **engine, layout:** 🎸 support isSupportDispatchNativeEvent filed ([4f830b4](https://github.com/ByteCrazy/chameleon/commit/4f830b42b6e84d74e9d462c3b3e090de89686e18)) * **engine, render:** 🎸 html native tag component support container filed ([475fdbd](https://github.com/ByteCrazy/chameleon/commit/475fdbd5a34581ab7cafe67b5c9d3b94102b3a16)) * remove self-executing function ([e224524](https://github.com/ByteCrazy/chameleon/commit/e224524198aa3f1339afd3bc9f1bacb72bc4d20e)) * remove some useless code and fix some problems detected by eslint. ([a8e6ec2](https://github.com/ByteCrazy/chameleon/commit/a8e6ec2f107250facefc81cf87f694e40f3ed684)) * select element after in add node ([0c0d116](https://github.com/ByteCrazy/chameleon/commit/0c0d1164783420da306062292674fbccb0a8ffb0)) * update model code ([f74162a](https://github.com/ByteCrazy/chameleon/commit/f74162a32dda1fa4244705a0b63066d73a4d6537)) ### 🐛 Bug Fixes | Bug 修复 * adjust find node logic ([5f9f073](https://github.com/ByteCrazy/chameleon/commit/5f9f07320888b3a83a4a24b04cfbd2e9e82aa4b1)) * **engine, layout, model:** 🐛 fixed type error ([d11e81f](https://github.com/ByteCrazy/chameleon/commit/d11e81f607ef6a41a2dfda0b4ac657a9a87e948c)) * **engine:** 🐛 fixed insert node logic ([7fd4866](https://github.com/ByteCrazy/chameleon/commit/7fd4866d7daaece1c8c3b2a846b55da27a1e0936)) * eslint warning ([403342f](https://github.com/ByteCrazy/chameleon/commit/403342f60420326a69e4b46a1560ba0f4845ed60)) * **model:** page thirdLibs forget process find return ([e1c5d2b](https://github.com/ByteCrazy/chameleon/commit/e1c5d2b3a7e365f892274c80402a72b7003151a8)) ## [0.0.12](https://github.com/ByteCrazy/chameleon/compare/v0.0.11...v0.0.12) (2023-04-23) ### 👷 Continuous Integration | CI 配置 * 🎡 update publish script ([dab187a](https://github.com/ByteCrazy/chameleon/commit/dab187afcca315664284a4bc03d01a40a43e1cdf)) ### 🐛 Bug Fixes | Bug 修复 * **build-script, build-script-example, engine, layout, material, model, render:** 🐛 fix can not find vite/client.d.ts problem ([8a53540](https://github.com/ByteCrazy/chameleon/commit/8a53540f75737707f69f93d2f701203dbf88084a)) ### ✨ Features | 新功能 * **demo-page, docs-website, engine, model:** 🎸 update schema and change err to warn when schema check ([e753862](https://github.com/ByteCrazy/chameleon/commit/e7538626bad6681e4d488ac835fef61a603c0853)) * **demo-page, engine, layout, model, render:** 🎸 node support config self isContainer property ([d94f1f9](https://github.com/ByteCrazy/chameleon/commit/d94f1f9203f2c273856fd4aa489a1ed9cbb0f0ec)) ## [0.0.11](https://github.com/ByteCrazy/chameleon/compare/v0.0.10...v0.0.11) (2023-04-21) ### ✨ Features | 新功能 * add reload method of plugin ([3b2cb2a](https://github.com/ByteCrazy/chameleon/commit/3b2cb2aa3804e250ed8ce37027168282f63db879)) * add replaceSubTopBarView method ([da32d9c](https://github.com/ByteCrazy/chameleon/commit/da32d9c67a6fff1a562886c027c1604a54e19b7e)) * **build-script, build-script-example, demo-page, engine, layout, material, model, render:** 🎸 optimize build-script output file format ([eda44d2](https://github.com/ByteCrazy/chameleon/commit/eda44d255bd3c5af19013bdd61342e1f0817413a)) * **build-script, docs-website, engine:** 🎸 add material develop doc ([0aacca0](https://github.com/ByteCrazy/chameleon/commit/0aacca0f726bc13606b814f8890b4e8ff8982142)) * **engine, model:** 🎸 support custom setter ([5236c54](https://github.com/ByteCrazy/chameleon/commit/5236c543559aac517e833741ffa8046bc1c7f1a3)) * RightPanel add replacePanel、removePanel methods ([ee6c2e1](https://github.com/ByteCrazy/chameleon/commit/ee6c2e1b45bf93075342cee060fe3038ec7b8e53)) ### 📝 Documentation | 文档 * **docs-website, engine:** ✏️ add plugin、setter develop doc ([288edc4](https://github.com/ByteCrazy/chameleon/commit/288edc4999f732ff2f27b1c6e50900b9b0094700)) * **docs-website, model:** ✏️ add material setter doc ([c7490fb](https://github.com/ByteCrazy/chameleon/commit/c7490fb9c9e9ef4cba9e33c5270a035592e3c46e)) ## [0.0.10](https://github.com/ByteCrazy/chameleon/compare/v0.0.9...v0.0.10) (2023-04-17) **Note:** Version bump only for package chameleon ## [0.0.9](https://github.com/ByteCrazy/chameleon/compare/v0.0.8...v0.0.9) (2023-04-17) ### ✨ Features | 新功能 * **build-script:** 🎸 build.config supprot es module ([275c97d](https://github.com/ByteCrazy/chameleon/commit/275c97d861b6394fbdd13b92fd1049c208f72b39)) * **docs-website, engine, render:** 🎸 render add collectVariable flatObject util method ([ae25160](https://github.com/ByteCrazy/chameleon/commit/ae25160b568c267041b3827e836c95f60ecaee59)) ## [0.0.8](https://github.com/ByteCrazy/chameleon/compare/v0.0.7...v0.0.8) (2023-04-16) ### ✨ Features | 新功能 * **build-script, engine, layout, model, render:** 🎸 optimize pack package ([78d99c5](https://github.com/ByteCrazy/chameleon/commit/78d99c507ad65ca39101f0239467737d2b445c87)) * **docs-website, engine, layout:** 🎸 add defaultRender for engine, add some docs ([91f4257](https://github.com/ByteCrazy/chameleon/commit/91f4257e9f9b9391267e4b8d64e6ed811912381f)) * **docs-website, engine:** 🎸 add docs ([0e6f605](https://github.com/ByteCrazy/chameleon/commit/0e6f6053fa3cd5e13b6a7a8258c27518c30470c5)) * **docs:** 🎸 add doc home page ([29efec1](https://github.com/ByteCrazy/chameleon/commit/29efec168b71879ee58809d3be9e8f7084ca4d88)) * **docs:** 🎸 init docs project ([3331cec](https://github.com/ByteCrazy/chameleon/commit/3331cec7c7ed664e21270b7b98d7dc5f32574da9)) ### 👷 Continuous Integration | CI 配置 * 🎡 modify ci flow ([ab9c47e](https://github.com/ByteCrazy/chameleon/commit/ab9c47e2f0492e8db1fdf8dcbddbec2a1801e1dd)) * 🎡 update ci ([085f0ba](https://github.com/ByteCrazy/chameleon/commit/085f0ba25586ba34cb3525edab488f30cd1ed790)) * 🎡 update ci ([32a5110](https://github.com/ByteCrazy/chameleon/commit/32a511054c733e277112d37f3e3f146bab41c3c2)) ### 📝 Documentation | 文档 * **build-script, docs-website:** ✏️ change quickStart md ([f43945f](https://github.com/ByteCrazy/chameleon/commit/f43945fdd7eaf03b4ad3099980d7f3fb0a949b4c)) * **docs-website, engine:** ✏️ add doc ([2fb5cf5](https://github.com/ByteCrazy/chameleon/commit/2fb5cf5fd4dcb3859ecbdc8d42adf787d9e0255d)) * **docs-website:** ✏️ add doc project directory structure ([cc175e0](https://github.com/ByteCrazy/chameleon/commit/cc175e0bbce602ecc20433517e4bef9c8184f18f)) ## [0.0.7](https://github.com/ByteCrazy/chameleon/compare/v0.0.6...v0.0.7) (2023-03-29) ### ✨ Features | 新功能 * **build-script, build-script-example, demo-page, engine, layout, material, model, render:** 🎸 external monaco eitor and remove style panel ([494d898](https://github.com/ByteCrazy/chameleon/commit/494d898fd75dabe84d867ff45e84ae63f9b59c5e)) ## [0.0.6](https://github.com/ByteCrazy/chameleon/compare/v0.0.5...v0.0.6) (2023-03-28) **Note:** Version bump only for package chameleon ## [0.0.5](https://github.com/ByteCrazy/chameleon/compare/v0.0.4...v0.0.5) (2023-03-28) ### ✨ Features | 新功能 * **build-script, engine, layout, material, model, render:** 🎸 complete package info ([86b095d](https://github.com/ByteCrazy/chameleon/commit/86b095da6c955946300591b1775f59c1a141c065)) ## [0.0.4](https://github.com/ByteCrazy/chameleon/compare/v0.0.3...v0.0.4) (2023-03-27) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fixed engine d.ts path not correct problem ([fb20ca6](https://github.com/ByteCrazy/chameleon/commit/fb20ca604fff4e85b0264eff6383154ecfefd437)) ## [0.0.2](https://github.com/ByteCrazy/chameleon/compare/v0.0.1...v0.0.2) (2023-03-27) ### 🐛 Bug Fixes | Bug 修复 * **engine:** 🐛 fix engine not incluce dist folder ([fc2c39e](https://github.com/ByteCrazy/chameleon/commit/fc2c39e88aa2eeb82ba5e3989e5bdf244d112dfb)) ================================================ FILE: DEV_README.md ================================================ # chameleon ## Dev steps ```shell cd ./ pnpm i pnpm run build cd package/engine pnpm run start ``` ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: README.md ================================================ # Chameleon > Chameleon is ever-changing A web visual programming engine, help to build a web page with 5 minutes. every people can use it easy. [Docs](https://hlerenow.github.io/chameleon/documents/) | [Demo](https://hlerenow.github.io/chameleon/) [Online(Beta) Service](https://cb.hai-fe.com) ## Install ```shell npm i @chamn/engine @chamn/model @chamn/render ``` ## Usage [Example Project](https://github.com/ByteCrazy/chameleon-demo) ### ScreenSnapshot image ![image](https://github.com/hlerenow/chameleon/blob/master/packages/engine/md-images/layout.gif) ![image](https://user-images.githubusercontent.com/13299648/218920783-0d1cc275-a238-4d80-a717-dbbbf54b4713.png) ![image](https://user-images.githubusercontent.com/13299648/218920845-0c4c549d-df56-4b0a-9b72-95dd0c0fcaf5.png) ![image](https://user-images.githubusercontent.com/13299648/218921002-a25cfdd6-f27a-4b19-83fe-a6a264e4e4b5.png) ![image](https://user-images.githubusercontent.com/13299648/218920640-9be3b1ba-1dc2-42c5-922f-f3c5f97a9d96.png) ================================================ FILE: changelog.config.cjs ================================================ module.exports = { disableEmoji: false, // format: '{type}{scope}: {emoji}{subject}', list: ['test', 'feat', 'fix', 'chore', 'docs', 'refactor', 'style', 'ci', 'perf'], maxMessageLength: 64, minMessageLength: 3, questions: ['type', 'scope', 'subject', 'body', 'breaking', 'issues', 'packages'], types: { chore: { description: 'Build process or auxiliary tool changes', emoji: '🤖', value: 'chore', }, ci: { description: 'CI related changes', emoji: '🎡', value: 'ci', }, docs: { description: 'Documentation only changes', emoji: '✏️', value: 'docs', }, feat: { description: 'A new feature', emoji: '🎸', value: 'feat', }, fix: { description: 'A bug fix', emoji: '🐛', value: 'fix', }, perf: { description: 'A code change that improves performance', emoji: '⚡️', value: 'perf', }, refactor: { description: 'A code change that neither fixes a bug or adds a feature', emoji: '💡', value: 'refactor', }, release: { description: 'Create a release commit', emoji: '🏹', value: 'release', }, style: { description: 'Markup, white-space, formatting, missing semi-colons...', emoji: '💄', value: 'style', }, test: { description: 'Adding missing tests', emoji: '💍', value: 'test', }, messages: { type: "Select the type of change that you're committing:", customScope: 'Select the scope this component affects:', subject: 'Write a short, imperative mood description of the change:\n', body: 'Provide a longer description of the change:\n ', breaking: 'List any breaking changes:\n', footer: 'Issues this commit closes, e.g #123:', confirmCommit: 'The packages that this commit has affected\n', }, }, }; ================================================ FILE: design/chameleon.drawio ================================================ 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 ================================================ FILE: eslint.config.js ================================================ import js from '@eslint/js'; import globals from 'globals'; import reactHooks from 'eslint-plugin-react-hooks'; import reactRefresh from 'eslint-plugin-react-refresh'; import tseslint from 'typescript-eslint'; export default tseslint.config( { ignores: ['dist'] }, { extends: [js.configs.recommended, ...tseslint.configs.recommended], languageOptions: { ecmaVersion: 2020, globals: globals.browser, }, plugins: { 'react-hooks': reactHooks, 'react-refresh': reactRefresh, }, rules: { ...reactHooks.configs.recommended.rules, 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }], '@typescript-eslint/no-explicit-any': ['off'], '@typescript-eslint/no-unused-vars': [ 'error', { args: 'all', argsIgnorePattern: '^_', caughtErrors: 'all', caughtErrorsIgnorePattern: '^_', destructuredArrayIgnorePattern: '^_', varsIgnorePattern: '^_', ignoreRestSiblings: true, }, ], 'no-debugger': ['warn'], }, } ); ================================================ FILE: lerna.json ================================================ { "$schema": "node_modules/@lerna-lite/cli/schemas/lerna-schema.json", "packages": [ "packages/*" ], "useWorkspaces": true, "npmClient": "pnpm", "command": { "run": { "npmClient": "pnpm" } }, "changelogPreset": { "name": "conventionalcommits", "types": [ { "type": "feat", "section": "✨ Features | 新功能" }, { "type": "fix", "section": "🐛 Bug Fixes | Bug 修复" }, { "type": "chore", "section": "🚀 Chore | 构建/工程依赖/工具", "hidden": true }, { "type": "docs", "section": "📝 Documentation | 文档" }, { "type": "style", "section": "💄 Styles | 样式" }, { "type": "refactor", "section": "♻️ Code Refactoring | 代码重构" }, { "type": "perf", "section": "⚡ Performance Improvements | 性能优化" }, { "type": "test", "section": "✅ Tests | 测试", "hidden": true }, { "type": "revert", "section": "⏪ Revert | 回退", "hidden": true }, { "type": "build", "section": "📦‍ Build System | 打包构建" }, { "type": "ci", "section": "👷 Continuous Integration | CI 配置" } ], "issuePrefixes": [ "#" ], "issueUrlFormat": "{{host}}/{{owner}}/{{repository}}/issues/{{id}}", "commitUrlFormat": "{{host}}/{{owner}}/{{repository}}/commit/{{hash}}", "compareUrlFormat": "{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}", "userUrlFormat": "{{host}}/{{user}}" }, "version": "0.10.4" } ================================================ FILE: package.json ================================================ { "name": "chameleon", "private": true, "workspaces": [ "packages/*" ], "type": "module", "scripts": { "prepare": "husky install", "clear": "rm -rf ./node_modules", "lint": "lerna run lint", "build": "lerna run build", "changeVersion": "lerna version --force-publish --conventional-commits", "changeVersionPatch": "lerna version patch --force-publish --conventional-commits", "changeVersionMinor": "lerna version minor --force-publish --conventional-commits", "changeVersionMajor": "lerna version major --force-publish --conventional-commits", "toPublish": "npm run build && lerna publish from-package --force-publish --conventional-commits", "toFastPublish": "lerna publish from-package --force-publish --conventional-commits", "toPublishBeta": "npm run build && lerna publish --conventional-commits --dist-tag beta", "run-tests": "lerna run test", "cz": "git-cz" }, "lint-staged": { "packages/*/src/**/*.{js,jsx,ts,tsx}": [ "eslint --fix" ], "packages/*/src/**/*": "prettier --write --ignore-unknown" }, "devDependencies": { "@hlerenow/git-cz": "^4.9.3", "@lerna-lite/cli": "^3.12.3", "@lerna-lite/list": "^3.12.3", "@lerna-lite/run": "^3.12.3", "@lerna-lite/version": "^3.12.3", "@lerna-lite/publish": "^3.12.3", "@lerna-lite/watch": "^3.12.3", "@types/jest": "^28.1.6", "clsx": "^1.1.1", "conventional-changelog-conventionalcommits": "^5.0.0", "cross-env": "^7.0.3", "husky": "^8.0.1", "lint-staged": "^13.0.3", "prettier": "2.7.1", "sass": "^1.53.0", "sass-loader": "10.1.1", "style-loader": "2.0.0", "ts-jest": "^28.0.7" }, "engines": { "node": ">=16", "pnpm": ">=7" }, "resolutions": { "react": "18.2.0", "@types/react": "^18.2.0" }, "dependencies": { "@eslint/js": "^9.22.0", "eslint": "^9.22.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", "typescript": "~5.7.2", "typescript-eslint": "^8.26.1" } } ================================================ FILE: packages/build-script/.eslintignore ================================================ scripts bin/* lib example jest.* ================================================ FILE: packages/build-script/CHANGELOG.md ================================================ # Change Log All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. ## [0.10.4](https://github.com/ByteCrazy/chameleon/compare/v0.10.3...v0.10.4) (2026-01-17) **Note:** Version bump only for package @chamn/build-script ## [0.10.3](https://github.com/ByteCrazy/chameleon/compare/v0.10.2...v0.10.3) (2026-01-17) **Note:** Version bump only for package @chamn/build-script ## [0.10.2](https://github.com/ByteCrazy/chameleon/compare/v0.10.1...v0.10.2) (2026-01-17) **Note:** Version bump only for package @chamn/build-script ## [0.10.1](https://github.com/ByteCrazy/chameleon/compare/v0.10.0...v0.10.1) (2026-01-11) ### ✨ Features | 新功能 * **build-script, demo-page, engine, render:** 🎸 update build script dts & optimize modal root selector ([024d5ab](https://github.com/ByteCrazy/chameleon/commit/024d5ab26d19fc5f50172c328638a551fb99c129)) ## [0.10.0](https://github.com/hlerenow/chameleon/compare/v0.9.3...v0.10.0) (2025-12-25) ### 🐛 Bug Fixes | Bug 修复 * 优化构建配置,修复 ES 模块外部化问题 ([866f0ae](https://github.com/hlerenow/chameleon/commit/866f0ae39472625137d73d143625d88d873f6c00)) ### 📝 Documentation | 文档 * **build-script:** 添加完整的 README 使用文档 ([fcd6172](https://github.com/hlerenow/chameleon/commit/fcd6172e381364f010986864593264b160380342)) ## [0.9.3](https://github.com/ByteCrazy/chameleon/compare/v0.9.2...v0.9.3) (2025-07-20) **Note:** Version bump only for package @chamn/build-script ## [0.9.2](https://github.com/ByteCrazy/chameleon/compare/v0.9.1...v0.9.2) (2025-07-13) **Note:** Version bump only for package @chamn/build-script ## [0.9.1](https://github.com/ByteCrazy/chameleon/compare/v0.9.0...v0.9.1) (2025-07-13) **Note:** Version bump only for package @chamn/build-script ## [0.9.0](https://github.com/ByteCrazy/chameleon/compare/v0.8.6...v0.9.0) (2025-07-13) **Note:** Version bump only for package @chamn/build-script ## [0.8.6](https://github.com/ByteCrazy/chameleon/compare/v0.8.5...v0.8.6) (2025-06-21) **Note:** Version bump only for package @chamn/build-script ## [0.8.5](https://github.com/ByteCrazy/chameleon/compare/v0.8.4...v0.8.5) (2025-04-13) **Note:** Version bump only for package @chamn/build-script ## [0.8.4](https://github.com/ByteCrazy/chameleon/compare/v0.8.3...v0.8.4) (2025-04-13) **Note:** Version bump only for package @chamn/build-script ## [0.8.3](https://github.com/ByteCrazy/chameleon/compare/v0.8.2...v0.8.3) (2025-04-12) **Note:** Version bump only for package @chamn/build-script ## [0.8.2](https://github.com/ByteCrazy/chameleon/compare/v0.8.1...v0.8.2) (2025-04-11) **Note:** Version bump only for package @chamn/build-script ## [0.8.1](https://github.com/ByteCrazy/chameleon/compare/v0.8.0...v0.8.1) (2025-04-10) **Note:** Version bump only for package @chamn/build-script ## [0.8.0](https://github.com/ByteCrazy/chameleon/compare/v0.7.0...v0.8.0) (2025-04-10) **Note:** Version bump only for package @chamn/build-script ## [0.7.0](https://github.com/ByteCrazy/chameleon/compare/v0.6.0...v0.7.0) (2025-04-06) **Note:** Version bump only for package @chamn/build-script ## [0.6.0](https://github.com/ByteCrazy/chameleon/compare/v0.5.2...v0.6.0) (2025-03-30) **Note:** Version bump only for package @chamn/build-script ## [0.5.2](https://github.com/ByteCrazy/chameleon/compare/v0.5.1...v0.5.2) (2025-03-30) **Note:** Version bump only for package @chamn/build-script ## [0.5.1](https://github.com/ByteCrazy/chameleon/compare/v0.5.0...v0.5.1) (2025-03-30) **Note:** Version bump only for package @chamn/build-script ## [0.5.0](https://github.com/ByteCrazy/chameleon/compare/v0.4.0...v0.5.0) (2025-03-30) **Note:** Version bump only for package @chamn/build-script ## [0.4.0](https://github.com/ByteCrazy/chameleon/compare/v0.3.21...v0.4.0) (2025-03-29) **Note:** Version bump only for package @chamn/build-script ## [0.3.21](https://github.com/ByteCrazy/chameleon/compare/v0.3.20...v0.3.21) (2025-03-26) **Note:** Version bump only for package @chamn/build-script ## [0.3.20](https://github.com/ByteCrazy/chameleon/compare/v0.3.19...v0.3.20) (2025-03-26) **Note:** Version bump only for package @chamn/build-script ## [0.3.19](https://github.com/ByteCrazy/chameleon/compare/v0.3.18...v0.3.19) (2025-03-26) **Note:** Version bump only for package @chamn/build-script ## [0.3.18](https://github.com/ByteCrazy/chameleon/compare/v0.3.17...v0.3.18) (2025-03-26) **Note:** Version bump only for package @chamn/build-script ## [0.3.17](https://github.com/ByteCrazy/chameleon/compare/v0.3.16...v0.3.17) (2025-03-25) **Note:** Version bump only for package @chamn/build-script ## [0.3.16](https://github.com/ByteCrazy/chameleon/compare/v0.3.15...v0.3.16) (2025-03-24) **Note:** Version bump only for package @chamn/build-script ## [0.3.15](https://github.com/ByteCrazy/chameleon/compare/v0.3.14...v0.3.15) (2025-03-23) **Note:** Version bump only for package @chamn/build-script ## [0.3.14](https://github.com/ByteCrazy/chameleon/compare/v0.3.13...v0.3.14) (2025-03-23) **Note:** Version bump only for package @chamn/build-script ## [0.3.13](https://github.com/ByteCrazy/chameleon/compare/v0.3.12...v0.3.13) (2025-03-23) **Note:** Version bump only for package @chamn/build-script ## [0.3.12](https://github.com/ByteCrazy/chameleon/compare/v0.3.11...v0.3.12) (2025-03-23) **Note:** Version bump only for package @chamn/build-script ## [0.3.11](https://github.com/ByteCrazy/chameleon/compare/v0.3.10...v0.3.11) (2025-03-22) **Note:** Version bump only for package @chamn/build-script ## [0.3.10](https://github.com/ByteCrazy/chameleon/compare/v0.3.9...v0.3.10) (2025-03-22) **Note:** Version bump only for package @chamn/build-script ## [0.3.9](https://github.com/ByteCrazy/chameleon/compare/v0.3.8...v0.3.9) (2025-03-22) **Note:** Version bump only for package @chamn/build-script ## [0.3.8](https://github.com/ByteCrazy/chameleon/compare/v0.3.7...v0.3.8) (2025-03-16) **Note:** Version bump only for package @chamn/build-script ## [0.3.7](https://github.com/ByteCrazy/chameleon/compare/v0.3.6...v0.3.7) (2025-03-16) **Note:** Version bump only for package @chamn/build-script ## [0.3.6](https://github.com/ByteCrazy/chameleon/compare/v0.3.5...v0.3.6) (2025-03-09) **Note:** Version bump only for package @chamn/build-script ## [0.3.5](https://github.com/ByteCrazy/chameleon/compare/v0.3.4...v0.3.5) (2025-03-09) **Note:** Version bump only for package @chamn/build-script ## [0.3.4](https://github.com/ByteCrazy/chameleon/compare/v0.3.3...v0.3.4) (2025-02-16) **Note:** Version bump only for package @chamn/build-script ## [0.3.3](https://github.com/ByteCrazy/chameleon/compare/v0.3.2...v0.3.3) (2025-02-16) **Note:** Version bump only for package @chamn/build-script ## [0.3.2](https://github.com/ByteCrazy/chameleon/compare/v0.3.1...v0.3.2) (2025-02-16) **Note:** Version bump only for package @chamn/build-script ## [0.3.1](https://github.com/ByteCrazy/chameleon/compare/v0.3.0...v0.3.1) (2025-02-16) **Note:** Version bump only for package @chamn/build-script ## [0.3.0](https://github.com/ByteCrazy/chameleon/compare/v0.2.4...v0.3.0) (2025-02-15) **Note:** Version bump only for package @chamn/build-script ## [0.2.4](https://github.com/ByteCrazy/chameleon/compare/v0.2.3...v0.2.4) (2024-12-08) **Note:** Version bump only for package @chamn/build-script ## [0.2.3](https://github.com/ByteCrazy/chameleon/compare/v0.2.2...v0.2.3) (2024-12-08) **Note:** Version bump only for package @chamn/build-script ## [0.2.2](https://github.com/ByteCrazy/chameleon/compare/v0.2.1...v0.2.2) (2024-12-07) **Note:** Version bump only for package @chamn/build-script ## [0.2.1](https://github.com/ByteCrazy/chameleon/compare/v0.2.0...v0.2.1) (2024-12-07) ### ✨ Features | 新功能 * **build-script, engine, engine-website-app, material, model, render:** 🎸 fixed RGL component and optimize project struct ([99f0679](https://github.com/ByteCrazy/chameleon/commit/99f0679d93a2fd696034ebed8f1abcd9d9e601d4)) ## [0.2.0](https://github.com/ByteCrazy/chameleon/compare/v0.1.1...v0.2.0) (2024-12-07) ### ✨ Features | 新功能 * **build-script, demo-page, engine, engine-website-app, layout, material, model, render:** 🎸 upgrade vite to 6.0 ([bcac2b1](https://github.com/ByteCrazy/chameleon/commit/bcac2b15b83b41a7042ca37368c1b45302ad81d5)) ## [0.1.1](https://github.com/ByteCrazy/chameleon/compare/v0.1.0...v0.1.1) (2024-11-11) **Note:** Version bump only for package @chamn/build-script ## [0.1.0](https://github.com/ByteCrazy/chameleon/compare/v0.0.46...v0.1.0) (2024-09-07) ### ✨ Features | 新功能 * **build-script, demo-page, engine, layout, render:** 🎸 add lang switch ([29da65e](https://github.com/ByteCrazy/chameleon/commit/29da65ee1aa09550d910ddfbbcb9d8b4db983373)) ### 👷 Continuous Integration | CI 配置 * **build-script, docs-website, material, render:** 🎡 not build docs ([37aa10a](https://github.com/ByteCrazy/chameleon/commit/37aa10abf0324f3465a6921a9a014875e9500f8f)) ## [0.0.46](https://github.com/ByteCrazy/chameleon/compare/v0.0.45...v0.0.46) (2024-06-30) **Note:** Version bump only for package @chamn/build-script ## [0.0.45](https://github.com/ByteCrazy/chameleon/compare/v0.0.44...v0.0.45) (2024-06-30) **Note:** Version bump only for package @chamn/build-script ## [0.0.44](https://github.com/ByteCrazy/chameleon/compare/v0.0.43...v0.0.44) (2024-06-30) **Note:** Version bump only for package @chamn/build-script ## [0.0.43](https://github.com/ByteCrazy/chameleon/compare/v0.0.42...v0.0.43) (2024-06-29) ### ✨ Features | 新功能 * **build-script, engine, layout:** 🎸 remove scss dts generate ([9ba7af3](https://github.com/ByteCrazy/chameleon/commit/9ba7af30601804f94e90a0408745fd48de38d8b5)) ## [0.0.42](https://github.com/ByteCrazy/chameleon/compare/v0.0.41...v0.0.42) (2024-06-01) **Note:** Version bump only for package @chamn/build-script ## [0.0.41](https://github.com/ByteCrazy/chameleon/compare/v0.0.40...v0.0.41) (2024-05-26) ### ✨ Features | 新功能 * **build-script, engine, layout, material, model, render:** 🎸 optimize build script ([0a60cc4](https://github.com/ByteCrazy/chameleon/commit/0a60cc4f5e5635d9e544b5141eaed5b8433901a5)) ## [0.0.40](https://github.com/ByteCrazy/chameleon/compare/v0.0.39...v0.0.40) (2024-04-28) **Note:** Version bump only for package @chamn/build-script ## [0.0.39](https://github.com/ByteCrazy/chameleon/compare/v0.0.38...v0.0.39) (2024-04-27) ### 🐛 Bug Fixes | Bug 修复 * **build-script, demo-page, engine, layout, material, model, render:** 🐛 fix flatObject collectVariable refeer pos ([1c4163a](https://github.com/ByteCrazy/chameleon/commit/1c4163aeeb89176a1ff5b50f76930889df7751fe)) ## [0.0.38](https://github.com/ByteCrazy/chameleon/compare/v0.0.37...v0.0.38) (2024-04-27) **Note:** Version bump only for package @chamn/build-script ## [0.0.37](https://github.com/ByteCrazy/chameleon/compare/v0.0.36...v0.0.37) (2024-04-27) **Note:** Version bump only for package @chamn/build-script ## [0.0.36](https://github.com/ByteCrazy/chameleon/compare/v0.0.35...v0.0.36) (2024-04-27) **Note:** Version bump only for package @chamn/build-script ## [0.0.35](https://github.com/ByteCrazy/chameleon/compare/v0.0.34...v0.0.35) (2024-04-27) **Note:** Version bump only for package @chamn/build-script ## [0.0.34](https://github.com/ByteCrazy/chameleon/compare/v0.0.33...v0.0.34) (2024-04-27) **Note:** Version bump only for package @chamn/build-script ## [0.0.33](https://github.com/ByteCrazy/chameleon/compare/v0.0.32...v0.0.33) (2024-04-27) **Note:** Version bump only for package @chamn/build-script ## [0.0.32](https://github.com/ByteCrazy/chameleon/compare/v0.0.31...v0.0.32) (2024-01-30) **Note:** Version bump only for package @chamn/build-script ## [0.0.31](https://github.com/ByteCrazy/chameleon/compare/v0.0.30...v0.0.31) (2023-10-17) **Note:** Version bump only for package @chamn/build-script ## [0.0.30](https://github.com/ByteCrazy/chameleon/compare/v0.0.29...v0.0.30) (2023-10-17) **Note:** Version bump only for package @chamn/build-script ## [0.0.29](https://github.com/ByteCrazy/chameleon/compare/v0.0.28...v0.0.29) (2023-10-17) ### ✨ Features | 新功能 * **build-script, engine:** 🎸 optimize css editor ([66c0541](https://github.com/ByteCrazy/chameleon/commit/66c0541eaee12b2eb0ceb4fb3a7748e1bf69768d)) ### 🐛 Bug Fixes | Bug 修复 * **build-script, engine:** 🐛 recocer build-script bin file ([5a2ca69](https://github.com/ByteCrazy/chameleon/commit/5a2ca69c4e5c48b3b0686478f6e5c40cd21c08ad)) ## [0.0.28](https://github.com/ByteCrazy/chameleon/compare/v0.0.27...v0.0.28) (2023-08-29) **Note:** Version bump only for package @chamn/build-script ## [0.0.27](https://github.com/ByteCrazy/chameleon/compare/v0.0.26...v0.0.27) (2023-08-28) **Note:** Version bump only for package @chamn/build-script ## [0.0.26](https://github.com/ByteCrazy/chameleon/compare/v0.0.25...v0.0.26) (2023-08-27) **Note:** Version bump only for package @chamn/build-script ## [0.0.25](https://github.com/ByteCrazy/chameleon/compare/v0.0.24...v0.0.25) (2023-08-27) **Note:** Version bump only for package @chamn/build-script ## [0.0.24](https://github.com/ByteCrazy/chameleon/compare/v0.0.23...v0.0.24) (2023-08-27) **Note:** Version bump only for package @chamn/build-script ## [0.0.23](https://github.com/ByteCrazy/chameleon/compare/v0.0.22...v0.0.23) (2023-08-26) **Note:** Version bump only for package @chamn/build-script ## [0.0.22](https://github.com/ByteCrazy/chameleon/compare/v0.0.21...v0.0.22) (2023-08-24) **Note:** Version bump only for package @chamn/build-script ## [0.0.21](https://github.com/ByteCrazy/chameleon/compare/v0.0.20...v0.0.21) (2023-08-19) **Note:** Version bump only for package @chamn/build-script ## [0.0.20](https://github.com/ByteCrazy/chameleon/compare/v0.0.19...v0.0.20) (2023-08-19) **Note:** Version bump only for package @chamn/build-script ## [0.0.19](https://github.com/ByteCrazy/chameleon/compare/v0.0.18...v0.0.19) (2023-08-17) **Note:** Version bump only for package @chamn/build-script ## [0.0.18](https://github.com/ByteCrazy/chameleon/compare/v0.0.17...v0.0.18) (2023-08-14) **Note:** Version bump only for package @chamn/build-script ## [0.0.17](https://github.com/ByteCrazy/chameleon/compare/v0.0.16...v0.0.17) (2023-08-06) **Note:** Version bump only for package @chamn/build-script ## [0.0.16](https://github.com/ByteCrazy/chameleon/compare/v0.0.15...v0.0.16) (2023-08-06) **Note:** Version bump only for package @chamn/build-script ## [0.0.15](https://github.com/ByteCrazy/chameleon/compare/v0.0.14...v0.0.15) (2023-07-01) **Note:** Version bump only for package @chamn/build-script ## [0.0.14](https://github.com/ByteCrazy/chameleon/compare/v0.0.13...v0.0.14) (2023-05-10) **Note:** Version bump only for package @chamn/build-script ## [0.0.13](https://github.com/ByteCrazy/chameleon/compare/v0.0.12...v0.0.13) (2023-05-03) ### ✨ Features | 新功能 * **build-script, build-script-example, demo-page, engine, layout, material, model, render:** 🎸 config code style config ([2325504](https://github.com/ByteCrazy/chameleon/commit/23255048fa4a3d4fc8f5cfa1312db5abd6cac70d)) * **build-script, demo-page, engine, layout, model, render:** 🎸 update meterial schema ([14f4e5c](https://github.com/ByteCrazy/chameleon/commit/14f4e5caf0a4f6eca131e139d0c34ea21969dc0b)) ## [0.0.12](https://github.com/ByteCrazy/chameleon/compare/v0.0.11...v0.0.12) (2023-04-23) ### 🐛 Bug Fixes | Bug 修复 * **build-script, build-script-example, engine, layout, material, model, render:** 🐛 fix can not find vite/client.d.ts problem ([8a53540](https://github.com/ByteCrazy/chameleon/commit/8a53540f75737707f69f93d2f701203dbf88084a)) ## [0.0.11](https://github.com/ByteCrazy/chameleon/compare/v0.0.10...v0.0.11) (2023-04-21) ### ✨ Features | 新功能 * **build-script, build-script-example, demo-page, engine, layout, material, model, render:** 🎸 optimize build-script output file format ([eda44d2](https://github.com/ByteCrazy/chameleon/commit/eda44d255bd3c5af19013bdd61342e1f0817413a)) * **build-script, docs-website, engine:** 🎸 add material develop doc ([0aacca0](https://github.com/ByteCrazy/chameleon/commit/0aacca0f726bc13606b814f8890b4e8ff8982142)) ## [0.0.10](https://github.com/ByteCrazy/chameleon/compare/v0.0.9...v0.0.10) (2023-04-17) **Note:** Version bump only for package @chamn/build-script ## [0.0.9](https://github.com/ByteCrazy/chameleon/compare/v0.0.8...v0.0.9) (2023-04-17) ### ✨ Features | 新功能 * **build-script:** 🎸 build.config supprot es module ([275c97d](https://github.com/ByteCrazy/chameleon/commit/275c97d861b6394fbdd13b92fd1049c208f72b39)) ## [0.0.8](https://github.com/ByteCrazy/chameleon/compare/v0.0.7...v0.0.8) (2023-04-16) ### ✨ Features | 新功能 * **build-script, engine, layout, model, render:** 🎸 optimize pack package ([78d99c5](https://github.com/ByteCrazy/chameleon/commit/78d99c507ad65ca39101f0239467737d2b445c87)) ### 📝 Documentation | 文档 * **build-script, docs-website:** ✏️ change quickStart md ([f43945f](https://github.com/ByteCrazy/chameleon/commit/f43945fdd7eaf03b4ad3099980d7f3fb0a949b4c)) ## [0.0.7](https://github.com/ByteCrazy/chameleon/compare/v0.0.6...v0.0.7) (2023-03-29) ### ✨ Features | 新功能 * **build-script, build-script-example, demo-page, engine, layout, material, model, render:** 🎸 external monaco eitor and remove style panel ([494d898](https://github.com/ByteCrazy/chameleon/commit/494d898fd75dabe84d867ff45e84ae63f9b59c5e)) ## [0.0.6](https://github.com/ByteCrazy/chameleon/compare/v0.0.5...v0.0.6) (2023-03-28) **Note:** Version bump only for package @chamn/build-script ## [0.0.5](https://github.com/ByteCrazy/chameleon/compare/v0.0.4...v0.0.5) (2023-03-28) ### ✨ Features | 新功能 * **build-script, engine, layout, material, model, render:** 🎸 complete package info ([86b095d](https://github.com/ByteCrazy/chameleon/commit/86b095da6c955946300591b1775f59c1a141c065)) ## [0.0.4](https://github.com/ByteCrazy/chameleon/compare/v0.0.3...v0.0.4) (2023-03-27) **Note:** Version bump only for package @chamn/build-script ## [0.0.2](https://github.com/ByteCrazy/chameleon/compare/v0.0.1...v0.0.2) (2023-03-27) **Note:** Version bump only for package @chamn/build-script ================================================ FILE: packages/build-script/README.md ================================================ # @chamn/build-script 基于 Vite 的构建工具,用于构建库(Library)和应用(Application)项目。支持多种输出格式、TypeScript 类型定义生成、开发服务器等功能。 ## 特性 - 🚀 基于 Vite,构建速度快 - 📦 支持多种输出格式:`cjs`、`es`、`umd`、`iife` - 📝 自动生成 TypeScript 类型定义(.d.ts) - 🔧 灵活的依赖外部化配置 - 🎯 支持按格式配置不同的 external 规则 - 🔍 支持构建分析(bundle analyzer) - 👀 支持 watch 模式 - 🛠️ 支持开发服务器 - ⚙️ 支持自定义 Vite 配置 ## 安装 ```bash npm install @chamn/build-script --save-dev ``` ## 快速开始 ### 1. 创建配置文件 在项目根目录创建 `build.config.js` 或 `build.config.ts` 文件: ```javascript // build.config.js export default { libMode: true, // 是否为库模式,false 为应用模式 entry: './src/index.tsx', // 入口文件 libName: 'MyLibrary', // 库名称(UMD 格式需要) fileName: 'index', // 输出文件名 formats: ['cjs', 'es', 'umd'], // 输出格式 }; ``` ### 2. 配置 package.json ```json { "scripts": { "dev": "build-script", "build": "build-script --build", "build:watch": "build-script --build --watch", "build:analyze": "build-script --build --analyze" } } ``` ### 3. 运行命令 ```bash # 开发模式 npm run dev # 构建 npm run build # 构建(watch 模式) npm run build:watch # 构建(分析模式) npm run build:analyze ``` ## 配置选项 ### BuildScriptConfig ```typescript type BuildScriptConfig = { // 是否为库模式,false 为应用模式(默认:true) libMode?: boolean; // 入口文件路径(必需) entry: string; // 库名称(UMD 格式需要) libName?: string; // 输出文件名(默认:'index') fileName?: string; // 样式文件名(默认:'style') cssFileName?: string; // 通用的 external 配置,对所有格式生效 external?: ExternalOption; // 按格式配置不同的 external 规则,优先级高于 external externalByFormat?: { es?: ExternalOption; cjs?: ExternalOption; umd?: ExternalOption; iife?: ExternalOption; }; // 自定义需要排除的别名前缀列表,这些路径不会被外部化 // 默认值:['@/', '~/', '#/'] externalAlias?: string[]; // UMD 格式的全局变量映射 global?: Record; // 输出格式(默认:build 模式为 ['cjs', 'es', 'umd'],dev 模式为 ['cjs', 'es']) formats?: LibraryOptions['formats']; // 自定义 Vite 配置 vite?: UserConfig; }; ``` ### ExternalOption ```typescript type ExternalOption = (string | RegExp)[] | ((id: string, importer?: string, isResolved?: boolean) => boolean); ``` ## 使用示例 ### 库模式(Library Mode) ```javascript // build.config.js export default { libMode: true, entry: './src/index.tsx', libName: 'MyLibrary', fileName: 'index', formats: ['cjs', 'es', 'umd'], global: { react: 'React', 'react-dom': 'ReactDOM', }, // 模块格式(es, cjs)使用严格的 external externalByFormat: { es: (id) => { if (id.startsWith('.') || id.startsWith('/')) return false; if (id.startsWith('@/')) return false; return true; // 外部化所有 node_modules 依赖 }, cjs: (id) => { if (id.startsWith('.') || id.startsWith('/')) return false; if (id.startsWith('@/')) return false; return true; }, // 浏览器格式(umd)只外部化 react 和 react-dom umd: ['react', 'react-dom'], }, }; ``` ### 应用模式(Application Mode) ```javascript // build.config.js export default { libMode: false, entry: './src/index.tsx', vite: { base: '/my-app/', build: { outDir: './dist', copyPublicDir: true, }, plugins: [ // 自定义插件 ], }, }; ``` ### 自定义别名配置 ```javascript // build.config.js export default { entry: './src/index.tsx', libName: 'MyLibrary', // 自定义别名前缀,这些路径不会被外部化 externalAlias: ['@/', '~/', '#/', '$lib/'], }; ``` ### 自定义 Vite 配置 ```javascript // build.config.js export default { entry: './src/index.tsx', libName: 'MyLibrary', vite: { define: { 'process.env.NODE_ENV': JSON.stringify('production'), __VERSION__: JSON.stringify('1.0.0'), }, plugins: [ // 自定义 Vite 插件 ], build: { minify: 'terser', terserOptions: { compress: { drop_console: true, }, }, }, }, }; ``` ## CLI 参数 ```bash build-script [options] ``` ### 选项 - `--build`: 构建模式(默认:开发模式) - `--watch`: Watch 模式,文件变化时自动重新构建 - `--analyze`: 构建分析模式,生成并打开 bundle 分析报告 - `--generateDTS`: 生成 TypeScript 类型定义(默认:true,设置为 false 可禁用) - `--sourcemap`: 生成 sourcemap(默认:true) ### 示例 ```bash # 开发模式 build-script # 构建模式 build-script --build # 构建 + Watch 模式 build-script --build --watch # 构建 + 分析 build-script --build --analyze # 构建 + 不生成类型定义 build-script --build --generateDTS=false # 构建 + 不生成 sourcemap build-script --build --sourcemap=false ``` ## 输出格式说明 ### CommonJS (cjs) 适用于 Node.js 环境,使用 `require()` 导入。 ```javascript const MyLibrary = require('my-library'); ``` ### ES Module (es) 适用于现代打包工具和浏览器,使用 `import` 导入。 ```javascript import MyLibrary from 'my-library'; ``` ### UMD (umd) 通用模块定义,同时支持 CommonJS、AMD 和全局变量。 ```html ``` ### IIFE (iife) 立即执行函数表达式,适用于直接在浏览器中使用。 ## 依赖外部化(External) ### 默认行为 - **模块格式(es, cjs)**:默认外部化所有 `node_modules` 中的依赖,但保留项目内部文件(相对路径、别名路径) - **浏览器格式(umd, iife)**:默认只外部化 `react` 和 `react-dom` ### 自定义 External 配置 #### 方式一:通用配置 ```javascript export default { entry: './src/index.tsx', // 所有格式都使用这个配置 external: ['react', 'react-dom', 'lodash'], }; ``` #### 方式二:按格式配置(推荐) ```javascript export default { entry: './src/index.tsx', externalByFormat: { // 模块格式:外部化所有依赖 es: (id) => { if (id.startsWith('.') || id.startsWith('/')) return false; if (id.startsWith('@/')) return false; return true; }, cjs: (id) => { if (id.startsWith('.') || id.startsWith('/')) return false; if (id.startsWith('@/')) return false; return true; }, // 浏览器格式:只外部化 react 和 react-dom umd: ['react', 'react-dom'], }, }; ``` #### 方式三:函数式配置 ```javascript export default { entry: './src/index.tsx', external: (id) => { // 不外部化项目内部文件 if (id.startsWith('.') || id.startsWith('/')) return false; if (id.startsWith('@/')) return false; // 外部化特定依赖 if (id === 'react' || id === 'react-dom') return true; // 其他依赖打包进库 return false; }, }; ``` ## TypeScript 支持 ### 类型定义生成 默认会自动生成 TypeScript 类型定义文件(.d.ts),输出到 `dist` 目录。 如需禁用: ```bash build-script --build --generateDTS=false ``` 或在配置中: ```javascript // 注意:CLI 参数优先级更高 export default { entry: './src/index.tsx', // ... }; ``` ### 类型导出 在 `package.json` 中配置: ```json { "main": "./dist/index.cjs.js", "module": "./dist/index.es.js", "types": "./dist/index.d.ts", "exports": { ".": { "import": "./dist/index.es.js", "require": "./dist/index.cjs.js", "types": "./dist/index.d.ts" } } } ``` ## 开发服务器 开发模式下会自动启动 Vite 开发服务器: ```bash build-script # 或 build-script --dev ``` 默认端口:`3000` 自定义端口: ```javascript // build.config.js export default { entry: './src/index.tsx', vite: { server: { port: 8080, }, }, }; ``` ## 构建分析 使用 `--analyze` 参数可以生成并打开 bundle 分析报告: ```bash build-script --build --analyze ``` 这会生成一个可视化的 bundle 分析报告,帮助你了解打包后的文件大小和依赖关系。 ## 常见问题 ### Q: 如何排除某些依赖不被打包? A: 使用 `external` 或 `externalByFormat` 配置: ```javascript export default { external: ['lodash', 'moment'], }; ``` ### Q: 如何打包所有依赖? A: 设置 `external` 为空数组: ```javascript export default { external: [], }; ``` ### Q: 如何自定义输出目录? A: 在 `vite` 配置中设置: ```javascript export default { vite: { build: { outDir: './output', }, }, }; ``` ### Q: 如何禁用类型定义生成? A: 使用 CLI 参数: ```bash build-script --build --generateDTS=false ``` ### Q: 如何配置别名路径? A: 在 `vite` 配置中设置: ```javascript export default { vite: { resolve: { alias: { '@': path.resolve(__dirname, './src'), }, }, }, }; ``` ## 许可证 ISC ## 作者 levin ================================================ FILE: packages/build-script/bin/run.js ================================================ #!/usr/bin/env node async function start() { const bScript = await import('../lib/index.mjs'); bScript.run(); } start(); ================================================ FILE: packages/build-script/client.d.ts ================================================ /// ================================================ FILE: packages/build-script/jest.config.js ================================================ /* * For a detailed explanation regarding each configuration property, visit: * https://jestjs.io/docs/configuration */ module.exports = { // All imported modules in your tests should be mocked automatically // automock: false, // Stop running tests after `n` failures // bail: 0, // The directory where Jest should store its cached dependency information // cacheDirectory: "/private/var/folders/l9/th_r5d_12wxdj16859_mctjw0000gn/T/jest_dx", // Automatically clear mock calls, instances, contexts and results before every test clearMocks: true, extensionsToTreatAsEsm: ['.ts'], // Indicates whether the coverage information should be collected while executing the test collectCoverage: false, // An array of glob patterns indicating a set of files for which coverage information should be collected collectCoverageFrom: ['src/**/*.{ts,tsx}', '!**/node_modules/**', '!**/vendor/**'], testMatch: ['/tests/**/*.test.ts'], // The directory where Jest should output its coverage files coverageDirectory: 'coverage', // An array of regexp pattern strings used to skip coverage collection // coveragePathIgnorePatterns: [ // "/node_modules/" // ], // Indicates which provider should be used to instrument code for coverage // coverageProvider: "babel", // A list of reporter names that Jest uses when writing coverage reports // coverageReporters: [ // "json", // "text", // "lcov", // "clover" // ], // An object that configures minimum threshold enforcement for coverage results // coverageThreshold: undefined, // A path to a custom dependency extractor // dependencyExtractor: undefined, // Make calling deprecated APIs throw helpful error messages // errorOnDeprecated: false, // The default configuration for fake timers // fakeTimers: { // "enableGlobally": false // }, // Force coverage collection from ignored files using an array of glob patterns // forceCoverageMatch: [], // A path to a module which exports an async function that is triggered once before all test suites // globalSetup: undefined, // A path to a module which exports an async function that is triggered once after all test suites // globalTeardown: undefined, // A set of global variables that need to be available in all test environments // globals: {}, // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. // maxWorkers: "50%", // An array of directory names to be searched recursively up from the requiring module's location // moduleDirectories: [ // "node_modules" // ], // An array of file extensions your modules use // moduleFileExtensions: [ // "js", // "mjs", // "cjs", // "jsx", // "ts", // "tsx", // "json", // "node" // ], // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module // moduleNameMapper: {}, // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader // modulePathIgnorePatterns: [], // Activates notifications for test results // notify: false, // An enum that specifies notification mode. Requires { notify: true } // notifyMode: "failure-change", // A preset that is used as a base for Jest's configuration preset: 'ts-jest', // Run tests from one or more projects // projects: undefined, // Use this configuration option to add custom reporters to Jest // reporters: undefined, // Automatically reset mock state before every test // resetMocks: false, // Reset the module registry before running each individual test // resetModules: false, // A path to a custom resolver // resolver: undefined, // Automatically restore mock state and implementation before every test // restoreMocks: false, // The root directory that Jest should scan for tests and modules within // rootDir: undefined, // A list of paths to directories that Jest should use to search for files in // roots: [ // "" // ], // Allows you to use a custom runner instead of Jest's default test runner // runner: "jest-runner", // The paths to modules that run some code to configure or set up the testing environment before each test // setupFiles: [], // A list of paths to modules that run some code to configure or set up the testing framework before each test // setupFilesAfterEnv: [], // The number of seconds after which a test is considered as slow and reported as such in the results. // slowTestThreshold: 5, // A list of paths to snapshot serializer modules Jest should use for snapshot testing // snapshotSerializers: [], // The test environment that will be used for testing testEnvironment: 'node', // Options that will be passed to the testEnvironment // testEnvironmentOptions: {}, // Adds a location field to test results // testLocationInResults: false, // The glob patterns Jest uses to detect test files // testMatch: [ // "**/__tests__/**/*.[jt]s?(x)", // "**/?(*.)+(spec|test).[tj]s?(x)" // ], // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped // testPathIgnorePatterns: [ // "/node_modules/" // ], // The regexp pattern or array of patterns that Jest uses to detect test files // testRegex: [], // This option allows the use of a custom results processor // testResultsProcessor: undefined, // This option allows use of a custom test runner // testRunner: "jest-circus/runner", // A map from regular expressions to paths to transformers // transform: undefined, // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation transformIgnorePatterns: ['/node_modules/', '\\.pnp\\.[^\\/]+$'], // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them // unmockedModulePathPatterns: undefined, // Indicates whether each individual test should be reported during the run // verbose: undefined, // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode // watchPathIgnorePatterns: [], // Whether to use watchman for file crawling // watchman: true, }; ================================================ FILE: packages/build-script/package.json ================================================ { "name": "@chamn/build-script", "version": "0.10.4", "publishConfig": { "access": "public" }, "description": "", "main": "./lib/index.mjs", "bin": { "build-script": "./bin/run.js" }, "exports": { ".": { "types": "./lib/index.d.ts", "module-sync": "./lib/index.mjs", "import": "./lib/index.mjs", "require": "./lib/index.cjs" }, "./lib/index.d.ts": "./lib/index.d.ts", "./client.d.ts": "./client.d.ts", "./package.json": "./package.json" }, "scripts": { "start": "npm run clean && node scripts/build.cjs", "build:tsc": "tsc ./src/index.ts --declaration --emitDeclarationOnly --esModuleInterop true --skipLibCheck true --outDir ./lib ", "build": "npm run clean && npm run build:tsc && node scripts/build.cjs", "build:w": "npm run clean && nodemon --watch ./src -e ts,tsx,js,json scripts/build.cjs", "clean": "rimraf es lib dist types generated demo coverage output", "test": "echo 'skip test'", "test:cov": "jest --coverage", "test:update-snapshots": "cross-env jest -u" }, "author": "levin", "license": "ISC", "devDependencies": { "@types/fs-extra": "^9.0.13", "@types/jest": "^28.1.6", "@types/node": "~22.10.0", "@types/yargs-parser": "^21.0.0", "esbuild": "^0.27.2", "lodash": "^4.17.21", "nodemon": "^3.1.9" }, "dependencies": { "@vitejs/plugin-react": "^4.3.4", "concurrently": "^7.3.0", "fs-extra": "^10.1.0", "jest": "^28.1.3", "jest-environment-jsdom": "^28.1.3", "merge": "^2.1.1", "prettier": "2.7.1", "rimraf": "^4.4.1", "rollup-plugin-visualizer": "^5.12.0", "ts-jest": "^28.0.7", "ts-node": "^10.9.1", "typescript": "~5.7.2", "vite": "^6.2.2", "vite-plugin-dts": "^4.3.0", "vite-plugin-eslint2": "^5.0.3", "yargs-parser": "^21.0.1" }, "config": {}, "gitHead": "dc3e55fdeb903a8012f6ebd3ebc018ed61ad89db" } ================================================ FILE: packages/build-script/scripts/build.cjs ================================================ /* eslint-disable no-undef */ /* eslint-disable @typescript-eslint/no-require-imports */ const _ = require('lodash'); const esbuild = require('esbuild'); const concurrently = require('concurrently'); const argv = require('yargs-parser')(process.argv.slice(2)); const packageJson = require('../package.json'); if (!argv.format) { buildAll(process.argv.slice(2).join(' ')); } else { buildFormat(argv.format, argv.out || 'dist'); } function buildAll(options) { concurrently( [ { name: 'build:cjs', command: `node scripts/build.cjs --format=cjs --out=lib ${options}` }, { name: 'build:esm', command: `node scripts/build.cjs --format=esm --out=lib ${options}` }, ], { prefix: 'name', killOthers: ['failure'], restartTries: 0, } ).result.then( () => { console.log('all done.'); }, () => { process.exit(1); } ); } async function buildFormat(format, outDir) { const extMap = { esm: 'mjs', cjs: 'cjs', }; try { console.log('building %s...', format); let config = { entryPoints: ['src/index.ts'], outfile: `${outDir}/index.${extMap[format]}`, bundle: true, platform: 'node', target: ['node10'], format, sourcemap: true, sourcesContent: true, define: {}, treeShaking: true, external: _.keys(packageJson.dependencies), minify: false, legalComments: 'external', }; if (argv.watch) { config.watch = { onRebuild(error, result) { if (error) console.error('watch build failed:', error); else console.log('watch build succeeded:', result); }, }; } const startTime = Date.now(); const result = await esbuild.build(config); if (result.errors.length > 0) { throw result.errors; } if (result.warnings.length > 0) { result.warnings.forEach((warnings) => { console.warn(warnings); }); } console.log('built %s in %ds', format, ((Date.now() - startTime) / 1000).toFixed(2)); } catch (e) { console.error(e); process.exit(1); } } ================================================ FILE: packages/build-script/src/config/base.ts ================================================ import path from 'path'; import fs from 'fs-extra'; import { loadConfigFromFile, type LibraryOptions, type UserConfig } from 'vite'; import argv from 'yargs-parser'; const cliArgs: { dev: boolean; build: boolean; watch: boolean; analyze: boolean; generateDTS: boolean; sourcemap: boolean; } = argv(process.argv.slice(2)) as any; export const CLI_ARGS_OBJ = cliArgs; export const PROJECT_ROOT = path.resolve(process.cwd()); let customConfigPath = `${PROJECT_ROOT}/build.config.js`; if (!fs.pathExistsSync(customConfigPath)) { customConfigPath = `${PROJECT_ROOT}/build.config.ts`; } export type ExternalOption = (string | RegExp)[] | ((id: string, importer?: string, isResolved?: boolean) => boolean); export type BuildScriptConfig = { libMode?: boolean; entry: string; libName?: string; fileName?: string; /* 样式文件名 */ cssFileName?: string; /* 通用的 external 配置,对所有格式生效 */ external?: ExternalOption; /* 按格式配置不同的 external 规则,优先级高于 external */ externalByFormat?: { es?: ExternalOption; cjs?: ExternalOption; umd?: ExternalOption; iife?: ExternalOption; }; /* 自定义需要排除的别名前缀列表,这些路径不会被外部化 * 默认值:['@/', '~/', '#/'] * 示例:['@/', '~/', '$lib/', '@src/'] */ externalAlias?: string[]; global?: Record; formats?: LibraryOptions['formats']; vite?: UserConfig; }; export let CUSTOM_CONFIG: BuildScriptConfig = null as any; export const isBuild = !!process.env.VITE_TEST_BUILD; export const getCustomConfig = async () => { if (CUSTOM_CONFIG) { return CUSTOM_CONFIG; } if (fs.pathExistsSync(customConfigPath)) { const customConfig = await loadConfigFromFile({} as any, customConfigPath, PROJECT_ROOT); CUSTOM_CONFIG = customConfig?.config as BuildScriptConfig; return customConfig?.config as BuildScriptConfig; } }; ================================================ FILE: packages/build-script/src/config/vite.build.ts ================================================ import { CLI_ARGS_OBJ, PROJECT_ROOT, getCustomConfig } from './base'; import { getCommonConfig } from './vite.common'; import { visualizer } from 'rollup-plugin-visualizer'; import path from 'path'; import dts from 'vite-plugin-dts'; import { mergeConfig, type LibraryFormats } from 'vite'; const generateDTS = CLI_ARGS_OBJ.generateDTS; // https://vitejs.dev/config/ export const buildConfig = async function (specifiedFormats?: LibraryFormats[], keepOutDir: boolean = false) { const CUSTOM_CONFIG = await getCustomConfig(); const commonConfig = await getCommonConfig(specifiedFormats); const plugins: any[] = []; // 只在第一次构建时生成 DTS(非 umd 单独构建时) if (generateDTS !== false && !keepOutDir) { plugins.push( dts({ entryRoot: path.resolve(PROJECT_ROOT, './src'), compilerOptions: { skipDefaultLibCheck: false, }, }) ); } if (CLI_ARGS_OBJ.analyze) { plugins.push( visualizer({ open: true, }) ); } const config = mergeConfig(commonConfig, { mode: 'production', configFile: false, build: { watch: CLI_ARGS_OBJ.watch ?? false, emptyOutDir: !keepOutDir, // 如果 keepOutDir 为 true,不清空输出目录 }, plugins: plugins, }); // 合并自定义 vite 配置 // 注意:如果自定义配置中设置了 build.rollupOptions,它会覆盖基础配置 // 因此建议在自定义配置中明确设置完整的 rollupOptions const finalConfig = mergeConfig(config, CUSTOM_CONFIG?.vite || {}); return finalConfig; }; ================================================ FILE: packages/build-script/src/config/vite.common.ts ================================================ import path from 'path'; import react from '@vitejs/plugin-react'; import { CLI_ARGS_OBJ, PROJECT_ROOT, getCustomConfig } from './base'; import { defineConfig, type LibraryFormats } from 'vite'; import eslint from 'vite-plugin-eslint2'; // https://vitejs.dev/config/ export const getCommonConfig = async (specifiedFormats?: LibraryFormats[]) => { const CUSTOM_CONFIG = await getCustomConfig(); if (!CUSTOM_CONFIG?.entry) { throw new Error('entry not find'); } // 生产模式下默认包含 umd,否则只有 cjs 和 es const defaultFormats: LibraryFormats[] = CLI_ARGS_OBJ.build ? ['cjs', 'es', 'umd'] : ['cjs', 'es']; const formats = specifiedFormats || CUSTOM_CONFIG.formats || defaultFormats; // 根据当前构建的格式来决定 external 的逻辑 const getExternal = () => { // 开发模式下不使用 external,打包所有依赖 if (CLI_ARGS_OBJ.dev || !CLI_ARGS_OBJ.build) { return []; } // 优先使用按格式配置的 external if (CUSTOM_CONFIG.externalByFormat) { // 如果是单个格式,直接使用对应的配置 if (formats.length === 1) { const format = formats[0] as keyof typeof CUSTOM_CONFIG.externalByFormat; const externalForFormat = CUSTOM_CONFIG.externalByFormat[format]; if (externalForFormat !== undefined) { return externalForFormat; } } // 如果是多个格式,检查是否都是同一组 const isAllModuleFormats = formats.every((f) => f === 'es' || f === 'cjs'); const isAllBrowserFormats = formats.every((f) => f === 'umd' || f === 'iife'); if (isAllModuleFormats) { // 如果都是模块格式,优先使用 es 的配置,然后是 cjs const moduleExternal = CUSTOM_CONFIG.externalByFormat.es || CUSTOM_CONFIG.externalByFormat.cjs; if (moduleExternal) { return moduleExternal; } } if (isAllBrowserFormats) { // 如果都是浏览器格式,优先使用 umd 的配置,然后是 iife const browserExternal = CUSTOM_CONFIG.externalByFormat.umd || CUSTOM_CONFIG.externalByFormat.iife; if (browserExternal) { return browserExternal; } } } // 如果用户自定义了通用的 external,使用自定义配置 if (CUSTOM_CONFIG.external) { return CUSTOM_CONFIG.external; } // 默认规则:判断当前格式组 const isAllBrowserFormats = formats.every((f) => f === 'umd' || f === 'iife'); if (isAllBrowserFormats) { // 浏览器格式(umd, iife):只过滤 react 和 react-dom return ['react', 'react-dom']; } // 模块格式(es, cjs)或混合格式:使用更严格的过滤规则 // 排除项目内部文件:相对路径、绝对路径、别名路径 return (id: string) => { // 相对路径或绝对路径:项目内部文件 if (id.startsWith('.') || id.startsWith('/')) { return false; } // 检查别名路径:使用用户配置的 externalAlias 或默认值 const aliasPrefixes = CUSTOM_CONFIG.externalAlias || ['@/', '~/', '#/']; if (aliasPrefixes.some((prefix) => id.startsWith(prefix))) { return false; // 不外部化,需要打包 } // 其他情况:node_modules 中的依赖,应该外部化 return true; }; }; const commonConfigJson = defineConfig({ root: PROJECT_ROOT, build: { sourcemap: CLI_ARGS_OBJ.sourcemap ?? true, lib: { name: CUSTOM_CONFIG.libName, entry: path.resolve(PROJECT_ROOT, CUSTOM_CONFIG.entry), formats: formats, fileName: (format: string) => `${CUSTOM_CONFIG.fileName || 'index'}.${format}.js`, cssFileName: CUSTOM_CONFIG.cssFileName ?? 'style', }, rollupOptions: { // 确保外部化处理那些你不想打包进库的依赖 external: getExternal(), output: { // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量 globals: CUSTOM_CONFIG.global || {}, }, }, }, plugins: [react(), eslint()], }); if (CUSTOM_CONFIG.libMode === false) { delete commonConfigJson?.build?.lib; delete commonConfigJson?.build?.rollupOptions; } return commonConfigJson; }; ================================================ FILE: packages/build-script/src/config/vite.dev.ts ================================================ import { getCommonConfig } from './vite.common'; import { getCustomConfig } from './base'; import { mergeConfig } from 'vite'; // https://vitejs.dev/config/ export const devConfig = async () => { const CUSTOM_CONFIG = await getCustomConfig(); const commonConfig = await getCommonConfig(); const config = mergeConfig(commonConfig, { mode: 'development', configFile: false, server: { port: 3000, }, }); const finalConfig = mergeConfig(config, CUSTOM_CONFIG?.vite || {}); // const fp = `${PROJECT_ROOT}/.temp.vite.config.json`; return finalConfig; }; ================================================ FILE: packages/build-script/src/core/devServer.ts ================================================ import { createServer } from 'vite'; import { devConfig } from '../config/vite.dev'; export const doDev = async () => { const server = await createServer(await devConfig()); await server.listen(); server.printUrls(); }; ================================================ FILE: packages/build-script/src/core/doBuild.ts ================================================ import { build } from 'vite'; import { buildConfig } from '../config/vite.build'; import { getCustomConfig, CLI_ARGS_OBJ } from '../config/base'; import type { LibraryFormats } from 'vite'; export const doBuild = async () => { console.log('start to build .....'); const CUSTOM_CONFIG = await getCustomConfig(); const defaultFormats: LibraryFormats[] = CLI_ARGS_OBJ.build ? ['cjs', 'es', 'umd'] : ['cjs', 'es']; const formats = CUSTOM_CONFIG?.formats || defaultFormats; // 将格式分为两组: // 1. 模块格式组(es, cjs)- 通常使用更严格的 external // 2. 浏览器格式组(umd, iife)- 通常只 external react, react-dom const moduleFormats = formats.filter((f) => f === 'es' || f === 'cjs') as LibraryFormats[]; const browserFormats = formats.filter((f) => f === 'umd' || f === 'iife') as LibraryFormats[]; const hasModuleFormats = moduleFormats.length > 0; const hasBrowserFormats = browserFormats.length > 0; // 如果两组都存在,分两次构建 if (hasModuleFormats && hasBrowserFormats) { // 先构建模块格式(es, cjs) console.log(`Building module formats: ${moduleFormats.join(', ')}...`); await build(await buildConfig(moduleFormats)); // 再构建浏览器格式(umd, iife),不清空输出目录 console.log(`Building browser formats: ${browserFormats.join(', ')}...`); await build(await buildConfig(browserFormats, true)); } else { // 如果只有一组格式,正常构建 await build(await buildConfig()); } console.log('build finished.'); }; ================================================ FILE: packages/build-script/src/index.ts ================================================ #!/usr/bin/env node import { CLI_ARGS_OBJ } from './config/base'; import { doDev } from './core/devServer'; import { doBuild } from './core/doBuild'; export * from './config/base'; export * from './config/vite.common'; export * from './config/vite.build'; export * from './config/vite.dev'; export function run() { if (CLI_ARGS_OBJ.build) { doBuild(); } else { doDev(); } } export * from './config/base'; ================================================ FILE: packages/build-script/test/demo.test.ts ================================================ import { a } from '../src'; describe('cli', () => { it('init', () => { expect(a()).toEqual(1); }); }); ================================================ FILE: packages/build-script/tsconfig.json ================================================ { "compilerOptions": { "module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, "strict": true /* Enable all strict type-checking options. */, "moduleResolution": "bundler" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, "types": [ "node", "jest" ], "skipLibCheck": true /* Skip type checking of declaration files. */, "outDir": "lib", "forceConsistentCasingInFileNames": true, "declaration": true, "esModuleInterop": true, "paths": { "@": [ "./src" ] } }, "exclude": [ "test", "lib" ] } ================================================ FILE: packages/demo-page/.gitignore ================================================ # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log* node_modules dist dist-ssr *.local # Editor directories and files .vscode/* !.vscode/extensions.json .idea .DS_Store *.suo *.ntvs* *.njsproj *.sln *.sw? ================================================ FILE: packages/demo-page/.prettierrc.json ================================================ { "trailingComma": "es5", "tabWidth": 2, "semi": true, "singleQuote": true } ================================================ FILE: packages/demo-page/CHANGELOG.md ================================================ # Change Log All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. ## [0.10.4](https://github.com/ByteCrazy/chameleon/compare/v0.10.3...v0.10.4) (2026-01-17) **Note:** Version bump only for package @chamn/demo-page ## [0.10.3](https://github.com/ByteCrazy/chameleon/compare/v0.10.2...v0.10.3) (2026-01-17) **Note:** Version bump only for package @chamn/demo-page ## [0.10.2](https://github.com/ByteCrazy/chameleon/compare/v0.10.1...v0.10.2) (2026-01-17) **Note:** Version bump only for package @chamn/demo-page ## [0.10.1](https://github.com/ByteCrazy/chameleon/compare/v0.10.0...v0.10.1) (2026-01-11) ### ✨ Features | 新功能 * **build-script, demo-page, engine, render:** 🎸 update build script dts & optimize modal root selector ([024d5ab](https://github.com/ByteCrazy/chameleon/commit/024d5ab26d19fc5f50172c328638a551fb99c129)) ## [0.10.0](https://github.com/hlerenow/chameleon/compare/v0.9.3...v0.10.0) (2025-12-25) ### 🐛 Bug Fixes | Bug 修复 * 优化构建配置,修复 ES 模块外部化问题 ([866f0ae](https://github.com/hlerenow/chameleon/commit/866f0ae39472625137d73d143625d88d873f6c00)) ## [0.9.3](https://github.com/ByteCrazy/chameleon/compare/v0.9.2...v0.9.3) (2025-07-20) **Note:** Version bump only for package @chamn/demo-page ## [0.9.2](https://github.com/ByteCrazy/chameleon/compare/v0.9.1...v0.9.2) (2025-07-13) **Note:** Version bump only for package @chamn/demo-page ## [0.9.1](https://github.com/ByteCrazy/chameleon/compare/v0.9.0...v0.9.1) (2025-07-13) **Note:** Version bump only for package @chamn/demo-page ## [0.9.0](https://github.com/ByteCrazy/chameleon/compare/v0.8.6...v0.9.0) (2025-07-13) **Note:** Version bump only for package @chamn/demo-page ## [0.8.6](https://github.com/ByteCrazy/chameleon/compare/v0.8.5...v0.8.6) (2025-06-21) ### 🐛 Bug Fixes | Bug 修复 * **demo-page, engine, render:** 🐛 fixed action flow failed node not connect correct ([e235a2b](https://github.com/ByteCrazy/chameleon/commit/e235a2be2d1e1935dfc40b56936de763efc4fb67)) ## [0.8.5](https://github.com/ByteCrazy/chameleon/compare/v0.8.4...v0.8.5) (2025-04-13) **Note:** Version bump only for package @chamn/demo-page ## [0.8.4](https://github.com/ByteCrazy/chameleon/compare/v0.8.3...v0.8.4) (2025-04-13) **Note:** Version bump only for package @chamn/demo-page ## [0.8.3](https://github.com/ByteCrazy/chameleon/compare/v0.8.2...v0.8.3) (2025-04-12) **Note:** Version bump only for package @chamn/demo-page ## [0.8.2](https://github.com/ByteCrazy/chameleon/compare/v0.8.1...v0.8.2) (2025-04-11) **Note:** Version bump only for package @chamn/demo-page ## [0.8.1](https://github.com/ByteCrazy/chameleon/compare/v0.8.0...v0.8.1) (2025-04-10) **Note:** Version bump only for package @chamn/demo-page ## [0.8.0](https://github.com/ByteCrazy/chameleon/compare/v0.7.0...v0.8.0) (2025-04-10) ### ✨ Features | 新功能 * **demo-page, engine, render:** 🎸 update run time var for function ([d8fb90a](https://github.com/ByteCrazy/chameleon/commit/d8fb90ac72a233d7fdb5fcb36e0b7963f83c5acf)) ## [0.7.0](https://github.com/ByteCrazy/chameleon/compare/v0.6.0...v0.7.0) (2025-04-06) **Note:** Version bump only for package @chamn/demo-page ## [0.6.0](https://github.com/ByteCrazy/chameleon/compare/v0.5.2...v0.6.0) (2025-03-30) **Note:** Version bump only for package @chamn/demo-page ## [0.5.2](https://github.com/ByteCrazy/chameleon/compare/v0.5.1...v0.5.2) (2025-03-30) **Note:** Version bump only for package @chamn/demo-page ## [0.5.1](https://github.com/ByteCrazy/chameleon/compare/v0.5.0...v0.5.1) (2025-03-30) **Note:** Version bump only for package @chamn/demo-page ## [0.5.0](https://github.com/ByteCrazy/chameleon/compare/v0.4.0...v0.5.0) (2025-03-30) **Note:** Version bump only for package @chamn/demo-page ## [0.4.0](https://github.com/ByteCrazy/chameleon/compare/v0.3.21...v0.4.0) (2025-03-29) **Note:** Version bump only for package @chamn/demo-page ## [0.3.21](https://github.com/ByteCrazy/chameleon/compare/v0.3.20...v0.3.21) (2025-03-26) **Note:** Version bump only for package @chamn/demo-page ## [0.3.20](https://github.com/ByteCrazy/chameleon/compare/v0.3.19...v0.3.20) (2025-03-26) **Note:** Version bump only for package @chamn/demo-page ## [0.3.19](https://github.com/ByteCrazy/chameleon/compare/v0.3.18...v0.3.19) (2025-03-26) **Note:** Version bump only for package @chamn/demo-page ## [0.3.18](https://github.com/ByteCrazy/chameleon/compare/v0.3.17...v0.3.18) (2025-03-26) **Note:** Version bump only for package @chamn/demo-page ## [0.3.17](https://github.com/ByteCrazy/chameleon/compare/v0.3.16...v0.3.17) (2025-03-25) **Note:** Version bump only for package @chamn/demo-page ## [0.3.16](https://github.com/ByteCrazy/chameleon/compare/v0.3.15...v0.3.16) (2025-03-24) **Note:** Version bump only for package @chamn/demo-page ## [0.3.15](https://github.com/ByteCrazy/chameleon/compare/v0.3.14...v0.3.15) (2025-03-23) **Note:** Version bump only for package @chamn/demo-page ## [0.3.14](https://github.com/ByteCrazy/chameleon/compare/v0.3.13...v0.3.14) (2025-03-23) **Note:** Version bump only for package @chamn/demo-page ## [0.3.13](https://github.com/ByteCrazy/chameleon/compare/v0.3.12...v0.3.13) (2025-03-23) **Note:** Version bump only for package @chamn/demo-page ## [0.3.12](https://github.com/ByteCrazy/chameleon/compare/v0.3.11...v0.3.12) (2025-03-23) **Note:** Version bump only for package @chamn/demo-page ## [0.3.11](https://github.com/ByteCrazy/chameleon/compare/v0.3.10...v0.3.11) (2025-03-22) **Note:** Version bump only for package @chamn/demo-page ## [0.3.10](https://github.com/ByteCrazy/chameleon/compare/v0.3.9...v0.3.10) (2025-03-22) **Note:** Version bump only for package @chamn/demo-page ## [0.3.9](https://github.com/ByteCrazy/chameleon/compare/v0.3.8...v0.3.9) (2025-03-22) **Note:** Version bump only for package @chamn/demo-page ## [0.3.8](https://github.com/ByteCrazy/chameleon/compare/v0.3.7...v0.3.8) (2025-03-16) **Note:** Version bump only for package @chamn/demo-page ## [0.3.7](https://github.com/ByteCrazy/chameleon/compare/v0.3.6...v0.3.7) (2025-03-16) ### ✨ Features | 新功能 * **demo-page, engine, model, render:** 🎸 support inject eng inner env to runtime ([baa5c11](https://github.com/ByteCrazy/chameleon/commit/baa5c11d389019a7e4e4b8e000433a99038b4ae3)) ## [0.3.6](https://github.com/ByteCrazy/chameleon/compare/v0.3.5...v0.3.6) (2025-03-09) **Note:** Version bump only for package @chamn/demo-page ## [0.3.5](https://github.com/ByteCrazy/chameleon/compare/v0.3.4...v0.3.5) (2025-03-09) ### 🐛 Bug Fixes | Bug 修复 * **demo-page, engine, render:** 🐛 fixed action flow only run first node ([c4bdb85](https://github.com/ByteCrazy/chameleon/commit/c4bdb85d0ca6ed09c6c66d15847de5bd14da556e)) ## [0.3.4](https://github.com/ByteCrazy/chameleon/compare/v0.3.3...v0.3.4) (2025-02-16) **Note:** Version bump only for package @chamn/demo-page ## [0.3.3](https://github.com/ByteCrazy/chameleon/compare/v0.3.2...v0.3.3) (2025-02-16) **Note:** Version bump only for package @chamn/demo-page ## [0.3.2](https://github.com/ByteCrazy/chameleon/compare/v0.3.1...v0.3.2) (2025-02-16) **Note:** Version bump only for package @chamn/demo-page ## [0.3.1](https://github.com/ByteCrazy/chameleon/compare/v0.3.0...v0.3.1) (2025-02-16) **Note:** Version bump only for package @chamn/demo-page ## [0.3.0](https://github.com/ByteCrazy/chameleon/compare/v0.2.4...v0.3.0) (2025-02-15) ### ✨ Features | 新功能 * **demo-page, engine, model, render:** 🎸 action node use link struct ([599ece4](https://github.com/ByteCrazy/chameleon/commit/599ece4927523f7c0e330cac722c9c9e6976ea3c)) * **demo-page, engine, model, render:** 🎸 add event panel ([e8c5648](https://github.com/ByteCrazy/chameleon/commit/e8c5648017b40cbae42c576267d1e3b9d9660918)) * **demo-page, engine, model, render:** 🎸 support TActionLogicItem prop ([e1b9d1e](https://github.com/ByteCrazy/chameleon/commit/e1b9d1e150ae810750249322ddf906b62eee9969)) * **demo-page, model, render:** 🎸 optimize afterResponse ([b4060ba](https://github.com/ByteCrazy/chameleon/commit/b4060ba0a0a01960ae5f8dffea159e2d5ea680b6)) * **demo-page, model, render:** 🎸 support ASSIGN_VALUE node ([74c395b](https://github.com/ByteCrazy/chameleon/commit/74c395baec55911de734e47d4a270f9cf016ee21)) * **demo-page, model:** 🎸 define action and event type ([f7ca5d3](https://github.com/ByteCrazy/chameleon/commit/f7ca5d3b8ad7610f840845f555bfcdb2adddae0a)) * **demo-page, render:** 🎸 getMethods support get methods from ref ([0a26967](https://github.com/ByteCrazy/chameleon/commit/0a2696739eee29c3e30b805d537605a06496ebc5)) * **demo-page, render:** 🎸 support eventListener attr ([fa0977f](https://github.com/ByteCrazy/chameleon/commit/fa0977fab37b961d1b7a0b04c8e528e43ab9503f)) * **demo-page, render:** 🎸 support ON_DID_RENDER and ON_WILL_DESTROY inner event ([b4743e8](https://github.com/ByteCrazy/chameleon/commit/b4743e855766b69a8c5bc58ea3849694948bd501)) ## [0.2.4](https://github.com/ByteCrazy/chameleon/compare/v0.2.3...v0.2.4) (2024-12-08) **Note:** Version bump only for package @chamn/demo-page ## [0.2.3](https://github.com/ByteCrazy/chameleon/compare/v0.2.2...v0.2.3) (2024-12-08) **Note:** Version bump only for package @chamn/demo-page ## [0.2.2](https://github.com/ByteCrazy/chameleon/compare/v0.2.1...v0.2.2) (2024-12-07) **Note:** Version bump only for package @chamn/demo-page ## [0.2.1](https://github.com/ByteCrazy/chameleon/compare/v0.2.0...v0.2.1) (2024-12-07) **Note:** Version bump only for package @chamn/demo-page ## [0.2.0](https://github.com/ByteCrazy/chameleon/compare/v0.1.1...v0.2.0) (2024-12-07) ### ✨ Features | 新功能 * **build-script, demo-page, engine, engine-website-app, layout, material, model, render:** 🎸 upgrade vite to 6.0 ([bcac2b1](https://github.com/ByteCrazy/chameleon/commit/bcac2b15b83b41a7042ca37368c1b45302ad81d5)) ## [0.1.1](https://github.com/ByteCrazy/chameleon/compare/v0.1.0...v0.1.1) (2024-11-11) **Note:** Version bump only for package @chamn/demo-page ## [0.1.0](https://github.com/ByteCrazy/chameleon/compare/v0.0.46...v0.1.0) (2024-09-07) ### 🐛 Bug Fixes | Bug 修复 * **demo-page, docs-app, engine, engine-website-app, layout, material:** 🐛 fixed material meta not correct ([55b755c](https://github.com/ByteCrazy/chameleon/commit/55b755ce0c833e594b46447b2d6608cf56f7a593)) ### ✨ Features | 新功能 * **build-script, demo-page, engine, layout, render:** 🎸 add lang switch ([29da65e](https://github.com/ByteCrazy/chameleon/commit/29da65ee1aa09550d910ddfbbcb9d8b4db983373)) * **demo-page, engine, engine-website-app, material:** 🎸 add designerSizer and fixed GridItem bug ([4665aed](https://github.com/ByteCrazy/chameleon/commit/4665aed300d54c77be4abcb9a8cc0f1710ac2145)) * **demo-page, engine, render:** 🎸 add getGlobalState and optimize node udpate ([4d3934f](https://github.com/ByteCrazy/chameleon/commit/4d3934fd8febe616a44e5d39da0e10964f3c800d)) ### 📝 Documentation | 文档 * **demo-page, engine-website-app:** ✏️ demo app add switch page ([c098997](https://github.com/ByteCrazy/chameleon/commit/c098997e2c53bbe135ce263fcd1912ddc53146fe)) ## [0.0.46](https://github.com/ByteCrazy/chameleon/compare/v0.0.45...v0.0.46) (2024-06-30) **Note:** Version bump only for package @chamn/demo-page ## [0.0.45](https://github.com/ByteCrazy/chameleon/compare/v0.0.44...v0.0.45) (2024-06-30) **Note:** Version bump only for package @chamn/demo-page ## [0.0.44](https://github.com/ByteCrazy/chameleon/compare/v0.0.43...v0.0.44) (2024-06-30) **Note:** Version bump only for package @chamn/demo-page ## [0.0.43](https://github.com/ByteCrazy/chameleon/compare/v0.0.42...v0.0.43) (2024-06-29) **Note:** Version bump only for package @chamn/demo-page ## [0.0.42](https://github.com/ByteCrazy/chameleon/compare/v0.0.41...v0.0.42) (2024-06-01) **Note:** Version bump only for package @chamn/demo-page ## [0.0.41](https://github.com/ByteCrazy/chameleon/compare/v0.0.40...v0.0.41) (2024-05-26) **Note:** Version bump only for package @chamn/demo-page ## [0.0.40](https://github.com/ByteCrazy/chameleon/compare/v0.0.39...v0.0.40) (2024-04-28) **Note:** Version bump only for package @chamn/demo-page ## [0.0.39](https://github.com/ByteCrazy/chameleon/compare/v0.0.38...v0.0.39) (2024-04-27) ### 🐛 Bug Fixes | Bug 修复 * **build-script, demo-page, engine, layout, material, model, render:** 🐛 fix flatObject collectVariable refeer pos ([1c4163a](https://github.com/ByteCrazy/chameleon/commit/1c4163aeeb89176a1ff5b50f76930889df7751fe)) ## [0.0.38](https://github.com/ByteCrazy/chameleon/compare/v0.0.37...v0.0.38) (2024-04-27) **Note:** Version bump only for package @chamn/demo-page ## [0.0.37](https://github.com/ByteCrazy/chameleon/compare/v0.0.36...v0.0.37) (2024-04-27) **Note:** Version bump only for package @chamn/demo-page ## [0.0.36](https://github.com/ByteCrazy/chameleon/compare/v0.0.35...v0.0.36) (2024-04-27) **Note:** Version bump only for package @chamn/demo-page ## [0.0.35](https://github.com/ByteCrazy/chameleon/compare/v0.0.34...v0.0.35) (2024-04-27) **Note:** Version bump only for package @chamn/demo-page ## [0.0.34](https://github.com/ByteCrazy/chameleon/compare/v0.0.33...v0.0.34) (2024-04-27) **Note:** Version bump only for package @chamn/demo-page ## [0.0.33](https://github.com/ByteCrazy/chameleon/compare/v0.0.32...v0.0.33) (2024-04-27) **Note:** Version bump only for package @chamn/demo-page ## [0.0.32](https://github.com/ByteCrazy/chameleon/compare/v0.0.31...v0.0.32) (2024-01-30) **Note:** Version bump only for package @chamn/demo-page ## [0.0.31](https://github.com/ByteCrazy/chameleon/compare/v0.0.30...v0.0.31) (2023-10-17) **Note:** Version bump only for package @chamn/demo-page ## [0.0.30](https://github.com/ByteCrazy/chameleon/compare/v0.0.29...v0.0.30) (2023-10-17) **Note:** Version bump only for package @chamn/demo-page ## [0.0.29](https://github.com/ByteCrazy/chameleon/compare/v0.0.28...v0.0.29) (2023-10-17) ### ✨ Features | 新功能 * **demo-page, engine, model:** 🎸 add ant color setter ([830de46](https://github.com/ByteCrazy/chameleon/commit/830de46babdf40a740248c37d8e6dc2043db1434)) * **demo-page, engine, model:** 🎸 add ColorSetter ([e72b7f1](https://github.com/ByteCrazy/chameleon/commit/e72b7f15dd8bba498b776226d5debd07c8fd4234)) * **demo-page, engine, model:** 🎸 add radio setter ([e6f9b1d](https://github.com/ByteCrazy/chameleon/commit/e6f9b1d9dba7cd3a9a82116bf5a1068c06a5a1d6)) * **demo-page, engine:** 🎸 add cssSize setter ([74bf136](https://github.com/ByteCrazy/chameleon/commit/74bf136047000a67795e1360f2a923902366a513)) * **demo-page, engine:** 🎸 add slider setter ([0fe1d29](https://github.com/ByteCrazy/chameleon/commit/0fe1d29257f214e69ca9fed6e5e4c11ccccb56bb)) * **demo-page, render:** 🎸 compatible new style schema ([8165453](https://github.com/ByteCrazy/chameleon/commit/816545302e4d88a0976e8fdf3b17ed8a9a2978bd)) ## [0.0.28](https://github.com/ByteCrazy/chameleon/compare/v0.0.27...v0.0.28) (2023-08-29) **Note:** Version bump only for package @chamn/demo-page ## [0.0.27](https://github.com/ByteCrazy/chameleon/compare/v0.0.26...v0.0.27) (2023-08-28) **Note:** Version bump only for package @chamn/demo-page ## [0.0.26](https://github.com/ByteCrazy/chameleon/compare/v0.0.25...v0.0.26) (2023-08-27) **Note:** Version bump only for package @chamn/demo-page ## [0.0.25](https://github.com/ByteCrazy/chameleon/compare/v0.0.24...v0.0.25) (2023-08-27) **Note:** Version bump only for package @chamn/demo-page ## [0.0.24](https://github.com/ByteCrazy/chameleon/compare/v0.0.23...v0.0.24) (2023-08-27) **Note:** Version bump only for package @chamn/demo-page ## [0.0.23](https://github.com/ByteCrazy/chameleon/compare/v0.0.22...v0.0.23) (2023-08-26) **Note:** Version bump only for package @chamn/demo-page ## [0.0.22](https://github.com/ByteCrazy/chameleon/compare/v0.0.21...v0.0.22) (2023-08-24) ### ✨ Features | 新功能 * **demo-page, engine, layout, model:** 🎸 add disableEditorDragDom config ([1779f44](https://github.com/ByteCrazy/chameleon/commit/1779f44aff20370ea3336e72352032c6416f7dd3)) ## [0.0.21](https://github.com/ByteCrazy/chameleon/compare/v0.0.20...v0.0.21) (2023-08-19) **Note:** Version bump only for package @chamn/demo-page ## [0.0.20](https://github.com/ByteCrazy/chameleon/compare/v0.0.19...v0.0.20) (2023-08-19) **Note:** Version bump only for package @chamn/demo-page ## [0.0.19](https://github.com/ByteCrazy/chameleon/compare/v0.0.18...v0.0.19) (2023-08-17) **Note:** Version bump only for package @chamn/demo-page ## [0.0.18](https://github.com/ByteCrazy/chameleon/compare/v0.0.17...v0.0.18) (2023-08-14) **Note:** Version bump only for package @chamn/demo-page ## [0.0.17](https://github.com/ByteCrazy/chameleon/compare/v0.0.16...v0.0.17) (2023-08-06) **Note:** Version bump only for package @chamn/demo-page ## [0.0.16](https://github.com/ByteCrazy/chameleon/compare/v0.0.15...v0.0.16) (2023-08-06) ### ✨ Features | 新功能 * **build-script-example, demo-page, engine, layout, material, model, render:** 🎸 support direct import render from package on dev mode ([6bb38e2](https://github.com/ByteCrazy/chameleon/commit/6bb38e29678a8a4d08a7fcf9548fa548399259b0)) * **demo-page, engine, layout, model:** 🎸 support advanceCustom drag and drop hooks ([fb21e15](https://github.com/ByteCrazy/chameleon/commit/fb21e1501f6829e4f13a35ea7be942ff72b0be91)) * **demo-page, engine, layout, model:** 🎸 support toolbarViewRender and ghostViewRedner ([43ced37](https://github.com/ByteCrazy/chameleon/commit/43ced371cfb7dbb58a96fc15e1bf635092307fa8)) * **demo-page, engine, layout:** 🎸 support DropViewRender ([1c025a6](https://github.com/ByteCrazy/chameleon/commit/1c025a6d1f57f450b2de262a787375f3f4891008)) * **demo-page, engine, model:** 🎸 support onDelete onCopy ([b6a76bb](https://github.com/ByteCrazy/chameleon/commit/b6a76bb244bbe2c050de17157bda97cb7ad21abc)) ## [0.0.15](https://github.com/ByteCrazy/chameleon/compare/v0.0.14...v0.0.15) (2023-07-01) ### ✨ Features | 新功能 * **demo-page, docs-website, engine, model, render:** 🎸 optimize assets load ([3ee6d58](https://github.com/ByteCrazy/chameleon/commit/3ee6d58a88e5af3fc631723240783d5c97a273b0)) * **demo-page, engine:** 🎸 setter support initialValue ([794d807](https://github.com/ByteCrazy/chameleon/commit/794d8072518cb3b1a897b04a2e96f5ca53fdb365)) ## [0.0.14](https://github.com/ByteCrazy/chameleon/compare/v0.0.13...v0.0.14) (2023-05-10) **Note:** Version bump only for package @chamn/demo-page ## [0.0.13](https://github.com/ByteCrazy/chameleon/compare/v0.0.12...v0.0.13) (2023-05-03) ### ✨ Features | 新功能 * **build-script, build-script-example, demo-page, engine, layout, material, model, render:** 🎸 config code style config ([2325504](https://github.com/ByteCrazy/chameleon/commit/23255048fa4a3d4fc8f5cfa1312db5abd6cac70d)) * **build-script, demo-page, engine, layout, model, render:** 🎸 update meterial schema ([14f4e5c](https://github.com/ByteCrazy/chameleon/commit/14f4e5caf0a4f6eca131e139d0c34ea21969dc0b)) * **demo-page, docs-website, engine, layout, model, render:** 🎸 node support methods config ([e080b20](https://github.com/ByteCrazy/chameleon/commit/e080b20cea3cea27b95def196e078c1c225d3a83)) * **demo-page, engine, layout, model:** 🎸 finish customEvent config ([84640e3](https://github.com/ByteCrazy/chameleon/commit/84640e3d06b79858590b9fe92ef4764fbe3f4f7b)) * **demo-page, engine, layout:** 🎸 outline support cancel drag by node material ([cd428d3](https://github.com/ByteCrazy/chameleon/commit/cd428d362a8bfe7d5b6e58ed2b6290e19c00672b)) * **demo-page, engine, layout:** 🎸 support cancel drag and custom node drag event ([825717e](https://github.com/ByteCrazy/chameleon/commit/825717e063846b72f95b0e41d8cba279ef5270c8)) * **demo-page, engine:** 🎸 complete advanceCustom material feature ([98cf273](https://github.com/ByteCrazy/chameleon/commit/98cf273543f2fd534c254990d61052534a6649da)) * **demo-page, engine:** 🎸 supprot onSelectNode ([f496a82](https://github.com/ByteCrazy/chameleon/commit/f496a82920cab7ae8704335b2ecd02a7887de3b2)) ## [0.0.12](https://github.com/ByteCrazy/chameleon/compare/v0.0.11...v0.0.12) (2023-04-23) ### ✨ Features | 新功能 * **demo-page, docs-website, engine, model:** 🎸 update schema and change err to warn when schema check ([e753862](https://github.com/ByteCrazy/chameleon/commit/e7538626bad6681e4d488ac835fef61a603c0853)) * **demo-page, engine, layout, model, render:** 🎸 node support config self isContainer property ([d94f1f9](https://github.com/ByteCrazy/chameleon/commit/d94f1f9203f2c273856fd4aa489a1ed9cbb0f0ec)) ## [0.0.11](https://github.com/ByteCrazy/chameleon/compare/v0.0.10...v0.0.11) (2023-04-21) ### ✨ Features | 新功能 * **build-script, build-script-example, demo-page, engine, layout, material, model, render:** 🎸 optimize build-script output file format ([eda44d2](https://github.com/ByteCrazy/chameleon/commit/eda44d255bd3c5af19013bdd61342e1f0817413a)) ## [0.0.10](https://github.com/ByteCrazy/chameleon/compare/v0.0.9...v0.0.10) (2023-04-17) **Note:** Version bump only for package @chamn/demo-page ## [0.0.9](https://github.com/ByteCrazy/chameleon/compare/v0.0.8...v0.0.9) (2023-04-17) **Note:** Version bump only for package @chamn/demo-page ## [0.0.8](https://github.com/ByteCrazy/chameleon/compare/v0.0.7...v0.0.8) (2023-04-16) **Note:** Version bump only for package @chamn/demo-page ## [0.0.7](https://github.com/ByteCrazy/chameleon/compare/v0.0.6...v0.0.7) (2023-03-29) ### ✨ Features | 新功能 * **build-script, build-script-example, demo-page, engine, layout, material, model, render:** 🎸 external monaco eitor and remove style panel ([494d898](https://github.com/ByteCrazy/chameleon/commit/494d898fd75dabe84d867ff45e84ae63f9b59c5e)) ## [0.0.6](https://github.com/ByteCrazy/chameleon/compare/v0.0.5...v0.0.6) (2023-03-28) **Note:** Version bump only for package @chamn/demo-page ## [0.0.5](https://github.com/ByteCrazy/chameleon/compare/v0.0.4...v0.0.5) (2023-03-28) **Note:** Version bump only for package @chamn/demo-page ## [0.0.4](https://github.com/ByteCrazy/chameleon/compare/v0.0.3...v0.0.4) (2023-03-27) **Note:** Version bump only for package @chamn/demo-page ## [0.0.2](https://github.com/ByteCrazy/chameleon/compare/v0.0.1...v0.0.2) (2023-03-27) **Note:** Version bump only for package @chamn/demo-page ================================================ FILE: packages/demo-page/__tests__/demo.test.ts ================================================ test('adds 1 + 2 to equal 3', () => { expect(3).toBe(3); }); ================================================ FILE: packages/demo-page/build.config.js ================================================ /* eslint-disable no-undef */ // 开发模式默认读取 index.html 作为开发模式入口 // entry 作为打包库入口 export default { entry: './src/index.ts', libName: 'DemoPage', fileName: 'index', external: ['react', 'react-dom'], global: { react: 'React', 'react-dom': 'ReactDOM', }, // 额外的 vite 配置 vite: {}, }; ================================================ FILE: packages/demo-page/index.html ================================================ Vite + React + TS
================================================ FILE: packages/demo-page/jest.config.js ================================================ /* eslint-disable no-undef */ /* * For a detailed explanation regarding each configuration property, visit: * https://jestjs.io/docs/configuration */ module.exports = { // All imported modules in your tests should be mocked automatically // automock: false, // Stop running tests after `n` failures // bail: 0, // The directory where Jest should store its cached dependency information // cacheDirectory: "/private/var/folders/l9/th_r5d_12wxdj16859_mctjw0000gn/T/jest_dx", // Automatically clear mock calls, instances, contexts and results before every test // clearMocks: false, // Indicates whether the coverage information should be collected while executing the test // collectCoverage: false, // An array of glob patterns indicating a set of files for which coverage information should be collected // collectCoverageFrom: undefined, // The directory where Jest should output its coverage files // coverageDirectory: undefined, // An array of regexp pattern strings used to skip coverage collection // coveragePathIgnorePatterns: [ // "/node_modules/" // ], // Indicates which provider should be used to instrument code for coverage // coverageProvider: "babel", // A list of reporter names that Jest uses when writing coverage reports // coverageReporters: [ // "json", // "text", // "lcov", // "clover" // ], // An object that configures minimum threshold enforcement for coverage results // coverageThreshold: undefined, // A path to a custom dependency extractor // dependencyExtractor: undefined, // Make calling deprecated APIs throw helpful error messages // errorOnDeprecated: false, // The default configuration for fake timers // fakeTimers: { // "enableGlobally": false // }, // Force coverage collection from ignored files using an array of glob patterns // forceCoverageMatch: [], // A path to a module which exports an async function that is triggered once before all test suites // globalSetup: undefined, // A path to a module which exports an async function that is triggered once after all test suites // globalTeardown: undefined, // A set of global variables that need to be available in all test environments // globals: {}, // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. // maxWorkers: "50%", // An array of directory names to be searched recursively up from the requiring module's location // moduleDirectories: [ // "node_modules" // ], // An array of file extensions your modules use // moduleFileExtensions: [ // "js", // "mjs", // "cjs", // "jsx", // "ts", // "tsx", // "json", // "node" // ], // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module // moduleNameMapper: {}, // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader // modulePathIgnorePatterns: [], // Activates notifications for test results // notify: false, // An enum that specifies notification mode. Requires { notify: true } // notifyMode: "failure-change", // A preset that is used as a base for Jest's configuration preset: 'ts-jest', // Run tests from one or more projects // projects: undefined, // Use this configuration option to add custom reporters to Jest // reporters: undefined, // Automatically reset mock state before every test // resetMocks: false, // Reset the module registry before running each individual test // resetModules: false, // A path to a custom resolver // resolver: undefined, // Automatically restore mock state and implementation before every test // restoreMocks: false, // The root directory that Jest should scan for tests and modules within // rootDir: undefined, // A list of paths to directories that Jest should use to search for files in // roots: [ // "" // ], // Allows you to use a custom runner instead of Jest's default test runner // runner: "jest-runner", // The paths to modules that run some code to configure or set up the testing environment before each test // setupFiles: [], // A list of paths to modules that run some code to configure or set up the testing framework before each test // setupFilesAfterEnv: [], // The number of seconds after which a test is considered as slow and reported as such in the results. // slowTestThreshold: 5, // A list of paths to snapshot serializer modules Jest should use for snapshot testing // snapshotSerializers: [], // The test environment that will be used for testing testEnvironment: 'jsdom', // Options that will be passed to the testEnvironment // testEnvironmentOptions: {}, // Adds a location field to test results // testLocationInResults: false, // The glob patterns Jest uses to detect test files // testMatch: [ // "**/__tests__/**/*.[jt]s?(x)", // "**/?(*.)+(spec|test).[tj]s?(x)" // ], // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped // testPathIgnorePatterns: [ // "/node_modules/" // ], // The regexp pattern or array of patterns that Jest uses to detect test files // testRegex: [], // This option allows the use of a custom results processor // testResultsProcessor: undefined, // This option allows use of a custom test runner // testRunner: "jest-circus/runner", // A map from regular expressions to paths to transformers // transform: undefined, // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation // transformIgnorePatterns: [ // "/node_modules/", // "\\.pnp\\.[^\\/]+$" // ], // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them // unmockedModulePathPatterns: undefined, // Indicates whether each individual test should be reported during the run // verbose: undefined, // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode // watchPathIgnorePatterns: [], // Whether to use watchman for file crawling // watchman: true, }; ================================================ FILE: packages/demo-page/package.json ================================================ { "name": "@chamn/demo-page", "private": false, "type": "module", "files": [ "dist" ], "publishConfig": { "access": "public" }, "version": "0.10.4", "main": "dist/index.cjs.js", "module": "dist/index.es.js", "types": "dist/index.d.ts", "exports": { ".": { "types": "./dist/index.d.ts", "module-sync": "./dist/index.es.js", "import": "./dist/index.es.js", "require": "./dist/index.cjs.js" }, "./dist/*": "./dist/*" }, "scripts": { "start": "build-script", "build": "build-script --build", "build:w": "build-script --build --watch", "lint": "eslint ./src/", "prettier": "prettier --write ./src", "test": "jest" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" }, "devDependencies": { "@chamn/build-script": "workspace:*", "@chamn/model": "workspace:*", "@types/react": "^18.2.0", "@types/react-dom": "^18.0.6", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.54.0" }, "config": {}, "gitHead": "dc3e55fdeb903a8012f6ebd3ebc018ed61ad89db" } ================================================ FILE: packages/demo-page/src/index.ts ================================================ export { BasePage } from './pages/basePage'; export { BasePageBClient } from './pages/basePage-b-client'; export { SamplePage } from './pages/simplePage'; export { EmptyPage } from './pages/emptyPage'; export { LayoutPage } from './pages/layout'; export { Material } from './material/index'; ================================================ FILE: packages/demo-page/src/material/advanceCustomButton.ts ================================================ import { CMaterialType } from '@chamn/model'; export const AdvanceButtonMeta: CMaterialType = { title: 'Button', componentName: 'Button', npm: { package: '@chamn/mock-material', exportName: 'Button', name: 'Button', version: '1.0.0', }, icon: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', props: [ { name: 'type', title: '按钮类型', valueType: 'string', setters: [ { componentName: 'SelectSetter', props: { options: [ { value: 'primary', label: 'primary', }, { value: 'link', label: 'link', }, { value: '', label: 'Default', }, ], }, }, ], }, { name: 'block', title: '块状按钮', valueType: 'boolean', setters: ['BooleanSetter'], condition: (state) => { if (state.type === 'primary') { return true; } return false; }, }, { name: 'children', title: '文本', valueType: 'string', setters: ['StringSetter', 'ExpressionSetter'], }, { name: 'onClick', title: '点击时', valueType: 'function', setters: ['FunctionSetter', 'ExpressionSetter'], }, { name: 'text1', title: '联动文本1', valueType: 'string', setters: [ { componentName: 'StringSetter', }, ], condition: (state) => { if (state.type === 'primary1') { return true; } return false; }, }, { name: 'text2', title: '联动文本2', valueType: 'string', setters: [ { componentName: 'StringSetter', }, ], condition: (state) => { if (state.text1 === '1') { return true; } return false; }, }, { name: 'text3', title: '联动文本3', valueType: 'string', setters: [ { componentName: 'StringSetter', }, 'ExpressionSetter', ], }, ], snippets: [ { title: '自定义按钮', snapshot: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', description: '我是 antd 的 Button 组件,我是 antd 的 Button 组件,我是 antd 的 Button 组件,我是 antd 的 Button 组件,我是 antd 的 Button 组件,我是 antd 的 Button 组件,我是 antd 的 Button 组件,我是 antd 的 Button 组件,我是 antd 的 Button 组件', schema: { props: { type: 'primary', }, children: ['I am a Button'], }, }, { title: '基础按钮', snapshot: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', category: '基础控件', schema: { props: { type: 'primary', }, children: ['I am a Button'], }, }, { title: '基础按钮', snapshot: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', category: '基础控件', schema: { props: { type: 'primary', }, children: ['I am a Button'], }, }, { title: '基础按钮', snapshot: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', category: '基础控件1', schema: { props: { type: 'primary', }, children: ['I am a Button'], }, }, { title: '基础按钮', snapshot: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', category: '基础控件2', schema: { props: { type: 'primary', }, children: ['I am a Button'], }, }, { title: '基础按钮', snapshot: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', category: '基础控件3', schema: { props: { type: 'primary', }, children: ['I am a Button'], }, }, { title: '基础按钮', snapshot: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', category: '基础控件4', schema: { props: { type: 'primary', }, children: ['I am a Button'], }, }, ], }; ================================================ FILE: packages/demo-page/src/material/button.tsx ================================================ import { CMaterialType } from '@chamn/model'; import React from 'react'; export const ButtonMeta: CMaterialType< | 'ColorSetter' | 'SliderSetter' | 'CSSSizeSetter' | 'BoxSizingSetter' | 'AntDColorSetter' | 'RadioGroupSetter' | 'CSSSizeSetter' > = { title: 'Button', componentName: 'Button', npm: { package: '@chamn/mock-material', exportName: 'Button', version: '1.0.0', name: 'Button', }, icon: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', props: [ { name: 'setterTest', title: 'setter test', valueType: 'string', setters: [ 'AntDColorSetter', { componentName: 'RadioGroupSetter', props: { options: [ { label: 'A', value: 'a', }, { label: 'B', value: 'b', }, { label: 'C', value: 'c', }, ], optionType: 'button', buttonStyle: 'solid', }, }, 'ColorSetter', 'SliderSetter', 'CSSSizeSetter', 'BoxSizingSetter', ], }, { name: 'setterTest2', title: 'setter test2', valueType: 'string', setters: [ { componentName: 'ColorSetter', hiddenLabel: true, }, ], }, { name: 'type', title: '按钮类型', valueType: 'string', setters: [ { componentName: 'SelectSetter', props: { options: [ { value: 'primary', label: 'primary', }, { value: 'link', label: 'link', }, { value: '', label: 'Default', }, ], }, }, ], }, { name: 'block', title: '块状按钮', valueType: 'boolean', setters: ['BooleanSetter'], condition: (state) => { if (state.type === 'primary') { return true; } return false; }, }, { name: 'children', title: '文本', valueType: 'string', setters: [ { componentName: 'StringSetter', initialValue: '123', }, 'ExpressionSetter', ], }, { name: 'onClick', title: '点击时', valueType: 'function', setters: ['FunctionSetter', 'ExpressionSetter'], }, { name: 'text1', title: '联动文本1', valueType: 'string', setters: [ { componentName: 'StringSetter', }, ], condition: (state) => { if (state.type === 'primary1') { return true; } return false; }, }, { name: 'text2', title: '联动文本2', valueType: 'string', setters: [ { componentName: 'StringSetter', }, ], condition: (state) => { if (state.text1 === '1') { return true; } return false; }, }, { name: 'text3', title: '联动文本3', valueType: 'string', setters: [ { componentName: 'StringSetter', }, 'ExpressionSetter', ], }, ], advanceCustom: { onCopy: async () => { console.log('onCopy'); }, selectRectViewRender: (props) => { console.log(123, props); return (
123
); }, hoverRectViewRender: () => { return <>Hover; }, dropViewRender: (props) => { console.log('123213', props); return <>drop 11111; }, ghostViewRender: () => { return <>Big Button; }, toolbarViewRender: () => { return <>toolbar; }, canDragNode: async (node, params) => { console.log('canDragNode', node, params); if (params.event?.extraData?.type === 'NEW_ADD') { return true; } return true; }, onDragging: async () => { console.log('onDragging'); }, onDrop: async () => { console.log('onDrop'); return true; }, onSelect: async () => { console.log('onSelect'); return true; }, onDelete: async () => { console.log('onDelete'); return true; }, onNewAdd: async (_node, params) => { params.viewPortal.setView(
123
); console.log('onNewAdd'); return new Promise((resolve) => { setTimeout(() => { resolve(true); params.viewPortal.clearView(); }, 1000); }); }, }, snippets: [ { title: '基础按钮', snapshot: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', description: '自定义延迟插入 Button, 不能被选中, 不能拖拽', schema: { props: { type: 'primary', }, children: ['I am a Button'], }, }, ], }; ================================================ FILE: packages/demo-page/src/material/col.ts ================================================ import { CMaterialType } from '@chamn/model'; export const ColMeta: CMaterialType = { title: 'Col', componentName: 'Col', npm: { package: '@chamn/mock-material', exportName: 'Col', name: 'Col', version: '1.0.0', }, icon: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', props: [ { name: 'style', title: '样式', valueType: 'object', setters: ['JSONSetter'], }, ], snippets: [ { title: '列', snapshot: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', category: 'HTML 元素', schema: { props: {}, }, }, ], isContainer: true, }; ================================================ FILE: packages/demo-page/src/material/index.ts ================================================ import { CMaterialType } from '@chamn/model'; import { ButtonMeta } from './button'; // import { ColMeta } from './col'; // import { InputMeta } from './input'; import { ModalMeta } from './modal'; import { DivMeta } from './native'; // import { RowMeta } from './row'; import { TableMeta } from './table'; import { LayoutMeta } from './layout/index'; import { AdvanceButtonMeta } from './advanceCustomButton'; export const Material: CMaterialType[] = [ TableMeta, ModalMeta, ButtonMeta, LayoutMeta, AdvanceButtonMeta, DivMeta, ]; ================================================ FILE: packages/demo-page/src/material/input.ts ================================================ import { CMaterialType } from '@chamn/model'; export const InputMeta: CMaterialType = { title: 'Input', componentName: 'Input', npm: { package: '@chamn/mock-material', exportName: 'Input', name: 'Input', version: '1.0.0', }, icon: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', props: [ { name: 'style', title: '样式', valueType: 'object', setters: ['JSONSetter'], }, ], snippets: [ { title: '输入框', snapshot: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', category: 'HTML 元素', schema: { props: {}, }, }, ], }; ================================================ FILE: packages/demo-page/src/material/layout/index.tsx ================================================ import { CMaterialType } from '@chamn/model'; export const LayoutMeta: CMaterialType = { title: 'CLayout', componentName: 'CLayout', npm: { package: '@chamn/mock-material', exportName: 'CLayout', version: '1.0.0', name: 'CLayout', }, icon: 'Layout', disableEditorDragDom: { class: ['as44556', 'resize-handle'], }, props: [ { name: 'type', title: '按钮类型', valueType: 'string', setters: [ { componentName: 'SelectSetter', props: { options: [ { value: 'primary', label: 'primary', }, { value: 'link', label: 'link', }, { value: '', label: 'Default', }, ], }, }, ], }, { name: 'block', title: '块状按钮', valueType: 'boolean', setters: ['BooleanSetter'], condition: (state) => { if (state.type === 'primary') { return true; } return false; }, }, { name: 'children', title: '文本', valueType: 'string', setters: [ { componentName: 'StringSetter', initialValue: '123', }, 'ExpressionSetter', ], }, { name: 'onClick', title: '点击时', valueType: 'function', setters: ['FunctionSetter', 'ExpressionSetter'], }, { name: 'text1', title: '联动文本1', valueType: 'string', setters: [ { componentName: 'StringSetter', }, ], condition: (state) => { if (state.type === 'primary1') { return true; } return false; }, }, { name: 'text2', title: '联动文本2', valueType: 'string', setters: [ { componentName: 'StringSetter', }, ], condition: (state) => { if (state.text1 === '1') { return true; } return false; }, }, { name: 'text3', title: '联动文本3', valueType: 'string', setters: [ { componentName: 'StringSetter', }, 'ExpressionSetter', ], }, ], snippets: [ { title: '基础布局', description: '自定义延迟插入 Button, 不能被选中, 不能拖拽', snapshotText: 'Layout', schema: { props: { type: 'primary', }, children: ['I am a Button'], }, }, ], }; ================================================ FILE: packages/demo-page/src/material/modal.ts ================================================ import { CMaterialType } from '@chamn/model'; export const ModalMeta: CMaterialType = { title: 'Modal', componentName: 'Modal', npm: { package: '@chamn/mock-material', exportName: 'Modal', version: '1.0.0', name: 'Modal', }, icon: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', props: [ { name: 'visible', title: '可见性', valueType: 'boolean', setters: ['BooleanSetter', 'ExpressionSetter'], }, ], fixedProps: { open: true, }, rootSelector: '.ant-modal-content', snippets: [ { title: '基础元素', snapshotText: 'Modal', category: '高级组件', schema: { props: {}, children: ['I am a Modal'], }, }, ], }; ================================================ FILE: packages/demo-page/src/material/native.ts ================================================ import { CMaterialType } from '@chamn/model'; export const DivMeta: CMaterialType = { title: 'Div', componentName: 'div', icon: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', props: [ { name: 'style', title: '样式', valueType: 'object', setters: ['JSONSetter'], }, ], methods: [ { name: 'doAlert', params: [ { name: 'msg', }, ], title: '打开警告提示', }, { name: 'doAlert2', params: [ { name: 'msg', description: '警告内容', tsType: 'string', example: '请求失败', }, { name: 'count', description: '提示次数', tsType: 'number', example: '1', }, ], title: '打开警告提示2', }, ], snippets: [ { title: '基础元素', snapshotText: 'Div', category: 'HTML 元素', schema: { props: {}, children: ['I am a Div tag'], }, }, ], }; ================================================ FILE: packages/demo-page/src/material/row.ts ================================================ import { CMaterialType } from '@chamn/model'; export const RowMeta: CMaterialType = { title: 'Row', componentName: 'Row', npm: { package: '@chamn/mock-material', exportName: 'Row', version: '1.0.0', name: 'Row', }, icon: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', props: [ { name: 'style', title: '样式', valueType: 'object', setters: ['JSONSetter'], }, ], snippets: [ { title: '行', snapshot: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', category: 'HTML 元素', schema: { props: {}, }, }, ], isContainer: true, }; ================================================ FILE: packages/demo-page/src/material/table.ts ================================================ import { CMaterialType } from '@chamn/model'; export const TableMeta: CMaterialType = { title: 'Table', componentName: 'Table', npm: { name: 'MockMaterial', package: '@chamn/mock-material', exportName: 'Table', version: '1.0.0', }, props: [ { name: 'name', title: '表名', valueType: 'string', setters: [ 'TextAreaSetter', 'StringSetter', { componentName: 'ArraySetter', props: { item: { setters: [ { componentName: 'ShapeSetter', props: { elements: [ { name: 'name', title: '列名', valueType: 'string', setters: ['StringSetter'], }, { name: 'dataIndex', title: 'dataIndex', valueType: 'string', setters: ['StringSetter'], }, { name: 'filteredValue', title: '过滤值', valueType: 'array', setters: ['StringSetter'], }, ], }, initialValue: {}, }, 'StringSetter', { componentName: 'SelectSetter', props: { options: [ { value: 'jack', label: 'Jack' }, { value: 'lucy', label: 'Lucy' }, { value: 'Yiminghe', label: 'yiminghe' }, { value: 'disabled', label: 'Disabled', disabled: true }, ], }, }, 'JSONSetter', 'FunctionSetter', 'ComponentSetter', ], initialValue: '', }, }, initialValue: [], }, { componentName: 'ExpressionSetter', initialValue: [], }, ], }, { name: 'selectSetter', title: 'select', valueType: 'string', setters: [ { componentName: 'SelectSetter', props: { options: [ { value: 'jack', label: 'Jack' }, { value: 'lucy', label: 'Lucy' }, { value: 'Yiminghe', label: 'yiminghe' }, { value: 'disabled', label: 'Disabled', disabled: true }, ], }, }, ], }, { name: 'testArrayString', title: '数组字符串', valueType: 'array', setters: [ { componentName: 'ArraySetter', props: { item: { setters: [ 'StringSetter', 'SelectSetter', 'JSONSetter', 'FunctionSetter', 'ComponentSetter', ], initialValue: '', }, }, initialValue: [], }, { componentName: 'ExpressionSetter', initialValue: [], }, 'StringSetter', 'SelectSetter', 'JSONSetter', 'FunctionSetter', 'ComponentSetter', ], }, { name: 'pagination', title: '分页', valueType: 'object', setters: [ { componentName: 'ShapeSetter', props: { elements: [ { name: 'current', title: '当前页', valueType: 'number', setters: ['NumberSetter', 'ExpressionSetter'], }, ], }, initialValue: {}, }, ], }, { name: 'style', title: '样式', valueType: 'object', setters: ['JSONSetter'], }, { name: 'columns', title: '数据列', valueType: 'array', setters: [ { componentName: 'ArraySetter', props: { item: { setters: [ { componentName: 'ShapeSetter', props: { elements: [ { name: 'title', title: '列名', valueType: 'string', setters: ['StringSetter', 'NumberSetter'], }, { name: 'dataIndex', title: 'dataIndex', valueType: 'string', setters: ['StringSetter'], }, { name: 'render', title: '渲染组件', valueType: 'component', setters: ['ComponentSetter'], }, { name: 'filteredValue', title: '过滤值', valueType: 'array', setters: ['StringSetter'], condition: (state: any) => { if (state.dataIndex === '1') { return true; } return false; }, }, ], }, initialValue: {}, }, 'StringSetter', 'SelectSetter', 'JSONSetter', 'FunctionSetter', 'ComponentSetter', ], initialValue: { title: 'Name', dataIndex: 'Name', filteredValue: '123', }, }, }, initialValue: [], }, { componentName: 'ExpressionSetter', initialValue: [], }, ], }, { name: 'sorter', title: '排序', valueType: 'function', setters: ['FunctionSetter', 'ExpressionSetter'], }, { name: 'title', title: '表头', valueType: 'component', setters: ['ComponentSetter'], }, ], snippets: [ { title: '表格', snapshotText: 'Table', category: '高级组件', schema: { props: { data: [ { key: '1', name: 'John Brown', age: 32, address: 'New York No. 1 Lake Park', tags: ['nice', 'developer'], }, ], columns: [ { title: 'Name', dataIndex: 'name', key: 'name', }, ], }, children: ['I am a Div Table'], }, }, ], }; ================================================ FILE: packages/demo-page/src/pages/basePage-b-client.ts ================================================ import { CPageDataType } from '@chamn/model'; const data = [ { key: '1', name: 'John Brown', age: 32, address: 'New York No. 1 Lake Park', tags: ['nice', 'developer'], }, { key: '2', name: 'Jim Green', age: 42, address: 'London No. 1 Lake Park', tags: ['loser'], }, { key: '3', name: 'Joe Black', age: 32, address: 'Sidney No. 1 Lake Park', tags: ['cool', 'teacher'], }, ]; const columns = [ { title: 'Name', dataIndex: 'name', key: 'name', render: { type: 'SLOT', renderType: 'FUNC', params: ['val', 'record', 'index'], value: [ { id: '5', componentName: 'Row', children: [ { id: '6', componentName: 'Button', props: { mark: 'nameRender', children: { type: 'EXPRESSION', value: '$$context.params.val', }, }, }, { id: '7', componentName: 'Col', children: [ { componentName: 'Button', props: { mark: 'nameRender', }, children: [ { id: '8', componentName: 'div', children: ['I am div'], }, ], }, ], }, ], }, { id: '99898999', componentName: 'Button', children: ['123'], }, ], }, }, { title: 'Age', dataIndex: 'age', key: 'age', }, { title: 'Address', dataIndex: 'address', key: 'address', }, { title: 'Tags', key: 'tags', dataIndex: 'tags', }, { title: 'Action', key: 'action', }, ]; export const BasePageBClient: CPageDataType = { version: '1.0.0', name: 'BaseDemoPage', componentsMeta: [], componentsTree: { id: '1', componentName: 'RootContainer', props: { a: 1, }, state: { b: 1, buttonVisible: true, modalVisible: false, }, children: [ { id: 'row11111', componentName: 'Row', }, { id: 'globalStateText', componentName: 'div', props: { children: { type: 'EXPRESSION', value: '"rowState to reshow: " + $$context.stateManager.RowState.state.rowMark', }, }, }, { id: 'div1', componentName: 'div', children: [ { id: 'div1btn', componentName: 'Button', state: { list: [11, 22, 33, 44, 55], }, props: { children: { type: 'EXPRESSION', value: '$$context.loopData.index', }, }, loop: { open: true, data: { type: 'EXPRESSION', value: '$$context.state.list', }, key: { type: 'EXPRESSION', value: '$$context.loopData.item', }, }, }, ], }, { id: 'div12222', componentName: 'div', children: ['566666'], }, { id: 'Modal', componentName: 'Modal', refId: 'ModalRef', props: { open: { type: 'EXPRESSION', value: '$$context.globalState.modalVisible', }, onCancel: { type: 'FUNCTION', value: ` function (a) { $$context.updateGlobalState({ modalVisible: false }); } `, }, }, children: ['I am a modal'], }, { id: '999', componentName: 'Button', state: { a: 1, }, props: { type: 'primary', onClick: { type: 'FUNCTION', value: `function onClick(a) { console.log(a); $$context.updateState({a: $$context.state.a + 1}) $$context.updateGlobalState({ buttonVisible: !$$context.globalState.buttonVisible, modalVisible: !$$context.globalState.modalVisible }) }`, }, children: ['控制右边按钮的显示隐藏'], }, }, { id: '2', componentName: 'Button', state: { a: 1, }, props: { type: 'primary', onClick: { type: 'FUNCTION', value: `function onClick(a) { console.log(a); $$context.updateState({a: $$context.state.a + 1}) $$context.updateGlobalState({ b: $$context.globalState.b + 1}) }`, }, children: { type: 'EXPRESSION', value: '$$context.globalState.b', }, }, condition: { type: 'EXPRESSION', value: '$$context.globalState.buttonVisible', }, }, { id: '3', componentName: 'Table', state: { a: 3, data: data, }, props: { name: 111, testArrayString: [1, 2, 3, 4, 5], columns, dataSource: { type: 'EXPRESSION', value: '$$context.state.data', }, }, configure: {}, }, { id: '4', componentName: 'Row', state: { rowMark: 1, }, nodeName: 'RowState', children: [ { componentName: 'div', props: { children: { type: 'EXPRESSION', value: '"rowState to reshow: " + $$context.stateManager.RowState.state.rowMark', }, }, }, { id: '10', componentName: 'Col', children: [ { id: '11', componentName: 'Button', children: ['123 木头人'], }, ], }, { id: '12', componentName: 'Input', props: { value: { type: 'EXPRESSION', value: '$$context.globalState.b', }, onChange: { type: 'FUNCTION', value: ` function(value) { console.log(value, $$context); $$context.updateGlobalState({ b: value.target.value }) } `, }, }, }, { componentName: 'div', children: [ '2222', { componentName: 'div', children: [ '1111', { componentName: 'Button', props: { onClick: { type: 'FUNCTION', value: ` function (a) { console.log(a); const stateManager = $$context.stateManager; const state = stateManager.RowState.state; stateManager.RowState.updateState({ rowMark: state.rowMark +1 }) } `, }, }, children: ['change row state value'], }, ], }, ], }, ], }, ], }, }; ================================================ FILE: packages/demo-page/src/pages/basePage.ts ================================================ import { CPageDataType } from '@chamn/model'; export const BasePage: CPageDataType = { version: '1.0.0', name: 'BaseDemoPage', componentsMeta: [], componentsTree: { componentName: 'RootContainer', props: { a: 1, }, state: { b: 2, buttonVisible: true, modalVisible: false, }, configure: { propsSetter: {}, advanceSetter: {}, }, children: [ { props: { width: '100px', height: '100px', }, componentName: 'CContainer', id: 'ckakcd', children: [ { props: { width: '100px', height: '100px', }, componentName: 'CContainer', id: 'ef9vms', children: [ { props: { width: '100px', height: '100px', afterMount: { type: 'FUNCTION', value: "function didRender() {\n const staticVar = $$context.getStaticVar();\n console.log('$$context', $$context)\n let setTimer = function () {\n const staticVar = $$context.getStaticVar();\n if (staticVar.timer) {\n clearInterval(staticVar.timer);\n }\n console.log('window.__CHAMN_RENDER_MODE ', window.__CHAMN_RENDER_MODE )\n if(window.__CHAMN_RENDER_MODE === 'DESIGN') {\n return;\n }\n const timer = setInterval(() => {\n const bannerStateObj = $$context.getStateObj();\n console.log('bannerStateObj', bannerStateObj)\n bannerStateObj.updateState((oldState) => {\n const newPage = (oldState.currentPage + 1) % 3;\n console.log('newPage', newPage, oldState)\n return {\n ...oldState,\n currentPage: newPage\n };\n })\n }, 2 * 1000);\n staticVar.timer = timer;\n }\n\n staticVar.preScence = function leftClick(e) {\n const staticVar = $$context.getStaticVar();\n if (staticVar.timer) {\n clearInterval(staticVar.timer);\n }\n\n const bannerStateObj = $$context.getStateObj();\n console.log('currentStateObj', bannerStateObj, $$context, bannerStateObj);\n if (bannerStateObj.state.currentPage === 0) {\n setTimer();\n return\n }\n const newPage = (bannerStateObj.state.currentPage - 1) % 3;\n bannerStateObj.updateState({\n currentPage: newPage\n });\n setTimer();\n };\n\n staticVar.nextScence = function rightClick(e) {\n const staticVar = $$context.getStaticVar();\n if (staticVar.timer) {\n clearInterval(staticVar.timer);\n }\n\n console.log($$context, e);\n const currentStateObj = $$context.getStateObj();\n console.log('currentStateObj', currentStateObj);\n\n if (currentStateObj.state.currentPage === 2) {\n setTimer();\n return\n }\n const newPage = (currentStateObj.state.currentPage + 1) % 3\n currentStateObj.updateState({\n currentPage: newPage\n });\n setTimer();\n };\n\n console.log('staticVar', staticVar)\n\n\n setTimer();\n}", }, beforeDestroy: { type: 'FUNCTION', value: "function beforeDestroy() {\n console.log('clear timer 1111');\n if ($$context.staticState.timer) {\n console.log('clear timer');\n clearInterval($$context.staticState.timer);\n } \n}", }, $$attributes: [{}], }, componentName: 'CContainer', id: '2vi5b1', children: [ { props: { width: '100px', height: '100px', $$attributes: [], }, style: [ { property: 'transform', value: { type: 'EXPRESSION', value: '`translateX(-${($$context.stateManager.bannerState.state.currentPage) * 100}%) translateZ(0) `', }, }, ], componentName: 'CContainer', id: '69079u', children: [ { props: { width: '100px', height: '100px', $$attributes: [], }, style: [ { property: 'width', value: '100%', }, { property: 'background-repeat', value: 'no-repeat', }, { property: 'background-position', value: 'center', }, { property: 'background-size', value: 'cover', }, { property: 'flex-shrink', value: '0', }, { property: 'height', value: '100%', }, { property: 'Webkit-transform', value: 'translate3d(0, 0, 0)', }, { property: 'background-image', value: { type: 'EXPRESSION', value: '`url("${$$context.loopData.item}")`', }, }, ], componentName: 'CBlock', id: 'v59d71', configure: { propsSetter: {}, advanceSetter: { 'loop.data': { name: 'loop.data', setter: 'ExpressionSetter', }, }, }, title: 'CBlock-1', loop: { open: true, data: { type: 'EXPRESSION', value: '$$context.stateManager.bannerState.state.imgList', }, forName: 'item', forIndex: 'index', key: '', name: '', }, condition: true, classNames: [ { name: '123', status: { type: 'EXPRESSION', value: '$$context.stateManager.bannerState.state.currentPage', }, }, { name: 'leftBox', status: { type: 'EXPRESSION', value: 'true', }, }, ], css: { class: 'v59d71', value: [ { state: 'normal', media: [ { type: 'max-width', value: '991', }, ], }, { state: 'hover', media: [], }, ], }, }, ], configure: { propsSetter: {}, advanceSetter: {}, }, title: 'banner-box', loop: { open: false, data: [], forName: 'item', forIndex: 'index', key: '', name: '', }, condition: true, refId: 'bannerBox', css: { class: 'c_69079u', value: [ { state: 'normal', media: [], text: '\n display: flex;\n width: 100%;\n position: absolute;\n transition: all 0.3s;\n height: 100%;\n Webkit-backface-visibility: hidden\n ', }, ], }, }, { props: { width: '', height: '', $$attributes: [ { key: 'onClick', value: { type: 'FUNCTION', value: "function leftClick(e) {\n const variableSpace = $$context.getStaticVarById('bannerState')\n console.log('variableSpace', variableSpace);\n variableSpace.preScence();\n}", }, }, ], children: { type: 'EXPRESSION', value: '', }, }, componentName: 'CBlock', id: '9g9ohd', configure: { propsSetter: { '$$attributes.0.value': { name: '$$attributes.0.value', setter: 'FunctionSetter', }, children: { name: 'children', setter: 'ExpressionSetter', }, }, advanceSetter: {}, }, title: 'array-left', css: { class: 'c_9g9ohd', value: [ { state: 'normal', media: [], text: 'width: 50px;height: 50px;background-color: rgba(0,0,0,0.5);position: absolute;z-index: 999;top: 50%;transform: translateY(-50%);cursor: pointer;border-radius: 4px;left: 10px;', }, ], }, }, { css: { class: 'c_je9fi5', value: [ { state: 'normal', media: [], text: 'width: 50px;height: 50px;background-color: rgba(0,0,0,0.5);position: absolute;z-index: 999;top: 50%;transform: translateY(-50%);right: 10px;cursor: pointer;border-radius: 4px; ', }, ], }, props: { width: '', height: '', $$attributes: [ { key: 'onClick', value: { type: 'FUNCTION', value: "function rightClick(e) {\n\n const variableSpace = $$context.getStaticVarById('bannerState')\n console.log('variableSpace', variableSpace);\n variableSpace.nextScence();\n}", }, }, ], }, componentName: 'CBlock', configure: { propsSetter: { '$$attributes.0.value': { name: '$$attributes.0.value', setter: 'FunctionSetter', }, }, advanceSetter: {}, }, title: 'array-right', id: 'je9fi5', }, { style: [ { value: 'absolute', property: 'position', }, { value: '10px', property: 'bottom', }, { value: '50%', property: 'left', }, { value: 'translateX(-50%)', property: 'transform', }, { value: '20px', property: 'height', }, { value: 'flex', property: 'display', }, { value: 'center', property: 'align-items', }, { value: 'rgba(0,0,0,0.5)', property: 'background-color', }, { value: '10px', property: 'border-radius', }, { value: '0 10px', property: 'padding', }, { value: 'space-around', property: 'justify-content', }, { value: '80px', property: 'width', }, ], props: { width: '100px', height: '100px', }, componentName: 'CContainer', id: 'bl87pg', children: [ { props: { width: '', height: '', $$attributes: [ { key: 'onClick', value: { type: 'FUNCTION', value: 'function click() {\n console.log($$context.loopData);\n}', }, }, ], }, componentName: 'CBlock', id: 'jn98v0', configure: { propsSetter: { '$$attributes.0.value': { name: '$$attributes.0.value', setter: 'FunctionSetter', }, children: { name: 'children', setter: 'ExpressionSetter', }, }, advanceSetter: { 'loop.data': { name: 'loop.data', setter: 'ExpressionSetter', }, }, }, loop: { open: true, data: { type: 'EXPRESSION', value: '$$context.stateManager.bannerState.state.imgList', }, forName: 'item', forIndex: 'index', key: '', name: '', }, condition: true, children: [ { style: [ { value: { type: 'EXPRESSION', value: "$$context.stateManager.bannerState.state.currentPage === $$context.loopData.index ? 'white' : 'rgba(0,0,0,0.3)'", }, property: 'background', }, ], props: { width: '', height: '', $$attributes: [ { key: 'onClick', value: { type: 'FUNCTION', value: 'function click() {\n console.log(222, $$context.loopData);\n}', }, }, ], children: { type: 'EXPRESSION', value: '', }, }, componentName: 'CBlock', configure: { propsSetter: { '$$attributes.0.value': { name: '$$attributes.0.value', setter: 'FunctionSetter', }, children: { name: 'children', setter: 'ExpressionSetter', }, }, advanceSetter: { 'loop.data': { name: 'loop.data', setter: 'ExpressionSetter', }, }, }, loop: { open: false, data: { type: 'EXPRESSION', value: '', }, forName: 'item', forIndex: 'index', key: '', name: '', }, condition: true, id: '5mu9jm', css: { class: 'c_5mu9jm', value: [ { state: 'normal', media: [], text: 'border-radius: 4px;width: 10px;height: 10px; ', }, ], }, }, ], css: { class: 'c_jn98v0', value: [ { state: 'normal', media: [], text: 'width: 10px;height: 10px;background-color: rgba(200,200,200,0.5);border-radius: 4px; ', }, ], }, }, ], configure: { propsSetter: {}, advanceSetter: {}, }, loop: { open: false, data: [], forName: 'item', forIndex: 'index', key: '', name: '', }, condition: true, title: 'CContainer-thumbail', css: { class: 'c_bl87pg', value: [ { state: 'normal', media: [], text: 'animation-duration: 1;', }, ], }, }, ], configure: { propsSetter: {}, advanceSetter: {}, }, state: { currentPage: 1, imgList: [ 'https://images.unsplash.com/photo-1584080277544-2db5b2c2d9dd?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1470&q=80', 'https://images.unsplash.com/photo-1486046866764-e426b5b93d98?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2091&q=80', 'https://images.unsplash.com/photo-1534803005787-fa0b3987f6fc?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1502&q=80', ], }, loop: { open: false, data: [], forName: 'item', forIndex: 'index', key: '', name: '', }, condition: true, nodeName: 'bannerState', css: { class: 'c_2vi5b1', value: [ { state: 'normal', media: [], text: 'height: 500px;position: relative;width: 100%;overflow: hidden;margin: 0 auto;border-radius: 10px; ', }, ], }, }, ], configure: { propsSetter: {}, advanceSetter: {}, }, title: 'CContainer-bg', css: { class: 'ef9vms', value: [ { state: 'normal', media: [], text: 'padding: 20px 40px;', }, ], }, }, { props: { content: 'Hello Chamelon EG', }, componentName: 'CText', id: 'qpbnqn', configure: { propsSetter: {}, advanceSetter: {}, }, classNames: [ { name: '', status: { type: 'EXPRESSION', value: 'true', }, }, ], css: { class: 'c_qpbnqn', value: [ { state: 'normal', media: [ { type: 'max-width', value: '767', text: ' color: pink;', }, { type: 'max-width', value: '991', }, ], text: 'text-align: center;width: 100%;display: inline-block;font-size: 80px;padding: 20px;box-sizing: border-box;font-weight: bold;background-image: linear-gradient( 45deg, #CA4246 16.666%, #E16541 16.666%, #E16541 33.333%, #F18F43 33.333%, #F18F43 50%, #8B9862 50%, #8B9862 66.666%, #476098 66.666%, #476098 83.333%, #A7489B 83.333%);background-color: #CA4246;background-size: 100%;background-repeat: repeat;color: transparent;-webkit-background-clip: text; ', }, ], }, }, { style: [ { value: '20px 40px', property: 'margin', }, { value: '20px', property: 'border-radius', }, { value: 'hidden', property: 'overflow', }, { value: '2px 2px 5px rgba(0,0,0,0.2)', property: 'box-shadow', }, { value: 'hidden', property: 'Webkit-backface-visibility', }, ], props: { width: '100px', height: '100px', }, componentName: 'CContainer', id: 'ekv045', children: [ { props: { width: '100%', height: '', src: 'https://vjs.zencdn.net/v/oceans.mp4', autoPlay: '', controls: true, $$attributes: [], }, componentName: 'CVideo', id: 'vu26ll', configure: { propsSetter: { autoplay: { name: 'autoplay', setter: 'ExpressionSetter', }, autoPlay: { name: 'autoPlay', setter: 'BooleanSetter', }, }, advanceSetter: {}, }, css: { class: 'c_vu26ll', value: [ { state: 'normal', media: [], text: 'margin: auto;display: block; ', }, ], }, }, ], configure: { propsSetter: {}, advanceSetter: {}, }, title: 'video-container', }, ], configure: { propsSetter: {}, advanceSetter: {}, }, title: 'bg-CContainer', classNames: [], css: { class: 'ckakcd', value: [ { state: 'normal', media: [], text: 'background-color: white;width: 100%;overflow: auto; ', }, ], }, }, ], }, thirdLibs: [ { package: 'dayjs', name: 'dayjs', version: '1.0.0', }, { package: 'antd', name: 'antd', version: '1.0.0', }, ], assets: [ { package: 'dayjs', globalName: 'dayjs', resources: [ { src: 'https://cdn.jsdelivr.net/npm/dayjs@1.11.12/dayjs.min.js', }, ], }, ], }; ================================================ FILE: packages/demo-page/src/pages/emptyPage.ts ================================================ import { CPageDataType, InnerComponentNameEnum } from '@chamn/model'; export const EmptyPage: CPageDataType = { version: '1.0.0', name: 'EmptyPage', componentsMeta: [], componentsTree: { componentName: InnerComponentNameEnum.ROOT_CONTAINER, props: {}, children: [], }, }; ================================================ FILE: packages/demo-page/src/pages/layout.ts ================================================ import { CPageDataType } from '@chamn/model'; export const LayoutPage: CPageDataType = { version: '1.0.0', name: 'LayoutPage', componentsMeta: [ { componentName: 'GridItem', name: 'GridItem', package: '@chamn/material', version: '0.0.46', destructuring: true, exportName: 'GridItem', }, { componentName: 'GridLayout', name: 'GridLayout', package: '@chamn/material', version: '0.0.46', destructuring: true, exportName: 'GridLayout', }, ], componentsTree: { componentName: 'RootContainer', props: { a: 1, }, state: { b: 2, buttonVisible: true, modalVisible: false, }, configure: { propsSetter: {}, advanceSetter: {}, }, children: [ { props: { breakpoints: [ { w: 350, label: 'mobile', }, { w: 768, label: 'xs', }, { w: 992, label: 'sm', }, { w: 1200, label: 'md', }, { w: 1920, label: 'lg', }, { w: 3600, label: 'xl', }, ], }, componentName: 'GridLayout', id: 'hps09b', children: [ { props: { responsive: [ { label: 'lg', info: { x: 0, y: 11, w: 14, h: 3, }, x: '', y: '', }, { label: 'md', info: { x: 0, y: 4, w: 24, h: 2, }, x: '', y: '', }, { label: 'xs', info: { x: 6, y: 7, w: 14, h: 3, }, }, { label: 'sm', info: { x: 0, y: 11, w: 14, h: 3, }, }, ], }, componentName: 'GridItem', id: 'vnuvg0', configure: { propsSetter: {}, advanceSetter: {}, }, style: [ { property: 'background-color', value: 'rgb(139,187,17)', }, { property: 'background-image', value: '', }, { property: 'background-size', value: '', }, { property: 'background-repeat', value: '', }, ], }, { props: { responsive: [ { label: 'lg', info: { x: 9, y: 7, w: 15, h: 4, }, x: '', y: '', }, { label: 'md', info: { x: 9, y: 6, w: 15, h: 3, }, x: '', y: '', }, { label: 'xs', info: { x: 5, y: 5, w: 16, h: 2, }, }, { label: 'sm', info: { x: 9, y: 7, w: 15, h: 4, }, }, ], }, componentName: 'GridItem', configure: { propsSetter: {}, advanceSetter: {}, }, id: 'pl20rg', style: [ { property: 'background-color', value: 'rgb(250,140,22)', }, { property: 'background-image', value: '', }, { property: 'background-size', value: '', }, { property: 'background-repeat', value: '', }, ], }, { props: { responsive: [ { label: 'lg', info: { x: 0, y: 5, w: 13, h: 2, }, x: '', y: '', }, { label: 'md', info: { x: 0, y: 9, w: 13, h: 5, }, x: '', y: '', }, { label: 'xs', info: { x: 4, y: 3, w: 18, h: 2, }, }, { label: 'sm', info: { x: 0, y: 5, w: 13, h: 2, }, }, ], }, componentName: 'GridItem', configure: { propsSetter: {}, advanceSetter: {}, }, id: 'b7l87q', style: [ { property: 'background-color', value: 'rgb(114,46,209)', }, { property: 'background-image', value: '', }, { property: 'background-size', value: '', }, { property: 'background-repeat', value: '', }, ], }, { props: { responsive: [ { label: 'lg', info: { x: 0, y: 0, w: 24, h: 3, }, x: '', y: '', }, { label: 'md', info: { x: 0, y: 0, w: 24, h: 2, }, x: '', y: '', }, { label: 'xs', info: { x: 0, y: 0, w: 24, h: 3, }, }, { label: 'sm', info: { x: 0, y: 0, w: 24, h: 3, }, }, ], }, componentName: 'GridItem', configure: { propsSetter: {}, advanceSetter: {}, }, id: 'egib67', style: [ { property: 'background-color', value: 'rgb(245,34,45)', }, { property: 'background-image', value: '', }, { property: 'background-size', value: '', }, { property: 'background-repeat', value: '', }, ], }, ], configure: { propsSetter: {}, advanceSetter: {}, }, }, ], }, thirdLibs: [ { package: 'dayjs', name: 'dayjs', version: '1.0.0', }, { package: 'antd', name: 'antd', version: '1.0.0', }, ], assets: [ { package: '@chamn/material', globalName: 'ChamnCommonComponents', resources: [ { src: 'https://cdn.jsdelivr.net/npm/@chamn/material/dist/index.js', }, { src: 'https://cdn.jsdelivr.net/npm/@chamn/material/dist/style.css', }, ], }, ], }; ================================================ FILE: packages/demo-page/src/pages/simplePage.ts ================================================ import { CNodePropsTypeEnum, CPageDataType, LogicType, TLogicAssignValueItem, TLogicJumpLinkItem, } from '@chamn/model'; export const SamplePage: CPageDataType = { version: '1.0.0', name: 'BaseDemoPage', componentsMeta: [], componentsTree: { id: '1', componentName: 'RootContainer', props: { a: 1, }, children: [ { id: 'globalStateText', componentName: 'div', injectEnvList: ['COMPONENTS'], props: { children: { type: 'EXPRESSION', value: '"rowState to reshow: " + $$context.stateManager.RowState.state.rowMark', }, }, }, { componentName: 'Card', state: { link: 'https://www.baidu2.com/state', }, props: { onClick1: { type: 'FUNCTION', value: ` function (a) { console.log(a, $$context); const stateManager = $$context.stateManager; const methods = $$context.getMethods(); console.log("🚀 ~ methods:", methods) const state = stateManager.RowState.state; stateManager.RowState.updateState({ rowMark: state.rowMark +1 }) } `, }, onClick: { type: CNodePropsTypeEnum.ACTION, handler: [ { id: 1, type: 'RUN_CODE', sourceCode: '', value: ` console.log('12321312'); return 555; `, next: 2, }, { id: 2, next: 3, type: 'JUMP_LINK', link: 'https://www.baidu.com', }, { type: 'JUMP_LINK', link: { type: 'EXPRESSION', value: '$$context.state.link', }, } as TLogicJumpLinkItem, { id: '3', next: '4', type: 'JUMP_LINK', link: { type: 'FUNCTION', sourceCode: `function () { return $$context.state.link; }`, value: `function () { console.log('jump3'); return $$context.state.link; }`, }, } as TLogicJumpLinkItem, { id: 4, type: LogicType.REQUEST_API, apiPath: { type: 'FUNCTION', value: ` function () { console.log($$context); return 'https://www.api.com' } `, }, body: { a: '123', f: 456, b: { type: 'EXPRESSION', value: '$$context.state.link', }, c: { type: 'FUNCTION', sourceCode: `function () { return $$context.state.link; }`, value: `function () { return $$context.state.link; }`, }, }, responseVarName: 'APIResult', afterSuccessResponse: [ { id: 't1', next: 't2', type: 'RUN_CODE', value: ` console.log($$context, $$response); console.log(77889999, apiResult) `, }, { id: 't2', next: 't3', type: 'CALL_NODE_METHOD', nodeId: 'testNode', methodName: 'sayHello', args: [ 123, { type: 'EXPRESSION', value: '$$context.state.a', }, { type: 'FUNCTION', value: ` function (apiResult) { console.log('apiResult 99999', apiResult, $$response); return 890; } `, }, ], returnVarName: 'callNodeReturnVar', }, { type: 'RUN_CODE', id: 't3', next: 't4', value: ` console.log(9898989, apiResult, $$context, $$response, $$actionVariableSpace); console.log(77889999,callNodeReturnVar, APIResult) `, }, { id: 't4', next: 't5', type: LogicType.ASSIGN_VALUE, valueType: 'STATE', currentValue: { type: 'EXPRESSION', value: 'APIResult', }, targetValueName: { nodeId: 'xxx', keyPath: 'apiResult', }, } as TLogicAssignValueItem, { id: 't5', next: 't6', type: LogicType.ASSIGN_VALUE, valueType: 'MEMORY', currentValue: { type: 'FUNCTION', value: `function (apiResult) { console.log(6677, apiResult, APIResult); return apiResult; } `, }, targetValueName: 'tempApiResult1', } as TLogicAssignValueItem, ], afterFailedResponse: [ { type: 'RUN_CODE', id: 't7', next: 't8', value: ` console.log($$context, $$response); console.log('errrrror', apiResult) `, }, ], }, ], }, }, eventListener: [ { name: 'ON_DID_RENDER', func: { type: CNodePropsTypeEnum.ACTION, handler: [ { id: '12', type: 'RUN_CODE', value: ` console.log('12321312', $$context, $PARAMS); console.log('Component Did Mount') return 'Component Did Mount' `, }, ], }, }, { name: 'ON_WILL_DESTROY', func: { type: CNodePropsTypeEnum.ACTION, handler: [ { id: '123', type: 'RUN_CODE', value: ` console.log('12321312', $$context, params); console.log('Component ON_WILL_DESTROY') return 'Component ON_WILL_DESTROY' `, }, ], }, }, ], methods: [ { name: 'getAge', type: 'FUNCTION', value: `function getAge() { console.log(12); }`, }, ], children: ['Action login flow Demo'], }, { id: 'testNode', componentName: 'Button', props: { onClick: { type: 'FUNCTION', value: ` function (a) { console.log(a, $$context); const stateManager = $$context.stateManager; const methods = $$context.getMethods(); console.log("🚀 ~ methods:", methods) const state = stateManager.RowState.state; stateManager.RowState.updateState({ rowMark: state.rowMark +1 }) } `, }, }, methods: [ { name: 'getAge', type: 'FUNCTION', value: `function getAge() { console.log(12); }`, }, ], children: ['change row state value'], }, { id: '4', componentName: 'Row', state: { rowMark: 1, }, nodeName: 'RowState', children: [ { componentName: 'div', props: { children: { type: 'EXPRESSION', value: '"rowState to reshow: " + $$context.stateManager.RowState.state.rowMark', }, }, }, ], }, ], }, }; ================================================ FILE: packages/demo-page/src/vite-env.d.ts ================================================ /// ================================================ FILE: packages/demo-page/tsconfig.json ================================================ { "compilerOptions": { "target": "ESNext", "useDefineForClassFields": true, "lib": [ "DOM", "DOM.Iterable", "ESNext" ], "allowJs": false, "skipLibCheck": true, "esModuleInterop": false, "allowSyntheticDefaultImports": true, "strict": true, "forceConsistentCasingInFileNames": true, "module": "ESNext", "moduleResolution": "Node", "resolveJsonModule": true, "isolatedModules": false, "noEmit": true, "jsx": "react" }, "include": [ "src" ], } ================================================ FILE: packages/docs-app/.gitignore ================================================ # build output dist/ # generated types .astro/ # dependencies node_modules/ # logs npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* # environment variables .env .env.production # macOS-specific files .DS_Store ================================================ FILE: packages/docs-app/.vscode/extensions.json ================================================ { "recommendations": ["astro-build.astro-vscode"], "unwantedRecommendations": [] } ================================================ FILE: packages/docs-app/.vscode/launch.json ================================================ { "version": "0.2.0", "configurations": [ { "command": "./node_modules/.bin/astro dev", "name": "Development server", "request": "launch", "type": "node-terminal" } ] } ================================================ FILE: packages/docs-app/CHANGELOG.md ================================================ # Change Log All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. ## [0.10.4](https://github.com/ByteCrazy/chameleon/compare/v0.10.3...v0.10.4) (2026-01-17) **Note:** Version bump only for package docs-app ## [0.10.3](https://github.com/ByteCrazy/chameleon/compare/v0.10.2...v0.10.3) (2026-01-17) **Note:** Version bump only for package docs-app ## [0.10.2](https://github.com/ByteCrazy/chameleon/compare/v0.10.1...v0.10.2) (2026-01-17) **Note:** Version bump only for package docs-app ## [0.10.1](https://github.com/ByteCrazy/chameleon/compare/v0.10.0...v0.10.1) (2026-01-11) **Note:** Version bump only for package docs-app ## [0.10.0](https://github.com/hlerenow/chameleon/compare/v0.9.3...v0.10.0) (2025-12-25) ### 📝 Documentation | 文档 * 添加 GridLayout 代码示例和插件开发文档 ([cade905](https://github.com/hlerenow/chameleon/commit/cade90591efff604a8ab3395c905c4f713ba2b93)) ## [0.9.3](https://github.com/ByteCrazy/chameleon/compare/v0.9.2...v0.9.3) (2025-07-20) **Note:** Version bump only for package docs-app ## [0.9.2](https://github.com/ByteCrazy/chameleon/compare/v0.9.1...v0.9.2) (2025-07-13) **Note:** Version bump only for package docs-app ## [0.9.1](https://github.com/ByteCrazy/chameleon/compare/v0.9.0...v0.9.1) (2025-07-13) **Note:** Version bump only for package docs-app ## [0.9.0](https://github.com/ByteCrazy/chameleon/compare/v0.8.6...v0.9.0) (2025-07-13) **Note:** Version bump only for package docs-app ## [0.8.6](https://github.com/ByteCrazy/chameleon/compare/v0.8.5...v0.8.6) (2025-06-21) **Note:** Version bump only for package docs-app ## [0.8.5](https://github.com/ByteCrazy/chameleon/compare/v0.8.4...v0.8.5) (2025-04-13) **Note:** Version bump only for package docs-app ## [0.8.4](https://github.com/ByteCrazy/chameleon/compare/v0.8.3...v0.8.4) (2025-04-13) **Note:** Version bump only for package docs-app ## [0.8.3](https://github.com/ByteCrazy/chameleon/compare/v0.8.2...v0.8.3) (2025-04-12) **Note:** Version bump only for package docs-app ## [0.8.2](https://github.com/ByteCrazy/chameleon/compare/v0.8.1...v0.8.2) (2025-04-11) **Note:** Version bump only for package docs-app ## [0.8.1](https://github.com/ByteCrazy/chameleon/compare/v0.8.0...v0.8.1) (2025-04-10) **Note:** Version bump only for package docs-app ## [0.8.0](https://github.com/ByteCrazy/chameleon/compare/v0.7.0...v0.8.0) (2025-04-10) **Note:** Version bump only for package docs-app ## [0.7.0](https://github.com/ByteCrazy/chameleon/compare/v0.6.0...v0.7.0) (2025-04-06) **Note:** Version bump only for package docs-app ## [0.6.0](https://github.com/ByteCrazy/chameleon/compare/v0.5.2...v0.6.0) (2025-03-30) **Note:** Version bump only for package docs-app ## [0.5.2](https://github.com/ByteCrazy/chameleon/compare/v0.5.1...v0.5.2) (2025-03-30) **Note:** Version bump only for package docs-app ## [0.5.1](https://github.com/ByteCrazy/chameleon/compare/v0.5.0...v0.5.1) (2025-03-30) **Note:** Version bump only for package docs-app ## [0.5.0](https://github.com/ByteCrazy/chameleon/compare/v0.4.0...v0.5.0) (2025-03-30) **Note:** Version bump only for package docs-app ## [0.4.0](https://github.com/ByteCrazy/chameleon/compare/v0.3.21...v0.4.0) (2025-03-29) **Note:** Version bump only for package docs-app ## [0.3.21](https://github.com/ByteCrazy/chameleon/compare/v0.3.20...v0.3.21) (2025-03-26) **Note:** Version bump only for package docs-app ## [0.3.20](https://github.com/ByteCrazy/chameleon/compare/v0.3.19...v0.3.20) (2025-03-26) **Note:** Version bump only for package docs-app ## [0.3.19](https://github.com/ByteCrazy/chameleon/compare/v0.3.18...v0.3.19) (2025-03-26) **Note:** Version bump only for package docs-app ## [0.3.18](https://github.com/ByteCrazy/chameleon/compare/v0.3.17...v0.3.18) (2025-03-26) **Note:** Version bump only for package docs-app ================================================ FILE: packages/docs-app/README.md ================================================ # Starlight Starter Kit: Basics [![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build) ``` pnpm create astro@latest -- --template starlight ``` [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/starlight/tree/main/examples/basics) [![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/starlight/tree/main/examples/basics) [![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/withastro/starlight&create_from_path=examples/basics) [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fwithastro%2Fstarlight%2Ftree%2Fmain%2Fexamples%2Fbasics&project-name=my-starlight-docs&repository-name=my-starlight-docs) > 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! ## 🚀 Project Structure Inside of your Astro + Starlight project, you'll see the following folders and files: ``` . ├── public/ ├── src/ │ ├── assets/ │ ├── content/ │ │ ├── docs/ │ └── content.config.ts ├── astro.config.mjs ├── package.json └── tsconfig.json ``` Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed as a route based on its file name. Images can be added to `src/assets/` and embedded in Markdown with a relative link. Static assets, like favicons, can be placed in the `public/` directory. ## 🧞 Commands All commands are run from the root of the project, from a terminal: | Command | Action | | :------------------------ | :----------------------------------------------- | | `pnpm install` | Installs dependencies | | `pnpm dev` | Starts local dev server at `localhost:4321` | | `pnpm build` | Build your production site to `./dist/` | | `pnpm preview` | Preview your build locally, before deploying | | `pnpm astro ...` | Run CLI commands like `astro add`, `astro check` | | `pnpm astro -- --help` | Get help using the Astro CLI | ## 👀 Want to learn more? Check out [Starlight’s docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat). ================================================ FILE: packages/docs-app/astro.config.mjs ================================================ /* eslint-disable no-undef */ import { defineConfig, passthroughImageService } from 'astro/config'; import starlight from '@astrojs/starlight'; import react from '@astrojs/react'; import astroMermaid from 'astro-mermaid'; const isProd = process.env.NODE_ENV === 'production'; console.log('🚀 ~ isProd:', isProd); // https://astro.build/config export default defineConfig({ base: isProd ? '/chameleon/documents' : '/documents', integrations: [ starlight({ title: 'Chameleon Docs', social: { github: 'https://github.com/hlerenow/chameleon', }, sidebar: [ { label: 'Guides', autogenerate: { directory: 'guides', }, }, { label: 'Reference', autogenerate: { directory: 'reference', }, }, ], }), react(), astroMermaid({ theme: 'default', }), ], image: { service: passthroughImageService(), }, }); ================================================ FILE: packages/docs-app/package.json ================================================ { "name": "docs-app", "type": "module", "private": true, "version": "0.10.4", "scripts": { "dev": "astro dev", "start": "astro dev", "build": "astro build", "preview": "astro preview", "astro": "astro" }, "dependencies": { "@ant-design/icons": "^5.4.0", "@astrojs/check": "^0.9.2", "@astrojs/react": "^3.6.2", "@astrojs/starlight": "^0.32.4", "@chamn/demo-page": "workspace:^", "@chamn/engine": "workspace:^", "@chamn/model": "workspace:^", "@chamn/render": "workspace:^", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "antd": "^5.23.2", "astro": "^5.5.3", "astro-mermaid": "^1.2.0", "mermaid": "^11.12.2", "react": "^18.3.1", "react-dom": "^18.3.1", "typescript": "~5.7.2" } } ================================================ FILE: packages/docs-app/src/codeSnippets/ButtonMeta.tsx ================================================ import { CMaterialType } from '@chamn/model'; export const ButtonMeta: CMaterialType = { title: 'Button', componentName: 'Button', npm: { package: 'antd', exportName: 'Button', destructuring: true, version: '1.0.0', }, icon: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', // 对 Button 属性的行为描述 props: [ { name: 'type', title: '按钮类型', valueType: 'string', // 用于配制用那些输入控件来接收 props 的值 setters: [ { componentName: 'SelectSetter', props: { options: [ { value: 'primary', label: 'primary', }, { value: 'link', label: 'link', }, { value: '', label: 'Default', }, ], }, }, ], }, { name: 'block', title: '块状按钮', valueType: 'boolean', setters: ['BooleanSetter'], // 用于支持联动,当某些 key 的值变化后,控制当前属性是否显示的逻辑判断 condition: (state) => { if (state.type === 'primary') { return true; } return false; }, }, { name: 'children', title: '文本', valueType: 'string', // 支持多种值的输入控件 setters: ['StringSetter', 'ExpressionSetter'], }, { name: 'onClick', title: '点击时', valueType: 'function', setters: ['FunctionSetter', 'ExpressionSetter'], }, { name: 'text1', title: '联动文本1', valueType: 'string', setters: [ { componentName: 'StringSetter', }, ], condition: (state) => { if (state.type === 'primary1') { return true; } return false; }, }, { name: 'text2', title: '联动文本2', valueType: 'string', setters: [ { componentName: 'StringSetter', }, ], condition: (state) => { if (state.text1 === '1') { return true; } return false; }, }, { name: 'text3', title: '联动文本3', valueType: 'string', setters: [ { componentName: 'StringSetter', }, 'ExpressionSetter', ], }, ], // 组件 schema 片段,会被展示在组件库中 snippets: [ { title: '基础按钮', snapshot: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', category: '基础控件2', // 当被拖入到画布上时会将对应的 schema 添加到 页面级别的 Schema 中, 如果 schema 没有componentName, 会默认添加当前组件的 componentName schema: { props: { type: 'primary', }, children: ['I am a Button'], }, }, { title: '基础按钮', snapshot: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', category: '基础控件3', schema: { props: { type: 'primary', }, children: ['I am a Button'], }, }, { title: '基础按钮', snapshot: 'https://alifd.oss-cn-hangzhou.aliyuncs.com/fusion-cool/icons/icon-light/ic_light_button.png', category: '基础控件4', schema: { props: { type: 'primary', }, children: ['I am a Button'], }, }, ], }; ================================================ FILE: packages/docs-app/src/codeSnippets/Editor.tsx ================================================ import { BasePage, Material } from '@chamn/demo-page'; import { Button, message, Modal } from 'antd'; import React, { useCallback, useEffect, useState } from 'react'; import ReactDOM from 'react-dom'; import ReactDOMClient from 'react-dom/client'; import '@chamn/engine/dist/style.css'; import { Engine, EnginContext, InnerComponentMeta, plugins } from '@chamn/engine'; import { RollbackOutlined } from '@ant-design/icons'; import './index.css'; const { DisplaySourceSchema, DEFAULT_PLUGIN_LIST } = plugins; const win = window as any; win.React = React; win.ReactDOM = ReactDOM; win.ReactDOMClient = ReactDOMClient; export const App = () => { const [ready, setReady] = useState(false); const [page, setPage] = useState(BasePage); useEffect(() => { // 从本地获取 page schema const localPage = localStorage.getItem('pageSchema'); if (localPage) { setPage(JSON.parse(localPage)); } setReady(true); }, []); const onReady = useCallback(async (ctx: EnginContext) => { const designer = await ctx.pluginManager.onPluginReadyOk('Designer'); const reloadPage = async () => { setTimeout(() => { const designerExports = designer?.export; designerExports.reload(); }, 0); }; // 获取 引擎 工作台对象 const workbench = ctx.engine.getWorkbench(); // 自定义顶部 bar workbench?.replaceTopBarView(
Chameleon EG
), content: (