{"version":3,"file":"index.cjs","sources":["../src/attachment/ZuiAttachment.vue","../src/attachment/index.js","../src/button/index.js","../src/calendar/ZuiCalendar.vue","../src/calendar/index.js","../src/deletable/ZuiDeletable.vue","../src/deletable/index.js","../src/input/ZuiInput.vue","../src/input/index.js","../src/field/ZuiField.vue","../src/field/index.js","../src/field-group/ZuiFieldGroup.vue","../src/field-group/index.js","../src/input-field/ZuiInputField.vue","../src/input-field/index.js","../src/loading/index.js","../src/image-uploader/Index.vue","../src/image-uploader/index.ts","../src/month/ZuiMonth.vue","../src/month/index.js","../src/placeholder/ZuiPlaceholder.vue","../src/placeholder/index.js","../src/switch/ZuiSwitch.vue","../src/switch/index.js","../src/switch-field/ZuiSwitchField.vue","../src/switch-field/index.js","../src/sortable-inputs/ZuiSortableInputs.vue","../src/sortable-inputs/index.js","../src/sortable-inputs-field/ZuiSortableInputsField.vue","../src/sortable-inputs-field/index.js","../src/selector/ZuiSelector.vue","../src/selector/index.js","../src/selector-field/ZuiSelectorField.vue","../src/selector-field/index.js","../src/tabs/ZuiTabs.vue","../src/tabs/index.js","../src/popup/ZuiPopup.vue","../src/popup/index.js","../src/popup-selector/ZuiPopupSelector.vue","../src/popup-selector/index.js","../src/license-plate-input/Index.vue","../src/license-plate-input/index.js","../src/user-picker/SearchBar.vue","../src/assets/avatar-default.png","../src/user-picker/SearchView.vue","../src/user-picker/ZuiUserPicker.vue","../src/user-picker/index.js","../src/red-dot/ZuiRedDot.vue","../src/red-dot/index.js"],"sourcesContent":["<template>\n  <div class=\"zui-attachment\" :class=\"{ disabled }\">\n    <ul v-if=\"attachments && attachments.length\" class=\"attachments\">\n      <li v-for=\"(item, idx) in attachments\" :key=\"idx\" class=\"attachment clickable\" @click=\"onAttachmentClick(item)\">\n        <span class=\"name\">{{ item.name }}</span>\n        <i\n          v-if=\"!readonly && editActions.includes('remove')\"\n          class=\"remove iconfont-zui icon-zui-x clickable\"\n          @click.stop=\"!disabled && onRemoveAttachment(idx)\"\n        ></i>\n      </li>\n    </ul>\n    <div\n      v-if=\"!readonly && (attachments && attachments.length) < max && editActions.includes('add')\"\n      class=\"add-btn\"\n      :class=\"[disabled]\"\n    >\n      <div class=\"icon iconfont-zui icon-zui-plus\"></div>\n      <input class=\"add\" type=\"file\" accept=\"*/*\" @change=\"onFileChange\" ref=\"fileDom\" :disabled=\"disabled\" />\n    </div>\n    <div v-if=\"readonly && (!attachments || !attachments.length)\" class=\"empty\">未上传</div>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, watch } from 'vue'\n\nconst emit = defineEmits(['update:modelValue', 'fileSelect', 'attachmentClick'])\n\nconst props = defineProps({\n  modelValue: {\n    type: Array as () => Array<any>,\n    default: () => []\n  },\n  max: { type: Number, default: 3 },\n  /**\n   * 可执行操作 add：增加，remove：移除\n   */\n  editActions: { type: Array, default: ['add', 'remove'] },\n  disabled: Boolean,\n  readonly: Boolean\n})\n\nconst attachments = ref(props.modelValue)\nwatch(attachments, (val) => {\n  emit('update:modelValue', val)\n})\n\nwatch(\n  () => props.modelValue,\n  (val) => {\n    attachments.value = val\n  },\n  { immediate: true }\n)\n\nconst fileDom = ref()\n\nfunction onFileChange() {\n  const file = fileDom.value.files[0]\n  emit('fileSelect', file)\n  fileDom.value.value = ''\n}\n\nfunction onRemoveAttachment(idx) {\n  attachments.value.splice(idx, 1)\n}\n\nfunction onAttachmentClick(attachment) {\n  emit('attachmentClick', attachment)\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.zui-attachment {\n  width: 100%;\n  box-sizing: border-box;\n  background: #ffffff;\n  &.disabled {\n    opacity: 0.5;\n  }\n  .attachments {\n    &:not(:last-child) {\n      margin-bottom: 8px;\n    }\n    .attachment {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      border-radius: var(--zui-size-border-radius-small);\n      padding: 6px 16px;\n      line-height: var(--zui-size-line-height-regular);\n      background-color: var(--zui-color-fill-light);\n      color: var(--zui-color-primary);\n\n      &:not(:first-child) {\n        margin-top: 8px;\n      }\n\n      .name {\n        flex: 1;\n        white-space: nowrap;\n        text-overflow: ellipsis;\n        overflow: hidden;\n      }\n      .remove {\n        flex: none;\n        margin-left: 16px;\n        color: var(--zui-color-text-secondary);\n        font-size: var(--size-text-regular);\n      }\n    }\n  }\n  .add-btn {\n    position: relative;\n    overflow: hidden;\n    height: 32px;\n    width: 100%;\n    border: 1px solid rgba($color: #e4e7ed, $alpha: 0.61);\n    border-radius: 6px;\n    box-sizing: border-box;\n    box-shadow: var(--zui-box-shadow);\n    .icon:not(.disabled):active {\n      background: var(--zui-color-gray-light);\n    }\n    .icon {\n      display: inline-block;\n      position: absolute;\n      top: 0;\n      left: 0;\n      right: 0;\n      bottom: 0;\n      line-height: 30px;\n      text-align: center;\n      color: var(--zui-color-text-secondary);\n      font-size: var(--zui-size-text-regular);\n    }\n    .add {\n      opacity: 0;\n      position: absolute;\n      left: 0;\n      right: 0;\n      top: 0;\n      bottom: 0;\n    }\n  }\n  .empty {\n    color: var(--zui-color-text-secondary);\n    line-height: var(--zui-size-line-height-regular);\n    padding: 6px 12px;\n    background-color: var(--zui-color-fill-light);\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport Attachment from './ZuiAttachment.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiAttachment', Attachment)\n  }\n}\n\nexport { Attachment }\n","// 单文件引入方式\n\nimport Button from './ZuiButton.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiButton', Button)\n  }\n}\n\nexport { Button }\n","<!-- updated at 2022/04/11 -->\n<template>\n  <div class=\"zui-calendar\">\n    <div class=\"week\">\n      <span class=\"day\" v-for=\"day in '一二三四五六日'\" :key=\"day\">\n        {{ day }}\n      </span>\n    </div>\n    <div class=\"dates\">\n      <div class=\"date-block\" v-for=\"i in dayOffset\" :key=\"i\"></div>\n      <div class=\"date-block\" v-for=\"day in days\" :key=\"day.num\">\n        <div\n          class=\"date\"\n          :class=\"{ highlight: day.bottomText, today: isToday(day.date), exceeded: isExceeded(day.date) }\"\n          @click=\"onDateClick(day)\"\n        >\n          <span class=\"date-num\" :class=\"{ active: isCurDate(day.date) }\">{{ day.text }}</span>\n          <span v-if=\"day.bottomText\" class=\"bottom-text\"> {{ day.bottomText }}</span>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script setup>\nimport dateUtils from '@nmgolden/date-utils'\nimport { computed, ref, watch } from 'vue'\n\nconst emit = defineEmits(['dateClick', 'dateChange', 'update:curDate'])\nconst props = defineProps({\n  monthDate: {\n    type: Object,\n    default: () => new Date()\n  },\n  curDate: {\n    type: Object,\n    default: () => new Date()\n  },\n  // 最小可选日期，默认60天前\n  minDate: { type: Date, default: dateUtils.getDateByOffset(-60) },\n  // 最大可选日期，默认今天\n  maxDate: { type: Date, default: new Date() },\n  formatter: Function\n})\n\nconst curDate = ref()\n\nconst days = computed(() => {\n  const lastDate = dateUtils.getLastDateOfMonth(props.monthDate)\n  const amount = lastDate.getDate()\n\n  // 构造日期数组\n  const days = []\n  for (let i = 0; ++i <= amount; ) {\n    days.push({ date: getDateByDateNum(i), num: i, text: i.toString(), bottomText: '' })\n  }\n\n  // 调用外部格式化方法格式化日期数据\n  if (props.formatter) {\n    return days.map((item) => {\n      return props.formatter(item)\n    })\n  } else {\n    return days\n  }\n\n  function getDateByDateNum(dateNum) {\n    const [year, month, day] = [props.monthDate.getFullYear(), props.monthDate.getMonth(), dateNum]\n    return new Date(year, month, day)\n  }\n})\n\nconst dayOffset = computed(() => {\n  const firstDate = dateUtils.getFirstDateOfMonth(props.monthDate)\n  const firstDay = firstDate.getDay()\n  return (firstDay - 1 + 7) % 7\n})\n\nwatch(\n  () => props.curDate,\n  (value) => {\n    curDate.value = value\n  }\n)\n\nwatch(curDate, (value) => {\n  emit('dateChange', value)\n  emit('update:curDate', value)\n})\n\nfunction isToday(date) {\n  return dateUtils.isToday(date)\n}\n\nfunction isCurDate(date) {\n  return dateUtils.isSameDate(curDate.value, date)\n}\n\nfunction isExceeded(date) {\n  return date > props.maxDate || date < props.minDate\n}\n\nfunction onDateClick(day) {\n  if (isExceeded(day.date)) {\n    return\n  }\n  curDate.value = day.date\n  emit('dateClick', day)\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.zui-calendar {\n  .week {\n    color: var(--zui-color-text-secondary);\n    background: var(--zui-color-gray-light);\n    padding: 4px 0;\n    .day {\n      display: inline-block;\n      width: 14.28%;\n      text-align: center;\n    }\n  }\n  .dates {\n    display: flex;\n    flex-wrap: wrap;\n    .date-block {\n      display: block;\n      width: 14.28%;\n      min-height: 60px;\n      padding: 8px 2px 0 2px;\n      box-sizing: border-box;\n      .date {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        width: 100%;\n        padding: 10px 0 10px 0px;\n\n        &.highlight {\n          border-top: 1px solid var(--zui-color-primary);\n          background: rgba(var(--zui-color-primary-rgb), 0.08);\n          padding-bottom: 4px;\n          padding-top: 4px;\n        }\n        &.today {\n          .date-num {\n            color: var(--zui-color-primary);\n            font-weight: bold;\n          }\n        }\n        &.exceeded {\n          .date-num {\n            color: var(--zui-color-text-placeholder);\n          }\n        }\n        .date-num {\n          width: 24px;\n          height: 24px;\n          line-height: 24px;\n          border-radius: 14px;\n          text-align: center;\n          &.active {\n            background: var(--zui-color-primary);\n            color: #ffffff;\n            font-weight: bold;\n          }\n        }\n        .bottom-text {\n          font-size: var(--zui-size-text-xsmall);\n          color: var(--zui-color-text-secondary);\n          margin-top: 2px;\n        }\n      }\n    }\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport Calendar from './ZuiCalendar.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiCalendar', Calendar)\n  }\n}\n\nexport { Calendar }\n","<!-- updated 2022/1/30-->\n<template>\n  <div class=\"zui-deletable\" :class=\"{ 'hover-shadow': hoverShadow }\">\n    <slot></slot>\n    <!-- <div v-if=\"show\" class=\"delete-wrap\">\n      <el-popconfirm\n        v-if=\"needPrompt\"\n        :confirm-button-text=\"confirmText\"\n        :cancel-button-text=\"cancelText\"\n        icon-color=\"red\"\n        :title=\"promptTitle\"\n        @confirm=\"onDelete\"\n      >\n        <template #reference>\n          <button class=\"delete-btn\" :class=\"[size]\"><i class=\"iconfont icon-x\"></i></button>\n        </template>\n      </el-popconfirm>\n      <button v-else class=\"delete-btn\" :class=\"[size]\" @click=\"onDelete\"><i class=\"iconfont icon-x\"></i></button>\n    </div> -->\n  </div>\n</template>\n\n<script>\nexport default {\n  emits: ['delete'],\n  props: {\n    /**\n     * 大小【large：默认，small】\n     */\n    size: {\n      type: String,\n      default: 'large'\n    },\n    show: {\n      type: Boolean,\n      default: true\n    },\n    hoverShadow: {\n      type: Boolean,\n      default: false\n    },\n    needPrompt: {\n      type: Boolean,\n      default: true\n    },\n    promptTitle: {\n      type: String,\n      default: '确认删除?'\n    },\n    confirmText: {\n      type: String,\n      default: '删除'\n    },\n    cancelText: {\n      type: String,\n      default: '取消'\n    }\n  },\n  methods: {\n    onDelete() {\n      this.$emit('delete')\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.zui-deletable {\n  position: relative;\n  cursor: pointer;\n  transition: all 0.2s ease-in;\n\n  &.hover-shadow:hover {\n    opacity: 0.8;\n    box-shadow: 0px 0px 12px 3px rgba($color: var(--zui-color-primary), $alpha: 0.4);\n  }\n\n  .delete-btn {\n    position: absolute;\n    top: -16px;\n    right: -16px;\n    width: 24px;\n    height: 24px;\n    border: 1px solid var(--zui-color-border-light);\n    border-radius: 12px;\n    box-sizing: border-box;\n    background: #ffffff;\n    box-shadow: var(--zui-box-shadow);\n    color: var(--zui-color-text-placeholder);\n    transition: all 0.2s ease-in-out;\n    font-weight: bold;\n    color: var(--zui-color-red);\n    &.small {\n      top: -12px;\n      right: -12px;\n      width: 20px;\n      height: 20px;\n      .iconfont {\n        font-size: 12px;\n      }\n    }\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport Deletable from './ZuiDeletable.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiDeletable', Deletable)\n  }\n}\nexport { Deletable }\n","<template>\n  <template v-if=\"!preview\">\n    <div\n      class=\"zui-input\"\n      :class=\"{\n        round,\n        border: !hideBorder,\n        disabled,\n        'zui-input-large': size === 'large',\n        'zui-input-small': size === 'small',\n        multiline: multiline\n      }\"\n    >\n      <slot name=\"prefix\"></slot>\n      <input\n        class=\"input\"\n        v-if=\"!autoHeight && !multiline\"\n        :style=\"inputStyle\"\n        :type=\"showPassword ? 'text' : type\"\n        :placeholder=\"placeholder\"\n        v-model=\"value\"\n        :maxlength=\"maxWordLength\"\n        :disabled=\"disabled\"\n        :readonly=\"readonly\"\n        @blur=\"$emit('blur')\"\n        ref=\"inputRef\"\n      />\n      <textarea\n        v-else\n        class=\"textarea\"\n        :style=\"inputStyle\"\n        :type=\"type\"\n        :placeholder=\"placeholder\"\n        v-model=\"value\"\n        :rows=\"autoHeight ? 1 : lines\"\n        :disabled=\"disabled\"\n        :readonly=\"readonly\"\n        ref=\"textareaRef\"\n        @blur=\"$emit('blur')\"\n      ></textarea>\n      <span v-if=\"showWordLimit\" class=\"word-limit\" :class=\"{ danger: maxReached }\" :style=\"wordLimitPaddingStyle\"\n        ><span class=\"current\">{{ !value ? 0 : String(value).length }}</span\n        >/{{ maxWordLength }}</span\n      >\n      <span class=\"clear clickable\" :style=\"clearCss\" v-if=\"value && clearable\" @click.stop=\"onClearTap\">\n        <i class=\"icon iconfont-zui icon-zui-clear\"></i>\n      </span>\n      <div v-if=\"showEye\" class=\"eye-wrap\" @click=\"onEyeClick\">\n        <span\n          v-if=\"type == 'password'\"\n          class=\"icon iconfont-zui\"\n          :class=\"{\n            'icon-zui-eye': showPassword,\n            'icon-zui-eye-slash': !showPassword\n          }\"\n        ></span>\n      </div>\n      <slot name=\"suffix\"></slot>\n    </div>\n  </template>\n  <template v-else>\n    <div class=\"zui-input preview\">\n      <span v-if=\"modelValue\">{{ modelValue }}</span>\n      <span v-else class=\"empty\">未填写</span>\n    </div>\n  </template>\n</template>\n<script lang=\"ts\" setup>\nimport { ref, computed, watch, CSSProperties, reactive, nextTick, onMounted } from 'vue'\n\nconst emit = defineEmits(['update:modelValue', 'blur'])\n\nconst props = defineProps({\n  textAlign: {\n    type: String,\n    default: 'left'\n  },\n  // input 的 type 目前只支持 text、 number、password\n  type: String,\n  // 尺寸大小 small/(default)/large\n  size: String,\n  // 自动行高，true 时自动忽略 multiline 配置\n  autoHeight: Boolean,\n  // 多行显示\n  multiline: Boolean,\n  // 行高 默认3行\n  lines: { type: Number, default: 3 },\n  hideBorder: Boolean,\n  round: Boolean,\n  padding: { type: String, default: '6px 8px 6px 12px' },\n  placeholder: String,\n  modelValue: { type: [String, Number], default: '' },\n  showWordLimit: Boolean,\n  maxWordLength: {\n    type: Number,\n    default: 99999\n  },\n  clearable: Boolean,\n  disabled: Boolean,\n  readonly: Boolean,\n  preview: Boolean,\n  // 显示眼睛\n  showEye: Boolean,\n  autoFocus: Boolean\n})\n\n//***** 输入内容 *****/\nconst inputRef = ref()\nconst value = ref(props.modelValue)\nwatch(\n  () => props.modelValue,\n  (val) => {\n    value.value = val\n  }\n)\nwatch(value, (val) => {\n  emit('update:modelValue', val)\n})\n\n//***** 组件样式 *****/\nconst inputStyle: CSSProperties = {\n  textAlign: props.textAlign,\n  padding: props.padding\n} as CSSProperties\n\nconst paddingRight = computed(() => {\n  const paddingStyle = inputStyle.padding || '0'\n  const paddings = paddingStyle.toString().split(' ')\n  if (paddings.length == 4) {\n    return paddings[1]\n  } else if (paddings.length == 2) {\n    return paddings[1]\n  } else if (paddings.length == 1) {\n    return paddings[0]\n  }\n  return '8px'\n})\n\n//***** 多行文本 (自动高度)*****/\nconst forceUpdateKey = ref(0)\nconst textareaRef = ref()\nwatch(value, (newVal, oldVal) => {\n  if (oldVal == newVal) {\n    return\n  }\n  if (props.autoHeight) {\n    forceUpdateKey.value += 1\n    nextTick(() => {\n      changeTextareaHeight()\n    })\n  }\n\n  function changeTextareaHeight() {\n    if (!textareaRef.value) {\n      return\n    }\n    var scrollHeight = textareaRef.value.scrollHeight\n    var height = textareaRef.value.offsetHeight\n\n    textareaRef.value.style.height = 'auto'\n    // 最高 200 px\n    textareaRef.value.style.height = Math.min(textareaRef.value.scrollHeight - 8, 200) + 'px'\n    if (height <= scrollHeight) {\n    }\n  }\n})\n\n//***** 字数限制 *****/\nconst maxReached = computed(() => {\n  return value.value && String(value.value).length >= props.maxWordLength\n})\n\nwatch(value, (inputValue) => {\n  if (maxReached.value) {\n    value.value = String(inputValue).substring(0, props.maxWordLength)\n  }\n})\n\nconst wordLimitPaddingStyle = computed(() => {\n  return {\n    paddingLeft: '0px',\n    paddingRight: value.value && props.clearable ? '0px' : paddingRight.value\n  } as CSSProperties\n})\n\n//***** 清空 ******/\nconst clearCss: CSSProperties = {\n  paddingLeft: '8px',\n  paddingRight: paddingRight.value\n} as CSSProperties\n\nfunction onClearTap() {\n  value.value = ''\n}\n\n//***** 眼睛 *****//\nconst showPassword = ref(false)\nfunction onEyeClick() {\n  showPassword.value = !showPassword.value\n  console.log('showPassword.value :>> ', showPassword.value)\n}\n\n//***** 自动聚焦 *****//\n\nonMounted(() => {\n  if (props.autoFocus) {\n    const dom = inputRef.value || textareaRef.value\n    dom && dom.focus()\n  }\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.zui-input {\n  width: 100%;\n  box-sizing: border-box;\n  display: flex;\n  background-color: #ffffff;\n  box-sizing: border-box;\n  transition: border 0.2s ease-out;\n  .input {\n    width: 100%;\n    box-sizing: border-box;\n    line-height: var(--zui-size-line-height-regular);\n    &::placeholder {\n      color: var(--zui-color-text-placeholder);\n    }\n  }\n  .textarea {\n    width: 100%;\n    resize: none;\n    line-height: var(--zui-size-line-height-regular);\n    &::placeholder {\n      color: var(--zui-color-text-placeholder);\n    }\n  }\n  .word-limit {\n    display: flex;\n    align-items: center;\n    color: var(--zui-color-text-placeholder);\n    font-size: var(--zui-size-text-small);\n    line-height: var(--zui-size-line-height-regular);\n    &.danger {\n      color: var(--zui-color-red);\n    }\n  }\n  .clear {\n    display: flex;\n    align-items: center;\n    color: var(--zui-color-text-placeholder);\n    opacity: 0.6;\n    .icon {\n      font-weight: normal;\n      font-size: var(--zui-size-text-large);\n    }\n  }\n  .eye-wrap {\n    display: flex;\n    flex: none;\n    width: 32px;\n    align-items: center;\n    text-align: left;\n    cursor: pointer;\n    .icon {\n      color: var(--zui-color-text-secondary);\n      font-size: 18px;\n    }\n  }\n  &.zui-input-small {\n    font-size: var(--zui-size-text-small);\n    input {\n      line-height: var(--zui-size-line-height-small);\n      padding: 3px 12px;\n    }\n  }\n  &.disabled {\n    opacity: 0.5;\n  }\n  &.border {\n    border: 1px solid var(--zui-color-border);\n    &:not(.disabled):hover {\n      border-color: var(--zui-color-primary);\n    }\n  }\n  &.round {\n    border-radius: var(--zui-size-border-radius-small);\n  }\n  &.preview {\n    line-height: var(--zui-size-line-height-regular);\n    border-radius: var(--zui-size-border-radius-small);\n    padding: 6px 12px;\n    background-color: var(--zui-color-fill-light);\n    user-select: text;\n    .empty {\n      color: var(--zui-color-text-secondary);\n    }\n  }\n  &.multiline {\n    position: relative;\n    .word-limit {\n      right: 0;\n      bottom: 0;\n      position: absolute;\n      background-color: #ffffff;\n    }\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport Input from './ZuiInput.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiInput', Input)\n  }\n}\n\nexport { Input }\n","<template>\n  <div\n    class=\"zui-field\"\n    :class=\"{\n      'label-position-top': labelPosition == 'top',\n      round,\n      shadow: showShadow,\n      padding,\n      clickable,\n      'fade-label': fadeLabel && value\n    }\"\n    :style=\"style\"\n  >\n    <h1\n      v-if=\"!hideLabel\"\n      class=\"label-wrap\"\n      :class=\"[labelStyle, label ? 'label-min-width' : '']\"\n      :style=\"{ color: labelColor }\"\n    >\n      <label>{{ label }}</label\n      ><span v-if=\"required\" class=\"required\">*</span>\n    </h1>\n    <slot name=\"accessory\">\n      <div class=\"accessory\">\n        <span class=\"value-wrap\">\n          <h5 v-if=\"value\" class=\"value\">{{ value }}</h5>\n          <span v-else class=\"placeholder\">{{ placeholder }}</span>\n        </span>\n\n        <i v-if=\"showArrowRight\" class=\"arrow-right iconfont-zui icon-zui-arrow-right-round\" />\n      </div>\n    </slot>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nconst props = defineProps({\n  round: Boolean,\n  showShadow: Boolean,\n  // 内边距\n  padding: String,\n  hideLabel: Boolean,\n  // label 位置 top/left\n  labelPosition: {\n    type: String,\n    default: 'left'\n  },\n  clickable: {\n    type: Boolean,\n    default: true\n  },\n  label: String,\n  labelColor: {\n    type: String,\n    default: ''\n  },\n  // 标签样式 weak/normal/strong/xstrong\n  labelStyle: {\n    type: String,\n    default: 'strong'\n  },\n  required: Boolean,\n  fadeLabel: Boolean,\n  value: [String, Number, Boolean],\n  placeholder: String,\n  showArrowRight: {\n    type: Boolean,\n    default: true\n  }\n})\n\nconst style = { padding: props.padding || '12px 20px' }\n</script>\n\n<style lang=\"scss\" scoped>\n.zui-field {\n  position: relative;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  width: 100%;\n  box-sizing: border-box;\n  background: #ffffff;\n  &.label-position-top {\n    flex-direction: column;\n    align-items: flex-start;\n\n    .accessory {\n      margin-top: 8px;\n      width: 100%;\n      justify-content: space-between;\n      .value-wrap {\n        justify-content: space-between;\n      }\n    }\n  }\n  &.round {\n    border-radius: var(--zui-size-border-radius-regular);\n  }\n  &.shadow {\n    box-shadow: var(--zui-box-shadow);\n  }\n  &.clickable:active {\n    background: rgba($color: #ffffff, $alpha: 0.49);\n  }\n\n  &.fade-label {\n    .left {\n      h1 {\n        font-size: var(--zui-size-text-regular);\n        color: var(--zui-color-text-secondary);\n        font-weight: normal;\n      }\n    }\n    .accessory {\n      h5 {\n        font-size: var(--zui-size-text-large);\n      }\n    }\n  }\n  .label-wrap {\n    text-align: left;\n    transition: all 0.2s ease-in-out;\n    line-height: var(--zui-size-line-height-regular);\n    font-size: var(--zui-size-text-regular);\n    &.label-min-width {\n      min-width: 30%;\n    }\n    &.strong {\n      font-weight: bold;\n      font-size: var(--zui-size-text-regular);\n    }\n    &.xstrong {\n      font-weight: bold;\n      font-size: var(--zui-size-text-large);\n    }\n    &.weak {\n      color: var(--color-text-secondary);\n    }\n    .required {\n      padding: 0 4px;\n      color: var(--zui-color-red);\n    }\n  }\n  .accessory {\n    color: var(--zui-color-text-primary);\n    flex: 1 auto;\n    text-align: justify;\n    text-align-last: left;\n    display: flex;\n    align-items: center;\n    justify-content: flex-end;\n    .arrow-right {\n      font-size: var(--zui-size-text-small);\n      color: var(--zui-color-text-secondary);\n      margin-left: 4px;\n    }\n\n    .placeholder {\n      color: var(--zui-color-text-placeholder);\n    }\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport Field from './ZuiField.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiField', Field)\n  }\n}\n\nexport { Field }\n","<template>\n  <!-- 字段分组 -->\n  <div\n    class=\"zui-field-group\"\n    :class=\"{\n      'top-border': borders === 'top' || borders === 'all',\n      'bottom-border': borders === 'bottom' || borders === 'all'\n    }\"\n    :style=\"style\"\n  >\n    <header>\n      <slot name=\"header\">\n        <h1 v-if=\"title\" class=\"title\" :class=\"[titleStyle, titlePosition]\">{{ title }}</h1>\n      </slot>\n    </header>\n    <main class=\"fields\" :class=\"{ divider }\">\n      <slot></slot>\n    </main>\n  </div>\n</template>\n\n<script setup>\nconst props = defineProps({\n  title: String,\n  // 标题样式 weak/(default)/strong\n  titleStyle: {\n    type: String,\n    default: 'strong'\n  },\n  // 标题位置 inner/outer\n  titlePosition: {\n    type: String,\n    default: 'inner'\n  },\n  // 边框 all/top/bottom/none\n  borders: {\n    type: String,\n    default: 'none'\n  },\n  // 内部分隔线\n  divider: {\n    type: Boolean,\n    default: true\n  }\n})\n\nconst style = { 'border-top-width': props.titlePosition == 'outer' ? '0.5px' : '' }\n</script>\n\n<style lang=\"scss\" scoped>\n.zui-field-group {\n  overflow: hidden;\n  border-color: var(--zui-color-divider);\n  border-style: solid;\n\n  &.top-border {\n    border-top-width: 0.5px;\n  }\n  &.bottom-border {\n    border-bottom-width: 0.5px;\n  }\n  header {\n    .title {\n      padding: 0 20px 8px 20px;\n      line-height: var(--zui-size-line-height-regular);\n      color: var(--zui-color-text-secondary);\n\n      &.weak {\n        line-height: var(--zui-size-line-height-small);\n        font-size: var(--zui-size-text-small);\n      }\n      &.outer {\n        background-color: #ffffff;\n      }\n    }\n  }\n  :deep(.fields) {\n    .zui-field {\n      position: relative;\n      border-radius: 0;\n      box-shadow: none;\n    }\n  }\n  :deep(.fields.divider) {\n    > * {\n      position: relative;\n      &:not(:last-child):after {\n        content: ' ';\n        display: block;\n        position: absolute;\n        bottom: 0;\n        right: 0;\n        left: 20px;\n        height: 0.5px;\n        background: var(--zui-color-divider);\n      }\n    }\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport FieldGroup from './ZuiFieldGroup.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiFieldGroup', FieldGroup)\n  }\n}\n\nexport { FieldGroup }\n","<template>\n  <div class=\"zui-input-field\" :class=\"{ 'label-position-top': labelPosition == 'top' }\">\n    <zui-field\n      class=\"field\"\n      :padding=\"fieldPadding\"\n      :required=\"required\"\n      :label-position=\"labelPosition\"\n      :label-style=\"labelStyle\"\n      :round=\"round\"\n      :show-shadow=\"showShadow\"\n      :label=\"label\"\n      :clickable=\"false\"\n    >\n      <template #accessory>\n        <zui-input\n          padding=\"8px 0\"\n          class=\"input\"\n          :type=\"type\"\n          :show-border=\"false\"\n          v-model=\"value\"\n          :multiline=\"multiline\"\n          :show-word-limit=\"showWordLimit\"\n          :max-word-length=\"maxWordLength\"\n          :placeholder=\"placeholder\"\n          :clearable=\"clearable\"\n          :textAlign=\"textAlign\"\n          :readonly=\"readonly\"\n        />\n      </template>\n    </zui-field>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\n\nconst emit = defineEmits(['update:modelValue'])\n\nconst props = defineProps({\n  modelValue: String,\n  type: String,\n  round: Boolean,\n  showShadow: Boolean,\n  labelPosition: String,\n  //weak/normal/strong\n  labelStyle: String,\n  label: String,\n  required: Boolean,\n  multiline: Boolean,\n  showWordLimit: Boolean,\n  maxWordLength: Number,\n  placeholder: String,\n  clearable: Boolean,\n  textAlign: String,\n  readonly: Boolean\n})\n\nconst fieldPadding = props.labelPosition == 'top' ? '16px 20px 12px 20px' : '4px 20px'\n\nconst value = ref(props.modelValue)\nwatch(\n  () => props.modelValue,\n  (val) => {\n    value.value = val\n  }\n)\nwatch(value, (inputValue) => {\n  emit('update:modelValue', inputValue)\n})\n</script>\n<style lang=\"scss\" scoped>\n.zui-input-field {\n  &.label-position-top {\n    .input {\n      margin-top: 4px;\n    }\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport InputField from './ZuiInputField.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiInputField', InputField)\n  }\n}\n\nexport { InputField }\n","// 单文件引入方式\n\nimport Loading from './ZuiLoading.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiLoading', Loading)\n  }\n}\n\nexport { Loading }\n","<template>\n  <div class=\"zui-image-uploader\" :class=\"{ disabled }\">\n    <ul class=\"images\">\n      <li v-for=\"(url, idx) in imageUrls\" :key=\"idx\" class=\"image-wrap clickable\" @click=\"onImageClick(idx)\">\n        <img class=\"image\" :src=\"url\" />\n        <div class=\"tags-wrap\">\n          <ul v-if=\"images[idx]['tags']\" class=\"tags\">\n            <li v-for=\"(tag, tagIdx) in images[idx]['tags']\" :key=\"tagIdx\">{{ tag }}</li>\n          </ul>\n          <zui-loading v-if=\"images[idx]['loading']\" class=\"loading\" position=\"inline\" size=\"small\" />\n        </div>\n\n        <span v-if=\"!readonly && editActions.includes('remove')\" class=\"remove-wrap\">\n          <i class=\"remove iconfont-zui icon-zui-x clickable\" @click.stop=\"onRemoveClick(idx)\"></i>\n        </span>\n      </li>\n      <li\n        v-if=\"!readonly && imageUrls.length < max && editActions.includes('add')\"\n        class=\"image-wrap add-btn\"\n        @click=\"onAddClick\"\n      >\n        <div class=\"icon iconfont-zui icon-zui-camera\"></div>\n      </li>\n    </ul>\n    <div v-if=\"readonly && !images.length\" class=\"empty\">未上传</div>\n  </div>\n</template>\n\n<script setup>\nimport { ref, watch, computed } from 'vue'\nimport ZuiLoading from '../loading'\n\nconst emit = defineEmits(['update:modelValue', 'addClick', 'imageClick', 'remove'])\n\nconst props = defineProps({\n  modelValue: { type: Array, default: [] },\n  disabled: Boolean,\n  readonly: Boolean,\n  padding: { type: String, default: '16px 20px' },\n  /**\n   * 可执行操作 add：增加，remove：移除\n   */\n  editActions: { type: Array, default: ['add', 'remove'] },\n  max: {\n    type: Number,\n    default: 9\n  }\n})\n\nconst images = ref()\nconst imageUrls = computed(() => {\n  return images.value.map((item) => item.url)\n})\n\nwatch(images, (val) => [emit('update:modelValue', val)])\nwatch(\n  () => props.modelValue,\n  (val) => {\n    images.value = val\n  },\n  {\n    immediate: true\n  }\n)\n\n//***** 上传 *****/\nasync function onAddClick() {\n  emit('addClick')\n}\n\n//***** 移除 *****/\nfunction onRemoveClick(idx) {\n  emit('remove', idx)\n}\n\n//***** 预览 *****/\nfunction onImageClick(idx) {\n  emit('imageClick', idx)\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.zui-image-uploader {\n  width: 100%;\n  box-sizing: border-box;\n  &.disabled {\n    opacity: 0.5;\n  }\n  .images {\n    text-align: left;\n    margin: -8px 0 0 -8px;\n\n    .image-wrap {\n      display: inline-block;\n      position: relative;\n      margin-left: 8px;\n      margin-top: 8px;\n      width: 64px;\n      height: 64px;\n      background-color: var(--zui-color-background);\n      border-radius: var(--zui-size-border-radius-small);\n\n      .image {\n        object-fit: cover;\n        width: 100%;\n        height: 100%;\n        border-radius: var(--zui-size-border-radius-small);\n      }\n      .tags-wrap {\n        position: absolute;\n        top: 0;\n        right: 0;\n        bottom: 0;\n        left: 0;\n        border-radius: var(--size-border-radius-small);\n        overflow: hidden;\n        .tags {\n          position: absolute;\n          bottom: 0;\n          left: 0;\n          right: 0;\n          padding: 4px 0;\n          font-size: var(--zui-size-text-small);\n          line-height: 1.2em;\n          color: #ffffff;\n          text-align: center;\n          background-color: rgba(0, 0, 0, 0.5);\n        }\n        .loading {\n          position: absolute;\n          top: 50%;\n          left: 50%;\n          width: 100%;\n          transform: translateY(-50%) translateX(-50%);\n        }\n      }\n\n      .remove-wrap {\n        display: block;\n        position: absolute;\n        top: -8px;\n        right: -8px;\n        width: 20px;\n        height: 20px;\n        border-radius: 50%;\n        box-shadow: var(--zui-box-shadow);\n        background-color: #ffffff;\n        .remove {\n          width: 16px;\n          height: 16px;\n          line-height: 16px;\n          text-align: center;\n          background-color: var(--zui-color-text-secondary);\n          border-radius: 50%;\n          position: absolute;\n          left: 50%;\n          top: 50%;\n          transform: translateX(-50%) translateY(-50%);\n          font-size: var(--zui-size-text-xsmall);\n          color: #ffffff;\n        }\n      }\n\n      &.add-btn {\n        position: relative;\n        .icon {\n          position: absolute;\n          top: 50%;\n          left: 50%;\n          transform: translateX(-50%) translateY(-50%);\n          color: var(--zui-color-text-secondary);\n          font-size: 32px;\n        }\n      }\n    }\n  }\n  .empty {\n    margin-top: 8px;\n    border-radius: var(--zui-size-border-radius-small);\n    line-height: var(--zui-size-line-height-regular);\n    padding: 6px 12px;\n    background-color: var(--zui-color-fill-light);\n    color: var(--zui-color-text-secondary);\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport ImageUploader from './Index.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiImageUploader', ImageUploader)\n  }\n}\n\nexport { ImageUploader }\n","<template>\n  <div class=\"zui-month\">\n    <div v-if=\"showYear\" class=\"year-wrap\">\n      <div class=\"left btn-wrap\">\n        <zui-button circle type=\"secondary\" size=\"small\" :disabled=\"!canPrevYearClick\" @click=\"onPrevYearClick\"\n          ><i class=\"icon-left iconfont-zui icon-zui-arrow-left\"></i\n        ></zui-button>\n      </div>\n      <span class=\"year\">{{ curYear }}年</span>\n\n      <div class=\"right btn-wrap\">\n        <zui-button circle type=\"secondary\" :disabled=\"!canNextYearClick\" size=\"small\" @click=\"onNextYearClick\"\n          ><i class=\"icon-right iconfont-zui icon-zui-arrow-right\"></i\n        ></zui-button>\n      </div>\n    </div>\n    <ul class=\"month-wrap\">\n      <li\n        class=\"month\"\n        :class=\"{ active: isCurMonth(month), disabled: !allowExceed && exceeded(month) }\"\n        v-for=\"month in 12\"\n        :key=\"month\"\n        @click=\"onMonthClick(month, $event)\"\n        ref=\"monthRefs\"\n      >\n        {{ month }}{{ !isCurMonth(month) ? '月' : '' }}\n      </li>\n    </ul>\n  </div>\n</template>\n<script setup>\nimport { computed, nextTick, onMounted, ref, watch } from 'vue'\nimport dateUtils from '@nmgolden/date-utils'\n\nconst emit = defineEmits(['update:modelValue', 'yearChange', 'monthChange'])\n\nconst props = defineProps({\n  modelValue: { type: Date, default: () => new Date() },\n  maxDate: {\n    type: Date,\n    default: dateUtils.getFirstDateOfMonth(dateUtils.getToday())\n  },\n  minDate: {\n    type: Date,\n    default: new Date(2021, 0, 1)\n  },\n  showYear: { type: Boolean, default: true },\n  allowExceed: Boolean\n})\n\nconst curDate = ref(props.modelValue)\nconst monthRefs = ref()\nconst curYear = computed(() => {\n  if (!curDate.value) {\n    return\n  }\n  return curDate.value.getFullYear()\n})\n\nconst curMonth = computed(() => {\n  if (!curDate.value) {\n    return\n  }\n  return curDate.value.getMonth() + 1\n})\n\nconst canPrevYearClick = computed(() => {\n  return curYear.value > props.minDate.getFullYear()\n})\n\nconst canNextYearClick = computed(() => {\n  return curYear.value < props.maxDate.getFullYear()\n})\n\nwatch(\n  () => props.modelValue,\n  (value) => {\n    curDate.value = value\n  }\n)\nwatch(curDate, (value) => {\n  emit('update:modelValue', value)\n})\nwatch(curYear, (value, old) => {\n  emit('yearChange', value)\n})\nwatch(curMonth, (val, old) => {\n  emit('monthChange', val)\n  nextTick(() => {\n    monthRefs.value[val - 1].scrollIntoView()\n  })\n})\n\nonMounted(() => {\n  curDate.value = props.modelValue\n})\n\n// 初始化\nif (!curDate.value) {\n  curDate.value = dateUtils.getFirstDateOfMonth(dateUtils.getToday())\n}\n\nfunction isCurMonth(month) {\n  if (!curDate.value) {\n    return false\n  }\n  return month - 1 == curDate.value.getMonth()\n}\n\nfunction exceeded(month) {\n  const exceedMax =\n    curYear.value > props.maxDate.getFullYear() ||\n    (curYear.value == props.maxDate.getFullYear() && month - 1 > props.maxDate.getMonth())\n  const exceedMin =\n    curYear.value < props.minDate.getFullYear() ||\n    (curYear.value == props.minDate.getFullYear() && month - 1 < props.minDate.getMonth())\n  return exceedMax || exceedMin\n}\n\nfunction onMonthClick(month) {\n  if (!props.allowExceed && exceeded(month)) {\n    return\n  }\n  const newDate = new Date(Date.UTC(curYear.value, month - 1, 1))\n  curDate.value = newDate\n}\nfunction onPrevYearClick() {\n  const newDate = new Date(Date.UTC(curYear.value - 1, 0, 1))\n  curDate.value = newDate\n}\nfunction onNextYearClick() {\n  const newDate = new Date(Date.UTC(curYear.value + 1, 0, 1))\n  curDate.value = newDate\n}\n</script>\n<style lang=\"scss\">\n.zui-month {\n  .year-wrap {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    padding-bottom: 16px;\n    .btn-wrap {\n      .iconfont-zui {\n        font-size: var(--zui-size-text-small);\n        line-height: 28px;\n      }\n    }\n  }\n  .month-wrap {\n    width: 100%;\n    overflow: auto;\n    white-space: nowrap;\n    padding-bottom: 16px;\n    padding-right: 20px;\n    box-sizing: border-box;\n    .month {\n      display: inline-block;\n      width: 28px;\n      height: 28px;\n      line-height: 28px;\n      text-align: center;\n      &:not(:first-child) {\n        margin-left: 20px;\n      }\n      &.active {\n        background: var(--zui-color-primary);\n        border-radius: 16px;\n        color: #ffffff;\n      }\n      &.disabled {\n        color: var(--zui-color-text-placeholder);\n      }\n    }\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport Month from './ZuiMonth.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiMonth', Month)\n  }\n}\n\nexport { Month }\n","<!--updated at 2022/04/09-->\n<template>\n  <div class=\"zui-placeholder\">\n    <div class=\"content-wrap\">\n      <i v-if=\"type == 'empty'\" class=\"icon iconfont-zui icon-zui-empty\"></i>\n      <i v-else-if=\"type == 'network-error'\" class=\"icon iconfont-zui icon-zui-network-error\"></i>\n      <h5 class=\"title\">{{ computedTitle }}</h5>\n      <zui-button v-if=\"showButton\" class=\"button\" round size=\"small\" type=\"primary\" @click=\"onBtnTap\">\n        {{ computedButtonText }}\n      </zui-button>\n    </div>\n  </div>\n</template>\n\n<script>\n// 载入此组件时就加载图片，避免后期网络错误时才加载图片导致的图片无法显示问题！\nconst types = { EMPTY: 'empty', NETWORK_ERROR: 'network-error' }\nexport default {\n  emits: ['buttonClick'],\n  components: {},\n  props: {\n    // 状态 empty空，network-error网络异常\n    type: {\n      type: String,\n      default: types.EMPTY\n    },\n    title: String,\n    showButton: Boolean,\n    buttonText: String\n  },\n  data() {\n    return {}\n  },\n  computed: {\n    computedButtonText() {\n      if (this.buttonText) {\n        return this.buttonText\n      }\n      if (this.type == types.EMPTY) {\n        return '添加'\n      }\n\n      if (this.type == types.NETWORK_ERROR) {\n        return '重新加载'\n      }\n    },\n    computedTitle() {\n      if (this.title) {\n        return this.title\n      } else {\n        if (this.type == types.EMPTY) {\n          return '暂无内容'\n        } else if (this.type == types.NETWORK_ERROR) {\n          return '网络错误请重试'\n        }\n      }\n      return '空'\n    }\n  },\n  methods: {\n    onBtnTap() {\n      this.$emit('buttonClick')\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.zui-placeholder {\n  width: 100%;\n  height: 100%;\n  box-sizing: border-box;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  .content-wrap {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    transform: translateY(-10%);\n    .icon {\n      font-size: 48px;\n      line-height: 1em;\n      color: var(--zui-color-primary);\n    }\n    .title {\n      color: var(--zui-color-text-placeholder);\n      margin-top: 8px;\n      line-height: 1em;\n      font-size: var(--zui-size-text-small);\n    }\n    .button {\n      margin-top: 24px;\n      padding: 0 16px;\n    }\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport Placeholder from './ZuiPlaceholder.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiPlaceholder', Placeholder)\n  }\n}\n\nexport { Placeholder }\n","<!-- updated 2022/1/31 -->\n<template>\n  <div class=\"zui-switch\">\n    <div class=\"switch\" :class=\"{ negative: !value }\" @click=\"value = !value\">\n      <em></em>\n      <span class=\"yes\">{{ yesText }}</span>\n      <span class=\"no\">{{ noText }}</span>\n    </div>\n  </div>\n</template>\n\n<script setup>\nimport { ref, watch } from 'vue'\nconst emit = defineEmits(['update:modelValue'])\nconst props = defineProps({\n  modelValue: Boolean,\n  yesText: {\n    type: String,\n    default: '是'\n  },\n  noText: {\n    type: String,\n    default: '否'\n  }\n})\n\nconst value = ref(!!props.modelValue)\nwatch(\n  () => props.modelValue,\n  (val) => {\n    value.value = val\n  }\n)\nwatch(value, (val) => {\n  emit('update:modelValue', val)\n})\n</script>\n\n<style scoped lang=\"scss\">\n.zui-switch {\n  cursor: pointer;\n  display: inline-block;\n  .switch {\n    width: 100px;\n    height: 32px;\n    line-height: 32px;\n    box-shadow: var(--zui-box-shadow);\n    position: relative;\n    color: var(--zui-color-text-primary);\n    padding: 0 5px;\n    box-sizing: border-box;\n    border-radius: 3px;\n    > span {\n      display: inline-block;\n      width: 50%;\n      position: relative;\n      text-align: center;\n    }\n    > h1 {\n      text-align: right;\n    }\n    > em {\n      position: absolute;\n      display: inline-block;\n      width: 44px;\n      height: 26px;\n      background: var(--zui-color-primary);\n      left: 5px;\n      top: 3px;\n      border-radius: 3px;\n      transition: left 0.2s ease-in-out;\n    }\n    .yes {\n      color: #ffffff;\n      transition: color 0.2s ease-in-out;\n    }\n    .no {\n      color: var(--zui-color-text-primary);\n      transition: color 0.2s ease-in-out;\n    }\n  }\n\n  .negative {\n    > em {\n      left: 51px;\n    }\n    .yes {\n      color: var(--zui-color-text-primary);\n    }\n    .no {\n      color: #ffffff !important;\n    }\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport Switch from './ZuiSwitch.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiSwitch', Switch)\n  }\n}\n\nexport { Switch }\n","<template>\n  <div class=\"zui-switch-field\" :class=\"{ 'label-position-top': labelPosition == 'top' }\">\n    <zui-field\n      class=\"field\"\n      :padding=\"fieldPadding\"\n      :label-position=\"labelPosition\"\n      :label-style=\"labelStyle\"\n      :round=\"round\"\n      :show-shadow=\"showShadow\"\n      :label=\"label\"\n      :clickable=\"false\"\n    >\n      <template #accessory>\n        <zui-switch v-model=\"value\" :yes-Text=\"yesText\" :no-text=\"noText\" />\n      </template>\n    </zui-field>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\n\nconst emit = defineEmits(['update:modelValue'])\nconst props = defineProps({\n  modelValue: Boolean,\n  round: Boolean,\n  showShadow: Boolean,\n  labelPosition: String,\n  // weak/normal/strong\n  labelStyle: String,\n  label: String,\n  yesText: String,\n  noText: String\n})\n\nconst value = ref(props.modelValue)\nwatch(\n  () => props.modelValue,\n  (val) => {\n    value.value = val\n  }\n)\nwatch(value, (inputValue) => {\n  emit('update:modelValue', inputValue)\n})\n\nconst fieldPadding = props.labelPosition == 'top' ? '16px 20px 12px 20px' : '4px 20px'\n</script>\n<style lang=\"scss\" scoped></style>\n","// 单文件引入方式\n\nimport SwitchField from './ZuiSwitchField.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiSwitchField', SwitchField)\n  }\n}\n\nexport { SwitchField }\n","<template>\n  <div class=\"sortable-inputs\">\n    <div class=\"items\" ref=\"items\">\n      <div v-for=\"(item, idx) in datas\" :key=\"(item as string)\" class=\"item\">\n        <label v-if=\"idx != datas.length - 1\" class=\"remove clickable\"\n          ><i class=\"icon iconfont-zui icon-zui-remove\" @click=\"onRemove(idx, item)\"></i\n        ></label>\n        <label v-if=\"showSequence\" class=\"sequence\">{{ idx + 1 }}.</label>\n        <zui-input\n          class=\"input\"\n          clear\n          placeholder=\"点击输入\"\n          text-align=\"left\"\n          :show-border=\"false\"\n          v-model=\"datas[idx]['text']\"\n          padding=\"12px 8px\"\n          clearable\n        />\n        <label v-if=\"idx != datas.length - 1\" class=\"sort clickable\">\n          <i class=\"icon iconfont-zui icon-zui-sort\"></i\n        ></label>\n      </div>\n    </div>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport Sortable from 'sortablejs'\nimport { nextTick, ref, watch, CSSProperties } from 'vue'\n\nconst emit = defineEmits(['update:modelValue'])\n\nconst props = defineProps({\n  modelValue: { default: () => [], type: Array },\n  showSequence: Boolean\n})\n\n//***** 数据 *****/\nconst datas = ref([...props.modelValue, { text: '' }])\nwatch(\n  () => props.modelValue,\n  (value) => {\n    datas.value = [...value, { text: '' }]\n  }\n)\n//***** 排序 *****/\nconst items = ref()\n\nnextTick(() => {\n  Sortable.create(items.value, {\n    handle: '.sort',\n    onEnd: function (evt) {\n      // 元素放到目标位置，其余元素（拖动开始到拖动结束位置直接的元素）向上顶或向下压\n      const { oldIndex: startIndex, newIndex: endIndex } = evt\n      const dragData = datas.value[startIndex]\n      datas.value.splice(startIndex, 1)\n      datas.value.splice(endIndex, 0, dragData)\n    }\n  })\n})\n\n//***** 保证末尾有一个空元素 *****/\nwatch(\n  datas,\n  (newValue: any) => {\n    const lastData = newValue[newValue.length - 1]\n    if (lastData.text) {\n      datas.value.push({ text: '' })\n    }\n    if (newValue.length > 1) {\n      const penultData = newValue[newValue.length - 2]\n      if (!penultData.text) {\n        datas.value.pop()\n      }\n    }\n  },\n  { deep: true }\n)\n\n//***** 移除 *****/\nfunction onRemove(idx, item) {\n  datas.value.splice(idx, 1)\n}\n\n//***** 监听条目变化 发送更新事件*****/\nwatch(\n  datas,\n  (newValue) => {\n    const resolvedValue = newValue.slice(0, newValue.length - 1)\n    if (JSON.stringify(resolvedValue) == JSON.stringify(props.modelValue)) {\n      return\n    }\n\n    emit('update:modelValue', resolvedValue)\n  },\n  { deep: true }\n)\n</script>\n<style lang=\"scss\" scoped>\n.sortable-inputs {\n  width: 100%;\n  .item {\n    position: relative;\n    display: flex;\n    align-items: center;\n    background-color: #ffffff;\n    &.item:not(:last-child)::after {\n      position: absolute;\n      bottom: 0;\n      left: 20px;\n      height: 0.5px;\n      width: calc(100% - 20px);\n      content: '';\n      display: inline-block;\n      background-color: var(--color-divider-light);\n    }\n    &.item:not(:first-child):last-child {\n      padding-left: 22px;\n    }\n    .remove {\n      margin-right: 8px;\n      width: 16px;\n      .icon {\n        color: var(--zui-color-red);\n      }\n    }\n    .sequence {\n      min-width: 20px;\n      color: var(--zui-color-text-placeholder);\n    }\n    .input {\n      padding: 0 16px 0 0;\n    }\n    .sort {\n      color: var(--zui-color-primary);\n      .icon {\n        font-size: 20px;\n      }\n    }\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport SortableInputs from './ZuiSortableInputs.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiSortableInputs', SortableInputs)\n  }\n}\n\nexport { SortableInputs }\n","<template>\n  <div class=\"zui-sortable-inputs-field\" :class=\"{ 'label-position-top': labelPosition == 'top' }\">\n    <zui-field\n      class=\"field\"\n      :padding=\"fieldPadding\"\n      :label-position=\"labelPosition\"\n      :label-style=\"labelStyle\"\n      :round=\"round\"\n      :show-shadow=\"showShadow\"\n      :label=\"label\"\n      :clickable=\"false\"\n      :required=\"required\"\n    >\n      <template #accessory>\n        <zui-sortable-inputs class=\"inputs\" v-model=\"value\" :options=\"options\" :multiple=\"multiple\" itemPadding=\"0px\" />\n      </template>\n    </zui-field>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\n\nconst emit = defineEmits(['update:modelValue'])\n\nconst props = defineProps({\n  modelValue: Array,\n  options: Array,\n  multiple: Boolean,\n  round: Boolean,\n  showShadow: Boolean,\n  labelPosition: String,\n  // weak/normal/strong\n  labelStyle: String,\n  label: String,\n  required: Boolean\n})\n\nconst fieldPadding = props.labelPosition == 'top' ? '16px 20px 12px 20px' : '0px 20px'\n\nconst value = ref(props.modelValue)\nwatch(\n  () => props.modelValue,\n  (val) => {\n    value.value = val\n  }\n)\nwatch(value, (inputValue) => {\n  emit('update:modelValue', inputValue)\n})\n</script>\n<style lang=\"scss\" scoped>\n.zui-sortable-inputs-field {\n  &.label-position-top {\n    .inputs {\n      width: 100%;\n      margin-top: 4px;\n    }\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport SortableInputsField from './ZuiSortableInputsField.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiSortableInputsField', SortableInputsField)\n  }\n}\n\nexport { SortableInputsField }\n","<template>\n  <div\n    class=\"zui-selector\"\n    :class=\"{ multiple, disabled, readonly, row: direction == 'row', column: direction == 'column' }\"\n  >\n    <div class=\"options\">\n      <div\n        v-for=\"(option, idx) in options\"\n        class=\"option\"\n        :class=\"{ active: selectedOptionIndex.includes(idx), disabled, readonly }\"\n        :key=\"idx\"\n        @click=\"onOptionClick(idx)\"\n      >\n        <i class=\"icon iconfont-zui\" :class=\"[getOptionIconClass(idx)]\"></i>\n        <span class=\"label\">{{ option.label }}</span>\n        <zui-input\n          v-if=\"option.editable\"\n          class=\"zui-input\"\n          v-model=\"option.addition\"\n          @click.stop=\"onInputClick(idx)\"\n          :disabled=\"!selectedOptionIndex.includes(idx)\"\n          @blur=\"emitUpdateModelValueEvent\"\n          placeholder=\"请填写\"\n          round\n        />\n      </div>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, computed } from 'vue'\nimport ZuiInput from '../input/ZuiInput.vue'\n\nconst emit = defineEmits(['update:modelValue'])\nconst props = defineProps({\n  multiple: Boolean,\n  modelValue: {\n    type: Array,\n    default: () => []\n  },\n  options: {\n    type: Array as () => Array<any>,\n    default: function () {\n      return [\n        { label: '选项1', value: '选项值2' },\n        { label: '选项2', value: '选项值1' }\n      ]\n    }\n  },\n  // row、column\n  direction: {\n    type: String,\n    default: 'row'\n  },\n  disabled: Boolean,\n  readonly: Boolean\n})\n\n//***** 已选 *****/\nconst selectedOptionIndex = ref()\nconst displayText = computed(() => {\n  return props.modelValue\n    .map((option: any) => {\n      return option.addition ? `${option.label}(${option.addition})` : option.label\n    })\n    .join('/')\n})\n\nwatch(\n  () => props.modelValue,\n  (val: any) => {\n    // 初始化modelValue\n    if (!val) {\n      if (!props.options) {\n        return\n      }\n      selectedOptionIndex.value = props.options.filter((option) => option.checked).map((option, idx) => idx)\n      emitUpdateModelValueEvent()\n    } else {\n      // 挑出匹配的选项\n      selectedOptionIndex.value = val\n        .map((selectedVal: any) => {\n          return props.options.findIndex((item: any) => {\n            if (typeof selectedVal === 'string') {\n              return item.value === selectedVal\n            } else {\n              return item.value === selectedVal.value\n            }\n          })\n        })\n        .filter((idx: Number) => idx > -1)\n    }\n  },\n  { immediate: true }\n)\n\nfunction emitUpdateModelValueEvent() {\n  if (!selectedOptionIndex.value) {\n    return\n  }\n  const values = selectedOptionIndex.value.sort().map((idx: any) => {\n    return props.options[idx]\n  })\n\n  emit('update:modelValue', values)\n}\n\n// 切换多选单选时需要清空已选\nwatch(\n  () => props.multiple,\n  (val) => {\n    if (!val) {\n      selectedOptionIndex.value.length = 0\n    }\n  }\n)\n\nfunction getOptionIconClass(idx: Number) {\n  if (!props.multiple) {\n    if (selectedOptionIndex.value.includes(idx)) {\n      return 'icon-zui-radio-selected'\n    }\n    return 'icon-zui-radio-unselected'\n  } else {\n    if (selectedOptionIndex.value.includes(idx)) {\n      return 'icon-zui-checkbox-checked'\n    }\n    return 'icon-zui-checkbox-unchecked'\n  }\n}\n\n//***** 选择 *****/\nfunction onOptionClick(idx: Number) {\n  if (props.readonly || props.disabled) {\n    return\n  }\n  toggleOption(idx, false)\n  emitUpdateModelValueEvent()\n}\n\nfunction toggleOption(idx: Number, onlyCheck: Boolean) {\n  if (props.multiple) {\n    console.log('当前 idx', idx)\n    if (selectedOptionIndex.value.includes(idx)) {\n      if (!onlyCheck) {\n        const target = selectedOptionIndex.value.findIndex((i: Number) => idx == i)\n        selectedOptionIndex.value.splice(target, 1)\n      }\n    } else {\n      selectedOptionIndex.value.push(idx)\n    }\n  } else {\n    if (selectedOptionIndex.value.includes(idx)) {\n      if (!onlyCheck) {\n        selectedOptionIndex.value.length = 0\n      }\n    } else {\n      selectedOptionIndex.value.length = 0\n      selectedOptionIndex.value.push(idx)\n    }\n  }\n}\n\nfunction onInputClick(idx: Number) {\n  toggleOption(idx, true)\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.zui-selector {\n  width: 100%;\n  text-align: left;\n  background: #ffffff;\n  position: relative;\n  &.disabled {\n    opacity: 0.5;\n  }\n  &.readonly {\n    line-height: var(--zui-size-line-height-regular);\n    padding: 6px 12px;\n    box-sizing: border-box;\n    border-radius: var(--zui-size-border-radius-small);\n    background-color: var(--zui-color-fill-light);\n    .icon {\n      opacity: 0.5;\n    }\n  }\n  .options {\n    display: flex;\n    flex-wrap: wrap;\n    margin-left: -16px;\n\n    .option {\n      display: flex;\n      align-items: flex-start;\n      box-sizing: border-box;\n      line-height: 32px;\n      margin-left: 16px;\n      .icon {\n        display: inline-block;\n        width: 16px;\n        height: 16px;\n        line-height: 32px;\n        font-size: 19px;\n        color: var(--zui-color-text-secondary);\n      }\n\n      .label {\n        margin-left: 8px;\n        line-height: 32px;\n        min-height: 32px;\n      }\n      .zui-input {\n        display: inline-block;\n        margin-left: 8px;\n      }\n      &.active {\n        color: var(--zui-color-primary);\n        .icon {\n          color: var(--zui-color-primary);\n        }\n      }\n      &.readonly {\n        &.active {\n          color: var(--color-text-primary);\n          .icon {\n            color: var(--zui-color-text-primary);\n          }\n        }\n      }\n      &:not(.disabled):active {\n        background: rgba($color: #f0f0f0, $alpha: 0.49);\n      }\n    }\n  }\n  &.column {\n    .options {\n      flex-direction: column;\n    }\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport Selector from './ZuiSelector.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiSelector', Selector)\n  }\n}\n\nexport { Selector }\n","<template>\n  <div class=\"zui-selector-field\" :class=\"{ 'label-position-top': labelPosition == 'top' }\">\n    <zui-field\n      class=\"field\"\n      :padding=\"padding\"\n      :label-position=\"labelPosition\"\n      :label-style=\"labelStyle\"\n      :round=\"round\"\n      :show-shadow=\"showShadow\"\n      :label=\"label\"\n      :clickable=\"false\"\n      :required=\"required\"\n      :hide-label=\"hideLabel\"\n    >\n      <template #accessory>\n        <zui-selector\n          class=\"selector\"\n          v-model=\"value\"\n          :options=\"options\"\n          :multiple=\"multiple\"\n          optionPadding=\"0px 0px\"\n          :direction=\"direction\"\n          :disabled=\"readonly\"\n        />\n      </template>\n    </zui-field>\n  </div>\n</template>\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\n\nconst emit = defineEmits(['update:modelValue'])\n\nconst props = defineProps({\n  modelValue: Array,\n  options: Array,\n  multiple: Boolean,\n  round: Boolean,\n  showShadow: Boolean,\n  labelPosition: String,\n  // weak/normal/strong\n  labelStyle: String,\n  label: String,\n  required: Boolean,\n  readonly: Boolean,\n  padding: String,\n  hideLabel: Boolean,\n\n  // 显示方向 row/column\n  direction: {\n    type: String,\n    default: 'row'\n  }\n})\n\nconst value = ref(props.modelValue)\nwatch(\n  () => props.modelValue,\n  (val) => {\n    value.value = val\n  }\n)\nwatch(value, (val) => {\n  emit('update:modelValue', val)\n})\n</script>\n<style lang=\"scss\" scoped>\n.zui-selector-field {\n  &.label-position-top {\n    .selector {\n      width: 100%;\n      margin-top: 4px;\n    }\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport SelectorField from './ZuiSelectorField.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiSelectorField', SelectorField)\n  }\n}\n\nexport { SelectorField }\n","<template>\n  <div class=\"zui-tabs\" :class=\"{ 'align-left': alignTabs === 'left', 'align-center': alignTabs === 'center' }\">\n    <div\n      v-for=\"(label, idx) in labels\"\n      :key=\"idx\"\n      class=\"item\"\n      :class=\"{ active: activeIndex == idx }\"\n      @click=\"activeIndex = idx\"\n      ref=\"items\"\n    >\n      {{ label }}\n    </div>\n\n    <div v-if=\"activeItemDom\" class=\"cursor\" :style=\"{ left: cursorOffsetX + 'px', width: cursorWidth + 'px' }\"></div>\n  </div>\n</template>\n<script setup>\nimport { getCurrentInstance, onMounted, ref, watch } from 'vue'\n\nconst emit = defineEmits(['update:activeIndex'])\n\nconst props = defineProps({\n  activeIndex: Number,\n  labels: Array,\n  alignTabs: {\n    type: String,\n    default: 'left'\n  }\n})\nconst itemDoms = ref()\nconst activeItemDom = ref()\n\nconst activeIndex = ref(props.activeIndex)\nconst cursorOffsetX = ref(0)\nconst cursorWidth = ref(0)\n\nwatch(\n  () => props.activeIndex,\n  (value) => {\n    activeIndex.value = value\n  }\n)\nwatch(activeIndex, (value) => {\n  if (itemDoms.value) {\n    activeItemDom.value = itemDoms.value[value]\n  }\n\n  emit('update:activeIndex', value)\n})\n\nwatch(activeItemDom, (value) => {\n  cursorOffsetX.value = value.offsetLeft + 8\n  cursorWidth.value = value.clientWidth - 16\n})\n\nonMounted(() => {\n  self.value = getCurrentInstance()\n  itemDoms.value = getCurrentInstance().refs.items\n  const activeItem = itemDoms.value[activeIndex.value]\n  activeItemDom.value = activeItem\n})\n</script>\n<style lang=\"scss\" scoped>\n.zui-tabs {\n  display: flex;\n  position: relative;\n  box-shadow: var(--box-shadow);\n  &.align-center {\n    justify-content: center;\n  }\n  &.align-left {\n    .item {\n      &:first-child {\n        margin-left: 0;\n      }\n    }\n  }\n\n  .item {\n    margin: 0 8px;\n    padding: 8px 8px 10px 8px;\n    cursor: pointer;\n\n    &.active {\n      color: var(--zui-color-primary);\n      font-weight: bold;\n    }\n    &:hover {\n      color: var(--zui-color-primary);\n    }\n  }\n  .cursor {\n    position: absolute;\n    bottom: 0;\n    left: 100px;\n    height: 2px;\n    width: 0px;\n    background-color: var(--zui-color-primary);\n    transition: left 0.2s ease-in-out;\n    border-radius: 2px;\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport Tabs from './ZuiTabs.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiTabs', Tabs)\n  }\n}\n\nexport { Tabs }\n","<template>\n  <Teleport to=\"body\">\n    <Transition name=\"modal\">\n      <div v-if=\"show\" class=\"popup\">\n        <div class=\"mask\" @click=\"show = false\"></div>\n        <div class=\"container\">\n          <slot></slot>\n        </div>\n      </div>\n    </Transition>\n  </Teleport>\n</template>\n\n<script setup scoped>\nimport { ref, watch } from 'vue'\n\nconst props = defineProps({ show: Boolean })\nconst emit = defineEmits(['update:show'])\n\nconst show = ref()\nwatch(show, (val) => {\n  emit('update:show', val)\n})\nwatch(\n  () => props.show,\n  (val) => {\n    show.value = val\n  },\n  { immediate: true }\n)\n</script>\n\n<style lang=\"scss\">\n.popup {\n  position: fixed;\n  z-index: 9998;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  transition: all 0.2s ease-out;\n  .mask {\n    position: absolute;\n    width: 100%;\n    height: 100%;\n    background-color: rgba(0, 0, 0, 0.4);\n    display: table;\n    transition: opacity 0.2s ease-out;\n  }\n  .container {\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    border-top-left-radius: var(--zui-size-border-radius-regular);\n    border-top-right-radius: var(--zui-size-border-radius-regular);\n    overflow: auto;\n    max-height: 90vh;\n    /* ios */\n    @supports (-webkit-touch-callout: none) {\n      padding-bottom: constant(safe-area-inset-bottom); /*兼容 IOS<11.2*/\n      padding-bottom: env(safe-area-inset-bottom); /*兼容 IOS>11.2*/\n    }\n\n    background-color: #ffffff;\n    transition: transform 0.2s ease-out;\n  }\n}\n.modal-enter-from,\n.modal-leave-to {\n  .mask {\n    opacity: 0;\n  }\n  .container {\n    transform: translateY(100%);\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport ZuiPopup from './ZuiPopup.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiPopup', ZuiPopup)\n  }\n}\n","<template>\n  <template v-if=\"!readonly\">\n    <div class=\"popup-selector\">\n      <ZuiInput\n        placeholder=\"请选择\"\n        round\n        readonly\n        @click=\"!disabled && (showPopup = true)\"\n        :modelValue=\"displayText\"\n        :disabled=\"disabled\"\n      >\n        <template #suffix>\n          <i class=\"icon-down iconfont-zui icon-zui-arrow-down\"></i>\n        </template>\n      </ZuiInput>\n      <ZuiPopup v-model:show=\"showPopup\">\n        <div class=\"popup-content\">\n          <header class=\"header\">{{ title }}</header>\n          <main class=\"main\">\n            <ZuiSelector :=\"$attrs\" v-model=\"modelValue\" />\n          </main>\n          <footer class=\"footer\">\n            <ZuiButton class=\"confirm-btn\" type=\"primary\" @click=\"onConfirmClick\">确定</ZuiButton>\n          </footer>\n        </div>\n      </ZuiPopup>\n    </div>\n  </template>\n  <template v-else>\n    <div class=\"popup-selector readonly\">\n      <span v-if=\"displayText\">{{ displayText }}</span>\n      <span v-else class=\"empty\">未选择</span>\n    </div>\n  </template>\n</template>\n\n<script setup>\nimport { ref, watch, computed } from 'vue'\nimport ZuiInput from '../input/ZuiInput.vue'\nimport ZuiSelector from '../selector/ZuiSelector.vue'\nimport ZuiPopup from '../popup/ZuiPopup.vue'\nimport ZuiButton from '../button/ZuiButton.vue'\n\nconst emit = defineEmits(['update:modelValue'])\nconst props = defineProps({\n  modelValue: { type: Array, default: () => [] },\n  title: { type: String, default: '请选择' },\n  disabled: Boolean,\n  readonly: Boolean\n})\n\nconst showPopup = ref(false)\nconst modelValue = ref()\nconst displayText = computed(() => {\n  return props.modelValue\n    .map((option) => {\n      return option.addition ? `${option.label}(${option.addition})` : option.label\n    })\n    .join('/')\n})\n\nwatch(\n  () => props.modelValue,\n  (val) => {\n    modelValue.value = JSON.parse(JSON.stringify(val))\n  },\n  { immediate: true }\n)\nwatch(showPopup, (val) => {\n  if (val) {\n    // 显示时使用外部数据初始化本地数据\n    modelValue.value = JSON.parse(JSON.stringify(props.modelValue))\n  }\n})\n\nfunction onConfirmClick() {\n  showPopup.value = false\n  emit('update:modelValue', modelValue.value)\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.popup-selector {\n  &.readonly {\n    line-height: var(--zui-size-line-height-regular);\n    padding: 6px 12px;\n    box-sizing: border-box;\n    border-radius: var(--zui-size-border-radius-small);\n    background-color: var(--zui-color-fill-light);\n    .empty {\n      color: var(--zui-color-text-secondary);\n    }\n  }\n  .icon-down {\n    line-height: 32px;\n    padding: 0 12px;\n    color: var(--zui-color-text-secondary);\n  }\n}\n.popup-content {\n  .header {\n    font-size: var(--zui-size-text-large);\n    line-height: var(--zui-size-line-height-large);\n    padding: 12px 20px;\n    text-align: center;\n  }\n  .main {\n    padding: 12px 20px;\n    max-height: 70vh;\n    overflow: auto;\n  }\n  .footer {\n    padding: 0 20px 24px 20px;\n    .confirm-btn {\n      width: 100%;\n    }\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport ZuiPopupSelector from './ZuiPopupSelector.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiPopupSelector', ZuiPopupSelector)\n  }\n}\n","<template>\n  <div class=\"license-plate-input\">车牌输入框</div>\n</template>\n\n<script setup></script>\n\n<style lang=\"scss\" scoped></style>\n","// 单文件引入方式\n\nimport Index from './Index.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiLicensePlateInput', Index)\n  }\n}\n","<template>\n  <div class=\"search-bar\">\n    <div class=\"input-wrap\">\n      <div class=\"icon iconfont-zui icon-zui-search\"></div>\n      <input class=\"input\" v-model=\"inputValue\" type=\"text\" placeholder=\"搜索\" />\n      <div v-if=\"modelValue\" class=\"clear iconfont-zui icon-zui-clear\" @click=\"onClearClick\"></div>\n    </div>\n  </div>\n</template>\n\n<script setup>\nimport { computed } from 'vue'\n\nconst props = defineProps({ modelValue: String })\nconst emit = defineEmits(['update:modelValue'])\n\nconst inputValue = computed({\n  set(v) {\n    emit('update:modelValue', v)\n  },\n  get() {\n    return props.modelValue\n  }\n})\nfunction onClearClick() {\n  emit('update:modelValue', undefined)\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.search-bar {\n  background-color: #ffffff;\n  padding: 8px 20px;\n  .input-wrap {\n    padding: 0 10px;\n    display: flex;\n    align-items: center;\n    background-color: var(--zui-color-background);\n    border-radius: var(--zui-size-border-radius-small);\n    .icon {\n      color: var(--zui-color-text-secondary);\n    }\n    .input {\n      margin-left: 8px;\n      height: 32px;\n      flex: 1;\n      &::placeholder {\n        color: var(--zui-color-text-placeholder);\n      }\n    }\n    .clear {\n      color: var(--zui-color-text-secondary);\n      cursor: pointer;\n    }\n  }\n}\n</style>\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAgKADAAQAAAABAAAAgAAAAABrRiZNAAAGQ0lEQVR4Ae2cZ0/sSgyGzwKH3nsVEogi8f//Ch9oovfeO/e9rBStdkNuxvHYDtf5gEIy9njeJ1OSmdnK6enpHz/0FGjSy9pz/lcBB6D8HDgAB6CsgHL2XgMcgLICytl7DXAAygooZ+81wAEoK6CcvdcAB6CsgHL2XgMcgLICytl7DXAAygooZ+81wAEoK6CcvdcAB6CsgHL2XgMcgLICytl7DXAAygooZ+81wAEoK6CcvdcAB6CsgHL2XgMcgLICytl7DVAG0KKcf2D2b29v19fXt7e3Ly8vr6+v+Le5ufnv99HZ2dnf39/T01OpVAK9aiavlGWDBnQ/PDy8v7/PVgs8BgcHJycn29raslMauVsCAA8PD7u7u3d3d/klQyUYGxsDhpYW61XcOoDj4+O9vb2vr6/86icpUQkWFxc7OjqSKwZP7AKA6FtbWxcXF0VUQ4s0Nzc3MDBQxElUW7ujoO3t7YLqQ7iPj4+NjQ102lFFLOLcKICjo6Ozs7MiBUtsUZPA4Pn5Obli6sQiAPS6aPcZZXp/fwcDWkfCGEaqK4sAdnZ2UmMtcvHx8fH8/LyIh0i25gBcXl7+52CfpsXBwcHn5yfNNp6VOQDxXgzx5nx1dRVPSppnWwDQWAe9cIWWGdUr1CR2elsA8IRG7Spvbm6stUK2AGD8E/WJg/pPT09Rswh1bgsAvm6GFiA0PXqCUJOo6W0BEFBHgHEQMFsABBpogSxKDAAzK0HRExJb+0Btqwa0trYSNA0yEcgiKJ7/HYD29vYggWIntgUAk7pRC4zJGa8BWQp3d3dH7QYMzszYqgGAgyn1LETF7kV1TgvNHADMpGMekVaYbKuhoSEsXclOI3/XHAA0QePj4+xCYJ3E9PQ0u9viDs0BQJEmJibYlzJMTU3ZXClkEUBTU9PS0hLjGxMaH7RsxZ/WGB4sAkA5MVjEkh6QKF5mLFbEypTifiJ5YChhpMgwJF1ZWSnYbgwPDy8vL1teLWp3YVaVK+bIsDwLC0NDMaP2zMzMYIFiqKFweusAqnJgZdX+/n7OyXo87yMjI+h1o77TcXEqB4AEAyZ1Ma2ItemN5YfuaLXwMQNdrrXvDY3RJlfKBCAJGsvcMHWDA7MraGrwpENxfGVjHDglecU+sb56O7X80BpH6q3SXbQ7CiqdlLSAHQBNNzYrB8AmJc1RmfoAvBPkL2RZOmS7ADDUwfsXVipitAPp8Tdo0RxGpRgaAQP+4msEhqc2+21zw1CM8bE+F9KzL2HDF1ZgGB0dLfh5I38tzJPSEAA85tiIenJyEvSk5ylkbRrUDFMbKK0AwJ4kqI8tXbVixTvHpBs+UGPiIV4WOT3rA4Dom5ubhM9tOUuYkQwt0vz8fKQZ0Ix8a28pA0BPu76+zt7c15Yw+xwdw8LCgmL/rPkegP52dXVVUX2wQe6IIfXrXjY5rrtqANDlrq2tBQ3tucpc50c3Eh0AGOdg36jus1+LAZFo7WPVAYABj7Xd64gHUdVSkTlXAIB3Wgw6ZYoXlAuiQmxBJsUTKwCwuV8XUmLvBmIrrmmQB2kAaG1t7livqobYhHsmaQAoYdQvDUFPX2NixCb8fEgDMLhVug6DcISiAPCLGYqvPHVC//QvIkScP91lvy4KwOBPNaQKKhmnKACzv5pUh0EyTlEA1jZJ1+me/CsZpygA+decRNOgE8k4HUAKml8LwNrPBKRo/31JMk7RGlCapSKCv7crCqCvr++nh87UdcntxKIAZmdnsYLclNaNweApQZyN1yNdkZ4TxscWvOvjR1mx4srURyFMzff29mLFCv5G0jrVrTSAJAh0dHjjx4FXf4y7MfDA8ggcuI4DbKoH0uMksQo9wSqgqgm2EeAcB06gNQ50SNWNBVg619XVxb4xNmeoagByxvfrk4n2Ab9eTUIBHQBBNE4TB8CpJsGXAyCIxmniADjVJPhyAATROE0cAKeaBF8OgCAap4kD4FST4MsBEETjNHEAnGoSfDkAgmicJg6AU02CLwdAEI3TxAFwqknw5QAIonGaOABONQm+HABBNE4TB8CpJsGXAyCIxmniADjVJPhyAATROE0cAKeaBF8OgCAap4kD4FST4MsBEETjNHEAnGoSfDkAgmicJg6AU02CLwdAEI3T5B8HhzBOy5pk+AAAAABJRU5ErkJggg==\"","<template>\n  <div class=\"search-view\">\n    <div class=\"records-wrap\">\n      <ul class=\"records\">\n        <li\n          v-for=\"(user, idx) in records\"\n          :class=\"{\n            disabled: disabledUserIds && disabledUserIds.includes(user.id),\n            selected: selectedUserIds && selectedUserIds.includes(user.id)\n          }\"\n          :key=\"idx\"\n          class=\"record\"\n          @click=\"onUserClick(user)\"\n        >\n          <span\n            class=\"radio iconfont-zui\"\n            :class=\"[\n              selectedUserIds && selectedUserIds.includes(user.id)\n                ? 'icon-zui-radio-selected'\n                : 'icon-zui-radio-unselected'\n            ]\"\n          ></span>\n          <img class=\"avatar\" :src=\"user.avatarUrl || avatarDefault\" alt=\"\" />\n          <span class=\"name\">{{ user.name }}</span>\n          <span class=\"info iconfont-zui icon-zui-info\" @click.stop=\"$emit('infoClick', user)\"></span>\n        </li>\n      </ul>\n    </div>\n    <zui-loading v-if=\"status === 0\" />\n    <div v-if=\"status === 2\" class=\"empty-wrap\">\n      <div class=\"icon iconfont-zui icon-zui-empty\"></div>\n    </div>\n  </div>\n</template>\n\n<script setup>\nimport { watch, ref } from 'vue'\nimport avatarDefault from '../assets/avatar-default.png'\n\nconst props = defineProps({ searchText: String, search: Function, disabledUserIds: Array, selectedUserIds: Array })\nconst emit = defineEmits(['select', 'unselect', 'infoClick'])\n\n// 状态 0:搜索中，1:搜索成功，2:搜索无结果，-1:搜索失败\nconst status = ref(0)\nconst pageNum = ref(1)\nconst records = ref()\nconst search = _throttle(function (val) {\n  props.search &&\n    props.search(\n      { searchText: val, pageNum: 1 },\n      (data) => {\n        status.value = 1\n        records.value = data.records\n        console.log('返回数据data :>> ', data)\n      },\n      (err) => {\n        status.value = -1\n      }\n    )\n}, 500)\n\nwatch(\n  () => props.searchText,\n  (val) => {\n    val && search(val)\n  },\n  {\n    immediate: true\n  }\n)\n\nfunction _throttle(func, delay) {\n  let lastCallTime = 0 // 上次函数调用时间\n  return function (...args) {\n    const now = Date.now()\n    if (now - lastCallTime >= delay) {\n      // 如果距离上次调用的时间大于等于指定的延迟时间，则执行函数\n      func.apply(this, args)\n      lastCallTime = now\n    }\n  }\n}\n\n//***** 分页 *****//\n\n//***** 选择 *****//\nfunction onUserClick(user) {\n  if (props.disabledUserIds && props.disabledUserIds.includes(user.id)) {\n    return\n  }\n  console.log('user :>> ', user)\n  if (props.selectedUserIds && props.selectedUserIds.includes(user.id)) {\n    emit('unselect', user)\n  } else {\n    emit('select', user)\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.search-view {\n  position: relative;\n  height: 100%;\n  background-color: #ffffff;\n  .records-wrap {\n    .records {\n      .record {\n        padding: 10px 20px;\n        display: flex;\n        align-items: center;\n        .radio {\n          color: var(--zui-color-text-secondary);\n          font-size: 20px;\n        }\n        .avatar {\n          margin-left: 8px;\n          width: 32px;\n          height: 32px;\n          border-radius: var(--zui-size-border-radius-small);\n        }\n        .name {\n          margin-left: 8px;\n          flex: 1;\n        }\n        .info {\n          font-size: 22px;\n          color: var(--zui-color-text-secondary);\n        }\n        &.selected {\n          .radio {\n            color: var(--zui-color-primary);\n          }\n        }\n        &.disabled {\n          *:not(.info) {\n            opacity: 0.6;\n          }\n        }\n      }\n    }\n  }\n  .empty-wrap {\n    .icon {\n      font-size: 50px;\n      color: var(--zui-color-primary);\n    }\n  }\n}\n</style>\n","<template>\n  <div class=\"zui-user-picker\">\n    <header class=\"header\">\n      <span class=\"cancel\">取消</span>\n      <h1 class=\"title\">选择人员</h1>\n      <span class=\"confirm\">确定</span>\n    </header>\n    <main class=\"main\">\n      <SearchBar v-model=\"searchText\" />\n      <SelectedUsers v-if=\"selectedUsers && selectedUsers.length\" class=\"selected-users-wrap\" :users=\"selectedUsers\" />\n      <template v-if=\"!searchText\">\n        <ZuiField label=\"分支名称\" v-model=\"searchText\" class=\"entry\" />\n        <div class=\"section-title\">常用人员</div>\n      </template>\n      <SearchView\n        v-if=\"searchText\"\n        :=\"$props\"\n        :search-text=\"searchText\"\n        :selected-user-ids=\"selectedUserIds\"\n        class=\"search-view\"\n        @select=\"onUserSelect\"\n        @unselect=\"onUserUnselect\"\n        @info-click=\"onUserInfoClick\"\n      />\n    </main>\n  </div>\n</template>\n\n<script setup>\nimport { ref, watch, computed, reactive } from 'vue'\nimport SearchBar from './SearchBar.vue'\nimport SearchView from './SearchView.vue'\nimport SelectedUsers from './SelectedUsers.vue'\n\nconst props = defineProps({ search: Function, disabledUserIds: Array, rootBranchIds: Array })\nconst emit = defineEmits(['confirm', 'cancel'])\n\nconst selectedUsers = reactive([])\nconst selectedUserIds = computed(() => {\n  console.log('selectedUsers :>> ', selectedUsers)\n  if (!selectedUsers || !selectedUsers.length) {\n    return\n  }\n  return selectedUsers.map((u) => u.id)\n})\nconst showSelectedBar = ref(false)\n\n//***** 搜索 *****//\nconst searchText = ref()\nfunction onUserSelect(user) {\n  console.log('selectedUsers :>> ', selectedUsers)\n  selectedUsers.push(user)\n}\nfunction onUserUnselect(user) {\n  const targetIdx = selectedUsers.findIndex((u) => u.id === user.id)\n  selectedUsers.splice(targetIdx, 1)\n}\nfunction onUserInfoClick(user) {\n  console.log('userInfo :>> ', user)\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.zui-user-picker {\n  .header {\n    display: flex;\n    height: 44px;\n    align-items: center;\n    justify-content: space-between;\n    background-color: #ffffff;\n    .cancel,\n    .confirm {\n      padding: 0 20px;\n      height: 100%;\n      line-height: 44px;\n      align-items: flex-start;\n      cursor: pointer;\n      flex: none;\n    }\n    .confirm {\n      color: var(--zui-color-primary);\n    }\n    .title {\n      text-align: center;\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      font-size: var(--zui-size-text-large);\n    }\n  }\n  .main {\n    display: flex;\n    flex-direction: column;\n    min-height: 100px;\n    height: calc(100% - 44px);\n    background-color: var(--zui-color-background);\n    overflow: auto;\n    .selected-users-wrap {\n      height: 56px;\n      border-bottom: 1px solid var(--zui-color-border);\n      background-color: #ffffff;\n    }\n    .entry {\n      margin-top: 10px;\n    }\n    .section-title {\n      color: var(--zui-color-text-secondary);\n      font-size: var(--zui-size-text-small);\n      padding: 0 20px;\n      margin-top: 10px;\n    }\n    .search-view {\n      position: relative;\n      flex: 1;\n      background-color: #ffffff;\n      overflow: auto;\n    }\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport UserPicker from './ZuiUserPicker.vue'\n\nexport default {\n  install(Vue) {\n    Vue.component('ZuiUserPicker', UserPicker)\n  }\n}\n\nexport { UserPicker }\n","<template>\n  <div class=\"zui-red-dot\">\n    <slot></slot>\n    <span v-if=\"show\" class=\"red-dot\"></span>\n  </div>\n</template>\n\n<script>\nexport default {\n  props: {\n    show: {\n      type: Boolean,\n      default: true\n    }\n  }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.zui-red-dot {\n  display: inline-block;\n  position: relative;\n  .red-dot {\n    position: absolute;\n    z-index: 999;\n    right: -4px;\n    top: -4px;\n    display: inline-block;\n    width: 10px;\n    height: 10px;\n    border-radius: 5px;\n    background: var(--zui-color-red);\n  }\n}\n</style>\n","// 单文件引入方式\n\nimport ZuiRedDot from './ZuiRedDot.vue'\n\nexport default function install(Vue) {\n  Vue.component('ZuiRedDot', ZuiRedDot)\n}\n"],"names":["ref","watch","Button","computed","days","_sfc_main","_createElementBlock","_normalizeClass","_renderSlot","nextTick","onMounted","Input","Month","_hoisted_1","_hoisted_2","_hoisted_5","_openBlock","_createElementVNode","_hoisted_3","_hoisted_4","_toDisplayString","_createBlock","SwitchField","Selector","getCurrentInstance","ZuiPopup","reactive"],"mappings":"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"}