ananzhusen 11 месяцев назад
Родитель
Сommit
1164d0ccf3

+ 252 - 28
src/views/components/PenDatas.vue

@@ -169,11 +169,12 @@
           <div class="grid head">
             <div class="title">数据名</div>
             <div class="title">值</div>
-            <div class="title">状态</div>
-            <div class="actions">
+            <div class="title" style="text-align: center;">绑定</div>
+            <div class="title" style="text-align: center;">操作</div>
+
+            <!-- <div class="actions">
               <more-icon />
-              <!-- <t-icon name="more" /> -->
-            </div>
+            </div> -->
           </div>
           <div class="grid" v-for="(item, i) in props.pen.realTimes">
             <t-tooltip :content="item.key" placement="top">
@@ -216,20 +217,17 @@
                 @change="changeValue(item.key)"
               />
 
+             
+            </div>
+            <div style="text-align: center;">
               <t-tooltip :content="getBindsDesc(item)" placement="top">
                 <link-icon class="hover ml-4"
                   :class="{ primary: item.enableMock || item.bind?.id }"
                   @click="onBind(item)"/>
-                <!-- <t-icon
-                  name="link"
-                  class="hover ml-4"
-                  :class="{ primary: item.enableMock || item.bind?.id }"
-                  @click="onBind(item)"
-                /> -->
               </t-tooltip>
             </div>
-            <div>
-              <t-tooltip :content="item.triggers?.length || '状态'">
+            <div style="text-align: center;">
+              <!-- <t-tooltip :content="item.triggers?.length || '状态'">
                 <t-badge
                   :count="item.triggers?.length"
                   size="small"
@@ -238,24 +236,25 @@
                 >
                   <relativity-icon  class="hover"
                     @click="onTrigger(item)"/>
-                  <!-- <t-icon
-                    name="relativity"
-                    class="hover"
-                    @click="onTrigger(item)"
-                  /> -->
                 </t-badge>
-              </t-tooltip>
+              </t-tooltip> -->
+                <t-dropdown
+                  :options="triggerOptions"
+                  @click="addTrigger(item, $event, i)"
+                  :minColumnWidth="120"
+                >
+                  <ViewListIcon class="hover"/>
+                </t-dropdown>
             </div>
-            <div class="actions">
+            <!-- <div class="actions">
               <t-dropdown
                 :options="moreOptions"
                 @click="onMenuMore($event, item, i)"
                 :minColumnWidth="80"
               >
                 <more-icon class="more hover" />
-                <!-- <t-icon name="more" class="more hover" /> -->
               </t-dropdown>
-            </div>
+            </div> -->
           </div>
           <div class="mt-8 pb-16">
             <t-dropdown
@@ -332,13 +331,16 @@
                 @change="changeCValue(item.key,cPen)"
               />
 
+
+            </div>
+            <div style="text-align: center;">
               <t-tooltip :content="getBindsDesc(item)" placement="top">
                 <link-icon class="hover ml-4"
                   :class="{ primary: item.enableMock || item.bind?.id }"
                   @click="onBind(item)"/>
               </t-tooltip>
             </div>
-            <div>
+            <!-- <div>
               <t-tooltip :content="item.triggers?.length || '状态'">
                 <t-badge
                   :count="item.triggers?.length"
@@ -350,14 +352,14 @@
                     @click="onTrigger(item)"/>
                 </t-badge>
               </t-tooltip>
-            </div>
-            <div class="actions">
+            </div> -->
+            <div class="actions" style="text-align: center;">
               <t-dropdown
                 :options="moreOptions"
                 @click="onCMenuMore($event, item, i, cPen)"
                 :minColumnWidth="80"
               >
-                <more-icon class="more hover" />
+                <ViewListIcon class="hover"/>
               </t-dropdown>
             </div>
           </div>
@@ -791,7 +793,8 @@ import {
   ref,
   toRaw,
   watch,
-  onMounted
+  onMounted,
+  computed
 } from 'vue';
 import { useRoute, useRouter } from 'vue-router';
 import { MessagePlugin } from 'tdesign-vue-next';
@@ -806,7 +809,7 @@ import Actions from './Actions.vue';
 import { useSelection } from '@/services/selections';
 import { defaultGradientColor, defaultPureColor } from '@/services/defaults';
 import { getLe5le3d, getLe5leV, getLe5le2d } from '@/services/api';
-import { EllipsisIcon, MoreIcon, LinkIcon, RelativityIcon, AddRectangleIcon, SearchIcon ,DeleteIcon, ArrowRightIcon, CloseIcon, ChevronLeftDoubleIcon, AddIcon } from 'tdesign-icons-vue-next';
+import { EllipsisIcon, MoreIcon, LinkIcon, RelativityIcon, AddRectangleIcon, SearchIcon ,DeleteIcon, ArrowRightIcon, CloseIcon, ChevronLeftDoubleIcon, AddIcon, ViewListIcon } from 'tdesign-icons-vue-next';
 import { s8 } from '@/services/random';
 
 const route = useRoute();
@@ -1613,6 +1616,227 @@ const onCMenuMore = (e: any, item: any, i: number, pen:Pen)=>{
   }
 }
 
+const emit = defineEmits(['tabchange']); 
+
+const triggerOptions = computed(() => {
+  const options =   [
+    {
+      value: 'custom',
+      content: '自定义状态',
+      divider: true
+    },
+
+    {
+      value: 'warning',
+      content: '条件告警',
+    },
+    {
+      value: 'warningAnimate',
+      content: '条件动画',
+      divider: true
+    },
+    {
+      value: 'edit',
+      content: '编辑',
+    },
+    {
+      value: 'delete',
+      content: '移除',
+    },
+  ]
+  if( props.pen.name === "combine"&& props.pen.showChild !== undefined){
+    options.splice(1,0,
+    {
+      value: 'switch',
+      content: '状态切换',
+    });
+  }
+  
+  return options
+});
+
+const addTrigger = (item:any, e:any, i:any) => {
+  if(!['edit', 'delete'].includes(e.value)){
+    if(!props.pen.triggers){
+      props.pen.triggers = [];
+    }
+  }
+
+  switch (e.value) {
+    case 'edit':
+      addDataDialog.header = '编辑动态数据';
+      setter(item, 'value', getter(props.pen, item.key));
+      addDataDialog.data = item;
+      addDataDialog.show = true;
+      break;
+    case 'delete':
+      props.pen.realTimes.splice(i, 1);
+      meta2d.initBinds();
+      break;
+    case 'switch':
+      props.pen.triggers.push({
+        "name": e.content,
+        "status": [
+            {
+              "name": "满足条件,切换到状态1",
+              "conditionType": "and",
+              "conditions": [
+                  {
+                      "type": "",
+                      "operator": ">=",
+                      "key": item.key,
+                      "keyLabel": item.label,
+                      "valueType": ""
+                  }
+              ],
+              "actions": [
+                  {
+                      "action": 1,
+                      "params": "",
+                      "value": {
+                          "showChild": 1
+                      },
+                      "targetType": "id"
+                  }
+              ]
+            },
+            {
+                "name": "默认显示状态",
+                "conditionType": "and",
+                "conditions": [],
+                "actions": [
+                    {
+                        "action": 1,
+                        "params": "",
+                        "value": {
+                            "showChild": 0
+                        },
+                        "targetType": "id"
+                    }
+                ]
+            }
+        ]
+      });
+      break;
+    case 'warning':
+      props.pen.triggers.push({
+        "name": e.content,
+        "status": [
+            {
+                "name": "满足条件,触发告警",
+                "conditions": [
+                    {
+                        "type": "",
+                        "operator": ">=",
+                        "valueType": "",
+                        "key": item.key,
+                        "keyLabel":item.label,
+                        "value": undefined
+                    }
+                ],
+                "actions": [
+                    {
+                        "action": 1,
+                        "params": "",
+                        "value": {
+                            "background": "red",
+                        },
+                        "targetType": "id"
+                    }
+                ],
+                "conditionType": "and"
+            },
+            {
+                "name": "恢复默认",
+                "conditionType": "and",
+                "conditions": [],
+                "actions": [
+                    {
+                        "action": 1,
+                        "params": "",
+                        "value": {
+                            "background": "#0000",
+                        },
+                        "targetType": "id"
+                    }
+                ]
+            }
+        ]
+      });
+      break;
+    case 'warningAnimate':
+      props.pen.triggers.push({
+        "name": e.content,
+        "status": [
+            {
+                "name": "满足条件,触发动画执行",
+                "conditions": [
+                    {
+                        "type": "",
+                        "operator": ">=",
+                        "valueType": "",
+                        "key": item.key,
+                        "keyLabel":item.label,
+                        "value": undefined
+                    }
+                ],
+                "actions": [
+                    {
+                        "action": 2,
+                        "params": "",
+                        "value": "",
+                        "targetType": "id",
+                    }
+                ],
+                "conditionType": "and"
+            },
+            {
+                "name": "恢复默认状态",
+                "conditionType": "and",
+                "conditions": [],
+                "actions": [
+                    {
+                        "action": 4,
+                        "params": "",
+                        "value": "",
+                        "targetType": "id"
+                    }
+                ]
+            }
+        ]
+      });
+      break;
+    case 'custom':
+      props.pen.triggers.push({
+        name: `状态场景${props.pen.triggers.length + 1}`,
+        status:[
+          {
+            name:'状态1',
+            conditionType: 'and',
+            conditions: [{
+              type:'',
+              operator: "=",
+              key: item.key,//"text",
+              keyLabel: item.label,
+              value: undefined
+            }],
+            actions: [],
+          },
+          {
+            name:'状态2',
+            conditionType: 'and',
+            conditions: [],
+            actions: [],
+          }
+        ],
+      });
+      break;
+  }
+  if(!['edit', 'delete'].includes(e.value)){
+    emit('tabchange',true);
+  }
+}
+
 onUnmounted(() => {
   clearInterval(timer);
 });
@@ -1622,7 +1846,7 @@ onUnmounted(() => {
   height: 100%;
 
   .grid {
-    grid-template-columns: 70px 100px 44px 30px;
+    grid-template-columns: 70px 70px 50px 65px;
     padding: 0 12px;
 
     &.head {

+ 1 - 1
src/views/components/PenEvents.vue

@@ -27,7 +27,7 @@
           <template #headerRightContent>
             <t-space size="small" @click.stop>
               <t-popconfirm
-                content="确认删除该交互事件吗"
+                content="确认删除该交互事件吗"
                 placement="left"
                 @confirm="props.pen.events.splice(i, 1)"
               >

+ 13 - 1
src/views/components/PenProps.vue

@@ -1401,7 +1401,10 @@
         <PenAnimates :pen="data.pen" />
       </t-tab-panel>
       <t-tab-panel :value="3" label="数据">
-        <PenDatas :pen="data.pen" />
+        <PenDatas :pen="data.pen" @tabchange="tabChange"/>
+      </t-tab-panel>
+      <t-tab-panel :value="5" label="状态">
+        <PenStatus :pen="data.pen" ref="status" />
       </t-tab-panel>
       <t-tab-panel :value="4" label="交互">
         <PenEvents :key="data.key" :pen="data.pen" />
@@ -1421,6 +1424,7 @@ import Iconfonts from './common/Iconfonts.vue';
 import PenAnimates from './PenAnimates.vue';
 import PenDatas from './PenDatas.vue';
 import PenEvents from './PenEvents.vue';
+import PenStatus from './PenStatus.vue'
 // import ElementTree from './ElementTree.vue';
 
 import { getCookie } from '@/services/cookie';
@@ -1829,6 +1833,14 @@ const isDom = computed(() => {
     meta2d.store.options.domShapes.includes(data.pen.name)
 });
 
+const status = ref<any>(null);
+const tabChange = (tab: number) => {
+  data.tab = 5;
+  setTimeout(()=>{
+    status.value.editLast();
+  },1000);
+};
+
 onUnmounted(() => {
   watcher();
   meta2d.off('translatePens', getRect);

+ 520 - 0
src/views/components/PenStatus.vue

@@ -0,0 +1,520 @@
+<template>
+  <div class="props">
+    <div v-if="props.pen.triggers && props.pen.triggers.length">
+      <div
+        class="flex between tigger-item"
+        v-for="(trigger, i) in props.pen.triggers"
+        :value="i"
+      >
+        <t-input
+          style="width: 190px; margin-left: 20px"
+          v-model="trigger.name"
+          placeholder="状态场景名"
+        />
+        <div class="flex operation">
+          <div class="icon-box icon-item-box" @click="onEditTrigger(trigger)">
+            <Edit2Icon />
+          </div>
+          <t-popconfirm
+            :content="`确认删除这条状态场景吗?`"
+            placement="bottom"
+            @confirm="delTrigger(i)"
+          >
+            <div class="icon-box">
+              <DeleteIcon />
+            </div>
+          </t-popconfirm>
+        </div>
+      </div>
+    </div>
+    <div class="flex column center blank" v-else>
+      <img src="/img/blank.png" />
+      <div class="gray center">还没有状态场景</div>
+      <!-- <div class="mt-8">
+        <t-button style="height: 30px" @click="onAddTrigger">
+          添加状态
+        </t-button>
+      </div> -->
+    </div>
+    <div class="flex center mt-8">
+      <t-button
+        style="height: 30px; width: 90%; margin: 12px"
+        @click="onAddTrigger"
+      >
+        添加状态场景
+      </t-button>
+    </div>
+  </div>
+  <t-drawer
+    v-model:visible="drawer.visible"
+    :footer="false"
+    :header="drawer.header"
+    :size="'800px'"
+  >
+    <div v-if="trigger">
+      <t-collapse
+        v-model="openedCollapses"
+        :borderless="true"
+        :expand-on-row-click="true"
+      >
+        <t-collapse-panel v-for="(state, i) in trigger.status" :value="i">
+          <template #header>
+            <t-input
+              v-model="state.name"
+              style="width:90%"
+              @click="panelInputClick($event)"
+              placeholder="状态名"
+            />
+          </template>
+          <template #headerRightContent>
+            <t-space size="small" @click.stop>
+              <t-popconfirm
+                content="确认删除该状态吗?"
+                placement="left"
+                @confirm="trigger.status.splice(i, 1)"
+              >
+                <delete-icon class="hover" />
+              </t-popconfirm>
+            </t-space>
+          </template>
+          <!-- <Conditions :key="temCKey" :data="state" /> -->
+          <div class="props">
+            <div
+              v-if="state.conditions && state.conditions.length > 0"
+              class="form-item banner"
+            >
+              <label>满足条件</label>
+              <div class="w-full flex middle between">
+                <div></div>
+                <t-radio-group class="ml-8" v-model="state.conditionType">
+                  <t-radio value="and"> 所有 </t-radio>
+                  <t-radio value="or"> 任意 </t-radio>
+                </t-radio-group>
+              </div>
+            </div>
+            <div v-for="(c, index) in state.conditions" class="mb-12">
+              <div class="flex middle between" style="margin-top:10px;">
+                <div class="flex middle">
+                  <arrow-right-icon class="mr-4" />
+                  条件{{ index + 1 }}
+                </div>
+                <close-icon
+                  class="hover"
+                  @click="state.conditions.splice(index, 1)"
+                />
+              </div>
+              <div class="">
+                <div class="form-item mt-4 px-16">
+                  <label>条件类型</label>
+                  <t-radio-group class="ml-8" v-model="c.type">
+                    <t-radio value=""> 关系条件 </t-radio>
+                    <t-radio value="fn"> 高级条件 </t-radio>
+                  </t-radio-group>
+                </div>
+                <template v-if="!c.type">
+                  <div class="form-item mt-8 px-16">
+                    <label>比较条件</label>
+                    <t-select-input
+                      v-model:inputValue="c.key"
+                      :value="c.keyLabel"
+                      v-model:popupVisible="c.keyPopupVisible"
+                      allow-input
+                      clearable
+                      @clear="c.keyLabel = undefined"
+                      @focus="c.keyPopupVisible = true"
+                      @blur="c.keyPopupVisible = false"
+                      @input-change="onKeyInput(c)"
+                      class="shrink-0"
+                      style="width: 132px"
+                    >
+                      <template #panel>
+                        <ul style="padding: 8px 12px">
+                          <li
+                            v-for="item in cprops"
+                            :key="item.value"
+                            @click="
+                              c.key = item.value;
+                              c.keyLabel = item.label;
+                              c.keyPopupVisible = false;
+                            "
+                          >
+                            {{ item.label }}
+                          </li>
+                        </ul>
+                      </template>
+                    </t-select-input>
+                    <t-select
+                      style="width: 132px"
+                      v-model="c.operator"
+                      placeholder="关系运算"
+                      :options="operatorOptions"
+                      clearable
+                      class="shrink-0"
+                    />
+                    <t-select
+                      style="width: 132px"
+                      v-model="c.valueType"
+                      class="shrink-0"
+                      placeholder="固定值"
+                    >
+                      <t-option key="" value="" label="固定值">
+                        固定值
+                      </t-option>
+                      <t-option key="prop" value="prop" label="对象属性值">
+                        对象属性
+                      </t-option>
+                    </t-select>
+                    <t-input
+                      v-if="!c.valueType"
+                      v-model="c.value"
+                      @change="valueChange($event, c)"
+                      class="shrink-0"
+                    />
+                    <template v-else>
+                      <t-tree-select
+                        style="width: 132px"
+                        v-model="c.target"
+                        :data="penTree"
+                        filterable
+                        placeholder="对象"
+                        class="shrink-0"
+                        @change="onChangeTriggerTarget(c)"
+                      />
+                      <t-select-input
+                        v-model:inputValue="c.value"
+                        :value="c.label"
+                        v-model:popupVisible="c.popupVisible"
+                        allow-input
+                        clearable
+                        @clear="c.label = undefined"
+                        @focus="c.popupVisible = true"
+                        @blur="c.popupVisible = false"
+                        @input-change="onInput(c)"
+                        class="shrink-0"
+                        placeholder="属性"
+                      >
+                        <template #panel>
+                          <ul style="padding: 8px 12px">
+                            <li
+                              v-for="item in cprops"
+                              :key="item.value"
+                              @click="
+                                c.value = item.value;
+                                c.label = item.label;
+                                c.popupVisible = false;
+                              "
+                            >
+                              {{ item.label }}
+                            </li>
+                          </ul>
+                        </template>
+                      </t-select-input>
+                    </template>
+                  </div>
+                </template>
+                <template v-else>
+                  <div class="px-16">
+                    <div>function condition(pen) {</div>
+                    <CodeEditor
+                      class="mt-4"
+                      @change="codeChange($event, c)"
+                      v-model="c.fnJs"
+                    />
+                    <div class="mt-4">}</div>
+                  </div>
+                </template>
+              </div>
+            </div>
+            <div class="mt-8">
+              <a @click="addTriggerCondition(state)"> + 添加触发条件 </a>
+            </div>
+          </div>
+          <div class="form-item banner mt-16">
+            <label>执行动作</label>
+          </div>
+          <Actions class="mt-8" :key="temAKey" :data="state" />
+        </t-collapse-panel>
+      </t-collapse>
+      <div class="flex center mt-8">
+        <t-button
+          style="height: 30px; width: 100%; margin: 12px"
+          @click="addTriggerStatus(trigger)"
+          variant="outline"
+        >
+        <template #icon><add-icon /></template>
+          添加状态
+        </t-button>
+      </div>
+    </div>
+  </t-drawer>
+</template>
+
+<script lang="ts" setup>
+import { reactive, defineComponent, ref } from 'vue';
+import Actions from './Actions.vue';
+// import Conditions from './Conditions.vue';
+import { Edit2Icon, DeleteIcon, ArrowRightIcon, CloseIcon, AddIcon } from 'tdesign-icons-vue-next';
+import { getPenTree, typeOptions, changeType } from '@/services/common';
+import CodeEditor from '@/views/components/common/CodeEditor.vue';
+
+const props = defineProps<{
+  pen: any;
+}>();
+
+const trigger = ref();
+const drawer = reactive({
+  visible: false,
+  header: '编辑状态',
+});
+
+const openedCollapses = ref([0]);
+
+const onAddTrigger = () => {
+  if (!props.pen.triggers) {
+    props.pen.triggers = [];
+  }
+  const i = props.pen.triggers.length;
+  props.pen.triggers.push({
+    name: `状态场景${i + 1}`,
+    status: [
+      {
+        name: '状态1',
+        conditions: [],
+        actions: [],
+      },
+    ],
+    // key: '', //属性key
+  });
+
+  openedCollapses.value.push(i);
+};
+
+const delTrigger = (i: number) => {
+  props.pen.triggers.splice(i, 1);
+};
+
+// const temCKey = ref(0);
+const temAKey = ref(0);
+
+const onEditTrigger = (data: any) => {
+  // 辅助更新代码块数据
+  // temCKey.value = Math.random();
+  temAKey.value = Math.random();
+  trigger.value = data;
+  drawer.header = data.name;
+  drawer.visible = true;
+  penTree.value = getPenTree();
+};
+
+const editLast = () => {
+  const i = props.pen.triggers.length;
+  onEditTrigger(props.pen.triggers[i - 1]);
+};
+
+const addTriggerStatus = (triger: any) => {
+  const i = props.pen.triggers.length;
+  triger.status.push({
+    name: `状态${i}`,
+    conditionType: 'and',
+    conditions: [],
+    actions: [],
+  });
+};
+
+const panelInputClick = (e) => {
+  e.e.stopPropagation();
+};
+
+const penTree: any = ref([]);
+
+const onChangeTriggerTarget = (c: any) => {
+  const target: any = meta2d.findOne(c.target);
+  if (target && target.realTimes) {
+    for (const item of target.realTimes) {
+      const found = cprops.value.findIndex(
+        (elem: any) => elem.value === item.key
+      );
+      if (found < 0) {
+        cprops.value.push({
+          value: item.key,
+          label: item.label,
+        });
+      }
+    }
+  }
+};
+
+const addTriggerCondition = (data: any) => {
+  if (!data.conditionType) {
+    data.conditionType = 'and';
+  }
+  data.conditions.push({
+    type: '',
+    operator: '=',
+    valueType: '',
+  });
+};
+
+const onKeyInput = (item: any) => {
+  item.keyLabel = item.key;
+};
+
+const onInput = (item: any) => {
+  item.label = item.value;
+};
+
+const cprops = ref<any>([
+  {
+    value: 'x',
+    label: 'X',
+  },
+  {
+    value: 'y',
+    label: 'Y',
+  },
+  {
+    value: 'width',
+    label: '宽',
+  },
+  {
+    value: 'height',
+    label: '高',
+  },
+  {
+    value: 'visible',
+    label: '显示',
+  },
+  {
+    value: 'text',
+    label: '文字',
+  },
+  {
+    value: 'color',
+    label: '颜色',
+  },
+  {
+    value: 'background',
+    label: '背景颜色',
+  },
+  {
+    value: 'progress',
+    label: '进度',
+  },
+  {
+    value: 'progressColor',
+    label: '进度颜色',
+  },
+  {
+    value: 'showChild',
+    label: '状态',
+  },
+  {
+    value: 'rotate',
+    label: '旋转',
+  },
+  {
+    value: 'disabled',
+    label: '禁用',
+  },
+]);
+
+const operatorOptions = [
+  { label: '=', value: '=' },
+  { label: '!=', value: '!=' },
+  { label: '>', value: '>' },
+  { label: '<', value: '<' },
+  { label: '>=', value: '>=' },
+  { label: '<=', value: '<=' },
+  { label: '包含', value: '[)' },
+  { label: '不包含', value: '![)' },
+];
+
+const valueChange = (e, c: any) => {
+  c.value = changeType(e);
+};
+
+const codeChange = (e: any, a: any) => {
+  a.fn = null;
+};
+
+defineExpose({
+  editLast,
+});
+</script>
+<style lang="postcss" scoped>
+.tigger-item {
+  /* height: 50px; */
+  /* line-height: 50px; */
+  margin: 12px 8px;
+  align-items: center;
+
+  :deep(.t-input) {
+    border-color: transparent;
+    &:hover {
+      border-color: var(--color-border-input);
+    }
+  }
+
+  .operation {
+    height: 40px;
+    /* line-height: 40px; */
+    align-items: center;
+
+    .icon-box {
+      width: 24px;
+      height: 24px;
+      margin: 4px;
+      text-align: center;
+      line-height: 24px;
+      border-radius: 4px;
+
+      &:hover {
+        background: var(--td-brand-color-light);
+      }
+
+      .t-icon {
+        width: 14px;
+        height: 14px;
+      }
+    }
+  }
+  &:hover {
+    background: var(--color-background-input);
+    border-radius: 4px;
+  }
+}
+:deep(.t-collapse) {
+  .t-collapse-panel__header {
+    .t-input {
+      border-color: transparent;
+      &:hover {
+        border-color: var(--color-border-input);
+      }
+    }
+  }
+
+  .t-collapse-panel__icon:hover {
+    background: none;
+    svg {
+      color: var(--color-primary);
+    }
+  }
+  .banner {
+    background-color: var(--color-background-input);
+    padding: 0 12px;
+  }
+}
+
+/* .props {
+  :deep(.value-input) {
+    max-width: 95px;
+  }
+} */
+
+/* :deep(.value-label) {
+  width: 50px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+} */
+</style>