|
@@ -0,0 +1,140 @@
|
|
|
|
|
+<template>
|
|
|
|
|
+ <div :style="getProps.mainStyle">
|
|
|
|
|
+ <div class="w-full flex items-center justify-between">
|
|
|
|
|
+ <span>{{ options?.[0] }}</span>
|
|
|
|
|
+ <EpArrowDownBold v-if="showArrow" size="14px" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div
|
|
|
|
|
+ v-show="showList"
|
|
|
|
|
+ class="absolute mt-10px left-0 top-full bg-white"
|
|
|
|
|
+ :style="getProps.mainStyle"
|
|
|
|
|
+ style="padding: 0; width: 100%; height: auto"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div
|
|
|
|
|
+ class="trucate h-24px leading-24px"
|
|
|
|
|
+ v-for="(item, index) in options"
|
|
|
|
|
+ :key="item"
|
|
|
|
|
+ :style="index === 0 ? getProps.selectedStyle : ''"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{ item }}
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+</template>
|
|
|
|
|
+
|
|
|
|
|
+<script setup lang="ts">
|
|
|
|
|
+import { computed, CSSProperties, ref } from 'vue'
|
|
|
|
|
+import { EpArrowDownBold } from 'vue-icons-plus/ep'
|
|
|
|
|
+import defaultStyle from './style.json'
|
|
|
|
|
+
|
|
|
|
|
+const props = defineProps<{
|
|
|
|
|
+ width: number
|
|
|
|
|
+ height: number
|
|
|
|
|
+ styles: any
|
|
|
|
|
+ state?: string
|
|
|
|
|
+ showArrow?: boolean
|
|
|
|
|
+ options: string[]
|
|
|
|
|
+}>()
|
|
|
|
|
+
|
|
|
|
|
+const showList = ref(false)
|
|
|
|
|
+
|
|
|
|
|
+const getProps = computed((): Record<string, CSSProperties> => {
|
|
|
|
|
+ const styles = props.styles
|
|
|
|
|
+ let mainStyle = styles.find((item) => item.state === props.state && item.part.name === 'main')
|
|
|
|
|
+ let selectedStyle = styles.find((item) => item.part.name === 'selected')
|
|
|
|
|
+ let scrollbarStyle = styles.find((item) => item.part.name === 'scrollbar')
|
|
|
|
|
+
|
|
|
|
|
+ // 从默认样式获取样式
|
|
|
|
|
+ if (!mainStyle && props.state) {
|
|
|
|
|
+ mainStyle = defaultStyle.part
|
|
|
|
|
+ ?.find((item) => item.partName === 'main')
|
|
|
|
|
+ ?.state.find((item) => item.state === props.state)?.style
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!selectedStyle && props.state) {
|
|
|
|
|
+ selectedStyle = defaultStyle.part
|
|
|
|
|
+ ?.find((item) => item.partName === 'selected')
|
|
|
|
|
+ ?.state.find((item) => item.state === 'checked')?.style
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!scrollbarStyle && props.state) {
|
|
|
|
|
+ scrollbarStyle = defaultStyle.part
|
|
|
|
|
+ ?.find((item) => item.partName === 'scrollbar')
|
|
|
|
|
+ ?.state.find((item) => item.state === 'default')?.style
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return {
|
|
|
|
|
+ mainStyle: {
|
|
|
|
|
+ width: `${props.width}px`,
|
|
|
|
|
+ height: `${props.height}px`,
|
|
|
|
|
+
|
|
|
|
|
+ fontSize: `${mainStyle?.text.size}px`,
|
|
|
|
|
+ color: mainStyle?.text?.color,
|
|
|
|
|
+ fontWeight: mainStyle?.text?.weight,
|
|
|
|
|
+ boxSizing: 'border-box',
|
|
|
|
|
+ background: mainStyle?.background.color,
|
|
|
|
|
+
|
|
|
|
|
+ // 边框
|
|
|
|
|
+ borderRadius: `${mainStyle?.border.radius}px`,
|
|
|
|
|
+ borderStyle: 'solid',
|
|
|
|
|
+ borderColor: 'transparent',
|
|
|
|
|
+ borderWidth: `${mainStyle?.border.width}px`,
|
|
|
|
|
+ borderTopColor:
|
|
|
|
|
+ mainStyle?.border?.side?.includes('all') || mainStyle?.border?.side?.includes('top')
|
|
|
|
|
+ ? mainStyle?.border?.color
|
|
|
|
|
+ : 'transparent',
|
|
|
|
|
+ borderRightColor:
|
|
|
|
|
+ mainStyle?.border?.side?.includes('all') || mainStyle?.border?.side?.includes('right')
|
|
|
|
|
+ ? mainStyle?.border?.color
|
|
|
|
|
+ : 'transparent',
|
|
|
|
|
+ borderBottomColor:
|
|
|
|
|
+ mainStyle?.border?.side?.includes('all') || mainStyle?.border?.side?.includes('bottom')
|
|
|
|
|
+ ? mainStyle?.border?.color
|
|
|
|
|
+ : 'transparent',
|
|
|
|
|
+ borderLeftColor:
|
|
|
|
|
+ mainStyle?.border?.side?.includes('all') || mainStyle?.border?.side?.includes('left')
|
|
|
|
|
+ ? mainStyle?.border?.color
|
|
|
|
|
+ : 'transparent',
|
|
|
|
|
+
|
|
|
|
|
+ // 内边距
|
|
|
|
|
+ padding: `${mainStyle?.padding.top}px ${mainStyle?.padding.right}px ${mainStyle?.padding.bottom}px ${mainStyle?.padding.left}px`,
|
|
|
|
|
+
|
|
|
|
|
+ /* x 偏移量 | y 偏移量 | 阴影模糊半径 | 阴影扩散半径 | 阴影颜色 */
|
|
|
|
|
+ boxShadow: mainStyle?.shadow
|
|
|
|
|
+ ? `${mainStyle?.shadow?.x}px ${mainStyle?.shadow?.y}px ${mainStyle?.shadow?.width}px ${mainStyle?.shadow?.spread}px ${mainStyle?.shadow?.color}`
|
|
|
|
|
+ : 'none'
|
|
|
|
|
+ },
|
|
|
|
|
+ selectedStyle: {
|
|
|
|
|
+ background: selectedStyle.background.color,
|
|
|
|
|
+ // 边框
|
|
|
|
|
+ borderRadius: `${selectedStyle?.border.radius}px`,
|
|
|
|
|
+ borderStyle: 'solid',
|
|
|
|
|
+ borderColor: 'transparent',
|
|
|
|
|
+ borderWidth: `${selectedStyle?.border.width}px`,
|
|
|
|
|
+ borderTopColor:
|
|
|
|
|
+ selectedStyle?.border?.side?.includes('all') || selectedStyle?.border?.side?.includes('top')
|
|
|
|
|
+ ? selectedStyle?.border?.color
|
|
|
|
|
+ : 'transparent',
|
|
|
|
|
+ borderRightColor:
|
|
|
|
|
+ selectedStyle?.border?.side?.includes('all') ||
|
|
|
|
|
+ selectedStyle?.border?.side?.includes('right')
|
|
|
|
|
+ ? selectedStyle?.border?.color
|
|
|
|
|
+ : 'transparent',
|
|
|
|
|
+ borderBottomColor:
|
|
|
|
|
+ selectedStyle?.border?.side?.includes('all') ||
|
|
|
|
|
+ selectedStyle?.border?.side?.includes('bottom')
|
|
|
|
|
+ ? selectedStyle?.border?.color
|
|
|
|
|
+ : 'transparent',
|
|
|
|
|
+ borderLeftColor:
|
|
|
|
|
+ selectedStyle?.border?.side?.includes('all') ||
|
|
|
|
|
+ selectedStyle?.border?.side?.includes('left')
|
|
|
|
|
+ ? selectedStyle?.border?.color
|
|
|
|
|
+ : 'transparent'
|
|
|
|
|
+ },
|
|
|
|
|
+ scrollbarStyle: {
|
|
|
|
|
+ background: scrollbarStyle.background.color,
|
|
|
|
|
+ borderRadius: `${scrollbarStyle.border.radius}px`
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+})
|
|
|
|
|
+</script>
|
|
|
|
|
+
|
|
|
|
|
+<style scoped></style>
|