@atooyu/uxto-ui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +259 -0
- package/dist/index.js +5055 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +5055 -0
- package/dist/index.mjs.map +1 -0
- package/dist/style.css +2528 -0
- package/package.json +93 -0
- package/src/components/index.ts +51 -0
- package/src/components/u-avatar/u-avatar.vue +205 -0
- package/src/components/u-badge/u-badge.vue +145 -0
- package/src/components/u-button/u-button.vue +239 -0
- package/src/components/u-cell/u-cell.vue +179 -0
- package/src/components/u-cell-group/u-cell-group.vue +46 -0
- package/src/components/u-checkbox/u-checkbox.vue +174 -0
- package/src/components/u-checkbox-group/u-checkbox-group.vue +72 -0
- package/src/components/u-code-input/u-code-input.vue +248 -0
- package/src/components/u-count-down/u-count-down.vue +182 -0
- package/src/components/u-datetime-picker/u-datetime-picker.vue +377 -0
- package/src/components/u-divider/u-divider.vue +71 -0
- package/src/components/u-empty/u-empty.vue +98 -0
- package/src/components/u-grid/u-grid.vue +63 -0
- package/src/components/u-grid-item/u-grid-item.vue +170 -0
- package/src/components/u-icon/icons/account.svg +3 -0
- package/src/components/u-icon/icons/arrow-down.svg +3 -0
- package/src/components/u-icon/icons/arrow-left.svg +3 -0
- package/src/components/u-icon/icons/arrow-right.svg +3 -0
- package/src/components/u-icon/icons/arrow-up.svg +3 -0
- package/src/components/u-icon/icons/bell.svg +3 -0
- package/src/components/u-icon/icons/bookmark-o.svg +3 -0
- package/src/components/u-icon/icons/bookmark.svg +3 -0
- package/src/components/u-icon/icons/chat.svg +3 -0
- package/src/components/u-icon/icons/check-circle.svg +3 -0
- package/src/components/u-icon/icons/check.svg +3 -0
- package/src/components/u-icon/icons/chevron-left.svg +3 -0
- package/src/components/u-icon/icons/chevron-right.svg +3 -0
- package/src/components/u-icon/icons/clear-o.svg +3 -0
- package/src/components/u-icon/icons/clear.svg +3 -0
- package/src/components/u-icon/icons/clipboard.svg +3 -0
- package/src/components/u-icon/icons/clock.svg +3 -0
- package/src/components/u-icon/icons/close.svg +3 -0
- package/src/components/u-icon/icons/code.svg +3 -0
- package/src/components/u-icon/icons/copy.svg +3 -0
- package/src/components/u-icon/icons/delete.svg +3 -0
- package/src/components/u-icon/icons/download.svg +3 -0
- package/src/components/u-icon/icons/edit.svg +3 -0
- package/src/components/u-icon/icons/email.svg +3 -0
- package/src/components/u-icon/icons/error-o.svg +3 -0
- package/src/components/u-icon/icons/error.svg +3 -0
- package/src/components/u-icon/icons/exit-fullscreen.svg +3 -0
- package/src/components/u-icon/icons/expand-less.svg +3 -0
- package/src/components/u-icon/icons/expand-more.svg +3 -0
- package/src/components/u-icon/icons/eye-off.svg +3 -0
- package/src/components/u-icon/icons/eye.svg +3 -0
- package/src/components/u-icon/icons/flag-o.svg +3 -0
- package/src/components/u-icon/icons/flag.svg +3 -0
- package/src/components/u-icon/icons/fullscreen.svg +3 -0
- package/src/components/u-icon/icons/grid.svg +3 -0
- package/src/components/u-icon/icons/group.svg +3 -0
- package/src/components/u-icon/icons/heart-o.svg +3 -0
- package/src/components/u-icon/icons/heart.svg +3 -0
- package/src/components/u-icon/icons/info-o.svg +3 -0
- package/src/components/u-icon/icons/info.svg +3 -0
- package/src/components/u-icon/icons/keyboard-arrow-down.svg +3 -0
- package/src/components/u-icon/icons/keyboard-arrow-left.svg +3 -0
- package/src/components/u-icon/icons/keyboard-arrow-right.svg +3 -0
- package/src/components/u-icon/icons/keyboard-arrow-up.svg +3 -0
- package/src/components/u-icon/icons/like-o.svg +3 -0
- package/src/components/u-icon/icons/like.svg +3 -0
- package/src/components/u-icon/icons/link.svg +3 -0
- package/src/components/u-icon/icons/list.svg +3 -0
- package/src/components/u-icon/icons/loading.svg +3 -0
- package/src/components/u-icon/icons/lock.svg +3 -0
- package/src/components/u-icon/icons/menu-o.svg +3 -0
- package/src/components/u-icon/icons/menu.svg +3 -0
- package/src/components/u-icon/icons/message.svg +3 -0
- package/src/components/u-icon/icons/minus.svg +3 -0
- package/src/components/u-icon/icons/notification.svg +3 -0
- package/src/components/u-icon/icons/phone.svg +3 -0
- package/src/components/u-icon/icons/plus.svg +3 -0
- package/src/components/u-icon/icons/question.svg +3 -0
- package/src/components/u-icon/icons/redo.svg +3 -0
- package/src/components/u-icon/icons/refresh-o.svg +3 -0
- package/src/components/u-icon/icons/refresh.svg +3 -0
- package/src/components/u-icon/icons/reload.svg +3 -0
- package/src/components/u-icon/icons/search-o.svg +3 -0
- package/src/components/u-icon/icons/search.svg +3 -0
- package/src/components/u-icon/icons/setting.svg +3 -0
- package/src/components/u-icon/icons/share.svg +3 -0
- package/src/components/u-icon/icons/smile-o.svg +3 -0
- package/src/components/u-icon/icons/smile.svg +3 -0
- package/src/components/u-icon/icons/star-o.svg +3 -0
- package/src/components/u-icon/icons/star.svg +3 -0
- package/src/components/u-icon/icons/success-o.svg +3 -0
- package/src/components/u-icon/icons/success.svg +3 -0
- package/src/components/u-icon/icons/sync.svg +3 -0
- package/src/components/u-icon/icons/tick.svg +3 -0
- package/src/components/u-icon/icons/undo.svg +3 -0
- package/src/components/u-icon/icons/unlock.svg +3 -0
- package/src/components/u-icon/icons/upload.svg +3 -0
- package/src/components/u-icon/icons/user.svg +3 -0
- package/src/components/u-icon/icons/warning-o.svg +3 -0
- package/src/components/u-icon/icons/warning.svg +3 -0
- package/src/components/u-icon/icons/zoom-in.svg +3 -0
- package/src/components/u-icon/icons/zoom-out.svg +3 -0
- package/src/components/u-icon/index.ts +219 -0
- package/src/components/u-icon/u-icon.vue +117 -0
- package/src/components/u-image/u-image.vue +106 -0
- package/src/components/u-input/u-input.vue +208 -0
- package/src/components/u-keyboard/u-keyboard.vue +213 -0
- package/src/components/u-layout/u-layout.vue +58 -0
- package/src/components/u-line-progress/u-line-progress.vue +156 -0
- package/src/components/u-link/u-link.vue +113 -0
- package/src/components/u-list/u-list.vue +148 -0
- package/src/components/u-list-item/u-list-item.vue +180 -0
- package/src/components/u-loading/u-loading.vue +80 -0
- package/src/components/u-loading-page/u-loading-page.vue +94 -0
- package/src/components/u-modal/u-modal.vue +159 -0
- package/src/components/u-notice-bar/u-notice-bar.vue +113 -0
- package/src/components/u-number-box/u-number-box.vue +262 -0
- package/src/components/u-parse/u-parse.vue +197 -0
- package/src/components/u-picker/u-picker.vue +219 -0
- package/src/components/u-popup/u-popup.vue +257 -0
- package/src/components/u-radio/u-radio.vue +159 -0
- package/src/components/u-radio-group/u-radio-group.vue +61 -0
- package/src/components/u-rate/u-rate.vue +187 -0
- package/src/components/u-read-more/u-read-more.vue +117 -0
- package/src/components/u-search/u-search.vue +238 -0
- package/src/components/u-skeleton/u-skeleton.vue +192 -0
- package/src/components/u-slider/u-slider.vue +453 -0
- package/src/components/u-swiper/u-swiper.vue +301 -0
- package/src/components/u-swiper-item/u-swiper-item.vue +82 -0
- package/src/components/u-switch/u-switch.vue +105 -0
- package/src/components/u-tabbar/u-tabbar.vue +221 -0
- package/src/components/u-tag/u-tag.vue +144 -0
- package/src/components/u-textarea/u-textarea.vue +189 -0
- package/src/components/u-toast/u-toast.vue +186 -0
- package/src/components/u-tooltip/u-tooltip.vue +364 -0
- package/src/components/u-transition/u-transition.vue +216 -0
- package/src/components/u-upload/u-upload.vue +403 -0
- package/src/styles/index.scss +59 -0
- package/src/styles/variables.scss +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/components/u-button/u-button.vue","../src/components/u-input/u-input.vue","../src/components/u-cell/u-cell.vue","../src/components/u-cell-group/u-cell-group.vue","../src/components/u-modal/u-modal.vue","../src/components/u-icon/icons/arrow-down.svg","../src/components/u-icon/icons/arrow-left.svg","../src/components/u-icon/icons/arrow-right.svg","../src/components/u-icon/icons/arrow-up.svg","../src/components/u-icon/icons/check.svg","../src/components/u-icon/icons/check-circle.svg","../src/components/u-icon/icons/chevron-left.svg","../src/components/u-icon/icons/chevron-right.svg","../src/components/u-icon/icons/clear.svg","../src/components/u-icon/icons/clear-o.svg","../src/components/u-icon/icons/close.svg","../src/components/u-icon/icons/code.svg","../src/components/u-icon/icons/copy.svg","../src/components/u-icon/icons/delete.svg","../src/components/u-icon/icons/download.svg","../src/components/u-icon/icons/edit.svg","../src/components/u-icon/icons/email.svg","../src/components/u-icon/icons/error.svg","../src/components/u-icon/icons/error-o.svg","../src/components/u-icon/icons/expand-less.svg","../src/components/u-icon/icons/expand-more.svg","../src/components/u-icon/icons/eye.svg","../src/components/u-icon/icons/eye-off.svg","../src/components/u-icon/icons/flag.svg","../src/components/u-icon/icons/flag-o.svg","../src/components/u-icon/icons/fullscreen.svg","../src/components/u-icon/icons/exit-fullscreen.svg","../src/components/u-icon/icons/grid.svg","../src/components/u-icon/icons/heart.svg","../src/components/u-icon/icons/heart-o.svg","../src/components/u-icon/icons/info.svg","../src/components/u-icon/icons/info-o.svg","../src/components/u-icon/icons/keyboard-arrow-down.svg","../src/components/u-icon/icons/keyboard-arrow-left.svg","../src/components/u-icon/icons/keyboard-arrow-right.svg","../src/components/u-icon/icons/keyboard-arrow-up.svg","../src/components/u-icon/icons/like.svg","../src/components/u-icon/icons/like-o.svg","../src/components/u-icon/icons/link.svg","../src/components/u-icon/icons/list.svg","../src/components/u-icon/icons/lock.svg","../src/components/u-icon/icons/unlock.svg","../src/components/u-icon/icons/loading.svg","../src/components/u-icon/icons/menu.svg","../src/components/u-icon/icons/menu-o.svg","../src/components/u-icon/icons/message.svg","../src/components/u-icon/icons/minus.svg","../src/components/u-icon/icons/notification.svg","../src/components/u-icon/icons/bell.svg","../src/components/u-icon/icons/phone.svg","../src/components/u-icon/icons/plus.svg","../src/components/u-icon/icons/question.svg","../src/components/u-icon/icons/refresh.svg","../src/components/u-icon/icons/refresh-o.svg","../src/components/u-icon/icons/reload.svg","../src/components/u-icon/icons/redo.svg","../src/components/u-icon/icons/undo.svg","../src/components/u-icon/icons/search.svg","../src/components/u-icon/icons/search-o.svg","../src/components/u-icon/icons/setting.svg","../src/components/u-icon/icons/share.svg","../src/components/u-icon/icons/smile.svg","../src/components/u-icon/icons/smile-o.svg","../src/components/u-icon/icons/star.svg","../src/components/u-icon/icons/star-o.svg","../src/components/u-icon/icons/success.svg","../src/components/u-icon/icons/success-o.svg","../src/components/u-icon/icons/tick.svg","../src/components/u-icon/icons/upload.svg","../src/components/u-icon/icons/user.svg","../src/components/u-icon/icons/account.svg","../src/components/u-icon/icons/group.svg","../src/components/u-icon/icons/warning.svg","../src/components/u-icon/icons/warning-o.svg","../src/components/u-icon/icons/zoom-in.svg","../src/components/u-icon/icons/zoom-out.svg","../src/components/u-icon/icons/sync.svg","../src/components/u-icon/icons/clock.svg","../src/components/u-icon/icons/bookmark.svg","../src/components/u-icon/icons/bookmark-o.svg","../src/components/u-icon/icons/chat.svg","../src/components/u-icon/icons/clipboard.svg","../src/components/u-icon/index.ts","../src/components/u-icon/u-icon.vue","../src/components/u-loading/u-loading.vue","../src/components/u-tag/u-tag.vue","../src/components/u-switch/u-switch.vue","../src/components/u-image/u-image.vue","../src/components/u-divider/u-divider.vue","../src/components/u-notice-bar/u-notice-bar.vue","../src/components/u-layout/u-layout.vue","../src/components/u-badge/u-badge.vue","../src/components/u-loading-page/u-loading-page.vue","../src/components/u-parse/u-parse.vue","../src/components/u-keyboard/u-keyboard.vue","../src/components/u-picker/u-picker.vue","../src/components/u-datetime-picker/u-datetime-picker.vue","../src/components/u-rate/u-rate.vue","../src/components/u-grid/u-grid.vue","../src/components/u-grid-item/u-grid-item.vue","../src/components/u-swiper/u-swiper.vue","../src/components/u-swiper-item/u-swiper-item.vue","../src/components/u-search/u-search.vue","../src/components/u-number-box/u-number-box.vue","../src/components/u-upload/u-upload.vue","../src/components/u-textarea/u-textarea.vue","../src/components/u-slider/u-slider.vue","../src/components/u-list/u-list.vue","../src/components/u-list-item/u-list-item.vue","../src/components/u-line-progress/u-line-progress.vue","../src/components/u-count-down/u-count-down.vue","../src/components/u-tooltip/u-tooltip.vue","../src/components/u-avatar/u-avatar.vue","../src/components/u-empty/u-empty.vue","../src/components/u-checkbox/u-checkbox.vue","../src/components/u-checkbox-group/u-checkbox-group.vue","../src/components/u-radio/u-radio.vue","../src/components/u-radio-group/u-radio-group.vue","../src/components/u-toast/u-toast.vue","../src/components/u-popup/u-popup.vue","../src/components/u-code-input/u-code-input.vue","../src/components/u-skeleton/u-skeleton.vue","../src/components/u-transition/u-transition.vue","../src/components/u-link/u-link.vue","../src/components/u-read-more/u-read-more.vue","../src/components/u-tabbar/u-tabbar.vue"],"sourcesContent":["<template>\n <button\n class=\"u-button\"\n :class=\"[\n `u-button--${type}`,\n `u-button--${size}`,\n {\n 'u-button--plain': plain,\n 'u-button--round': round,\n 'u-button--square': square,\n 'u-button--disabled': disabled,\n 'u-button--loading': loading,\n 'u-button--block': block\n }\n ]\"\n :style=\"buttonStyle\"\n :disabled=\"disabled || loading\"\n :hover-class=\"disabled || loading ? '' : 'u-button--active'\"\n @click=\"handleClick\"\n >\n <view v-if=\"loading\" class=\"u-button__loading\">\n <view class=\"u-button__loading-icon\"></view>\n </view>\n <view v-else class=\"u-button__content\">\n <text v-if=\"icon\" class=\"u-button__icon\">{{ icon }}</text>\n <text class=\"u-button__text\"><slot /></text>\n </view>\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ntype ButtonType = 'primary' | 'success' | 'warning' | 'danger' | 'default'\ntype ButtonSize = 'large' | 'normal' | 'small' | 'mini'\n\ninterface Props {\n type?: ButtonType\n size?: ButtonSize\n plain?: boolean\n round?: boolean\n square?: boolean\n disabled?: boolean\n loading?: boolean\n block?: boolean\n icon?: string\n color?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: 'default',\n size: 'normal',\n plain: false,\n round: false,\n square: false,\n disabled: false,\n loading: false,\n block: false\n})\n\nconst emit = defineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst buttonStyle = computed(() => {\n if (props.color) {\n return {\n backgroundColor: props.plain ? 'transparent' : props.color,\n borderColor: props.color,\n color: props.plain ? props.color : '#fff'\n }\n }\n return {}\n})\n\nconst handleClick = (event: MouseEvent) => {\n if (!props.disabled && !props.loading) {\n emit('click', event)\n }\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: relative;\n box-sizing: border-box;\n height: $--button-height;\n padding: 0 $--spacing-lg;\n margin: 0;\n font-size: $--font-size-md;\n line-height: 1.2;\n text-align: center;\n border-radius: $--border-radius-md;\n border: 1px solid transparent;\n transition: all $--transition-duration;\n -webkit-tap-highlight-color: transparent;\n\n &::after {\n border: none;\n }\n\n &--default {\n color: $--text-color;\n background-color: $--bg-color-2;\n border-color: $--border-color;\n }\n\n &--primary {\n color: $--text-color-white;\n background-color: $--color-primary;\n border-color: $--color-primary;\n }\n\n &--success {\n color: $--text-color-white;\n background-color: $--color-success;\n border-color: $--color-success;\n }\n\n &--warning {\n color: $--text-color-white;\n background-color: $--color-warning;\n border-color: $--color-warning;\n }\n\n &--danger {\n color: $--text-color-white;\n background-color: $--color-danger;\n border-color: $--color-danger;\n }\n\n &--large {\n height: $--button-height-lg;\n font-size: $--font-size-lg;\n }\n\n &--small {\n height: $--button-height-sm;\n padding: 0 $--spacing-md;\n font-size: $--font-size-sm;\n }\n\n &--mini {\n height: 24px;\n padding: 0 $--spacing-sm;\n font-size: $--font-size-xs;\n }\n\n &--plain {\n background-color: transparent;\n\n &.u-button--primary {\n color: $--color-primary;\n }\n\n &.u-button--success {\n color: $--color-success;\n }\n\n &.u-button--warning {\n color: $--color-warning;\n }\n\n &.u-button--danger {\n color: $--color-danger;\n }\n }\n\n &--round {\n border-radius: 999px;\n }\n\n &--square {\n border-radius: 0;\n }\n\n &--disabled {\n opacity: 0.5;\n }\n\n &--loading {\n }\n\n &--block {\n display: flex;\n width: 100%;\n }\n\n &--active {\n opacity: 0.8;\n }\n\n &__content {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n &__icon {\n margin-right: $--spacing-xs;\n }\n\n &__loading {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n &__loading-icon {\n width: 16px;\n height: 16px;\n border: 2px solid currentColor;\n border-top-color: transparent;\n border-radius: 50%;\n animation: u-button-loading 0.8s linear infinite;\n }\n}\n\n@keyframes u-button-loading {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n</style>\n","<template>\n <view\n class=\"u-input\"\n :class=\"{\n 'u-input--disabled': disabled,\n 'u-input--error': error,\n 'u-input--focus': isFocus\n }\"\n >\n <view v-if=\"$slots.prefix || prefixIcon\" class=\"u-input__prefix\">\n <slot name=\"prefix\">\n <text class=\"u-input__icon\">{{ prefixIcon }}</text>\n </slot>\n </view>\n\n <view class=\"u-input__body\">\n <input\n class=\"u-input__control\"\n :type=\"type\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :placeholder-style=\"placeholderStyle\"\n :placeholder-class=\"'u-input__placeholder'\"\n :disabled=\"disabled\"\n :maxlength=\"maxlength\"\n :focus=\"focus\"\n :confirm-type=\"confirmType\"\n :adjust-position=\"adjustPosition\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @confirm=\"handleConfirm\"\n />\n </view>\n\n <view v-if=\"clearable && modelValue\" class=\"u-input__clear\" @click=\"handleClear\">\n <text class=\"u-input__clear-icon\">×</text>\n </view>\n\n <view v-if=\"$slots.suffix || suffixIcon\" class=\"u-input__suffix\">\n <slot name=\"suffix\">\n <text class=\"u-input__icon\">{{ suffixIcon }}</text>\n </slot>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\n\ntype InputType = 'text' | 'number' | 'idcard' | 'digit' | 'password'\ntype ConfirmType = 'send' | 'search' | 'next' | 'go' | 'done'\n\ninterface Props {\n modelValue?: string | number\n type?: InputType\n placeholder?: string\n placeholderStyle?: string\n disabled?: boolean\n maxlength?: number\n clearable?: boolean\n focus?: boolean\n error?: boolean\n confirmType?: ConfirmType\n adjustPosition?: boolean\n prefixIcon?: string\n suffixIcon?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: '',\n type: 'text',\n placeholder: '请输入',\n disabled: false,\n maxlength: 140,\n clearable: false,\n focus: false,\n error: false,\n confirmType: 'done',\n adjustPosition: true\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n input: [value: string]\n focus: [event: FocusEvent]\n blur: [event: FocusEvent]\n confirm: [value: string]\n clear: []\n}>()\n\nconst isFocus = ref(false)\n\nconst handleInput = (event: any) => {\n const value = event.detail.value\n emit('update:modelValue', value)\n emit('input', value)\n}\n\nconst handleFocus = (event: FocusEvent) => {\n isFocus.value = true\n emit('focus', event)\n}\n\nconst handleBlur = (event: FocusEvent) => {\n isFocus.value = false\n emit('blur', event)\n}\n\nconst handleConfirm = (event: any) => {\n emit('confirm', event.detail.value)\n}\n\nconst handleClear = () => {\n emit('update:modelValue', '')\n emit('input', '')\n emit('clear')\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-input {\n display: flex;\n align-items: center;\n width: 100%;\n height: $--input-height;\n padding: 0 $--spacing-md;\n background-color: $--bg-color-2;\n border-radius: $--border-radius-md;\n border: 1px solid $--border-color;\n transition: all $--transition-duration;\n\n &--focus {\n border-color: $--color-primary;\n }\n\n &--error {\n border-color: $--color-danger;\n }\n\n &--disabled {\n background-color: $--bg-color;\n }\n\n &__body {\n flex: 1;\n display: flex;\n align-items: center;\n }\n\n &__control {\n flex: 1;\n height: 100%;\n font-size: $--font-size-md;\n color: $--text-color;\n background: transparent;\n }\n\n &__placeholder {\n color: $--text-color-3;\n }\n\n &__prefix,\n &__suffix {\n display: flex;\n align-items: center;\n }\n\n &__prefix {\n margin-right: $--spacing-sm;\n }\n\n &__suffix {\n margin-left: $--spacing-sm;\n }\n\n &__icon {\n color: $--text-color-2;\n font-size: $--font-size-md;\n }\n\n &__clear {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: $--spacing-sm;\n background-color: $--text-color-3;\n border-radius: 50%;\n }\n\n &__clear-icon {\n color: $--bg-color-2;\n font-size: 12px;\n line-height: 1;\n }\n}\n</style>\n","<template>\n <view\n class=\"u-cell\"\n :class=\"{\n 'u-cell--clickable': isClickable,\n 'u-cell--disabled': disabled\n }\"\n :hover-class=\"isClickable && !disabled ? 'u-cell--active' : ''\"\n @click=\"handleClick\"\n >\n <view v-if=\"$slots.icon || icon\" class=\"u-cell__icon\">\n <slot name=\"icon\">\n <image v-if=\"icon\" class=\"u-cell__icon-img\" :src=\"icon\" mode=\"aspectFit\" />\n </slot>\n </view>\n\n <view class=\"u-cell__content\">\n <view class=\"u-cell__title\">\n <text class=\"u-cell__title-text\">{{ title }}</text>\n <text v-if=\"label\" class=\"u-cell__label\">{{ label }}</text>\n </view>\n\n <view class=\"u-cell__value\">\n <slot name=\"value\">\n <text class=\"u-cell__value-text\">{{ value }}</text>\n </slot>\n </view>\n </view>\n\n <view v-if=\"isLink\" class=\"u-cell__arrow\">\n <text class=\"u-cell__arrow-icon\">›</text>\n </view>\n\n <slot name=\"right-icon\" />\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n title?: string\n value?: string | number\n label?: string\n icon?: string\n isLink?: boolean\n to?: string\n url?: string\n disabled?: boolean\n clickable?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n title: '',\n isLink: false,\n disabled: false,\n clickable: false\n})\n\nconst emit = defineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst isClickable = computed(() => {\n return props.clickable || props.isLink || props.to || props.url\n})\n\nconst handleClick = (event: MouseEvent) => {\n if (props.disabled) return\n\n emit('click', event)\n\n if (props.url) {\n uni.navigateTo({ url: props.url })\n } else if (props.to) {\n uni.navigateTo({ url: props.to })\n }\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-cell {\n display: flex;\n align-items: center;\n min-height: $--cell-height;\n padding: $--spacing-md $--spacing-lg;\n background-color: $--bg-color-2;\n position: relative;\n\n &::after {\n content: '';\n position: absolute;\n left: $--spacing-lg;\n right: 0;\n bottom: 0;\n height: 1px;\n background-color: $--border-color;\n transform: scaleY(0.5);\n }\n\n &:last-child::after {\n display: none;\n }\n\n &--clickable {\n }\n\n &--disabled {\n opacity: 0.5;\n }\n\n &--active {\n background-color: $--bg-color;\n }\n\n &__icon {\n margin-right: $--spacing-md;\n\n &-img {\n width: 20px;\n height: 20px;\n }\n }\n\n &__content {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: space-between;\n overflow: hidden;\n }\n\n &__title {\n flex: 1;\n overflow: hidden;\n\n &-text {\n font-size: $--font-size-md;\n color: $--text-color;\n line-height: 24px;\n }\n }\n\n &__label {\n display: block;\n margin-top: 2px;\n font-size: $--font-size-sm;\n color: $--text-color-2;\n line-height: 18px;\n }\n\n &__value {\n overflow: hidden;\n\n &-text {\n font-size: $--font-size-md;\n color: $--text-color-2;\n }\n }\n\n &__arrow {\n margin-left: $--spacing-sm;\n color: $--text-color-3;\n\n &-icon {\n font-size: 16px;\n }\n }\n}\n</style>\n","<template>\n <view class=\"u-cell-group\">\n <view v-if=\"title || $slots.title\" class=\"u-cell-group__title\">\n <slot name=\"title\">{{ title }}</slot>\n </view>\n <view class=\"u-cell-group__body\">\n <slot />\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n title?: string\n}\n\nwithDefaults(defineProps<Props>(), {\n title: ''\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-cell-group {\n background-color: $--bg-color-2;\n\n &__title {\n padding: $--spacing-md $--spacing-lg;\n font-size: $--font-size-sm;\n color: $--text-color-2;\n background-color: $--bg-color;\n }\n\n &__body {\n position: relative;\n }\n}\n</style>\n","<template>\n <view v-if=\"visible\" class=\"u-modal\" @click=\"handleMaskClick\">\n <view class=\"u-modal__container\" @click.stop>\n <view v-if=\"title\" class=\"u-modal__header\">\n <text class=\"u-modal__title\">{{ title }}</text>\n </view>\n\n <view class=\"u-modal__body\">\n <slot>\n <text class=\"u-modal__message\">{{ message }}</text>\n </slot>\n </view>\n\n <view class=\"u-modal__footer\">\n <view\n v-if=\"showCancel\"\n class=\"u-modal__button u-modal__button--cancel\"\n @click=\"handleCancel\"\n >\n <text>{{ cancelText }}</text>\n </view>\n <view\n class=\"u-modal__button u-modal__button--confirm\"\n @click=\"handleConfirm\"\n >\n <text>{{ confirmText }}</text>\n </view>\n </view>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n visible?: boolean\n title?: string\n message?: string\n showCancel?: boolean\n cancelText?: string\n confirmText?: string\n closeOnClickOverlay?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n visible: false,\n title: '',\n message: '',\n showCancel: true,\n cancelText: '取消',\n confirmText: '确定',\n closeOnClickOverlay: false\n})\n\nconst emit = defineEmits<{\n 'update:visible': [value: boolean]\n cancel: []\n confirm: []\n}>()\n\nconst handleMaskClick = () => {\n if (props.closeOnClickOverlay) {\n emit('update:visible', false)\n }\n}\n\nconst handleCancel = () => {\n emit('update:visible', false)\n emit('cancel')\n}\n\nconst handleConfirm = () => {\n emit('update:visible', false)\n emit('confirm')\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-modal {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 999;\n\n &__container {\n width: 280px;\n background-color: $--bg-color-2;\n border-radius: $--border-radius-lg;\n overflow: hidden;\n }\n\n &__header {\n padding: $--spacing-lg $--spacing-lg $--spacing-sm;\n text-align: center;\n }\n\n &__title {\n font-size: $--font-size-lg;\n font-weight: 600;\n color: $--text-color;\n }\n\n &__body {\n padding: $--spacing-md $--spacing-lg $--spacing-lg;\n text-align: center;\n max-height: 300px;\n overflow-y: auto;\n }\n\n &__message {\n font-size: $--font-size-md;\n color: $--text-color-2;\n line-height: 1.5;\n }\n\n &__footer {\n display: flex;\n border-top: 1px solid $--border-color;\n }\n\n &__button {\n flex: 1;\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: $--font-size-md;\n transition: background-color $--transition-duration;\n\n &:active {\n background-color: $--bg-color;\n }\n\n &--cancel {\n color: $--text-color-2;\n border-right: 1px solid $--border-color;\n }\n\n &--confirm {\n color: $--color-primary;\n font-weight: 500;\n }\n }\n}\n</style>\n","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M7.41%208.59L12%2013.17l4.59-4.58L18%2010l-6%206-6-6%201.41-1.41z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M20%2011H7.83l5.59-5.59L12%204l-8%208%208%208%201.41-1.41L7.83%2013H20v-2z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12%204l-1.41%201.41L16.17%2011H4v2h12.17l-5.58%205.59L12%2020l8-8z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M7.41%2015.41L12%2010.83l4.59%204.58L18%2014l-6-6-6%206z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M9%2016.17L4.83%2012l-1.42%201.41L9%2019%2021%207l-1.41-1.41z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12%202C6.48%202%202%206.48%202%2012s4.48%2010%2010%2010%2010-4.48%2010-10S17.52%202%2012%202zm-2%2015l-5-5%201.41-1.41L10%2014.17l7.59-7.59L19%208l-9%209z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M15.41%207.41L14%206l-6%206%206%206%201.41-1.41L10.83%2012z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M10%206L8.59%207.41%2013.17%2012l-4.58%204.59L10%2018l6-6z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M19%206.41L17.59%205%2012%2010.59%206.41%205%205%206.41%2010.59%2012%205%2017.59%206.41%2019%2012%2013.41%2017.59%2019%2019%2017.59%2013.41%2012z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M21%203H3c-1.1%200-2%20.9-2%202v14c0%201.1.9%202%202%202h18c1.1%200%202-.9%202-2V5c0-1.1-.9-2-2-2zm0%2016H3V5h18v14zM9.41%2015.95L12%2013.36l2.59%202.59L16%2014.54l-2.59-2.59L16%209.36l-1.41-1.41L12%2010.54%209.41%207.95%208%209.36l2.59%202.59L8%2014.54z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M19%206.41L17.59%205%2012%2010.59%206.41%205%205%206.41%2010.59%2012%205%2017.59%206.41%2019%2012%2013.41%2017.59%2019%2019%2017.59%2013.41%2012z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M9.4%2016.6L4.8%2012l4.6-4.6L8%206l-6%206%206%206%201.4-1.4zm5.2%200l4.6-4.6-4.6-4.6L16%206l6%206-6%206-1.4-1.4z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M16%201H4c-1.1%200-2%20.9-2%202v14h2V3h12V1zm3%204H8c-1.1%200-2%20.9-2%202v14c0%201.1.9%202%202%202h11c1.1%200%202-.9%202-2V7c0-1.1-.9-2-2-2zm0%2016H8V7h11v14z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M6%2019c0%201.1.9%202%202%202h8c1.1%200%202-.9%202-2V7H6v12zM19%204h-3.5l-1-1h-5l-1%201H5v2h14V4z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M19%209h-4V3H9v6H5l7%207%207-7zM5%2018v2h14v-2H5z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M3%2017.25V21h3.75L17.81%209.94l-3.75-3.75L3%2017.25zM20.71%207.04c.39-.39.39-1.02%200-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41%200l-1.83%201.83%203.75%203.75%201.83-1.83z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M20%204H4c-1.1%200-1.99.9-1.99%202L2%2018c0%201.1.9%202%202%202h16c1.1%200%202-.9%202-2V6c0-1.1-.9-2-2-2zm0%204l-8%205-8-5V6l8%205%208-5v2z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12%202C6.47%202%202%206.47%202%2012s4.47%2010%2010%2010%2010-4.47%2010-10S17.53%202%2012%202zm5%2013.59L15.59%2017%2012%2013.41%208.41%2017%207%2015.59%2010.59%2012%207%208.41%208.41%207%2012%2010.59%2015.59%207%2017%208.41%2013.41%2012%2017%2015.59z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M15.73%203H8.27L3%208.27v7.46L8.27%2021h7.46L21%2015.73V8.27L15.73%203zM19%2014.9L14.9%2019H9.1L5%2014.9V9.1L9.1%205h5.8L19%209.1v5.8zm-4.17-7.14L12%2010.59%209.17%207.76%207.76%209.17%2010.59%2012l-2.83%202.83%201.41%201.41L12%2013.41l2.83%202.83%201.41-1.41L13.41%2012l2.83-2.83z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M7%2014l5-5%205%205z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M7%2010l5%205%205-5z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12%204.5C7%204.5%202.73%207.61%201%2012c1.73%204.39%206%207.5%2011%207.5s9.27-3.11%2011-7.5c-1.73-4.39-6-7.5-11-7.5zM12%2017c-2.76%200-5-2.24-5-5s2.24-5%205-5%205%202.24%205%205-2.24%205-5%205zm0-8c-1.66%200-3%201.34-3%203s1.34%203%203%203%203-1.34%203-3-1.34-3-3-3z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12%207c2.76%200%205%202.24%205%205%200%20.65-.13%201.26-.36%201.83l2.92%202.92c1.51-1.26%202.7-2.89%203.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4%200-2.74.25-3.98.7l2.16%202.16C10.74%207.13%2011.35%207%2012%207zM2%204.27l2.28%202.28.46.46C3.08%208.3%201.78%2010.02%201%2012c1.73%204.39%206%207.5%2011%207.5%201.55%200%203.03-.3%204.38-.84l.42.42L19.73%2022%2021%2020.73%203.27%203%202%204.27zM7.53%209.8l1.55%201.55c-.05.21-.08.43-.08.65%200%201.66%201.34%203%203%203%20.22%200%20.44-.03.65-.08l1.55%201.55c-.67.33-1.41.53-2.2.53-2.76%200-5-2.24-5-5%200-.79.2-1.53.53-2.2zm4.31-.78l3.15%203.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M14.4%206L14%204H5v17h2v-7h5.6l.4%202h7V6z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M14.4%206L14%204H5v17h2v-7h5.6l.4%202h7V6z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M7%2014H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12%207h-3v2h5v-5h-2v3zM14%205v2h3v3h2V5h-5z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M5%2016h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6%2011h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M4%208h4V4H4v4zm6%2012h4v-4h-4v4zm-6%200h4v-4H4v4zm0-6h4v-4H4v4zm6%200h4v-4h-4v4zm6-10v4h4V4h-4zm-6%204h4V4h-4v4zm6%206h4v-4h-4v4zm0%206h4v-4h-4v4z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12%2021.35l-1.45-1.32C5.4%2015.36%202%2012.28%202%208.5%202%205.42%204.42%203%207.5%203c1.74%200%203.41.81%204.5%202.09C13.09%203.81%2014.76%203%2016.5%203%2019.58%203%2022%205.42%2022%208.5c0%203.78-3.4%206.86-8.55%2011.54L12%2021.35z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M16.5%203c-1.74%200-3.41.81-4.5%202.09C10.91%203.81%209.24%203%207.5%203%204.42%203%202%205.42%202%208.5c0%203.78%203.4%206.86%208.55%2011.54L12%2021.35l1.45-1.32C18.6%2015.36%2022%2012.28%2022%208.5%2022%205.42%2019.58%203%2016.5%203zm-4.4%2015.55l-.1.1-.1-.1C7.14%2014.24%204%2011.39%204%208.5%204%206.5%205.5%205%207.5%205c1.54%200%203.04.99%203.57%202.36h1.87C13.46%205.99%2014.96%205%2016.5%205c2%200%203.5%201.5%203.5%203.5%200%202.89-3.14%205.74-7.9%2010.05z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M19%203H5c-1.1%200-2%20.9-2%202v14c0%201.1.9%202%202%202h14c1.1%200%202-.9%202-2V5c0-1.1-.9-2-2-2zm-5%2014H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12%202C6.48%202%202%206.48%202%2012s4.48%2010%2010%2010%2010-4.48%2010-10S17.52%202%2012%202zm1%2015h-2v-6h2v6zm0-8h-2V7h2v2z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M7.41%208.59L12%2013.17l4.59-4.58L18%2010l-6%206-6-6%201.41-1.41z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M15.41%2016.59L10.83%2012l4.58-4.59L14%206l-6%206%206%206%201.41-1.41z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M8.59%2016.59L13.17%2012%208.59%207.41%2010%206l6%206-6%206-1.41-1.41z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M7.41%2015.41L12%2010.83l4.59%204.58L18%2014l-6-6-6%206z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M1%2021h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17%201%207.59%207.59C7.22%207.95%207%208.45%207%209v10c0%201.1.9%202%202%202h9c.83%200%201.54-.5%201.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-2z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M16.5%203c-1.74%200-3.41.81-4.5%202.09C10.91%203.81%209.24%203%207.5%203%204.42%203%202%205.42%202%208.5c0%203.78%203.4%206.86%208.55%2011.54L12%2021.35l1.45-1.32C18.6%2015.36%2022%2012.28%2022%208.5%2022%205.42%2019.58%203%2016.5%203zm-4.4%2015.55l-.1.1-.1-.1C7.14%2014.24%204%2011.39%204%208.5%204%206.5%205.5%205%207.5%205c1.54%200%203.04.99%203.57%202.36h1.87C13.46%205.99%2014.96%205%2016.5%205c2%200%203.5%201.5%203.5%203.5%200%202.89-3.14%205.74-7.9%2010.05z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M19%2019H5V5h7V3H5c-1.11%200-2%20.9-2%202v14c0%201.1.89%202%202%202h14c1.1%200%202-.9%202-2v-7h-2v7zM14%203v2h3.59l-9.83%209.83%201.41%201.41L19%206.41V10h2V3h-7z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M3%2013h2v-2H3v2zm0%204h2v-2H3v2zm0-8h2V7H3v2zm4%204h14v-2H7v2zm0%204h14v-2H7v2zM7%207v2h14V7H7z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M18%208h-1V6c0-2.76-2.24-5-5-5S7%203.24%207%206v2H6c-1.1%200-2%20.9-2%202v10c0%201.1.9%202%202%202h12c1.1%200%202-.9%202-2V10c0-1.1-.9-2-2-2zm-6%209c-1.1%200-2-.9-2-2s.9-2%202-2%202%20.9%202%202-.9%202-2%202zm3.1-9H8.9V6c0-1.71%201.39-3.1%203.1-3.1%201.71%200%203.1%201.39%203.1%203.1v2z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12%2017c1.1%200%202-.9%202-2s-.9-2-2-2-2%20.9-2%202%20.9%202%202%202zm6-9h-1V6c0-2.76-2.24-5-5-5S7%203.24%207%206h1.9c0-1.71%201.39-3.1%203.1-3.1%201.71%200%203.1%201.39%203.1%203.1v2H6c-1.1%200-2%20.9-2%202v10c0%201.1.9%202%202%202h12c1.1%200%202-.9%202-2V10c0-1.1-.9-2-2-2zm0%2012H6V10h12v10z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M9.4%2010.5l4.77-8.26C13.47%202.09%2012.75%202%2012%202c-2.4%200-4.6.85-6.32%202.25l3.66%206.35.06-.1zM21.54%209c-.92-2.92-3.15-5.26-5.99-6.34L11.88%209h9.66zm.26%201h-7.49l.29.5%204.76%208.25C21%2016.97%2022%2014.61%2022%2012c0-.69-.07-1.35-.2-2zM8.54%2012l-3.9-6.75C3.01%207.03%202%209.39%202%2012c0%20.69.07%201.35.2%202h7.49l-1.15-2zm-6.08%203c.92%202.92%203.15%205.26%205.99%206.34L12.12%2015H2.46zm11.27%200l-3.9%206.76c.7.15%201.42.24%202.17.24%202.4%200%204.6-.85%206.32-2.25l-3.66-6.35-.93%201.6z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M3%2018h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M3%2018h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M20%202H4c-1.1%200-1.99.9-1.99%202L2%2022l4-4h14c1.1%200%202-.9%202-2V4c0-1.1-.9-2-2-2zM6%209h12v2H6V9zm8%205H6v-2h8v2zm4-6H6V6h12v2z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M19%2013H5v-2h14v2z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M10.01%2021.01c0%201.1.89%201.99%201.99%201.99s1.99-.89%201.99-1.99h-3.98zM12%202c-1.1%200-2%20.9-2%202v1.01c-2.88.44-5%202.95-5%205.99V17c0%201.1.9%202%202%202h10c1.1%200%202-.9%202-2v-6c0-3.04-2.12-5.55-5-5.99V4c0-1.1-.9-2-2-2zm0%204c2.21%200%204%201.79%204%204v6H8v-6c0-2.21%201.79-4%204-4z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12%2022c1.1%200%202-.9%202-2h-4c0%201.1.89%202%202%202zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5%201.5v.68C7.63%205.36%206%207.92%206%2011v5l-2%202v1h16v-1l-2-2z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M6.62%2010.79c1.44%202.83%203.76%205.14%206.59%206.59l2.2-2.2c.27-.27.67-.36%201.02-.24%201.12.37%202.33.57%203.57.57.55%200%201%20.45%201%201V20c0%20.55-.45%201-1%201-9.39%200-17-7.61-17-17%200-.55.45-1%201-1h3.5c.55%200%201%20.45%201%201%200%201.25.2%202.45.57%203.57.11.35.03.74-.25%201.02l-2.2%202.2z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M19%2013h-6v6h-2v-6H5v-2h6V5h2v6h6v2z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12%202C6.48%202%202%206.48%202%2012s4.48%2010%2010%2010%2010-4.48%2010-10S17.52%202%2012%202zm1%2017h-2v-2h2v2zm2.07-7.75l-.9.92C13.45%2012.9%2013%2013.5%2013%2015h-2v-.5c0-1.1.45-2.1%201.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41%200-1.1-.9-2-2-2s-2%20.9-2%202H8c0-2.21%201.79-4%204-4s4%201.79%204%204c0%20.88-.36%201.68-.93%202.25z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M17.65%206.35C16.2%204.9%2014.21%204%2012%204c-4.42%200-7.99%203.58-7.99%208s3.57%208%207.99%208c3.73%200%206.84-2.55%207.73-6h-2.08c-.82%202.33-3.04%204-5.65%204-3.31%200-6-2.69-6-6s2.69-6%206-6c1.66%200%203.14.69%204.22%201.78L13%2011h7V4l-2.35%202.35z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12.5%208c-4.65%200-8.58%203.03-9.96%207.22L2%2014h9v-2l3.6%203.6c-1.05%203.19-4.05%205.5-7.6%205.5-2.65%200-5.05-.99-6.9-2.6L2%2022h9v-2l-3.6-3.6c1.05%203.19%204.05%205.5%207.6%205.5%204.65%200%208.58-3.03%209.96-7.22l-2.36-.78C20.92%2010.97%2017.15%208%2012.5%208z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M17.65%206.35A7.958%207.958%200%200012%204c-4.42%200-7.99%203.58-7.99%208s3.57%208%207.99%208c3.73%200%206.84-2.55%207.73-6h-2.08A5.99%205.99%200%200112%2018c-3.31%200-6-2.69-6-6s2.69-6%206-6c1.66%200%203.14.69%204.22%201.78L13%2011h7V4l-2.35%202.35z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M18.4%2010.6C16.55%208.99%2014.15%208%2011.5%208c-4.65%200-8.58%203.03-9.96%207.22L3.9%2016c1.05-3.19%204.05-5.5%207.6-5.5%201.95%200%203.73.72%205.12%201.88L13%2016h9V7l-3.6%203.6z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12.5%208c-2.65%200-5.05.99-6.9%202.6L2%207v9h9l-3.62-3.62c1.39-1.16%203.16-1.88%205.12-1.88%203.54%200%206.55%202.31%207.6%205.5l2.37-.78C21.08%2011.03%2017.15%208%2012.5%208z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M15.5%2014h-.79l-.28-.27C15.41%2012.59%2016%2011.11%2016%209.5%2016%205.91%2013.09%203%209.5%203S3%205.91%203%209.5%205.91%2016%209.5%2016c1.61%200%203.09-.59%204.23-1.57l.27.28v.79l5%204.99L20.49%2019l-4.99-5zm-6%200C7.01%2014%205%2011.99%205%209.5S7.01%205%209.5%205%2014%207.01%2014%209.5%2011.99%2014%209.5%2014z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M15.5%2014h-.79l-.28-.27C15.41%2012.59%2016%2011.11%2016%209.5%2016%205.91%2013.09%203%209.5%203S3%205.91%203%209.5%205.91%2016%209.5%2016c1.61%200%203.09-.59%204.23-1.57l.27.28v.79l5%204.99L20.49%2019l-4.99-5zm-6%200C7.01%2014%205%2011.99%205%209.5S7.01%205%209.5%205%2014%207.01%2014%209.5%2011.99%2014%209.5%2014z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M19.14%2012.94c.04-.31.06-.63.06-.94%200-.31-.02-.63-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24%200-.43.17-.47.41l-.36%202.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47%200-.59.22L2.74%208.87c-.12.21-.08.47.12.61l2.03%201.58c-.04.31-.06.63-.06.94s.02.63.06.94l-2.03%201.58c-.18.14-.23.41-.12.61l1.92%203.32c.12.22.37.29.59.22l2.39-.96c.5.38%201.03.7%201.62.94l.36%202.54c.05.24.24.41.48.41h3.84c.24%200%20.44-.17.47-.41l.36-2.54c.59-.24%201.13-.56%201.62-.94l2.39.96c.22.08.47%200%20.59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12%2015.6c-1.98%200-3.6-1.62-3.6-3.6s1.62-3.6%203.6-3.6%203.6%201.62%203.6%203.6-1.62%203.6-3.6%203.6z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M18%2016.08c-.76%200-1.44.3-1.96.77L8.91%2012.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5%201.25.81%202.04.81%201.66%200%203-1.34%203-3s-1.34-3-3-3-3%201.34-3%203c0%20.24.04.47.09.7L8.04%209.81C7.5%209.31%206.79%209%206%209c-1.66%200-3%201.34-3%203s1.34%203%203%203c.79%200%201.5-.31%202.04-.81l7.12%204.16c-.05.21-.08.43-.08.65%200%201.61%201.31%202.92%202.92%202.92%201.61%200%202.92-1.31%202.92-2.92s-1.31-2.92-2.92-2.92z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M11.99%202C6.47%202%202%206.48%202%2012s4.47%2010%209.99%2010C17.52%2022%2022%2017.52%2022%2012S17.52%202%2011.99%202zM12%2020c-4.42%200-8-3.58-8-8s3.58-8%208-8%208%203.58%208%208-3.58%208-8%208zm3.5-9c.83%200%201.5-.67%201.5-1.5S16.33%208%2015.5%208%2014%208.67%2014%209.5s.67%201.5%201.5%201.5zm-7%200c.83%200%201.5-.67%201.5-1.5S9.33%208%208.5%208%207%208.67%207%209.5%207.67%2011%208.5%2011zm3.5%206.5c2.33%200%204.31-1.46%205.11-3.5H6.89c.8%202.04%202.78%203.5%205.11%203.5z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M11.99%202C6.47%202%202%206.47%202%2012s4.47%2010%209.99%2010S22%2017.53%2022%2012%2017.52%202%2011.99%202zM12%2020c-4.42%200-8-3.58-8-8s3.58-8%208-8%208%203.58%208%208-3.58%208-8%208zm3.5-9c.83%200%201.5-.67%201.5-1.5S16.33%208%2015.5%208%2014%208.67%2014%209.5s.67%201.5%201.5%201.5zm-7%200c.83%200%201.5-.67%201.5-1.5S9.33%208%208.5%208%207%208.67%207%209.5%207.67%2011%208.5%2011zm3.5%206.5c2.33%200%204.31-1.46%205.11-3.5H6.89c.8%202.04%202.78%203.5%205.11%203.5z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12%2017.27L18.18%2021l-1.64-7.03L22%209.24l-7.19-.61L12%202%209.19%208.63%202%209.24l5.46%204.73L5.82%2021z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M22%209.24l-7.19-.62L12%202%209.19%208.63%202%209.24l5.46%204.73L5.82%2021%2012%2017.27%2018.18%2021l-1.63-7.03L22%209.24zM12%2015.4l-3.76%202.27%201-4.28-3.32-2.88%204.38-.38L12%206.1l1.71%204.04%204.38.38-3.32%202.88%201%204.28L12%2015.4z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12%202C6.48%202%202%206.48%202%2012s4.48%2010%2010%2010%2010-4.48%2010-10S17.52%202%2012%202zm-2%2015l-5-5%201.41-1.41L10%2014.17l7.59-7.59L19%208l-9%209z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M9%2016.2L4.8%2012l-1.4%201.4L9%2019%2021%207l-1.4-1.4L9%2016.2z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M9%2016.17L4.83%2012l-1.42%201.41L9%2019%2021%207l-1.41-1.41z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M19.35%2010.04C18.67%206.59%2015.64%204%2012%204%209.11%204%206.6%205.64%205.35%208.04%202.34%208.36%200%2010.91%200%2014c0%203.31%202.69%206%206%206h13c2.76%200%205-2.24%205-5%200-2.64-2.05-4.78-4.65-4.96zM14%2013v4h-4v-4H7l5-5%205%205h-3z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12%2012c2.21%200%204-1.79%204-4s-1.79-4-4-4-4%201.79-4%204%201.79%204%204%204zm0%202c-2.67%200-8%201.34-8%204v2h16v-2c0-2.66-5.33-4-8-4z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M19%203H5c-1.1%200-2%20.9-2%202v14c0%201.1.9%202%202%202h14c1.1%200%202-.9%202-2V5c0-1.1-.9-2-2-2zm-7%203c1.93%200%203.5%201.57%203.5%203.5S13.93%2013%2012%2013s-3.5-1.57-3.5-3.5S10.07%206%2012%206zm7%2013H5v-.23c0-.62.28-1.2.76-1.58C7.47%2015.82%209.64%2015%2012%2015s4.53.82%206.24%202.19c.48.38.76.97.76%201.58V19z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M16%2011c1.66%200%202.99-1.34%202.99-3S17.66%205%2016%205c-1.66%200-3%201.34-3%203s1.34%203%203%203zm-8%200c1.66%200%202.99-1.34%202.99-3S9.66%205%208%205C6.34%205%205%206.34%205%208s1.34%203%203%203zm0%202c-2.33%200-7%201.17-7%203.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8%200c-.29%200-.62.02-.97.05%201.16.84%201.97%201.97%201.97%203.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12%202C6.48%202%202%206.48%202%2012s4.48%2010%2010%2010%2010-4.48%2010-10S17.52%202%2012%202zm1%2015h-2v-2h2v2zm0-4h-2V7h2v6z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12%202C6.48%202%202%206.48%202%2012s4.48%2010%2010%2010%2010-4.48%2010-10S17.52%202%2012%202zm1%2015h-2v-2h2v2zm0-4h-2V7h2v6z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M15.5%2014h-.79l-.28-.27C15.41%2012.59%2016%2011.11%2016%209.5%2016%205.91%2013.09%203%209.5%203S3%205.91%203%209.5%205.91%2016%209.5%2016c1.61%200%203.09-.59%204.23-1.57l.27.28v.79l5%204.99L20.49%2019l-4.99-5zm-6%200C7.01%2014%205%2011.99%205%209.5S7.01%205%209.5%205%2014%207.01%2014%209.5%2011.99%2014%209.5%2014z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M15.5%2014h-.79l-.28-.27C15.41%2012.59%2016%2011.11%2016%209.5%2016%205.91%2013.09%203%209.5%203S3%205.91%203%209.5%205.91%2016%209.5%2016c1.61%200%203.09-.59%204.23-1.57l.27.28v.79l5%204.99L20.49%2019l-4.99-5zm-6%200C7.01%2014%205%2011.99%205%209.5S7.01%205%209.5%205%2014%207.01%2014%209.5%2011.99%2014%209.5%2014zM7%209h5v1H7z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M12%204V1L8%205l4%204V6c3.31%200%206%202.69%206%206%200%201.01-.25%201.97-.7%202.8l1.46%201.46C19.54%2015.03%2020%2013.57%2020%2012c0-4.42-3.58-8-8-8zm0%2014c-3.31%200-6-2.69-6-6%200-1.01.25-1.97.7-2.8L5.24%207.74C4.46%208.97%204%2010.43%204%2012c0%204.42%203.58%208%208%208v3l4-4-4-4v3z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M11.99%202C6.47%202%202%206.48%202%2012s4.47%2010%209.99%2010C17.52%2022%2022%2017.52%2022%2012S17.52%202%2011.99%202zM12%2020c-4.42%200-8-3.58-8-8s3.58-8%208-8%208%203.58%208%208-3.58%208-8%208zm.5-13H11v6l5.25%203.15.75-1.23-4.5-2.67z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M17%203H7c-1.1%200-2%20.9-2%202v16l7-3%207%203V5c0-1.1-.9-2-2-2z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M17%203H7c-1.1%200-1.99.9-1.99%202L5%2021l7-3%207%203V5c0-1.1-.9-2-2-2zm0%2015l-5-2.18L7%2018V5h10v13z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M20%202H4c-1.1%200-2%20.9-2%202v18l4-4h14c1.1%200%202-.9%202-2V4c0-1.1-.9-2-2-2zm0%2014H6l-2%202V4h16v12z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20viewBox='0%200%2024%2024'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill='currentColor'%20d='M19%203h-4.18C14.4%201.84%2013.3%201%2012%201c-1.3%200-2.4.84-2.82%202H5c-1.1%200-2%20.9-2%202v14c0%201.1.9%202%202%202h14c1.1%200%202-.9%202-2V5c0-1.1-.9-2-2-2zm-7%200c.55%200%201%20.45%201%201s-.45%201-1%201-1-.45-1-1%20.45-1%201-1zm2%2014H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z'/%3e%3c/svg%3e\"","// 导入所有 SVG 图标\nimport arrowDown from './icons/arrow-down.svg'\nimport arrowLeft from './icons/arrow-left.svg'\nimport arrowRight from './icons/arrow-right.svg'\nimport arrowUp from './icons/arrow-up.svg'\nimport check from './icons/check.svg'\nimport checkCircle from './icons/check-circle.svg'\nimport chevronLeft from './icons/chevron-left.svg'\nimport chevronRight from './icons/chevron-right.svg'\nimport clear from './icons/clear.svg'\nimport clearO from './icons/clear-o.svg'\nimport close from './icons/close.svg'\nimport code from './icons/code.svg'\nimport copy from './icons/copy.svg'\nimport deleteIcon from './icons/delete.svg'\nimport download from './icons/download.svg'\nimport edit from './icons/edit.svg'\nimport email from './icons/email.svg'\nimport error from './icons/error.svg'\nimport errorO from './icons/error-o.svg'\nimport expandLess from './icons/expand-less.svg'\nimport expandMore from './icons/expand-more.svg'\nimport eye from './icons/eye.svg'\nimport eyeOff from './icons/eye-off.svg'\nimport flag from './icons/flag.svg'\nimport flagO from './icons/flag-o.svg'\nimport fullscreen from './icons/fullscreen.svg'\nimport exitFullscreen from './icons/exit-fullscreen.svg'\nimport grid from './icons/grid.svg'\nimport heart from './icons/heart.svg'\nimport heartO from './icons/heart-o.svg'\nimport info from './icons/info.svg'\nimport infoO from './icons/info-o.svg'\nimport keyboardArrowDown from './icons/keyboard-arrow-down.svg'\nimport keyboardArrowLeft from './icons/keyboard-arrow-left.svg'\nimport keyboardArrowRight from './icons/keyboard-arrow-right.svg'\nimport keyboardArrowUp from './icons/keyboard-arrow-up.svg'\nimport like from './icons/like.svg'\nimport likeO from './icons/like-o.svg'\nimport link from './icons/link.svg'\nimport list from './icons/list.svg'\nimport lock from './icons/lock.svg'\nimport unlock from './icons/unlock.svg'\nimport loading from './icons/loading.svg'\nimport menu from './icons/menu.svg'\nimport menuO from './icons/menu-o.svg'\nimport message from './icons/message.svg'\nimport minus from './icons/minus.svg'\nimport notification from './icons/notification.svg'\nimport bell from './icons/bell.svg'\nimport phone from './icons/phone.svg'\nimport plus from './icons/plus.svg'\nimport question from './icons/question.svg'\nimport refresh from './icons/refresh.svg'\nimport refreshO from './icons/refresh-o.svg'\nimport reload from './icons/reload.svg'\nimport redo from './icons/redo.svg'\nimport undo from './icons/undo.svg'\nimport search from './icons/search.svg'\nimport searchO from './icons/search-o.svg'\nimport setting from './icons/setting.svg'\nimport share from './icons/share.svg'\nimport smile from './icons/smile.svg'\nimport smileO from './icons/smile-o.svg'\nimport star from './icons/star.svg'\nimport starO from './icons/star-o.svg'\nimport success from './icons/success.svg'\nimport successO from './icons/success-o.svg'\nimport tick from './icons/tick.svg'\nimport upload from './icons/upload.svg'\nimport user from './icons/user.svg'\nimport account from './icons/account.svg'\nimport group from './icons/group.svg'\nimport warning from './icons/warning.svg'\nimport warningO from './icons/warning-o.svg'\nimport zoomIn from './icons/zoom-in.svg'\nimport zoomOut from './icons/zoom-out.svg'\nimport sync from './icons/sync.svg'\nimport clock from './icons/clock.svg'\nimport bookmark from './icons/bookmark.svg'\nimport bookmarkO from './icons/bookmark-o.svg'\nimport chat from './icons/chat.svg'\nimport clipboard from './icons/clipboard.svg'\n\n// 图标映射表\nexport const icons: Record<string, string> = {\n // 箭头类\n 'arrow-down': arrowDown,\n 'arrow-left': arrowLeft,\n 'arrow-right': arrowRight,\n 'arrow-up': arrowUp,\n 'chevron-left': chevronLeft,\n 'chevron-right': chevronRight,\n 'expand-less': expandLess,\n 'expand-more': expandMore,\n 'keyboard-arrow-down': keyboardArrowDown,\n 'keyboard-arrow-left': keyboardArrowLeft,\n 'keyboard-arrow-right': keyboardArrowRight,\n 'keyboard-arrow-up': keyboardArrowUp,\n\n // 操作类\n 'check': check,\n 'check-circle': checkCircle,\n 'clear': clear,\n 'clear-o': clearO,\n 'close': close,\n 'plus': plus,\n 'minus': minus,\n 'tick': tick,\n\n // 编辑类\n 'copy': copy,\n 'cut': copy,\n 'edit': edit,\n 'delete': deleteIcon,\n 'undo': undo,\n 'redo': redo,\n\n // 文件类\n 'upload': upload,\n 'download': download,\n 'file': clipboard,\n 'folder': clipboard,\n\n // 状态类\n 'success': success,\n 'success-o': successO,\n 'warning': warning,\n 'warning-o': warningO,\n 'error': error,\n 'error-o': errorO,\n 'info': info,\n 'info-o': infoO,\n 'question': question,\n 'loading': loading,\n\n // 社交类\n 'heart': heart,\n 'heart-o': heartO,\n 'star': star,\n 'star-o': starO,\n 'like': like,\n 'like-o': likeO,\n 'share': share,\n\n // 用户类\n 'user': user,\n 'account': account,\n 'group': group,\n 'smile': smile,\n 'smile-o': smileO,\n\n // 安全类\n 'lock': lock,\n 'unlock': unlock,\n 'eye': eye,\n 'eye-off': eyeOff,\n\n // 交互类\n 'search': search,\n 'search-o': searchO,\n 'zoom-in': zoomIn,\n 'zoom-out': zoomOut,\n 'refresh': refresh,\n 'refresh-o': refreshO,\n 'reload': reload,\n 'sync': sync,\n 'setting': setting,\n 'fullscreen': fullscreen,\n 'exit-fullscreen': exitFullscreen,\n\n // 导航类\n 'menu': menu,\n 'menu-o': menuO,\n 'list': list,\n 'grid': grid,\n 'more': expandMore,\n 'less': expandLess,\n\n // 通讯类\n 'email': email,\n 'phone': phone,\n 'message': message,\n 'chat': chat,\n 'notification': notification,\n 'bell': bell,\n 'link': link,\n\n // 标记类\n 'flag': flag,\n 'flag-o': flagO,\n 'bookmark': bookmark,\n 'bookmark-o': bookmarkO,\n 'tag': flag,\n\n // 其他\n 'code': code,\n 'clock': clock,\n 'time': clock,\n 'calendar': clock,\n}\n\n// 获取图标 SVG 内容\nexport function getIcon(name: string): string | undefined {\n return icons[name]\n}\n\n// 获取所有图标名称\nexport function getIconNames(): string[] {\n return Object.keys(icons)\n}\n\n// 添加自定义图标\nexport function addIcon(name: string, svg: string): void {\n icons[name] = svg\n}\n\n// 默认导出所有图标\nexport default icons","<template>\n <view\n class=\"u-icon\"\n :class=\"{ 'u-icon--spin': spin }\"\n :style=\"iconStyle\"\n @click=\"handleClick\"\n >\n <!-- SVG 图标模式 -->\n <image\n v-if=\"isSvgIcon && iconSrc\"\n class=\"u-icon__svg\"\n :src=\"iconSrc\"\n :style=\"{ width: sizePx, height: sizePx }\"\n mode=\"aspectFit\"\n />\n <!-- Emoji/文字模式 -->\n <text v-else class=\"u-icon__inner\">{{ name }}</text>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { getIcon } from './index'\n\ninterface Props {\n name: string\n size?: number | string\n color?: string\n spin?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 16\n})\n\nconst emit = defineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst handleClick = (event: MouseEvent) => {\n emit('click', event)\n}\n\n// 判断是否为 SVG 图标\nconst isSvgIcon = computed(() => {\n return !!getIcon(props.name)\n})\n\n// 获取图标 SVG 资源\nconst iconSrc = computed(() => {\n return getIcon(props.name)\n})\n\n// 尺寸转换为 px\nconst sizePx = computed(() => {\n const size = typeof props.size === 'number' ? props.size : parseInt(props.size)\n return size + 'px'\n})\n\n// 图标样式\nconst iconStyle = computed(() => {\n const size = typeof props.size === 'number' ? props.size : parseInt(props.size)\n const style: Record<string, string> = {\n fontSize: size + 'px',\n width: size + 'px',\n height: size + 'px'\n }\n // SVG 图标通过 fill=\"currentColor\" 支持颜色\n // 但 image 标签不支持直接设置颜色,需要通过 filter 或特殊处理\n if (props.color && !isSvgIcon.value) {\n style.color = props.color\n }\n return style\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-style: normal;\n line-height: 1;\n\n &--spin {\n animation: u-icon-spin 1s linear infinite;\n }\n\n &__inner {\n font-family: inherit;\n line-height: 1;\n }\n\n &__svg {\n display: block;\n object-fit: contain;\n }\n}\n\n@keyframes u-icon-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n</style>","<template>\n <view class=\"u-loading\" :class=\"{ 'u-loading--vertical': vertical }\">\n <view class=\"u-loading__spinner\" :style=\"{ width: size + 'px', height: size + 'px' }\">\n <view\n v-for=\"i in 12\"\n :key=\"i\"\n class=\"u-loading__line\"\n :style=\"{\n transform: `rotate(${i * 30}deg)`,\n backgroundColor: color\n }\"\n />\n </view>\n <text v-if=\"text\" class=\"u-loading__text\" :style=\"{ color: textColor || color }\">{{ text }}</text>\n </view>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n size?: number | string\n color?: string\n text?: string\n textColor?: string\n vertical?: boolean\n}\n\nwithDefaults(defineProps<Props>(), {\n size: 30,\n color: '#1989fa'\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-loading {\n display: inline-flex;\n align-items: center;\n gap: $--spacing-sm;\n\n &--vertical {\n flex-direction: column;\n }\n\n &__spinner {\n position: relative;\n display: inline-block;\n }\n\n &__line {\n position: absolute;\n top: 0;\n left: 50%;\n width: 2px;\n height: 25%;\n margin-left: -1px;\n border-radius: 1px;\n transform-origin: center 200%;\n opacity: 0.2;\n\n @for $i from 1 through 12 {\n &:nth-child(#{$i}) {\n opacity: 0.2 + ($i - 1) * 0.06;\n }\n }\n }\n\n &__text {\n font-size: $--font-size-sm;\n line-height: 1.5;\n }\n}\n</style>\n","<template>\n <view class=\"u-tag\" :class=\"[`u-tag--${type}`, `u-tag--${size}`, { 'u-tag--plain': plain, 'u-tag--round': round }]\" :style=\"tagStyle\">\n <text class=\"u-tag__text\"><slot /></text>\n <view v-if=\"closable\" class=\"u-tag__close\" @click=\"handleClose\">\n <text>×</text>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ntype TagType = 'primary' | 'success' | 'warning' | 'danger' | 'default'\ntype TagSize = 'large' | 'medium' | 'small'\n\ninterface Props {\n type?: TagType\n size?: TagSize\n plain?: boolean\n round?: boolean\n closable?: boolean\n color?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: 'default',\n size: 'medium',\n plain: false,\n round: false,\n closable: false\n})\n\nconst emit = defineEmits<{\n close: []\n}>()\n\nconst tagStyle = computed(() => {\n if (props.color) {\n return {\n backgroundColor: props.plain ? 'transparent' : props.color,\n borderColor: props.color,\n color: props.plain ? props.color : '#fff'\n }\n }\n return {}\n})\n\nconst handleClose = () => {\n emit('close')\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-tag {\n display: inline-flex;\n align-items: center;\n padding: 0 $--spacing-sm;\n border-radius: 2px;\n border: 1px solid transparent;\n font-size: $--font-size-sm;\n\n &--default {\n color: $--text-color;\n background-color: $--bg-color-3;\n border-color: $--bg-color-3;\n }\n\n &--primary {\n color: $--text-color-white;\n background-color: $--color-primary;\n border-color: $--color-primary;\n }\n\n &--success {\n color: $--text-color-white;\n background-color: $--color-success;\n border-color: $--color-success;\n }\n\n &--warning {\n color: $--text-color-white;\n background-color: $--color-warning;\n border-color: $--color-warning;\n }\n\n &--danger {\n color: $--text-color-white;\n background-color: $--color-danger;\n border-color: $--color-danger;\n }\n\n &--large {\n padding: $--spacing-sm $--spacing-md;\n font-size: $--font-size-md;\n }\n\n &--small {\n padding: 0 $--spacing-xs;\n font-size: $--font-size-xs;\n }\n\n &--plain {\n background-color: transparent;\n\n &.u-tag--primary {\n color: $--color-primary;\n }\n\n &.u-tag--success {\n color: $--color-success;\n }\n\n &.u-tag--warning {\n color: $--color-warning;\n }\n\n &.u-tag--danger {\n color: $--color-danger;\n }\n }\n\n &--round {\n border-radius: 999px;\n }\n\n &__text {\n line-height: 1.4;\n }\n\n &__close {\n margin-left: 2px;\n font-size: 12px;\n }\n}\n</style>\n","<template>\n <view\n class=\"u-switch\"\n :class=\"{ 'u-switch--on': modelValue, 'u-switch--disabled': disabled }\"\n :style=\"switchStyle\"\n @click=\"handleClick\"\n >\n <view class=\"u-switch__node\" :style=\"nodeStyle\">\n <u-loading v-if=\"loading\" :size=\"nodeSize\" :color=\"modelValue ? '#fff' : '#999'\" />\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n modelValue?: boolean\n disabled?: boolean\n loading?: boolean\n size?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: false,\n disabled: false,\n loading: false,\n size: 30\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n change: [value: boolean]\n}>()\n\n// 计算节点大小\nconst nodeSize = computed(() => Math.round(props.size * 0.8))\n\n// 开关样式\nconst switchStyle = computed(() => ({\n width: `${Math.round(props.size * 1.67)}px`,\n height: `${props.size}px`,\n borderRadius: `${props.size / 2}px`\n}))\n\n// 节点样式\nconst nodeStyle = computed(() => {\n const node = nodeSize.value\n const gap = Math.round((props.size - node) / 2)\n const translateX = props.modelValue ? props.size - node - gap * 2 : 0\n\n return {\n width: `${node}px`,\n height: `${node}px`,\n top: `${gap}px`,\n left: `${gap}px`,\n transform: `translateX(${translateX}px)`\n }\n})\n\nconst handleClick = () => {\n if (props.disabled || props.loading) return\n\n const newValue = !props.modelValue\n emit('update:modelValue', newValue)\n emit('change', newValue)\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-switch {\n position: relative;\n background-color: $--bg-color-3;\n transition: background-color $--transition-duration;\n box-sizing: border-box;\n\n &--on {\n background-color: $--color-primary;\n }\n\n &--disabled {\n opacity: 0.5;\n }\n\n &__node {\n position: absolute;\n background-color: $--bg-color-2;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform $--transition-duration;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n}\n</style>","<template>\n <view class=\"u-image\" :style=\"{ width: width + 'px', height: height + 'px' }\">\n <image\n class=\"u-image__inner\"\n :src=\"src\"\n :mode=\"mode\"\n :lazy-load=\"lazyLoad\"\n :fade=\"fade\"\n @load=\"handleLoad\"\n @error=\"handleError\"\n />\n <view v-if=\"loading && !loaded\" class=\"u-image__loading\">\n <slot name=\"loading\">\n <u-loading :size=\"20\" />\n </slot>\n </view>\n <view v-if=\"error && !loaded\" class=\"u-image__error\">\n <slot name=\"error\">\n <text class=\"u-image__error-text\">加载失败</text>\n </slot>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\n\ninterface Props {\n src: string\n width?: number | string\n height?: number | string\n mode?: string\n lazyLoad?: boolean\n fade?: boolean\n loading?: boolean\n error?: boolean\n}\n\nwithDefaults(defineProps<Props>(), {\n width: 100,\n height: 100,\n mode: 'aspectFill',\n lazyLoad: true,\n fade: true,\n loading: true,\n error: true\n})\n\nconst emit = defineEmits<{\n load: [event: Event]\n error: [event: Event]\n}>()\n\nconst loaded = ref(false)\n\nconst handleLoad = (event: Event) => {\n loaded.value = true\n emit('load', event)\n}\n\nconst handleError = (event: Event) => {\n loaded.value = false\n emit('error', event)\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-image {\n position: relative;\n display: inline-block;\n overflow: hidden;\n\n &__inner {\n width: 100%;\n height: 100%;\n display: block;\n }\n\n &__loading,\n &__error {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: $--bg-color;\n }\n\n &__error-text {\n font-size: $--font-size-sm;\n color: $--text-color-3;\n }\n}\n</style>\n","<template>\n <view class=\"u-divider\" :class=\"{ 'u-divider--hairline': hairline, 'u-divider--dashed': dashed }\">\n <view v-if=\"$slots.default || content\" class=\"u-divider__text\">\n <slot>{{ content }}</slot>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n content?: string\n hairline?: boolean\n dashed?: boolean\n}\n\nwithDefaults(defineProps<Props>(), {\n content: '',\n hairline: false,\n dashed: false\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-divider {\n display: flex;\n align-items: center;\n margin: $--spacing-lg 0;\n color: $--text-color-2;\n font-size: $--font-size-sm;\n line-height: 1;\n\n &::before,\n &::after {\n content: '';\n flex: 1;\n height: 1px;\n background-color: $--border-color;\n }\n\n &--hairline {\n &::before,\n &::after {\n transform: scaleY(0.5);\n }\n }\n\n &--dashed {\n &::before,\n &::after {\n border-style: dashed;\n background: transparent;\n border-top: 1px dashed $--border-color;\n border-bottom: none;\n height: 0;\n }\n }\n\n &__text {\n padding: 0 $--spacing-md;\n }\n}\n</style>\n","<template>\n <view class=\"u-notice-bar\" :class=\"{ 'u-notice-bar--wrapable': wrapable }\" :style=\"{ color, background: background }\">\n <view v-if=\"$slots.leftIcon || leftIcon\" class=\"u-notice-bar__left-icon\">\n <slot name=\"leftIcon\">\n <text>{{ leftIcon }}</text>\n </slot>\n </view>\n <view class=\"u-notice-bar__content\" :class=\"{ 'u-notice-bar__content--scrollable': scrollable }\">\n <view\n v-if=\"scrollable\"\n class=\"u-notice-bar__text\"\n :style=\"{ animationDuration: speed + 's' }\"\n >\n {{ text }}\n </view>\n <text v-else class=\"u-notice-bar__text\">{{ text }}</text>\n </view>\n <view v-if=\"$slots.rightIcon || rightIcon\" class=\"u-notice-bar__right-icon\" @click=\"handleRightIconClick\">\n <slot name=\"rightIcon\">\n <text>{{ rightIcon }}</text>\n </slot>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n text: string\n color?: string\n background?: string\n leftIcon?: string\n rightIcon?: string\n scrollable?: boolean\n speed?: number\n wrapable?: boolean\n}\n\nwithDefaults(defineProps<Props>(), {\n color: '#ed6a0c',\n background: '#fffbe8',\n scrollable: false,\n speed: 10,\n wrapable: false\n})\n\nconst emit = defineEmits<{\n 'right-icon-click': []\n}>()\n\nconst handleRightIconClick = () => {\n emit('right-icon-click')\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-notice-bar {\n display: flex;\n align-items: center;\n padding: $--spacing-md $--spacing-lg;\n font-size: $--font-size-sm;\n line-height: 24px;\n\n &--wrapable {\n flex-wrap: wrap;\n padding: $--spacing-md $--spacing-lg;\n }\n\n &__content {\n flex: 1;\n overflow: hidden;\n position: relative;\n\n &--scrollable {\n overflow: hidden;\n white-space: nowrap;\n }\n }\n\n &__text {\n display: inline-block;\n\n .u-notice-bar__content--scrollable & {\n animation: u-notice-bar-scroll linear infinite;\n }\n }\n\n &__left-icon {\n margin-right: $--spacing-sm;\n }\n\n &__right-icon {\n margin-left: $--spacing-sm;\n }\n}\n\n@keyframes u-notice-bar-scroll {\n 0% {\n transform: translateX(100%);\n }\n 100% {\n transform: translateX(-100%);\n }\n}\n</style>\n","<template>\n <view class=\"u-layout\" :class=\"{ 'u-layout--has-footer': hasFooter }\">\n <view v-if=\"$slots.header\" class=\"u-layout__header\">\n <slot name=\"header\" />\n </view>\n <view class=\"u-layout__content\">\n <slot />\n </view>\n <view v-if=\"$slots.footer\" class=\"u-layout__footer\">\n <slot name=\"footer\" />\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { useSlots, computed } from 'vue'\n\nconst slots = useSlots()\n\nconst hasFooter = computed(() => !!slots.footer)\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-layout {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n background-color: $--bg-color;\n\n &__header {\n position: sticky;\n top: 0;\n z-index: 100;\n background-color: $--bg-color-2;\n }\n\n &__content {\n flex: 1;\n overflow: auto;\n }\n\n &__footer {\n position: sticky;\n bottom: 0;\n z-index: 100;\n background-color: $--bg-color-2;\n }\n}\n</style>\n","<template>\n <view class=\"u-badge\" :class=\"{ 'u-badge--fixed': fixed }\">\n <slot />\n <view\n v-if=\"showBadge\"\n class=\"u-badge__content\"\n :class=\"[`u-badge__content--${type}`, { 'u-badge__content--dot': dot, 'u-badge__content--alone': !$slots.default }]\"\n :style=\"badgeStyle\"\n >\n <text v-if=\"!dot && displayValue\" class=\"u-badge__text\">{{ displayValue }}</text>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ntype BadgeType = 'primary' | 'success' | 'warning' | 'danger' | 'info'\n\ninterface Props {\n value?: number | string\n max?: number\n dot?: boolean\n hidden?: boolean\n type?: BadgeType\n color?: string\n offset?: [number, number]\n fixed?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n max: 99,\n dot: false,\n hidden: false,\n type: 'danger',\n fixed: false\n})\n\nconst showBadge = computed(() => {\n return !props.hidden && (props.dot || props.value !== undefined)\n})\n\nconst displayValue = computed(() => {\n if (props.dot) return ''\n if (typeof props.value === 'number') {\n return props.value > props.max ? `${props.max}+` : props.value\n }\n return props.value\n})\n\nconst badgeStyle = computed(() => {\n const style: Record<string, string> = {}\n\n if (props.color) {\n style.backgroundColor = props.color\n }\n\n if (props.offset && props.offset.length === 2) {\n const [x, y] = props.offset\n style.transform = `translate(${x}px, ${y}px)`\n }\n\n return style\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-badge {\n position: relative;\n display: inline-block;\n\n &--fixed {\n position: absolute;\n top: 0;\n right: 0;\n transform: translate(50%, -50%);\n }\n\n &__content {\n position: absolute;\n top: 0;\n right: 0;\n transform: translate(50%, -50%);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 16px;\n height: 16px;\n padding: 0 5px;\n border-radius: 999px;\n font-size: $--font-size-xs;\n line-height: 1;\n color: $--text-color-white;\n white-space: nowrap;\n box-sizing: border-box;\n\n &--dot {\n min-width: 8px;\n width: 8px;\n height: 8px;\n padding: 0;\n border-radius: 50%;\n }\n\n &--alone {\n position: relative;\n transform: none;\n }\n\n &--primary {\n background-color: $--color-primary;\n }\n\n &--success {\n background-color: $--color-success;\n }\n\n &--warning {\n background-color: $--color-warning;\n }\n\n &--danger {\n background-color: $--color-danger;\n }\n\n &--info {\n background-color: $--color-info;\n }\n }\n\n &__text {\n display: inline-block;\n vertical-align: middle;\n }\n}\n</style>\n","<template>\n <view v-if=\"visible\" class=\"u-loading-page\">\n <view class=\"u-loading-page__content\">\n <view class=\"u-loading-page__spinner\" :style=\"{ width: size + 'px', height: size + 'px' }\">\n <view\n v-for=\"i in 12\"\n :key=\"i\"\n class=\"u-loading-page__line\"\n :style=\"{\n transform: `rotate(${i * 30}deg)`,\n backgroundColor: color\n }\"\n />\n </view>\n <text v-if=\"text\" class=\"u-loading-page__text\" :style=\"{ color: textColor || color }\">{{ text }}</text>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n visible?: boolean\n text?: string\n color?: string\n textColor?: string\n size?: number | string\n}\n\nwithDefaults(defineProps<Props>(), {\n visible: false,\n text: '加载中...',\n color: '#1989fa',\n size: 40\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-loading-page {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: $--bg-color-2;\n\n &__content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: $--spacing-md;\n }\n\n &__spinner {\n position: relative;\n display: inline-block;\n }\n\n &__line {\n position: absolute;\n top: 0;\n left: 50%;\n width: 3px;\n height: 25%;\n margin-left: -1.5px;\n border-radius: 2px;\n transform-origin: center 200%;\n opacity: 0.2;\n\n @for $i from 1 through 12 {\n &:nth-child(#{$i}) {\n opacity: 0.2 + ($i - 1) * 0.06;\n }\n }\n }\n\n &__text {\n font-size: $--font-size-md;\n line-height: 1.5;\n }\n}\n</style>\n","<template>\n <view class=\"u-parse\">\n <rich-text\n :nodes=\"parsedNodes\"\n :selectable=\"selectable\"\n :image-menu-prevent=\"imageMenuPrevent\"\n @tap=\"handleTap\"\n />\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n content: string\n selectable?: boolean\n imageMenuPrevent?: boolean\n imageMode?: 'aspectFit' | 'aspectFill' | 'widthFix' | 'scaleToFill'\n tagStyle?: Record<string, string>\n lazyLoad?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n content: '',\n selectable: false,\n imageMenuPrevent: false,\n imageMode: 'widthFix',\n lazyLoad: false\n})\n\nconst emit = defineEmits<{\n load: []\n error: [event: Event]\n imgTap: [src: string]\n linkTap: [href: string]\n}>()\n\n// 默认标签样式\nconst defaultTagStyle: Record<string, string> = {\n p: 'margin: 0 0 16px 0; line-height: 1.6;',\n h1: 'font-size: 28px; font-weight: bold; margin: 0 0 16px 0;',\n h2: 'font-size: 24px; font-weight: bold; margin: 0 0 14px 0;',\n h3: 'font-size: 20px; font-weight: bold; margin: 0 0 12px 0;',\n h4: 'font-size: 18px; font-weight: bold; margin: 0 0 10px 0;',\n h5: 'font-size: 16px; font-weight: bold; margin: 0 0 8px 0;',\n h6: 'font-size: 14px; font-weight: bold; margin: 0 0 8px 0;',\n img: 'max-width: 100%; height: auto; display: block;',\n ul: 'margin: 0 0 16px 0; padding-left: 20px;',\n ol: 'margin: 0 0 16px 0; padding-left: 20px;',\n li: 'margin: 4px 0;',\n blockquote: 'margin: 0 0 16px 0; padding: 8px 16px; border-left: 4px solid #ebedf0; background: #f7f8fa;',\n pre: 'margin: 0 0 16px 0; padding: 12px; background: #f7f8fa; border-radius: 4px; overflow-x: auto;',\n code: 'padding: 2px 6px; background: #f7f8fa; border-radius: 2px; font-family: monospace;',\n a: 'color: #1989fa; text-decoration: none;',\n table: 'width: 100%; border-collapse: collapse; margin: 0 0 16px 0;',\n th: 'padding: 8px; border: 1px solid #ebedf0; background: #f7f8fa; font-weight: bold;',\n td: 'padding: 8px; border: 1px solid #ebedf0;',\n hr: 'border: none; border-top: 1px solid #ebedf0; margin: 16px 0;',\n br: 'content: \"\"; display: block; margin-bottom: 8px;'\n}\n\n// 合并样式\nconst mergedTagStyle = computed(() => {\n return { ...defaultTagStyle, ...props.tagStyle }\n})\n\n// 解析内容\nconst parsedNodes = computed(() => {\n if (!props.content) return ''\n\n let html = props.content\n\n // 处理图片\n html = html.replace(/<img([^>]*)>/gi, (match, attrs) => {\n const srcMatch = attrs.match(/src=[\"']([^\"']+)[\"']/i)\n const altMatch = attrs.match(/alt=[\"']([^\"']*)[\"']/i)\n const widthMatch = attrs.match(/width=[\"']?(\\d+)[\"']?/i)\n const heightMatch = attrs.match(/height=[\"']?(\\d+)[\"']?/i)\n\n const src = srcMatch ? srcMatch[1] : ''\n const alt = altMatch ? altMatch[1] : ''\n const width = widthMatch ? widthMatch[1] : 'auto'\n const height = heightMatch ? heightMatch[1] : 'auto'\n\n const style = mergedTagStyle.value.img || ''\n const widthStyle = width !== 'auto' ? `width: ${width}px;` : 'width: 100%;'\n const heightStyle = height !== 'auto' ? `height: ${height}px;` : ''\n\n // 懒加载处理\n const lazyAttr = props.lazyLoad ? `lazy-load=\"true\"` : ''\n return `<img src=\"${src}\" alt=\"${alt}\" style=\"${style} ${widthStyle} ${heightStyle}\" data-src=\"${src}\" ${lazyAttr} />`\n })\n\n // 处理链接\n html = html.replace(/<a([^>]*)>/gi, (match, attrs) => {\n const hrefMatch = attrs.match(/href=[\"']([^\"']+)[\"']/i)\n const href = hrefMatch ? hrefMatch[1] : '#'\n const style = mergedTagStyle.value.a || ''\n return `<a href=\"${href}\" style=\"${style}\" data-href=\"${href}\">`\n })\n\n // 添加默认样式到标签\n const tags = ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'li', 'blockquote', 'pre', 'code', 'table', 'th', 'td', 'hr']\n tags.forEach(tag => {\n const style = mergedTagStyle.value[tag]\n if (style) {\n const regex = new RegExp(`<${tag}([^>]*)>`, 'gi')\n html = html.replace(regex, (match, attrs) => {\n const hasStyle = /style=/i.test(attrs)\n if (hasStyle) {\n return match.replace(/style=[\"']([^\"']*)[\"']/i, `style=\"$1; ${style}\"`)\n }\n return `<${tag} style=\"${style}\"${attrs}>`\n })\n }\n })\n\n return html\n})\n\n// 处理点击事件\nconst handleTap = (event: any) => {\n const target = event.target\n\n // 处理图片点击\n if (target.tagName === 'IMG') {\n const src = target.getAttribute('data-src') || target.getAttribute('src')\n if (src) {\n emit('imgTap', src)\n }\n }\n\n // 处理链接点击\n if (target.tagName === 'A') {\n event.stopPropagation?.()\n const href = target.getAttribute('data-href') || target.getAttribute('href')\n if (href && href !== '#') {\n emit('linkTap', href)\n }\n }\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-parse {\n font-size: $--font-size-md;\n line-height: 1.6;\n color: $--text-color;\n word-break: break-word;\n\n :deep(img) {\n max-width: 100%;\n height: auto;\n vertical-align: middle;\n }\n\n :deep(a) {\n color: $--color-primary;\n text-decoration: none;\n\n &:active {\n opacity: 0.7;\n }\n }\n\n :deep(pre) {\n white-space: pre-wrap;\n word-wrap: break-word;\n }\n\n :deep(code) {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n }\n\n :deep(table) {\n display: block;\n overflow-x: auto;\n }\n\n :deep(blockquote) {\n border-left: 4px solid $--border-color;\n background-color: $--bg-color;\n padding: $--spacing-md $--spacing-lg;\n margin: $--spacing-md 0;\n }\n}\n</style>\n","<template>\n <view v-if=\"visible\" class=\"u-keyboard\" @click=\"handleOverlayClick\">\n <view class=\"u-keyboard__panel\" @click.stop>\n <view class=\"u-keyboard__header\">\n <text class=\"u-keyboard__title\">{{ title }}</text>\n <text class=\"u-keyboard__close\" @click=\"handleClose\">完成</text>\n </view>\n\n <view class=\"u-keyboard__body\" :class=\"`u-keyboard__body--${type}`\">\n <view\n v-for=\"(key, index) in displayKeys\"\n :key=\"`${key}-${index}`\"\n class=\"u-keyboard__key\"\n :class=\"{\n 'u-keyboard__key--action': isActionKey(key),\n 'u-keyboard__key--wide': key === '删除' || key === 'ABC' || key === '省份'\n }\"\n @click=\"handleKeyClick(key)\"\n >\n <text>{{ key }}</text>\n </view>\n </view>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ntype KeyboardType = 'number' | 'idcard' | 'car'\n\ninterface Props {\n visible?: boolean\n type?: KeyboardType\n hideDot?: boolean\n randomKeyOrder?: boolean\n title?: string\n maxlength?: number\n modelValue?: string\n closeOnClickOverlay?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n visible: false,\n type: 'number',\n hideDot: false,\n randomKeyOrder: false,\n title: '安全键盘',\n maxlength: 0,\n modelValue: '',\n closeOnClickOverlay: true\n})\n\nconst emit = defineEmits<{\n 'update:visible': [value: boolean]\n 'update:modelValue': [value: string]\n input: [value: string]\n delete: [value: string]\n confirm: [value: string]\n close: []\n}>()\n\nconst displayKeys = computed(() => {\n const { inputKeys, tailKeys } = getKeyGroups()\n const keys = props.randomKeyOrder ? shuffle(inputKeys) : inputKeys\n return [...keys, ...tailKeys]\n})\n\nconst getKeyGroups = () => {\n if (props.type === 'idcard') {\n const inputKeys = ['1', '2', '3', '4', '5', '6', '7', '8', '9', props.hideDot ? 'X' : '.', '0', 'X']\n return {\n inputKeys: props.hideDot ? inputKeys.filter((key, index) => !(index === 9 && key === 'X')) : inputKeys.filter((key) => key !== '.' || !props.hideDot),\n tailKeys: ['删除']\n }\n }\n\n if (props.type === 'car') {\n return {\n inputKeys: [\n '京', '沪', '粤', '浙', '苏', '鲁', '晋', '冀', '豫', '川',\n 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K',\n 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',\n 'W', 'X', 'Y', 'Z', '港', '澳'\n ],\n tailKeys: ['删除']\n }\n }\n\n return {\n inputKeys: ['1', '2', '3', '4', '5', '6', '7', '8', '9', ...(props.hideDot ? [] : ['.']), '0'],\n tailKeys: ['删除']\n }\n}\n\nconst handleKeyClick = (key: string) => {\n if (key === '删除') {\n const nextValue = props.modelValue.slice(0, -1)\n emit('update:modelValue', nextValue)\n emit('delete', nextValue)\n return\n }\n\n const nextValue = `${props.modelValue}${key}`\n if (props.maxlength > 0 && nextValue.length > props.maxlength) {\n return\n }\n\n emit('update:modelValue', nextValue)\n emit('input', nextValue)\n}\n\nconst handleClose = () => {\n emit('update:visible', false)\n emit('confirm', props.modelValue)\n emit('close')\n}\n\nconst handleOverlayClick = () => {\n if (props.closeOnClickOverlay) {\n emit('update:visible', false)\n emit('close')\n }\n}\n\nconst isActionKey = (key: string) => key === '删除' || key === 'ABC' || key === '省份'\n\nfunction shuffle(source: string[]) {\n const list = [...source]\n for (let i = list.length - 1; i > 0; i -= 1) {\n const j = Math.floor(Math.random() * (i + 1))\n ;[list[i], list[j]] = [list[j], list[i]]\n }\n return list\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-keyboard {\n position: fixed;\n inset: 0;\n display: flex;\n align-items: flex-end;\n background: rgba(0, 0, 0, 0.45);\n z-index: 1000;\n\n &__panel {\n width: 100%;\n background: $--bg-color;\n border-radius: $--border-radius-lg $--border-radius-lg 0 0;\n padding: $--spacing-md;\n box-sizing: border-box;\n }\n\n &__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: $--spacing-md;\n }\n\n &__title {\n font-size: $--font-size-md;\n color: $--text-color;\n font-weight: 600;\n }\n\n &__close {\n font-size: $--font-size-md;\n color: $--color-primary;\n }\n\n &__body {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: $--spacing-sm;\n\n &--car {\n grid-template-columns: repeat(6, 1fr);\n }\n }\n\n &__key {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 44px;\n background: $--bg-color-2;\n border-radius: $--border-radius-md;\n font-size: $--font-size-lg;\n color: $--text-color;\n\n &--action {\n background: #d7dbe0;\n color: $--text-color-2;\n font-size: $--font-size-md;\n }\n\n &--wide {\n grid-column: span 1;\n }\n }\n}\n</style>\n","<template>\n <view v-if=\"visible\" class=\"u-picker\" @click=\"handleOverlayClick\">\n <view class=\"u-picker__popup\" @click.stop>\n <view class=\"u-picker__toolbar\">\n <text class=\"u-picker__action\" @click=\"handleCancel\">取消</text>\n <text class=\"u-picker__title\">{{ title }}</text>\n <text class=\"u-picker__action u-picker__action--confirm\" @click=\"handleConfirm\">确定</text>\n </view>\n\n <view v-if=\"loading\" class=\"u-picker__loading\">\n <text>加载中...</text>\n </view>\n\n <picker-view\n v-else\n class=\"u-picker__view\"\n :value=\"innerIndexes\"\n indicator-class=\"u-picker__indicator\"\n @change=\"handlePickerChange\"\n >\n <picker-view-column v-for=\"(column, columnIndex) in normalizedColumns\" :key=\"columnIndex\">\n <view\n v-for=\"(option, optionIndex) in column\"\n :key=\"option.value ?? option.label ?? optionIndex\"\n class=\"u-picker__option\"\n >\n <text>{{ option.label }}</text>\n </view>\n </picker-view-column>\n </picker-view>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\n\ninterface PickerOption {\n label: string\n value: string | number\n}\n\ntype PickerColumn = Array<string | number | PickerOption>\ntype PickerValue = Array<string | number>\n\ninterface Props {\n visible?: boolean\n columns?: PickerColumn[]\n modelValue?: PickerValue\n title?: string\n loading?: boolean\n closeOnClickOverlay?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n visible: false,\n columns: () => [],\n modelValue: () => [],\n title: '选择器',\n loading: false,\n closeOnClickOverlay: false\n})\n\nconst emit = defineEmits<{\n 'update:visible': [value: boolean]\n 'update:modelValue': [value: PickerValue]\n change: [value: PickerValue, columnIndex: number]\n confirm: [value: PickerValue]\n cancel: []\n}>()\n\nconst normalizedColumns = computed(() => props.columns.map((column) => column.map(normalizeOption)))\nconst innerIndexes = ref<number[]>([])\n\nwatch(\n () => [props.columns, props.modelValue],\n () => {\n innerIndexes.value = getIndexesByValue(props.modelValue)\n },\n { immediate: true, deep: true }\n)\n\nconst currentValues = computed(() => getValuesByIndexes(innerIndexes.value))\n\nconst handlePickerChange = (event: any) => {\n const values = event.detail.value as number[]\n const previousIndexes = [...innerIndexes.value]\n innerIndexes.value = values\n const changedColumn = getChangedColumn(previousIndexes, values)\n const nextValues = getValuesByIndexes(values)\n emit('update:modelValue', nextValues)\n emit('change', nextValues, changedColumn)\n}\n\nconst handleCancel = () => {\n emit('update:visible', false)\n emit('cancel')\n}\n\nconst handleConfirm = () => {\n emit('update:visible', false)\n emit('confirm', currentValues.value)\n}\n\nconst handleOverlayClick = () => {\n if (props.closeOnClickOverlay) {\n emit('update:visible', false)\n emit('cancel')\n }\n}\n\nfunction normalizeOption(option: string | number | PickerOption): PickerOption {\n if (typeof option === 'object' && option !== null) {\n return option\n }\n\n return {\n label: String(option),\n value: option\n }\n}\n\nfunction getIndexesByValue(values: PickerValue) {\n return normalizedColumns.value.map((column, index) => {\n const target = values[index]\n const foundIndex = column.findIndex((option) => option.value === target)\n return foundIndex >= 0 ? foundIndex : 0\n })\n}\n\nfunction getValuesByIndexes(indexes: number[]) {\n return normalizedColumns.value.map((column, index) => column[indexes[index] || 0]?.value).filter((value) => value !== undefined)\n}\n\nfunction getChangedColumn(previousIndexes: number[], nextIndexes: number[]) {\n return nextIndexes.findIndex((item, index) => item !== previousIndexes[index])\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-picker {\n position: fixed;\n inset: 0;\n display: flex;\n align-items: flex-end;\n background: rgba(0, 0, 0, 0.45);\n z-index: 1000;\n\n &__popup {\n width: 100%;\n background: $--bg-color-2;\n border-radius: $--border-radius-lg $--border-radius-lg 0 0;\n overflow: hidden;\n }\n\n &__toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 48px;\n padding: 0 $--spacing-lg;\n border-bottom: 1px solid $--border-color;\n }\n\n &__title {\n font-size: $--font-size-md;\n color: $--text-color;\n font-weight: 600;\n }\n\n &__action {\n font-size: $--font-size-md;\n color: $--text-color-2;\n\n &--confirm {\n color: $--color-primary;\n }\n }\n\n &__loading {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 240px;\n font-size: $--font-size-md;\n color: $--text-color-2;\n }\n\n &__view {\n width: 100%;\n height: 240px;\n }\n\n &__indicator {\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n &__option {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 48px;\n font-size: $--font-size-lg;\n color: $--text-color;\n }\n}\n</style>\n","<template>\n <view v-if=\"visible\" class=\"u-datetime-picker\" @click=\"handleOverlayClick\">\n <view class=\"u-datetime-picker__popup\" @click.stop>\n <view class=\"u-datetime-picker__toolbar\">\n <text class=\"u-datetime-picker__action\" @click=\"handleCancel\">取消</text>\n <text class=\"u-datetime-picker__title\">{{ title }}</text>\n <text class=\"u-datetime-picker__action u-datetime-picker__action--confirm\" @click=\"handleConfirm\">确定</text>\n </view>\n\n <picker-view\n class=\"u-datetime-picker__view\"\n :value=\"indexes\"\n indicator-class=\"u-datetime-picker__indicator\"\n @change=\"handleChange\"\n >\n <picker-view-column v-for=\"(column, columnIndex) in displayColumns\" :key=\"columnIndex\">\n <view\n v-for=\"option in column\"\n :key=\"option.value\"\n class=\"u-datetime-picker__option\"\n >\n <text>{{ option.label }}</text>\n </view>\n </picker-view-column>\n </picker-view>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\n\ntype PickerType = 'datetime' | 'date' | 'year-month' | 'time'\n\ninterface PickerOption {\n label: string\n value: string\n}\n\ninterface DateTimeValues {\n year: string\n month: string\n day: string\n hour: string\n minute: string\n}\n\ninterface Props {\n visible?: boolean\n type?: PickerType\n modelValue?: Date | string | null\n title?: string\n minDate?: Date\n maxDate?: Date\n filter?: (type: string, values: string[]) => string[]\n formatter?: (type: string, value: string) => string\n closeOnClickOverlay?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n visible: false,\n type: 'datetime',\n modelValue: null,\n title: '时间选择',\n minDate: () => new Date(2000, 0, 1, 0, 0),\n maxDate: () => new Date(2035, 11, 31, 23, 59),\n closeOnClickOverlay: false\n})\n\nconst emit = defineEmits<{\n 'update:visible': [value: boolean]\n 'update:modelValue': [value: Date | string]\n change: [value: Date | string]\n confirm: [value: Date | string]\n cancel: []\n}>()\n\nconst indexes = ref<number[]>([])\nconst innerValues = ref<DateTimeValues>(getInitialValues())\n\nconst columnTypes = computed(() => {\n if (props.type === 'date') return ['year', 'month', 'day']\n if (props.type === 'year-month') return ['year', 'month']\n if (props.type === 'time') return ['hour', 'minute']\n return ['year', 'month', 'day', 'hour', 'minute']\n})\n\nconst displayColumns = computed(() => {\n const values = innerValues.value\n return columnTypes.value.map((type) => buildColumn(type, values))\n})\n\nwatch(\n () => props.modelValue,\n () => {\n innerValues.value = getInitialValues()\n indexes.value = getIndexesByValues()\n },\n { immediate: true }\n)\n\nwatch(\n displayColumns,\n () => {\n alignValuesWithColumns()\n indexes.value = getIndexesByValues()\n },\n { deep: true }\n)\n\nconst currentValue = computed(() => formatOutput(innerValues.value))\n\nconst handleChange = (event: any) => {\n const nextIndexes = event.detail.value as number[]\n const nextValues = { ...innerValues.value }\n\n columnTypes.value.forEach((type, index) => {\n nextValues[type as keyof DateTimeValues] = displayColumns.value[index][nextIndexes[index] || 0]?.value || nextValues[type as keyof DateTimeValues]\n })\n\n innerValues.value = fixValues(nextValues)\n indexes.value = getIndexesByValues()\n emit('update:modelValue', currentValue.value)\n emit('change', currentValue.value)\n}\n\nconst handleCancel = () => {\n emit('update:visible', false)\n emit('cancel')\n}\n\nconst handleConfirm = () => {\n emit('update:visible', false)\n emit('confirm', currentValue.value)\n}\n\nconst handleOverlayClick = () => {\n if (props.closeOnClickOverlay) {\n emit('update:visible', false)\n emit('cancel')\n }\n}\n\nfunction getInitialValues(): DateTimeValues {\n const date = normalizeModelValue(props.modelValue)\n return {\n year: String(date.getFullYear()),\n month: pad(date.getMonth() + 1),\n day: pad(date.getDate()),\n hour: pad(date.getHours()),\n minute: pad(date.getMinutes())\n }\n}\n\nfunction normalizeModelValue(value: Date | string | null | undefined) {\n if (props.type === 'time' && typeof value === 'string' && value.includes(':')) {\n const [hour = '00', minute = '00'] = value.split(':')\n const date = new Date(props.minDate)\n date.setHours(Number(hour), Number(minute), 0, 0)\n return clampDate(date)\n }\n\n const date = value instanceof Date ? new Date(value) : value ? new Date(value) : new Date()\n return clampDate(date)\n}\n\nfunction clampDate(date: Date) {\n const time = date.getTime()\n const minTime = props.minDate.getTime()\n const maxTime = props.maxDate.getTime()\n\n if (time < minTime) return new Date(props.minDate)\n if (time > maxTime) return new Date(props.maxDate)\n return date\n}\n\nfunction buildColumn(type: string, values: DateTimeValues) {\n let options: string[] = []\n\n if (type === 'year') {\n for (let year = props.minDate.getFullYear(); year <= props.maxDate.getFullYear(); year += 1) {\n options.push(String(year))\n }\n }\n\n if (type === 'month') {\n const year = Number(values.year)\n const start = year === props.minDate.getFullYear() ? props.minDate.getMonth() + 1 : 1\n const end = year === props.maxDate.getFullYear() ? props.maxDate.getMonth() + 1 : 12\n for (let month = start; month <= end; month += 1) {\n options.push(pad(month))\n }\n }\n\n if (type === 'day') {\n const year = Number(values.year)\n const month = Number(values.month)\n const total = new Date(year, month, 0).getDate()\n const minDay = isSameYearMonth(year, month, props.minDate) ? props.minDate.getDate() : 1\n const maxDay = isSameYearMonth(year, month, props.maxDate) ? props.maxDate.getDate() : total\n for (let day = minDay; day <= maxDay; day += 1) {\n options.push(pad(day))\n }\n }\n\n if (type === 'hour') {\n const year = Number(values.year)\n const month = Number(values.month || '1')\n const day = Number(values.day || '1')\n const minHour = isSameDate(year, month, day, props.minDate) ? props.minDate.getHours() : 0\n const maxHour = isSameDate(year, month, day, props.maxDate) ? props.maxDate.getHours() : 23\n for (let hour = minHour; hour <= maxHour; hour += 1) {\n options.push(pad(hour))\n }\n }\n\n if (type === 'minute') {\n const year = Number(values.year || String(props.minDate.getFullYear()))\n const month = Number(values.month || '1')\n const day = Number(values.day || '1')\n const hour = Number(values.hour)\n const minMinute = isSameDateTimeHour(year, month, day, hour, props.minDate) ? props.minDate.getMinutes() : 0\n const maxMinute = isSameDateTimeHour(year, month, day, hour, props.maxDate) ? props.maxDate.getMinutes() : 59\n for (let minute = minMinute; minute <= maxMinute; minute += 1) {\n options.push(pad(minute))\n }\n }\n\n const filtered = props.filter ? props.filter(type, options) : options\n return filtered.map((value) => ({\n value,\n label: props.formatter ? props.formatter(type, value) : defaultFormatter(type, value)\n }))\n}\n\nfunction getIndexesByValues() {\n return columnTypes.value.map((type, index) => {\n const value = innerValues.value[type as keyof DateTimeValues]\n const column = displayColumns.value[index] || []\n const foundIndex = column.findIndex((item) => item.value === value)\n return foundIndex >= 0 ? foundIndex : 0\n })\n}\n\nfunction alignValuesWithColumns() {\n innerValues.value = fixValues(innerValues.value)\n}\n\nfunction fixValues(values: DateTimeValues) {\n const nextValues = { ...values }\n columnTypes.value.forEach((type, index) => {\n const column = displayColumns.value[index] || []\n const current = nextValues[type as keyof DateTimeValues]\n if (!column.some((item) => item.value === current) && column[0]) {\n nextValues[type as keyof DateTimeValues] = column[0].value\n }\n })\n return nextValues\n}\n\nfunction formatOutput(values: DateTimeValues) {\n if (props.type === 'time') {\n return `${values.hour}:${values.minute}`\n }\n\n const date = new Date(\n Number(values.year),\n Number(values.month || '1') - 1,\n Number(values.day || '1'),\n Number(values.hour || '0'),\n Number(values.minute || '0')\n )\n\n return props.type === 'year-month'\n ? `${values.year}-${values.month}`\n : props.type === 'date'\n ? new Date(date.getFullYear(), date.getMonth(), date.getDate())\n : date\n}\n\nfunction defaultFormatter(type: string, value: string) {\n if (type === 'year') return `${value}年`\n if (type === 'month') return `${value}月`\n if (type === 'day') return `${value}日`\n if (type === 'hour') return `${value}时`\n if (type === 'minute') return `${value}分`\n return value\n}\n\nfunction isSameYearMonth(year: number, month: number, date: Date) {\n return year === date.getFullYear() && month === date.getMonth() + 1\n}\n\nfunction isSameDate(year: number, month: number, day: number, date: Date) {\n return isSameYearMonth(year, month, date) && day === date.getDate()\n}\n\nfunction isSameDateTimeHour(year: number, month: number, day: number, hour: number, date: Date) {\n return isSameDate(year, month, day, date) && hour === date.getHours()\n}\n\nfunction pad(value: number) {\n return String(value).padStart(2, '0')\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-datetime-picker {\n position: fixed;\n inset: 0;\n display: flex;\n align-items: flex-end;\n background: rgba(0, 0, 0, 0.45);\n z-index: 1000;\n\n &__popup {\n width: 100%;\n background: $--bg-color-2;\n border-radius: $--border-radius-lg $--border-radius-lg 0 0;\n overflow: hidden;\n }\n\n &__toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 48px;\n padding: 0 $--spacing-lg;\n border-bottom: 1px solid $--border-color;\n }\n\n &__title {\n font-size: $--font-size-md;\n color: $--text-color;\n font-weight: 600;\n }\n\n &__action {\n font-size: $--font-size-md;\n color: $--text-color-2;\n\n &--confirm {\n color: $--color-primary;\n }\n }\n\n &__view {\n width: 100%;\n height: 240px;\n }\n\n &__indicator {\n height: 48px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n &__option {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 48px;\n font-size: $--font-size-lg;\n color: $--text-color;\n }\n}\n</style>\n","<template>\n <view\n class=\"u-rate\"\n :class=\"{\n 'u-rate--disabled': disabled,\n 'u-rate--readonly': readonly\n }\"\n >\n <view\n v-for=\"(_, index) in normalizedCount\"\n :key=\"index\"\n class=\"u-rate__item\"\n :style=\"itemStyle\"\n @click=\"handleClick(index, $event)\"\n >\n <text class=\"u-rate__icon u-rate__icon--void\" :style=\"voidStyle\">★</text>\n <view\n class=\"u-rate__icon-wrapper\"\n :style=\"getActiveWrapperStyle(index)\"\n >\n <text class=\"u-rate__icon u-rate__icon--active\" :style=\"activeStyle\">★</text>\n </view>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ntype RateValue = number\n\ninterface Props {\n modelValue?: RateValue\n count?: number\n size?: number | string\n color?: string\n voidColor?: string\n readonly?: boolean\n disabled?: boolean\n allowHalf?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: 0,\n count: 5,\n size: 20,\n color: '#ee0a24',\n voidColor: '#c8c9cc',\n readonly: false,\n disabled: false,\n allowHalf: false\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: number]\n change: [value: number]\n}>()\n\nconst normalizedCount = computed(() => Math.max(1, Math.floor(props.count)))\nconst normalizedValue = computed(() => {\n const value = Number(props.modelValue) || 0\n return Math.max(0, Math.min(normalizedCount.value, value))\n})\n\nconst itemStyle = computed(() => ({\n width: addUnit(props.size),\n height: addUnit(props.size)\n}))\n\nconst activeStyle = computed(() => ({\n color: props.color,\n fontSize: addUnit(props.size)\n}))\n\nconst voidStyle = computed(() => ({\n color: props.voidColor,\n fontSize: addUnit(props.size)\n}))\n\nconst getActiveWrapperStyle = (index: number) => {\n const diff = normalizedValue.value - index\n const percent = diff >= 1 ? 100 : diff > 0 ? 50 : 0\n\n return {\n width: `${percent}%`\n }\n}\n\nconst handleClick = (index: number, event: any) => {\n if (props.disabled || props.readonly) {\n return\n }\n\n let value = index + 1\n\n if (props.allowHalf) {\n // 获取触摸位置相对于元素的位置\n const touch = event.touches?.[0] || event\n const clientX = touch.clientX || 0\n\n // 使用 uni.createSelectorQuery 获取元素位置\n uni.createSelectorQuery()\n .select('.u-rate__item')\n .boundingClientRect((rect: any) => {\n if (rect) {\n const itemWidth = rect.width\n // 计算当前点击的item位置\n const itemLeft = rect.left + index * (itemWidth + 4) // 4是gap\n if (clientX - itemLeft <= itemWidth / 2) {\n value = index + 0.5\n }\n emit('update:modelValue', value)\n emit('change', value)\n } else {\n // fallback: 直接使用整星\n emit('update:modelValue', value)\n emit('change', value)\n }\n })\n .exec()\n } else {\n emit('update:modelValue', value)\n emit('change', value)\n }\n}\n\nfunction addUnit(value: string | number) {\n return typeof value === 'number' ? `${value}px` : value\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-rate {\n display: inline-flex;\n align-items: center;\n gap: $--spacing-xs;\n\n &--disabled,\n &--readonly {\n .u-rate__item {\n }\n }\n\n &--disabled {\n opacity: 0.5;\n }\n\n &__item {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n &__icon {\n line-height: 1;\n\n &--void {\n position: relative;\n z-index: 1;\n }\n\n &--active {\n display: block;\n }\n }\n\n &__icon-wrapper {\n position: absolute;\n top: 50%;\n left: 0;\n z-index: 2;\n overflow: hidden;\n transform: translateY(-50%);\n white-space: nowrap;\n }\n}\n</style>\n","<template>\n <view class=\"u-grid\">\n <slot />\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, provide } from 'vue'\n\ninterface Props {\n column?: number\n border?: boolean\n clickable?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n column: 4,\n border: false,\n clickable: false\n})\n\nconst emit = defineEmits<{\n click: [item: unknown, index: number]\n}>()\n\nconst column = computed(() => Math.max(1, Number(props.column) || 1))\nlet currentIndex = 0\n\nconst registerItem = () => {\n const index = currentIndex\n currentIndex += 1\n return index\n}\n\nconst onItemClick = (payload: { item: unknown; index: number }) => {\n emit('click', payload.item, payload.index)\n}\n\nprovide('u-grid', {\n column,\n border: computed(() => props.border),\n clickable: computed(() => props.clickable),\n registerItem,\n onItemClick\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-grid {\n display: flex;\n flex-wrap: wrap;\n background-color: $--bg-color-2;\n}\n</style>\n","<template>\n <view\n class=\"u-grid-item\"\n :class=\"{\n 'u-grid-item--border': hasBorder,\n 'u-grid-item--clickable': isClickable\n }\"\n :style=\"itemStyle\"\n @click=\"handleClick\"\n >\n <view v-if=\"$slots.icon || icon || iconUrl\" class=\"u-grid-item__icon\">\n <slot name=\"icon\">\n <image v-if=\"iconUrl\" class=\"u-grid-item__icon-image\" :src=\"iconUrl\" mode=\"aspectFit\" />\n <text v-else-if=\"icon\" class=\"u-grid-item__icon-text\">{{ icon }}</text>\n </slot>\n <view v-if=\"badge !== undefined && badge !== null && badge !== ''\" class=\"u-grid-item__badge\">\n <text class=\"u-grid-item__badge-text\">{{ badge }}</text>\n </view>\n </view>\n <view v-if=\"text || $slots.default\" class=\"u-grid-item__text\">\n <slot>{{ text }}</slot>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, inject, useSlots } from 'vue'\nimport type { ComputedRef } from 'vue'\n\ninterface GridContext {\n column: ComputedRef<number>\n border: ComputedRef<boolean>\n clickable: ComputedRef<boolean>\n registerItem: () => number\n onItemClick: (payload: { item: unknown; index: number }) => void\n}\n\ninterface Props {\n text?: string\n icon?: string\n iconUrl?: string\n badge?: string | number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n text: '',\n icon: '',\n iconUrl: ''\n})\n\nconst emit = defineEmits<{\n click: [item: { text: string; icon: string; iconUrl: string; badge?: string | number }, index: number]\n}>()\n\nconst slots = useSlots()\nconst grid = inject<GridContext | null>('u-grid', null)\nconst itemIndex = grid?.registerItem() ?? -1\n\nconst itemData = computed(() => ({\n text: props.text,\n icon: props.icon,\n iconUrl: props.iconUrl,\n badge: props.badge\n}))\n\nconst hasBorder = computed(() => grid?.border.value ?? false)\nconst isClickable = computed(() => grid?.clickable.value ?? false)\nconst column = computed(() => grid?.column.value ?? 4)\n\nconst itemStyle = computed(() => {\n const width = `${100 / column.value}%`\n\n return {\n flexBasis: width,\n maxWidth: width\n }\n})\n\nconst handleClick = () => {\n if (!grid?.clickable.value) {\n return\n }\n\n const index = itemIndex\n emit('click', itemData.value, index)\n grid.onItemClick({ item: itemData.value, index })\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-grid-item {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: $--spacing-lg $--spacing-sm;\n box-sizing: border-box;\n background-color: $--bg-color-2;\n\n &--clickable {\n &:active {\n background-color: $--bg-color;\n }\n }\n\n &--border {\n border-right: 1px solid $--border-color;\n border-bottom: 1px solid $--border-color;\n }\n\n &__icon {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n margin-bottom: $--spacing-sm;\n }\n\n &__icon-image {\n width: 32px;\n height: 32px;\n }\n\n &__icon-text {\n font-size: 24px;\n line-height: 1;\n }\n\n &__text {\n font-size: $--font-size-sm;\n color: $--text-color-2;\n line-height: 1.4;\n text-align: center;\n word-break: break-all;\n }\n\n &__badge {\n position: absolute;\n top: -4px;\n right: -8px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 999px;\n background-color: $--color-danger;\n box-sizing: border-box;\n }\n\n &__badge-text {\n font-size: 10px;\n line-height: 1;\n color: $--text-color-white;\n }\n}\n</style>\n","<template>\n <view class=\"u-swiper\">\n <swiper\n class=\"u-swiper__wrapper\"\n :autoplay=\"autoplay\"\n :interval=\"interval\"\n :duration=\"duration\"\n :indicator-dots=\"showIndicator && !indicatorSlot\"\n :indicator-color=\"indicatorColor\"\n :indicator-active-color=\"indicatorActiveColor\"\n :circular=\"circular\"\n :vertical=\"vertical\"\n :current=\"currentIndex\"\n @change=\"handleChange\"\n @animationfinish=\"handleAnimationFinish\"\n >\n <slot />\n </swiper>\n\n <!-- 加载状态 -->\n <view v-if=\"loading\" class=\"u-swiper__loading\">\n <view class=\"u-swiper__loading-icon\" />\n </view>\n\n <!-- 标题 -->\n <view v-if=\"showTitle && currentTitle\" class=\"u-swiper__title\">\n <text class=\"u-swiper__title-text\">{{ currentTitle }}</text>\n </view>\n\n <!-- 自定义指示器 -->\n <view v-if=\"showIndicator && indicatorSlot\" class=\"u-swiper__indicator\">\n <slot name=\"indicator\" :current=\"currentIndex\" :total=\"itemCount\" />\n </view>\n\n <!-- 默认指示器样式 -->\n <view v-if=\"showIndicator && !customIndicator && !indicatorSlot\" :class=\"indicatorClass\" :style=\"indicatorStyle\">\n <view\n v-for=\"i in itemCount\"\n :key=\"i\"\n class=\"u-swiper__indicator-item\"\n :class=\"{ 'u-swiper__indicator-item--active': i - 1 === currentIndex }\"\n />\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, useSlots, watch, provide } from 'vue'\n\ntype IndicatorPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n\ninterface Props {\n autoplay?: boolean\n interval?: number\n duration?: number\n circular?: boolean\n vertical?: boolean\n indicatorDots?: boolean\n indicatorColor?: string\n indicatorActiveColor?: string\n indicatorPosition?: IndicatorPosition\n loading?: boolean\n showTitle?: boolean\n height?: string | number\n card?: boolean\n cardScale?: number\n cardSpace?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n autoplay: true,\n interval: 3000,\n duration: 500,\n circular: true,\n vertical: false,\n indicatorDots: true,\n indicatorColor: 'rgba(255, 255, 255, 0.5)',\n indicatorActiveColor: '#ffffff',\n indicatorPosition: 'bottom-right',\n loading: false,\n showTitle: false,\n height: 200,\n card: false,\n cardScale: 0.9,\n cardSpace: 10\n})\n\nconst emit = defineEmits<{\n change: [index: number]\n animationfinish: [index: number]\n}>()\n\nconst slots = useSlots()\nconst currentIndex = ref(0)\nconst itemCount = ref(0)\nconst currentTitle = ref('')\nconst itemTitles = ref<string[]>([])\n\nconst indicatorSlot = computed(() => Boolean(slots.indicator))\nconst customIndicator = computed(() => props.card)\n\nconst showIndicator = computed(() => props.indicatorDots && itemCount.value > 1)\n\nconst indicatorClass = computed(() => [\n 'u-swiper__indicator-wrapper',\n `u-swiper__indicator-wrapper--${props.indicatorPosition}`,\n {\n 'u-swiper__indicator-wrapper--vertical': props.vertical\n }\n])\n\nconst indicatorStyle = computed(() => {\n const style: Record<string, string> = {}\n\n if (props.indicatorColor) {\n style.setProperty('--indicator-color', props.indicatorColor)\n }\n if (props.indicatorActiveColor) {\n style.setProperty('--indicator-active-color', props.indicatorActiveColor)\n }\n\n return style\n})\n\nconst swiperHeight = computed(() => {\n if (typeof props.height === 'number') {\n return `${props.height}px`\n }\n return props.height\n})\n\nconst registerItem = (title?: string) => {\n const index = itemCount.value\n itemCount.value += 1\n if (title) {\n itemTitles.value.push(title)\n }\n return index\n}\n\nconst handleChange = (e: any) => {\n const { current } = e.detail\n currentIndex.value = current\n if (itemTitles.value[current]) {\n currentTitle.value = itemTitles.value[current]\n }\n emit('change', current)\n}\n\nconst handleAnimationFinish = (e: any) => {\n emit('animationfinish', e.detail.current)\n}\n\nconst setActiveIndex = (index: number) => {\n currentIndex.value = index\n}\n\nwatch(() => props.loading, (val) => {\n if (!val && itemTitles.value[currentIndex.value]) {\n currentTitle.value = itemTitles.value[currentIndex.value]\n }\n})\n\nprovide('u-swiper', {\n card: computed(() => props.card),\n cardScale: computed(() => props.cardScale),\n cardSpace: computed(() => props.cardSpace),\n vertical: computed(() => props.vertical),\n height: swiperHeight,\n registerItem,\n setActiveIndex\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-swiper {\n position: relative;\n width: 100%;\n overflow: hidden;\n\n &__wrapper {\n width: 100%;\n height: var(--swiper-height, 200px);\n }\n\n &__loading {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(0, 0, 0, 0.3);\n z-index: 10;\n\n &-icon {\n width: 32px;\n height: 32px;\n border: 3px solid rgba(255, 255, 255, 0.3);\n border-top-color: #fff;\n border-radius: 50%;\n animation: u-swiper-loading 0.8s linear infinite;\n }\n }\n\n @keyframes u-swiper-loading {\n to {\n transform: rotate(360deg);\n }\n }\n\n &__title {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n padding: $--spacing-sm $--spacing-base;\n background: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.5));\n z-index: 5;\n\n &-text {\n font-size: $--font-size-base;\n color: $--text-color-white;\n line-height: 1.4;\n }\n }\n\n &__indicator {\n position: absolute;\n z-index: 5;\n }\n\n &__indicator-wrapper {\n position: absolute;\n display: flex;\n z-index: 5;\n padding: $--spacing-xs $--spacing-sm;\n\n &--top-left {\n top: 0;\n left: 0;\n }\n\n &--top-right {\n top: 0;\n right: 0;\n }\n\n &--bottom-left {\n bottom: 0;\n left: 0;\n }\n\n &--bottom-right {\n bottom: 0;\n right: 0;\n }\n\n &--vertical {\n flex-direction: column;\n }\n }\n\n &__indicator-item {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: var(--indicator-color, rgba(255, 255, 255, 0.5));\n margin: 0 4px;\n transition: all 0.3s;\n\n &--active {\n width: 16px;\n border-radius: 4px;\n background-color: var(--indicator-active-color, #fff);\n }\n }\n}\n\n.u-swiper__indicator-wrapper--vertical .u-swiper__indicator-item {\n width: 6px;\n height: 6px;\n margin: 4px 0;\n\n &--active {\n width: 6px;\n height: 16px;\n }\n}\n</style>","<template>\n <swiper-item class=\"u-swiper-item\" :class=\"{ 'u-swiper-item--card': isCard }\" :style=\"itemStyle\">\n <slot />\n </swiper-item>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, inject } from 'vue'\nimport type { ComputedRef } from 'vue'\n\ninterface SwiperContext {\n card: ComputedRef<boolean>\n cardScale: ComputedRef<number>\n cardSpace: ComputedRef<number>\n vertical: ComputedRef<boolean>\n height: ComputedRef<string>\n registerItem: (title?: string) => number\n setActiveIndex: (index: number) => void\n}\n\ninterface Props {\n title?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n title: ''\n})\n\nconst swiper = inject<SwiperContext | null>('u-swiper', null)\n\nif (swiper) {\n swiper.registerItem(props.title)\n}\n\nconst isCard = computed(() => swiper?.card.value ?? false)\nconst cardScale = computed(() => swiper?.cardScale.value ?? 0.9)\nconst cardSpace = computed(() => swiper?.cardSpace.value ?? 10)\nconst isVertical = computed(() => swiper?.vertical.value ?? false)\nconst swiperHeight = computed(() => swiper?.height.value ?? '200px')\n\nconst itemStyle = computed(() => {\n if (!isCard.value) {\n return {}\n }\n\n if (isVertical.value) {\n return {\n height: swiperHeight.value,\n padding: `${cardSpace.value}px 0`\n }\n }\n\n return {\n width: `${cardScale.value * 100}%`,\n marginLeft: `${(1 - cardScale.value) * 50}%`,\n marginRight: `${(1 - cardScale.value) * 50}%`\n }\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-swiper-item {\n width: 100%;\n height: 100%;\n overflow: hidden;\n\n &--card {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n}\n</style>","<template>\n <view\n class=\"u-search\"\n :class=\"{\n 'u-search--disabled': disabled,\n 'u-search--focus': isFocus\n }\"\n >\n <view class=\"u-search__content\" :style=\"contentStyle\">\n <view v-if=\"showSearchIcon\" class=\"u-search__icon\">\n <text class=\"u-search__icon-text\">🔍</text>\n </view>\n\n <view class=\"u-search__body\">\n <input\n class=\"u-search__control\"\n :type=\"type\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :placeholder-style=\"placeholderStyle\"\n :placeholder-class=\"'u-search__placeholder'\"\n :disabled=\"disabled\"\n :maxlength=\"maxlength\"\n :focus=\"focus\"\n :confirm-type=\"confirmType\"\n :adjust-position=\"adjustPosition\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @confirm=\"handleSearch\"\n />\n </view>\n\n <view v-if=\"clearable && modelValue\" class=\"u-search__clear\" @click=\"handleClear\">\n <text class=\"u-search__clear-icon\">×</text>\n </view>\n </view>\n\n <view v-if=\"$slots.action || actionText\" class=\"u-search__action\" @click=\"handleAction\">\n <slot name=\"action\">\n <text class=\"u-search__action-text\">{{ actionText }}</text>\n </slot>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\n\ntype ConfirmType = 'send' | 'search' | 'next' | 'go' | 'done'\n\ninterface Props {\n modelValue?: string | number\n type?: 'text' | 'number' | 'idcard' | 'digit'\n placeholder?: string\n placeholderStyle?: string\n disabled?: boolean\n maxlength?: number\n clearable?: boolean\n focus?: boolean\n confirmType?: ConfirmType\n adjustPosition?: boolean\n showSearchIcon?: boolean\n actionText?: string\n inputAlign?: 'left' | 'center' | 'right'\n shape?: 'square' | 'round'\n background?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: '',\n type: 'text',\n placeholder: '请输入搜索关键词',\n disabled: false,\n maxlength: 140,\n clearable: true,\n focus: false,\n confirmType: 'search',\n adjustPosition: true,\n showSearchIcon: true,\n actionText: '',\n inputAlign: 'left',\n shape: 'round',\n background: '#f7f8fa'\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n input: [value: string]\n focus: [event: FocusEvent]\n blur: [event: FocusEvent]\n search: [value: string]\n clear: []\n action: []\n}>()\n\nconst isFocus = ref(false)\n\nconst contentStyle = computed(() => {\n const style: Record<string, string> = {\n background: props.background,\n 'text-align': props.inputAlign\n }\n if (props.shape === 'round') {\n style['border-radius'] = '999px'\n }\n return style\n})\n\nconst handleInput = (event: any) => {\n const value = event.detail.value\n emit('update:modelValue', value)\n emit('input', value)\n}\n\nconst handleFocus = (event: FocusEvent) => {\n isFocus.value = true\n emit('focus', event)\n}\n\nconst handleBlur = (event: FocusEvent) => {\n isFocus.value = false\n emit('blur', event)\n}\n\nconst handleSearch = (event: any) => {\n emit('search', event.detail.value)\n}\n\nconst handleClear = () => {\n emit('update:modelValue', '')\n emit('input', '')\n emit('clear')\n}\n\nconst handleAction = () => {\n if (!props.disabled) {\n emit('action')\n emit('search', String(props.modelValue))\n }\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-search {\n display: flex;\n align-items: center;\n width: 100%;\n padding: $--spacing-sm $--spacing-md;\n\n &--disabled {\n opacity: 0.6;\n }\n\n &__content {\n flex: 1;\n display: flex;\n align-items: center;\n height: $--search-height;\n padding: 0 $--spacing-md;\n background-color: $--bg-color-2;\n border-radius: $--border-radius-lg;\n transition: all $--transition-duration;\n }\n\n &--focus .u-search__content {\n background-color: $--bg-color-2;\n box-shadow: 0 0 0 1px $--color-primary;\n }\n\n &__icon {\n display: flex;\n align-items: center;\n margin-right: $--spacing-sm;\n }\n\n &__icon-text {\n font-size: $--font-size-md;\n color: $--text-color-2;\n }\n\n &__body {\n flex: 1;\n display: flex;\n align-items: center;\n }\n\n &__control {\n flex: 1;\n width: 100%;\n height: 100%;\n font-size: $--font-size-md;\n color: $--text-color;\n background: transparent;\n }\n\n &__placeholder {\n color: $--text-color-3;\n }\n\n &__clear {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-left: $--spacing-sm;\n background-color: $--text-color-3;\n border-radius: 50%;\n }\n\n &__clear-icon {\n color: $--bg-color-2;\n font-size: 12px;\n line-height: 1;\n }\n\n &__action {\n display: flex;\n align-items: center;\n padding: $--spacing-sm $--spacing-md;\n }\n\n &__action-text {\n font-size: $--font-size-md;\n color: $--color-primary;\n }\n}\n</style>","<template>\n <view\n class=\"u-number-box\"\n :class=\"{\n 'u-number-box--disabled': disabled\n }\"\n >\n <view\n class=\"u-number-box__btn u-number-box__btn--minus\"\n :class=\"{\n 'u-number-box__btn--disabled': minusDisabled\n }\"\n :style=\"btnStyle\"\n @click=\"handleMinus\"\n @touchstart=\"startLongPress('minus')\"\n @touchend=\"stopLongPress\"\n @touchcancel=\"stopLongPress\"\n >\n <text class=\"u-number-box__btn-icon\">−</text>\n </view>\n\n <input\n class=\"u-number-box__input\"\n :class=\"{\n 'u-number-box__input--disabled': disabledInput\n }\"\n :style=\"inputStyle\"\n :type=\"inputType\"\n :value=\"displayValue\"\n :disabled=\"disabled || disabledInput\"\n @input=\"handleInput\"\n @blur=\"handleBlur\"\n @focus=\"handleFocus\"\n />\n\n <view\n class=\"u-number-box__btn u-number-box__btn--plus\"\n :class=\"{\n 'u-number-box__btn--disabled': plusDisabled\n }\"\n :style=\"btnStyle\"\n @click=\"handlePlus\"\n @touchstart=\"startLongPress('plus')\"\n @touchend=\"stopLongPress\"\n @touchcancel=\"stopLongPress\"\n >\n <text class=\"u-number-box__btn-icon\">+</text>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onUnmounted } from 'vue'\n\ninterface Props {\n modelValue?: number\n min?: number\n max?: number\n step?: number\n integer?: boolean\n decimalPlaces?: number\n disabled?: boolean\n disabledInput?: boolean\n disabledLongPress?: boolean\n buttonSize?: number | string\n inputWidth?: number | string\n theme?: 'default' | 'primary'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: 0,\n min: 0,\n max: Infinity,\n step: 1,\n integer: false,\n decimalPlaces: 0,\n disabled: false,\n disabledInput: false,\n disabledLongPress: false,\n buttonSize: 28,\n inputWidth: 36,\n theme: 'default'\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: number]\n change: [value: number]\n overlimit: [type: 'minus' | 'plus']\n focus: [event: FocusEvent]\n blur: [event: FocusEvent]\n}>()\n\nconst currentValue = ref(props.modelValue)\nlet longPressTimer: ReturnType<typeof setInterval> | null = null\n\nconst minusDisabled = computed(() => props.disabled || currentValue.value <= props.min)\nconst plusDisabled = computed(() => props.disabled || currentValue.value >= props.max)\n\nconst inputType = computed(() => props.integer ? 'number' : 'digit')\n\nconst displayValue = computed(() => {\n if (props.decimalPlaces > 0) {\n return currentValue.value.toFixed(props.decimalPlaces)\n }\n return currentValue.value\n})\n\nconst btnSize = computed(() => {\n const size = props.buttonSize\n return typeof size === 'number' ? `${size}px` : size\n})\n\nconst iptWidth = computed(() => {\n const width = props.inputWidth\n return typeof width === 'number' ? `${width}px` : width\n})\n\nconst btnStyle = computed(() => ({\n width: btnSize.value,\n height: btnSize.value,\n fontSize: `calc(${btnSize.value} * 0.5)`,\n backgroundColor: props.theme === 'primary' ? '#1989fa' : '#f2f3f5',\n color: props.theme === 'primary' ? '#fff' : '#323233'\n}))\n\nconst inputStyle = computed(() => ({\n width: iptWidth.value,\n height: btnSize.value\n}))\n\nwatch(() => props.modelValue, (val) => {\n currentValue.value = formatValue(val)\n})\n\nconst formatValue = (val: number): number => {\n let value = Number(val)\n if (isNaN(value)) value = props.min\n if (props.integer) value = Math.round(value)\n value = Math.max(props.min, Math.min(props.max, value))\n return value\n}\n\nconst updateValue = (val: number) => {\n const formatted = formatValue(val)\n currentValue.value = formatted\n emit('update:modelValue', formatted)\n emit('change', formatted)\n}\n\nconst handleMinus = () => {\n if (minusDisabled.value) {\n emit('overlimit', 'minus')\n return\n }\n updateValue(currentValue.value - props.step)\n}\n\nconst handlePlus = () => {\n if (plusDisabled.value) {\n emit('overlimit', 'plus')\n return\n }\n updateValue(currentValue.value + props.step)\n}\n\nconst handleInput = (event: any) => {\n const val = event.detail.value\n if (val === '' || val === '-') return\n let value = Number(val)\n if (!isNaN(value)) {\n currentValue.value = value\n }\n}\n\nconst handleBlur = (event: FocusEvent) => {\n updateValue(currentValue.value)\n emit('blur', event)\n}\n\nconst handleFocus = (event: FocusEvent) => {\n emit('focus', event)\n}\n\nconst startLongPress = (type: 'minus' | 'plus') => {\n if (props.disabledLongPress || props.disabled) return\n\n const action = type === 'minus' ? handleMinus : handlePlus\n longPressTimer = setInterval(() => {\n action()\n }, 150)\n}\n\nconst stopLongPress = () => {\n if (longPressTimer) {\n clearInterval(longPressTimer)\n longPressTimer = null\n }\n}\n\nonUnmounted(() => {\n stopLongPress()\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-number-box {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n\n &--disabled {\n opacity: 0.5;\n }\n\n &__btn {\n display: flex;\n align-items: center;\n justify-content: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n transition: all $--transition-duration;\n border-radius: $--border-radius-sm;\n\n &:active {\n opacity: 0.7;\n }\n\n &--disabled {\n opacity: 0.4;\n }\n }\n\n &__btn-icon {\n line-height: 1;\n }\n\n &__input {\n text-align: center;\n font-size: $--font-size-md;\n color: $--text-color;\n background: $--bg-color-2;\n border: 1px solid $--border-color;\n border-radius: $--border-radius-sm;\n outline: none;\n\n &--disabled {\n background: $--bg-color;\n }\n }\n}\n</style>","<template>\n <view class=\"u-upload\">\n <view class=\"u-upload__list\">\n <!-- 已上传文件列表 -->\n <view\n v-for=\"(file, index) in fileList\"\n :key=\"index\"\n class=\"u-upload__item\"\n :class=\"{\n 'u-upload__item--error': file.status === 'error',\n 'u-upload__item--uploading': file.status === 'uploading'\n }\"\n >\n <!-- 图片预览 -->\n <image\n v-if=\"isImage(file)\"\n class=\"u-upload__preview\"\n :src=\"file.url || file.thumb\"\n mode=\"aspectFill\"\n @click=\"handlePreview(file, index)\"\n />\n\n <!-- 视频预览 -->\n <view v-else-if=\"isVideo(file)\" class=\"u-upload__video\">\n <image\n class=\"u-upload__preview\"\n :src=\"file.thumb || defaultVideoThumb\"\n mode=\"aspectFill\"\n @click=\"handlePreview(file, index)\"\n />\n <view class=\"u-upload__video-icon\">\n <text>▶</text>\n </view>\n </view>\n\n <!-- 其他文件 -->\n <view v-else class=\"u-upload__file\" @click=\"handlePreview(file, index)\">\n <text class=\"u-upload__file-icon\">📄</text>\n <text class=\"u-upload__file-name\">{{ getFileName(file) }}</text>\n </view>\n\n <!-- 上传进度 -->\n <view v-if=\"file.status === 'uploading'\" class=\"u-upload__progress\">\n <view class=\"u-upload__progress-bar\" :style=\"{ width: file.progress + '%' }\"></view>\n </view>\n\n <!-- 删除按钮 -->\n <view\n v-if=\"deletable && file.status !== 'uploading'\"\n class=\"u-upload__delete\"\n @click=\"handleDelete(index)\"\n >\n <text class=\"u-upload__delete-icon\">×</text>\n </view>\n\n <!-- 上传失败提示 -->\n <view v-if=\"file.status === 'error'\" class=\"u-upload__error\">\n <text>上传失败</text>\n </view>\n </view>\n\n <!-- 上传按钮 -->\n <view\n v-if=\"showUploadBtn\"\n class=\"u-upload__trigger\"\n :class=\"{\n 'u-upload__trigger--disabled': disabled || fileList.length >= maxCount\n }\"\n @click=\"handleTrigger\"\n >\n <slot name=\"trigger\">\n <view class=\"u-upload__trigger-default\">\n <text class=\"u-upload__trigger-icon\">+</text>\n <text v-if=\"triggerText\" class=\"u-upload__trigger-text\">{{ triggerText }}</text>\n </view>\n </slot>\n </view>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue'\n\ninterface UploadFile {\n url?: string\n thumb?: string\n name?: string\n size?: number\n status?: 'pending' | 'uploading' | 'done' | 'error'\n progress?: number\n type?: string\n file?: any\n}\n\ninterface Props {\n modelValue?: UploadFile[]\n accept?: 'image' | 'video' | 'media' | 'all'\n multiple?: boolean\n maxCount?: number\n maxSize?: number\n disabled?: boolean\n deletable?: boolean\n showUpload?: boolean\n triggerText?: string\n previewFull?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: () => [],\n accept: 'image',\n multiple: false,\n maxCount: 99,\n maxSize: 10 * 1024 * 1024,\n disabled: false,\n deletable: true,\n showUpload: true,\n triggerText: '',\n previewFull: true\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [files: UploadFile[]]\n change: [files: UploadFile[]]\n success: [file: UploadFile]\n fail: [error: any]\n delete: [file: UploadFile, index: number]\n preview: [file: UploadFile, index: number]\n oversize: [files: UploadFile[]]\n overcount: []\n}>()\n\nconst fileList = ref<UploadFile[]>(props.modelValue)\n// 默认视频缩略图占位符\nconst defaultVideoThumb = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iODAiIGhlaWdodD0iODAiIGZpbGw9IiNFNUU1RTUiLz48dGV4dCB4PSI1MCUiIHk9IjUwJSIgZmlsbD0iIzk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZG9taW5hbnQtYmFzZWxpbmU9Im1pZGRsZSIgZm9udC1zaXplPSIyNCI+▶PC90ZXh0Pjwvc3ZnPg=='\n\nconst showUploadBtn = computed(() => {\n return props.showUpload && (!props.maxCount || fileList.value.length < props.maxCount)\n})\n\nwatch(() => props.modelValue, (val) => {\n fileList.value = val\n}, { deep: true })\n\nconst isImage = (file: UploadFile) => {\n if (file.type) return file.type.startsWith('image/')\n const url = file.url || ''\n return /\\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(url)\n}\n\nconst isVideo = (file: UploadFile) => {\n if (file.type) return file.type.startsWith('video/')\n const url = file.url || ''\n return /\\.(mp4|mov|avi|mkv|webm)$/i.test(url)\n}\n\nconst getFileName = (file: UploadFile) => {\n if (file.name) return file.name\n const url = file.url || ''\n const match = url.match(/[^/]+$/)\n return match ? match[0] : '文件'\n}\n\nconst handleTrigger = () => {\n if (props.disabled || fileList.value.length >= props.maxCount) {\n if (fileList.value.length >= props.maxCount) {\n emit('overcount')\n }\n return\n }\n\n // 模拟文件选择,实际在uni-app中使用 uni.chooseImage/uni.chooseVideo\n // 这里仅作演示\n}\n\nconst handlePreview = (file: UploadFile, index: number) => {\n emit('preview', file, index)\n}\n\nconst handleDelete = (index: number) => {\n const file = fileList.value[index]\n fileList.value.splice(index, 1)\n emit('update:modelValue', fileList.value)\n emit('change', fileList.value)\n emit('delete', file, index)\n}\n\nconst afterRead = (files: UploadFile | UploadFile[]) => {\n const fileArray = Array.isArray(files) ? files : [files]\n\n // 检查数量限制\n if (fileList.value.length + fileArray.length > props.maxCount) {\n emit('overcount')\n return\n }\n\n // 检查大小限制\n const oversizeFiles = fileArray.filter(f => f.size && f.size > props.maxSize)\n if (oversizeFiles.length > 0) {\n emit('oversize', oversizeFiles)\n return\n }\n\n // 添加文件到列表\n fileArray.forEach(file => {\n file.status = 'uploading'\n file.progress = 0\n fileList.value.push(file)\n\n // 模拟上传过程\n simulateUpload(file)\n })\n}\n\nconst simulateUpload = (file: UploadFile) => {\n // 模拟上传进度\n let progress = 0\n const timer = setInterval(() => {\n progress += Math.random() * 30\n if (progress >= 100) {\n progress = 100\n file.status = 'done'\n file.progress = 100\n clearInterval(timer)\n emit('update:modelValue', fileList.value)\n emit('change', fileList.value)\n emit('success', file)\n } else {\n file.progress = progress\n }\n }, 200)\n}\n\n// 提供外部调用的方法\ndefineExpose({\n afterRead,\n fileList\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-upload {\n width: 100%;\n\n &__list {\n display: flex;\n flex-wrap: wrap;\n gap: $--spacing-sm;\n }\n\n &__item {\n position: relative;\n width: 80px;\n height: 80px;\n border-radius: $--border-radius-md;\n overflow: hidden;\n background: $--bg-color-2;\n border: 1px solid $--border-color;\n\n &--error {\n border-color: $--color-danger;\n }\n\n &--uploading {\n opacity: 0.8;\n }\n }\n\n &__preview {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n &__video {\n width: 100%;\n height: 100%;\n position: relative;\n\n &-icon {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.3);\n color: #fff;\n font-size: 24px;\n }\n }\n\n &__file {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: $--spacing-xs;\n\n &-icon {\n font-size: 24px;\n margin-bottom: 4px;\n }\n\n &-name {\n font-size: $--font-size-xs;\n color: $--text-color-2;\n text-align: center;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 100%;\n }\n }\n\n &__progress {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 4px;\n background: rgba(255, 255, 255, 0.8);\n\n &-bar {\n height: 100%;\n background: $--color-primary;\n transition: width 0.2s;\n }\n }\n\n &__delete {\n position: absolute;\n top: 0;\n right: 0;\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0, 0, 0, 0.5);\n border-radius: 0 $--border-radius-md 0 0;\n\n &-icon {\n color: #fff;\n font-size: 12px;\n }\n }\n\n &__error {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(238, 10, 36, 0.1);\n color: $--color-danger;\n font-size: $--font-size-xs;\n }\n\n &__trigger {\n width: 80px;\n height: 80px;\n border-radius: $--border-radius-md;\n background: $--bg-color;\n border: 1px solid $--border-color;\n display: flex;\n align-items: center;\n justify-content: center;\n\n &--disabled {\n opacity: 0.5;\n }\n\n &-default {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n }\n\n &-icon {\n font-size: 24px;\n color: $--text-color-3;\n }\n\n &-text {\n font-size: $--font-size-xs;\n color: $--text-color-3;\n margin-top: 4px;\n }\n }\n}\n</style>","<template>\n <view\n class=\"u-textarea\"\n :class=\"{\n 'u-textarea--disabled': disabled,\n 'u-textarea--error': error,\n 'u-textarea--focus': isFocus\n }\"\n >\n <textarea\n class=\"u-textarea__control\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :placeholder-style=\"placeholderStyle\"\n :placeholder-class=\"'u-textarea__placeholder'\"\n :disabled=\"disabled\"\n :maxlength=\"maxlength\"\n :focus=\"focus\"\n :auto-height=\"autoHeight\"\n :fixed=\"fixed\"\n :cursor-spacing=\"cursorSpacing\"\n :show-confirm-bar=\"showConfirmBar\"\n :adjust-position=\"adjustPosition\"\n :style=\"textareaStyle\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @confirm=\"handleConfirm\"\n @linechange=\"handleLineChange\"\n />\n\n <view v-if=\"showWordLimit && maxlength\" class=\"u-textarea__limit\">\n <text class=\"u-textarea__limit-text\">{{ currentLength }}/{{ maxlength }}</text>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\n\ninterface Props {\n modelValue?: string\n placeholder?: string\n placeholderStyle?: string\n disabled?: boolean\n maxlength?: number\n focus?: boolean\n autoHeight?: boolean\n fixed?: boolean\n cursorSpacing?: number\n showConfirmBar?: boolean\n adjustPosition?: boolean\n showWordLimit?: boolean\n error?: boolean\n rows?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: '',\n placeholder: '请输入内容',\n disabled: false,\n maxlength: -1,\n focus: false,\n autoHeight: false,\n fixed: false,\n cursorSpacing: 0,\n showConfirmBar: true,\n adjustPosition: true,\n showWordLimit: false,\n error: false,\n rows: 3\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n input: [value: string]\n focus: [event: FocusEvent]\n blur: [event: FocusEvent]\n confirm: [value: string]\n linechange: [event: any]\n}>()\n\nconst isFocus = ref(false)\n\nconst currentLength = computed(() => {\n return String(props.modelValue).length\n})\n\nconst textareaStyle = computed(() => {\n if (props.autoHeight) return {}\n return {\n minHeight: `calc($--font-size-md * $--textarea-line-height * ${props.rows})`\n }\n})\n\nconst handleInput = (event: any) => {\n const value = event.detail.value\n emit('update:modelValue', value)\n emit('input', value)\n}\n\nconst handleFocus = (event: FocusEvent) => {\n isFocus.value = true\n emit('focus', event)\n}\n\nconst handleBlur = (event: FocusEvent) => {\n isFocus.value = false\n emit('blur', event)\n}\n\nconst handleConfirm = (event: any) => {\n emit('confirm', event.detail.value)\n}\n\nconst handleLineChange = (event: any) => {\n emit('linechange', event)\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-textarea {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n padding: $--spacing-md;\n background-color: $--bg-color-2;\n border-radius: $--border-radius-md;\n border: 1px solid $--border-color;\n transition: all $--transition-duration;\n\n &--focus {\n border-color: $--color-primary;\n }\n\n &--error {\n border-color: $--color-danger;\n }\n\n &--disabled {\n background-color: $--bg-color;\n }\n\n &__control {\n width: 100%;\n min-height: calc($--font-size-md * $--textarea-line-height * 3);\n font-size: $--font-size-md;\n line-height: $--textarea-line-height;\n color: $--text-color;\n background: transparent;\n resize: none;\n outline: none;\n border: none;\n }\n\n &__placeholder {\n color: $--text-color-3;\n }\n\n &__limit {\n display: flex;\n justify-content: flex-end;\n padding-top: $--spacing-sm;\n }\n\n &__limit-text {\n font-size: $--font-size-sm;\n color: $--text-color-3;\n }\n\n &--disabled &__limit-text {\n color: $--text-color-3;\n }\n\n &--error &__limit-text {\n color: $--color-danger;\n }\n}\n</style>","<template>\n <view\n class=\"u-slider\"\n :class=\"{\n 'u-slider--disabled': disabled\n }\"\n >\n <!-- 最小值标签 -->\n <view v-if=\"showMinMax\" class=\"u-slider__min\">\n <text class=\"u-slider__label\">{{ min }}</text>\n </view>\n\n <!-- 滑动轨道 -->\n <view\n class=\"u-slider__track\"\n :style=\"trackStyle\"\n @click=\"handleTrackClick\"\n @touchstart=\"handleTouchStart\"\n @touchmove=\"handleTouchMove\"\n @touchend=\"handleTouchEnd\"\n >\n <!-- 已选择区域 -->\n <view class=\"u-slider__bar\" :style=\"barStyle\">\n <!-- 滑块 -->\n <view\n v-if=\"!range\"\n class=\"u-slider__button\"\n :style=\"buttonStyle\"\n @touchstart.stop=\"handleButtonTouchStart\"\n @touchmove.stop=\"handleButtonTouchMove\"\n @touchend.stop=\"handleButtonTouchEnd\"\n >\n <view v-if=\"showValue\" class=\"u-slider__tooltip\">\n <text class=\"u-slider__tooltip-text\">{{ currentValue }}</text>\n </view>\n </view>\n\n <!-- 双滑块 -->\n <template v-else>\n <view\n class=\"u-slider__button u-slider__button--start\"\n :style=\"startButtonStyle\"\n @touchstart.stop=\"handleStartButtonTouchStart\"\n @touchmove.stop=\"handleStartButtonTouchMove\"\n @touchend.stop=\"handleButtonTouchEnd\"\n >\n <view v-if=\"showValue\" class=\"u-slider__tooltip\">\n <text class=\"u-slider__tooltip-text\">{{ startValue }}</text>\n </view>\n </view>\n <view\n class=\"u-slider__button u-slider__button--end\"\n :style=\"endButtonStyle\"\n @touchstart.stop=\"handleEndButtonTouchStart\"\n @touchmove.stop=\"handleEndButtonTouchMove\"\n @touchend.stop=\"handleButtonTouchEnd\"\n >\n <view v-if=\"showValue\" class=\"u-slider__tooltip\">\n <text class=\"u-slider__tooltip-text\">{{ endValue }}</text>\n </view>\n </view>\n </template>\n </view>\n\n <!-- 刻度标记 -->\n <view v-if=\"showTicks\" class=\"u-slider__ticks\">\n <view\n v-for=\"(tick, index) in ticks\"\n :key=\"index\"\n class=\"u-slider__tick\"\n :style=\"{ left: tick.position + '%' }\"\n ></view>\n </view>\n </view>\n\n <!-- 最大值标签 -->\n <view v-if=\"showMinMax\" class=\"u-slider__max\">\n <text class=\"u-slider__label\">{{ max }}</text>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue'\n\ninterface Props {\n modelValue?: number | [number, number]\n min?: number\n max?: number\n step?: number\n disabled?: boolean\n range?: boolean\n showValue?: boolean\n showMinMax?: boolean\n showTicks?: boolean\n barHeight?: number | string\n activeColor?: string\n inactiveColor?: string\n buttonColor?: string\n buttonSize?: number | string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: 0,\n min: 0,\n max: 100,\n step: 1,\n disabled: false,\n range: false,\n showValue: false,\n showMinMax: false,\n showTicks: false,\n barHeight: 2,\n activeColor: '#1989fa',\n inactiveColor: '#e5e5e5',\n buttonColor: '#fff',\n buttonSize: 24\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: number | [number, number]]\n change: [value: number | [number, number]]\n dragstart: []\n dragend: []\n}>()\n\nconst currentValue = ref(0)\nconst startValue = ref(0)\nconst endValue = ref(100)\nconst trackWidth = ref(0)\nconst trackLeft = ref(0)\nconst isDragging = ref(false)\nconst dragType = ref<'single' | 'start' | 'end'>('single')\n\nconst barHeightStyle = computed(() => {\n const height = props.barHeight\n return typeof height === 'number' ? `${height}px` : height\n})\n\nconst buttonSizeStyle = computed(() => {\n const size = props.buttonSize\n return typeof size === 'number' ? `${size}px` : size\n})\n\nconst trackStyle = computed(() => ({\n height: barHeightStyle.value,\n backgroundColor: props.inactiveColor\n}))\n\nconst barStyle = computed(() => {\n if (props.range) {\n const startPercent = ((startValue.value - props.min) / (props.max - props.min)) * 100\n const endPercent = ((endValue.value - props.min) / (props.max - props.min)) * 100\n return {\n left: `${startPercent}%`,\n width: `${endPercent - startPercent}%`,\n height: barHeightStyle.value,\n backgroundColor: props.activeColor\n }\n }\n const percent = ((currentValue.value - props.min) / (props.max - props.min)) * 100\n return {\n width: `${percent}%`,\n height: barHeightStyle.value,\n backgroundColor: props.activeColor\n }\n})\n\nconst buttonStyle = computed(() => ({\n width: buttonSizeStyle.value,\n height: buttonSizeStyle.value,\n backgroundColor: props.buttonColor,\n borderColor: props.activeColor\n}))\n\nconst startButtonStyle = computed(() => ({\n ...buttonStyle.value,\n left: `-${parseInt(buttonSizeStyle.value) / 2}px`\n}))\n\nconst endButtonStyle = computed(() => ({\n ...buttonStyle.value,\n right: `-${parseInt(buttonSizeStyle.value) / 2}px`\n}))\n\nconst ticks = computed(() => {\n const tickCount = Math.floor((props.max - props.min) / props.step)\n const result = []\n for (let i = 0; i <= tickCount; i++) {\n result.push({\n position: (i / tickCount) * 100\n })\n }\n return result\n})\n\nwatch(() => props.modelValue, (val) => {\n if (props.range && Array.isArray(val)) {\n startValue.value = val[0]\n endValue.value = val[1]\n } else if (typeof val === 'number') {\n currentValue.value = val\n }\n}, { immediate: true })\n\nconst updateTrackRect = () => {\n // uni-app 中需要使用 createSelectorQuery\n // 这里简化处理,在touch事件中动态计算\n const query = uni.createSelectorQuery?.()\n if (query) {\n query.select('.u-slider__track').boundingClientRect((rect: any) => {\n if (rect) {\n trackWidth.value = rect.width\n trackLeft.value = rect.left\n }\n }).exec()\n }\n}\n\nconst getStepValue = (value: number): number => {\n const stepCount = Math.round((value - props.min) / props.step)\n return props.min + stepCount * props.step\n}\n\nconst updateValue = (value: number) => {\n const stepped = getStepValue(value)\n currentValue.value = stepped\n emit('update:modelValue', stepped)\n emit('change', stepped)\n}\n\nconst updateRangeValue = (type: 'start' | 'end', value: number) => {\n const stepped = getStepValue(value)\n if (type === 'start') {\n if (stepped < endValue.value) {\n startValue.value = stepped\n }\n } else {\n if (stepped > startValue.value) {\n endValue.value = stepped\n }\n }\n emit('update:modelValue', [startValue.value, endValue.value])\n emit('change', [startValue.value, endValue.value])\n}\n\nconst handleTrackClick = (event: any) => {\n if (props.disabled) return\n if (!trackWidth.value) updateTrackRect()\n\n // 获取触摸/点击位置(兼容各平台)\n const touch = event.touches?.[0] || event\n const x = touch.clientX || touch.x || 0\n const percent = (x - trackLeft.value) / trackWidth.value\n const value = props.min + percent * (props.max - props.min)\n\n if (props.range) {\n if (Math.abs(value - startValue.value) < Math.abs(value - endValue.value)) {\n updateRangeValue('start', value)\n } else {\n updateRangeValue('end', value)\n }\n } else {\n updateValue(value)\n }\n}\n\nconst handleTouchStart = (event: any) => {\n if (props.disabled) return\n // 初始化轨道位置信息\n const touch = event.touches?.[0]\n if (touch) {\n trackWidth.value = 1 // 初始化避免为0\n }\n}\n\nconst handleTouchMove = (event: any) => {\n // 轨道触摸移动处理\n}\n\nconst handleButtonTouchStart = () => {\n if (props.disabled) return\n isDragging.value = true\n dragType.value = 'single'\n emit('dragstart')\n updateTrackRect()\n}\n\nconst handleButtonTouchMove = (event: any) => {\n if (!isDragging.value || props.disabled) return\n\n // 获取触摸位置(兼容各平台)\n const touch = event.touches?.[0] || event\n const x = touch.clientX || touch.x || 0\n\n const percent = (x - trackLeft.value) / trackWidth.value\n const value = props.min + Math.max(0, Math.min(1, percent)) * (props.max - props.min)\n updateValue(value)\n}\n\nconst handleButtonTouchEnd = () => {\n isDragging.value = false\n emit('dragend')\n}\n\nconst handleStartButtonTouchStart = () => {\n if (props.disabled) return\n isDragging.value = true\n dragType.value = 'start'\n emit('dragstart')\n updateTrackRect()\n}\n\nconst handleStartButtonTouchMove = (event: any) => {\n if (!isDragging.value || props.disabled) return\n\n // 获取触摸位置(兼容各平台)\n const touch = event.touches?.[0] || event\n const x = touch.clientX || touch.x || 0\n\n const percent = (x - trackLeft.value) / trackWidth.value\n const value = props.min + Math.max(0, Math.min(1, percent)) * (props.max - props.min)\n updateRangeValue('start', value)\n}\n\nconst handleEndButtonTouchStart = () => {\n if (props.disabled) return\n isDragging.value = true\n dragType.value = 'end'\n emit('dragstart')\n updateTrackRect()\n}\n\nconst handleEndButtonTouchMove = (event: any) => {\n if (!isDragging.value || props.disabled) return\n\n // 获取触摸位置(兼容各平台)\n const touch = event.touches?.[0] || event\n const x = touch.clientX || touch.x || 0\n\n const percent = (x - trackLeft.value) / trackWidth.value\n const value = props.min + Math.max(0, Math.min(1, percent)) * (props.max - props.min)\n updateRangeValue('end', value)\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-slider {\n display: flex;\n align-items: center;\n width: 100%;\n padding: $--spacing-md 0;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n\n &--disabled {\n opacity: 0.5;\n }\n\n &__min,\n &__max {\n min-width: 32px;\n text-align: center;\n }\n\n &__label {\n font-size: $--font-size-sm;\n color: $--text-color-2;\n }\n\n &__track {\n flex: 1;\n position: relative;\n border-radius: 999px;\n }\n\n &__bar {\n position: absolute;\n border-radius: 999px;\n transition: width 0.1s, left 0.1s;\n }\n\n &__button {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n border-radius: 50%;\n border: 2px solid $--color-primary;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n transition: transform 0.1s;\n\n &:active {\n transform: translateY(-50%) scale(1.2);\n }\n\n &--start {\n left: calc(-1 * $--slider-button-size / 2);\n }\n\n &--end {\n right: calc(-1 * $--slider-button-size / 2);\n }\n }\n\n &__tooltip {\n position: absolute;\n left: 50%;\n bottom: 100%;\n transform: translateX(-50%);\n padding: 4px 8px;\n background: $--text-color;\n color: #fff;\n font-size: $--font-size-xs;\n border-radius: $--border-radius-sm;\n white-space: nowrap;\n margin-bottom: 8px;\n\n &::after {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-top-color: $--text-color;\n }\n }\n\n &__ticks {\n position: absolute;\n inset: 0;\n }\n\n &__tick {\n position: absolute;\n width: 2px;\n height: 100%;\n background: rgba(0, 0, 0, 0.1);\n transform: translateX(-50%);\n }\n}\n</style>","<template>\n <view class=\"u-list\">\n <!-- 列表头部 -->\n <view v-if=\"$slots.header || header\" class=\"u-list__header\">\n <slot name=\"header\">{{ header }}</slot>\n </view>\n\n <!-- 列表内容 -->\n <view class=\"u-list__content\">\n <slot />\n </view>\n\n <!-- 加载状态 -->\n <view v-if=\"loading\" class=\"u-list__loading\">\n <view class=\"u-list__loading-icon\"></view>\n <text class=\"u-list__loading-text\">{{ loadingText }}</text>\n </view>\n\n <!-- 加载完成 -->\n <view v-if=\"finished && !loading\" class=\"u-list__finished\">\n <text class=\"u-list__finished-text\">{{ finishedText }}</text>\n </view>\n\n <!-- 加载失败 -->\n <view v-if=\"error && !loading\" class=\"u-list__error\" @click=\"handleErrorClick\">\n <text class=\"u-list__error-text\">{{ errorText }}</text>\n </view>\n\n <!-- 列表底部 -->\n <view v-if=\"$slots.footer || footer\" class=\"u-list__footer\">\n <slot name=\"footer\">{{ footer }}</slot>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n loading?: boolean\n finished?: boolean\n error?: boolean\n loadingText?: string\n finishedText?: string\n errorText?: string\n header?: string\n footer?: string\n immediateCheck?: boolean\n offset?: number\n direction?: 'up' | 'down'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n loading: false,\n finished: false,\n error: false,\n loadingText: '加载中...',\n finishedText: '加载完成',\n errorText: '加载失败,点击重试',\n header: '',\n footer: '',\n immediateCheck: true,\n offset: 50,\n direction: 'down'\n})\n\nconst emit = defineEmits<{\n load: []\n 'update:loading': [value: boolean]\n 'update:error': [value: boolean]\n}>()\n\nconst handleErrorClick = () => {\n emit('update:error', false)\n emit('load')\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-list {\n width: 100%;\n\n &__header,\n &__footer {\n padding: $--spacing-md $--spacing-lg;\n font-size: $--font-size-sm;\n color: $--text-color-2;\n }\n\n &__content {\n min-height: 50px;\n }\n\n &__loading,\n &__finished,\n &__error {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: $--spacing-lg;\n font-size: $--font-size-md;\n color: $--text-color-2;\n }\n\n &__loading {\n gap: $--spacing-sm;\n }\n\n &__loading-icon {\n width: 16px;\n height: 16px;\n border: 2px solid $--border-color;\n border-top-color: $--color-primary;\n border-radius: 50%;\n animation: u-list-spin 0.8s linear infinite;\n }\n\n &__loading-text,\n &__finished-text,\n &__error-text {\n font-size: $--font-size-sm;\n color: $--text-color-2;\n }\n\n &__error {\n }\n\n &__error-text {\n color: $--color-primary;\n }\n}\n\n@keyframes u-list-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n</style>","<template>\n <view\n class=\"u-list-item\"\n :class=\"{\n 'u-list-item--clickable': clickable,\n 'u-list-item--disabled': disabled\n }\"\n @click=\"handleClick\"\n >\n <!-- 列表项图标/图片 -->\n <view v-if=\"$slots.icon || icon || thumb\" class=\"u-list-item__icon\">\n <slot name=\"icon\">\n <image v-if=\"thumb\" class=\"u-list-item__thumb\" :src=\"thumb\" mode=\"aspectFill\" />\n <text v-else-if=\"icon\" class=\"u-list-item__icon-text\">{{ icon }}</text>\n </slot>\n </view>\n\n <!-- 列表项主体 -->\n <view class=\"u-list-item__body\">\n <view v-if=\"title || $slots.title\" class=\"u-list-item__title\">\n <slot name=\"title\">{{ title }}</slot>\n </view>\n <view v-if=\"desc || $slots.desc\" class=\"u-list-item__desc\">\n <slot name=\"desc\">{{ desc }}</slot>\n </view>\n <view v-if=\"$slots.default\" class=\"u-list-item__content\">\n <slot />\n </view>\n </view>\n\n <!-- 列表项右侧内容 -->\n <view v-if=\"$slots.extra || extra || value\" class=\"u-list-item__extra\">\n <slot name=\"extra\">\n <text v-if=\"value\" class=\"u-list-item__value\">{{ value }}</text>\n <text v-if=\"extra\" class=\"u-list-item__extra-text\">{{ extra }}</text>\n </slot>\n <view v-if=\"showArrow\" class=\"u-list-item__arrow\">\n <text class=\"u-list-item__arrow-icon\">›</text>\n </view>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n title?: string\n desc?: string\n value?: string\n extra?: string\n icon?: string\n thumb?: string\n clickable?: boolean\n disabled?: boolean\n showArrow?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n title: '',\n desc: '',\n value: '',\n extra: '',\n icon: '',\n thumb: '',\n clickable: false,\n disabled: false,\n showArrow: false\n})\n\nconst emit = defineEmits<{\n click: [event: Event]\n}>()\n\nconst handleClick = (event: Event) => {\n if (props.disabled) return\n emit('click', event)\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-list-item {\n display: flex;\n align-items: flex-start;\n padding: $--spacing-md $--spacing-lg;\n background-color: $--bg-color-2;\n border-bottom: 1px solid $--border-color;\n transition: background-color $--transition-duration;\n\n &:last-child {\n border-bottom: none;\n }\n\n &--clickable {\n &:active {\n background-color: $--bg-color;\n }\n }\n\n &--disabled {\n opacity: 0.5;\n }\n\n &__icon {\n display: flex;\n align-items: center;\n margin-right: $--spacing-md;\n }\n\n &__thumb {\n width: 40px;\n height: 40px;\n border-radius: $--border-radius-sm;\n object-fit: cover;\n }\n\n &__icon-text {\n font-size: 20px;\n }\n\n &__body {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n &__title {\n font-size: $--font-size-md;\n color: $--text-color;\n line-height: 1.5;\n }\n\n &__desc {\n margin-top: $--spacing-xs;\n font-size: $--font-size-sm;\n color: $--text-color-2;\n line-height: 1.4;\n }\n\n &__content {\n margin-top: $--spacing-sm;\n }\n\n &__extra {\n display: flex;\n align-items: center;\n margin-left: $--spacing-md;\n flex-shrink: 0;\n }\n\n &__value {\n font-size: $--font-size-md;\n color: $--text-color-2;\n }\n\n &__extra-text {\n font-size: $--font-size-sm;\n color: $--text-color-3;\n }\n\n &__arrow {\n display: flex;\n align-items: center;\n margin-left: $--spacing-sm;\n color: $--text-color-3;\n }\n\n &__arrow-icon {\n font-size: 16px;\n }\n}\n</style>","<template>\n <view class=\"u-line-progress\" :style=\"wrapperStyle\">\n <view class=\"u-line-progress__track\" :style=\"trackStyle\">\n <view\n class=\"u-line-progress__bar\"\n :class=\"{\n 'u-line-progress__bar--striped': striped,\n 'u-line-progress__bar--animated': striped && animated\n }\"\n :style=\"barStyle\"\n >\n <text\n v-if=\"showText && textInside && percentage <= 100\"\n class=\"u-line-progress__text u-line-progress__text--inside\"\n >{{ textContent }}</text>\n </view>\n </view>\n <text\n v-if=\"showText && !textInside\"\n class=\"u-line-progress__text\"\n >{{ textContent }}</text>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n percentage: number\n height?: number | string\n color?: string\n trackColor?: string\n showText?: boolean\n textInside?: boolean\n format?: (percentage: number) => string\n striped?: boolean\n animated?: boolean\n inactive?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n percentage: 0,\n height: 6,\n color: '#1989fa',\n trackColor: '#e5e5e5',\n showText: true,\n textInside: false,\n striped: false,\n animated: false,\n inactive: false\n})\n\nconst heightStyle = computed(() => {\n const height = props.height\n return typeof height === 'number' ? `${height}px` : height\n})\n\nconst wrapperStyle = computed(() => ({\n height: props.textInside ? heightStyle.value : 'auto'\n}))\n\nconst trackStyle = computed(() => ({\n height: heightStyle.value,\n backgroundColor: props.trackColor,\n borderRadius: heightStyle.value\n}))\n\nconst barStyle = computed(() => {\n const percentage = Math.min(100, Math.max(0, props.percentage))\n return {\n width: `${percentage}%`,\n backgroundColor: props.inactive ? '#c8c9cc' : props.color,\n borderRadius: heightStyle.value\n }\n})\n\nconst textContent = computed(() => {\n if (props.format) {\n return props.format(props.percentage)\n }\n return `${Math.round(props.percentage)}%`\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-line-progress {\n display: flex;\n align-items: center;\n width: 100%;\n\n &__track {\n flex: 1;\n overflow: hidden;\n position: relative;\n }\n\n &__bar {\n height: 100%;\n transition: width 0.3s ease-out;\n position: relative;\n\n &--striped {\n background-image: linear-gradient(\n 45deg,\n rgba(255, 255, 255, 0.15) 25%,\n transparent 25%,\n transparent 50%,\n rgba(255, 255, 255, 0.15) 50%,\n rgba(255, 255, 255, 0.15) 75%,\n transparent 75%,\n transparent\n );\n background-size: 1rem 1rem;\n }\n\n &--animated {\n animation: u-line-progress-stripes 1s linear infinite;\n }\n }\n\n &__text {\n font-size: $--font-size-sm;\n color: $--text-color-2;\n white-space: nowrap;\n margin-left: $--spacing-sm;\n\n &--inside {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n margin-left: 0;\n color: #fff;\n font-size: 12px;\n }\n }\n}\n\n@keyframes u-line-progress-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n</style>","<template>\n <view class=\"u-count-down\">\n <slot :time=\"timeData\" :current=\"current\">\n <text class=\"u-count-down__text\" :style=\"textStyle\">{{ formattedTime }}</text>\n </slot>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onMounted, onUnmounted } from 'vue'\n\ninterface TimeData {\n days: number\n hours: number\n minutes: number\n seconds: number\n milliseconds: number\n total: number\n}\n\ninterface Props {\n time: number\n format?: string\n millisecond?: boolean\n autoStart?: boolean\n fontSize?: number | string\n color?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n time: 0,\n format: 'HH:mm:ss',\n millisecond: false,\n autoStart: true,\n fontSize: 14,\n color: ''\n})\n\nconst emit = defineEmits<{\n finish: []\n change: [timeData: TimeData]\n}>()\n\nconst current = ref(props.time)\nconst counting = ref(false)\nlet timer: ReturnType<typeof setInterval> | null = null\n\nconst textStyle = computed(() => {\n const fontSize = typeof props.fontSize === 'number' ? `${props.fontSize}px` : props.fontSize\n return {\n fontSize,\n color: props.color || undefined\n }\n})\n\nconst padZero = (num: number, length: number = 2): string => {\n return String(num).padStart(length, '0')\n}\n\nconst timeData = computed<TimeData>(() => {\n const total = current.value\n const days = Math.floor(total / (1000 * 60 * 60 * 24))\n const hours = Math.floor((total % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))\n const minutes = Math.floor((total % (1000 * 60 * 60)) / (1000 * 60))\n const seconds = Math.floor((total % (1000 * 60)) / 1000)\n const milliseconds = total % 1000\n\n return {\n days,\n hours,\n minutes,\n seconds,\n milliseconds,\n total\n }\n})\n\nconst formattedTime = computed(() => {\n const data = timeData.value\n let result = props.format\n\n // 按照从长到短的顺序替换,避免错误替换\n const replacements: [string, string][] = [\n ['DD', padZero(data.days)],\n ['D', String(data.days)],\n ['HH', padZero(data.hours)],\n ['H', String(data.hours)],\n ['mm', padZero(data.minutes)],\n ['m', String(data.minutes)],\n ['ss', padZero(data.seconds)],\n ['s', String(data.seconds)],\n ['SSS', padZero(data.milliseconds, 3)],\n ['S', String(Math.floor(data.milliseconds / 100))]\n ]\n\n replacements.forEach(([key, value]) => {\n result = result.replace(new RegExp(key, 'g'), value)\n })\n\n return result\n})\n\nconst tick = () => {\n if (current.value <= 0) {\n stop()\n emit('finish')\n return\n }\n\n const interval = props.millisecond ? 10 : 1000\n current.value = Math.max(0, current.value - interval)\n emit('change', timeData.value)\n}\n\nconst start = () => {\n if (counting.value || current.value <= 0) return\n counting.value = true\n const interval = props.millisecond ? 10 : 1000\n timer = setInterval(tick, interval)\n}\n\nconst stop = () => {\n if (timer) {\n clearInterval(timer)\n timer = null\n }\n counting.value = false\n}\n\nconst pause = () => {\n stop()\n}\n\nconst reset = (newTime?: number) => {\n stop()\n current.value = newTime !== undefined ? newTime : props.time\n if (props.autoStart) {\n start()\n }\n}\n\nwatch(() => props.time, (val) => {\n reset(val)\n})\n\nonMounted(() => {\n if (props.autoStart) {\n start()\n }\n})\n\nonUnmounted(() => {\n stop()\n})\n\ndefineExpose({\n start,\n stop,\n pause,\n reset,\n timeData\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-count-down {\n display: inline-block;\n\n &__text {\n font-variant-numeric: tabular-nums;\n }\n}\n</style>","<template>\n <view\n class=\"u-tooltip\"\n :class=\"{\n 'u-tooltip--active': visible\n }\"\n @longpress=\"handleLongPress\"\n @touchstart=\"handleTouchStart\"\n @touchend=\"handleTouchEnd\"\n >\n <!-- 触发元素 -->\n <view\n class=\"u-tooltip__trigger\"\n :class=\"{\n 'u-tooltip__trigger--highlight': highlight && visible\n }\"\n :style=\"highlight ? highlightStyle : {}\"\n >\n <slot />\n </view>\n\n <!-- 提示气泡 -->\n <view\n v-if=\"visible\"\n class=\"u-tooltip__popup\"\n :class=\"[`u-tooltip__popup--${placement}`, `u-tooltip__popup--${actualPlacement}`]\"\n :style=\"popupStyle\"\n >\n <!-- 箭头 -->\n <view class=\"u-tooltip__arrow\" :class=\"`u-tooltip__arrow--${actualPlacement}`\"></view>\n\n <!-- 内容 -->\n <view class=\"u-tooltip__content\">\n <!-- 操作按钮 -->\n <view v-if=\"actions.length\" class=\"u-tooltip__actions\">\n <view\n v-for=\"(action, index) in actions\"\n :key=\"index\"\n class=\"u-tooltip__action\"\n :class=\"{ 'u-tooltip__action--disabled': action.disabled }\"\n @click.stop=\"handleActionClick(action, index)\"\n >\n <text class=\"u-tooltip__action-text\">{{ action.text }}</text>\n </view>\n </view>\n\n <!-- 自定义内容 -->\n <slot v-else name=\"content\">\n <text class=\"u-tooltip__text\">{{ content }}</text>\n </slot>\n </view>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onUnmounted } from 'vue'\n\n// 检测是否在 uniapp 环境中\nconst isUniApp = typeof uni !== 'undefined'\n\ninterface Action {\n text: string\n disabled?: boolean\n [key: string]: any\n}\n\ninterface Props {\n content?: string\n placement?: 'top' | 'bottom'\n actions?: Action[]\n highlight?: boolean\n highlightColor?: string\n autoAdjust?: boolean\n showDuration?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n content: '',\n placement: 'top',\n actions: () => [],\n highlight: false,\n highlightColor: 'rgba(25, 137, 250, 0.1)',\n autoAdjust: true,\n showDuration: 0\n})\n\nconst emit = defineEmits<{\n show: []\n hide: []\n select: [action: Action, index: number]\n}>()\n\nconst visible = ref(false)\nconst actualPlacement = ref(props.placement)\nlet hideTimer: ReturnType<typeof setTimeout> | null = null\nlet triggerRect = { top: 0, bottom: 0, left: 0, right: 0, width: 0, height: 0 }\n\nconst highlightStyle = computed(() => ({\n backgroundColor: props.highlightColor\n}))\n\nconst popupStyle = computed(() => ({}))\n\nconst handleTouchStart = (event: any) => {\n const touch = event.touches?.[0]\n if (isUniApp) {\n // uni-app 使用 createSelectorQuery\n const query = uni.createSelectorQuery()\n query.select('.u-tooltip__trigger').boundingClientRect((rect: any) => {\n if (rect) {\n triggerRect = {\n top: rect.top,\n bottom: rect.bottom,\n left: rect.left,\n right: rect.right,\n width: rect.width,\n height: rect.height\n }\n }\n }).exec()\n } else if (event.currentTarget) {\n // 小程序/鸿蒙环境:使用 uni.createSelectorQuery 作为 fallback\n uni.createSelectorQuery()\n .select('.u-tooltip__trigger')\n .boundingClientRect((rect: any) => {\n if (rect) {\n triggerRect = {\n top: rect.top,\n bottom: rect.bottom,\n left: rect.left,\n right: rect.right,\n width: rect.width,\n height: rect.height\n }\n }\n })\n .exec()\n }\n}\n\nconst handleTouchEnd = () => {\n // touch end handled\n}\n\nconst handleLongPress = () => {\n show()\n}\n\nconst show = () => {\n visible.value = true\n emit('show')\n\n if (props.autoAdjust) {\n adjustPlacement()\n }\n\n if (props.showDuration > 0) {\n hideTimer = setTimeout(() => {\n hide()\n }, props.showDuration)\n }\n}\n\nconst hide = () => {\n visible.value = false\n emit('hide')\n if (hideTimer) {\n clearTimeout(hideTimer)\n hideTimer = null\n }\n}\n\nconst adjustPlacement = () => {\n // 简化的位置调整逻辑\n if (isUniApp) {\n // uni-app 中使用系统信息获取窗口高度\n const systemInfo = uni.getSystemInfoSync()\n const windowHeight = systemInfo.windowHeight\n const spaceAbove = triggerRect.top\n const spaceBelow = windowHeight - triggerRect.bottom\n\n if (props.placement === 'top' && spaceAbove < 50) {\n actualPlacement.value = 'bottom'\n } else if (props.placement === 'bottom' && spaceBelow < 50) {\n actualPlacement.value = 'top'\n } else {\n actualPlacement.value = props.placement\n }\n } else {\n const windowHeight = window.innerHeight\n const spaceAbove = triggerRect.top\n const spaceBelow = windowHeight - triggerRect.bottom\n\n if (props.placement === 'top' && spaceAbove < 50) {\n actualPlacement.value = 'bottom'\n } else if (props.placement === 'bottom' && spaceBelow < 50) {\n actualPlacement.value = 'top'\n } else {\n actualPlacement.value = props.placement\n }\n }\n}\n\nconst handleActionClick = (action: Action, index: number) => {\n if (action.disabled) return\n emit('select', action, index)\n hide()\n}\n\nconst handleClickOutside = (event: TouchEvent | MouseEvent) => {\n if (visible.value) {\n hide()\n }\n}\n\nonMounted(() => {\n if (isUniApp) {\n // uni-app 中使用页面生命周期事件处理\n } else {\n document.addEventListener('click', handleClickOutside)\n document.addEventListener('touchstart', handleClickOutside)\n }\n})\n\nonUnmounted(() => {\n if (isUniApp) {\n // uni-app 清理\n } else {\n document.removeEventListener('click', handleClickOutside)\n document.removeEventListener('touchstart', handleClickOutside)\n }\n if (hideTimer) {\n clearTimeout(hideTimer)\n }\n})\n\ndefineExpose({\n show,\n hide\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-tooltip {\n position: relative;\n display: inline-block;\n\n &--active {\n z-index: 999;\n }\n\n &__trigger {\n display: inline;\n transition: background-color 0.15s;\n\n &--highlight {\n border-radius: 2px;\n }\n }\n\n &__popup {\n position: absolute;\n z-index: 1000;\n padding: 8px 12px;\n background: #323233;\n border-radius: 8px;\n white-space: nowrap;\n animation: u-tooltip-fade-in 0.15s ease-out;\n\n &--top {\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n margin-bottom: 8px;\n }\n\n &--bottom {\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n margin-top: 8px;\n }\n }\n\n &__arrow {\n position: absolute;\n width: 0;\n height: 0;\n border: 6px solid transparent;\n\n &--top {\n bottom: -12px;\n left: 50%;\n transform: translateX(-50%);\n border-top-color: #323233;\n border-bottom: none;\n }\n\n &--bottom {\n top: -12px;\n left: 50%;\n transform: translateX(-50%);\n border-bottom-color: #323233;\n border-top: none;\n }\n }\n\n &__content {\n display: flex;\n align-items: center;\n }\n\n &__text {\n font-size: 14px;\n color: #fff;\n line-height: 1.4;\n }\n\n &__actions {\n display: flex;\n gap: 16px;\n }\n\n &__action {\n display: flex;\n align-items: center;\n padding: 4px 0;\n\n &--disabled {\n opacity: 0.5;\n }\n\n &:not(&--disabled):active {\n opacity: 0.7;\n }\n }\n\n &__action-text {\n font-size: 14px;\n color: #fff;\n }\n}\n\n@keyframes u-tooltip-fade-in {\n from {\n opacity: 0;\n transform: translateX(-50%) scale(0.9);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) scale(1);\n }\n}\n</style>","<template>\n <view class=\"u-avatar\" :class=\"avatarClass\" :style=\"avatarStyle\">\n <slot>\n <image v-if=\"src\" class=\"u-avatar__image\" :src=\"src\" mode=\"aspectFill\" @error=\"handleError\" />\n <text v-else-if=\"text\" class=\"u-avatar__text\">{{ displayText }}</text>\n <text v-else class=\"u-avatar__icon\">{{ icon || '👤' }}</text>\n </slot>\n <view v-if=\"badge && !badgeSlot\" class=\"u-avatar__badge\" :class=\"badgeClass\">\n <text v-if=\"!dot\" class=\"u-avatar__badge-text\">{{ badge }}</text>\n </view>\n <slot name=\"badge\" />\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, useSlots } from 'vue'\n\ntype AvatarSize = 'small' | 'medium' | 'large' | 'xlarge'\ntype AvatarShape = 'circle' | 'square'\ntype BadgePosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left'\n\ninterface Props {\n src?: string\n text?: string\n icon?: string\n size?: AvatarSize | number\n shape?: AvatarShape\n color?: string\n bgColor?: string\n badge?: string | number\n dot?: boolean\n badgeColor?: string\n badgePosition?: BadgePosition\n maxTextLength?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n src: '',\n text: '',\n icon: '',\n size: 'medium',\n shape: 'circle',\n bgColor: '#e8e8e8',\n dot: false,\n badgePosition: 'top-right',\n maxTextLength: 2\n})\n\nconst slots = useSlots()\nconst loadError = ref(false)\n\nconst badgeSlot = computed(() => Boolean(slots.badge))\n\nconst handleError = () => {\n loadError.value = true\n}\n\nconst displayText = computed(() => {\n if (!props.text) return ''\n if (props.text.length <= props.maxTextLength) return props.text\n return props.text.slice(0, props.maxTextLength)\n})\n\nconst sizeMap: Record<string, number> = {\n small: 32,\n medium: 48,\n large: 64,\n xlarge: 80\n}\n\nconst avatarSize = computed(() => {\n if (typeof props.size === 'number') return props.size\n return sizeMap[props.size] || 48\n})\n\nconst avatarClass = computed(() => [\n `u-avatar--${props.shape}`,\n {\n 'u-avatar--error': loadError.value\n }\n])\n\nconst avatarStyle = computed(() => {\n const style: Record<string, string> = {}\n const size = avatarSize.value\n\n style.width = `${size}px`\n style.height = `${size}px`\n\n if (props.bgColor) {\n style.backgroundColor = props.bgColor\n }\n\n if (props.color) {\n style.color = props.color\n }\n\n if (props.shape === 'square') {\n style.borderRadius = '4px'\n }\n\n return style\n})\n\nconst badgeClass = computed(() => [\n `u-avatar__badge--${props.badgePosition}`,\n {\n 'u-avatar__badge--dot': props.dot\n }\n])\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-avatar {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n box-sizing: border-box;\n background-color: $--bg-color;\n font-weight: 500;\n\n &--circle {\n border-radius: 50%;\n }\n\n &--square {\n border-radius: $--radius-sm;\n }\n\n &__image {\n width: 100%;\n height: 100%;\n }\n\n &__text {\n font-size: 16px;\n color: $--text-color-2;\n line-height: 1;\n }\n\n &__icon {\n font-size: 24px;\n color: $--text-color-3;\n }\n\n &__badge {\n position: absolute;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n font-size: 10px;\n color: $--text-color-white;\n background-color: $--color-danger;\n border-radius: 999px;\n box-sizing: border-box;\n\n &--dot {\n min-width: 8px;\n width: 8px;\n height: 8px;\n padding: 0;\n border-radius: 50%;\n }\n\n &--top-right {\n top: 0;\n right: 0;\n transform: translate(25%, -25%);\n }\n\n &--top-left {\n top: 0;\n left: 0;\n transform: translate(-25%, -25%);\n }\n\n &--bottom-right {\n bottom: 0;\n right: 0;\n transform: translate(25%, 25%);\n }\n\n &--bottom-left {\n bottom: 0;\n left: 0;\n transform: translate(-25%, 25%);\n }\n }\n}\n</style>","<template>\n <view class=\"u-empty\" :class=\"{ 'u-empty--inline': inline }\">\n <view class=\"u-empty__image\">\n <slot name=\"image\">\n <image v-if=\"image\" class=\"u-empty__image-src\" :src=\"image\" mode=\"aspectFit\" />\n <view v-else class=\"u-empty__image-default\">\n <text class=\"u-empty__icon\">📭</text>\n </view>\n </slot>\n </view>\n <view v-if=\"description || $slots.description\" class=\"u-empty__description\">\n <slot name=\"description\">{{ description }}</slot>\n </view>\n <view v-if=\"$slots.default\" class=\"u-empty__bottom\">\n <slot />\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n image?: string\n description?: string\n inline?: boolean\n}\n\nwithDefaults(defineProps<Props>(), {\n image: '',\n description: '暂无数据',\n inline: false\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: $--spacing-xl $--spacing-base;\n box-sizing: border-box;\n\n &--inline {\n display: inline-flex;\n padding: $--spacing-base;\n }\n\n &__image {\n width: 160px;\n height: 160px;\n margin-bottom: $--spacing-base;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n &__image-src {\n width: 100%;\n height: 100%;\n }\n\n &__image-default {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: $--bg-color;\n border-radius: $--radius-lg;\n }\n\n &__icon {\n font-size: 64px;\n color: $--text-color-3;\n }\n\n &__description {\n font-size: $--font-size-base;\n color: $--text-color-3;\n line-height: 1.5;\n text-align: center;\n margin-bottom: $--spacing-base;\n }\n\n &__bottom {\n margin-top: $--spacing-sm;\n }\n}\n</style>","<template>\n <view class=\"u-checkbox\" :class=\"checkboxClass\" @click=\"handleClick\">\n <view class=\"u-checkbox__icon\" :class=\"iconClass\" :style=\"iconStyle\">\n <text v-if=\"checked\" class=\"u-checkbox__check\">✓</text>\n </view>\n <view v-if=\"label || $slots.default\" class=\"u-checkbox__label\">\n <slot>{{ label }}</slot>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, inject } from 'vue'\nimport type { ComputedRef, Ref } from 'vue'\n\ninterface CheckboxGroupContext {\n modelValue: Ref<any[]>\n disabled: ComputedRef<boolean>\n max: ComputedRef<number>\n toggle: (value: any) => void\n}\n\ninterface Props {\n value?: any\n label?: string\n disabled?: boolean\n checkedColor?: string\n shape?: 'square' | 'circle'\n iconSize?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n value: '',\n label: '',\n disabled: false,\n checkedColor: '',\n shape: 'square',\n iconSize: 20\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n change: [checked: boolean]\n}>()\n\nconst group = inject<CheckboxGroupContext | null>('u-checkbox-group', null)\n\nconst checked = computed(() => {\n if (group) {\n return group.modelValue.value.includes(props.value)\n }\n return false\n})\n\nconst isDisabled = computed(() => {\n if (group) {\n return group.disabled.value || props.disabled\n }\n return props.disabled\n})\n\nconst checkboxClass = computed(() => [\n {\n 'u-checkbox--disabled': isDisabled.value,\n 'u-checkbox--checked': checked.value\n }\n])\n\nconst iconClass = computed(() => [\n `u-checkbox__icon--${props.shape}`,\n {\n 'u-checkbox__icon--checked': checked.value,\n 'u-checkbox__icon--disabled': isDisabled.value\n }\n])\n\nconst iconStyle = computed(() => {\n const style: Record<string, string> = {}\n style.width = `${props.iconSize}px`\n style.height = `${props.iconSize}px`\n\n if (checked.value && props.checkedColor) {\n style.backgroundColor = props.checkedColor\n style.borderColor = props.checkedColor\n }\n\n return style\n})\n\nconst handleClick = () => {\n if (isDisabled.value) return\n\n if (group) {\n group.toggle(props.value)\n } else {\n emit('update:modelValue', !checked.value)\n emit('change', !checked.value)\n }\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-checkbox {\n display: inline-flex;\n align-items: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n\n &--disabled {\n opacity: 0.5;\n }\n\n &__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid $--border-color;\n background-color: $--bg-color-2;\n transition: all 0.2s;\n flex-shrink: 0;\n\n &--square {\n border-radius: $--radius-sm;\n }\n\n &--circle {\n border-radius: 50%;\n }\n\n &--checked {\n background-color: $--color-primary;\n border-color: $--color-primary;\n }\n\n &--disabled {\n background-color: $--bg-color;\n border-color: $--border-color;\n }\n }\n\n &__check {\n color: $--text-color-white;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n }\n\n &__label {\n margin-left: $--spacing-sm;\n font-size: $--font-size-base;\n color: $--text-color;\n line-height: 1.5;\n }\n\n &--checked &__label {\n color: $--text-color;\n }\n\n &--disabled &__label {\n color: $--text-color-3;\n }\n}\n</style>","<template>\n <view class=\"u-checkbox-group\">\n <slot />\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, provide, ref, watch } from 'vue'\n\ninterface Props {\n modelValue?: any[]\n disabled?: boolean\n max?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: () => [],\n disabled: false,\n max: 0\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: any[]]\n change: [value: any[]]\n}>()\n\nconst innerValue = ref([...props.modelValue])\n\nwatch(() => props.modelValue, (val) => {\n innerValue.value = [...val]\n}, { deep: true })\n\nconst toggle = (value: any) => {\n const index = innerValue.value.indexOf(value)\n\n if (index > -1) {\n innerValue.value.splice(index, 1)\n } else {\n if (props.max > 0 && innerValue.value.length >= props.max) {\n return\n }\n innerValue.value.push(value)\n }\n\n emit('update:modelValue', [...innerValue.value])\n emit('change', [...innerValue.value])\n}\n\nprovide('u-checkbox-group', {\n modelValue: innerValue,\n disabled: computed(() => props.disabled),\n max: computed(() => props.max),\n toggle\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-checkbox-group {\n display: flex;\n flex-wrap: wrap;\n gap: $--spacing-base;\n}\n</style>","<template>\n <view class=\"u-radio\" :class=\"radioClass\" @click=\"handleClick\">\n <view class=\"u-radio__icon\" :class=\"iconClass\" :style=\"iconStyle\">\n <view v-if=\"checked\" class=\"u-radio__dot\" />\n </view>\n <view v-if=\"label || $slots.default\" class=\"u-radio__label\">\n <slot>{{ label }}</slot>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, inject } from 'vue'\nimport type { ComputedRef, Ref } from 'vue'\n\ninterface RadioGroupContext {\n modelValue: Ref<any>\n disabled: ComputedRef<boolean>\n select: (value: any) => void\n}\n\ninterface Props {\n value?: any\n label?: string\n disabled?: boolean\n checkedColor?: string\n iconSize?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n value: '',\n label: '',\n disabled: false,\n checkedColor: '',\n iconSize: 20\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: any]\n change: [value: any]\n}>()\n\nconst group = inject<RadioGroupContext | null>('u-radio-group', null)\n\nconst checked = computed(() => {\n if (group) {\n return group.modelValue.value === props.value\n }\n return false\n})\n\nconst isDisabled = computed(() => {\n if (group) {\n return group.disabled.value || props.disabled\n }\n return props.disabled\n})\n\nconst radioClass = computed(() => [\n {\n 'u-radio--disabled': isDisabled.value,\n 'u-radio--checked': checked.value\n }\n])\n\nconst iconClass = computed(() => [\n {\n 'u-radio__icon--checked': checked.value,\n 'u-radio__icon--disabled': isDisabled.value\n }\n])\n\nconst iconStyle = computed(() => {\n const style: Record<string, string> = {}\n style.width = `${props.iconSize}px`\n style.height = `${props.iconSize}px`\n\n if (checked.value && props.checkedColor) {\n style.borderColor = props.checkedColor\n }\n\n return style\n})\n\nconst handleClick = () => {\n if (isDisabled.value) return\n\n if (group) {\n group.select(props.value)\n } else {\n emit('update:modelValue', props.value)\n emit('change', props.value)\n }\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-radio {\n display: inline-flex;\n align-items: center;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n\n &--disabled {\n opacity: 0.5;\n }\n\n &__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid $--border-color;\n background-color: $--bg-color-2;\n border-radius: 50%;\n transition: all 0.2s;\n flex-shrink: 0;\n\n &--checked {\n border-color: $--color-primary;\n border-width: 6px;\n background-color: $--bg-color-2;\n }\n\n &--disabled {\n background-color: $--bg-color;\n border-color: $--border-color;\n }\n }\n\n &__dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background-color: $--color-primary;\n }\n\n &__label {\n margin-left: $--spacing-sm;\n font-size: $--font-size-base;\n color: $--text-color;\n line-height: 1.5;\n }\n\n &--disabled &__label {\n color: $--text-color-3;\n }\n}\n</style>","<template>\n <view class=\"u-radio-group\">\n <slot />\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, provide, ref, watch } from 'vue'\n\ninterface Props {\n modelValue?: any\n disabled?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: '',\n disabled: false\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: any]\n change: [value: any]\n}>()\n\nconst innerValue = ref(props.modelValue)\n\nwatch(() => props.modelValue, (val) => {\n innerValue.value = val\n})\n\nconst select = (value: any) => {\n if (innerValue.value === value) return\n\n innerValue.value = value\n emit('update:modelValue', value)\n emit('change', value)\n}\n\nprovide('u-radio-group', {\n modelValue: innerValue,\n disabled: computed(() => props.disabled),\n select\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-radio-group {\n display: flex;\n flex-wrap: wrap;\n gap: $--spacing-base;\n}\n</style>","<template>\n <view v-if=\"visible\" class=\"u-toast\" :class=\"toastClass\" :style=\"toastStyle\">\n <view class=\"u-toast__content\">\n <view v-if=\"type === 'loading'\" class=\"u-toast__loading\">\n <view class=\"u-toast__loading-icon\" />\n </view>\n <text v-else-if=\"icon\" class=\"u-toast__icon\">{{ icon }}</text>\n <text v-if=\"message\" class=\"u-toast__text\">{{ message }}</text>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onUnmounted } from 'vue'\n\ntype ToastType = 'text' | 'loading' | 'success' | 'fail' | 'info'\n\ninterface Props {\n message?: string\n type?: ToastType\n duration?: number\n position?: 'top' | 'middle' | 'bottom'\n icon?: string\n forbidClick?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n message: '',\n type: 'text',\n duration: 2000,\n position: 'middle',\n icon: '',\n forbidClick: false\n})\n\nconst visible = ref(false)\nlet timer: ReturnType<typeof setTimeout> | null = null\n\nconst icons: Record<string, string> = {\n success: '✓',\n fail: '✗',\n info: 'ℹ'\n}\n\nconst displayIcon = computed(() => {\n if (props.icon) return props.icon\n if (props.type === 'loading') return ''\n return icons[props.type] || ''\n})\n\nconst toastClass = computed(() => [\n `u-toast--${props.position}`,\n {\n 'u-toast--forbid-click': props.forbidClick,\n 'u-toast--loading': props.type === 'loading'\n }\n])\n\nconst toastStyle = computed(() => ({\n zIndex: 1000\n}))\n\nconst show = () => {\n visible.value = true\n\n if (props.type !== 'loading' && props.duration > 0) {\n timer = setTimeout(() => {\n hide()\n }, props.duration)\n }\n}\n\nconst hide = () => {\n visible.value = false\n if (timer) {\n clearTimeout(timer)\n timer = null\n }\n}\n\nonUnmounted(() => {\n if (timer) {\n clearTimeout(timer)\n }\n})\n\ndefineExpose({\n show,\n hide\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-toast {\n position: fixed;\n left: 50%;\n transform: translateX(-50%);\n z-index: 1000;\n pointer-events: none;\n\n &--top {\n top: 50px;\n }\n\n &--middle {\n top: 50%;\n transform: translate(-50%, -50%);\n }\n\n &--bottom {\n bottom: 50px;\n }\n\n &--forbid-click {\n pointer-events: auto;\n width: 100vw;\n height: 100vh;\n left: 0;\n top: 0;\n transform: none;\n background-color: transparent;\n }\n\n &__content {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: $--spacing-base $--spacing-lg;\n background-color: rgba(0, 0, 0, 0.7);\n border-radius: $--radius-lg;\n min-width: 100px;\n max-width: 280px;\n }\n\n &--loading &__content {\n min-width: 80px;\n min-height: 80px;\n padding: $--spacing-lg;\n }\n\n &__icon {\n font-size: 32px;\n color: $--text-color-white;\n margin-bottom: $--spacing-sm;\n }\n\n &__loading {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: $--spacing-sm;\n }\n\n &__loading-icon {\n width: 24px;\n height: 24px;\n border: 2px solid rgba(255, 255, 255, 0.3);\n border-top-color: $--text-color-white;\n border-radius: 50%;\n animation: u-toast-loading 0.8s linear infinite;\n }\n\n @keyframes u-toast-loading {\n to {\n transform: rotate(360deg);\n }\n }\n\n &__text {\n font-size: $--font-size-base;\n color: $--text-color-white;\n line-height: 1.4;\n text-align: center;\n }\n}\n</style>","<template>\n <view class=\"u-popup\" :class=\"popupClass\" @touchmove.stop.prevent>\n <view\n v-if=\"visible\"\n class=\"u-popup__overlay\"\n :class=\"{ 'u-popup__overlay--visible': overlayVisible }\"\n @click=\"handleOverlayClick\"\n />\n <view v-if=\"visible\" class=\"u-popup__content\" :class=\"contentClass\" :style=\"contentStyle\">\n <view v-if=\"closeable\" class=\"u-popup__close\" @click=\"handleClose\">\n <text class=\"u-popup__close-icon\">✕</text>\n </view>\n <slot />\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue'\n\ntype PopupPosition = 'top' | 'bottom' | 'left' | 'right' | 'center'\n\ninterface Props {\n visible?: boolean\n position?: PopupPosition\n overlay?: boolean\n overlayClass?: string\n closeable?: boolean\n closeOnClickOverlay?: boolean\n safeArea?: boolean\n round?: boolean\n duration?: number\n zIndex?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n visible: false,\n position: 'bottom',\n overlay: true,\n overlayClass: '',\n closeable: false,\n closeOnClickOverlay: true,\n safeArea: true,\n round: false,\n duration: 300,\n zIndex: 1000\n})\n\nconst emit = defineEmits<{\n 'update:visible': [value: boolean]\n open: []\n close: []\n}>()\n\nconst overlayVisible = ref(false)\nconst contentVisible = ref(false)\n\nlet timer: ReturnType<typeof setTimeout> | null = null\n\nconst popupClass = computed(() => [\n {\n 'u-popup--safe-area': props.safeArea\n }\n])\n\nconst contentClass = computed(() => [\n `u-popup__content--${props.position}`,\n {\n 'u-popup__content--round': props.round,\n 'u-popup__content--visible': contentVisible.value\n }\n])\n\nconst contentStyle = computed(() => {\n const style: Record<string, string> = {}\n const positions: Record<string, string> = {\n top: 'top: 0; left: 0; right: 0;',\n bottom: 'bottom: 0; left: 0; right: 0;',\n left: 'left: 0; top: 0; bottom: 0;',\n right: 'right: 0; top: 0; bottom: 0;',\n center: 'top: 50%; left: 50%;'\n }\n\n style.zIndex = String(props.zIndex + 1)\n\n if (props.position === 'center') {\n style.transitionDuration = `${props.duration}ms`\n }\n\n return style\n})\n\nwatch(() => props.visible, (val) => {\n if (val) {\n overlayVisible.value = true\n timer = setTimeout(() => {\n contentVisible.value = true\n emit('open')\n }, 50)\n } else {\n contentVisible.value = false\n timer = setTimeout(() => {\n overlayVisible.value = false\n emit('close')\n }, props.duration)\n }\n})\n\nconst handleOverlayClick = () => {\n if (props.closeOnClickOverlay) {\n handleClose()\n }\n}\n\nconst handleClose = () => {\n emit('update:visible', false)\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-popup {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1000;\n pointer-events: none;\n\n &--safe-area {\n padding-bottom: constant(safe-area-inset-bottom);\n padding-bottom: env(safe-area-inset-bottom);\n /* 鴻蒙兼容 */\n padding-bottom: var(--safe-area-inset-bottom, env(safe-area-inset-bottom));\n }\n\n &__overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.7);\n opacity: 0;\n transition: opacity 0.3s;\n pointer-events: auto;\n\n &--visible {\n opacity: 1;\n }\n }\n\n &__content {\n position: absolute;\n background-color: $--bg-color-2;\n transition: transform 0.3s ease-out;\n pointer-events: auto;\n overflow: hidden;\n\n &--top {\n transform: translateY(-100%);\n\n &--visible {\n transform: translateY(0);\n }\n\n &--round {\n border-radius: 0 0 $--radius-lg $--radius-lg;\n }\n }\n\n &--bottom {\n transform: translateY(100%);\n\n &--visible {\n transform: translateY(0);\n }\n\n &--round {\n border-radius: $--radius-lg $--radius-lg 0 0;\n }\n }\n\n &--left {\n width: 80%;\n height: 100%;\n transform: translateX(-100%);\n\n &--visible {\n transform: translateX(0);\n }\n\n &--round {\n border-radius: 0 $--radius-lg $--radius-lg 0;\n }\n }\n\n &--right {\n width: 80%;\n height: 100%;\n transform: translateX(100%);\n\n &--visible {\n transform: translateX(0);\n }\n\n &--round {\n border-radius: $--radius-lg 0 0 $--radius-lg;\n }\n }\n\n &--center {\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.9);\n opacity: 0;\n min-width: 280px;\n border-radius: $--radius-lg;\n\n &--visible {\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n }\n\n &--round {\n border-radius: $--radius-lg;\n }\n }\n }\n\n &__close {\n position: absolute;\n top: $--spacing-base;\n right: $--spacing-base;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1;\n\n &-icon {\n font-size: 18px;\n color: $--text-color-3;\n }\n }\n}\n</style>","<template>\n <view class=\"u-code-input\">\n <view class=\"u-code-input__wrapper\">\n <view\n v-for=\"i in length\"\n :key=\"i\"\n class=\"u-code-input__item\"\n :class=\"itemClass(i)\"\n :style=\"itemStyle\"\n >\n <text v-if=\"values[i - 1] && !password\" class=\"u-code-input__char\">{{ values[i - 1] }}</text>\n <view v-else-if=\"values[i - 1] && password\" class=\"u-code-input__dot\" />\n <view v-else class=\"u-code-input__placeholder\">{{ placeholderChar }}</view>\n <view v-if=\"focus && i - 1 === currentIndex\" class=\"u-code-input__cursor\" />\n </view>\n </view>\n <input\n class=\"u-code-input__input\"\n type=\"text\"\n :value=\"innerValue\"\n :maxlength=\"length\"\n :disabled=\"disabled\"\n :focus=\"focus\"\n :password=\"password\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n />\n </view>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue'\n\ninterface Props {\n value?: string\n length?: number\n size?: number\n gap?: number\n plain?: boolean\n disabled?: boolean\n password?: boolean\n focus?: boolean\n borderColor?: string\n activeBorderColor?: string\n placeholderChar?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n value: '',\n length: 6,\n size: 40,\n gap: 10,\n plain: false,\n disabled: false,\n password: false,\n focus: false,\n borderColor: '#dcdee0',\n activeBorderColor: '#1989fa',\n placeholderChar: '·'\n})\n\nconst emit = defineEmits<{\n 'update:value': [value: string]\n 'update:modelValue': [value: string]\n input: [value: string]\n complete: [value: string]\n focus: []\n blur: []\n}>()\n\nconst innerValue = ref(props.value)\n\nwatch(() => props.value, (val) => {\n innerValue.value = val\n})\n\nconst values = computed(() => {\n const chars = innerValue.value.split('')\n return chars\n})\n\nconst currentIndex = computed(() => {\n return Math.min(values.value.length, props.length - 1)\n})\n\nconst itemStyle = computed(() => {\n return {\n width: `${props.size}px`,\n height: `${props.size}px`,\n marginRight: `${props.gap}px`\n }\n})\n\nconst itemClass = (i: number) => {\n const classes: string[] = []\n\n if (props.plain) {\n classes.push('u-code-input__item--plain')\n }\n\n if (!props.plain) {\n classes.push('u-code-input__item--filled')\n }\n\n if (values.value[i - 1]) {\n classes.push('u-code-input__item--active')\n }\n\n if (props.focus && i - 1 === currentIndex.value) {\n classes.push('u-code-input__item--focused')\n }\n\n if (props.disabled) {\n classes.push('u-code-input__item--disabled')\n }\n\n return classes\n}\n\nconst handleInput = (e: any) => {\n const val = e.detail.value.replace(/\\D/g, '').slice(0, props.length)\n innerValue.value = val\n\n emit('update:value', val)\n emit('update:modelValue', val)\n emit('input', val)\n\n if (val.length === props.length) {\n emit('complete', val)\n }\n}\n\nconst handleFocus = () => {\n emit('focus')\n}\n\nconst handleBlur = () => {\n emit('blur')\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.u-code-input {\n position: relative;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n\n &__wrapper {\n display: flex;\n flex-direction: row;\n }\n\n &__item {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 20px;\n font-weight: 500;\n line-height: 1;\n position: relative;\n flex-shrink: 0;\n\n &:last-child {\n margin-right: 0 !important;\n }\n\n &--filled {\n background-color: $--bg-color;\n border: 1px solid $--border-color;\n border-radius: $--radius-sm;\n }\n\n &--plain {\n border-bottom: 2px solid $--border-color;\n background-color: transparent;\n }\n\n &--active {\n border-color: $--color-primary;\n }\n\n &--focused {\n border-color: $--color-primary;\n }\n\n &--disabled {\n opacity: 0.5;\n }\n }\n\n &__char {\n color: $--text-color;\n }\n\n &__dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background-color: $--text-color;\n }\n\n &__placeholder {\n color: $--text-color-3;\n font-size: 24px;\n }\n\n &__cursor {\n position: absolute;\n left: 0;\n top: 10%;\n height: 80%;\n width: 2px;\n background-color: $--color-primary;\n animation: u-code-input-cursor 1s infinite;\n }\n\n @keyframes u-code-input-cursor {\n 0%, 50% {\n opacity: 1;\n }\n 51%, 100% {\n opacity: 0;\n }\n }\n\n &__input {\n position: absolute;\n top: 0;\n left: 0;\n width: 200%;\n height: 100%;\n opacity: 0;\n z-index: 2;\n }\n}\n</style>","<template>\r\n <view v-if=\"!loading\" class=\"u-skeleton__content\">\r\n <slot />\r\n </view>\r\n <view v-else class=\"u-skeleton\" :class=\"{ 'u-skeleton--animate': animate }\">\r\n <!-- 头像骨架 -->\r\n <view\r\n v-if=\"avatar\"\r\n class=\"u-skeleton__avatar\"\r\n :class=\"`u-skeleton__avatar--${avatarShape}`\"\r\n :style=\"avatarStyle\"\r\n />\r\n <!-- 内容区域 -->\r\n <view class=\"u-skeleton__content\">\r\n <!-- 标题骨架 -->\r\n <view\r\n v-if=\"title\"\r\n class=\"u-skeleton__title\"\r\n :style=\"titleStyle\"\r\n />\r\n <!-- 段落骨架 -->\r\n <view class=\"u-skeleton__paragraphs\">\r\n <view\r\n v-for=\"(row, index) in rowList\"\r\n :key=\"index\"\r\n class=\"u-skeleton__paragraph\"\r\n :style=\"getRowStyle(index)\"\r\n />\r\n </view>\r\n </view>\r\n </view>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\n\r\ntype AvatarShape = 'circle' | 'square'\r\ntype TitleWidth = number | string\r\n\r\ninterface Props {\r\n loading?: boolean\r\n animate?: boolean\r\n avatar?: boolean\r\n avatarSize?: number | string\r\n avatarShape?: AvatarShape\r\n title?: boolean\r\n titleWidth?: TitleWidth\r\n row?: number\r\n rowWidth?: number | string | (number | string)[]\r\n rowHeight?: number | string | (number | string)[]\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n loading: true,\r\n animate: true,\r\n avatar: false,\r\n avatarSize: 40,\r\n avatarShape: 'circle',\r\n title: true,\r\n titleWidth: '40%',\r\n row: 3,\r\n rowWidth: '100%',\r\n rowHeight: 16\r\n})\r\n\r\nconst avatarStyle = computed(() => {\r\n const size = typeof props.avatarSize === 'number'\r\n ? `${props.avatarSize}px`\r\n : props.avatarSize\r\n return {\r\n width: size,\r\n height: size\r\n }\r\n})\r\n\r\nconst titleStyle = computed(() => {\r\n const width = typeof props.titleWidth === 'number'\r\n ? `${props.titleWidth}px`\r\n : props.titleWidth\r\n return { width }\r\n})\r\n\r\nconst rowList = computed(() => {\r\n return Array.from({ length: props.row }, (_, i) => i)\r\n})\r\n\r\nconst getRowStyle = (index: number) => {\r\n const style: Record<string, string> = {}\r\n\r\n // 处理宽度\r\n if (Array.isArray(props.rowWidth)) {\r\n const width = props.rowWidth[index]\r\n if (width !== undefined) {\r\n style.width = typeof width === 'number' ? `${width}px` : width\r\n }\r\n } else if (index === props.row - 1 && props.rowWidth === '100%') {\r\n // 最后一行默认 60% 宽度(如果是 100% 才处理)\r\n style.width = '60%'\r\n } else {\r\n style.width = typeof props.rowWidth === 'number'\r\n ? `${props.rowWidth}px`\r\n : props.rowWidth\r\n }\r\n\r\n // 处理高度\r\n if (Array.isArray(props.rowHeight)) {\r\n const height = props.rowHeight[index]\r\n if (height !== undefined) {\r\n style.height = typeof height === 'number' ? `${height}px` : height\r\n }\r\n } else {\r\n style.height = typeof props.rowHeight === 'number'\r\n ? `${props.rowHeight}px`\r\n : props.rowHeight\r\n }\r\n\r\n return style\r\n}\r\n</script>\r\n\r\n<script lang=\"ts\">\r\nexport default {\r\n options: {\r\n virtualHost: true,\r\n styleIsolation: 'shared'\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.u-skeleton {\r\n display: flex;\r\n gap: $--spacing-md;\r\n\r\n &--animate {\r\n .u-skeleton__avatar,\r\n .u-skeleton__title,\r\n .u-skeleton__paragraph {\r\n animation: skeleton-blink 1.2s ease-in-out infinite;\r\n }\r\n }\r\n\r\n &__avatar {\r\n flex-shrink: 0;\r\n background-color: $--bg-color-3;\r\n border-radius: 50%;\r\n\r\n &--circle {\r\n border-radius: 50%;\r\n }\r\n\r\n &--square {\r\n border-radius: $--radius-sm;\r\n }\r\n }\r\n\r\n &__content {\r\n flex: 1;\r\n min-width: 0;\r\n }\r\n\r\n &__title {\r\n height: 20px;\r\n margin-bottom: $--spacing-md;\r\n background-color: $--bg-color-3;\r\n border-radius: $--radius-sm;\r\n }\r\n\r\n &__paragraphs {\r\n display: flex;\r\n flex-direction: column;\r\n gap: $--spacing-sm;\r\n }\r\n\r\n &__paragraph {\r\n background-color: $--bg-color-3;\r\n border-radius: $--radius-sm;\r\n }\r\n}\r\n\r\n@keyframes skeleton-blink {\r\n 0% {\r\n opacity: 1;\r\n }\r\n 50% {\r\n opacity: 0.5;\r\n }\r\n 100% {\r\n opacity: 1;\r\n }\r\n}\r\n</style>","<template>\r\n <view\r\n v-show=\"visible\"\r\n class=\"u-transition\"\r\n :class=\"transitionClass\"\r\n :style=\"transitionStyle\"\r\n @transitionend=\"onTransitionEnd\"\r\n >\r\n <slot />\r\n </view>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\n\r\ntype TransitionMode =\r\n | 'fade'\r\n | 'fade-up'\r\n | 'fade-down'\r\n | 'fade-left'\r\n | 'fade-right'\r\n | 'slide-up'\r\n | 'slide-down'\r\n | 'slide-left'\r\n | 'slide-right'\r\n | 'zoom'\r\n | 'zoom-fade'\r\n\r\ninterface Props {\r\n show?: boolean\r\n mode?: TransitionMode\r\n duration?: number\r\n delay?: number\r\n customStyle?: Record<string, string | number>\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n show: false,\r\n mode: 'fade',\r\n duration: 300,\r\n delay: 0\r\n})\r\n\r\nconst emit = defineEmits<{\r\n (e: 'after-enter'): void\r\n (e: 'after-leave'): void\r\n}>()\r\n\r\nconst visible = ref(false)\r\nconst animationPhase = ref<'enter' | 'leave'>('enter')\r\n\r\n// 监听 show 变化\r\nwatch(\r\n () => props.show,\r\n (val) => {\r\n if (val) {\r\n visible.value = true\r\n animationPhase.value = 'enter'\r\n } else {\r\n animationPhase.value = 'leave'\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\nconst transitionClass = computed(() => {\r\n const classes: string[] = []\r\n\r\n if (animationPhase.value === 'enter') {\r\n classes.push(`u-transition--${props.mode}-enter`)\r\n } else {\r\n classes.push(`u-transition--${props.mode}-leave`)\r\n }\r\n\r\n return classes\r\n})\r\n\r\nconst transitionStyle = computed(() => {\r\n const style: Record<string, string | number> = {\r\n transitionDuration: `${props.duration}ms`,\r\n transitionDelay: `${props.delay}ms`,\r\n transitionProperty: 'opacity, transform',\r\n transitionTimingFunction: 'ease-out'\r\n }\r\n\r\n if (props.customStyle) {\r\n Object.assign(style, props.customStyle)\r\n }\r\n\r\n return style\r\n})\r\n\r\nconst onTransitionEnd = () => {\r\n if (animationPhase.value === 'leave') {\r\n visible.value = false\r\n emit('after-leave')\r\n } else {\r\n emit('after-enter')\r\n }\r\n}\r\n</script>\r\n\r\n<script lang=\"ts\">\r\nexport default {\r\n options: {\r\n virtualHost: true,\r\n styleIsolation: 'shared'\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.u-transition {\r\n // 基础状态\r\n opacity: 1;\r\n transform: none;\r\n\r\n // 淡入淡出\r\n &--fade-enter {\r\n opacity: 0;\r\n }\r\n &--fade-leave {\r\n opacity: 0;\r\n }\r\n\r\n // 上滑淡入\r\n &--fade-up-enter {\r\n opacity: 0;\r\n transform: translateY(100%);\r\n }\r\n &--fade-up-leave {\r\n opacity: 0;\r\n transform: translateY(-100%);\r\n }\r\n\r\n // 下滑淡入\r\n &--fade-down-enter {\r\n opacity: 0;\r\n transform: translateY(-100%);\r\n }\r\n &--fade-down-leave {\r\n opacity: 0;\r\n transform: translateY(100%);\r\n }\r\n\r\n // 左滑淡入\r\n &--fade-left-enter {\r\n opacity: 0;\r\n transform: translateX(100%);\r\n }\r\n &--fade-left-leave {\r\n opacity: 0;\r\n transform: translateX(-100%);\r\n }\r\n\r\n // 右滑淡入\r\n &--fade-right-enter {\r\n opacity: 0;\r\n transform: translateX(-100%);\r\n }\r\n &--fade-right-leave {\r\n opacity: 0;\r\n transform: translateX(100%);\r\n }\r\n\r\n // 上滑进入\r\n &--slide-up-enter {\r\n transform: translateY(100%);\r\n }\r\n &--slide-up-leave {\r\n transform: translateY(-100%);\r\n }\r\n\r\n // 下滑进入\r\n &--slide-down-enter {\r\n transform: translateY(-100%);\r\n }\r\n &--slide-down-leave {\r\n transform: translateY(100%);\r\n }\r\n\r\n // 左滑进入\r\n &--slide-left-enter {\r\n transform: translateX(100%);\r\n }\r\n &--slide-left-leave {\r\n transform: translateX(-100%);\r\n }\r\n\r\n // 右滑进入\r\n &--slide-right-enter {\r\n transform: translateX(-100%);\r\n }\r\n &--slide-right-leave {\r\n transform: translateX(100%);\r\n }\r\n\r\n // 缩放\r\n &--zoom-enter {\r\n transform: scale(0);\r\n }\r\n &--zoom-leave {\r\n transform: scale(0);\r\n }\r\n\r\n // 缩放淡入\r\n &--zoom-fade-enter {\r\n opacity: 0;\r\n transform: scale(0.5);\r\n }\r\n &--zoom-fade-leave {\r\n opacity: 0;\r\n transform: scale(0.5);\r\n }\r\n}\r\n</style>","<template>\r\n <text\r\n class=\"u-link\"\r\n :class=\"linkClass\"\r\n :style=\"linkStyle\"\r\n @click=\"handleClick\"\r\n >\r\n <slot>{{ text }}</slot>\r\n </text>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\n\r\ntype LinkType = 'default' | 'primary' | 'success' | 'warning' | 'danger'\r\n\r\ninterface Props {\r\n text?: string\r\n type?: LinkType\r\n color?: string\r\n underline?: boolean\r\n href?: string\r\n disabled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n text: '',\r\n type: 'default',\r\n underline: false,\r\n disabled: false\r\n})\r\n\r\nconst emit = defineEmits<{\r\n (e: 'click'): void\r\n}>()\r\n\r\nconst linkClass = computed(() => [\r\n `u-link--${props.type}`,\r\n {\r\n 'u-link--underline': props.underline,\r\n 'u-link--disabled': props.disabled\r\n }\r\n])\r\n\r\nconst linkStyle = computed(() => {\r\n const style: Record<string, string> = {}\r\n if (props.color) {\r\n style.color = props.color\r\n }\r\n return style\r\n})\r\n\r\nconst handleClick = () => {\r\n if (props.disabled) return\r\n\r\n if (props.href) {\r\n // 在新窗口打开链接\r\n // uni-app 环境下使用特定方法\r\n // #ifdef H5\r\n window.open(props.href, '_blank')\r\n // #endif\r\n }\r\n\r\n emit('click')\r\n}\r\n</script>\r\n\r\n<script lang=\"ts\">\r\nexport default {\r\n options: {\r\n virtualHost: true,\r\n styleIsolation: 'shared'\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.u-link {\r\n display: inline;\r\n color: $--text-color-2;\r\n font-size: inherit;\r\n word-break: break-all;\r\n\r\n &--default {\r\n color: $--text-color-2;\r\n }\r\n\r\n &--primary {\r\n color: $--color-primary;\r\n }\r\n\r\n &--success {\r\n color: $--color-success;\r\n }\r\n\r\n &--warning {\r\n color: $--color-warning;\r\n }\r\n\r\n &--danger {\r\n color: $--color-danger;\r\n }\r\n\r\n &--underline {\r\n text-decoration: underline;\r\n }\r\n\r\n &--disabled {\r\n color: $--text-color-3;\r\n opacity: 0.5;\r\n }\r\n}\r\n</style>","<template>\r\n <view class=\"u-read-more\">\r\n <view\r\n class=\"u-read-more__content\"\r\n :style=\"contentStyle\"\r\n >\r\n <slot />\r\n </view>\r\n <view\r\n v-if=\"showToggle\"\r\n class=\"u-read-more__toggle\"\r\n @click=\"handleToggle\"\r\n >\r\n <text class=\"u-read-more__toggle-text\">{{ toggleText }}</text>\r\n <text class=\"u-read-more__toggle-icon\">{{ expanded ? '↑' : '↓' }}</text>\r\n </view>\r\n </view>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\n\r\ninterface Props {\r\n maxLength?: number\r\n rows?: number\r\n expandText?: string\r\n collapseText?: string\r\n autoCollapse?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n maxLength: 200,\r\n rows: 3,\r\n expandText: '展开',\r\n collapseText: '收起',\r\n autoCollapse: false\r\n})\r\n\r\nconst emit = defineEmits<{\r\n (e: 'expand'): void\r\n (e: 'collapse'): void\r\n}>()\r\n\r\nconst expanded = ref(false)\r\nconst showToggle = ref(true)\r\n\r\n// 内容区域样式\r\nconst contentStyle = computed(() => {\r\n if (expanded.value) {\r\n return {}\r\n }\r\n // 使用 line-clamp 限制行数\r\n return {\r\n display: '-webkit-box',\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n webkitLineClamp: String(props.rows),\r\n webkitBoxOrient: 'vertical'\r\n }\r\n})\r\n\r\n// 切换按钮文字\r\nconst toggleText = computed(() => {\r\n return expanded.value ? props.collapseText : props.expandText\r\n})\r\n\r\n// 切换展开/收起\r\nconst handleToggle = () => {\r\n expanded.value = !expanded.value\r\n\r\n if (expanded.value) {\r\n emit('expand')\r\n } else {\r\n emit('collapse')\r\n }\r\n}\r\n</script>\r\n\r\n<script lang=\"ts\">\r\nexport default {\r\n options: {\r\n virtualHost: true,\r\n styleIsolation: 'shared'\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.u-read-more {\r\n &__content {\r\n font-size: $--font-size-md;\r\n color: $--text-color;\r\n line-height: 1.6;\r\n word-break: break-all;\r\n }\r\n\r\n &__toggle {\r\n display: inline-flex;\r\n align-items: center;\r\n margin-top: $--spacing-sm;\r\n color: $--color-primary;\r\n font-size: $--font-size-md;\r\n\r\n &:active {\r\n opacity: 0.7;\r\n }\r\n }\r\n\r\n &__toggle-text {\r\n margin-right: $--spacing-xs;\r\n }\r\n\r\n &__toggle-icon {\r\n font-size: $--font-size-sm;\r\n }\r\n}\r\n</style>","<template>\n <view class=\"u-tabbar\">\n <!-- 导航栏背景 -->\n <view class=\"u-tabbar__nav-wrap\">\n <!-- 左侧Tab按钮 -->\n <view\n class=\"u-tabbar__tab-btn\"\n :class=\"{ 'u-tabbar__tab-btn--active': modelValue === leftTab.value }\"\n @click=\"switchTab(leftTab.value)\"\n >\n <text class=\"u-tabbar__tab-icon\">{{ leftTab.icon }}</text>\n <text class=\"u-tabbar__tab-text\">{{ leftTab.label }}</text>\n </view>\n\n <!-- 中间占位 + 凸起按钮 -->\n <view class=\"u-tabbar__center\">\n <view\n class=\"u-tabbar__center-btn\"\n :class=\"{ 'u-tabbar__center-btn--active': modelValue === centerTab.value }\"\n @click=\"switchTab(centerTab.value)\"\n >\n <text class=\"u-tabbar__center-brand\">{{ centerBrand }}</text>\n <text class=\"u-tabbar__center-text\">{{ centerLabel }}</text>\n </view>\n </view>\n\n <!-- 右侧Tab按钮 -->\n <view\n class=\"u-tabbar__tab-btn\"\n :class=\"{ 'u-tabbar__tab-btn--active': modelValue === rightTab.value }\"\n @click=\"switchTab(rightTab.value)\"\n >\n <text class=\"u-tabbar__tab-icon\">{{ rightTab.icon }}</text>\n <text class=\"u-tabbar__tab-text\">{{ rightTab.label }}</text>\n </view>\n </view>\n </view>\n</template>\n\n<script setup lang=\"ts\">\ninterface TabItem {\n label: string\n icon: string\n value: string\n}\n\ninterface Props {\n modelValue?: string\n leftTab?: TabItem\n centerTab?: TabItem\n rightTab?: TabItem\n centerBrand?: string\n centerLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: 'home',\n leftTab: () => ({ label: '首页', icon: '⌂', value: 'home' }),\n centerTab: () => ({ label: '图域', icon: 'TU', value: 'center' }),\n rightTab: () => ({ label: '我的', icon: '◉', value: 'mine' }),\n centerBrand: 'TU',\n centerLabel: '图域'\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n 'tab-change': [value: string]\n}>()\n\nconst switchTab = (tab: string) => {\n emit('update:modelValue', tab)\n emit('tab-change', tab)\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n styleIsolation: 'shared'\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n// 薄荷主题色\n$--mint-1: #12b6af;\n$--mint-2: #9fe4dd;\n$--ink: #1b4d4a;\n$--paper: #ffffff;\n\n.u-tabbar {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n width: 100%;\n}\n\n// 导航栏容器 - 胶囊形状\n.u-tabbar__nav-wrap {\n position: absolute;\n left: 14px;\n right: 14px;\n bottom: calc(10px + env(safe-area-inset-bottom));\n /* 鴻蒙兼容 */\n bottom: calc(10px + var(--safe-area-inset-bottom, env(safe-area-inset-bottom)));\n z-index: 5;\n height: 56px;\n border-radius: 28px;\n background: linear-gradient(90deg, $--mint-1 0%, $--mint-2 100%);\n box-shadow: 0 10px 24px rgba(7, 114, 108, 0.3);\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 8px;\n box-sizing: border-box;\n}\n\n// Tab按钮\n.u-tabbar__tab-btn {\n flex: 1;\n height: 40px;\n border-radius: 20px;\n background: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n font-size: 14px;\n transition: all 200ms ease;\n white-space: nowrap;\n overflow: hidden;\n min-width: 0;\n\n &--active {\n background: $--paper;\n color: #0c958e;\n box-shadow: inset 0 0 0 1px rgba(17, 135, 128, 0.14);\n }\n}\n\n.u-tabbar__tab-icon {\n font-size: 16px;\n font-weight: 700;\n color: rgba(255, 255, 255, 0.9);\n flex-shrink: 0;\n}\n\n.u-tabbar__tab-btn--active .u-tabbar__tab-icon {\n color: #0c958e;\n}\n\n.u-tabbar__tab-text {\n font-weight: 600;\n color: rgba(255, 255, 255, 0.9);\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.u-tabbar__tab-btn--active .u-tabbar__tab-text {\n color: #0c958e;\n}\n\n// 中间区域 - 占位\n.u-tabbar__center {\n position: relative;\n width: 72px;\n height: 56px;\n flex-shrink: 0;\n}\n\n// 中间凸起按钮\n.u-tabbar__center-btn {\n position: absolute;\n left: 50%;\n top: -22px;\n transform: translateX(-50%);\n width: 72px;\n height: 72px;\n border-radius: 50%;\n border: 2px solid #dff7f4;\n background: linear-gradient(180deg, #65d8d1 0%, #21b5ae 100%);\n color: #fff;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 1px;\n box-shadow: 0 8px 20px rgba(8, 112, 106, 0.3);\n transition: all 200ms ease;\n\n &:active {\n transform: translateX(-50%) scale(0.95);\n }\n\n &--active {\n background: $--paper;\n border-color: $--mint-1;\n\n .u-tabbar__center-brand,\n .u-tabbar__center-text {\n color: $--mint-1;\n }\n }\n}\n\n.u-tabbar__center-brand {\n font-size: 22px;\n line-height: 1;\n font-weight: 700;\n color: #fff;\n}\n\n.u-tabbar__center-text {\n font-size: 12px;\n letter-spacing: 0.5px;\n color: #fff;\n}\n</style>"],"names":["__default__","_createElementBlock","_openBlock","_hoisted_2","_createElementVNode","_hoisted_3","_hoisted_4","_toDisplayString","_hoisted_5","_renderSlot","$slots","_hoisted_1","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_normalizeClass","_normalizeStyle","_Fragment","_renderList","_createBlock","_createVNode","nextValue","list","date","grid","_hoisted_11","tick","_withModifiers","group","icons"],"mappings":"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"}
|