@umbra.ui/core 0.1.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/dist/components/controls/Dropdown/types.d.ts +5 -0
- package/dist/components/controls/Dropdown/types.d.ts.map +1 -0
- package/dist/components/controls/Dropdown/types.js +1 -0
- package/dist/components/controls/SegmentedControl/types.d.ts +6 -0
- package/dist/components/controls/SegmentedControl/types.d.ts.map +1 -0
- package/dist/components/controls/SegmentedControl/types.js +1 -0
- package/dist/components/dialogs/Alert/types.d.ts +7 -0
- package/dist/components/dialogs/Alert/types.d.ts.map +1 -0
- package/dist/components/dialogs/Alert/types.js +1 -0
- package/dist/components/dialogs/Toast/types.d.ts +34 -0
- package/dist/components/dialogs/Toast/types.d.ts.map +1 -0
- package/dist/components/dialogs/Toast/types.js +10 -0
- package/dist/components/dialogs/Toast/useToast.d.ts +36 -0
- package/dist/components/dialogs/Toast/useToast.d.ts.map +1 -0
- package/dist/components/dialogs/Toast/useToast.js +90 -0
- package/dist/components/indicators/Tooltip/tooltip.d.ts +3 -0
- package/dist/components/indicators/Tooltip/tooltip.d.ts.map +1 -0
- package/dist/components/indicators/Tooltip/tooltip.js +33 -0
- package/dist/components/indicators/Tooltip/types.d.ts +14 -0
- package/dist/components/indicators/Tooltip/types.d.ts.map +1 -0
- package/dist/components/indicators/Tooltip/types.js +1 -0
- package/dist/components/indicators/Tooltip/useTooltip.d.ts +18 -0
- package/dist/components/indicators/Tooltip/useTooltip.d.ts.map +1 -0
- package/dist/components/indicators/Tooltip/useTooltip.js +57 -0
- package/dist/components/inputs/Tags/tag-bar-styles.d.ts +14 -0
- package/dist/components/inputs/Tags/tag-bar-styles.d.ts.map +1 -0
- package/dist/components/inputs/Tags/tag-bar-styles.js +313 -0
- package/dist/components/inputs/Tags/types.d.ts +93 -0
- package/dist/components/inputs/Tags/types.d.ts.map +1 -0
- package/dist/components/inputs/Tags/types.js +216 -0
- package/dist/components/inputs/search/types.d.ts +9 -0
- package/dist/components/inputs/search/types.d.ts.map +1 -0
- package/dist/components/inputs/search/types.js +1 -0
- package/dist/components/navigation/adaptive/types.d.ts +16 -0
- package/dist/components/navigation/adaptive/types.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/types.js +1 -0
- package/dist/components/navigation/adaptive/useAdaptiveLayout.d.ts +27 -0
- package/dist/components/navigation/adaptive/useAdaptiveLayout.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/useAdaptiveLayout.js +40 -0
- package/dist/components/navigation/adaptive/useBreakpoints.d.ts +6 -0
- package/dist/components/navigation/adaptive/useBreakpoints.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/useBreakpoints.js +37 -0
- package/dist/components/navigation/adaptive/useContainerMonitor.d.ts +93 -0
- package/dist/components/navigation/adaptive/useContainerMonitor.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/useContainerMonitor.js +145 -0
- package/dist/components/navigation/adaptive/useViewAnimation.d.ts +31 -0
- package/dist/components/navigation/adaptive/useViewAnimation.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/useViewAnimation.js +591 -0
- package/dist/components/navigation/adaptive/useViewResize.d.ts +52 -0
- package/dist/components/navigation/adaptive/useViewResize.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/useViewResize.js +146 -0
- package/dist/components/navigation/navstack/useNavigationStack.d.ts +25 -0
- package/dist/components/navigation/navstack/useNavigationStack.d.ts.map +1 -0
- package/dist/components/navigation/navstack/useNavigationStack.js +133 -0
- package/dist/components/navigation/slideover/useSlideoverController.d.ts +20 -0
- package/dist/components/navigation/slideover/useSlideoverController.d.ts.map +1 -0
- package/dist/components/navigation/slideover/useSlideoverController.js +267 -0
- package/dist/components/navigation/splitview/useSplitViewController.d.ts +20 -0
- package/dist/components/navigation/splitview/useSplitViewController.d.ts.map +1 -0
- package/dist/components/navigation/splitview/useSplitViewController.js +325 -0
- package/dist/components/navigation/tabcontroller/types.d.ts +21 -0
- package/dist/components/navigation/tabcontroller/types.d.ts.map +1 -0
- package/dist/components/navigation/tabcontroller/types.js +1 -0
- package/dist/components/navigation/tabcontroller/useTabController.d.ts +5 -0
- package/dist/components/navigation/tabcontroller/useTabController.d.ts.map +1 -0
- package/dist/components/navigation/tabcontroller/useTabController.js +10 -0
- package/dist/components/navigation/types.d.ts +8 -0
- package/dist/components/navigation/types.d.ts.map +1 -0
- package/dist/components/navigation/types.js +1 -0
- package/dist/components/pickers/CollectionPicker/types.d.ts +11 -0
- package/dist/components/pickers/CollectionPicker/types.d.ts.map +1 -0
- package/dist/components/pickers/CollectionPicker/types.js +1 -0
- package/dist/components/pickers/ColorPicker/colors.d.ts +13 -0
- package/dist/components/pickers/ColorPicker/colors.d.ts.map +1 -0
- package/dist/components/pickers/ColorPicker/colors.js +266 -0
- package/dist/components/pickers/FilePicker/types.d.ts +10 -0
- package/dist/components/pickers/FilePicker/types.d.ts.map +1 -0
- package/dist/components/pickers/FilePicker/types.js +1 -0
- package/dist/index.d.ts +91 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +196 -0
- package/dist/theme.d.ts +73 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +279 -0
- package/dist/themes/blank.d.ts +7 -0
- package/dist/themes/blank.d.ts.map +1 -0
- package/dist/themes/blank.js +543 -0
- package/dist/themes/crimson-dark.d.ts +4 -0
- package/dist/themes/crimson-dark.d.ts.map +1 -0
- package/dist/themes/crimson-dark.js +552 -0
- package/dist/themes/cyan-light.d.ts +4 -0
- package/dist/themes/cyan-light.d.ts.map +1 -0
- package/dist/themes/cyan-light.js +552 -0
- package/dist/themes/dark.d.ts +4 -0
- package/dist/themes/dark.d.ts.map +1 -0
- package/dist/themes/dark.js +551 -0
- package/dist/themes/gold-dark.d.ts +4 -0
- package/dist/themes/gold-dark.d.ts.map +1 -0
- package/dist/themes/gold-dark.js +552 -0
- package/dist/themes/grass-dark.d.ts +4 -0
- package/dist/themes/grass-dark.d.ts.map +1 -0
- package/dist/themes/grass-dark.js +552 -0
- package/dist/themes/indigo.d.ts +4 -0
- package/dist/themes/indigo.d.ts.map +1 -0
- package/dist/themes/indigo.js +552 -0
- package/dist/themes/light.d.ts +4 -0
- package/dist/themes/light.d.ts.map +1 -0
- package/dist/themes/light.js +551 -0
- package/dist/themes/orange-dark.d.ts +4 -0
- package/dist/themes/orange-dark.d.ts.map +1 -0
- package/dist/themes/orange-dark.js +551 -0
- package/dist/themes/orange-light.d.ts +4 -0
- package/dist/themes/orange-light.d.ts.map +1 -0
- package/dist/themes/orange-light.js +551 -0
- package/package.json +62 -0
- package/src/components/controls/Button/Button.vue +417 -0
- package/src/components/controls/Button/README.md +348 -0
- package/src/components/controls/Button/theme.css +200 -0
- package/src/components/controls/Checkbox/Checkbox.vue +164 -0
- package/src/components/controls/Checkbox/README.md +441 -0
- package/src/components/controls/Checkbox/theme.css +36 -0
- package/src/components/controls/Dropdown/Dropdown.vue +476 -0
- package/src/components/controls/Dropdown/README.md +370 -0
- package/src/components/controls/Dropdown/theme.css +50 -0
- package/src/components/controls/Dropdown/types.ts +6 -0
- package/src/components/controls/IconButton/IconButton.vue +267 -0
- package/src/components/controls/IconButton/README.md +502 -0
- package/src/components/controls/IconButton/theme.css +89 -0
- package/src/components/controls/Radio/README.md +591 -0
- package/src/components/controls/Radio/Radio.vue +89 -0
- package/src/components/controls/Radio/theme.css +14 -0
- package/src/components/controls/RangeSlider/README.md +608 -0
- package/src/components/controls/RangeSlider/RangeSlider.vue +535 -0
- package/src/components/controls/RangeSlider/theme.css +80 -0
- package/src/components/controls/SegmentedControl/README.md +587 -0
- package/src/components/controls/SegmentedControl/SegmentedControl.vue +284 -0
- package/src/components/controls/SegmentedControl/theme.css +60 -0
- package/src/components/controls/SegmentedControl/types.ts +5 -0
- package/src/components/controls/Slider/README.md +627 -0
- package/src/components/controls/Slider/Slider.vue +260 -0
- package/src/components/controls/Slider/theme.css +74 -0
- package/src/components/controls/Stepper/README.md +601 -0
- package/src/components/controls/Stepper/Stepper.vue +103 -0
- package/src/components/controls/Stepper/theme.css +53 -0
- package/src/components/controls/Switch/README.md +667 -0
- package/src/components/controls/Switch/Switch.vue +127 -0
- package/src/components/controls/Switch/theme.css +42 -0
- package/src/components/dialogs/Alert/Alert.vue +218 -0
- package/src/components/dialogs/Alert/README.md +450 -0
- package/src/components/dialogs/Alert/theme.css +44 -0
- package/src/components/dialogs/Alert/types.ts +11 -0
- package/src/components/dialogs/Toast/README.md +522 -0
- package/src/components/dialogs/Toast/Toast.vue +296 -0
- package/src/components/dialogs/Toast/ToastContainer.vue +330 -0
- package/src/components/dialogs/Toast/theme.css +44 -0
- package/src/components/dialogs/Toast/types.ts +46 -0
- package/src/components/dialogs/Toast/useToast.ts +127 -0
- package/src/components/indicators/ProgressBar/ProgressBar.vue +98 -0
- package/src/components/indicators/ProgressBar/README.md +744 -0
- package/src/components/indicators/ProgressBar/theme.css +36 -0
- package/src/components/indicators/Tooltip/README.md +723 -0
- package/src/components/indicators/Tooltip/TooltipProvider.vue +142 -0
- package/src/components/indicators/Tooltip/theme.css +18 -0
- package/src/components/indicators/Tooltip/tooltip.ts +48 -0
- package/src/components/indicators/Tooltip/types.ts +15 -0
- package/src/components/indicators/Tooltip/useTooltip.ts +71 -0
- package/src/components/inputs/AutogrowTextView/AutogrowTextView.vue +110 -0
- package/src/components/inputs/AutogrowTextView/README.md +643 -0
- package/src/components/inputs/AutogrowTextView/theme.css +28 -0
- package/src/components/inputs/InputCard/InputCard.vue +600 -0
- package/src/components/inputs/InputCard/README.md +636 -0
- package/src/components/inputs/InputEmail/InputEmail.vue +698 -0
- package/src/components/inputs/InputEmail/README.md +764 -0
- package/src/components/inputs/InputNumber/InputNumber.vue +300 -0
- package/src/components/inputs/InputNumber/README.md +749 -0
- package/src/components/inputs/InputPhone/InputPhone.vue +645 -0
- package/src/components/inputs/InputPhone/README.md +636 -0
- package/src/components/inputs/InputSecure/InputSecure.vue +646 -0
- package/src/components/inputs/InputSecure/README.md +771 -0
- package/src/components/inputs/InputText/InputText.vue +225 -0
- package/src/components/inputs/InputText/README.md +844 -0
- package/src/components/inputs/OTP/OTP.vue +349 -0
- package/src/components/inputs/OTP/README.md +736 -0
- package/src/components/inputs/OTP/theme.css +50 -0
- package/src/components/inputs/StringCapture/README.md +718 -0
- package/src/components/inputs/StringCapture/StringCapture.vue +315 -0
- package/src/components/inputs/StringCapture/theme.css +86 -0
- package/src/components/inputs/Tags/README.md +897 -0
- package/src/components/inputs/Tags/TagBar.vue +793 -0
- package/src/components/inputs/Tags/TagCreation.vue +219 -0
- package/src/components/inputs/Tags/TagPicker.vue +380 -0
- package/src/components/inputs/Tags/tag-bar-styles.ts +354 -0
- package/src/components/inputs/Tags/theme.css +121 -0
- package/src/components/inputs/Tags/types.ts +346 -0
- package/src/components/inputs/search/README.md +759 -0
- package/src/components/inputs/search/SearchBar.vue +394 -0
- package/src/components/inputs/search/SearchResults.vue +310 -0
- package/src/components/inputs/search/theme.css +187 -0
- package/src/components/inputs/search/types.ts +8 -0
- package/src/components/inputs/theme.css +102 -0
- package/src/components/menus/ActionMenu/ActionMenu.vue +383 -0
- package/src/components/menus/ActionMenu/README.md +825 -0
- package/src/components/menus/ActionMenu/theme.css +93 -0
- package/src/components/models/Popover/Popover.vue +551 -0
- package/src/components/models/Popover/README.md +885 -0
- package/src/components/models/Popover/theme.css +52 -0
- package/src/components/models/Sheet/README.md +1159 -0
- package/src/components/models/Sheet/Sheet.vue +465 -0
- package/src/components/models/Sheet/theme.css +72 -0
- package/src/components/models/Sidebar/README.md +1228 -0
- package/src/components/models/Sidebar/Sidebar.vue +480 -0
- package/src/components/models/Sidebar/theme.css +90 -0
- package/src/components/navigation/adaptive/AdaptiveLayout.vue +779 -0
- package/src/components/navigation/adaptive/AdaptiveLayoutBreadcrumbs.vue +192 -0
- package/src/components/navigation/adaptive/AdaptiveLayoutMenuButton.vue +149 -0
- package/src/components/navigation/adaptive/README.md +768 -0
- package/src/components/navigation/adaptive/types.ts +19 -0
- package/src/components/navigation/adaptive/useAdaptiveLayout.ts +89 -0
- package/src/components/navigation/adaptive/useBreakpoints.ts +41 -0
- package/src/components/navigation/adaptive/useContainerMonitor.ts +214 -0
- package/src/components/navigation/adaptive/useViewAnimation.ts +721 -0
- package/src/components/navigation/adaptive/useViewResize.ts +211 -0
- package/src/components/navigation/navstack/NavigationStack.vue +180 -0
- package/src/components/navigation/navstack/README.md +994 -0
- package/src/components/navigation/navstack/useNavigationStack.ts +164 -0
- package/src/components/navigation/slideover/README.md +1275 -0
- package/src/components/navigation/slideover/SlideoverController.vue +287 -0
- package/src/components/navigation/slideover/useSlideoverController.ts +320 -0
- package/src/components/navigation/splitview/README.md +1115 -0
- package/src/components/navigation/splitview/SplitViewController.vue +176 -0
- package/src/components/navigation/splitview/useSplitViewController.ts +388 -0
- package/src/components/navigation/tabcontroller/README.md +919 -0
- package/src/components/navigation/tabcontroller/TabController.vue +307 -0
- package/src/components/navigation/tabcontroller/TabItem.vue +57 -0
- package/src/components/navigation/tabcontroller/types.ts +24 -0
- package/src/components/navigation/tabcontroller/useTabController.ts +18 -0
- package/src/components/navigation/theme.css +91 -0
- package/src/components/navigation/types.ts +7 -0
- package/src/components/pickers/CollectionPicker/CollectionPicker.vue +398 -0
- package/src/components/pickers/CollectionPicker/README.md +1115 -0
- package/src/components/pickers/CollectionPicker/theme.css +14 -0
- package/src/components/pickers/CollectionPicker/types.ts +11 -0
- package/src/components/pickers/ColorPicker/ColorPicker.vue +376 -0
- package/src/components/pickers/ColorPicker/README.md +1439 -0
- package/src/components/pickers/ColorPicker/colors.ts +299 -0
- package/src/components/pickers/ColorPicker/theme.css +32 -0
- package/src/components/pickers/DatePicker/DatePicker.vue +660 -0
- package/src/components/pickers/DatePicker/README.md +1195 -0
- package/src/components/pickers/DatePicker/theme.css +22 -0
- package/src/components/pickers/FilePicker/FilePicker.vue +534 -0
- package/src/components/pickers/FilePicker/README.md +1542 -0
- package/src/components/pickers/FilePicker/theme.css +48 -0
- package/src/components/pickers/FilePicker/types.ts +10 -0
- package/src/components/pickers/IconPicker/IconPicker.vue +327 -0
- package/src/components/pickers/IconPicker/README.md +1161 -0
- package/src/components/pickers/IconPicker/theme.css +28 -0
- package/src/components/pickers/theme.css +82 -0
- package/src/components/views/MarkdownViewer/MarkdownViewer.vue +442 -0
- package/src/components/views/MarkdownViewer/README.md +833 -0
- package/src/components/views/MarkdownViewer/theme.css +130 -0
- package/src/index.ts +263 -0
- package/src/theme.ts +378 -0
- package/src/themes/crimson-dark.ts +556 -0
- package/src/themes/cyan-light.ts +556 -0
- package/src/themes/dark.ts +557 -0
- package/src/themes/gold-dark.ts +556 -0
- package/src/themes/grass-dark.ts +556 -0
- package/src/themes/indigo.ts +556 -0
- package/src/themes/light.ts +557 -0
- package/src/themes/orange-dark.ts +557 -0
- package/src/themes/orange-light.ts +557 -0
- package/src/vue.d.ts +45 -0
|
@@ -0,0 +1,608 @@
|
|
|
1
|
+
# RangeSlider
|
|
2
|
+
|
|
3
|
+
A dual-thumb range slider component built with Vue 3 Composition API and TypeScript. The RangeSlider component provides an intuitive interface for selecting a range of values with customizable styles, tick marks, and interactive HUDs.
|
|
4
|
+
|
|
5
|
+
## Installation/Import
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { RangeSlider } from "@umbra-ui/core";
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Dependencies:**
|
|
12
|
+
|
|
13
|
+
- Vue 3.x
|
|
14
|
+
|
|
15
|
+
## Basic Usage
|
|
16
|
+
|
|
17
|
+
```vue
|
|
18
|
+
<script setup lang="ts">
|
|
19
|
+
import { ref } from "vue";
|
|
20
|
+
import { RangeSlider } from "@umbra-ui/core";
|
|
21
|
+
|
|
22
|
+
const minValue = ref(25);
|
|
23
|
+
const maxValue = ref(75);
|
|
24
|
+
|
|
25
|
+
const handleMinValueChange = (value: number) => {
|
|
26
|
+
console.log("Min value changed:", value);
|
|
27
|
+
minValue.value = value;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const handleMaxValueChange = (value: number) => {
|
|
31
|
+
console.log("Max value changed:", value);
|
|
32
|
+
maxValue.value = value;
|
|
33
|
+
};
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
<template>
|
|
37
|
+
<RangeSlider
|
|
38
|
+
:min="0"
|
|
39
|
+
:max="100"
|
|
40
|
+
:min-value="minValue"
|
|
41
|
+
:max-value="maxValue"
|
|
42
|
+
@update:min-value="handleMinValueChange"
|
|
43
|
+
@update:max-value="handleMaxValueChange"
|
|
44
|
+
/>
|
|
45
|
+
</template>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Props
|
|
49
|
+
|
|
50
|
+
| Prop Name | Type | Required | Default | Description |
|
|
51
|
+
| ---------------- | ------------------------------------- | -------- | ----------- | ------------------------------------------ |
|
|
52
|
+
| `sliderStyle` | `"default" \| "capline" \| "capsule"` | No | `"default"` | Visual style variant of the slider |
|
|
53
|
+
| `min` | `number` | No | `0` | Minimum value of the slider range |
|
|
54
|
+
| `max` | `number` | No | `100` | Maximum value of the slider range |
|
|
55
|
+
| `minValue` | `number` | Yes | `25` | Current minimum selected value |
|
|
56
|
+
| `maxValue` | `number` | Yes | `75` | Current maximum selected value |
|
|
57
|
+
| `tickInterval` | `number` | No | `10` | Interval between tick marks (0 to disable) |
|
|
58
|
+
| `showTickLabels` | `boolean` | No | `false` | Whether to show labels below tick marks |
|
|
59
|
+
|
|
60
|
+
### Slider Styles
|
|
61
|
+
|
|
62
|
+
- **`default`**: Standard slider with circular thumbs and a filled track
|
|
63
|
+
- **`capline`**: Capsule-style slider with pill-shaped thumbs
|
|
64
|
+
- **`capsule`**: Full capsule design with bordered track and rounded thumbs
|
|
65
|
+
|
|
66
|
+
## Events
|
|
67
|
+
|
|
68
|
+
| Event Name | Payload Type | Description |
|
|
69
|
+
| ----------------- | ------------ | -------------------------------------- |
|
|
70
|
+
| `update:minValue` | `number` | Emitted when the minimum value changes |
|
|
71
|
+
| `update:maxValue` | `number` | Emitted when the maximum value changes |
|
|
72
|
+
|
|
73
|
+
### Event Examples
|
|
74
|
+
|
|
75
|
+
```vue
|
|
76
|
+
<script setup lang="ts">
|
|
77
|
+
import { ref } from "vue";
|
|
78
|
+
import { RangeSlider } from "@umbra-ui/core";
|
|
79
|
+
|
|
80
|
+
const minValue = ref(20);
|
|
81
|
+
const maxValue = ref(80);
|
|
82
|
+
|
|
83
|
+
const handleMinValueChange = (value: number) => {
|
|
84
|
+
console.log("Min value updated:", value);
|
|
85
|
+
minValue.value = value;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const handleMaxValueChange = (value: number) => {
|
|
89
|
+
console.log("Max value updated:", value);
|
|
90
|
+
maxValue.value = value;
|
|
91
|
+
};
|
|
92
|
+
</script>
|
|
93
|
+
|
|
94
|
+
<template>
|
|
95
|
+
<RangeSlider
|
|
96
|
+
:min="0"
|
|
97
|
+
:max="100"
|
|
98
|
+
:min-value="minValue"
|
|
99
|
+
:max-value="maxValue"
|
|
100
|
+
@update:min-value="handleMinValueChange"
|
|
101
|
+
@update:max-value="handleMaxValueChange"
|
|
102
|
+
/>
|
|
103
|
+
</template>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Slots
|
|
107
|
+
|
|
108
|
+
This component does not use slots. All content is controlled via props.
|
|
109
|
+
|
|
110
|
+
## Exposed Methods/Refs
|
|
111
|
+
|
|
112
|
+
This component does not expose any methods or refs via `defineExpose`.
|
|
113
|
+
|
|
114
|
+
## CSS Customization
|
|
115
|
+
|
|
116
|
+
The RangeSlider component uses CSS custom properties that can be overridden to customize the appearance:
|
|
117
|
+
|
|
118
|
+
### Color Variables
|
|
119
|
+
|
|
120
|
+
```css
|
|
121
|
+
/* RangeSlider label colors */
|
|
122
|
+
--rangeslider-label-color: #1a1d23;
|
|
123
|
+
|
|
124
|
+
/* RangeSlider track colors */
|
|
125
|
+
--rangeslider-track-default-bg: #cecece;
|
|
126
|
+
--rangeslider-track-capsule-border: #0090ff;
|
|
127
|
+
--rangeslider-track-capline-bg: #e3e5e8;
|
|
128
|
+
|
|
129
|
+
/* RangeSlider thumb colors */
|
|
130
|
+
--rangeslider-thumb-default-bg: #838383;
|
|
131
|
+
--rangeslider-thumb-capsule-bg: #838383;
|
|
132
|
+
--rangeslider-thumb-capsule-border: white;
|
|
133
|
+
--rangeslider-thumb-capline-bg: #838383;
|
|
134
|
+
|
|
135
|
+
/* RangeSlider progress colors */
|
|
136
|
+
--rangeslider-progress-default-bg: #0090ff;
|
|
137
|
+
--rangeslider-progress-capsule-bg: #acd8fc;
|
|
138
|
+
--rangeslider-progress-capsule-border-top: white;
|
|
139
|
+
--rangeslider-progress-capsule-border-bottom: white;
|
|
140
|
+
--rangeslider-progress-capline-bg: #0090ff;
|
|
141
|
+
|
|
142
|
+
/* RangeSlider HUD colors */
|
|
143
|
+
--rangeslider-hud-default-bg: #8b8d98;
|
|
144
|
+
--rangeslider-hud-default-text: #ffffff;
|
|
145
|
+
--rangeslider-hud-capsule-bg: #0090ff;
|
|
146
|
+
--rangeslider-hud-capsule-text: #ffffff;
|
|
147
|
+
--rangeslider-hud-capline-bg: #8b8d98;
|
|
148
|
+
--rangeslider-hud-capline-text: #ffffff;
|
|
149
|
+
|
|
150
|
+
/* RangeSlider tick colors */
|
|
151
|
+
--rangeslider-tick-color: #bbbbbb;
|
|
152
|
+
|
|
153
|
+
/* RangeSlider tick label colors */
|
|
154
|
+
--rangeslider-tick-label-color: #8b8d98;
|
|
155
|
+
--rangeslider-tick-label-opacity: 0.8;
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Custom Styling Example
|
|
159
|
+
|
|
160
|
+
```vue
|
|
161
|
+
<template>
|
|
162
|
+
<RangeSlider
|
|
163
|
+
:min="0"
|
|
164
|
+
:max="100"
|
|
165
|
+
:min-value="minValue"
|
|
166
|
+
:max-value="maxValue"
|
|
167
|
+
class="custom-range-slider"
|
|
168
|
+
/>
|
|
169
|
+
</template>
|
|
170
|
+
|
|
171
|
+
<style>
|
|
172
|
+
.custom-range-slider {
|
|
173
|
+
--rangeslider-progress-default-bg: #ff6b6b;
|
|
174
|
+
--rangeslider-thumb-default-bg: #ff5252;
|
|
175
|
+
--rangeslider-hud-default-bg: #ff6b6b;
|
|
176
|
+
}
|
|
177
|
+
</style>
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Examples
|
|
181
|
+
|
|
182
|
+
### Basic Range Slider
|
|
183
|
+
|
|
184
|
+
```vue
|
|
185
|
+
<script setup lang="ts">
|
|
186
|
+
import { ref } from "vue";
|
|
187
|
+
import { RangeSlider } from "@umbra-ui/core";
|
|
188
|
+
|
|
189
|
+
const minValue = ref(30);
|
|
190
|
+
const maxValue = ref(70);
|
|
191
|
+
</script>
|
|
192
|
+
|
|
193
|
+
<template>
|
|
194
|
+
<RangeSlider
|
|
195
|
+
:min="0"
|
|
196
|
+
:max="100"
|
|
197
|
+
:min-value="minValue"
|
|
198
|
+
:max-value="maxValue"
|
|
199
|
+
@update:min-value="(value) => (minValue = value)"
|
|
200
|
+
@update:max-value="(value) => (maxValue = value)"
|
|
201
|
+
/>
|
|
202
|
+
</template>
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Different Slider Styles
|
|
206
|
+
|
|
207
|
+
```vue
|
|
208
|
+
<script setup lang="ts">
|
|
209
|
+
import { ref } from "vue";
|
|
210
|
+
import { RangeSlider } from "@umbra-ui/core";
|
|
211
|
+
|
|
212
|
+
const defaultMin = ref(20);
|
|
213
|
+
const defaultMax = ref(80);
|
|
214
|
+
const caplineMin = ref(25);
|
|
215
|
+
const caplineMax = ref(75);
|
|
216
|
+
const capsuleMin = ref(30);
|
|
217
|
+
const capsuleMax = ref(70);
|
|
218
|
+
</script>
|
|
219
|
+
|
|
220
|
+
<template>
|
|
221
|
+
<div class="style-examples">
|
|
222
|
+
<div class="example">
|
|
223
|
+
<h3>Default Style</h3>
|
|
224
|
+
<RangeSlider
|
|
225
|
+
:min="0"
|
|
226
|
+
:max="100"
|
|
227
|
+
:min-value="defaultMin"
|
|
228
|
+
:max-value="defaultMax"
|
|
229
|
+
slider-style="default"
|
|
230
|
+
@update:min-value="(value) => (defaultMin = value)"
|
|
231
|
+
@update:max-value="(value) => (defaultMax = value)"
|
|
232
|
+
/>
|
|
233
|
+
</div>
|
|
234
|
+
|
|
235
|
+
<div class="example">
|
|
236
|
+
<h3>Capline Style</h3>
|
|
237
|
+
<RangeSlider
|
|
238
|
+
:min="0"
|
|
239
|
+
:max="100"
|
|
240
|
+
:min-value="caplineMin"
|
|
241
|
+
:max-value="caplineMax"
|
|
242
|
+
slider-style="capline"
|
|
243
|
+
@update:min-value="(value) => (caplineMin = value)"
|
|
244
|
+
@update:max-value="(value) => (caplineMax = value)"
|
|
245
|
+
/>
|
|
246
|
+
</div>
|
|
247
|
+
|
|
248
|
+
<div class="example">
|
|
249
|
+
<h3>Capsule Style</h3>
|
|
250
|
+
<RangeSlider
|
|
251
|
+
:min="0"
|
|
252
|
+
:max="100"
|
|
253
|
+
:min-value="capsuleMin"
|
|
254
|
+
:max-value="capsuleMax"
|
|
255
|
+
slider-style="capsule"
|
|
256
|
+
@update:min-value="(value) => (capsuleMin = value)"
|
|
257
|
+
@update:max-value="(value) => (capsuleMax = value)"
|
|
258
|
+
/>
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
</template>
|
|
262
|
+
|
|
263
|
+
<style module>
|
|
264
|
+
.style-examples {
|
|
265
|
+
display: flex;
|
|
266
|
+
flex-direction: column;
|
|
267
|
+
gap: 2rem;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.example {
|
|
271
|
+
display: flex;
|
|
272
|
+
flex-direction: column;
|
|
273
|
+
gap: 1rem;
|
|
274
|
+
}
|
|
275
|
+
</style>
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### With Tick Marks and Labels
|
|
279
|
+
|
|
280
|
+
```vue
|
|
281
|
+
<script setup lang="ts">
|
|
282
|
+
import { ref } from "vue";
|
|
283
|
+
import { RangeSlider } from "@umbra-ui/core";
|
|
284
|
+
|
|
285
|
+
const minValue = ref(20);
|
|
286
|
+
const maxValue = ref(80);
|
|
287
|
+
</script>
|
|
288
|
+
|
|
289
|
+
<template>
|
|
290
|
+
<div class="tick-examples">
|
|
291
|
+
<div class="example">
|
|
292
|
+
<h3>With Tick Marks</h3>
|
|
293
|
+
<RangeSlider
|
|
294
|
+
:min="0"
|
|
295
|
+
:max="100"
|
|
296
|
+
:min-value="minValue"
|
|
297
|
+
:max-value="maxValue"
|
|
298
|
+
:tick-interval="10"
|
|
299
|
+
@update:min-value="(value) => (minValue = value)"
|
|
300
|
+
@update:max-value="(value) => (maxValue = value)"
|
|
301
|
+
/>
|
|
302
|
+
</div>
|
|
303
|
+
|
|
304
|
+
<div class="example">
|
|
305
|
+
<h3>With Tick Labels</h3>
|
|
306
|
+
<RangeSlider
|
|
307
|
+
:min="0"
|
|
308
|
+
:max="100"
|
|
309
|
+
:min-value="minValue"
|
|
310
|
+
:max-value="maxValue"
|
|
311
|
+
:tick-interval="20"
|
|
312
|
+
:show-tick-labels="true"
|
|
313
|
+
@update:min-value="(value) => (minValue = value)"
|
|
314
|
+
@update:max-value="(value) => (maxValue = value)"
|
|
315
|
+
/>
|
|
316
|
+
</div>
|
|
317
|
+
</div>
|
|
318
|
+
</template>
|
|
319
|
+
|
|
320
|
+
<style module>
|
|
321
|
+
.tick-examples {
|
|
322
|
+
display: flex;
|
|
323
|
+
flex-direction: column;
|
|
324
|
+
gap: 2rem;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
.example {
|
|
328
|
+
display: flex;
|
|
329
|
+
flex-direction: column;
|
|
330
|
+
gap: 1rem;
|
|
331
|
+
}
|
|
332
|
+
</style>
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### Price Range Selector
|
|
336
|
+
|
|
337
|
+
```vue
|
|
338
|
+
<script setup lang="ts">
|
|
339
|
+
import { ref } from "vue";
|
|
340
|
+
import { RangeSlider } from "@umbra-ui/core";
|
|
341
|
+
|
|
342
|
+
const minPrice = ref(50);
|
|
343
|
+
const maxPrice = ref(500);
|
|
344
|
+
|
|
345
|
+
const formatPrice = (value: number) => {
|
|
346
|
+
return `$${value}`;
|
|
347
|
+
};
|
|
348
|
+
</script>
|
|
349
|
+
|
|
350
|
+
<template>
|
|
351
|
+
<div class="price-range">
|
|
352
|
+
<h3>Price Range</h3>
|
|
353
|
+
<div class="price-display">
|
|
354
|
+
<span>{{ formatPrice(minPrice) }}</span>
|
|
355
|
+
<span>to</span>
|
|
356
|
+
<span>{{ formatPrice(maxPrice) }}</span>
|
|
357
|
+
</div>
|
|
358
|
+
|
|
359
|
+
<RangeSlider
|
|
360
|
+
:min="0"
|
|
361
|
+
:max="1000"
|
|
362
|
+
:min-value="minPrice"
|
|
363
|
+
:max-value="maxPrice"
|
|
364
|
+
:tick-interval="100"
|
|
365
|
+
:show-tick-labels="true"
|
|
366
|
+
@update:min-value="(value) => (minPrice = value)"
|
|
367
|
+
@update:max-value="(value) => (maxPrice = value)"
|
|
368
|
+
/>
|
|
369
|
+
</div>
|
|
370
|
+
</template>
|
|
371
|
+
|
|
372
|
+
<style module>
|
|
373
|
+
.price-range {
|
|
374
|
+
display: flex;
|
|
375
|
+
flex-direction: column;
|
|
376
|
+
gap: 1rem;
|
|
377
|
+
max-width: 400px;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
.price-display {
|
|
381
|
+
display: flex;
|
|
382
|
+
align-items: center;
|
|
383
|
+
gap: 0.5rem;
|
|
384
|
+
font-weight: 500;
|
|
385
|
+
}
|
|
386
|
+
</style>
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### Form Integration
|
|
390
|
+
|
|
391
|
+
```vue
|
|
392
|
+
<script setup lang="ts">
|
|
393
|
+
import { ref } from "vue";
|
|
394
|
+
import { RangeSlider } from "@umbra-ui/core";
|
|
395
|
+
|
|
396
|
+
interface FilterData {
|
|
397
|
+
ageRange: { min: number; max: number };
|
|
398
|
+
salaryRange: { min: number; max: number };
|
|
399
|
+
experienceRange: { min: number; max: number };
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
const filters = ref<FilterData>({
|
|
403
|
+
ageRange: { min: 25, max: 65 },
|
|
404
|
+
salaryRange: { min: 30000, max: 150000 },
|
|
405
|
+
experienceRange: { min: 0, max: 20 },
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
const applyFilters = () => {
|
|
409
|
+
console.log("Applied filters:", filters.value);
|
|
410
|
+
};
|
|
411
|
+
</script>
|
|
412
|
+
|
|
413
|
+
<template>
|
|
414
|
+
<form class="filter-form" @submit.prevent="applyFilters">
|
|
415
|
+
<div class="filter-group">
|
|
416
|
+
<label>Age Range</label>
|
|
417
|
+
<div class="range-display">
|
|
418
|
+
{{ filters.ageRange.min }} - {{ filters.ageRange.max }} years
|
|
419
|
+
</div>
|
|
420
|
+
<RangeSlider
|
|
421
|
+
:min="18"
|
|
422
|
+
:max="80"
|
|
423
|
+
:min-value="filters.ageRange.min"
|
|
424
|
+
:max-value="filters.ageRange.max"
|
|
425
|
+
:tick-interval="10"
|
|
426
|
+
@update:min-value="(value) => (filters.ageRange.min = value)"
|
|
427
|
+
@update:max-value="(value) => (filters.ageRange.max = value)"
|
|
428
|
+
/>
|
|
429
|
+
</div>
|
|
430
|
+
|
|
431
|
+
<div class="filter-group">
|
|
432
|
+
<label>Salary Range</label>
|
|
433
|
+
<div class="range-display">
|
|
434
|
+
${{ filters.salaryRange.min.toLocaleString() }} - ${{
|
|
435
|
+
filters.salaryRange.max.toLocaleString()
|
|
436
|
+
}}
|
|
437
|
+
</div>
|
|
438
|
+
<RangeSlider
|
|
439
|
+
:min="20000"
|
|
440
|
+
:max="200000"
|
|
441
|
+
:min-value="filters.salaryRange.min"
|
|
442
|
+
:max-value="filters.salaryRange.max"
|
|
443
|
+
:tick-interval="20000"
|
|
444
|
+
@update:min-value="(value) => (filters.salaryRange.min = value)"
|
|
445
|
+
@update:max-value="(value) => (filters.salaryRange.max = value)"
|
|
446
|
+
/>
|
|
447
|
+
</div>
|
|
448
|
+
|
|
449
|
+
<div class="filter-group">
|
|
450
|
+
<label>Experience Range</label>
|
|
451
|
+
<div class="range-display">
|
|
452
|
+
{{ filters.experienceRange.min }} -
|
|
453
|
+
{{ filters.experienceRange.max }} years
|
|
454
|
+
</div>
|
|
455
|
+
<RangeSlider
|
|
456
|
+
:min="0"
|
|
457
|
+
:max="30"
|
|
458
|
+
:min-value="filters.experienceRange.min"
|
|
459
|
+
:max-value="filters.experienceRange.max"
|
|
460
|
+
:tick-interval="5"
|
|
461
|
+
@update:min-value="(value) => (filters.experienceRange.min = value)"
|
|
462
|
+
@update:max-value="(value) => (filters.experienceRange.max = value)"
|
|
463
|
+
/>
|
|
464
|
+
</div>
|
|
465
|
+
|
|
466
|
+
<button type="submit">Apply Filters</button>
|
|
467
|
+
</form>
|
|
468
|
+
</template>
|
|
469
|
+
|
|
470
|
+
<style module>
|
|
471
|
+
.filter-form {
|
|
472
|
+
display: flex;
|
|
473
|
+
flex-direction: column;
|
|
474
|
+
gap: 2rem;
|
|
475
|
+
max-width: 500px;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
.filter-group {
|
|
479
|
+
display: flex;
|
|
480
|
+
flex-direction: column;
|
|
481
|
+
gap: 0.5rem;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
.range-display {
|
|
485
|
+
font-weight: 500;
|
|
486
|
+
color: #666;
|
|
487
|
+
}
|
|
488
|
+
</style>
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
### Audio/Video Controls
|
|
492
|
+
|
|
493
|
+
```vue
|
|
494
|
+
<script setup lang="ts">
|
|
495
|
+
import { ref } from "vue";
|
|
496
|
+
import { RangeSlider } from "@umbra-ui/core";
|
|
497
|
+
|
|
498
|
+
const volumeRange = ref({ min: 20, max: 80 });
|
|
499
|
+
const frequencyRange = ref({ min: 100, max: 10000 });
|
|
500
|
+
|
|
501
|
+
const formatVolume = (value: number) => {
|
|
502
|
+
return `${value}%`;
|
|
503
|
+
};
|
|
504
|
+
|
|
505
|
+
const formatFrequency = (value: number) => {
|
|
506
|
+
if (value >= 1000) {
|
|
507
|
+
return `${(value / 1000).toFixed(1)}kHz`;
|
|
508
|
+
}
|
|
509
|
+
return `${value}Hz`;
|
|
510
|
+
};
|
|
511
|
+
</script>
|
|
512
|
+
|
|
513
|
+
<template>
|
|
514
|
+
<div class="audio-controls">
|
|
515
|
+
<h3>Audio Controls</h3>
|
|
516
|
+
|
|
517
|
+
<div class="control-group">
|
|
518
|
+
<label>Volume Range</label>
|
|
519
|
+
<div class="value-display">
|
|
520
|
+
{{ formatVolume(volumeRange.min) }} -
|
|
521
|
+
{{ formatVolume(volumeRange.max) }}
|
|
522
|
+
</div>
|
|
523
|
+
<RangeSlider
|
|
524
|
+
:min="0"
|
|
525
|
+
:max="100"
|
|
526
|
+
:min-value="volumeRange.min"
|
|
527
|
+
:max-value="volumeRange.max"
|
|
528
|
+
:tick-interval="10"
|
|
529
|
+
slider-style="capline"
|
|
530
|
+
@update:min-value="(value) => (volumeRange.min = value)"
|
|
531
|
+
@update:max-value="(value) => (volumeRange.max = value)"
|
|
532
|
+
/>
|
|
533
|
+
</div>
|
|
534
|
+
|
|
535
|
+
<div class="control-group">
|
|
536
|
+
<label>Frequency Range</label>
|
|
537
|
+
<div class="value-display">
|
|
538
|
+
{{ formatFrequency(frequencyRange.min) }} -
|
|
539
|
+
{{ formatFrequency(frequencyRange.max) }}
|
|
540
|
+
</div>
|
|
541
|
+
<RangeSlider
|
|
542
|
+
:min="20"
|
|
543
|
+
:max="20000"
|
|
544
|
+
:min-value="frequencyRange.min"
|
|
545
|
+
:max-value="frequencyRange.max"
|
|
546
|
+
:tick-interval="1000"
|
|
547
|
+
:show-tick-labels="true"
|
|
548
|
+
slider-style="capsule"
|
|
549
|
+
@update:min-value="(value) => (frequencyRange.min = value)"
|
|
550
|
+
@update:max-value="(value) => (frequencyRange.max = value)"
|
|
551
|
+
/>
|
|
552
|
+
</div>
|
|
553
|
+
</div>
|
|
554
|
+
</template>
|
|
555
|
+
|
|
556
|
+
<style module>
|
|
557
|
+
.audio-controls {
|
|
558
|
+
display: flex;
|
|
559
|
+
flex-direction: column;
|
|
560
|
+
gap: 2rem;
|
|
561
|
+
max-width: 500px;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
.control-group {
|
|
565
|
+
display: flex;
|
|
566
|
+
flex-direction: column;
|
|
567
|
+
gap: 0.5rem;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
.value-display {
|
|
571
|
+
font-weight: 500;
|
|
572
|
+
color: #666;
|
|
573
|
+
font-family: monospace;
|
|
574
|
+
}
|
|
575
|
+
</style>
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
## Interactive Features
|
|
579
|
+
|
|
580
|
+
### HUD (Heads-Up Display)
|
|
581
|
+
|
|
582
|
+
- Value tooltips appear above thumbs when dragging
|
|
583
|
+
- Automatically hide after 500ms when interaction ends
|
|
584
|
+
- Show current rounded values for easy reading
|
|
585
|
+
|
|
586
|
+
### Smart Thumb Selection
|
|
587
|
+
|
|
588
|
+
- Automatically selects the closest thumb when clicking on the track
|
|
589
|
+
- Handles overlapping thumbs intelligently
|
|
590
|
+
- Prevents min value from exceeding max value and vice versa
|
|
591
|
+
|
|
592
|
+
### Touch Support
|
|
593
|
+
|
|
594
|
+
- Full touch device support with proper event handling
|
|
595
|
+
- Smooth dragging experience on mobile devices
|
|
596
|
+
- Prevents default touch behaviors for better control
|
|
597
|
+
|
|
598
|
+
## Notes
|
|
599
|
+
|
|
600
|
+
- The component includes smooth animations and transitions
|
|
601
|
+
- HUD tooltips show rounded values for better readability
|
|
602
|
+
- Active thumb is visually highlighted and appears on top
|
|
603
|
+
- Tick marks are automatically generated based on the interval
|
|
604
|
+
- The component supports both light and dark themes
|
|
605
|
+
- All interactions are fully accessible with proper event handling
|
|
606
|
+
- The slider automatically constrains values within the min/max range
|
|
607
|
+
- Touch and mouse events are both supported for cross-platform compatibility
|
|
608
|
+
- The component uses percentage-based positioning for smooth value interpolation
|