From 991344f621f2a90ef94dc00856e0521d16db390e Mon Sep 17 00:00:00 2001 From: chen <14088532+chen2228419604@user.noreply.gitee.com> Date: Wed, 9 Jul 2025 10:23:09 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feature:=20=E5=AE=9E=E7=8E=B0=E5=8F=AF?= =?UTF-8?q?=E8=A7=86=E5=8C=96=E7=9A=84=E6=A0=B7=E5=BC=8F=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E5=99=A8=EF=BC=8C=E6=94=AF=E6=8C=81=E5=A4=96=E8=BE=B9=E8=B7=9D?= =?UTF-8?q?=E3=80=81=E5=86=85=E8=BE=B9=E8=B7=9D=E3=80=81=E8=BE=B9=E6=A1=86?= =?UTF-8?q?=E3=80=81=E9=98=B4=E5=BD=B1=E3=80=81=E8=83=8C=E6=99=AF=E8=89=B2?= =?UTF-8?q?=E7=9A=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designer/public/designer-canvas/step.json | 108 +++ packages/designer/src/app-providers.ts | 4 +- .../form-designer/form-designer.component.tsx | 6 +- .../components/types/toolbox/pc-toolbox.json | 9 +- .../src/composition/use-type-resolver.ts | 1 + .../components/dynamic-form/src/types.ts | 2 +- .../dynamic-view/src/components/maps.ts | 2 + .../section.property-config.ts | 29 +- .../ui-vue/components/style-editor/index.ts | 19 + .../style-editor/src/composition/types.ts | 40 ++ .../src/composition/use-resize-handle.ts | 66 ++ .../style-editor-use-designer-rules.ts | 32 + .../style-editor.property-config.ts | 73 ++ .../src/schema/style-editor-schema-mapper.ts | 5 + .../schema/style-editor-schema-resolver.ts | 47 ++ .../style-editor/src/schema/style.schema.json | 50 ++ .../src/style-editor.component.tsx | 672 ++++++++++++++++++ .../style-editor/src/style-editor.css | 146 ++++ .../style-editor/src/style-editor.props.ts | 18 + .../ui-vue/components/style-editor/style.ts | 2 + pnpm-lock.yaml | 289 ++++---- 21 files changed, 1442 insertions(+), 178 deletions(-) create mode 100644 packages/designer/public/designer-canvas/step.json create mode 100644 packages/ui-vue/components/style-editor/index.ts create mode 100644 packages/ui-vue/components/style-editor/src/composition/types.ts create mode 100644 packages/ui-vue/components/style-editor/src/composition/use-resize-handle.ts create mode 100644 packages/ui-vue/components/style-editor/src/designer/style-editor-use-designer-rules.ts create mode 100644 packages/ui-vue/components/style-editor/src/property-config/style-editor.property-config.ts create mode 100644 packages/ui-vue/components/style-editor/src/schema/style-editor-schema-mapper.ts create mode 100644 packages/ui-vue/components/style-editor/src/schema/style-editor-schema-resolver.ts create mode 100644 packages/ui-vue/components/style-editor/src/schema/style.schema.json create mode 100644 packages/ui-vue/components/style-editor/src/style-editor.component.tsx create mode 100644 packages/ui-vue/components/style-editor/src/style-editor.css create mode 100644 packages/ui-vue/components/style-editor/src/style-editor.props.ts create mode 100644 packages/ui-vue/components/style-editor/style.ts diff --git a/packages/designer/public/designer-canvas/step.json b/packages/designer/public/designer-canvas/step.json new file mode 100644 index 00000000000..f7741e9a145 --- /dev/null +++ b/packages/designer/public/designer-canvas/step.json @@ -0,0 +1,108 @@ +{ + "id": "root-component", + "type": "component", + "componentType": "frame", + "contents": [ + { + "id": "root-layout", + "type": "content-container", + "appearance": { + "class": "f-page f-page-navigate f-page-is-grid-card" + }, + "contents": [ + { + "id": "page-header", + "type": "page-header", + "appearance": { + "class": "f-page-header" + }, + "icon": "f-icon f-icon-page-title-dictionary", + "title": "步骤条示例", + "toolbar": { + "type": "response-toolbar", + "buttons": [ + { + "id": "button-add", + "type": "response-toolbar-item", + "appearance": { + "class": "btn-primary" + }, + "text": "新增" + }, + { + "id": "button-edit", + "type": "response-toolbar-item", + "text": "编辑" + }, + { + "id": "button-save", + "type": "response-toolbar-item", + "text": "保存" + }, + { + "id": "button-cancel", + "type": "response-toolbar-item", + "text": "取消" + }, + { + "id": "button-delete", + "type": "response-toolbar-item", + "text": "删除" + } + ] + } + }, + { + "id": "main-container", + "type": "content-container", + "appearance": { + "class": "f-page-main" + }, + "contents": [ + { + "id": "step-component", + "type": "component", + "componentType": "step", + "appearance": { + "class": "f-progress-step" + }, + "props": { + "direction": "horizontal", + "fill": false, + "height": 0, + "clickable": true, + "steps": [ + { + "id": "1", + "title": "第一步", + "description": "这是第一步的描述", + "disable": false, + "icon": "", + "status": "" + }, + { + "id": "2", + "title": "第二步", + "description": "这是第二步的描述", + "disable": false, + "icon": "", + "status": "" + }, + { + "id": "3", + "title": "第三步", + "description": "这是第三步的描述", + "disable": false, + "icon": "", + "status": "" + } + ], + "activeIndex": 0 + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/packages/designer/src/app-providers.ts b/packages/designer/src/app-providers.ts index ea3461537cd..bc8b288b6bf 100644 --- a/packages/designer/src/app-providers.ts +++ b/packages/designer/src/app-providers.ts @@ -2,15 +2,13 @@ import { FLoadingService, FTooltipDirective, FMessageBoxService, F_MODAL_SERVICE_TOKEN, FModalService, LookupSchemaRepositoryToken, FieldSelectorRepositoryToken, F_NOTIFY_SERVICE_TOKEN, FNotifyService, ControllerSchemaRepositorySymbol, FormSchemaRepositorySymbol } from "@farris/ui-vue/components"; import { App } from "vue"; import { useDesignerContext } from "./components/composition/designer-context/use-designer-context"; -// const designerContext =useDesignerContext(); - +// const designerContext = useDesignerContext(); export default { install(app: App): void { app.provide(F_MODAL_SERVICE_TOKEN, new FModalService(app)); app.provide('FLoadingService', FLoadingService); // app.provide('designerContext', designerContext); - // const metadataPath = metadataService.getMetadataPath(); // app.provide(MetadataPathToken, metadataPath); diff --git a/packages/designer/src/components/components/form-designer/form-designer.component.tsx b/packages/designer/src/components/components/form-designer/form-designer.component.tsx index a562675fd84..35d85e92b8c 100644 --- a/packages/designer/src/components/components/form-designer/form-designer.component.tsx +++ b/packages/designer/src/components/components/form-designer/form-designer.component.tsx @@ -7,7 +7,7 @@ import MonacoEditor from '../monaco-editor/monaco-editor.component'; import FEntityTreeView from '../entity-tree-view/components/entity-tree-view.component'; import FCustomClassEditor from './components/custom-class-editor/custom-class-editor.component'; import modulePropertyConfig from '../../types/form-property-config.json'; -import { UseDesignerContext } from "src/components/types/designer-context"; +import { UseDesignerContext } from "../../types/designer-context"; export default defineComponent({ name: 'FFormDesigner', @@ -25,9 +25,7 @@ export default defineComponent({ const monacoEditorRef = ref(); const customClassEditorRef = ref(); const designerHostService = inject('designer-host-service') as DesignerHost; - - const designerContextRef = inject("designerContext") as Ref; - const designerContext = designerContextRef.value as UseDesignerContext; + const designerContext = inject('designerContext') as UseDesignerContext; const { toolboxItems, componentsToRegister, designerMode } = designerContext; diff --git a/packages/designer/src/components/types/toolbox/pc-toolbox.json b/packages/designer/src/components/types/toolbox/pc-toolbox.json index 37a76ad4852..c26453deb1c 100644 --- a/packages/designer/src/components/types/toolbox/pc-toolbox.json +++ b/packages/designer/src/components/types/toolbox/pc-toolbox.json @@ -128,7 +128,7 @@ "type": "external-container", "name": "外部容器", "category": "container", - "icon":"content-container" + "icon": "content-container" } ] }, @@ -153,6 +153,13 @@ "name": "步骤条", "category": "container", "icon": "steps" + }, + { + "id": "Step", + "type": "step", + "name": "步骤条", + "category": "container", + "icon": "steps" } ] }, diff --git a/packages/ui-vue/components/dynamic-form/src/composition/use-type-resolver.ts b/packages/ui-vue/components/dynamic-form/src/composition/use-type-resolver.ts index b97e375b61e..51dc9a36e14 100644 --- a/packages/ui-vue/components/dynamic-form/src/composition/use-type-resolver.ts +++ b/packages/ui-vue/components/dynamic-form/src/composition/use-type-resolver.ts @@ -77,6 +77,7 @@ export function useTypeResolver(): UseTypeResolver { case 'response-layout-splitter': case 'menu-lookup': case 'json-editor': + case 'style-editor': return 'onChange'; case 'field-selector': case 'binding-selector': return 'onFieldSelected'; diff --git a/packages/ui-vue/components/dynamic-form/src/types.ts b/packages/ui-vue/components/dynamic-form/src/types.ts index 0ad906cbc9d..5a37fea415e 100644 --- a/packages/ui-vue/components/dynamic-form/src/types.ts +++ b/packages/ui-vue/components/dynamic-form/src/types.ts @@ -4,7 +4,7 @@ export type EditorType = 'button-edit' | 'check-box' | 'check-group' | 'combo-li 'response-layout-editor-setting' | 'switch' | 'grid-field-editor' | 'field-selector' | 'schema-selector' | 'mapping-editor' | 'textarea' | 'response-form-layout-setting' | 'binding-selector' | 'query-solution-config' | 'solution-preset' | 'item-collection-editor' | 'menu-lookup' | 'response-layout-splitter' | 'json-editor' | 'property-editor' | 'sort-condition-editor' | - 'filter-condition-editor' | 'expression-editor' | 'code-editor' | 'collection-property-editor'; + 'filter-condition-editor' | 'expression-editor' | 'code-editor' | 'collection-property-editor'|'style-editor'; export interface EditorConfig { /** 编辑器类型 */ diff --git a/packages/ui-vue/components/dynamic-view/src/components/maps.ts b/packages/ui-vue/components/dynamic-view/src/components/maps.ts index 4d1970af0bf..b1e9d5e5477 100644 --- a/packages/ui-vue/components/dynamic-view/src/components/maps.ts +++ b/packages/ui-vue/components/dynamic-view/src/components/maps.ts @@ -70,6 +70,7 @@ import FExpressionEditor from '@farris/ui-vue/components/expression-editor'; import FCodeEditor from '@farris/ui-vue/components/code-editor'; import FHtmlTemplate from '@farris/ui-vue/components/html-template'; import FCollectionPropertyEditor from '@farris/ui-vue/components/collection-property-editor'; +import FStyleEditor from '@farris/ui-vue/components/style-editor'; const componentMap: Record = {}; const componentPropsConverter: Record = {}; @@ -156,6 +157,7 @@ function loadRegister() { FCodeEditor.register(componentMap, componentPropsConverter, componentPropertyConfigConverter, resolverMap); FHtmlTemplate.register(componentMap, componentPropsConverter, componentPropertyConfigConverter, resolverMap); FCollectionPropertyEditor.register(componentMap, componentPropsConverter, componentPropertyConfigConverter, resolverMap); + FStyleEditor.register(componentMap, componentPropsConverter, componentPropertyConfigConverter, resolverMap); } } diff --git a/packages/ui-vue/components/section/src/property-config/section.property-config.ts b/packages/ui-vue/components/section/src/property-config/section.property-config.ts index b505d422cb6..e70772ffff8 100644 --- a/packages/ui-vue/components/section/src/property-config/section.property-config.ts +++ b/packages/ui-vue/components/section/src/property-config/section.property-config.ts @@ -16,12 +16,14 @@ export class SectionProperty extends BaseControlProperty { // 行为 const behavior = this.getBehaviorConfig(propertyData, ''); + const style = this.getStyleProperties(propertyData); + this.propertyConfig.categories = { - basic, appearance, headerTemplate, extend, behavior + basic, appearance, headerTemplate, extend, behavior,style }; return this.propertyConfig; } - getAppearanceProperties(propertyData) { + getAppearanceProperties(propertyData) { return { title: '外观', @@ -127,6 +129,29 @@ export class SectionProperty extends BaseControlProperty { } }; } + getStyleProperties(propertyData) { + + return { + title: '样式', + description: 'sdfsf', + tabId:'style', + tabName: '样式', + properties: { + style: { + description: '组件的Style样式', + title: 'class样式', + editor: { + type: "style-editor"} + } + }, + setPropertyRelates(changeObject, prop) { + if (!changeObject) { + return; + } + } + + }; + } getExtendConfig(propertyData) { return { title: '扩展', diff --git a/packages/ui-vue/components/style-editor/index.ts b/packages/ui-vue/components/style-editor/index.ts new file mode 100644 index 00000000000..8a9ec857dc9 --- /dev/null +++ b/packages/ui-vue/components/style-editor/index.ts @@ -0,0 +1,19 @@ + +import type { App, Plugin } from 'vue'; +import FStyle from './src/style-editor.component'; +import { stylePropsResolver } from './src/style-editor.props'; + +export * from './src/style-editor.props'; + +FStyle.install = (app: App) => { + app.component(FStyle.name as string, FStyle); + // app.component(FStylePane.name as string, FStylePane); +}; +FStyle.register = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record, resolverMap: Record) => { + componentMap['style-editor'] = FStyle; + propsResolverMap['style-editor'] = stylePropsResolver; + +}; + +export { FStyle }; +export default FStyle as typeof FStyle & Plugin; diff --git a/packages/ui-vue/components/style-editor/src/composition/types.ts b/packages/ui-vue/components/style-editor/src/composition/types.ts new file mode 100644 index 00000000000..3f69b08c741 --- /dev/null +++ b/packages/ui-vue/components/style-editor/src/composition/types.ts @@ -0,0 +1,40 @@ +import { Ref } from "vue"; + +export interface UseResizePane { + actualHeight: Ref; + + actualWidth: Ref; + + onClickStyleEditorHorizontalResizeBar: ($event: MouseEvent, position: string, element: HTMLElement) => any; + + onClickStyleEditorVerticalResizeBar: ($event: MouseEvent, position: string, element: HTMLElement) => any; +} + +export interface UseResizeHandle { + horizontalResizeBarPosition: Ref; + + horizontalResizeHandleOffset: Ref; + + showHorizontalResizeHandle: Ref; + + showVerticalResizeHandle: Ref; + + verticalResizeBarPosition: Ref; + + verticalResizeHandleOffset: Ref; + + horizontalResizeHandleStyleEditor: Ref>; + + verticalResizeHandleStyleEditor: Ref>; + + resizeOverlayStyleEditor: Ref>; + + draggingHorizontalResizeHandle: ($event: MouseEvent) => void; + + draggingVerticalResizeHandle: ($event: MouseEvent) => void; + +} + +export interface StyleEditorContext { + useResizeHandleComposition: UseResizeHandle; +} diff --git a/packages/ui-vue/components/style-editor/src/composition/use-resize-handle.ts b/packages/ui-vue/components/style-editor/src/composition/use-resize-handle.ts new file mode 100644 index 00000000000..23868cfac55 --- /dev/null +++ b/packages/ui-vue/components/style-editor/src/composition/use-resize-handle.ts @@ -0,0 +1,66 @@ +import { computed, Ref, ref } from 'vue'; +import { UseResizeHandle } from './types'; + +export function useResizeHandle( + styleEditorElementRef: Ref +): UseResizeHandle { + const horizontalResizeBarPosition = ref(-1); + const verticalResizeBarPosition = ref(-1); + const horizontalResizeHandleOffset = ref(0); + const verticalResizeHandleOffset = ref(0); + const showHorizontalResizeHandle = ref(false); + const showVerticalResizeHandle = ref(false); + + const horizontalResizeHandleStyleEditor = computed(() => { + const styleEditorObject = { + display: showHorizontalResizeHandle.value ? 'block' : 'none', + left: `${horizontalResizeHandleOffset.value}px` + } as Record; + return styleEditorObject; + }); + + const verticalResizeHandleStyleEditor = computed(() => { + const styleEditorObject = { + display: showVerticalResizeHandle.value ? 'block' : 'none', + top: `${verticalResizeHandleOffset.value}px` + } as Record; + return styleEditorObject; + }); + + const resizeOverlayStyleEditor = computed(() => { + const styleEditorObject = { + display: (showVerticalResizeHandle.value || showHorizontalResizeHandle.value) ? 'block' : 'none' + } as Record; + return styleEditorObject; + }); + + function draggingHorizontalResizeHandle($event: MouseEvent) { + const styleEditorElement = styleEditorElementRef.value; + if (styleEditorElement) { + const { left: styleEditorOffsetLeft } = (styleEditorElement.getBoundingClientRect() as DOMRect); + horizontalResizeHandleOffset.value = $event.clientX - styleEditorOffsetLeft; + } + } + + function draggingVerticalResizeHandle($event: MouseEvent) { + const styleEditorElement = styleEditorElementRef.value; + if (styleEditorElement) { + const { top: styleEditorOffsetTop } = (styleEditorElement.getBoundingClientRect() as DOMRect); + verticalResizeHandleOffset.value = $event.clientY - styleEditorOffsetTop; + } + } + + return { + horizontalResizeHandleStyleEditor, + verticalResizeHandleStyleEditor, + resizeOverlayStyleEditor, + showHorizontalResizeHandle, + showVerticalResizeHandle, + horizontalResizeBarPosition, + verticalResizeBarPosition, + verticalResizeHandleOffset, + horizontalResizeHandleOffset, + draggingHorizontalResizeHandle, + draggingVerticalResizeHandle + }; +} diff --git a/packages/ui-vue/components/style-editor/src/designer/style-editor-use-designer-rules.ts b/packages/ui-vue/components/style-editor/src/designer/style-editor-use-designer-rules.ts new file mode 100644 index 00000000000..74a589b97ad --- /dev/null +++ b/packages/ui-vue/components/style-editor/src/designer/style-editor-use-designer-rules.ts @@ -0,0 +1,32 @@ +import { DesignerHost, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; +import { ComponentSchema, DesignerItemContext } from "../../../designer-canvas/src/types"; +import { UseTemplateDragAndDropRules } from "../../../designer-canvas/src/composition/rule/use-template-rule"; +import { StyleProperty } from "../property-config/style-editor.property-config"; + +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHost): UseDesignerRules { + const dragAndDropRules = new UseTemplateDragAndDropRules(); + const { canMove, canDelete } = dragAndDropRules.getTemplateRule(designItemContext, designerHostService); + const schema = designItemContext.schema as ComponentSchema; + function canAccepts(): boolean { + return false; + } + function checkCanDeleteComponent() { + return canDelete; + } + + function checkCanMoveComponent() { + return canMove; + } + + function hideNestedPaddingInDesginerView() { + return true; + } + // 构造属性配置方法 + function getPropsConfig(componentId: string) { + const styleProp = new StyleProperty(componentId, designerHostService); + return styleProp.getPropertyConfig(schema); + } + + return { canAccepts, checkCanDeleteComponent, checkCanMoveComponent, hideNestedPaddingInDesginerView, getPropsConfig }; + +} diff --git a/packages/ui-vue/components/style-editor/src/property-config/style-editor.property-config.ts b/packages/ui-vue/components/style-editor/src/property-config/style-editor.property-config.ts new file mode 100644 index 00000000000..1284e28a47e --- /dev/null +++ b/packages/ui-vue/components/style-editor/src/property-config/style-editor.property-config.ts @@ -0,0 +1,73 @@ +import { BaseControlProperty } from "../../../property-panel/src/composition/entity/base-property"; + +export class StyleProperty extends BaseControlProperty { + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + public getPropertyConfig(propertyData: any) { + // 基本信息 + this.propertyConfig.categories['basic'] = this.getBasicPropConfig(propertyData); + // 外观 + this.propertyConfig.categories['appearance'] = this.getAppearanceConfig(propertyData); + // 行为 + this.propertyConfig.categories['behavior'] = this.getBehaviorProperties(propertyData); + return this.propertyConfig; + } + private getBehaviorProperties(propertyData: any) { + return { + description: "", + title: "行为", + properties: { + direction: { + title: "布局方向", + description: "指定内部分栏面板的布局方向", + type: "string", + editor: { + type: "combo-list", + data: [ + { + "id": "row", + "name": "横向排列" + }, + { + "id": "column", + "name": "上下排列" + } + ] + } + } + }, + setPropertyRelates(changeObject: any, data: any) { + if (!changeObject) { + return; + } + if (changeObject.propertyID === 'direction') { + const isRow = changeObject.propertyValue !== 'column'; + const originalClass = isRow ? 'f-col-h' : 'f-col-w'; + const replaceClass = isRow ? 'f-col-w' : 'f-col-h'; + const targetDirection = isRow ? ['s', 'n'] : ['e', 'w']; + // 替换样式 + propertyData?.contents.forEach((panel, inex) => { + if (panel.appearance?.class) { + panel.appearance.class = panel.appearance.class.replaceAll(originalClass, replaceClass); + } + if (panel.resizable === true && panel.resizeHandle) { + if (targetDirection.findIndex(direction => direction === panel.resizeHandle) > -1) { + // 需要更改schema + if (inex === 0) { + panel.resizeHandle = isRow ? 'e' : 's'; + } + } + } + if (isRow && panel.minHeight) { + panel.minHeight = null; + } + if (!isRow && panel.minWidth) { + panel.minWidth = null; + } + }); + } + } + }; + } +} diff --git a/packages/ui-vue/components/style-editor/src/schema/style-editor-schema-mapper.ts b/packages/ui-vue/components/style-editor/src/schema/style-editor-schema-mapper.ts new file mode 100644 index 00000000000..e6b8490a4c0 --- /dev/null +++ b/packages/ui-vue/components/style-editor/src/schema/style-editor-schema-mapper.ts @@ -0,0 +1,5 @@ +import { MapperFunction, resolveAppearance } from '../../../dynamic-resolver'; + +export const styleSchemaMapper = new Map([ + ['appearance', resolveAppearance] +]); diff --git a/packages/ui-vue/components/style-editor/src/schema/style-editor-schema-resolver.ts b/packages/ui-vue/components/style-editor/src/schema/style-editor-schema-resolver.ts new file mode 100644 index 00000000000..726c2bd0e74 --- /dev/null +++ b/packages/ui-vue/components/style-editor/src/schema/style-editor-schema-resolver.ts @@ -0,0 +1,47 @@ + +import { ComponentSchema, DesignerComponentInstance } from "../../../designer-canvas/src/types"; +import { DynamicResolver } from "../../../dynamic-resolver"; + +function wrapContentContainerForDataGrid(resolver: DynamicResolver, schema: ComponentSchema, context: Record): ComponentSchema { + const contentContainerSchema = resolver.getSchemaByType('content-container') as ComponentSchema; + contentContainerSchema.id = `${schema.id}-layout`; + contentContainerSchema.appearance = { class: 'f-grid-is-sub f-utils-flex-column' }; + contentContainerSchema.contents = [schema]; + return contentContainerSchema; +} + +function addLeftPane(resolver: DynamicResolver, schema: ComponentSchema, context: Record): ComponentSchema { + const leftPaneSchema = resolver.getSchemaByType('style-pane') as ComponentSchema; + leftPaneSchema.appearance = { + class: "f-col-w6 f-page-content-nav" + }; + leftPaneSchema.position = 'left'; + (schema.contents as ComponentSchema[]).unshift(leftPaneSchema); + return schema; + +} + +function addMainPane(resolver: DynamicResolver, schema: ComponentSchema, context: Record): ComponentSchema { + const mainPaneSchema = resolver.getSchemaByType('style-pane') as ComponentSchema; + mainPaneSchema.appearance = { + class: "f-page-content-main" + }; + mainPaneSchema.position = 'main'; + (schema.contents as ComponentSchema[]).push(mainPaneSchema); + return schema; +} + +export function schemaResolver(resolver: DynamicResolver, schema: Record, context: Record): Record { + const parentComponentInstance = context.parentComponentInstance as DesignerComponentInstance; + const parentClass = String(parentComponentInstance.schema.appearance.class || '').split(' '); + const droppedOnMainContainer = parentClass.includes('f-page-main'); + if (droppedOnMainContainer) { + schema.appearance = { class: 'f-page-content' }; + } + addLeftPane(resolver, schema as ComponentSchema, context); + addMainPane(resolver, schema as ComponentSchema, context); + return schema; +} +export function stylePaneSchemaResolver(resolver: DynamicResolver, schema: Record, context: Record): Record { + return schema; +} diff --git a/packages/ui-vue/components/style-editor/src/schema/style.schema.json b/packages/ui-vue/components/style-editor/src/schema/style.schema.json new file mode 100644 index 00000000000..d40127d40b9 --- /dev/null +++ b/packages/ui-vue/components/style-editor/src/schema/style.schema.json @@ -0,0 +1,50 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://farris-design.gitee.io/style.schema.json", + "title": "style", + "description": "A Farris Container Component", + "type": "object", + "properties": { + "id": { + "description": "The unique identifier for a style", + "type": "string" + }, + "type": { + "description": "The type string of style component", + "type": "string", + "default": "style" + }, + "appearance": { + "description": "", + "type": "object", + "properties": { + "class": { + "type": "string" + }, + "style": { + "type": "string" + } + }, + "default": {} + }, + "contents": { + "description": "", + "type": "array", + "default": [] + }, + "direction": { + "description": "", + "type": "string", + "default": "row", + "enum": [ + "column", + "row" + ] + } + }, + "required": [ + "id", + "type", + "contents" + ] +} \ No newline at end of file diff --git a/packages/ui-vue/components/style-editor/src/style-editor.component.tsx b/packages/ui-vue/components/style-editor/src/style-editor.component.tsx new file mode 100644 index 00000000000..218cbef2554 --- /dev/null +++ b/packages/ui-vue/components/style-editor/src/style-editor.component.tsx @@ -0,0 +1,672 @@ +import { SetupContext, computed, defineComponent, provide, ref, Ref, onMounted, reactive } from 'vue'; +import { StylePropsType, styleProps } from './style-editor.props'; +import { useResizeHandle } from './composition/use-resize-handle'; +import { StyleEditorContext } from './composition/types'; +import { getCustomClass, getCustomStyle } from '@farris/ui-vue/components/common'; +import { FNumberSpinner } from '@farris/ui-vue/components/number-spinner'; +import FComboList from '@farris/ui-vue/components/combo-list'; +import FSection from '@farris/ui-vue/components/section'; +import './style-editor.css'; + +// 定义边框模型类型 +interface BorderDirectionModel { + width: number; + color: string; + style: string; +} + +interface BorderModel { + top: BorderDirectionModel; + right: BorderDirectionModel; + bottom: BorderDirectionModel; + left: BorderDirectionModel; +} + +// 定义圆角模型类型 +interface BorderRadiusModel { + topLeft: number; + topRight: number; + bottomRight: number; + bottomLeft: number; +} + +export default defineComponent({ + name: 'FStyle', + props: styleProps, + emits: ['change'], + setup(props: StylePropsType, context: SetupContext) { + const styleElementRef = ref(); + const useResizeHandleComposition = useResizeHandle(styleElementRef); + const { horizontalResizeHandleStyleEditor, verticalResizeHandleStyleEditor, resizeOverlayStyleEditor } = useResizeHandleComposition; + provide('style', { useResizeHandleComposition }); + + // 折叠状态控制 + const marginExpanded = ref(true); + const paddingExpanded = ref(true); + const borderExpanded = ref(true); + const shadowExpanded = ref(true); + const backgroundExpanded = ref(true); + + // 样式计算 + const styleClass = computed(() => { + const classObject = { + 'f-style': true, + 'f-style-custom': true + } as Record; + return getCustomClass(classObject, props?.customClass); + }); + + const styleStyle = computed(() => { + const styleObject = { + 'flex-direction': props.direction === 'row' ? 'row' : 'column', + 'background-color': '#fff' // 白色背景 + } as Record; + return getCustomStyle(styleObject, props?.customStyle); + }); + + // 响应式样式模型 + const marginModel = reactive({ + marginTop: 0, + marginRight: 0, + marginBottom: 0, + marginLeft: 0 + }); + + const paddingModel = reactive({ + paddingTop: 0, + paddingRight: 0, + paddingBottom: 0, + paddingLeft: 0 + }); + + const shadowModel = reactive({ + shadowX: 0, + shadowY: 0, + shadowBlur: 0, + shadowSpread: 0, + shadowColor: '#000000', + shadowDirection: 'inside' // 默认阴影方向为内侧 + }); + + // 边框模型 - 重构为每个方向独立控制 + const borderModel = reactive({ + top: { width: 0, color: '#000000', style: 'solid' }, + right: { width: 0, color: '#000000', style: 'solid' }, + bottom: { width: 0, color: '#000000', style: 'solid' }, + left: { width: 0, color: '#000000', style: 'solid' } + }); + + // 当前选中的边框方向(单选) + const selectedBorderDirection = ref<'top' | 'right' | 'bottom' | 'left' | 'all' | null>(null); + + // 背景模型 + const backgroundModel = reactive({ + backgroundColor: 'transparent' + }); + + // 圆角模型 + const borderRadiusModel = reactive({ + topLeft: 0, + topRight: 0, + bottomRight: 0, + bottomLeft: 0 + }); + + // 当前选中的圆角方向(多选) + const selectedBorderRadiusDirections = reactive({ + topLeft: false, + topRight: false, + bottomRight: false, + bottomLeft: false + }); + + // 当前圆角半径值 + const currentBorderRadius = ref(0); + + // 阴影方向选项 + const shadowDirections = ref([ + { id: 'outside', name: '外侧' }, + { id: 'inside', name: '内侧' }, + ]); + + // 边框样式选项 + const borderStyles = ref([ + { id: 'solid', name: '实线' }, + { id: 'dashed', name: '虚线' }, + { id: 'dotted', name: '点线' }, + { id: 'double', name: '双线' }, + { id: 'none', name: '无' } + ]); + + // 生成CSS样式字符串 + const generateStyleString = () => { + const margin = `margin: ${marginModel.marginTop}px ${marginModel.marginRight}px ${marginModel.marginBottom}px ${marginModel.marginLeft}px;`; + const padding = `padding: ${paddingModel.paddingTop}px ${paddingModel.paddingRight}px ${paddingModel.paddingBottom}px ${paddingModel.paddingLeft}px;`; + + const shadowInset = shadowModel.shadowDirection === 'outside' ? '' : 'inset '; + const shadow = `box-shadow: ${shadowInset}${shadowModel.shadowX}px ${shadowModel.shadowY}px ${shadowModel.shadowBlur}px ${shadowModel.shadowSpread}px ${shadowModel.shadowColor};`; + + // 边框样式 - 每个方向独立 + const borderTop = borderModel.top.width > 0 + ? `border-top: ${borderModel.top.width}px ${borderModel.top.style} ${borderModel.top.color};` + : ''; + const borderRight = borderModel.right.width > 0 + ? `border-right: ${borderModel.right.width}px ${borderModel.right.style} ${borderModel.right.color};` + : ''; + const borderBottom = borderModel.bottom.width > 0 + ? `border-bottom: ${borderModel.bottom.width}px ${borderModel.bottom.style} ${borderModel.bottom.color};` + : ''; + const borderLeft = borderModel.left.width > 0 + ? `border-left: ${borderModel.left.width}px ${borderModel.left.style} ${borderModel.left.color};` + : ''; + + // 背景样式 + const background = `background-color: ${backgroundModel.backgroundColor};`; + + // 圆角样式 + const borderRadius = `border-radius: ${borderRadiusModel.topLeft}px ${borderRadiusModel.topRight}px ${borderRadiusModel.bottomRight}px ${borderRadiusModel.bottomLeft}px;`; + + return `${margin}${padding}${shadow}${borderTop}${borderRight}${borderBottom}${borderLeft}${background}${borderRadius}`; + }; + + // 处理变化事件 + const handleStyleChange = () => { + const styleString = generateStyleString(); + context.emit('change', styleString); + }; + + // 初始化时触发一次 + onMounted(handleStyleChange); + + // 更新阴影方向处理 + const updateShadowDirection = (value: string) => { + shadowModel.shadowDirection = value; + handleStyleChange(); + }; + + // 处理边框方向选择 + const handleBorderDirectionSelect = (direction: 'top' | 'right' | 'bottom' | 'left' | 'all') => { + selectedBorderDirection.value = direction; + }; + // 计算当前选中的边框样式 + const currentBorderStyle = computed(() => { + if (!selectedBorderDirection.value) {return '';} + + if (selectedBorderDirection.value === 'all') { + return borderModel.top.style; + } + + return borderModel[selectedBorderDirection.value].style; + }); + + // 计算当前选中的边框颜色 + const currentBorderColor = computed(() => { + if (!selectedBorderDirection.value) {return '#000000';} + + if (selectedBorderDirection.value === 'all') { + return borderModel.top.color; + } + + return borderModel[selectedBorderDirection.value].color; + }); + + // 处理边框宽度变化 + const handleBorderWidthChange = (value: number) => { + if (!selectedBorderDirection.value) {return;} + + if (selectedBorderDirection.value === 'all') { + // 更新所有方向 + borderModel.top.width = value; + borderModel.right.width = value; + borderModel.bottom.width = value; + borderModel.left.width = value; + } else { + // 更新单个方向 + borderModel[selectedBorderDirection.value].width = value; + } + + handleStyleChange(); + }; + + // 处理所有边框样式变化 + const handleBorderStyleChange = (value: string) => { + if (!selectedBorderDirection.value) {return;} + + if (selectedBorderDirection.value === 'all') { + // 更新所有方向 + borderModel.top.style = value; + borderModel.right.style = value; + borderModel.bottom.style = value; + borderModel.left.style = value; + } else { + // 更新单个方向 + borderModel[selectedBorderDirection.value].style = value; + } + + handleStyleChange(); + }; + + // 处理所有边框颜色变化 + const handleBorderColorChange = (color: string) => { + if (!selectedBorderDirection.value) {return;} + + if (selectedBorderDirection.value === 'all') { + // 更新所有方向 + borderModel.top.color = color; + borderModel.right.color = color; + borderModel.bottom.color = color; + borderModel.left.color = color; + } else { + // 更新单个方向 + borderModel[selectedBorderDirection.value].color = color; + } + + handleStyleChange(); + }; + + // 添加颜色选择处理函数 + const handleShadowColorChange = (color: string) => { + shadowModel.shadowColor = color; + handleStyleChange(); + }; + + // 处理圆角方向选择 + const handleBorderRadiusDirectionSelect = (direction: 'topLeft' | 'topRight' | 'bottomRight' | 'bottomLeft') => { + // 切换选中状态 + selectedBorderRadiusDirections[direction] = !selectedBorderRadiusDirections[direction]; + }; + + // 处理全部圆角方向选择 + const handleAllBorderRadiusDirectionSelect = () => { + const allSelected = Object.values(selectedBorderRadiusDirections).every(v => v); + const newValue = !allSelected; + + selectedBorderRadiusDirections.topLeft = newValue; + selectedBorderRadiusDirections.topRight = newValue; + selectedBorderRadiusDirections.bottomRight = newValue; + selectedBorderRadiusDirections.bottomLeft = newValue; + }; + + // 处理圆角半径变化 + const handleBorderRadiusChange = (value: number) => { + currentBorderRadius.value = value; + + // 只更新选中的方向 + if (selectedBorderRadiusDirections.topLeft) { + borderRadiusModel.topLeft = value; + } + if (selectedBorderRadiusDirections.topRight) { + borderRadiusModel.topRight = value; + } + if (selectedBorderRadiusDirections.bottomRight) { + borderRadiusModel.bottomRight = value; + } + if (selectedBorderRadiusDirections.bottomLeft) { + borderRadiusModel.bottomLeft = value; + } + + handleStyleChange(); + }; + + return () => { + // 检查边框方向是否选中 + const borderTopActive = selectedBorderDirection.value === 'top'; + const borderRightActive = selectedBorderDirection.value === 'right'; + const borderBottomActive = selectedBorderDirection.value === 'bottom'; + const borderLeftActive = selectedBorderDirection.value === 'left'; + const borderAllActive = selectedBorderDirection.value === 'all'; + + // 检查圆角方向是否选中 + const borderRadiusTopLeftActive = selectedBorderRadiusDirections.topLeft; + const borderRadiusTopRightActive = selectedBorderRadiusDirections.topRight; + const borderRadiusBottomRightActive = selectedBorderRadiusDirections.bottomRight; + const borderRadiusBottomLeftActive = selectedBorderRadiusDirections.bottomLeft; + const borderRadiusAllActive = borderRadiusTopLeftActive && borderRadiusTopRightActive && + borderRadiusBottomRightActive && borderRadiusBottomLeftActive; + + // 计算当前选中的边框宽度 + const currentBorderWidth = computed(() => { + if (!selectedBorderDirection.value) {return 0;} + + if (selectedBorderDirection.value === 'all') { + return borderModel.top.width; + } + + return borderModel[selectedBorderDirection.value].width; + }).value; + + return ( +
+ {/* 外间距控制区 */} + marginExpanded.value = val} + > +
+ {[ + { key: 'marginTop', label: '上间距(px)' }, + { key: 'marginRight', label: '右间距(px)' }, + { key: 'marginBottom', label: '下间距(px)' }, + { key: 'marginLeft', label: '左间距(px)' } + ].map(item => ( +
+
+ + +
+
+ ))} +
+
+ + {/* 内间距控制区 */} + paddingExpanded.value = val} + > +
+ {[ + { key: 'paddingTop', label: '上间距(px)' }, + { key: 'paddingRight', label: '右间距(px)' }, + { key: 'paddingBottom', label: '下间距(px)' }, + { key: 'paddingLeft', label: '左间距(px)' } + ].map(item => ( +
+
+ + +
+
+ ))} +
+
+ + {/* 边框控制区 - 重构 */} + borderExpanded.value = val} + > +
+ {/* 边框方向选择器 (图形化) */} +
+
+
边框方向
+
+
handleBorderDirectionSelect('top')} + style="top: 0; left: 50%; transform: translateX(-50%);" + > +
+
+
handleBorderDirectionSelect('right')} + style="top: 50%; right: 0; transform: translateY(-50%);" + > +
+
+
handleBorderDirectionSelect('bottom')} + style="bottom: 0; left: 50%; transform: translateX(-50%);" + > +
+
+
handleBorderDirectionSelect('left')} + style="top: 50%; left: 0; transform: translateY(-50%);" + > +
+
+
handleBorderDirectionSelect('all')} + style="top: 50%; left: 50%; transform: translate(-50%, -50%);" + > +
+
+
+
+
+
+ + {/* 边框控制 */} +
+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + handleBorderColorChange(e.target.value)} + style="flex: 1; height: 36px;" + disabled={!selectedBorderDirection.value} + /> +
+
+
+
+
+ + {/* 圆角控制区 - 重构 */} +
+
+
圆角方向
+
+
handleBorderRadiusDirectionSelect('topLeft')} + style="top: 0; left: 0;" + > +
+
+
handleBorderRadiusDirectionSelect('topRight')} + style="top: 0; right: 0;" + > +
+
+
handleBorderRadiusDirectionSelect('bottomRight')} + style="bottom: 0; right: 0;" + > +
+
+
handleBorderRadiusDirectionSelect('bottomLeft')} + style="bottom: 0; left: 0;" + > +
+
+
+
+
+
+
+
+
+ + {/* 圆角控制 */} +
+
+
+ + v)} + /> +
+
+
+
+
+
+ + {/* 阴影控制区 */} + shadowExpanded.value = val} + > +
+ {/* 阴影参数 */} + {[ + { key: 'shadowX', label: 'X(px)' }, + { key: 'shadowY', label: 'Y(px)' }, + { key: 'shadowBlur', label: '模糊(px)' }, + { key: 'shadowSpread', label: '扩张(px)' } + ].map(item => ( +
+
+ + +
+
+ ))} + + {/* 颜色选择器 */} +
+
+ + handleShadowColorChange(e.target.value)} + style="flex: 1; height: 36px;" + /> +
+
+ + {/* 阴影方向 */} +
+
+ + +
+
+
+
+ + {/* 背景控制区 */} + backgroundExpanded.value = val} + > +
+
+
+ + { + backgroundModel.backgroundColor = e.target.value; + handleStyleChange(); + }} + style="flex: 1; height: 36px;" + /> +
+
+
+
+
+ ); + }; + } +}); \ No newline at end of file diff --git a/packages/ui-vue/components/style-editor/src/style-editor.css b/packages/ui-vue/components/style-editor/src/style-editor.css new file mode 100644 index 00000000000..58840b99186 --- /dev/null +++ b/packages/ui-vue/components/style-editor/src/style-editor.css @@ -0,0 +1,146 @@ +/* style-editor.css */ +/* 边框方向选择器样式 */ +.border-direction-selector { + position: relative; + width: 60px; + height: 60px; + border: 1px solid #ddd; + border-radius: 4px; + background-color: #f9f9f9; +} + +.border-direction-btn { + position: absolute; + width: 18px; + height: 18px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + border-radius: 4px; + background-color: #fff; + border: 1px solid #ddd; + transition: all 0.2s; + z-index: 2; +} + +.border-direction-btn:hover { + background-color: #f0f0f0; +} + +.border-direction-btn.active { + background-color: #e6f7ff; + border-color: #1890ff; +} + +.border-line { + background-color: #666; +} + +.border-line.horizontal { + width: 8px; + height: 2px; +} + +.border-line.vertical { + width: 2px; + height: 8px; +} + +.border-all-icon { + font-size: 12px; + font-weight: bold; + color: #666; +} + +.border-preview-box { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 40px; + height: 40px; + border: 1px solid #ddd; + background-color: #fff; +} + +/* 圆角方向选择器样式 */ +.border-radius-direction-selector { + position: relative; + width: 60px; + height: 60px; + border: 1px solid #ddd; + border-radius: 4px; + background-color: #f9f9f9; +} + +.border-radius-direction-btn { + position: absolute; + width: 18px; + height: 18px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + border-radius: 4px; + background-color: #fff; + border: 1px solid #ddd; + transition: all 0.2s; + z-index: 2; +} + +.border-radius-direction-btn:hover { + background-color: #f0f0f0; +} + +.border-radius-direction-btn.active { + background-color: #e6f7ff; + border-color: #1890ff; +} + +.border-radius-corner { + width: 8px; + height: 8px; + border: 1px solid #666; +} + +.border-radius-corner.top-left { + border-right: none; + border-bottom: none; + border-top-left-radius: 4px; +} + +.border-radius-corner.top-right { + border-left: none; + border-bottom: none; + border-top-right-radius: 4px; +} + +.border-radius-corner.bottom-right { + border-left: none; + border-top: none; + border-bottom-right-radius: 4px; +} + +.border-radius-corner.bottom-left { + border-right: none; + border-top: none; + border-bottom-left-radius: 4px; +} + +.border-radius-all-icon { + font-size: 12px; + font-weight: bold; + color: #666; +} + +.border-radius-preview-box { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 40px; + height: 40px; + border: 1px solid #ddd; + background-color: #fff; +} \ No newline at end of file diff --git a/packages/ui-vue/components/style-editor/src/style-editor.props.ts b/packages/ui-vue/components/style-editor/src/style-editor.props.ts new file mode 100644 index 00000000000..181f5896d01 --- /dev/null +++ b/packages/ui-vue/components/style-editor/src/style-editor.props.ts @@ -0,0 +1,18 @@ + +import { ExtractPropTypes, PropType } from "vue"; +import { createPropsResolver } from "../../dynamic-resolver"; +import { styleSchemaMapper } from "./schema/style-editor-schema-mapper"; +import { schemaResolver } from './schema/style-editor-schema-resolver'; +import styleSchema from './schema/style.schema.json'; + +export type SpliteDirection = 'column' | 'row'; + +export const styleProps = { + customStyle: { type: String, default: '' }, + customClass: { type: String, default: '' }, + direction: { Type: String as PropType, default: 'row' } +} as Record; + +export type StylePropsType = ExtractPropTypes; + +export const stylePropsResolver = createPropsResolver(styleProps, styleSchema, styleSchemaMapper, schemaResolver); diff --git a/packages/ui-vue/components/style-editor/style.ts b/packages/ui-vue/components/style-editor/style.ts new file mode 100644 index 00000000000..024f3474093 --- /dev/null +++ b/packages/ui-vue/components/style-editor/style.ts @@ -0,0 +1,2 @@ +import "@farris/ui-vue/components/dependent-base/style"; +import "@farris/ui-vue/theme-default/components/style.css"; \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f5f3dfe6137..aae8e2e6722 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,18 +11,9 @@ importers: '@eslint/js': specifier: ^9.19.0 version: 9.19.0 - '@types/stats.js': - specifier: ^0.17.4 - version: 0.17.4 - '@types/three': - specifier: ^0.152.1 - version: 0.152.1 axios: specifier: ^1.7.2 version: 1.7.7 - draco3dgltf: - specifier: ^1.5.7 - version: 1.5.7 echarts: specifier: ^5.5.0 version: 5.5.1 @@ -38,9 +29,6 @@ importers: markdown-it-container: specifier: ^4.0.0 version: 4.0.0 - three: - specifier: ^0.152.2 - version: 0.152.2 ts-jest: specifier: ^29.1.2 version: 29.2.5(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(esbuild@0.23.1)(jest@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)))(typescript@5.6.3) @@ -378,10 +366,10 @@ importers: version: 7.18.0(eslint@9.19.0(jiti@1.21.6))(typescript@4.9.5) '@vitejs/plugin-vue': specifier: ^4.0.0 - version: 4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + version: 4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vitejs/plugin-vue-jsx': specifier: ^3.0.0 - version: 3.1.0(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + version: 3.1.0(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vue/babel-plugin-jsx': specifier: ^1.1.1 version: 1.2.5(@babel/core@7.25.8) @@ -456,19 +444,19 @@ importers: version: 4.9.5 vite: specifier: ^4.1.4 - version: 4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) + version: 4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) vite-plugin-dts: specifier: ^2.1.0 - version: 2.3.0(@types/node@20.5.1)(rollup@4.24.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) + version: 2.3.0(@types/node@18.19.57)(rollup@4.24.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) vite-plugin-md: specifier: ^0.20.0 - version: 0.20.6(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) + version: 0.20.6(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) vite-svg-loader: specifier: ^4.0.0 version: 4.0.0 vitepress: specifier: 1.0.0-alpha.8 - version: 1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + version: 1.0.0-alpha.8(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(terser@5.36.0)(typescript@4.9.5) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) @@ -1094,7 +1082,7 @@ importers: version: 4.0.0 vitepress: specifier: 1.0.0-alpha.8 - version: 1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + version: 1.0.0-alpha.8(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(terser@5.36.0)(typescript@4.9.5) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) @@ -1272,7 +1260,7 @@ importers: version: 4.0.0 vitepress: specifier: 1.0.0-alpha.8 - version: 1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + version: 1.0.0-alpha.8(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(terser@5.36.0)(typescript@4.9.5) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) @@ -1502,7 +1490,7 @@ importers: version: 4.0.0 vitepress: specifier: 1.0.0-alpha.8 - version: 1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + version: 1.0.0-alpha.8(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(terser@5.36.0)(typescript@4.9.5) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) @@ -1723,7 +1711,7 @@ importers: version: 4.0.0 vitepress: specifier: 1.0.0-alpha.8 - version: 1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + version: 1.0.0-alpha.8(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(terser@5.36.0)(typescript@4.9.5) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) @@ -1911,7 +1899,7 @@ importers: dependencies: '@edp-bif/runtime-api-vue': specifier: 0.0.1 - version: 0.0.1(@algolia/client-search@4.24.0)(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.24.0)(search-insights@2.17.2)(typescript@4.9.5)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) + version: 0.0.1(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.24.0)(typescript@4.9.5)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) '@farris/bef-vue': specifier: workspace:^ version: link:../bef @@ -1932,7 +1920,7 @@ importers: version: link:../ui-vue '@gsp-wf/wf-task-handler-vue': specifier: 0.0.1 - version: 0.0.1(@algolia/client-search@4.24.0)(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.24.0)(search-insights@2.17.2)(typescript@4.9.5)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) + version: 0.0.1(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.24.0)(typescript@4.9.5)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) '@types/lodash-es': specifier: ^4.17.4 version: 4.17.12 @@ -2077,7 +2065,7 @@ importers: version: 4.0.0 vitepress: specifier: 1.0.0-alpha.8 - version: 1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + version: 1.0.0-alpha.8(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(terser@5.36.0)(typescript@4.9.5) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) @@ -3288,9 +3276,6 @@ packages: '@docsearch/js@3.6.0': resolution: {integrity: sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==} - '@docsearch/js@3.6.2': - resolution: {integrity: sha512-pS4YZF+VzUogYrkblCucQ0Oy2m8Wggk8Kk7lECmZM60hTbaydSIhJTTiCrmoxtBqV8wxORnOqcqqOfbmkkQEcA==} - '@docsearch/react@1.0.0-alpha.28': resolution: {integrity: sha512-XjJOnCBXn+UZmtuDmgzlVIHnnvh6yHVwG4aFq8AXN6xJEIX3f180FvGaowFWAxgdtHplJxFGux0Xx4piHqBzIw==} peerDependencies: @@ -3314,23 +3299,6 @@ packages: search-insights: optional: true - '@docsearch/react@3.6.2': - resolution: {integrity: sha512-rtZce46OOkVflCQH71IdbXSFK+S8iJZlUF56XBW5rIgx/eG5qoomC7Ag3anZson1bBac/JFQn7XOBfved/IMRA==} - peerDependencies: - '@types/react': '>= 16.8.0 < 19.0.0' - react: '>= 16.8.0 < 19.0.0' - react-dom: '>= 16.8.0 < 19.0.0' - search-insights: '>= 1 < 3' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true - '@dual-bundle/import-meta-resolve@4.1.0': resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} @@ -4528,9 +4496,6 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@tweenjs/tween.js@18.6.4': - resolution: {integrity: sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ==} - '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} @@ -4663,12 +4628,6 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/stats.js@0.17.4': - resolution: {integrity: sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==} - - '@types/three@0.152.1': - resolution: {integrity: sha512-PMOCQnx9JRmq+2OUGTPoY9h1hTWD2L7/nmuW/SyNq1Vbq3Lwt3MNdl3wYSa4DvLTGv62NmIXD9jYdAOwohwJyw==} - '@types/through@0.0.33': resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} @@ -4684,9 +4643,6 @@ packages: '@types/web-bluetooth@0.0.15': resolution: {integrity: sha512-w7hEHXnPMEZ+4nGKl/KDRVpxkwYxYExuHOYXyzIzCDzEZ9ZCGMAewulr9IqJu2LR4N37fcnb1XVeuZ09qgOxhA==} - '@types/webxr@0.5.22': - resolution: {integrity: sha512-Vr6Stjv5jPRqH690f5I5GLjVk8GSsoQSYJ2FVd/3jJF7KaqfwPi3ehfBS96mlQ2kPCwZaX6U0rG2+NGHBKkA/A==} - '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -6524,9 +6480,6 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} - draco3dgltf@1.5.7: - resolution: {integrity: sha512-LeqcpmoHIyYUi0z70/H3tMkGj8QhqVxq6FJGPjlzR24BNkQ6jyMheMvFKJBI0dzGZrEOUyQEmZ8axM1xRrbRiw==} - duplexer2@0.0.2: resolution: {integrity: sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==} @@ -7244,9 +7197,6 @@ packages: picomatch: optional: true - fflate@0.6.10: - resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -8631,9 +8581,6 @@ packages: resolution: {integrity: sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==} engines: {node: '>= 0.8'} - lil-gui@0.17.0: - resolution: {integrity: sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ==} - lilconfig@3.1.2: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} @@ -9847,7 +9794,6 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} deprecated: |- You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. - (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qs@6.13.0: @@ -13251,17 +13197,6 @@ snapshots: - react-dom - search-insights - '@docsearch/js@3.6.2(@algolia/client-search@4.24.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2)': - dependencies: - '@docsearch/react': 3.6.2(@algolia/client-search@4.24.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) - preact: 10.24.3 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/react' - - react - - react-dom - - search-insights - '@docsearch/react@1.0.0-alpha.28(react-dom@16.14.0(react@16.14.0))(react@16.14.0)': dependencies: '@docsearch/css': 1.0.0-alpha.28 @@ -13284,19 +13219,6 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@docsearch/react@3.6.2(@algolia/client-search@4.24.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2)': - dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.17.2) - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0) - '@docsearch/css': 3.6.2 - algoliasearch: 4.24.0 - optionalDependencies: - react: 16.14.0 - react-dom: 16.14.0(react@16.14.0) - search-insights: 2.17.2 - transitivePeerDependencies: - - '@algolia/client-search' - '@dual-bundle/import-meta-resolve@4.1.0': {} '@edp-aif/common-api@1.1.0': @@ -13308,7 +13230,7 @@ snapshots: '@edp-aif/common-api': 1.1.0 tslib: 1.14.1 - '@edp-bif/runtime-api-vue@0.0.1(@algolia/client-search@4.24.0)(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.24.0)(search-insights@2.17.2)(typescript@4.9.5)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))': + '@edp-bif/runtime-api-vue@0.0.1(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.24.0)(typescript@4.9.5)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))': dependencies: '@edp-aif/common-api': 1.1.0 '@edp-bif/common-api': 1.2.2(@edp-aif/common-api@1.1.0) @@ -13316,7 +13238,7 @@ snapshots: '@farris/bef-vue': 0.0.3 '@farris/command-services-vue': 0.0.3(typescript@4.9.5) '@farris/devkit-vue': 0.0.5(typescript@4.9.5) - '@farris/ui-vue': 1.5.3(@algolia/client-search@4.24.0)(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.24.0)(search-insights@2.17.2)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + '@farris/ui-vue': 1.5.3(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.24.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vue/shared': 3.5.12 '@vueuse/core': 9.2.0(vue@3.5.12(typescript@4.9.5)) async-validator: 4.2.5 @@ -13649,7 +13571,7 @@ snapshots: - debug - typescript - '@farris/ui-vue@1.5.3(@algolia/client-search@4.24.0)(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.24.0)(search-insights@2.17.2)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5))': + '@farris/ui-vue@1.5.3(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.24.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5))': dependencies: '@docsearch/js': 3.6.0(@algolia/client-search@4.24.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.2) @@ -13694,11 +13616,11 @@ snapshots: '@francoischalifour/autocomplete-preset-algolia@1.0.0-alpha.28': {} - '@gsp-wf/wf-task-handler-vue@0.0.1(@algolia/client-search@4.24.0)(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.24.0)(search-insights@2.17.2)(typescript@4.9.5)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))': + '@gsp-wf/wf-task-handler-vue@0.0.1(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.24.0)(typescript@4.9.5)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))': dependencies: '@farris/bef-vue': 0.0.3 '@farris/devkit-vue': 0.0.5(typescript@4.9.5) - '@farris/ui-vue': 1.5.3(@algolia/client-search@4.24.0)(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.24.0)(search-insights@2.17.2)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + '@farris/ui-vue': 1.5.3(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.24.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vue/shared': 3.5.12 '@vueuse/core': 9.2.0(vue@3.5.12(typescript@4.9.5)) async-validator: 4.2.5 @@ -13874,6 +13796,41 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.57 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3))': dependencies: '@jest/console': 29.7.0 @@ -14707,8 +14664,6 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@tweenjs/tween.js@18.6.4': {} - '@types/argparse@1.0.38': {} '@types/aria-query@5.0.4': {} @@ -14856,16 +14811,6 @@ snapshots: '@types/stack-utils@2.0.3': {} - '@types/stats.js@0.17.4': {} - - '@types/three@0.152.1': - dependencies: - '@tweenjs/tween.js': 18.6.4 - '@types/stats.js': 0.17.4 - '@types/webxr': 0.5.22 - fflate: 0.6.10 - lil-gui: 0.17.0 - '@types/through@0.0.33': dependencies: '@types/node': 18.19.57 @@ -14881,8 +14826,6 @@ snapshots: '@types/web-bluetooth@0.0.15': {} - '@types/webxr@0.5.22': {} - '@types/yargs-parser@21.0.3': {} '@types/yargs@15.0.19': @@ -17237,6 +17180,21 @@ snapshots: p-filter: 3.0.0 p-map: 6.0.0 + create-jest@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + create-jest@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)): dependencies: '@jest/types': 29.6.3 @@ -17588,8 +17546,6 @@ snapshots: dependencies: is-obj: 2.0.0 - draco3dgltf@1.5.7: {} - duplexer2@0.0.2: dependencies: readable-stream: 1.1.14 @@ -18502,8 +18458,6 @@ snapshots: optionalDependencies: picomatch: 4.0.2 - fflate@0.6.10: {} - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -19724,6 +19678,25 @@ snapshots: - babel-plugin-macros - supports-color + jest-cli@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + jest-cli@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)) @@ -19781,16 +19754,23 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)): + jest-config@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) - '@jest/test-result': 29.7.0 + '@babel/core': 7.25.8 + '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.8) chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) - exit: 0.1.2 - import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 jest-util: 29.7.0 jest-validate: 29.7.0 micromatch: 4.0.8 @@ -19802,10 +19782,8 @@ snapshots: '@types/node': 18.19.57 ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.6.3) transitivePeerDependencies: - - '@types/node' - babel-plugin-macros - supports-color - - ts-node jest-config@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)): dependencies: @@ -20170,6 +20148,18 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 + jest@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + jest@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)) @@ -20387,8 +20377,6 @@ snapshots: transitivePeerDependencies: - supports-color - lil-gui@0.17.0: {} - lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} @@ -20947,7 +20935,7 @@ snapshots: native-dash@1.25.0(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0): dependencies: brilliant-errors: 0.7.3(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) - inferred-types: 0.37.6(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) + inferred-types: 0.37.6(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) transitivePeerDependencies: - '@edge-runtime/vm' - '@vitest/browser' @@ -23472,47 +23460,14 @@ snapshots: vite-plugin-md@0.20.6(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)): dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@20.5.1) - '@rollup/pluginutils': 5.1.2(rollup@4.24.0) - '@vue/language-core': 1.8.27(typescript@4.9.5) - debug: 4.3.7 - kolorist: 1.8.0 - magic-string: 0.30.12 - typescript: 4.9.5 - vue-tsc: 1.8.27(typescript@4.9.5) - optionalDependencies: - vite: 4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color - - vite-plugin-dts@3.9.1(@types/node@20.5.1)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)): - dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@20.5.1) - '@rollup/pluginutils': 5.1.2(rollup@4.24.0) - '@vue/language-core': 1.8.27(typescript@5.6.3) - debug: 4.3.7 - kolorist: 1.8.0 - magic-string: 0.30.12 - typescript: 5.6.3 - vue-tsc: 1.8.27(typescript@5.6.3) - optionalDependencies: - vite: 5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color - - vite-plugin-md@0.20.6(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0): - dependencies: - '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@5.1.4(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) + '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) '@yankeeinlondon/happy-wrapper': 2.10.1(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) gray-matter: 4.0.3 markdown-it: 13.0.2 source-map-js: 1.2.1 transitivePeerDependencies: - '@edge-runtime/vm' + - '@vitejs/plugin-vue' - '@vitest/browser' - '@vitest/ui' - encoding @@ -23594,7 +23549,7 @@ snapshots: - supports-color - terser - vite-plugin-md@0.21.5(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)): + vite-plugin-md@0.22.5(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)): dependencies: '@vitejs/plugin-vue': 4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) @@ -23602,7 +23557,7 @@ snapshots: '@yankeeinlondon/happy-wrapper': 2.10.1(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) markdown-it: 13.0.2 source-map-js: 1.2.1 - vite: 5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) + vite: 4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) transitivePeerDependencies: - '@edge-runtime/vm' - '@vitest/browser' @@ -23900,10 +23855,10 @@ snapshots: - terser - typescript - vitepress@1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5): + vitepress@1.0.0-alpha.8(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(terser@5.36.0)(typescript@4.9.5): dependencies: '@docsearch/css': 3.6.2 - '@docsearch/js': 3.6.2(@algolia/client-search@4.24.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) + '@docsearch/js': 3.6.0(@algolia/client-search@4.24.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) '@vitejs/plugin-vue': 3.2.0(vite@3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vue/devtools-api': 6.6.4 '@vueuse/core': 9.2.0(vue@3.5.12(typescript@4.9.5)) @@ -23926,10 +23881,10 @@ snapshots: - terser - typescript - vitepress@1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5): + vitepress@1.0.0-alpha.8(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(terser@5.36.0)(typescript@4.9.5): dependencies: '@docsearch/css': 3.6.2 - '@docsearch/js': 3.6.2(@algolia/client-search@4.24.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) + '@docsearch/js': 3.6.0(@algolia/client-search@4.24.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) '@vitejs/plugin-vue': 3.2.0(vite@3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vue/devtools-api': 6.6.4 '@vueuse/core': 9.2.0(vue@3.5.12(typescript@4.9.5)) -- Gitee From a7a7b6910a1c4a1478df134177580b59a841d164 Mon Sep 17 00:00:00 2001 From: chen <14088532+chen2228419604@user.noreply.gitee.com> Date: Thu, 10 Jul 2025 04:26:54 +0000 Subject: [PATCH 2/3] =?UTF-8?q?update=20packages/designer/src/components/c?= =?UTF-8?q?omponents/form-designer/form-designer.component.tsx.=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E5=B7=A5=E5=85=B7=E7=AE=B1=E7=A9=BA?= =?UTF-8?q?=E7=99=BD=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chen <14088532+chen2228419604@user.noreply.gitee.com> --- .../components/form-designer/form-designer.component.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/designer/src/components/components/form-designer/form-designer.component.tsx b/packages/designer/src/components/components/form-designer/form-designer.component.tsx index 35d85e92b8c..9ff9c2d54c4 100644 --- a/packages/designer/src/components/components/form-designer/form-designer.component.tsx +++ b/packages/designer/src/components/components/form-designer/form-designer.component.tsx @@ -25,7 +25,11 @@ export default defineComponent({ const monacoEditorRef = ref(); const customClassEditorRef = ref(); const designerHostService = inject('designer-host-service') as DesignerHost; - const designerContext = inject('designerContext') as UseDesignerContext; + // const designerContext = inject('designerContext') as UseDesignerContext; + // const { toolboxItems, componentsToRegister, designerMode } = designerContext; + + const designerContextRef = inject("designerContext") as Ref; + const designerContext = designerContextRef.value as UseDesignerContext; const { toolboxItems, componentsToRegister, designerMode } = designerContext; -- Gitee From d4f40bb0a0b189b937e9bb1505f9a47b97145c94 Mon Sep 17 00:00:00 2001 From: chen <14088532+chen2228419604@user.noreply.gitee.com> Date: Thu, 10 Jul 2025 04:34:19 +0000 Subject: [PATCH 3/3] =?UTF-8?q?update=20packages/designer/src/components/t?= =?UTF-8?q?ypes/toolbox/pc-toolbox.json.=20=E5=88=A0=E9=99=A4=E5=A4=9A?= =?UTF-8?q?=E4=BD=99=E7=9A=84step=E6=8E=A7=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chen <14088532+chen2228419604@user.noreply.gitee.com> --- .../components/types/toolbox/pc-toolbox.json | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/packages/designer/src/components/types/toolbox/pc-toolbox.json b/packages/designer/src/components/types/toolbox/pc-toolbox.json index 18675fd3347..4988ca94a88 100644 --- a/packages/designer/src/components/types/toolbox/pc-toolbox.json +++ b/packages/designer/src/components/types/toolbox/pc-toolbox.json @@ -162,6 +162,13 @@ "type": "business", "name": "业务类控件", "items": [ + { + "id": "Step", + "type": "step", + "name": "步骤条", + "category": "container", + "icon": "steps" + }, { "id": "QuerySolution", "type": "query-solution", @@ -173,19 +180,6 @@ "type": "page-header", "name": "页头", "category": "container" - },{ - "id": "Step", - "type": "step", - "name": "步骤条", - "category": "container", - "icon": "steps" - }, - { - "id": "Step", - "type": "step", - "name": "步骤条", - "category": "container", - "icon": "steps" } ] }, -- Gitee