From 378e3dcabe4625b27538a13699b7f901f774241e Mon Sep 17 00:00:00 2001 From: Soybean Date: Tue, 17 Dec 2024 19:02:55 +0800 Subject: [PATCH] feat(packages): ui: add slider --- packages/ui/src/components/index.ts | 1 + packages/ui/src/components/slider/index.ts | 9 +++ .../ui/src/components/slider/slider-range.vue | 22 +++++++ .../ui/src/components/slider/slider-root.vue | 26 ++++++++ .../ui/src/components/slider/slider-thumb.vue | 22 +++++++ .../ui/src/components/slider/slider-track.vue | 24 ++++++++ packages/ui/src/components/slider/slider.vue | 35 +++++++++++ packages/ui/src/components/slider/types.ts | 32 ++++++++++ packages/variants/src/index.ts | 1 + packages/variants/src/variants/slider.ts | 60 +++++++++++++++++++ src/views/ui/index.vue | 6 ++ src/views/ui/modules/slider.vue | 22 +++++++ 12 files changed, 260 insertions(+) create mode 100644 packages/ui/src/components/slider/index.ts create mode 100644 packages/ui/src/components/slider/slider-range.vue create mode 100644 packages/ui/src/components/slider/slider-root.vue create mode 100644 packages/ui/src/components/slider/slider-thumb.vue create mode 100644 packages/ui/src/components/slider/slider-track.vue create mode 100644 packages/ui/src/components/slider/slider.vue create mode 100644 packages/ui/src/components/slider/types.ts create mode 100644 packages/variants/src/variants/slider.ts create mode 100644 src/views/ui/modules/slider.vue diff --git a/packages/ui/src/components/index.ts b/packages/ui/src/components/index.ts index d017cc78..849f18c9 100644 --- a/packages/ui/src/components/index.ts +++ b/packages/ui/src/components/index.ts @@ -30,6 +30,7 @@ export * from './select'; export * from './separator'; export * from './sheet'; export * from './skeleton'; +export * from './slider'; export * from './switch'; export * from './tabs'; export * from './textarea'; diff --git a/packages/ui/src/components/slider/index.ts b/packages/ui/src/components/slider/index.ts new file mode 100644 index 00000000..535264db --- /dev/null +++ b/packages/ui/src/components/slider/index.ts @@ -0,0 +1,9 @@ +import SSliderRoot from './slider-root.vue'; +import SSliderTrack from './slider-track.vue'; +import SSliderRange from './slider-range.vue'; +import SSliderThumb from './slider-thumb.vue'; +import SSlider from './slider.vue'; + +export { SSliderRoot, SSliderTrack, SSliderRange, SSliderThumb, SSlider }; + +export * from './types'; diff --git a/packages/ui/src/components/slider/slider-range.vue b/packages/ui/src/components/slider/slider-range.vue new file mode 100644 index 00000000..c2e56281 --- /dev/null +++ b/packages/ui/src/components/slider/slider-range.vue @@ -0,0 +1,22 @@ + + + diff --git a/packages/ui/src/components/slider/slider-root.vue b/packages/ui/src/components/slider/slider-root.vue new file mode 100644 index 00000000..ab47f01a --- /dev/null +++ b/packages/ui/src/components/slider/slider-root.vue @@ -0,0 +1,26 @@ + + + diff --git a/packages/ui/src/components/slider/slider-thumb.vue b/packages/ui/src/components/slider/slider-thumb.vue new file mode 100644 index 00000000..aa877007 --- /dev/null +++ b/packages/ui/src/components/slider/slider-thumb.vue @@ -0,0 +1,22 @@ + + + diff --git a/packages/ui/src/components/slider/slider-track.vue b/packages/ui/src/components/slider/slider-track.vue new file mode 100644 index 00000000..b20c650e --- /dev/null +++ b/packages/ui/src/components/slider/slider-track.vue @@ -0,0 +1,24 @@ + + + diff --git a/packages/ui/src/components/slider/slider.vue b/packages/ui/src/components/slider/slider.vue new file mode 100644 index 00000000..1d1e41be --- /dev/null +++ b/packages/ui/src/components/slider/slider.vue @@ -0,0 +1,35 @@ + + + diff --git a/packages/ui/src/components/slider/types.ts b/packages/ui/src/components/slider/types.ts new file mode 100644 index 00000000..0af98bc5 --- /dev/null +++ b/packages/ui/src/components/slider/types.ts @@ -0,0 +1,32 @@ +import type { + ClassValue, + SliderRootEmits, + SliderRootProps, + SliderRangeProps as _SliderRangeProps, + SliderThumbProps as _SliderThumbProps, + SliderTrackProps as _SliderTrackProps +} from '@soybean-ui/primitive'; +import type { ThemeColor } from '../../types'; + +export interface SliderTrackProps extends _SliderTrackProps { + color?: ThemeColor; +} + +export interface SliderRangeProps extends _SliderRangeProps { + color?: ThemeColor; +} + +export interface SliderThumbProps extends _SliderThumbProps { + color?: ThemeColor; +} + +export interface SliderProps extends SliderRootProps { + color?: ThemeColor; + trackClass?: ClassValue; + rangeClass?: ClassValue; + thumbClass?: ClassValue; +} + +export type SliderEmits = SliderRootEmits; + +export type { SliderRootEmits, SliderRootProps }; diff --git a/packages/variants/src/index.ts b/packages/variants/src/index.ts index a3f0d534..1d2e055e 100644 --- a/packages/variants/src/index.ts +++ b/packages/variants/src/index.ts @@ -30,6 +30,7 @@ export * from './variants/select'; export * from './variants/separator'; export * from './variants/sheet'; export * from './variants/skeleton'; +export * from './variants/slider'; export * from './variants/switch'; export * from './variants/tabs'; export * from './variants/textarea'; diff --git a/packages/variants/src/variants/slider.ts b/packages/variants/src/variants/slider.ts new file mode 100644 index 00000000..f103a36e --- /dev/null +++ b/packages/variants/src/variants/slider.ts @@ -0,0 +1,60 @@ +// @unocss-include +import { tv } from 'tailwind-variants'; + +export const sliderVariants = tv({ + slots: { + root: [ + `relative flex w-full touch-none select-none items-center`, + `data-[orientation=vertical]:(flex-col w-2 h-full)` + ], + track: `relative h-2 w-full data-[orientation=vertical]:w-2 grow overflow-hidden rounded-full`, + range: `absolute h-full data-[orientation=vertical]:w-full`, + thumb: [ + `block h-5 w-5 rounded-full border-2 bg-background transition-colors`, + `focus-visible:(outline outline-2 outline-offset-2)`, + `disabled:(pointer-events-none opacity-50)` + ] + }, + variants: { + color: { + primary: { + track: 'bg-primary/20', + range: 'bg-primary', + thumb: 'border-primary focus-visible:outline-primary' + }, + destructive: { + track: 'bg-destructive/20', + range: 'bg-destructive', + thumb: 'border-destructive focus-visible:outline-destructive' + }, + success: { + track: 'bg-success/20', + range: 'bg-success', + thumb: 'border-success focus-visible:outline-success' + }, + warning: { + track: 'bg-warning/20', + range: 'bg-warning', + thumb: 'border-warning focus-visible:outline-warning' + }, + info: { + track: 'bg-info/20', + range: 'bg-info', + thumb: 'border-info focus-visible:outline-info' + }, + secondary: { + track: 'bg-secondary-foreground/20', + range: 'bg-secondary-foreground', + thumb: 'border-secondary-foreground focus-visible:outline-secondary-foreground' + }, + accent: { + track: 'bg-accent-foreground/20', + range: 'bg-accent-foreground', + thumb: 'border-accent-foreground focus-visible:outline-accent-foreground' + } + } + }, + defaultVariants: { + color: 'primary' + } +}); diff --git a/src/views/ui/index.vue b/src/views/ui/index.vue index 6f2ef858..9e7a2eaf 100644 --- a/src/views/ui/index.vue +++ b/src/views/ui/index.vue @@ -36,6 +36,7 @@ import UiSelect from './modules/select.vue'; import UiSeparator from './modules/separator.vue'; import UiSheet from './modules/sheet.vue'; import UiSkeleton from './modules/skeleton.vue'; +import UiSlider from './modules/slider.vue'; import UiSonner from './modules/sonner.vue'; import UiSwitch from './modules/switch.vue'; import UiTabs from './modules/tabs.vue'; @@ -217,6 +218,11 @@ const tabs: TabConfig[] = [ label: 'Skeleton', component: UiSkeleton }, + { + value: 'slider', + label: 'Slider', + component: UiSlider + }, { value: 'sonner', label: 'Sonner', diff --git a/src/views/ui/modules/slider.vue b/src/views/ui/modules/slider.vue new file mode 100644 index 00000000..cdffaad8 --- /dev/null +++ b/src/views/ui/modules/slider.vue @@ -0,0 +1,22 @@ + + +