index.vue 2.7 KB
<script lang="ts" setup name="StepBar">
import { ref, computed } from "vue";
import { Delete, Check } from "@element-plus/icons-vue";

const props = defineProps({
  stepsInfo: {
    type: Object,
    default: {},
  }
})

const stepList = computed(() => {
  return props.stepsInfo.list ?? [];
})

const step = computed(() => {
  return props.stepsInfo.step ?? [];
})
</script>

<template>
  <el-steps :space="200" :active="step" align-center>
    <el-step v-for="item in stepList" :icon="step >= item.value ? Check : ''">
      <template #title>
        <el-tooltip v-if="item.tooltip" :popper-class="item.tooltip.className" :trigger="item.tooltip.trigger"
          :placement="item.tooltip.placement" :effect="item.tooltip.effect">
          <template #content>
            <span>{{ item.tooltip.content }}</span>
          </template>
          <span>{{ item.title }}</span>
        </el-tooltip>
        <span v-else>{{ item.title }}</span>
      </template>
    </el-step>
  </el-steps>
</template>

<style lang="scss" scoped>
:deep(.el-step) {

  .el-step__icon {
    width: 32px;
    height: 32px;
    font-size: 20px;

    &.is-text {
      color: #999;
      border-width: 1px;
      border-color: var(--el-border-color-regular);
    }

    &-inner {
      font-weight: 400;
    }
  }

  .el-step__head {
    &.is-process {
      color: var(--el-color-primary);
      border-color: var(--el-color-primary);

      .el-step__icon {
        background-color: var(--el-color-primary);
        color: #fff;

        &.is-text {
          border-color: var(--el-color-primary);
        }
      }
    }

    &.is-finish {

      .el-step__icon {
        background-color: #fff;
        color: #fff;

        &.is-icon {
          color: var(--el-color-primary);
          background-color: #fff;

          .el-step__icon-inner {
            width: 100%;
            height: 100%;
            border: 1px solid var(--el-color-primary);
            border-radius: 100%;

            svg {
              width: 20px;
              height: 20px;
              vertical-align: bottom;
            }
          }
        }
      }
    }

  }

  .el-step__title {
    color: #999;
    font-weight: 400;
    font-size: 14px;
    cursor: default;

    &.is-process {
      color: var(--el-color-primary);
      font-weight: 400;
    }

    &.is-finish {
      color: var(--el-color-primary);
    }
  }

  &.is-horizontal {
    .el-step__line {
      top: 15px;
      left: calc(50% + 24px);
      right: calc(-50% + 24px);
      height: 1px;
      background: var(--el-border-color-regular)
    }

    .el-step__icon {
      background-color: #fff;
    }

    &>.is-finish {
      .el-step__line {
        background: var(--el-color-primary)
      }
    }
  }
}
</style>