ropav 0.0.9 → 0.0.10

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.
Files changed (159) hide show
  1. package/dist/color-input.css +19 -19
  2. package/dist/color-input.js +8 -3
  3. package/dist/color-picker.css +20 -20
  4. package/dist/color-picker.js +107 -27
  5. package/dist/components/accordion/accordion-item.d.ts +4 -4
  6. package/dist/components/accordion/accordion.d.ts +1 -1
  7. package/dist/components/accordion/index.d.ts +4 -4
  8. package/dist/components/accordion/types.d.ts +1 -1
  9. package/dist/components/accordion/useAccordion.d.ts +1 -1
  10. package/dist/components/alert/alert.d.ts +1 -1
  11. package/dist/components/alert/index.d.ts +3 -3
  12. package/dist/components/alert/types.d.ts +1 -1
  13. package/dist/components/alert/useAlertColor.d.ts +1 -1
  14. package/dist/components/aspect-ratio/aspect-ratio.d.ts +1 -1
  15. package/dist/components/aspect-ratio/index.d.ts +2 -2
  16. package/dist/components/avatar/avatar.d.ts +1 -1
  17. package/dist/components/avatar/index.d.ts +3 -3
  18. package/dist/components/avatar/types.d.ts +1 -1
  19. package/dist/components/avatar/useAvatarColor.d.ts +1 -1
  20. package/dist/components/badge/badge.d.ts +1 -1
  21. package/dist/components/badge/index.d.ts +3 -3
  22. package/dist/components/badge/types.d.ts +1 -1
  23. package/dist/components/badge/useBadgeColor.d.ts +1 -1
  24. package/dist/components/button/button.d.ts +1 -1
  25. package/dist/components/button/index.d.ts +2 -2
  26. package/dist/components/button/types.d.ts +1 -1
  27. package/dist/components/button/useButtonColor.d.ts +1 -1
  28. package/dist/components/button-group/button-group.d.ts +1 -1
  29. package/dist/components/button-group/index.d.ts +2 -2
  30. package/dist/components/button-link/button-link.d.ts +1 -1
  31. package/dist/components/button-link/index.d.ts +2 -2
  32. package/dist/components/button-link/types.d.ts +1 -1
  33. package/dist/components/card/card.d.ts +1 -1
  34. package/dist/components/card/index.d.ts +2 -2
  35. package/dist/components/checkbox/checkbox.d.ts +1 -1
  36. package/dist/components/checkbox/index.d.ts +2 -2
  37. package/dist/components/checkbox/types.d.ts +1 -1
  38. package/dist/components/checkbox/useCheckbox.d.ts +2 -2
  39. package/dist/components/collapse/collapse.d.ts +2 -2
  40. package/dist/components/collapse/index.d.ts +3 -3
  41. package/dist/components/collapse/useCollapse.d.ts +1 -1
  42. package/dist/components/color-input/color-input.d.ts +1 -1
  43. package/dist/components/color-input/index.d.ts +2 -2
  44. package/dist/components/color-input/types.d.ts +4 -3
  45. package/dist/components/color-input/useColorInput.d.ts +5 -5
  46. package/dist/components/color-input/useColorInputEyeDropper.d.ts +1 -1
  47. package/dist/components/color-input/useColorInputPopover.d.ts +2 -2
  48. package/dist/components/color-input/useColorInputValue.d.ts +1 -1
  49. package/dist/components/color-picker/color-picker-saturation.d.ts +1 -1
  50. package/dist/components/color-picker/color-picker-slider.d.ts +1 -1
  51. package/dist/components/color-picker/color-picker-utils.d.ts +1 -1
  52. package/dist/components/color-picker/color-picker.d.ts +1 -1
  53. package/dist/components/color-picker/index.d.ts +3 -3
  54. package/dist/components/color-picker/useColorPickerDrag.d.ts +7 -2
  55. package/dist/components/color-picker/useColorPickerSwatches.d.ts +1 -1
  56. package/dist/components/color-picker/useColorPickerValue.d.ts +2 -2
  57. package/dist/components/color-swatch/color-swatch.d.ts +1 -1
  58. package/dist/components/color-swatch/index.d.ts +2 -2
  59. package/dist/components/dropdown-menu/dropdown-menu-items.d.ts +15 -6
  60. package/dist/components/dropdown-menu/dropdown-menu-utils.d.ts +1 -1
  61. package/dist/components/dropdown-menu/dropdown-menu.d.ts +1 -1
  62. package/dist/components/dropdown-menu/index.d.ts +3 -3
  63. package/dist/components/dropdown-menu/useDropdownMenu.d.ts +11 -10
  64. package/dist/components/dropdown-menu/useDropdownMenuDisclosure.d.ts +2 -2
  65. package/dist/components/dropdown-menu/useDropdownMenuDom.d.ts +2 -2
  66. package/dist/components/dropdown-menu/useDropdownMenuHoverIntent.d.ts +2 -2
  67. package/dist/components/dropdown-menu/useDropdownMenuInteractions.d.ts +2 -2
  68. package/dist/components/dropdown-menu/useDropdownMenuNavigation.d.ts +3 -3
  69. package/dist/components/dropdown-menu/useDropdownMenuRenderItems.d.ts +12 -4
  70. package/dist/components/dropdown-menu/useDropdownSubmenus.d.ts +3 -3
  71. package/dist/components/field/field.d.ts +2 -2
  72. package/dist/components/field/index.d.ts +2 -2
  73. package/dist/components/field/useField.d.ts +1 -1
  74. package/dist/components/icon-button/icon-button.d.ts +1 -1
  75. package/dist/components/icon-button/index.d.ts +2 -2
  76. package/dist/components/icon-button/types.d.ts +1 -1
  77. package/dist/components/input/index.d.ts +2 -2
  78. package/dist/components/input/input.d.ts +1 -1
  79. package/dist/components/input/useInput.d.ts +2 -2
  80. package/dist/components/modal/index.d.ts +2 -2
  81. package/dist/components/modal/modal.d.ts +1 -1
  82. package/dist/components/modal/types.d.ts +1 -1
  83. package/dist/components/modal/useModal.d.ts +1 -1
  84. package/dist/components/number-input/index.d.ts +2 -2
  85. package/dist/components/number-input/number-input.d.ts +1 -1
  86. package/dist/components/number-input/types.d.ts +1 -1
  87. package/dist/components/number-input/useNumberInput.d.ts +2 -2
  88. package/dist/components/overlay/index.d.ts +2 -2
  89. package/dist/components/overlay/overlay.d.ts +1 -1
  90. package/dist/components/overlay/useOverlay.d.ts +1 -1
  91. package/dist/components/popover/index.d.ts +3 -3
  92. package/dist/components/popover/popover.d.ts +2 -2
  93. package/dist/components/popover/types.d.ts +1 -0
  94. package/dist/components/popover/usePopover.d.ts +2 -1
  95. package/dist/components/progress/index.d.ts +3 -3
  96. package/dist/components/progress/progress.d.ts +1 -1
  97. package/dist/components/progress/types.d.ts +1 -1
  98. package/dist/components/progress/useProgress.d.ts +2 -2
  99. package/dist/components/radio/index.d.ts +3 -3
  100. package/dist/components/radio/radio-group.d.ts +1 -1
  101. package/dist/components/radio/radio.d.ts +1 -1
  102. package/dist/components/radio/types.d.ts +1 -1
  103. package/dist/components/radio/useRadio.d.ts +2 -2
  104. package/dist/components/select/index.d.ts +2 -2
  105. package/dist/components/select/select.d.ts +1 -1
  106. package/dist/components/select/useSelect.d.ts +2 -2
  107. package/dist/components/slider/index.d.ts +4 -4
  108. package/dist/components/slider/range-slider-tooltip.d.ts +34 -0
  109. package/dist/components/slider/range-slider.d.ts +4 -12
  110. package/dist/components/slider/slider.d.ts +1 -1
  111. package/dist/components/slider/sliderCore.d.ts +35 -0
  112. package/dist/components/slider/types.d.ts +2 -5
  113. package/dist/components/slider/useRangeSlider.d.ts +5 -7
  114. package/dist/components/slider/useRangeSliderPointer.d.ts +19 -0
  115. package/dist/components/slider/useRangeSliderTooltipCollision.d.ts +31 -2
  116. package/dist/components/slider/useRangeSliderTooltipState.d.ts +23 -0
  117. package/dist/components/slider/useSlider.d.ts +11 -15
  118. package/dist/components/switch/index.d.ts +2 -2
  119. package/dist/components/switch/switch.d.ts +1 -1
  120. package/dist/components/switch/types.d.ts +1 -1
  121. package/dist/components/switch/useSwitch.d.ts +2 -2
  122. package/dist/components/tabs/index.d.ts +6 -6
  123. package/dist/components/tabs/tabs-content.d.ts +2 -2
  124. package/dist/components/tabs/tabs-list.d.ts +4 -4
  125. package/dist/components/tabs/tabs-trigger.d.ts +5 -5
  126. package/dist/components/tabs/tabs.d.ts +5 -5
  127. package/dist/components/tabs/useTabs.d.ts +1 -1
  128. package/dist/components/textarea/index.d.ts +2 -2
  129. package/dist/components/textarea/textarea.d.ts +1 -1
  130. package/dist/components/textarea/useTextarea.d.ts +2 -2
  131. package/dist/components/toast/defaults.d.ts +7 -0
  132. package/dist/components/toast/index.d.ts +7 -0
  133. package/dist/components/toast/index.js +2 -0
  134. package/dist/components/toast/toast-provider.d.ts +21 -0
  135. package/dist/components/toast/toast-viewport.d.ts +34 -0
  136. package/dist/components/toast/toast.d.ts +31 -0
  137. package/dist/components/toast/types.d.ts +106 -0
  138. package/dist/components/toast/useToast.d.ts +4 -0
  139. package/dist/components/toast/useToastColor.d.ts +3 -0
  140. package/dist/components/toast/useToastState.d.ts +2 -0
  141. package/dist/components/tooltip/index.d.ts +2 -2
  142. package/dist/components/tooltip/tooltip.d.ts +2 -2
  143. package/dist/components/tooltip/types.d.ts +1 -1
  144. package/dist/components/tooltip/useTooltip.d.ts +3 -1
  145. package/dist/dropdown-menu.js +160 -39
  146. package/dist/index.d.ts +31 -30
  147. package/dist/index.js +2 -1
  148. package/dist/popover.css +28 -28
  149. package/dist/popover.js +25 -14
  150. package/dist/rafScheduler.js +34 -0
  151. package/dist/slider.css +355 -228
  152. package/dist/slider.js +890 -862
  153. package/dist/textarea.js +8 -2
  154. package/dist/toast.css +232 -0
  155. package/dist/toast.js +679 -0
  156. package/dist/tooltip.js +17 -10
  157. package/dist/utils/componentColors.d.ts +60 -0
  158. package/package.json +17 -9
  159. package/dist/components/slider/useRangeSliderTooltipTransition.d.ts +0 -4
package/dist/slider.js CHANGED
@@ -3,25 +3,9 @@ import { t as bem } from "./bem.js";
3
3
  import { n as getComponentColorValue, t as componentColors } from "./componentColors.js";
4
4
  import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
5
5
  import { t as useControlState } from "./useControlState.js";
6
- import { n as useDelayedOpen, t as tooltip_default } from "./tooltip.js";
7
- import { child, computed, createComponent, createFor, createIf, createInvoker, createSlot, createTemplateRefSetter, defineVaporComponent, delegateEvents, next, nextTick, on, onBeforeUnmount, onMounted, onUpdated, ref, renderEffect, setAttr, setClass, setClassName, setInsertionState, setProp, setStyle, setText, setValue, template, toDisplayString, txt, unref, useId, useSlots, watch } from "vue";
8
- //#region src/components/slider/useSlider.ts
9
- var sliderMarkColorProperties = [
10
- "--_rp-slider-mark-color",
11
- "--_rp-slider-mark-label-color",
12
- "--_rp-slider-mark-filled-label-color",
13
- "--_rp-slider-mark-ring-color"
14
- ];
15
- function normalizeSliderValue(value, min, max, step) {
16
- const bounds = normalizeSliderBounds(min, max);
17
- const safeStep = normalizeSliderStep(step);
18
- const safeValue = Number.isFinite(value) ? value : bounds.min;
19
- const clamped = Math.min(bounds.max, Math.max(bounds.min, safeValue));
20
- if (safeStep === "any") return clamped;
21
- const steps = Math.round((clamped - bounds.min) / safeStep);
22
- const snapped = bounds.min + steps * safeStep;
23
- return Math.min(bounds.max, Math.max(bounds.min, Number(snapped.toFixed(10))));
24
- }
6
+ import { i as useDelayedOpen, n as resolveTooltipColorStyleWithContrast, r as resolveTooltipOffsetStyle, t as tooltip_default } from "./tooltip.js";
7
+ import { applyVShow, child, computed, createComponent, createFor, createIf, createInvoker, createSlot, createTemplateRefSetter, defineVaporComponent, delegateEvents, next, on, onBeforeUnmount, onMounted, ref, renderEffect, setAttr, setClass, setClassName, setInsertionState, setProp, setStyle, setText, setValue, template, toDisplayString, toRef, txt, unref, useId, useSlots, watch } from "vue";
8
+ //#region src/components/slider/sliderCore.ts
25
9
  function normalizeSliderBounds(min, max) {
26
10
  const safeMin = Number.isFinite(min) ? min : 0;
27
11
  const safeMax = Number.isFinite(max) ? max : safeMin;
@@ -36,32 +20,48 @@ function normalizeSliderBounds(min, max) {
36
20
  function normalizeSliderStep(step) {
37
21
  return step === "any" || Number.isFinite(step) && step > 0 ? step : "any";
38
22
  }
23
+ function normalizeSliderValue(value, min, max, step) {
24
+ const bounds = normalizeSliderBounds(min, max);
25
+ const safeStep = normalizeSliderStep(step);
26
+ const safeValue = Number.isFinite(value) ? value : bounds.min;
27
+ const clamped = Math.min(bounds.max, Math.max(bounds.min, safeValue));
28
+ if (safeStep === "any") return clamped;
29
+ const steps = Math.round((clamped - bounds.min) / safeStep);
30
+ const snapped = bounds.min + steps * safeStep;
31
+ return Math.min(bounds.max, Math.max(bounds.min, Number(snapped.toFixed(10))));
32
+ }
39
33
  function getSliderValuePercent(value, min, max) {
40
34
  if (max <= min) return 0;
41
35
  const percent = (value - min) / (max - min) * 100;
42
36
  return Math.min(100, Math.max(0, percent));
43
37
  }
44
- function getSliderMarkColorValue(color) {
45
- return getComponentColorValue(color);
46
- }
47
- function getSliderColorValue(color) {
48
- return getComponentColorValue(color);
49
- }
50
38
  function setSliderStyleValue(style, property, value) {
51
39
  if (value) style[property] = value;
52
40
  }
53
- function getSliderMarkStyle(percent, color) {
54
- const style = { "--_rp-slider-mark-position": `${percent}%` };
55
- const colorValue = getSliderMarkColorValue(color);
56
- for (const property of sliderMarkColorProperties) setSliderStyleValue(style, property, colorValue);
57
- return style;
41
+ function getSliderLengthValue(value) {
42
+ if (value == null || value === "") return void 0;
43
+ if (typeof value === "number") return Number.isFinite(value) ? `${value}px` : void 0;
44
+ return value;
45
+ }
46
+ function getSliderBorderValue(value, borderColorProperty) {
47
+ if (value == null || value === "") return void 0;
48
+ if (typeof value === "number") return Number.isFinite(value) ? `${value}px solid var(${borderColorProperty})` : void 0;
49
+ return value;
50
+ }
51
+ function applySliderThumbStyle(style, thumbStyle, properties) {
52
+ setSliderStyleValue(style, properties.size, getSliderLengthValue(thumbStyle?.size));
53
+ setSliderStyleValue(style, properties.border, getSliderBorderValue(thumbStyle?.border, properties.borderColor));
54
+ setSliderStyleValue(style, properties.padding, getSliderLengthValue(thumbStyle?.padding));
58
55
  }
59
- function normalizeSliderMark(mark) {
60
- return typeof mark === "number" ? { value: mark } : mark;
56
+ function getSliderMarkStyle(percent, color, properties) {
57
+ const style = { [properties.position]: `${percent}%` };
58
+ const colorValue = getComponentColorValue(color);
59
+ for (const property of properties.colors) setSliderStyleValue(style, property, colorValue);
60
+ return style;
61
61
  }
62
- function normalizeSliderMarks(marks, min, max, valuePercent) {
62
+ function createSliderMarkItems(marks, min, max, isFilled, properties) {
63
63
  return (marks ?? []).flatMap((markInput, index) => {
64
- const mark = normalizeSliderMark(markInput);
64
+ const mark = typeof markInput === "number" ? { value: markInput } : markInput;
65
65
  if (mark.hidden) return [];
66
66
  const value = Number(mark.value);
67
67
  if (!Number.isFinite(value)) return [];
@@ -71,47 +71,11 @@ function normalizeSliderMarks(marks, min, max, valuePercent) {
71
71
  value,
72
72
  label: mark.label,
73
73
  hasLabel: mark.label != null,
74
- filled: percent <= valuePercent,
75
- style: getSliderMarkStyle(percent, mark.color)
74
+ filled: isFilled(value, percent),
75
+ style: getSliderMarkStyle(percent, mark.color, properties)
76
76
  };
77
77
  });
78
78
  }
79
- function getSliderLengthValue(value) {
80
- if (value == null || value === "") return void 0;
81
- if (typeof value === "number") return Number.isFinite(value) ? `${value}px` : void 0;
82
- return value;
83
- }
84
- function getSliderBorderValue(value) {
85
- if (value == null || value === "") return void 0;
86
- if (typeof value === "number") return Number.isFinite(value) ? `${value}px solid var(--_rp-slider-thumb-border)` : void 0;
87
- return value;
88
- }
89
- var sliderThumbStyleProps = [
90
- [
91
- "--_rp-slider-thumb-size",
92
- "size",
93
- getSliderLengthValue
94
- ],
95
- [
96
- "--_rp-slider-thumb-border-style",
97
- "border",
98
- getSliderBorderValue
99
- ],
100
- [
101
- "--_rp-slider-thumb-padding",
102
- "padding",
103
- getSliderLengthValue
104
- ]
105
- ];
106
- function getSliderTrackStyle(props, valuePercent) {
107
- const style = {
108
- "--_rp-slider-percent": `${valuePercent}%`,
109
- "--_rp-slider-ratio": `${valuePercent / 100}`
110
- };
111
- setSliderStyleValue(style, "--_rp-slider-color", getSliderColorValue(props.color));
112
- for (const [property, propName, getValue] of sliderThumbStyleProps) setSliderStyleValue(style, property, getValue(props.thumbStyle?.[propName]));
113
- return style;
114
- }
115
79
  function getFormattedSliderValue(value, formatter) {
116
80
  return formatter ? formatter(value) : value;
117
81
  }
@@ -128,6 +92,25 @@ function getSliderTooltipMode(tooltip) {
128
92
  if (typeof tooltip === "object") return tooltip.mode ?? "hover";
129
93
  return tooltip;
130
94
  }
95
+ //#endregion
96
+ //#region src/components/slider/useSlider.ts
97
+ function getSliderColorValue(color) {
98
+ return getComponentColorValue(color);
99
+ }
100
+ function getSliderTrackStyle(props, valuePercent) {
101
+ const style = {
102
+ "--_rp-slider-percent": `${valuePercent}%`,
103
+ "--_rp-slider-ratio": `${valuePercent / 100}`
104
+ };
105
+ setSliderStyleValue(style, "--_rp-slider-color", getSliderColorValue(props.color));
106
+ applySliderThumbStyle(style, props.thumbStyle, {
107
+ size: "--_rp-slider-thumb-size",
108
+ border: "--_rp-slider-thumb-border-style",
109
+ padding: "--_rp-slider-thumb-padding",
110
+ borderColor: "--_rp-slider-thumb-border"
111
+ });
112
+ return style;
113
+ }
131
114
  function useSlider(props, emitUpdate) {
132
115
  const control = useControlState(props);
133
116
  const bounds = computed(() => normalizeSliderBounds(props.min, props.max));
@@ -136,7 +119,15 @@ function useSlider(props, emitUpdate) {
136
119
  const valuePercent = computed(() => getSliderValuePercent(normalizedValue.value, bounds.value.min, bounds.value.max));
137
120
  const formattedValue = computed(() => getFormattedSliderValue(normalizedValue.value, props.formatValue));
138
121
  const ariaValueText = computed(() => getSliderAriaValueText(normalizedValue.value, props.ariaValueText, props.formatValue));
139
- const markItems = computed(() => normalizeSliderMarks(props.marks, bounds.value.min, bounds.value.max, valuePercent.value));
122
+ const markItems = computed(() => createSliderMarkItems(props.marks, bounds.value.min, bounds.value.max, (_value, percent) => percent <= valuePercent.value, {
123
+ position: "--_rp-slider-mark-position",
124
+ colors: [
125
+ "--_rp-slider-mark-color",
126
+ "--_rp-slider-mark-label-color",
127
+ "--_rp-slider-mark-filled-label-color",
128
+ "--_rp-slider-mark-ring-color"
129
+ ]
130
+ }));
140
131
  const tooltipOptions = computed(() => getSliderTooltipOptions(props.tooltip));
141
132
  const tooltipMode = computed(() => getSliderTooltipMode(props.tooltip));
142
133
  const tooltipOpenDelay = computed(() => tooltipOptions.value.openDelay ?? 0);
@@ -144,6 +135,12 @@ function useSlider(props, emitUpdate) {
144
135
  openDelay: () => tooltipOpenDelay.value,
145
136
  disabled: () => tooltipMode.value !== "hover" || control.disabled
146
137
  });
138
+ const trackHovered = ref(false);
139
+ const focusWithin = ref(false);
140
+ const dragging = ref(false);
141
+ let dismissed = false;
142
+ let dragView = null;
143
+ let dragPointerId;
147
144
  const hasMarkLabels = computed(() => markItems.value.some((mark) => mark.hasLabel));
148
145
  const tooltipVisible = computed(() => tooltipMode.value !== false);
149
146
  const tooltipAlwaysVisible = computed(() => tooltipMode.value === "always");
@@ -160,9 +157,7 @@ function useSlider(props, emitUpdate) {
160
157
  marked: markItems.value.length > 0,
161
158
  "marks-with-labels": hasMarkLabels.value,
162
159
  "tooltip-always-visible": tooltipAlwaysVisible.value,
163
- disabled: control.disabled,
164
- invalid: control.invalid,
165
- valid: control.valid && !control.invalid
160
+ disabled: control.disabled
166
161
  }));
167
162
  const trackStyle = computed(() => getSliderTrackStyle(props, valuePercent.value));
168
163
  function onInput(e) {
@@ -170,15 +165,64 @@ function useSlider(props, emitUpdate) {
170
165
  const input = e.target;
171
166
  emitUpdate(normalizeSliderValue(input.valueAsNumber, bounds.value.min, bounds.value.max, nativeStep.value));
172
167
  }
173
- function openTooltip() {
174
- if (tooltipMode.value === "hover" && !control.disabled) openDelayedTooltip();
168
+ function hasTooltipInteraction() {
169
+ return trackHovered.value || focusWithin.value || dragging.value;
175
170
  }
176
- function closeTooltip() {
171
+ function syncTooltip() {
172
+ if (tooltipMode.value === "hover" && !control.disabled && hasTooltipInteraction() && !dismissed) {
173
+ openDelayedTooltip();
174
+ return;
175
+ }
177
176
  closeDelayedTooltip();
178
177
  }
178
+ function onTooltipMouseEnter() {
179
+ trackHovered.value = true;
180
+ dismissed = false;
181
+ syncTooltip();
182
+ }
183
+ function onTooltipMouseLeave() {
184
+ trackHovered.value = false;
185
+ syncTooltip();
186
+ }
187
+ function onTooltipFocusIn() {
188
+ focusWithin.value = true;
189
+ dismissed = false;
190
+ syncTooltip();
191
+ }
192
+ function onTooltipFocusOut() {
193
+ focusWithin.value = false;
194
+ syncTooltip();
195
+ }
196
+ function removeDragListeners() {
197
+ dragView?.removeEventListener("pointerup", onTooltipPointerEnd);
198
+ dragView?.removeEventListener("pointercancel", onTooltipPointerEnd);
199
+ dragView = null;
200
+ dragPointerId = void 0;
201
+ }
202
+ function onTooltipPointerEnd(event) {
203
+ if (dragPointerId !== void 0 && event.pointerId !== dragPointerId) return;
204
+ dragging.value = false;
205
+ removeDragListeners();
206
+ syncTooltip();
207
+ }
208
+ function onTooltipPointerDown(event) {
209
+ if (control.disabled || event.button !== 0 || event.isPrimary === false) return;
210
+ removeDragListeners();
211
+ dismissed = false;
212
+ dragging.value = true;
213
+ dragPointerId = Number.isFinite(event.pointerId) ? event.pointerId : void 0;
214
+ dragView = event.currentTarget?.ownerDocument.defaultView ?? null;
215
+ dragView?.addEventListener("pointerup", onTooltipPointerEnd);
216
+ dragView?.addEventListener("pointercancel", onTooltipPointerEnd);
217
+ syncTooltip();
218
+ }
179
219
  function onTooltipKeydown(event) {
180
- if (event.key === "Escape") closeTooltip();
220
+ if (event.key === "Escape") {
221
+ dismissed = true;
222
+ closeDelayedTooltip();
223
+ }
181
224
  }
225
+ onBeforeUnmount(removeDragListeners);
182
226
  return {
183
227
  control,
184
228
  nativeMin: computed(() => bounds.value.min),
@@ -201,23 +245,26 @@ function useSlider(props, emitUpdate) {
201
245
  tooltipArrow,
202
246
  tooltipContent,
203
247
  onInput,
204
- openTooltip,
205
- closeTooltip,
248
+ onTooltipPointerDown,
249
+ onTooltipMouseEnter,
250
+ onTooltipMouseLeave,
251
+ onTooltipFocusIn,
252
+ onTooltipFocusOut,
206
253
  onTooltipKeydown
207
254
  };
208
255
  }
209
256
  //#endregion
210
257
  //#region src/components/slider/slider.vue?vue&type=script&setup=true&vapor=true&lang.ts
211
- var t0$1 = template("<span data-v-c9655b1d class=rp-slider__label>");
212
- var t1$1 = template("<span data-v-c9655b1d class=rp-slider__value aria-hidden=true>");
213
- var t2$1 = template("<span data-v-c9655b1d class=rp-slider__header>");
214
- var t3$1 = template("<span data-v-c9655b1d class=rp-slider__mark-label> ");
215
- var t4$1 = template("<span data-v-c9655b1d><span data-v-c9655b1d class=rp-slider__mark-dot></span>");
216
- var t5$1 = template("<span data-v-c9655b1d class=rp-slider__marks aria-hidden=true>");
217
- var t6$1 = template("<span data-v-c9655b1d class=rp-slider__thumb aria-hidden=true><span data-v-c9655b1d class=rp-slider__thumb-content>");
218
- var t7$1 = template("<span data-v-c9655b1d class=rp-slider__tooltip-anchor aria-hidden=true>", 2);
219
- var t8 = template("<label data-v-c9655b1d><span data-v-c9655b1d class=rp-slider__track><span data-v-c9655b1d class=rp-slider__bar aria-hidden=true></span><input data-v-c9655b1d class=rp-slider__native type=range>", 1);
220
- delegateEvents("input", "focusin", "focusout", "keydown");
258
+ var t0$2 = template("<span data-v-b852f835 class=rp-slider__label>");
259
+ var t1$2 = template("<span data-v-b852f835 class=rp-slider__value aria-hidden=true>");
260
+ var t2$2 = template("<span data-v-b852f835 class=rp-slider__header>");
261
+ var t3$2 = template("<span data-v-b852f835 class=rp-slider__mark-label> ");
262
+ var t4$2 = template("<span data-v-b852f835><span data-v-b852f835 class=rp-slider__mark-dot></span>");
263
+ var t5$1 = template("<span data-v-b852f835 class=rp-slider__marks aria-hidden=true>");
264
+ var t6$1 = template("<span data-v-b852f835 class=rp-slider__thumb aria-hidden=true><span data-v-b852f835 class=rp-slider__thumb-content>");
265
+ var t7$1 = template("<span data-v-b852f835 class=rp-slider__tooltip-anchor aria-hidden=true>", 2);
266
+ var t8$1 = template("<label data-v-b852f835><span data-v-b852f835 class=rp-slider__track><span data-v-b852f835 class=rp-slider__bar aria-hidden=true></span><input data-v-b852f835 class=rp-slider__native type=range>", 1);
267
+ delegateEvents("input", "pointerdown", "focusin", "focusout", "keydown");
221
268
  //#endregion
222
269
  //#region src/components/slider/slider.vue
223
270
  var slider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
@@ -248,18 +295,6 @@ var slider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
248
295
  type: Boolean,
249
296
  default: void 0
250
297
  },
251
- required: {
252
- type: Boolean,
253
- default: void 0
254
- },
255
- invalid: {
256
- type: Boolean,
257
- default: void 0
258
- },
259
- valid: {
260
- type: Boolean,
261
- default: void 0
262
- },
263
298
  ariaLabel: {},
264
299
  ariaValueText: {},
265
300
  describedby: {},
@@ -269,10 +304,10 @@ var slider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
269
304
  setup(__props, { emit: __emit, slots: $slots }) {
270
305
  const props = __props;
271
306
  const emit = __emit;
272
- const { control, nativeMin, nativeMax, nativeStep, rootClass, normalizedValue, valuePercent, formattedValue, ariaValueText, markItems, trackStyle, tooltipVisible, tooltipOpen, tooltipPlacement, tooltipId, tooltipColor, tooltipOffset, tooltipOpenDelay, tooltipArrow, tooltipContent, onInput, openTooltip, closeTooltip, onTooltipKeydown } = useSlider(props, (value) => {
307
+ const { control, nativeMin, nativeMax, nativeStep, rootClass, normalizedValue, valuePercent, formattedValue, ariaValueText, markItems, trackStyle, tooltipVisible, tooltipOpen, tooltipPlacement, tooltipId, tooltipColor, tooltipOffset, tooltipOpenDelay, tooltipArrow, tooltipContent, onInput, onTooltipPointerDown, onTooltipMouseEnter, onTooltipMouseLeave, onTooltipFocusIn, onTooltipFocusOut, onTooltipKeydown } = useSlider(props, (value) => {
273
308
  emit("update:modelValue", value);
274
309
  });
275
- const n31 = t8();
310
+ const n31 = t8$1();
276
311
  const n30 = child(n31, 1);
277
312
  const n11 = next(child(n30), 1);
278
313
  renderEffect(() => {
@@ -282,17 +317,17 @@ var slider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
282
317
  });
283
318
  setInsertionState(n31, 0, 0);
284
319
  createIf(() => $slots.default || $slots.value, () => {
285
- const n10 = t2$1();
320
+ const n10 = t2$2();
286
321
  setInsertionState(n10, null, 0);
287
322
  createIf(() => $slots.default, () => {
288
- const n5 = t0$1();
323
+ const n5 = t0$2();
289
324
  setInsertionState(n5, null, 0);
290
325
  createSlot("default", null, null, 1);
291
326
  return n5;
292
327
  });
293
328
  setInsertionState(n10, null, 1);
294
329
  createIf(() => $slots.value, () => {
295
- const n9 = t1$1();
330
+ const n9 = t1$2();
296
331
  setInsertionState(n9, null, 0);
297
332
  createSlot("value", {
298
333
  value: () => unref(normalizedValue),
@@ -306,7 +341,6 @@ var slider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
306
341
  n11.$evtinput = createInvoker((e) => unref(onInput)(e));
307
342
  renderEffect(() => {
308
343
  const _control = unref(control);
309
- const _control_required = _control.required;
310
344
  setProp(n11, "id", _control.id);
311
345
  setProp(n11, "name", __props.name);
312
346
  setValue(n11, unref(normalizedValue));
@@ -315,13 +349,10 @@ var slider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
315
349
  setProp(n11, "step", unref(nativeStep));
316
350
  setProp(n11, "orient", __props.orientation === "vertical" ? "vertical" : void 0);
317
351
  setProp(n11, "disabled", _control.disabled || void 0);
318
- setProp(n11, "required", _control_required || void 0);
319
352
  setAttr(n11, "aria-label", __props.ariaLabel || void 0);
320
353
  setAttr(n11, "aria-labelledby", _control.ariaLabelledby);
321
354
  setAttr(n11, "aria-describedby", _control.ariaDescribedby);
322
355
  setAttr(n11, "aria-orientation", __props.orientation === "vertical" ? "vertical" : void 0);
323
- setAttr(n11, "aria-invalid", _control.invalid || void 0);
324
- setAttr(n11, "aria-required", _control_required || void 0);
325
356
  setAttr(n11, "aria-valuetext", unref(ariaValueText));
326
357
  });
327
358
  setInsertionState(n30, null, 2);
@@ -329,7 +360,7 @@ var slider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
329
360
  const n20 = t5$1();
330
361
  setInsertionState(n20, null, 0);
331
362
  createFor(() => unref(markItems), (_for_item0) => {
332
- const n19 = t4$1();
363
+ const n19 = t4$2();
333
364
  renderEffect(() => {
334
365
  const _mark = _for_item0.value;
335
366
  setClassName(n19, _mark.filled ? 1 : 0, " rp-slider__mark--filled", "rp-slider__mark");
@@ -337,7 +368,7 @@ var slider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
337
368
  });
338
369
  setInsertionState(n19, null, 1);
339
370
  createIf(() => _for_item0.value.hasLabel, () => {
340
- const n18 = t3$1();
371
+ const n18 = t3$2();
341
372
  const x18 = txt(n18);
342
373
  renderEffect(() => setText(x18, toDisplayString(_for_item0.value.label)));
343
374
  return n18;
@@ -374,22 +405,591 @@ var slider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
374
405
  return t7$1();
375
406
  });
376
407
  });
377
- on(n30, "mouseenter", (e) => unref(openTooltip)(e));
378
- on(n30, "mouseleave", (e) => unref(closeTooltip)(e));
379
- n30.$evtfocusin = createInvoker((e) => unref(openTooltip)(e));
380
- n30.$evtfocusout = createInvoker((e) => unref(closeTooltip)(e));
408
+ n30.$evtpointerdown = createInvoker((e) => unref(onTooltipPointerDown)(e));
409
+ on(n30, "mouseenter", (e) => unref(onTooltipMouseEnter)(e));
410
+ on(n30, "mouseleave", (e) => unref(onTooltipMouseLeave)(e));
411
+ n30.$evtfocusin = createInvoker((e) => unref(onTooltipFocusIn)(e));
412
+ n30.$evtfocusout = createInvoker((e) => unref(onTooltipFocusOut)(e));
381
413
  n30.$evtkeydown = createInvoker((e) => unref(onTooltipKeydown)(e));
382
414
  return n31;
383
415
  }
384
- }), [["__scopeId", "data-v-c9655b1d"]]);
416
+ }), [["__scopeId", "data-v-b852f835"]]);
417
+ //#endregion
418
+ //#region src/components/slider/useRangeSliderTooltipCollision.ts
419
+ var TOOLTIP_COLLISION_GAP = 4;
420
+ function getAxisSize(size, orientation) {
421
+ return orientation === "horizontal" ? size.width : size.height;
422
+ }
423
+ function getTooltipInterval(anchor, size, orientation, placement) {
424
+ const axisSize = getAxisSize(size, orientation);
425
+ if (orientation === "horizontal" ? placement === "top" || placement === "bottom" : placement === "left" || placement === "right") return {
426
+ start: anchor - axisSize / 2,
427
+ end: anchor + axisSize / 2
428
+ };
429
+ return (orientation === "horizontal" ? placement === "left" : placement === "top") ? {
430
+ start: anchor - axisSize,
431
+ end: anchor
432
+ } : {
433
+ start: anchor,
434
+ end: anchor + axisSize
435
+ };
436
+ }
437
+ function areTooltipIntervalsOverlapping(lower, upper, gap) {
438
+ return lower.start < upper.end + gap && lower.end + gap > upper.start;
439
+ }
440
+ function areRangeSliderTooltipLayoutsOverlapping({ gap = TOOLTIP_COLLISION_GAP, lowerPercent, lowerSize, orientation, placement, trackLength, upperPercent, upperSize }) {
441
+ if (trackLength <= 0 || lowerSize.width <= 0 || lowerSize.height <= 0 || upperSize.width <= 0 || upperSize.height <= 0) return false;
442
+ const getAnchor = (percent) => {
443
+ const ratio = percent / 100;
444
+ return orientation === "vertical" ? trackLength * (1 - ratio) : trackLength * ratio;
445
+ };
446
+ return areTooltipIntervalsOverlapping(getTooltipInterval(getAnchor(lowerPercent), lowerSize, orientation, placement), getTooltipInterval(getAnchor(upperPercent), upperSize, orientation, placement), gap);
447
+ }
448
+ function getObservedSize(entry) {
449
+ const borderBoxSize = Array.isArray(entry.borderBoxSize) ? entry.borderBoxSize[0] : entry.borderBoxSize;
450
+ if (borderBoxSize) return {
451
+ width: borderBoxSize.inlineSize,
452
+ height: borderBoxSize.blockSize
453
+ };
454
+ return {
455
+ width: entry.contentRect.width,
456
+ height: entry.contentRect.height
457
+ };
458
+ }
459
+ function getElementSize(element) {
460
+ const rect = element.getBoundingClientRect();
461
+ return {
462
+ width: rect.width,
463
+ height: rect.height
464
+ };
465
+ }
466
+ function useRangeSliderTooltipCollision({ enabled, lower, orientation, placement, root, sizeDependencies = [], upper, valuePercent }) {
467
+ const tooltipsOverlapping = ref(false);
468
+ const rootSize = ref({
469
+ width: 0,
470
+ height: 0
471
+ });
472
+ const lowerSize = ref({
473
+ width: 0,
474
+ height: 0
475
+ });
476
+ const upperSize = ref({
477
+ width: 0,
478
+ height: 0
479
+ });
480
+ let resizeObserver;
481
+ let frameWindow;
482
+ let frameId;
483
+ let destroyed = false;
484
+ function setOverlapping(value) {
485
+ if (tooltipsOverlapping.value !== value) tooltipsOverlapping.value = value;
486
+ }
487
+ function updateCollision() {
488
+ if (!enabled.value) {
489
+ setOverlapping(false);
490
+ return;
491
+ }
492
+ const trackLength = orientation.value === "horizontal" ? rootSize.value.width : rootSize.value.height;
493
+ setOverlapping(areRangeSliderTooltipLayoutsOverlapping({
494
+ gap: TOOLTIP_COLLISION_GAP,
495
+ lowerPercent: valuePercent.value[0],
496
+ lowerSize: lowerSize.value,
497
+ orientation: orientation.value,
498
+ placement: placement.value,
499
+ trackLength,
500
+ upperPercent: valuePercent.value[1],
501
+ upperSize: upperSize.value
502
+ }));
503
+ }
504
+ function measureSizes() {
505
+ if (destroyed) return;
506
+ rootSize.value = root.value ? getElementSize(root.value) : {
507
+ width: 0,
508
+ height: 0
509
+ };
510
+ lowerSize.value = lower.value ? getElementSize(lower.value) : {
511
+ width: 0,
512
+ height: 0
513
+ };
514
+ upperSize.value = upper.value ? getElementSize(upper.value) : {
515
+ width: 0,
516
+ height: 0
517
+ };
518
+ updateCollision();
519
+ }
520
+ function scheduleMeasure() {
521
+ if (destroyed || frameId != null) return;
522
+ const view = root.value?.ownerDocument.defaultView;
523
+ if (!view?.requestAnimationFrame) {
524
+ measureSizes();
525
+ return;
526
+ }
527
+ frameWindow = view;
528
+ frameId = view.requestAnimationFrame(() => {
529
+ frameId = void 0;
530
+ frameWindow = void 0;
531
+ measureSizes();
532
+ });
533
+ }
534
+ function refreshObservedElements() {
535
+ if (!resizeObserver) return;
536
+ resizeObserver.disconnect();
537
+ for (const element of [
538
+ root.value,
539
+ lower.value,
540
+ upper.value
541
+ ]) if (element) resizeObserver.observe(element);
542
+ }
543
+ function onResize(entries) {
544
+ for (const entry of entries) {
545
+ const size = getObservedSize(entry);
546
+ if (entry.target === root.value) rootSize.value = size;
547
+ else if (entry.target === lower.value) lowerSize.value = size;
548
+ else if (entry.target === upper.value) upperSize.value = size;
549
+ }
550
+ updateCollision();
551
+ }
552
+ function onWindowResize() {
553
+ scheduleMeasure();
554
+ }
555
+ onMounted(() => {
556
+ const view = root.value?.ownerDocument.defaultView;
557
+ if (view?.ResizeObserver) resizeObserver = new view.ResizeObserver(onResize);
558
+ view?.addEventListener("resize", onWindowResize);
559
+ refreshObservedElements();
560
+ if (!resizeObserver) scheduleMeasure();
561
+ });
562
+ watch([
563
+ root,
564
+ lower,
565
+ upper
566
+ ], () => {
567
+ refreshObservedElements();
568
+ if (!resizeObserver) scheduleMeasure();
569
+ }, { flush: "post" });
570
+ watch([
571
+ valuePercent,
572
+ orientation,
573
+ placement,
574
+ enabled
575
+ ], updateCollision, { flush: "sync" });
576
+ watch(sizeDependencies, () => {
577
+ if (!resizeObserver) scheduleMeasure();
578
+ }, { flush: "post" });
579
+ const arrowAlongTrackAxis = computed(() => orientation.value === "horizontal" ? placement.value === "top" || placement.value === "bottom" : placement.value === "left" || placement.value === "right");
580
+ const trackAxisLength = computed(() => orientation.value === "horizontal" ? rootSize.value.width : rootSize.value.height);
581
+ const thumbDistance = computed(() => {
582
+ const [lowerPercent, upperPercent] = valuePercent.value;
583
+ return Math.abs(upperPercent - lowerPercent) / 100 * trackAxisLength.value;
584
+ });
585
+ const mergedArrowOffset = computed(() => {
586
+ if (trackAxisLength.value <= 0 || !arrowAlongTrackAxis.value) return 0;
587
+ return thumbDistance.value * .5;
588
+ });
589
+ const mergedMinSize = computed(() => {
590
+ if (!tooltipsOverlapping.value || trackAxisLength.value <= 0 || !arrowAlongTrackAxis.value) return 0;
591
+ const maxEndpoint = Math.max(getAxisSize(lowerSize.value, orientation.value), getAxisSize(upperSize.value, orientation.value));
592
+ return thumbDistance.value + maxEndpoint;
593
+ });
594
+ onBeforeUnmount(() => {
595
+ destroyed = true;
596
+ (root.value?.ownerDocument.defaultView)?.removeEventListener("resize", onWindowResize);
597
+ resizeObserver?.disconnect();
598
+ if (frameId != null) frameWindow?.cancelAnimationFrame(frameId);
599
+ });
600
+ return {
601
+ tooltipsOverlapping,
602
+ mergedArrowOffset,
603
+ mergedMinSize
604
+ };
605
+ }
606
+ //#endregion
607
+ //#region src/components/slider/range-slider-tooltip.vue?vue&type=script&setup=true&vapor=true&lang.ts
608
+ var t0$1 = template("<span data-v-d17966e5 class=rp-range-slider__tooltip-merged-value> </span>");
609
+ var t1$1 = template("<span data-v-d17966e5 class=rp-range-slider__tooltip-merged-value> ");
610
+ var t2$1 = template("<span data-v-d17966e5 class=rp-range-slider__tooltip-merged-separator>–</span>", 2);
611
+ var t3$1 = template(" ");
612
+ var t4$1 = template("<span data-v-d17966e5 aria-hidden=true><span data-v-d17966e5><span data-v-d17966e5 class=rp-range-slider__tooltip-anchor></span><span data-v-d17966e5 class=rp-tooltip__content aria-hidden=true> </span></span><span data-v-d17966e5><span data-v-d17966e5 class=rp-range-slider__tooltip-anchor></span><span data-v-d17966e5 class=rp-tooltip__content aria-hidden=true> </span></span><span data-v-d17966e5><span data-v-d17966e5 class=rp-range-slider__tooltip-anchor></span><span data-v-d17966e5 class=rp-tooltip__content aria-hidden=true>", 1);
613
+ //#endregion
614
+ //#region src/components/slider/range-slider-tooltip.vue
615
+ var range_slider_tooltip_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineVaporComponent({
616
+ name: "RpRangeSliderTooltip",
617
+ __name: "range-slider-tooltip",
618
+ props: {
619
+ arrow: {
620
+ type: Boolean,
621
+ default: false
622
+ },
623
+ color: { default: void 0 },
624
+ content: {},
625
+ ids: {},
626
+ mergedContent: {},
627
+ mergedId: { default: void 0 },
628
+ offset: { default: void 0 },
629
+ open: { type: Boolean },
630
+ orientation: {},
631
+ placement: {},
632
+ valuePercent: {}
633
+ },
634
+ emits: ["update:overlapping"],
635
+ setup(__props, { emit: __emit }) {
636
+ const props = __props;
637
+ const emit = __emit;
638
+ const generatedId = useId();
639
+ const tooltipLayerRef = ref(null);
640
+ const lowerContentRef = ref(null);
641
+ const upperContentRef = ref(null);
642
+ const resolvedIds = computed(() => [props.ids[0] ?? `${generatedId}-lower-tooltip`, props.ids[1] ?? `${generatedId}-upper-tooltip`]);
643
+ const resolvedMergedId = computed(() => props.mergedId ?? `${generatedId}-merged-tooltip`);
644
+ const tooltipRootClass = computed(() => bem("rp-tooltip", {
645
+ [`placement-${props.placement}`]: true,
646
+ arrow: props.arrow,
647
+ open: props.open
648
+ }));
649
+ const contentStyle = computed(() => ({
650
+ ...resolveTooltipOffsetStyle(props.offset),
651
+ ...resolveTooltipColorStyleWithContrast(props.color, void 0)
652
+ }));
653
+ const { tooltipsOverlapping, mergedArrowOffset, mergedMinSize } = useRangeSliderTooltipCollision({
654
+ enabled: toRef(props, "open"),
655
+ lower: lowerContentRef,
656
+ orientation: toRef(props, "orientation"),
657
+ placement: toRef(props, "placement"),
658
+ root: tooltipLayerRef,
659
+ sizeDependencies: [() => props.content],
660
+ upper: upperContentRef,
661
+ valuePercent: toRef(props, "valuePercent")
662
+ });
663
+ const layerStyle = computed(() => ({
664
+ "--_rp-range-slider-tooltip-merged-arrow-offset": `${mergedArrowOffset.value}px`,
665
+ "--_rp-range-slider-tooltip-merged-min-size": `${mergedMinSize.value}px`
666
+ }));
667
+ watch(tooltipsOverlapping, (overlapping) => {
668
+ emit("update:overlapping", overlapping);
669
+ }, { immediate: true });
670
+ onBeforeUnmount(() => {
671
+ emit("update:overlapping", false);
672
+ });
673
+ const _setTemplateRef = createTemplateRefSetter();
674
+ const n16 = t4$1();
675
+ const n1 = child(n16);
676
+ const n0 = next(child(n1), 1);
677
+ const n3 = next(n1, 1);
678
+ const n2 = next(child(n3), 1);
679
+ const n15 = next(n3, 2);
680
+ const n14 = next(child(n15), 1);
681
+ const x0 = txt(n0);
682
+ applyVShow(n0, () => __props.open);
683
+ _setTemplateRef(n0, lowerContentRef, null, "lowerContentRef");
684
+ const x2 = txt(n2);
685
+ applyVShow(n2, () => __props.open);
686
+ _setTemplateRef(n2, upperContentRef, null, "upperContentRef");
687
+ renderEffect(() => {
688
+ const _tooltipRootClass = tooltipRootClass.value;
689
+ const _resolvedIds = resolvedIds.value;
690
+ const _contentStyle = contentStyle.value;
691
+ const _content = __props.content;
692
+ setClass(n16, [
693
+ "rp-range-slider__tooltips",
694
+ `rp-range-slider__tooltips--placement-${__props.placement}`,
695
+ {
696
+ "rp-range-slider__tooltips--overlapping": unref(tooltipsOverlapping),
697
+ "rp-range-slider__tooltips--vertical": __props.orientation === "vertical"
698
+ }
699
+ ]);
700
+ setStyle(n16, layerStyle.value);
701
+ setClass(n1, [
702
+ _tooltipRootClass,
703
+ "rp-range-slider__tooltip",
704
+ "rp-range-slider__tooltip--lower"
705
+ ]);
706
+ setProp(n0, "id", _resolvedIds[0]);
707
+ setStyle(n0, _contentStyle);
708
+ setText(x0, toDisplayString(_content[0]));
709
+ setClass(n3, [
710
+ _tooltipRootClass,
711
+ "rp-range-slider__tooltip",
712
+ "rp-range-slider__tooltip--upper"
713
+ ]);
714
+ setProp(n2, "id", _resolvedIds[1]);
715
+ setStyle(n2, _contentStyle);
716
+ setText(x2, toDisplayString(_content[1]));
717
+ setClass(n15, [
718
+ _tooltipRootClass,
719
+ "rp-range-slider__tooltip",
720
+ "rp-range-slider__tooltip--merged"
721
+ ]);
722
+ setProp(n14, "id", resolvedMergedId.value);
723
+ setStyle(n14, _contentStyle);
724
+ });
725
+ setInsertionState(n14, null, 0);
726
+ createIf(() => __props.orientation === "vertical" && __props.content[0] !== __props.content[1], () => {
727
+ const n6 = t0$1();
728
+ const n7 = t1$1();
729
+ const x6 = txt(n6);
730
+ const x7 = txt(n7);
731
+ renderEffect(() => {
732
+ const _content = __props.content;
733
+ setText(x6, toDisplayString(_content[1]));
734
+ setText(x7, toDisplayString(_content[0]));
735
+ });
736
+ return [n6, n7];
737
+ }, () => createIf(() => __props.content[0] !== __props.content[1], () => {
738
+ const n9 = t0$1();
739
+ const n10 = t2$1();
740
+ const n11 = t1$1();
741
+ const x9 = txt(n9);
742
+ const x11 = txt(n11);
743
+ renderEffect(() => {
744
+ const _content = __props.content;
745
+ setText(x9, toDisplayString(_content[0]));
746
+ setText(x11, toDisplayString(_content[1]));
747
+ });
748
+ return [
749
+ n9,
750
+ n10,
751
+ n11
752
+ ];
753
+ }, () => {
754
+ const n13 = t3$1();
755
+ renderEffect(() => setText(n13, toDisplayString(__props.mergedContent)));
756
+ return n13;
757
+ }, 518), 262);
758
+ applyVShow(n14, () => __props.open);
759
+ _setTemplateRef(n16, tooltipLayerRef, null, "tooltipLayerRef");
760
+ return n16;
761
+ }
762
+ }), [["__scopeId", "data-v-d17966e5"]]);
763
+ //#endregion
764
+ //#region src/components/slider/useRangeSliderPointer.ts
765
+ function useRangeSliderPointer(options) {
766
+ let session;
767
+ let frameWindow = null;
768
+ let frameId;
769
+ let pendingPointerEvent;
770
+ let geometryDirty = false;
771
+ function cancelScheduledFrame() {
772
+ if (frameId !== void 0) frameWindow?.cancelAnimationFrame(frameId);
773
+ frameWindow = null;
774
+ frameId = void 0;
775
+ }
776
+ function refreshGeometry() {
777
+ const currentSession = session;
778
+ if (!currentSession) return false;
779
+ if (!geometryDirty) return true;
780
+ const geometry = options.getPointerGeometry(currentSession.track);
781
+ if (geometry === void 0) return false;
782
+ geometryDirty = false;
783
+ currentSession.geometry = geometry;
784
+ return true;
785
+ }
786
+ function applyScheduledUpdate() {
787
+ if (!refreshGeometry()) return;
788
+ const event = pendingPointerEvent;
789
+ pendingPointerEvent = void 0;
790
+ if (event && isCurrentPointer(event)) updateFromPointer(event);
791
+ }
792
+ function flushScheduledUpdate() {
793
+ cancelScheduledFrame();
794
+ applyScheduledUpdate();
795
+ }
796
+ function onAnimationFrame() {
797
+ frameWindow = null;
798
+ frameId = void 0;
799
+ applyScheduledUpdate();
800
+ }
801
+ function scheduleUpdate() {
802
+ const view = session?.view;
803
+ if (!view?.requestAnimationFrame) {
804
+ flushScheduledUpdate();
805
+ return;
806
+ }
807
+ if (frameId !== void 0) return;
808
+ frameWindow = view;
809
+ frameId = view.requestAnimationFrame(onAnimationFrame);
810
+ }
811
+ function onGeometryChange() {
812
+ if (!session) return;
813
+ geometryDirty = true;
814
+ scheduleUpdate();
815
+ }
816
+ function stopDragging() {
817
+ const stoppedSession = session;
818
+ if (!stoppedSession) return;
819
+ stoppedSession.view?.removeEventListener("pointermove", onPointerMove);
820
+ stoppedSession.view?.removeEventListener("pointerup", onPointerEnd);
821
+ stoppedSession.view?.removeEventListener("pointercancel", onPointerEnd);
822
+ stoppedSession.view?.removeEventListener("resize", onGeometryChange);
823
+ stoppedSession.view?.removeEventListener("scroll", onGeometryChange, true);
824
+ cancelScheduledFrame();
825
+ pendingPointerEvent = void 0;
826
+ geometryDirty = false;
827
+ session = void 0;
828
+ options.endDrag(stoppedSession.thumb);
829
+ }
830
+ function switchDraggingThumb(nextThumb) {
831
+ const currentSession = session;
832
+ if (!currentSession || currentSession.thumb === nextThumb) return;
833
+ const previousThumb = currentSession.thumb;
834
+ currentSession.thumb = nextThumb;
835
+ options.transferDrag(previousThumb, nextThumb);
836
+ options.setActiveThumb(nextThumb);
837
+ options.transferFocusedThumb(currentSession.track, previousThumb, nextThumb);
838
+ }
839
+ function updateFromPointer(event) {
840
+ const currentSession = session;
841
+ if (!currentSession) return;
842
+ const value = options.getPointerValue(event, currentSession.geometry);
843
+ if (value == null) return;
844
+ switchDraggingThumb(options.updateThumb(currentSession.thumb, value, currentSession.anchorValue));
845
+ }
846
+ function isCurrentPointer(event) {
847
+ return session?.pointerId === void 0 || event.pointerId === session.pointerId;
848
+ }
849
+ function onPointerMove(event) {
850
+ if (!isCurrentPointer(event)) return;
851
+ if (!session) return;
852
+ pendingPointerEvent = event;
853
+ scheduleUpdate();
854
+ }
855
+ function onPointerEnd(event) {
856
+ if (!isCurrentPointer(event)) return;
857
+ if (event.type === "pointerup") flushScheduledUpdate();
858
+ stopDragging();
859
+ }
860
+ function onTrackPointerDown(event) {
861
+ if (options.disabled() || event.button !== 0 || event.isPrimary === false) return;
862
+ const track = event.currentTarget;
863
+ if (!track) return;
864
+ const geometry = options.getPointerGeometry(track);
865
+ if (geometry === void 0) return;
866
+ const pointerValue = options.getPointerValue(event, geometry);
867
+ if (pointerValue == null) return;
868
+ const thumb = options.getThumb(event, pointerValue);
869
+ event.preventDefault();
870
+ stopDragging();
871
+ options.setActiveThumb(thumb);
872
+ options.focusThumb(track, thumb);
873
+ session = {
874
+ view: track.ownerDocument.defaultView,
875
+ track,
876
+ geometry,
877
+ thumb,
878
+ anchorValue: options.getAnchorValue(thumb),
879
+ pointerId: Number.isFinite(event.pointerId) ? event.pointerId : void 0
880
+ };
881
+ options.startDrag(thumb);
882
+ switchDraggingThumb(options.updateThumb(thumb, pointerValue, session.anchorValue));
883
+ const view = session?.view;
884
+ view?.addEventListener("pointermove", onPointerMove);
885
+ view?.addEventListener("pointerup", onPointerEnd);
886
+ view?.addEventListener("pointercancel", onPointerEnd);
887
+ view?.addEventListener("resize", onGeometryChange);
888
+ view?.addEventListener("scroll", onGeometryChange, true);
889
+ }
890
+ onBeforeUnmount(stopDragging);
891
+ return { onTrackPointerDown };
892
+ }
893
+ //#endregion
894
+ //#region src/components/slider/useRangeSliderTooltipState.ts
895
+ function useRangeSliderTooltipState(options) {
896
+ const delayedTooltip = useDelayedOpen({
897
+ openDelay: () => options.openDelay.value,
898
+ disabled: () => options.mode.value !== "hover" || options.disabled()
899
+ });
900
+ const interactionReasons = ref({
901
+ lower: {
902
+ focus: false,
903
+ drag: false
904
+ },
905
+ upper: {
906
+ focus: false,
907
+ drag: false
908
+ }
909
+ });
910
+ const trackHovered = ref(false);
911
+ const dismissed = ref(false);
912
+ function hasThumbInteraction(thumb) {
913
+ const reasons = interactionReasons.value[thumb];
914
+ return reasons.focus || reasons.drag;
915
+ }
916
+ function hasAnyInteraction() {
917
+ return trackHovered.value || hasThumbInteraction("lower") || hasThumbInteraction("upper");
918
+ }
919
+ function sync() {
920
+ if (options.mode.value === "hover" && !options.disabled() && hasAnyInteraction() && !dismissed.value) {
921
+ delayedTooltip.open();
922
+ return;
923
+ }
924
+ delayedTooltip.closeImmediate();
925
+ }
926
+ function startInteraction(thumb, reason) {
927
+ options.setActiveThumb(thumb);
928
+ const wasActive = hasAnyInteraction();
929
+ const wasDismissed = dismissed.value;
930
+ interactionReasons.value[thumb][reason] = true;
931
+ dismissed.value = false;
932
+ if (!wasActive || wasDismissed) sync();
933
+ }
934
+ function endInteraction(thumb, reason) {
935
+ interactionReasons.value[thumb][reason] = false;
936
+ if (!hasAnyInteraction()) sync();
937
+ }
938
+ function transferInteraction(from, to, reason) {
939
+ if (!interactionReasons.value[from][reason]) return;
940
+ interactionReasons.value[from][reason] = false;
941
+ interactionReasons.value[to][reason] = true;
942
+ }
943
+ function onFocus(thumb) {
944
+ startInteraction(thumb, "focus");
945
+ }
946
+ function onBlur(thumb) {
947
+ endInteraction(thumb, "focus");
948
+ }
949
+ function onTrackMouseEnter() {
950
+ const wasActive = hasAnyInteraction();
951
+ const wasDismissed = dismissed.value;
952
+ trackHovered.value = true;
953
+ dismissed.value = false;
954
+ if (!wasActive || wasDismissed) sync();
955
+ }
956
+ function onTrackMouseLeave() {
957
+ trackHovered.value = false;
958
+ if (!hasAnyInteraction()) sync();
959
+ }
960
+ function onKeydown(thumb, event) {
961
+ options.setActiveThumb(thumb);
962
+ if (event.key === "Escape") {
963
+ dismissed.value = true;
964
+ delayedTooltip.closeImmediate();
965
+ return true;
966
+ }
967
+ if (dismissed.value) {
968
+ dismissed.value = false;
969
+ sync();
970
+ }
971
+ return false;
972
+ }
973
+ const visible = computed(() => options.mode.value !== false);
974
+ const alwaysVisible = computed(() => options.mode.value === "always");
975
+ const open = computed(() => alwaysVisible.value || options.mode.value === "hover" && delayedTooltip.isOpen.value && hasAnyInteraction() && !dismissed.value && !options.disabled());
976
+ watch([options.mode, options.disabled], sync);
977
+ return {
978
+ visible,
979
+ alwaysVisible,
980
+ open,
981
+ startInteraction,
982
+ endInteraction,
983
+ transferInteraction,
984
+ onFocus,
985
+ onBlur,
986
+ onTrackMouseEnter,
987
+ onTrackMouseLeave,
988
+ onKeydown
989
+ };
990
+ }
385
991
  //#endregion
386
992
  //#region src/components/slider/useRangeSlider.ts
387
- var rangeSliderMarkColorProperties = [
388
- "--_rp-range-slider-mark-color",
389
- "--_rp-range-slider-mark-label-color",
390
- "--_rp-range-slider-mark-filled-label-color",
391
- "--_rp-range-slider-mark-ring-color"
392
- ];
393
993
  function roundSliderNumber(value) {
394
994
  return Number(value.toFixed(10));
395
995
  }
@@ -438,36 +1038,6 @@ function getClosestRangeSliderThumb(value, range, activeThumb) {
438
1038
  if (upperDistance < lowerDistance) return "upper";
439
1039
  return activeThumb ?? "upper";
440
1040
  }
441
- function setRangeSliderStyleValue(style, property, value) {
442
- if (value) style[property] = value;
443
- }
444
- function getRangeSliderLengthValue(value) {
445
- if (value == null || value === "") return void 0;
446
- if (typeof value === "number") return Number.isFinite(value) ? `${value}px` : void 0;
447
- return value;
448
- }
449
- function getRangeSliderBorderValue(value) {
450
- if (value == null || value === "") return void 0;
451
- if (typeof value === "number") return Number.isFinite(value) ? `${value}px solid var(--_rp-range-slider-thumb-border)` : void 0;
452
- return value;
453
- }
454
- var rangeSliderThumbStyleProps = [
455
- [
456
- "--_rp-range-slider-thumb-size",
457
- "size",
458
- getRangeSliderLengthValue
459
- ],
460
- [
461
- "--_rp-range-slider-thumb-border-style",
462
- "border",
463
- getRangeSliderBorderValue
464
- ],
465
- [
466
- "--_rp-range-slider-thumb-padding",
467
- "padding",
468
- getRangeSliderLengthValue
469
- ]
470
- ];
471
1041
  function getRangeSliderTrackStyle(props, valuePercent) {
472
1042
  const [lowerPercent, upperPercent] = valuePercent;
473
1043
  const style = {
@@ -477,55 +1047,21 @@ function getRangeSliderTrackStyle(props, valuePercent) {
477
1047
  "--_rp-range-slider-upper-ratio": `${upperPercent / 100}`,
478
1048
  "--_rp-range-slider-tooltip-merged-percent": `${(lowerPercent + upperPercent) / 2}%`
479
1049
  };
480
- setRangeSliderStyleValue(style, "--_rp-range-slider-color", getComponentColorValue(props.color));
481
- for (const [property, propName, getValue] of rangeSliderThumbStyleProps) setRangeSliderStyleValue(style, property, getValue(props.thumbStyle?.[propName]));
482
- return style;
483
- }
484
- function getRangeSliderMarkStyle(percent, color) {
485
- const style = { "--_rp-range-slider-mark-position": `${percent}%` };
486
- const colorValue = getComponentColorValue(color);
487
- for (const property of rangeSliderMarkColorProperties) setRangeSliderStyleValue(style, property, colorValue);
488
- return style;
489
- }
490
- function normalizeRangeSliderMark(mark) {
491
- return typeof mark === "number" ? { value: mark } : mark;
492
- }
493
- function normalizeRangeSliderMarks(marks, min, max, value) {
494
- return (marks ?? []).flatMap((markInput, index) => {
495
- const mark = normalizeRangeSliderMark(markInput);
496
- if (mark.hidden) return [];
497
- const markValue = Number(mark.value);
498
- if (!Number.isFinite(markValue)) return [];
499
- const percent = getSliderValuePercent(markValue, min, max);
500
- return {
501
- key: `${markValue}-${index}`,
502
- value: markValue,
503
- label: mark.label,
504
- hasLabel: mark.label != null,
505
- filled: markValue >= value[0] && markValue <= value[1],
506
- style: getRangeSliderMarkStyle(percent, mark.color)
507
- };
1050
+ setSliderStyleValue(style, "--_rp-range-slider-color", getComponentColorValue(props.color));
1051
+ applySliderThumbStyle(style, props.thumbStyle, {
1052
+ size: "--_rp-range-slider-thumb-size",
1053
+ border: "--_rp-range-slider-thumb-border-style",
1054
+ padding: "--_rp-range-slider-thumb-padding",
1055
+ borderColor: "--_rp-range-slider-thumb-border"
508
1056
  });
1057
+ return style;
509
1058
  }
510
1059
  function getFormattedRangeSliderValue(value, formatter) {
511
- return formatter ? [formatter(value[0]), formatter(value[1])] : value;
512
- }
513
- function getRangeSliderEndpointValueText(value, ariaValueText, formatter) {
514
- if (typeof ariaValueText === "function") return String(ariaValueText(value));
515
- if (ariaValueText != null && ariaValueText !== "") return String(ariaValueText);
516
- if (formatter) return String(formatter(value));
1060
+ return [getFormattedSliderValue(value[0], formatter), getFormattedSliderValue(value[1], formatter)];
517
1061
  }
518
1062
  function getRangeSliderAriaValueText(value, ariaValueText, formatter) {
519
1063
  const endpointValues = Array.isArray(ariaValueText) ? ariaValueText : [ariaValueText, ariaValueText];
520
- return [getRangeSliderEndpointValueText(value[0], endpointValues[0], formatter), getRangeSliderEndpointValueText(value[1], endpointValues[1], formatter)];
521
- }
522
- function getRangeSliderTooltipOptions(tooltip) {
523
- return typeof tooltip === "object" ? tooltip : {};
524
- }
525
- function getRangeSliderTooltipMode(tooltip) {
526
- if (tooltip === false) return false;
527
- if (typeof tooltip === "object") return tooltip.mode ?? "hover";
528
- return tooltip;
1064
+ return [getSliderAriaValueText(value[0], endpointValues[0], formatter), getSliderAriaValueText(value[1], endpointValues[1], formatter)];
529
1065
  }
530
1066
  function getThumbIndex(thumb) {
531
1067
  return thumb === "lower" ? 0 : 1;
@@ -570,31 +1106,31 @@ function useRangeSlider(props, emitUpdate) {
570
1106
  if (normalizedMinRange.value === 0) return [bounds.value.max, bounds.value.max];
571
1107
  return [clamp(getStepValueAtOrBelow(normalizedValue.value[1] - normalizedMinRange.value, bounds.value.min, valueStep.value), bounds.value.min, bounds.value.max), bounds.value.max];
572
1108
  });
573
- const markItems = computed(() => normalizeRangeSliderMarks(props.marks, bounds.value.min, bounds.value.max, normalizedValue.value));
1109
+ const markItems = computed(() => createSliderMarkItems(props.marks, bounds.value.min, bounds.value.max, (value) => value >= normalizedValue.value[0] && value <= normalizedValue.value[1], {
1110
+ position: "--_rp-range-slider-mark-position",
1111
+ colors: [
1112
+ "--_rp-range-slider-mark-color",
1113
+ "--_rp-range-slider-mark-label-color",
1114
+ "--_rp-range-slider-mark-filled-label-color",
1115
+ "--_rp-range-slider-mark-ring-color"
1116
+ ]
1117
+ }));
574
1118
  const hasMarkLabels = computed(() => markItems.value.some((mark) => mark.hasLabel));
575
1119
  const trackStyle = computed(() => getRangeSliderTrackStyle(props, valuePercent.value));
576
- const tooltipOptions = computed(() => getRangeSliderTooltipOptions(props.tooltip));
577
- const tooltipMode = computed(() => getRangeSliderTooltipMode(props.tooltip));
1120
+ const tooltipOptions = computed(() => getSliderTooltipOptions(props.tooltip));
1121
+ const tooltipMode = computed(() => getSliderTooltipMode(props.tooltip));
578
1122
  const tooltipOpenDelay = computed(() => tooltipOptions.value.openDelay ?? 0);
579
- const delayedTooltip = useDelayedOpen({
580
- openDelay: () => tooltipOpenDelay.value,
581
- disabled: () => tooltipMode.value !== "hover" || control.disabled
582
- });
583
- const tooltipInteractionReasons = ref({
584
- lower: {
585
- focus: false,
586
- drag: false
587
- },
588
- upper: {
589
- focus: false,
590
- drag: false
1123
+ const tooltipState = useRangeSliderTooltipState({
1124
+ mode: tooltipMode,
1125
+ openDelay: tooltipOpenDelay,
1126
+ disabled: () => control.disabled,
1127
+ setActiveThumb: (thumb) => {
1128
+ activeThumb.value = thumb;
591
1129
  }
592
1130
  });
593
- const tooltipTrackHovered = ref(false);
594
- const tooltipDismissed = ref(false);
595
- const tooltipVisible = computed(() => tooltipMode.value !== false);
596
- const tooltipAlwaysVisible = computed(() => tooltipMode.value === "always");
597
- const tooltipOpen = computed(() => tooltipAlwaysVisible.value || tooltipMode.value === "hover" && delayedTooltip.isOpen.value && hasAnyTooltipInteractionReason() && !tooltipDismissed.value && !control.disabled);
1131
+ const tooltipVisible = tooltipState.visible;
1132
+ const tooltipAlwaysVisible = tooltipState.alwaysVisible;
1133
+ const tooltipOpen = tooltipState.open;
598
1134
  const tooltipPlacement = computed(() => tooltipOptions.value.placement ?? (props.orientation === "vertical" ? "left" : "top"));
599
1135
  const tooltipIds = computed(() => {
600
1136
  const baseId = tooltipOptions.value.id;
@@ -608,16 +1144,17 @@ function useRangeSlider(props, emitUpdate) {
608
1144
  const tooltipOffset = computed(() => tooltipOptions.value.offset);
609
1145
  const tooltipArrow = computed(() => tooltipOptions.value.arrow ?? false);
610
1146
  const tooltipContent = computed(() => [String(formattedValue.value[0]), String(formattedValue.value[1])]);
611
- const mergedTooltipContent = computed(() => `${tooltipContent.value[0]}–${tooltipContent.value[1]}`);
1147
+ const mergedTooltipContent = computed(() => {
1148
+ const [lower, upper] = tooltipContent.value;
1149
+ return lower === upper ? lower : `${lower}–${upper}`;
1150
+ });
612
1151
  const rootClass = computed(() => bem("rp-range-slider", {
613
1152
  [`size-${props.size}`]: Boolean(props.size),
614
1153
  vertical: props.orientation === "vertical",
615
1154
  marked: markItems.value.length > 0,
616
1155
  "marks-with-labels": hasMarkLabels.value,
617
1156
  "tooltip-always-visible": tooltipAlwaysVisible.value,
618
- disabled: control.disabled,
619
- invalid: control.invalid,
620
- valid: control.valid && !control.invalid
1157
+ disabled: control.disabled
621
1158
  }));
622
1159
  function getThumbUpdate(thumb, value, anchorValue = normalizedValue.value[getThumbIndex(getOppositeThumb(thumb))]) {
623
1160
  const safeValue = normalizeSliderValue(value, bounds.value.min, bounds.value.max, valueStep.value);
@@ -653,101 +1190,17 @@ function useRangeSlider(props, emitUpdate) {
653
1190
  const input = event.target;
654
1191
  transferFocusedThumb(input, thumb, updateThumb(thumb, input.valueAsNumber));
655
1192
  }
656
- function hasThumbTooltipInteractionReason(thumb) {
657
- const reasons = tooltipInteractionReasons.value[thumb];
658
- return reasons.focus || reasons.drag;
659
- }
660
- function hasAnyTooltipInteractionReason() {
661
- return tooltipTrackHovered.value || hasThumbTooltipInteractionReason("lower") || hasThumbTooltipInteractionReason("upper");
662
- }
663
- function syncTooltip() {
664
- if (tooltipMode.value === "hover" && !control.disabled && hasAnyTooltipInteractionReason() && !tooltipDismissed.value) {
665
- delayedTooltip.open();
666
- return;
667
- }
668
- delayedTooltip.closeImmediate();
669
- }
670
- function startTooltipInteraction(thumb, reason) {
671
- activeThumb.value = thumb;
672
- const wasActive = hasAnyTooltipInteractionReason();
673
- const wasDismissed = tooltipDismissed.value;
674
- tooltipInteractionReasons.value[thumb][reason] = true;
675
- tooltipDismissed.value = false;
676
- if (!wasActive || wasDismissed) syncTooltip();
677
- }
678
- function endTooltipInteraction(thumb, reason) {
679
- tooltipInteractionReasons.value[thumb][reason] = false;
680
- if (!hasAnyTooltipInteractionReason()) syncTooltip();
681
- }
682
1193
  function transferFocusedThumb(input, thumb, nextThumb) {
683
1194
  if (thumb === nextThumb || input.ownerDocument.activeElement !== input) return;
684
1195
  const track = input.closest(".rp-range-slider__track");
685
1196
  if (!track) return;
686
1197
  const nextInput = getThumbInput(track, nextThumb);
687
1198
  if (!nextInput) return;
688
- const currentReasons = tooltipInteractionReasons.value[thumb];
689
- if (currentReasons.focus) {
690
- currentReasons.focus = false;
691
- tooltipInteractionReasons.value[nextThumb].focus = true;
692
- }
1199
+ tooltipState.transferInteraction(thumb, nextThumb, "focus");
693
1200
  nextInput.focus({ preventScroll: true });
694
1201
  }
695
- function resetTooltipInteractionReasons(thumb) {
696
- const reasons = tooltipInteractionReasons.value[thumb];
697
- reasons.focus = false;
698
- reasons.drag = false;
699
- }
700
- function clearTooltipInteractions(thumb) {
701
- resetTooltipInteractionReasons(thumb);
702
- syncTooltip();
703
- }
704
- function resumeDismissedTooltip(thumb) {
705
- activeThumb.value = thumb;
706
- if (!tooltipDismissed.value) return;
707
- tooltipDismissed.value = false;
708
- syncTooltip();
709
- }
710
- function dismissTooltip() {
711
- tooltipDismissed.value = true;
712
- delayedTooltip.closeImmediate();
713
- }
714
- function onTooltipFocus(thumb) {
715
- startTooltipInteraction(thumb, "focus");
716
- }
717
- function onTooltipBlur(thumb) {
718
- endTooltipInteraction(thumb, "focus");
719
- }
720
- function onTooltipTrackMouseEnter() {
721
- const wasActive = hasAnyTooltipInteractionReason();
722
- const wasDismissed = tooltipDismissed.value;
723
- tooltipTrackHovered.value = true;
724
- tooltipDismissed.value = false;
725
- if (!wasActive || wasDismissed) syncTooltip();
726
- }
727
- function onTooltipTrackMouseLeave() {
728
- tooltipTrackHovered.value = false;
729
- if (!hasAnyTooltipInteractionReason()) syncTooltip();
730
- }
731
- function openTooltip(thumb) {
732
- startTooltipInteraction(thumb, "focus");
733
- }
734
- function closeTooltip(thumb) {
735
- if (thumb) {
736
- clearTooltipInteractions(thumb);
737
- return;
738
- }
739
- resetTooltipInteractionReasons("lower");
740
- resetTooltipInteractionReasons("upper");
741
- tooltipTrackHovered.value = false;
742
- syncTooltip();
743
- }
744
1202
  function onTooltipKeydown(thumb, event) {
745
- activeThumb.value = thumb;
746
- if (event.key === "Escape") {
747
- dismissTooltip();
748
- return;
749
- }
750
- resumeDismissedTooltip(thumb);
1203
+ if (tooltipState.onKeydown(thumb, event)) return;
751
1204
  if (!hasManualNativeKeyboard.value || valueStep.value === "any") return;
752
1205
  const index = getThumbIndex(thumb);
753
1206
  const currentValue = normalizedValue.value[index];
@@ -780,88 +1233,42 @@ function useRangeSlider(props, emitUpdate) {
780
1233
  const nextThumb = updateThumb(thumb, nextValue);
781
1234
  transferFocusedThumb(event.target, thumb, nextThumb);
782
1235
  }
783
- function getValueFromPointer(event, track) {
1236
+ function getPointerGeometry(track) {
784
1237
  const vertical = props.orientation === "vertical";
785
- const trackRect = track.getBoundingClientRect();
786
1238
  const thumbsRect = track.querySelector(".rp-range-slider__thumbs")?.getBoundingClientRect();
787
- const rect = thumbsRect && (vertical ? thumbsRect.height > 0 : thumbsRect.width > 0) ? thumbsRect : trackRect;
1239
+ const rect = thumbsRect && (vertical ? thumbsRect.height > 0 : thumbsRect.width > 0) ? thumbsRect : track.getBoundingClientRect();
788
1240
  const length = vertical ? rect.height : rect.width;
789
1241
  if (length <= 0) return void 0;
790
- const ratio = clamp((vertical ? rect.bottom - event.clientY : event.clientX - rect.left) / length, 0, 1);
791
- return bounds.value.min + ratio * (bounds.value.max - bounds.value.min);
792
- }
793
- let dragWindow = null;
794
- let dragTrack = null;
795
- let dragThumb = null;
796
- let dragAnchorValue = null;
797
- let dragPointerId;
798
- function stopDragging() {
799
- const stoppedThumb = dragThumb;
800
- if (dragWindow) {
801
- dragWindow.removeEventListener("pointermove", onPointerMove);
802
- dragWindow.removeEventListener("pointerup", onPointerEnd);
803
- dragWindow.removeEventListener("pointercancel", onPointerEnd);
804
- }
805
- dragWindow = null;
806
- dragTrack = null;
807
- dragThumb = null;
808
- dragAnchorValue = null;
809
- dragPointerId = void 0;
810
- if (stoppedThumb) endTooltipInteraction(stoppedThumb, "drag");
811
- }
812
- function switchDraggingThumb(track, nextThumb) {
813
- const previousThumb = dragThumb;
814
- if (!previousThumb || previousThumb === nextThumb) return;
815
- tooltipInteractionReasons.value[previousThumb].drag = false;
816
- tooltipInteractionReasons.value[nextThumb].drag = true;
817
- dragThumb = nextThumb;
818
- activeThumb.value = nextThumb;
819
- const previousInput = getThumbInput(track, previousThumb);
820
- if (previousInput) transferFocusedThumb(previousInput, previousThumb, nextThumb);
821
- }
822
- function updateFromPointer(event, track) {
823
- const value = getValueFromPointer(event, track);
824
- if (value == null || !dragThumb) return;
825
- switchDraggingThumb(track, updateThumb(dragThumb, value, dragAnchorValue ?? normalizedValue.value[getThumbIndex(getOppositeThumb(dragThumb))]));
826
- }
827
- function onPointerMove(event) {
828
- if (dragPointerId !== void 0 && event.pointerId !== dragPointerId) return;
829
- if (!dragTrack || !dragThumb) {
830
- stopDragging();
831
- return;
832
- }
833
- updateFromPointer(event, dragTrack);
834
- }
835
- function onPointerEnd(event) {
836
- if (dragPointerId !== void 0 && event.pointerId !== dragPointerId) return;
837
- stopDragging();
1242
+ return {
1243
+ length,
1244
+ start: vertical ? rect.bottom : rect.left,
1245
+ vertical
1246
+ };
838
1247
  }
839
- function onTrackPointerDown(event) {
840
- if (control.disabled || event.button !== 0 || event.isPrimary === false) return;
841
- const track = event.currentTarget;
842
- if (!track) return;
843
- const pointerValue = getValueFromPointer(event, track);
844
- if (pointerValue == null) return;
845
- const thumb = getThumbFromTarget(event.target) ?? getClosestRangeSliderThumb(pointerValue, normalizedValue.value, activeThumb.value);
846
- event.preventDefault();
847
- stopDragging();
848
- activeThumb.value = thumb;
849
- focusThumb(track, thumb);
850
- dragTrack = track;
851
- dragThumb = thumb;
852
- dragAnchorValue = normalizedValue.value[getThumbIndex(getOppositeThumb(thumb))];
853
- dragPointerId = Number.isFinite(event.pointerId) ? event.pointerId : void 0;
854
- dragWindow = track.ownerDocument.defaultView;
855
- startTooltipInteraction(thumb, "drag");
856
- updateFromPointer(event, track);
857
- dragWindow?.addEventListener("pointermove", onPointerMove);
858
- dragWindow?.addEventListener("pointerup", onPointerEnd);
859
- dragWindow?.addEventListener("pointercancel", onPointerEnd);
1248
+ function getValueFromPointer(event, geometry) {
1249
+ const pointerPosition = geometry.vertical ? event.clientY : event.clientX;
1250
+ const ratio = clamp((geometry.vertical ? geometry.start - pointerPosition : pointerPosition - geometry.start) / geometry.length, 0, 1);
1251
+ return bounds.value.min + ratio * (bounds.value.max - bounds.value.min);
860
1252
  }
861
- watch([tooltipMode, () => control.disabled], () => {
862
- syncTooltip();
1253
+ const { onTrackPointerDown } = useRangeSliderPointer({
1254
+ disabled: () => control.disabled,
1255
+ getPointerGeometry,
1256
+ getPointerValue: getValueFromPointer,
1257
+ getThumb: (event, value) => getThumbFromTarget(event.target) ?? getClosestRangeSliderThumb(value, normalizedValue.value, activeThumb.value),
1258
+ getAnchorValue: (thumb) => normalizedValue.value[getThumbIndex(getOppositeThumb(thumb))],
1259
+ setActiveThumb: (thumb) => {
1260
+ activeThumb.value = thumb;
1261
+ },
1262
+ focusThumb,
1263
+ updateThumb,
1264
+ transferFocusedThumb: (track, from, to) => {
1265
+ const input = getThumbInput(track, from);
1266
+ if (input) transferFocusedThumb(input, from, to);
1267
+ },
1268
+ startDrag: (thumb) => tooltipState.startInteraction(thumb, "drag"),
1269
+ endDrag: (thumb) => tooltipState.endInteraction(thumb, "drag"),
1270
+ transferDrag: (from, to) => tooltipState.transferInteraction(from, to, "drag")
863
1271
  });
864
- onBeforeUnmount(stopDragging);
865
1272
  return {
866
1273
  control,
867
1274
  nativeMin,
@@ -891,321 +1298,24 @@ function useRangeSlider(props, emitUpdate) {
891
1298
  mergedTooltipContent,
892
1299
  onInput,
893
1300
  onTrackPointerDown,
894
- onTooltipFocus,
895
- onTooltipBlur,
896
- onTooltipTrackMouseEnter,
897
- onTooltipTrackMouseLeave,
898
- openTooltip,
899
- closeTooltip,
1301
+ onTooltipFocus: tooltipState.onFocus,
1302
+ onTooltipBlur: tooltipState.onBlur,
1303
+ onTooltipTrackMouseEnter: tooltipState.onTrackMouseEnter,
1304
+ onTooltipTrackMouseLeave: tooltipState.onTrackMouseLeave,
900
1305
  onTooltipKeydown
901
1306
  };
902
1307
  }
903
1308
  //#endregion
904
- //#region src/components/slider/useRangeSliderTooltipCollision.ts
905
- var TOOLTIP_COLLISION_GAP = 4;
906
- var TOOLTIP_COLLISION_RELEASE_GAP = 8;
907
- var TOOLTIP_CONTENT_SELECTOR$1 = ".rp-tooltip__content";
908
- function areRangeSliderTooltipRectsOverlapping(lower, upper, gap = TOOLTIP_COLLISION_GAP) {
909
- if (lower.width <= 0 || lower.height <= 0 || upper.width <= 0 || upper.height <= 0) return false;
910
- return lower.left < upper.right + gap && lower.right + gap > upper.left && lower.top < upper.bottom + gap && lower.bottom + gap > upper.top;
911
- }
912
- function useRangeSliderTooltipCollision(root) {
913
- const tooltipsOverlapping = ref(false);
914
- const observedElements = /* @__PURE__ */ new Set();
915
- let resizeObserver;
916
- let frameWindow;
917
- let frameId;
918
- let microtaskQueued = false;
919
- let destroyed = false;
920
- function setOverlapping(value) {
921
- if (tooltipsOverlapping.value !== value) tooltipsOverlapping.value = value;
922
- }
923
- function getTooltipContents(el) {
924
- return [el.querySelector(`.rp-range-slider__tooltip--lower ${TOOLTIP_CONTENT_SELECTOR$1}`), el.querySelector(`.rp-range-slider__tooltip--upper ${TOOLTIP_CONTENT_SELECTOR$1}`)];
925
- }
926
- function measure() {
927
- if (destroyed) return;
928
- const el = root.value;
929
- if (!el) {
930
- setOverlapping(false);
931
- return;
932
- }
933
- const [lower, upper] = getTooltipContents(el);
934
- if (!lower || !upper) {
935
- setOverlapping(false);
936
- return;
937
- }
938
- const view = el.ownerDocument.defaultView;
939
- if (!view || view.getComputedStyle(lower).display === "none" || view.getComputedStyle(upper).display === "none") {
940
- setOverlapping(false);
941
- return;
942
- }
943
- setOverlapping(areRangeSliderTooltipRectsOverlapping(lower.getBoundingClientRect(), upper.getBoundingClientRect(), tooltipsOverlapping.value ? TOOLTIP_COLLISION_RELEASE_GAP : TOOLTIP_COLLISION_GAP));
944
- }
945
- function scheduleMeasure() {
946
- if (destroyed || frameId != null || microtaskQueued) return;
947
- const view = root.value?.ownerDocument.defaultView;
948
- if (view?.requestAnimationFrame) {
949
- frameWindow = view;
950
- frameId = view.requestAnimationFrame(() => {
951
- frameId = void 0;
952
- frameWindow = void 0;
953
- measure();
954
- });
955
- return;
956
- }
957
- microtaskQueued = true;
958
- queueMicrotask(() => {
959
- microtaskQueued = false;
960
- measure();
961
- });
962
- }
963
- function refreshObservedElements() {
964
- if (!resizeObserver) return;
965
- const el = root.value;
966
- const nextElements = /* @__PURE__ */ new Set();
967
- if (el) {
968
- nextElements.add(el);
969
- for (const tooltip of getTooltipContents(el)) if (tooltip) nextElements.add(tooltip);
970
- }
971
- for (const observed of observedElements) if (!nextElements.has(observed)) resizeObserver.unobserve(observed);
972
- for (const next of nextElements) if (!observedElements.has(next)) resizeObserver.observe(next);
973
- observedElements.clear();
974
- for (const next of nextElements) observedElements.add(next);
975
- }
976
- function onWindowResize() {
977
- scheduleMeasure();
978
- }
979
- onMounted(() => {
980
- const view = root.value?.ownerDocument.defaultView;
981
- if (view?.ResizeObserver) resizeObserver = new view.ResizeObserver(scheduleMeasure);
982
- view?.addEventListener("resize", onWindowResize);
983
- refreshObservedElements();
984
- scheduleMeasure();
985
- });
986
- onUpdated(() => {
987
- refreshObservedElements();
988
- scheduleMeasure();
989
- });
990
- onBeforeUnmount(() => {
991
- destroyed = true;
992
- (root.value?.ownerDocument.defaultView)?.removeEventListener("resize", onWindowResize);
993
- resizeObserver?.disconnect();
994
- observedElements.clear();
995
- if (frameId != null) frameWindow?.cancelAnimationFrame(frameId);
996
- });
997
- return { tooltipsOverlapping };
998
- }
999
- //#endregion
1000
- //#region src/components/slider/useRangeSliderTooltipTransition.ts
1001
- var DEFAULT_TRANSITION_DURATION = 150;
1002
- var DEFAULT_TRANSITION_EASING = "ease";
1003
- var TOOLTIP_CONTENT_SELECTOR = ".rp-tooltip__content";
1004
- var TRANSITION_EASING_PATTERN = /(?:cubic-bezier|linear|steps)\([^)]*\)|\b(?:ease-in-out|ease-in|ease-out|ease|linear|step-end|step-start)\b/;
1005
- function getTooltip(root, kind) {
1006
- return root.querySelector(`.rp-range-slider__tooltip--${kind}`);
1007
- }
1008
- function getTooltipCenter(tooltip) {
1009
- const content = tooltip.querySelector(TOOLTIP_CONTENT_SELECTOR);
1010
- if (!content) return;
1011
- const rect = content.getBoundingClientRect();
1012
- if (rect.width <= 0 || rect.height <= 0) return;
1013
- return {
1014
- x: rect.left + rect.width / 2,
1015
- y: rect.top + rect.height / 2
1016
- };
1017
- }
1018
- function getTooltipSnapshot(tooltip) {
1019
- const center = getTooltipCenter(tooltip);
1020
- if (!center) return;
1021
- const opacity = Number.parseFloat(tooltip.ownerDocument.defaultView.getComputedStyle(tooltip).opacity);
1022
- return {
1023
- center,
1024
- opacity: Number.isFinite(opacity) ? opacity : 0
1025
- };
1026
- }
1027
- function getCarrierKind(root) {
1028
- return root.dataset.activeThumb === "lower" ? "upper" : "lower";
1029
- }
1030
- function getTransitionOptions(root) {
1031
- const transition = root.ownerDocument.defaultView.getComputedStyle(root).getPropertyValue("--rp-transition-fast").trim();
1032
- const durationMatch = transition.match(/([\d.]+)(ms|s)/);
1033
- if (!durationMatch) return {
1034
- duration: DEFAULT_TRANSITION_DURATION,
1035
- easing: DEFAULT_TRANSITION_EASING
1036
- };
1037
- const durationValue = Number.parseFloat(durationMatch[1]);
1038
- return {
1039
- duration: durationMatch[2] === "s" ? durationValue * 1e3 : durationValue,
1040
- easing: transition.match(TRANSITION_EASING_PATTERN)?.[0] ?? DEFAULT_TRANSITION_EASING
1041
- };
1042
- }
1043
- function prefersReducedMotion(root) {
1044
- return root.ownerDocument.defaultView?.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
1045
- }
1046
- function getTranslate(from, base) {
1047
- return `translate3d(${from.x - base.x}px, ${from.y - base.y}px, 0)`;
1048
- }
1049
- function useRangeSliderTooltipTransition(root, tooltipsOverlapping, value, activeThumb) {
1050
- const animations = /* @__PURE__ */ new Set();
1051
- let inferredCarrier;
1052
- let frozenMergedContent;
1053
- let frozenMergedTooltip;
1054
- let heldSplitOpacity = [];
1055
- let transitionId = 0;
1056
- watch(activeThumb, () => {
1057
- inferredCarrier = void 0;
1058
- }, { flush: "sync" });
1059
- watch(value, (next, previous) => {
1060
- const lowerMoved = next[0] !== previous[0];
1061
- if (lowerMoved !== (next[1] !== previous[1])) inferredCarrier = lowerMoved ? "upper" : "lower";
1062
- else inferredCarrier = void 0;
1063
- }, { flush: "sync" });
1064
- function clearFrozenMergedPosition() {
1065
- if (frozenMergedTooltip) {
1066
- frozenMergedTooltip.style.removeProperty("left");
1067
- frozenMergedTooltip.style.removeProperty("top");
1068
- }
1069
- if (frozenMergedContent) {
1070
- const { element, height, width } = frozenMergedContent;
1071
- if (width) element.style.width = width;
1072
- else element.style.removeProperty("width");
1073
- if (height) element.style.height = height;
1074
- else element.style.removeProperty("height");
1075
- }
1076
- frozenMergedTooltip = void 0;
1077
- frozenMergedContent = void 0;
1078
- }
1079
- function freezeMergedPosition(merged) {
1080
- const style = merged.ownerDocument.defaultView.getComputedStyle(merged);
1081
- const content = merged.querySelector(TOOLTIP_CONTENT_SELECTOR);
1082
- merged.style.left = style.left;
1083
- merged.style.top = style.top;
1084
- frozenMergedTooltip = merged;
1085
- if (content) {
1086
- const rect = content.getBoundingClientRect();
1087
- frozenMergedContent = {
1088
- element: content,
1089
- height: content.style.height,
1090
- width: content.style.width
1091
- };
1092
- content.style.width = `${rect.width}px`;
1093
- content.style.height = `${rect.height}px`;
1094
- }
1095
- }
1096
- function clearHeldSplitOpacity() {
1097
- for (const { element, opacity } of heldSplitOpacity) if (opacity) element.style.opacity = opacity;
1098
- else element.style.removeProperty("opacity");
1099
- heldSplitOpacity = [];
1100
- }
1101
- function holdSplitOpacity(merged, endpoints) {
1102
- heldSplitOpacity = [merged, ...endpoints].map((element) => ({
1103
- element,
1104
- opacity: element.style.opacity
1105
- }));
1106
- merged.style.opacity = "1";
1107
- for (const endpoint of endpoints) endpoint.style.opacity = "0";
1108
- }
1109
- function cancelAnimations() {
1110
- for (const animation of animations) animation.cancel();
1111
- animations.clear();
1112
- }
1113
- function animate(element, keyframes, options, onComplete) {
1114
- let animation;
1115
- try {
1116
- animation = element.animate(keyframes, options);
1117
- } catch {
1118
- try {
1119
- animation = element.animate(keyframes, {
1120
- duration: DEFAULT_TRANSITION_DURATION,
1121
- easing: DEFAULT_TRANSITION_EASING
1122
- });
1123
- } catch {
1124
- onComplete?.();
1125
- return;
1126
- }
1127
- }
1128
- animations.add(animation);
1129
- let completed = false;
1130
- const removeAnimation = () => {
1131
- if (completed) return;
1132
- completed = true;
1133
- animations.delete(animation);
1134
- onComplete?.();
1135
- };
1136
- animation.addEventListener("cancel", removeAnimation, { once: true });
1137
- animation.addEventListener("finish", removeAnimation, { once: true });
1138
- }
1139
- watch(tooltipsOverlapping, async (overlapping) => {
1140
- const el = root.value;
1141
- if (!el) return;
1142
- const lower = getTooltip(el, "lower");
1143
- const upper = getTooltip(el, "upper");
1144
- const merged = getTooltip(el, "merged");
1145
- const carrier = getTooltip(el, inferredCarrier ?? getCarrierKind(el));
1146
- inferredCarrier = void 0;
1147
- if (!lower || !upper || !merged || !carrier) return;
1148
- const snapshots = /* @__PURE__ */ new Map();
1149
- for (const tooltip of [
1150
- lower,
1151
- upper,
1152
- merged
1153
- ]) {
1154
- const snapshot = getTooltipSnapshot(tooltip);
1155
- if (snapshot) snapshots.set(tooltip, snapshot);
1156
- }
1157
- const carrierSnapshot = snapshots.get(carrier);
1158
- const mergedSnapshot = snapshots.get(merged);
1159
- const currentTransitionId = ++transitionId;
1160
- await nextTick();
1161
- if (currentTransitionId !== transitionId || root.value !== el) return;
1162
- cancelAnimations();
1163
- clearFrozenMergedPosition();
1164
- clearHeldSplitOpacity();
1165
- if (typeof merged.animate !== "function" || prefersReducedMotion(el)) return;
1166
- const { duration, easing } = getTransitionOptions(el);
1167
- if (duration <= 0) return;
1168
- if (!overlapping) {
1169
- freezeMergedPosition(merged);
1170
- holdSplitOpacity(merged, [lower, upper]);
1171
- }
1172
- const mergedBaseCenter = getTooltipCenter(merged);
1173
- const carrierCenter = getTooltipCenter(carrier);
1174
- if (!mergedBaseCenter || !carrierCenter) {
1175
- clearFrozenMergedPosition();
1176
- clearHeldSplitOpacity();
1177
- return;
1178
- }
1179
- const options = {
1180
- duration,
1181
- easing
1182
- };
1183
- const releaseFrozenPosition = overlapping ? void 0 : () => {
1184
- if (currentTransitionId !== transitionId) return;
1185
- clearFrozenMergedPosition();
1186
- clearHeldSplitOpacity();
1187
- };
1188
- const mergedStartCenter = mergedSnapshot && mergedSnapshot.opacity > 0 ? mergedSnapshot.center : carrierSnapshot?.center ?? carrierCenter;
1189
- const mergedEndCenter = overlapping ? mergedBaseCenter : carrierCenter;
1190
- animate(merged, [{ transform: getTranslate(mergedStartCenter, mergedBaseCenter) }, { transform: getTranslate(mergedEndCenter, mergedBaseCenter) }], options, releaseFrozenPosition);
1191
- }, { flush: "pre" });
1192
- onBeforeUnmount(() => {
1193
- transitionId += 1;
1194
- cancelAnimations();
1195
- clearFrozenMergedPosition();
1196
- clearHeldSplitOpacity();
1197
- });
1198
- }
1199
- //#endregion
1200
1309
  //#region src/components/slider/range-slider.vue?vue&type=script&setup=true&vapor=true&lang.ts
1201
- var t0 = template("<span data-v-3fdd312a class=rp-range-slider__label>");
1202
- var t1 = template("<span data-v-3fdd312a class=rp-range-slider__value aria-hidden=true>");
1203
- var t2 = template("<span data-v-3fdd312a class=rp-range-slider__header>");
1204
- var t3 = template("<span data-v-3fdd312a class=rp-range-slider__mark-label> ");
1205
- var t4 = template("<span data-v-3fdd312a><span data-v-3fdd312a class=rp-range-slider__mark-dot></span>");
1206
- var t5 = template("<span data-v-3fdd312a class=rp-range-slider__marks aria-hidden=true>");
1207
- var t6 = template("<span data-v-3fdd312a class=rp-range-slider__tooltip-anchor>", 2);
1208
- var t7 = template("<div data-v-3fdd312a role=group><span data-v-3fdd312a class=rp-range-slider__track><span data-v-3fdd312a class=rp-range-slider__bar aria-hidden=true></span><input data-v-3fdd312a class=\"rp-range-slider__native rp-range-slider__native--lower\"type=range><input data-v-3fdd312a class=\"rp-range-slider__native rp-range-slider__native--upper\"type=range><!><span data-v-3fdd312a class=rp-range-slider__thumbs aria-hidden=true><span data-v-3fdd312a class=\"rp-range-slider__thumb rp-range-slider__thumb--lower\"data-range-slider-thumb=lower><span data-v-3fdd312a class=rp-range-slider__thumb-content></span></span><span data-v-3fdd312a class=\"rp-range-slider__thumb rp-range-slider__thumb--upper\"data-range-slider-thumb=upper><span data-v-3fdd312a class=rp-range-slider__thumb-content>", 1);
1310
+ var t0 = template("<span data-v-8dd81f55 class=rp-range-slider__label>");
1311
+ var t1 = template("<span data-v-8dd81f55 class=rp-range-slider__value aria-hidden=true>");
1312
+ var t2 = template("<span data-v-8dd81f55 class=rp-range-slider__header>");
1313
+ var t3 = template("<input data-v-8dd81f55 type=range>");
1314
+ var t4 = template("<span data-v-8dd81f55 class=rp-range-slider__mark-label> ");
1315
+ var t5 = template("<span data-v-8dd81f55><span data-v-8dd81f55 class=rp-range-slider__mark-dot></span>");
1316
+ var t6 = template("<span data-v-8dd81f55 class=rp-range-slider__marks aria-hidden=true>");
1317
+ var t7 = template("<span data-v-8dd81f55><span data-v-8dd81f55 class=rp-range-slider__thumb-content>");
1318
+ var t8 = template("<div data-v-8dd81f55 role=group><span data-v-8dd81f55 class=rp-range-slider__track><span data-v-8dd81f55 class=rp-range-slider__bar aria-hidden=true></span><!><span data-v-8dd81f55 class=rp-range-slider__thumbs aria-hidden=true>", 1);
1209
1319
  delegateEvents("input", "keydown", "pointerdown");
1210
1320
  //#endregion
1211
1321
  //#region src/components/slider/range-slider.vue
@@ -1240,18 +1350,6 @@ var range_slider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
1240
1350
  type: Boolean,
1241
1351
  default: void 0
1242
1352
  },
1243
- required: {
1244
- type: Boolean,
1245
- default: void 0
1246
- },
1247
- invalid: {
1248
- type: Boolean,
1249
- default: void 0
1250
- },
1251
- valid: {
1252
- type: Boolean,
1253
- default: void 0
1254
- },
1255
1353
  describedby: {},
1256
1354
  labelledby: {}
1257
1355
  },
@@ -1261,43 +1359,33 @@ var range_slider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
1261
1359
  const emit = __emit;
1262
1360
  const slots = useSlots();
1263
1361
  const generatedId = useId();
1264
- const rangeSliderRef = ref(null);
1362
+ const tooltipsOverlapping = ref(false);
1363
+ const rangeSliderThumbs = ["lower", "upper"];
1265
1364
  const labelId = computed(() => `${props.id ?? generatedId}-label`);
1266
- const { control, nativeMin, nativeMax, nativeStep, nativeNames, nativeIds, rootClass, normalizedValue, valuePercent, formattedValue, ariaLabels, ariaValueText, markItems, trackStyle, activeThumb, tooltipVisible, tooltipOpen, tooltipPlacement, tooltipIds, mergedTooltipId, tooltipColor, tooltipOffset, tooltipOpenDelay, tooltipArrow, tooltipContent, mergedTooltipContent, onInput, onTrackPointerDown, onTooltipFocus, onTooltipBlur, onTooltipTrackMouseEnter, onTooltipTrackMouseLeave, onTooltipKeydown } = useRangeSlider(props, (value) => {
1365
+ const { control, nativeMin, nativeMax, nativeStep, nativeNames, nativeIds, rootClass, normalizedValue, valuePercent, formattedValue, ariaLabels, ariaValueText, markItems, trackStyle, activeThumb, tooltipVisible, tooltipOpen, tooltipPlacement, tooltipIds, mergedTooltipId, tooltipColor, tooltipOffset, tooltipArrow, tooltipContent, mergedTooltipContent, onInput, onTrackPointerDown, onTooltipFocus, onTooltipBlur, onTooltipTrackMouseEnter, onTooltipTrackMouseLeave, onTooltipKeydown } = useRangeSlider(props, (value) => {
1267
1366
  emit("update:modelValue", value);
1268
1367
  });
1269
- const { tooltipsOverlapping } = useRangeSliderTooltipCollision(rangeSliderRef);
1270
- useRangeSliderTooltipTransition(rangeSliderRef, tooltipsOverlapping, normalizedValue, activeThumb);
1271
1368
  const groupLabelledby = computed(() => {
1272
1369
  const values = [control.ariaLabelledby, slots.default ? labelId.value : void 0].flatMap((value) => value?.split(/\s+/) ?? []).filter(Boolean);
1273
1370
  return values.length ? Array.from(new Set(values)).join(" ") : void 0;
1274
1371
  });
1275
- const _setTemplateRef = createTemplateRefSetter();
1276
- const n43 = t7();
1277
- const n42 = child(n43, 1);
1278
- const n11 = next(child(n42), 1);
1279
- const n12 = next(n11, 2);
1280
- const n41 = next(n12, 3);
1281
- const n40 = next(n41, 4);
1282
- const n28 = child(n40);
1283
- const n23 = child(n28);
1284
- const n35 = next(n28, 1);
1285
- const n30 = child(n35);
1372
+ const n34 = t8();
1373
+ const n33 = child(n34, 1);
1374
+ const n32 = next(child(n33), 1);
1375
+ const n31 = next(n32, 3);
1286
1376
  renderEffect(() => {
1287
1377
  const _control = unref(control);
1288
- setClass(n43, [unref(rootClass), {
1378
+ setClass(n34, [unref(rootClass), {
1289
1379
  "rp-range-slider--custom-thumb": $slots.thumb,
1290
- "rp-range-slider--tooltips-overlapping": unref(tooltipsOverlapping)
1380
+ "rp-range-slider--tooltips-overlapping": tooltipsOverlapping.value
1291
1381
  }]);
1292
- setAttr(n43, "data-active-thumb", unref(activeThumb));
1293
- setAttr(n43, "data-disabled", _control.disabled || void 0);
1294
- setStyle(n43, unref(trackStyle));
1295
- setAttr(n43, "aria-labelledby", groupLabelledby.value);
1296
- setAttr(n43, "aria-describedby", _control.ariaDescribedby);
1297
- setAttr(n43, "aria-invalid", _control.invalid || void 0);
1298
- setAttr(n43, "aria-required", _control.required || void 0);
1382
+ setAttr(n34, "data-active-thumb", unref(activeThumb));
1383
+ setAttr(n34, "data-disabled", _control.disabled || void 0);
1384
+ setStyle(n34, unref(trackStyle));
1385
+ setAttr(n34, "aria-labelledby", groupLabelledby.value);
1386
+ setAttr(n34, "aria-describedby", _control.ariaDescribedby);
1299
1387
  });
1300
- setInsertionState(n43, 0, 0);
1388
+ setInsertionState(n34, 0, 0);
1301
1389
  createIf(() => $slots.default || $slots.value, () => {
1302
1390
  const n10 = t2();
1303
1391
  setInsertionState(n10, null, 0);
@@ -1321,155 +1409,95 @@ var range_slider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
1321
1409
  });
1322
1410
  return n10;
1323
1411
  });
1324
- n11.$evtinput = createInvoker(($event) => unref(onInput)("lower", $event));
1325
- on(n11, "focus", () => unref(onTooltipFocus)("lower"));
1326
- on(n11, "blur", () => unref(onTooltipBlur)("lower"));
1327
- n11.$evtkeydown = createInvoker(($event) => unref(onTooltipKeydown)("lower", $event));
1328
- n12.$evtinput = createInvoker(($event) => unref(onInput)("upper", $event));
1329
- on(n12, "focus", () => unref(onTooltipFocus)("upper"));
1330
- on(n12, "blur", () => unref(onTooltipBlur)("upper"));
1331
- n12.$evtkeydown = createInvoker(($event) => unref(onTooltipKeydown)("upper", $event));
1332
- renderEffect(() => {
1333
- const _nativeIds = unref(nativeIds);
1334
- const _nativeNames = unref(nativeNames);
1335
- const _normalizedValue = unref(normalizedValue);
1336
- const _nativeMin = unref(nativeMin);
1337
- const _nativeMax = unref(nativeMax);
1338
- const _nativeStep = unref(nativeStep);
1339
- const _control = unref(control);
1340
- const _ariaLabels = unref(ariaLabels);
1341
- const _ariaValueText = unref(ariaValueText);
1342
- const _control_disabled = _control.disabled;
1343
- const _control_required = _control.required;
1344
- const _control_ariaDescribedby = _control.ariaDescribedby;
1345
- const _control_invalid = _control.invalid;
1346
- setProp(n11, "id", _nativeIds[0]);
1347
- setProp(n11, "name", _nativeNames[0]);
1348
- setValue(n11, _normalizedValue[0]);
1349
- setProp(n11, "min", _nativeMin[0]);
1350
- setProp(n11, "max", _nativeMax[0]);
1351
- setProp(n11, "step", _nativeStep);
1352
- setProp(n11, "orient", __props.orientation === "vertical" ? "vertical" : void 0);
1353
- setProp(n11, "disabled", _control_disabled || void 0);
1354
- setProp(n11, "required", _control_required || void 0);
1355
- setAttr(n11, "aria-label", _ariaLabels[0]);
1356
- setAttr(n11, "aria-describedby", _control_ariaDescribedby);
1357
- setAttr(n11, "aria-orientation", __props.orientation === "vertical" ? "vertical" : void 0);
1358
- setAttr(n11, "aria-invalid", _control_invalid || void 0);
1359
- setAttr(n11, "aria-required", _control_required || void 0);
1360
- setAttr(n11, "aria-valuetext", _ariaValueText[0]);
1361
- setProp(n12, "id", _nativeIds[1]);
1362
- setProp(n12, "name", _nativeNames[1]);
1363
- setValue(n12, _normalizedValue[1]);
1364
- setProp(n12, "min", _nativeMin[1]);
1365
- setProp(n12, "max", _nativeMax[1]);
1366
- setProp(n12, "step", _nativeStep);
1367
- setProp(n12, "orient", __props.orientation === "vertical" ? "vertical" : void 0);
1368
- setProp(n12, "disabled", _control_disabled || void 0);
1369
- setProp(n12, "required", _control_required || void 0);
1370
- setAttr(n12, "aria-label", _ariaLabels[1]);
1371
- setAttr(n12, "aria-describedby", _control_ariaDescribedby);
1372
- setAttr(n12, "aria-orientation", __props.orientation === "vertical" ? "vertical" : void 0);
1373
- setAttr(n12, "aria-invalid", _control_invalid || void 0);
1374
- setAttr(n12, "aria-required", _control_required || void 0);
1375
- setAttr(n12, "aria-valuetext", _ariaValueText[1]);
1376
- });
1377
- setInsertionState(n42, n41, 3);
1412
+ setInsertionState(n33, n32, 1);
1413
+ createFor(() => rangeSliderThumbs, (_for_item0, _for_key0) => {
1414
+ const n13 = t3();
1415
+ n13.$evtinput = createInvoker(($event) => unref(onInput)(_for_item0.value, $event));
1416
+ on(n13, "focus", () => unref(onTooltipFocus)(_for_item0.value));
1417
+ on(n13, "blur", () => unref(onTooltipBlur)(_for_item0.value));
1418
+ n13.$evtkeydown = createInvoker(($event) => unref(onTooltipKeydown)(_for_item0.value, $event));
1419
+ let _index, _control;
1420
+ renderEffect(() => {
1421
+ _index = _for_key0.value;
1422
+ _control = unref(control);
1423
+ setProp(n13, "id", unref(nativeIds)[_index]);
1424
+ setProp(n13, "name", unref(nativeNames)[_index]);
1425
+ setValue(n13, unref(normalizedValue)[_index]);
1426
+ setProp(n13, "min", unref(nativeMin)[_index]);
1427
+ setProp(n13, "max", unref(nativeMax)[_index]);
1428
+ setProp(n13, "step", unref(nativeStep));
1429
+ setProp(n13, "orient", __props.orientation === "vertical" ? "vertical" : void 0);
1430
+ setProp(n13, "disabled", _control.disabled || void 0);
1431
+ setAttr(n13, "aria-label", unref(ariaLabels)[_index]);
1432
+ setAttr(n13, "aria-describedby", _control.ariaDescribedby);
1433
+ setAttr(n13, "aria-orientation", __props.orientation === "vertical" ? "vertical" : void 0);
1434
+ setAttr(n13, "aria-valuetext", unref(ariaValueText)[_index]);
1435
+ });
1436
+ setClass(n13, ["rp-range-slider__native", `rp-range-slider__native--${_for_item0.value}`]);
1437
+ return n13;
1438
+ }, (thumb, index) => thumb, 8);
1439
+ setInsertionState(n33, n32, 2);
1378
1440
  createIf(() => unref(markItems).length, () => {
1379
- const n21 = t5();
1380
- setInsertionState(n21, null, 0);
1441
+ const n22 = t6();
1442
+ setInsertionState(n22, null, 0);
1381
1443
  createFor(() => unref(markItems), (_for_item0) => {
1382
- const n20 = t4();
1444
+ const n21 = t5();
1383
1445
  renderEffect(() => {
1384
1446
  const _mark = _for_item0.value;
1385
- setClassName(n20, _mark.filled ? 1 : 0, " rp-range-slider__mark--filled", "rp-range-slider__mark");
1386
- setStyle(n20, _mark.style);
1447
+ setClassName(n21, _mark.filled ? 1 : 0, " rp-range-slider__mark--filled", "rp-range-slider__mark");
1448
+ setStyle(n21, _mark.style);
1387
1449
  });
1388
- setInsertionState(n20, null, 1);
1450
+ setInsertionState(n21, null, 1);
1389
1451
  createIf(() => _for_item0.value.hasLabel, () => {
1390
- const n19 = t3();
1391
- const x19 = txt(n19);
1392
- renderEffect(() => setText(x19, toDisplayString(_for_item0.value.label)));
1393
- return n19;
1452
+ const n20 = t4();
1453
+ const x20 = txt(n20);
1454
+ renderEffect(() => setText(x20, toDisplayString(_for_item0.value.label)));
1455
+ return n20;
1394
1456
  });
1395
- return n20;
1457
+ return n21;
1396
1458
  }, (mark) => mark.key, 9);
1397
- return n21;
1459
+ return n22;
1398
1460
  });
1399
- setInsertionState(n23, null, 0);
1400
- createSlot("thumb", {
1401
- thumb: "lower",
1402
- index: "0",
1403
- value: () => unref(normalizedValue)[0],
1404
- formattedValue: () => unref(formattedValue)[0],
1405
- percent: () => unref(valuePercent)[0]
1406
- }, null, 1);
1407
- setInsertionState(n28, null, 1);
1461
+ setInsertionState(n31, null, 0);
1462
+ createFor(() => rangeSliderThumbs, (_for_item0, _for_key0) => {
1463
+ const n27 = t7();
1464
+ const n26 = child(n27);
1465
+ renderEffect(() => setAttr(n27, "data-range-slider-thumb", _for_item0.value));
1466
+ setInsertionState(n26, null, 0);
1467
+ createSlot("thumb", {
1468
+ thumb: () => _for_item0.value,
1469
+ index: () => _for_key0.value,
1470
+ value: () => unref(normalizedValue)[_for_key0.value],
1471
+ formattedValue: () => unref(formattedValue)[_for_key0.value],
1472
+ percent: () => unref(valuePercent)[_for_key0.value]
1473
+ }, null, 1);
1474
+ setClass(n27, ["rp-range-slider__thumb", `rp-range-slider__thumb--${_for_item0.value}`]);
1475
+ return n27;
1476
+ }, (thumb, index) => thumb, 8);
1477
+ setInsertionState(n31, null, 1);
1408
1478
  createIf(() => unref(tooltipVisible), () => {
1409
- return createComponent(tooltip_default, {
1410
- id: () => unref(tooltipIds)[0],
1411
- class: "rp-range-slider__tooltip rp-range-slider__tooltip--lower",
1412
- content: () => unref(tooltipContent)[0],
1413
- placement: () => unref(tooltipPlacement),
1414
- color: () => unref(tooltipColor),
1415
- offset: () => unref(tooltipOffset),
1416
- open: () => unref(tooltipOpen),
1417
- "open-delay": () => unref(tooltipOpenDelay),
1479
+ const _on_update_overlapping = ($event) => tooltipsOverlapping.value = $event;
1480
+ return createComponent(range_slider_tooltip_default, {
1418
1481
  arrow: () => unref(tooltipArrow),
1419
- decorative: ""
1420
- }, () => {
1421
- return t6();
1422
- });
1423
- });
1424
- setInsertionState(n30, null, 0);
1425
- createSlot("thumb", {
1426
- thumb: "upper",
1427
- index: "1",
1428
- value: () => unref(normalizedValue)[1],
1429
- formattedValue: () => unref(formattedValue)[1],
1430
- percent: () => unref(valuePercent)[1]
1431
- }, null, 1);
1432
- setInsertionState(n35, null, 1);
1433
- createIf(() => unref(tooltipVisible), () => {
1434
- return createComponent(tooltip_default, {
1435
- id: () => unref(tooltipIds)[1],
1436
- class: "rp-range-slider__tooltip rp-range-slider__tooltip--upper",
1437
- content: () => unref(tooltipContent)[1],
1438
- placement: () => unref(tooltipPlacement),
1439
1482
  color: () => unref(tooltipColor),
1483
+ content: () => unref(tooltipContent),
1484
+ ids: () => unref(tooltipIds),
1485
+ "merged-content": () => unref(mergedTooltipContent),
1486
+ "merged-id": () => unref(mergedTooltipId),
1440
1487
  offset: () => unref(tooltipOffset),
1441
1488
  open: () => unref(tooltipOpen),
1442
- "open-delay": () => unref(tooltipOpenDelay),
1443
- arrow: () => unref(tooltipArrow),
1444
- decorative: ""
1445
- }, () => {
1446
- return t6();
1447
- });
1448
- });
1449
- setInsertionState(n40, null, 2);
1450
- createIf(() => unref(tooltipVisible), () => {
1451
- return createComponent(tooltip_default, {
1452
- id: () => unref(mergedTooltipId),
1453
- class: "rp-range-slider__tooltip rp-range-slider__tooltip--merged",
1454
- content: () => unref(mergedTooltipContent),
1489
+ orientation: () => __props.orientation,
1455
1490
  placement: () => unref(tooltipPlacement),
1456
- color: () => unref(tooltipColor),
1457
- offset: () => unref(tooltipOffset),
1458
- open: () => unref(tooltipOpen),
1459
- "open-delay": () => unref(tooltipOpenDelay),
1460
- arrow: () => unref(tooltipArrow),
1461
- decorative: ""
1462
- }, () => {
1463
- return t6();
1491
+ "value-percent": () => unref(valuePercent),
1492
+ "onUpdate:overlapping": () => _on_update_overlapping
1464
1493
  });
1465
1494
  });
1466
- n42.$evtpointerdown = createInvoker((e) => unref(onTrackPointerDown)(e));
1467
- on(n42, "mouseenter", (e) => unref(onTooltipTrackMouseEnter)(e));
1468
- on(n42, "mouseleave", (e) => unref(onTooltipTrackMouseLeave)(e));
1469
- _setTemplateRef(n43, rangeSliderRef, null, "rangeSliderRef");
1470
- return n43;
1495
+ n33.$evtpointerdown = createInvoker((e) => unref(onTrackPointerDown)(e));
1496
+ on(n33, "mouseenter", (e) => unref(onTooltipTrackMouseEnter)(e));
1497
+ on(n33, "mouseleave", (e) => unref(onTooltipTrackMouseLeave)(e));
1498
+ return n34;
1471
1499
  }
1472
- }), [["__scopeId", "data-v-3fdd312a"]]);
1500
+ }), [["__scopeId", "data-v-8dd81f55"]]);
1473
1501
  //#endregion
1474
1502
  //#region src/components/slider/types.ts
1475
1503
  var sliderColors = componentColors;