Browse Source

Merge branch 'dev' of http://124.70.149.18:10880/lianghj/queenshow into dev

lianghongjie 1 year ago
parent
commit
222768bf32

+ 1 - 1
package.json

@@ -31,7 +31,7 @@
     "@queenjs-modules/queentree": "^0.0.10",
     "@queenjs-modules/queentree-explorer": "^0.0.6",
     "@queenjs-modules/queentree-explorer-viewer": "^0.0.3",
-    "@queenjs/components": "^0.0.15",
+    "@queenjs/components": "^0.0.19",
     "@queenjs/controllers": "^0.0.6",
     "@queenjs/icons": "^0.0.20",
     "@queenjs/theme": "^0.0.8",

+ 27 - 26
public/index.html

@@ -1,29 +1,30 @@
 <!DOCTYPE html>
 <html lang="">
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <meta name="viewport" content="width=device-width,initial-scale=1.0" />
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
+    <title><%= htmlWebpackPlugin.options.title %></title>
+    <script type="text/javascript">
+      var userAgent = navigator.userAgent;
+      if (/micromessenger/i.test(userAgent)) {
+        document.write(
+          '<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"><\/script>'
+        );
+      }
+    </script>
+  </head>
 
-<head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width,initial-scale=1.0">
-  <link rel="icon" href="<%= BASE_URL %>favicon.ico">
-  <title>
-    <%= htmlWebpackPlugin.options.title %>
-  </title>
-  <script type="text/javascript">
-    var userAgent = navigator.userAgent;
-    if (/micromessenger/i.test(userAgent)) {
-      document.write('<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"><\/script>');
-    }
-  </script>
-</head>
-
-<body>
-  <noscript>
-    <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
-        Please enable it to continue.</strong>
-  </noscript>
-  <div id="app"></div>
-  <!-- built files will be auto injected -->
-</body>
-
-</html>
+  <body>
+    <noscript>
+      <strong
+        >We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work
+        properly without JavaScript enabled. Please enable it to
+        continue.</strong
+      >
+    </noscript>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

+ 3 - 0
src/modules/editor/components/CompUI/basicUI/Image2/component.tsx

@@ -34,6 +34,7 @@ export const Component = defineComponent({
         comp.value.x = 0;
         comp.value.y = 0;
         comp.value.s = 1;
+        comp.value.opacity = 1;
         setImageSize(url);
       } catch (error) {
         console.log(error);
@@ -49,6 +50,7 @@ export const Component = defineComponent({
         scale + "" == "1" && ox + "" == "0" && oy + "" == "0"
           ? "cover"
           : "contain";
+      const op = value?.opacity;
 
       return (
         <View
@@ -62,6 +64,7 @@ export const Component = defineComponent({
             style={{
               transform: `scale(${scale}) translate(${ox}%,${oy}%)`,
               objectFit,
+              opacity: op,
             }}
             src={
               value.url.startsWith("data:image/png")

+ 12 - 1
src/modules/editor/components/CompUI/basicUI/Image2/index.ts

@@ -1,6 +1,7 @@
 import { Dict_Imgs } from "@/dict";
 import { createAttrsForm } from "../../defines/createAttrsForm";
 import { createCompHooks } from "../../defines/createCompHooks";
+import Slider from "../../formItems/Slider";
 
 export { Component } from "./component";
 
@@ -10,7 +11,7 @@ export const options = {
 };
 
 export const { createComp, useCompData } = createCompHooks({
-  value: { url: Dict_Imgs.Default, x: 0, y: 0, s: 1 },
+  value: { url: Dict_Imgs.Default, x: 0, y: 0, s: 1, opacity: 1 },
   layout: {
     size: [750, 400],
   },
@@ -37,4 +38,14 @@ export const Form = createAttrsForm([
     dataIndex: "value.s",
     component: "Input",
   },
+  {
+    label: "透明度",
+    dataIndex: "value.opacity",
+    component: Slider,
+    props: {
+      min: 0,
+      max: 1,
+      step: 0.01,
+    },
+  },
 ]);

+ 155 - 0
src/modules/editor/components/CompUI/basicUI/Text/TextForm.tsx

@@ -0,0 +1,155 @@
+import { useEditor } from "@/modules/editor";
+import { DesignComp } from "@/modules/editor/objects/DesignTemp/DesignComp";
+import FormUI, { ColumnItem } from "@queenjs/components/FormUI";
+import { defineComponent } from "vue";
+import { any } from "vue-types";
+import { isEmpty } from "lodash";
+import { css } from "@linaria/core";
+import { bgColumns, layoutColumns } from "../../defines/createAttrsForm";
+import {
+  InputNumber,
+  Button,
+  Space,
+  Tooltip,
+  Select,
+  Input,
+} from "ant-design-vue";
+import {
+  BoldOutlined,
+  ItalicOutlined,
+  UnderlineOutlined,
+  StrikethroughOutlined,
+  AlignLeftOutlined,
+  AlignCenterOutlined,
+  AlignRightOutlined,
+} from "@ant-design/icons-vue";
+import { createColorOpts } from "../../defines/formOpts/createColorOpts";
+
+const StyleButtons = defineComponent({
+  setup() {
+    return () => (
+      <div class={ButtonsStyle}>
+        <Tooltip title={"加粗"}>
+          <Button icon={<BoldOutlined />} class={"active"} type="text"></Button>
+        </Tooltip>
+        <Tooltip title={"斜体"}>
+          <Button icon={<ItalicOutlined />} type="text"></Button>
+        </Tooltip>
+        <Tooltip title={"下划线"}>
+          <Button icon={<UnderlineOutlined />} type="text"></Button>
+        </Tooltip>
+        <Tooltip title={"删除线"}>
+          <Button icon={<StrikethroughOutlined />} type="text"></Button>
+        </Tooltip>
+        <Tooltip title={"左对齐"}>
+          <Button icon={<AlignLeftOutlined />} type="text"></Button>
+        </Tooltip>
+        <Tooltip title={"居中对齐"}>
+          <Button icon={<AlignCenterOutlined />} type="text"></Button>
+        </Tooltip>
+        <Tooltip title={"右对齐"}>
+          <Button icon={<AlignRightOutlined />} type="text"></Button>
+        </Tooltip>
+      </div>
+    );
+  },
+});
+
+const TextColumns: ColumnItem[] = [
+  {
+    label: "字体",
+    dataIndex: "fontFamily",
+    component: Select,
+    props: {
+      class: "w-full",
+      options: [{ label: "默认字体", value: "" }]
+        .concat
+        // Object.entries(compMasks).map(([key, value]) => {
+        //   return {
+        //     label: value.name,
+        //     value: key,
+        //   };
+        // })
+        (),
+    },
+  },
+  {
+    label: "字号",
+    dataIndex: "fontSize",
+    component: InputNumber,
+    props: {
+      class: "w-full",
+      min: 12,
+      max: 99,
+    },
+  },
+  {
+    label: "颜色",
+    dataIndex: "color",
+    ...createColorOpts(),
+  },
+  {
+    label: "",
+    dataIndex: "style",
+    component: StyleButtons,
+  },
+];
+
+export const TextForm = defineComponent({
+  props: {
+    component: any<DesignComp>().isRequired,
+  },
+  setup(props) {
+    const { actions } = useEditor();
+    function changeVal(e: { dataIndex: string; value: any }) {
+      actions.updateCompData(props.component, e.dataIndex, e.value);
+    }
+    return () => {
+      const { component } = props;
+      return (
+        <div>
+          <FormUI
+            columns={TextColumns}
+            data={{}}
+            onChange={(v) => {
+              console.log(v);
+            }}
+          />
+          <div>布局</div>
+          <div>
+            <FormUI
+              data={component}
+              columns={layoutColumns}
+              onChange={changeVal}
+            />
+            {!isEmpty(component?.layout?.background) ? (
+              <>
+                <div>背景</div>
+                <FormUI
+                  data={component}
+                  columns={bgColumns}
+                  onChange={changeVal}
+                />
+              </>
+            ) : null}
+          </div>
+        </div>
+      );
+    };
+  },
+});
+const ButtonsStyle = css`
+  width: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  background-color: @inf-form-bg;
+  border-radius: 2px;
+  .ant-btn {
+    flex: 1;
+    &.active {
+      color: @inf-primary-color;
+    }
+  }
+`;
+const FormStyle = css``;

+ 1 - 1
src/modules/editor/components/CompUI/basicUI/Text/component.tsx

@@ -33,7 +33,7 @@ export const Component = defineComponent({
         Alignment,
       ],
       fontSize: {
-        options: [12, 14, 16, 18, 20, 24, 28, 32, 38, 42, 46, 52, 60],
+        options: [12, 14, 16, 18, 20, 24, 28, 32, 38, "2rem", 46, 52, 60],
       },
       toolbar: {
         items: [

+ 3 - 1
src/modules/editor/components/CompUI/basicUI/Text/component2.tsx

@@ -68,6 +68,7 @@ export const Component = defineComponent({
       if (!dom) return;
       editorInstance = await InlineEditor.create(dom as any, config);
       editorInstance.setData(comp.value);
+      console.log(comp);
       if (store.isPreview) {
         editorInstance.enableReadOnlyMode("editor");
       }
@@ -107,7 +108,8 @@ export const Component = defineComponent({
 });
 
 const textStyle = css`
-  font-size: 12px;
+  height: 100%;
+  font-size: 16px;
   color: #666;
   p {
     margin: 0;

+ 5 - 2
src/modules/editor/components/CompUI/basicUI/Text/index.ts

@@ -1,6 +1,7 @@
 import { createAttrsForm } from "../../defines/createAttrsForm";
 import { createCompHooks } from "../../defines/createCompHooks";
 import "@ckeditor/ckeditor5-build-classic/build/translations/zh-cn";
+// import { TextForm } from "./TextForm";
 export { Component } from "./component";
 
 export const options = {
@@ -11,10 +12,12 @@ export const options = {
 export const { createComp, useCompData } = createCompHooks({
   value: "<p>请输入内容</p>",
   layout: {
-    size: [750, 60]
-  }
+    size: [750, 60],
+  },
 });
 
+// export const Form = TextForm;
+
 export const Form = createAttrsForm([
   {
     label: "文本",

+ 4 - 4
src/modules/editor/components/CompUI/defines/createAttrsForm.tsx

@@ -2,14 +2,14 @@ import { useEditor } from "@/modules/editor";
 import { DesignComp } from "@/modules/editor/objects/DesignTemp/DesignComp";
 import { compMasks } from "@/modules/editor/objects/DesignTemp/creates/CompMasks";
 import FormUI, { ColumnItem } from "@queenjs/components/FormUI";
-import { InputNumber, Select } from "ant-design-vue";
+import { InputNumber, Select, Input } from "ant-design-vue";
 import { isEmpty } from "lodash";
 import { defineComponent } from "vue";
 import { any } from "vue-types";
 import { GroupNumber } from "../formItems/GroupNumber";
 import { createColorOpts } from "./formOpts/createColorOpts";
 
-const layoutColumns: ColumnItem[] = [
+export const layoutColumns: ColumnItem[] = [
   {
     label: "尺寸",
     dataIndex: "layout.size",
@@ -44,7 +44,7 @@ const layoutColumns: ColumnItem[] = [
   {
     label: "偏移矩阵",
     dataIndex: "layout.transformMatrix",
-    component: "Input",
+    component: Input,
   },
   // {
   //   label: "上下偏移",
@@ -83,7 +83,7 @@ const layoutColumns: ColumnItem[] = [
   },
 ];
 
-const bgColumns: ColumnItem[] = [
+export const bgColumns: ColumnItem[] = [
   {
     label: "背景颜色",
     dataIndex: "layout.background.color",

+ 130 - 0
src/modules/editor/components/CompUI/formItems/Slider.tsx

@@ -0,0 +1,130 @@
+import { css } from "@linaria/core";
+import { InputNumber, Slider } from "ant-design-vue";
+import { defineComponent, reactive, watchEffect } from "vue";
+import { bool, number } from "vue-types";
+
+export default defineComponent({
+  props: {
+    disabled: bool().def(false),
+    value: number(),
+    min: number(),
+    max: number(),
+    step: number(),
+  },
+  emits: ["change"],
+  setup(props, { emit }) {
+    const state = reactive({
+      value: props.value,
+    });
+
+    const changeVal = () => {
+      if (state.value == props.value) return;
+      emit("change", state.value);
+    };
+
+    watchEffect(() => {
+      if (props.value != undefined) {
+        state.value = props.value;
+      }
+    });
+
+    return () => {
+      const { disabled, min, max, step } = props;
+      const attr = {
+        disabled: disabled,
+        value: state.value,
+        min,
+        max,
+        step,
+        onChange: (value: any) => {
+          state.value = value;
+          changeVal();
+        },
+      };
+      return (
+        <div class={SliderView}>
+          <Slider
+            class="item_slider"
+            tooltipVisible={false}
+            {...attr}
+            onAfterChange={() => changeVal()}
+          />
+          <InputNumber
+            class="item_input"
+            {...attr}
+            onPressEnter={() => changeVal()}
+            // onBlur={() => {
+            //   if (state.value !== props.value) changeVal();
+            // }}
+          />
+        </div>
+      );
+    };
+  },
+});
+const SliderView = css`
+  flex: 1;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  .item_slider {
+    flex: 1;
+  }
+  /* slider style */
+  .ant-slider-disabled {
+    opacity: 0.7;
+  }
+  .ant-slider-step {
+    background-color: rgba(255, 255, 255, 0.27);
+  }
+  .ant-slider-track {
+    border-radius: 4px;
+    background-color: rgba(255, 255, 255, 1);
+  }
+
+  .ant-slider:not(.ant-slider-disabled):hover {
+    .ant-slider-handle {
+      background-color: @inf-primary-color;
+      &:not(.ant-tooltip-open) {
+        border-color: #fff;
+      }
+    }
+  }
+  .ant-slider {
+    &.ant-slider-disabled {
+      .ant-slider-handle {
+        background-color: #bbb;
+        opacity: 0.8;
+      }
+    }
+  }
+  .ant-slider-handle {
+    width: 8px;
+    border-radius: 2px;
+    border-color: #fff;
+    background-color: #fff;
+  }
+
+  .ant-slider-handle-click-focused {
+    border-color: #fff;
+    background-color: @inf-primary-color;
+  }
+  /* input style */
+  .item_input {
+    width: 42px;
+    margin-left: 10px;
+    border: none;
+    padding: 2px 0;
+    text-align: center;
+    font-size: 12px;
+    background-color: rgba(252, 254, 255, 0.1);
+    .ant-input-number-handler-wrap {
+      display: none;
+    }
+    .ant-input-number-input {
+      height: auto;
+      padding: 0 2px;
+      text-align: center;
+    }
+  }
+`;

+ 3 - 10
src/modules/editor/controllers/SelectCtrl/ObjsContainer.ts

@@ -255,7 +255,7 @@ export class ObjsContainer {
 
         this.applyChildWidth({scaleX: Width / preW, scaleY: Height/preH})
         this.updateCompState();
-        
+
     }
 
     scaleWidth(x:number) {
@@ -290,16 +290,9 @@ export class ObjsContainer {
         let n = selected.length;
         while (n--) {
             let child = selected[n];
-            child.updateTransform();
-
-            //世界坐标
-            child.transform.setFromMatrix(child.worldTransform);
-            child.parent = null;
-            child.transform._parentID = -1;
-            child.updateTransform();
-            child._boundsID = -2;
-            child._lastBoundsID = 0;
+            this.parent.removeChildWorldNoChange(child)
         }
+        this.selected = [];
     }
 
     updateCompState() {

+ 38 - 4
src/modules/editor/controllers/SelectCtrl/index.ts

@@ -101,13 +101,19 @@ export class SelectCtrl extends ModuleControl<EditorModule> {
   _mouseDownFlag = "";
   _mouseDownTimestamp = 0;
 
+  _containers:Map<string, ObjsContainer> = new Map();
+
   _updateSelects() {
     const selecteds = this.store.selected;
+    const ObjC = this._containers.get(this.store.selectId)
     let objs = [];
     for (let item of selecteds) {
         objs.push( new CompObject(this.compMap[item]) )
     }
-    this.selecteObjs(objs);
+    this.selecteObjs(objs, ObjC);
+    if (this.store.selectId) {
+        this._containers.set(this.store.selectId, this.objContainer as ObjsContainer);
+    }
   }
 
   onDocMouseDown(e: MouseEvent) {
@@ -294,6 +300,7 @@ export class SelectCtrl extends ModuleControl<EditorModule> {
   movingMousemove(e: MouseEvent) {
     const objContainer = this.objContainer as ObjsContainer;
 
+    objContainer.setPivot(0);
     objContainer.translate(
       e.clientX - this._movePreClientX,
       e.clientY - this._movePreClientY
@@ -396,6 +403,7 @@ export class SelectCtrl extends ModuleControl<EditorModule> {
       this._selCanvaseSize.h
     );
     this.upgateGizmoStyle();
+    this.helper.extendStreamCard(this.store.currStreamCardId);
   }
   moveMouseUp(e: MouseEvent) {
     const history = this.controls.historyCtrl.history;
@@ -407,24 +415,31 @@ export class SelectCtrl extends ModuleControl<EditorModule> {
     const initX = this._initMovePos.x,
       initY = this._initMovePos.y;
 
+      obj.setPivot(0);
+
     history.record({
       undo: () => {
         console.log("undo ");
-
         const currObj = this.objContainer as ObjsContainer;
+        currObj.setPivot(0);
         currObj.parent.x = initX;
         currObj.parent.y = initY;
         currObj.parent.updateTransform();
         currObj.updateCompState();
+       
         this.upgateGizmoStyle();
+        this.helper.extendStreamCard(this.store.currStreamCardId);
       },
       redo: () => {
+      
         const currObj = this.objContainer as ObjsContainer;
+        currObj.setPivot(0);
         currObj.parent.x = lastX;
         currObj.parent.y = lastY;
         currObj.parent.updateTransform();
         currObj.updateCompState();
         this.upgateGizmoStyle();
+        this.helper.extendStreamCard(this.store.currStreamCardId);
       },
     } as any);
     history.submit();
@@ -446,7 +461,6 @@ export class SelectCtrl extends ModuleControl<EditorModule> {
   }
   
   upgateGizmoStyle() {
-    this.helper.extendStreamCard(this.store.currStreamCardId);
     this.transferStyle.mode = this._state;
 
     if (this.selected.length < 1) {
@@ -675,18 +689,30 @@ export class SelectCtrl extends ModuleControl<EditorModule> {
     let initrad = scope.objinitAngleRad;
 
     const history = this.controls.historyCtrl.history;
+    this.objContainer?.setPivot(0);
+  
     history.record({
       undo: () => {
-        console.log("undo ");
+       
+        const objContainer = this.objContainer as ObjsContainer;
+  
         this.objContainer?.setPivot(4);
         this.objContainer?.rotate(initrad);
+        this.objContainer?.setPivot(0);
+        this.objContainer?.updateCompState();
         this.upgateGizmoStyle();
+        this.helper.extendStreamCard(this.store.currStreamCardId);
       },
+
       redo: () => {
         console.log("redo ");
+        const objContainer = this.objContainer as ObjsContainer;
         this.objContainer?.setPivot(4);
         this.objContainer?.rotate(last);
+        this.objContainer?.setPivot(0);
+        this.objContainer?.updateCompState();
         this.upgateGizmoStyle();
+        this.helper.extendStreamCard(this.store.currStreamCardId);
       },
     } as any);
     history.submit();
@@ -802,6 +828,7 @@ export class SelectCtrl extends ModuleControl<EditorModule> {
       let lastScale = { x: this.lastScale.x, y: this.lastScale.y };
 
       const history = this.controls.historyCtrl.history;
+      this.objContainer?.setPivot(0);
 
       history.record({
         undo: () => {
@@ -809,13 +836,20 @@ export class SelectCtrl extends ModuleControl<EditorModule> {
 
           this.objContainer?.setPivot(scaleIndex);
           this.objContainer?.scaleSize(preScale.x, preScale.y);
+          this.objContainer?.setPivot(0);
+          this.objContainer?.updateCompState();
+
           this.upgateGizmoStyle();
+          this.helper.extendStreamCard(this.store.currStreamCardId);
         },
         redo: () => {
           console.log("redo ");
           this.objContainer?.setPivot(scaleIndex);
           this.objContainer?.scaleSize(lastScale.x, lastScale.y);
+          this.objContainer?.setPivot(0);
+          this.objContainer?.updateCompState();
           this.upgateGizmoStyle();
+          this.helper.extendStreamCard(this.store.currStreamCardId);
         },
       } as any);
       history.submit();

+ 2 - 3
src/modules/editor/module/actions/edit.ts

@@ -104,9 +104,8 @@ export const editActions = EditorModule.action({
   },
   
    async selectObjs(ids: string[]) {
-
-    console.log( "this.store.selected", this.store.selected )
-      this.store.selected = ids;
+     this.store.selected = ids;
+     this.store.selectId = ids.length > 1 ? (Date.now() + "") : ""
    },
 
   // 添加组件到画布

+ 6 - 1
src/modules/editor/module/actions/init.ts

@@ -13,7 +13,12 @@ export const initActions = EditorModule.action({
     this.controls.compUICtrl.init();
 
     createProxyEffect(this.store, (type, paths, value, oldValue) => {
-      if (paths[0] === "designData" || paths[0] === "currCompId" || paths[0] === "selected" || paths[0] === "currStreamCardId") {
+      if (paths[0] === "designData" || 
+          paths[0] === "currCompId" || 
+          paths[0] === "selected" || 
+          paths[0] === "currStreamCardId" ||
+          paths[0] === "selectId"
+          ) {
         historyCtrl.record(this.store, type, paths, value, oldValue);
       }
     });

+ 1 - 0
src/modules/editor/module/stores/index.ts

@@ -18,6 +18,7 @@ export const store = EditorModule.store({
   
 
     selected: [] as string[], //选中的组件
+    selectId: "",    //选中的id唯一标识一次选中
   }),
   getters: {
     isEditMode(): boolean {

+ 31 - 0
src/pages/website/Login/index.tsx

@@ -0,0 +1,31 @@
+import { css } from "@linaria/core";
+import Login from "@queenjs-modules/auth/components/Login";
+import { defineComponent } from "vue";
+export default defineComponent(() => {
+  return () => (
+    <div class={LoginStyle}>
+      <Login class="!h-auto flex-1" />
+      <div class="footer_copy">
+        <a href="https://beian.miit.gov.cn" target="_blank">
+          蜀ICP备18008991号-3
+        </a>
+        版权所有:3Dqueen
+      </div>
+    </div>
+  );
+});
+const LoginStyle = css`
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+  .footer_copy {
+    padding: 10px 0;
+    text-align: center;
+    color: #999;
+  }
+
+  .footer_copy a {
+    margin-right: 5px;
+    color: #fff;
+  }
+`;

+ 1 - 1
src/pages/website/router.ts

@@ -52,7 +52,7 @@ const routes: Array<RouteRecordRaw> = [
   {
     path: "/login",
     name: "login",
-    component: () => import("@queenjs-modules/auth/components/Login"),
+    component: () => import("./Login"),
   },
   {
     path: "/forget",

+ 1 - 0
src/styles/theme.less

@@ -28,4 +28,5 @@
 @inf-primary-hover-bg: darken(@inf-primary-bg, 10%);
 
 @inf-header-height: 72px;
+@inf-form-bg: #383838;
 @inf-input-padding-inline: 0;

+ 4 - 4
yarn.lock

@@ -1763,10 +1763,10 @@
   resolved "http://124.70.149.18:4873/@queenjs-modules%2fqueentree/-/queentree-0.0.10.tgz#f6344ab32ba0163a3b8cf4f4b9fe6641aef2bea7"
   integrity sha512-P4cIjXKgcvd8h3vVs4f1rGLNf3/Kd5G+qGiZN+idkLjiu22HU6SNmOVLUwV6PuKg+9sTPRn7FKamSHuFxXWX5g==
 
-"@queenjs/components@^0.0.15":
-  version "0.0.15"
-  resolved "http://124.70.149.18:4873/@queenjs%2fcomponents/-/components-0.0.15.tgz#5dcb42d8615ab2d64441e3ecb0c0d097d7361669"
-  integrity sha512-c6yqk7NxIMrrE5ULX8d7iubBJoUKYlDGvCjfmPGSQV6i8UZJHzcnauH2BIsm5ASO5XeTuFxsuRCuXq8AKA0gpQ==
+"@queenjs/components@^0.0.19":
+  version "0.0.19"
+  resolved "http://124.70.149.18:4873/@queenjs%2fcomponents/-/components-0.0.19.tgz#b3a0a91cf24fd2b46610c338ab1f0d68e0e6af60"
+  integrity sha512-XEuCLkyy9o2CFZu1nPf+9ND/m+1D+ib6zn8oSfKtwcB1rvz/lL6e/iqSqdZnUZ6ia2GAI0gRKcA0/3FRYJDL6g==
   dependencies:
     "@queenjs/utils" "^0.0.1"