101 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Vue
		
	
	
<template>
 | 
						|
  <view class="ui-switch" :class="[{ disabled: props.disabled }, props.ui]">
 | 
						|
    <view class="ui-switch-wrapper" @tap="change">
 | 
						|
      <view
 | 
						|
        class="ui-switch-input"
 | 
						|
        :class="[
 | 
						|
          { 'ui-switch-input-checked': props.modelValue },
 | 
						|
          props.modelValue ? props.bg : '',
 | 
						|
          props.text,
 | 
						|
          props.size,
 | 
						|
        ]"
 | 
						|
      ></view>
 | 
						|
    </view>
 | 
						|
  </view>
 | 
						|
</template>
 | 
						|
 | 
						|
<script>
 | 
						|
  export default {
 | 
						|
    name: 'UiSwitch',
 | 
						|
  };
 | 
						|
</script>
 | 
						|
<script setup>
 | 
						|
  const props = defineProps({
 | 
						|
    modelValue: {
 | 
						|
      type: [Boolean, Number],
 | 
						|
      default: false,
 | 
						|
    },
 | 
						|
    ui: {
 | 
						|
      type: String,
 | 
						|
      default: '',
 | 
						|
    },
 | 
						|
    bg: {
 | 
						|
      type: String,
 | 
						|
      default: 'ui-BG-Main',
 | 
						|
    },
 | 
						|
    text: {
 | 
						|
      type: String,
 | 
						|
      default: '',
 | 
						|
    },
 | 
						|
    size: {
 | 
						|
      type: String,
 | 
						|
      default: 'sm',
 | 
						|
    },
 | 
						|
    disabled: {
 | 
						|
      type: Boolean,
 | 
						|
      default: false,
 | 
						|
    },
 | 
						|
  });
 | 
						|
  const emits = defineEmits(['update:modelValue']);
 | 
						|
 | 
						|
  const change = () => {
 | 
						|
    emits('update:modelValue', !props.modelValue);
 | 
						|
  };
 | 
						|
</script>
 | 
						|
 | 
						|
<style lang="scss" scoped>
 | 
						|
  .ui-switch {
 | 
						|
    display: inline-block;
 | 
						|
    cursor: pointer;
 | 
						|
    .ui-switch-wrapper {
 | 
						|
      display: inline-flex;
 | 
						|
      align-items: center;
 | 
						|
      vertical-align: middle;
 | 
						|
    }
 | 
						|
    .ui-switch-input {
 | 
						|
      appearance: none;
 | 
						|
      position: relative;
 | 
						|
      width: 47px;
 | 
						|
      height: 26px;
 | 
						|
      outline: 0;
 | 
						|
      border-radius: 16px;
 | 
						|
      box-sizing: border-box;
 | 
						|
      background-color: rgba(119, 119, 119, 0.3);
 | 
						|
      transition: background-color 0.1s, border 0.1s;
 | 
						|
      &:after {
 | 
						|
        content: ' ';
 | 
						|
        position: absolute;
 | 
						|
        top: 0;
 | 
						|
        left: 0;
 | 
						|
        border-radius: 200px;
 | 
						|
        transition: transform 0.3s;
 | 
						|
        width: 20px;
 | 
						|
        height: 20px;
 | 
						|
        margin: 3px;
 | 
						|
        background-color: #fff;
 | 
						|
      }
 | 
						|
      &.ui-switch-input-checked {
 | 
						|
        &:after {
 | 
						|
          transform: translateX(21px);
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
    &.disabled {
 | 
						|
      cursor: not-allowed;
 | 
						|
      .ui-switch-input {
 | 
						|
        opacity: 0.7;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
</style>
 |