feat: 新增 FaSlider 组件

This commit is contained in:
Hooray
2025-03-24 18:23:27 +08:00
parent 5fcd3fe5ed
commit f02298bf1b
4 changed files with 71 additions and 0 deletions
+1
View File
@@ -34,6 +34,7 @@ declare module 'vue' {
FaScrollArea: typeof import('./../ui/components/FaScrollArea/index.vue')['default']
FaSearchBar: typeof import('./../ui/components/FaSearchBar/index.vue')['default']
FaSelect: typeof import('./../ui/components/FaSelect/index.vue')['default']
FaSlider: typeof import('./../ui/components/FaSlider/index.vue')['default']
FaSmartFixedBlock: typeof import('./../ui/components/FaSmartFixedBlock/index.vue')['default']
FaSwitch: typeof import('./../ui/components/FaSwitch/index.vue')['default']
FaSystemInfo: typeof import('./../ui/components/FaSystemInfo/index.vue')['default']
+32
View File
@@ -0,0 +1,32 @@
<script setup lang="ts">
import type { SliderRootProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue'
import { Slider } from './slider'
const props = withDefaults(defineProps<{
defaultValue?: SliderRootProps['defaultValue']
disabled?: SliderRootProps['disabled']
inverted?: SliderRootProps['inverted']
max?: SliderRootProps['max']
min?: SliderRootProps['min']
step?: SliderRootProps['step']
orientation?: SliderRootProps['orientation']
thumbAlignment?: SliderRootProps['thumbAlignment']
class?: HTMLAttributes['class']
}>(), {
defaultValue: () => [0],
disabled: false,
inverted: false,
max: 100,
min: 0,
step: 1,
orientation: 'horizontal',
thumbAlignment: 'contain',
})
const modelValue = defineModel<number[]>()
</script>
<template>
<Slider v-bind="props" v-model="modelValue" />
</template>
@@ -0,0 +1,37 @@
<script setup lang="ts">
import type { SliderRootEmits, SliderRootProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue'
import { cn } from '@/utils'
import { SliderRange, SliderRoot, SliderThumb, SliderTrack, useForwardPropsEmits } from 'reka-ui'
import { computed } from 'vue'
const props = defineProps<SliderRootProps & { class?: HTMLAttributes['class'] }>()
const emits = defineEmits<SliderRootEmits>()
const delegatedProps = computed(() => {
const { class: _, ...delegated } = props
return delegated
})
const forwarded = useForwardPropsEmits(delegatedProps, emits)
</script>
<template>
<SliderRoot
:class="cn(
'relative flex w-full touch-none select-none items-center data-[orientation=vertical]:flex-col data-[orientation=vertical]:w-2 data-[orientation=vertical]:h-full',
props.class,
)"
v-bind="forwarded"
>
<SliderTrack class="relative h-2 w-full grow overflow-hidden rounded-full bg-secondary data-[orientation=vertical]:w-2">
<SliderRange class="absolute h-full bg-primary data-[orientation=vertical]:w-full" />
</SliderTrack>
<FaTooltip v-for="(val, key) in modelValue" :key="key" :text="val.toString()" disable-closing-trigger>
<SliderThumb
class="block h-5 w-5 border-2 border-primary rounded-full bg-background ring-offset-background transition-colors disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-ring"
/>
</FaTooltip>
</SliderRoot>
</template>
@@ -0,0 +1 @@
export { default as Slider } from './Slider.vue'