VSlider.mjs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import { mergeProps as _mergeProps, createVNode as _createVNode, Fragment as _Fragment } from "vue";
  2. // Styles
  3. import "./VSlider.css";
  4. // Components
  5. import { VSliderThumb } from "./VSliderThumb.mjs";
  6. import { VSliderTrack } from "./VSliderTrack.mjs";
  7. import { makeVInputProps, VInput } from "../VInput/VInput.mjs";
  8. import { VLabel } from "../VLabel/index.mjs"; // Composables
  9. import { makeSliderProps, useSlider, useSteps } from "./slider.mjs";
  10. import { makeFocusProps, useFocus } from "../../composables/focus.mjs";
  11. import { useRtl } from "../../composables/locale.mjs";
  12. import { useProxiedModel } from "../../composables/proxiedModel.mjs"; // Utilities
  13. import { computed, ref } from 'vue';
  14. import { genericComponent, propsFactory, useRender } from "../../util/index.mjs"; // Types
  15. export const makeVSliderProps = propsFactory({
  16. ...makeFocusProps(),
  17. ...makeSliderProps(),
  18. ...makeVInputProps(),
  19. modelValue: {
  20. type: [Number, String],
  21. default: 0
  22. }
  23. }, 'VSlider');
  24. export const VSlider = genericComponent()({
  25. name: 'VSlider',
  26. props: makeVSliderProps(),
  27. emits: {
  28. 'update:focused': value => true,
  29. 'update:modelValue': v => true,
  30. start: value => true,
  31. end: value => true
  32. },
  33. setup(props, _ref) {
  34. let {
  35. slots,
  36. emit
  37. } = _ref;
  38. const thumbContainerRef = ref();
  39. const {
  40. rtlClasses
  41. } = useRtl();
  42. const steps = useSteps(props);
  43. const model = useProxiedModel(props, 'modelValue', undefined, value => {
  44. return steps.roundValue(value == null ? steps.min.value : value);
  45. });
  46. const {
  47. min,
  48. max,
  49. mousePressed,
  50. roundValue,
  51. onSliderMousedown,
  52. onSliderTouchstart,
  53. trackContainerRef,
  54. position,
  55. hasLabels,
  56. readonly
  57. } = useSlider({
  58. props,
  59. steps,
  60. onSliderStart: () => {
  61. emit('start', model.value);
  62. },
  63. onSliderEnd: _ref2 => {
  64. let {
  65. value
  66. } = _ref2;
  67. const roundedValue = roundValue(value);
  68. model.value = roundedValue;
  69. emit('end', roundedValue);
  70. },
  71. onSliderMove: _ref3 => {
  72. let {
  73. value
  74. } = _ref3;
  75. return model.value = roundValue(value);
  76. },
  77. getActiveThumb: () => thumbContainerRef.value?.$el
  78. });
  79. const {
  80. isFocused,
  81. focus,
  82. blur
  83. } = useFocus(props);
  84. const trackStop = computed(() => position(model.value));
  85. useRender(() => {
  86. const inputProps = VInput.filterProps(props);
  87. const hasPrepend = !!(props.label || slots.label || slots.prepend);
  88. return _createVNode(VInput, _mergeProps({
  89. "class": ['v-slider', {
  90. 'v-slider--has-labels': !!slots['tick-label'] || hasLabels.value,
  91. 'v-slider--focused': isFocused.value,
  92. 'v-slider--pressed': mousePressed.value,
  93. 'v-slider--disabled': props.disabled
  94. }, rtlClasses.value, props.class],
  95. "style": props.style
  96. }, inputProps, {
  97. "focused": isFocused.value
  98. }), {
  99. ...slots,
  100. prepend: hasPrepend ? slotProps => _createVNode(_Fragment, null, [slots.label?.(slotProps) ?? (props.label ? _createVNode(VLabel, {
  101. "id": slotProps.id.value,
  102. "class": "v-slider__label",
  103. "text": props.label
  104. }, null) : undefined), slots.prepend?.(slotProps)]) : undefined,
  105. default: _ref4 => {
  106. let {
  107. id,
  108. messagesId
  109. } = _ref4;
  110. return _createVNode("div", {
  111. "class": "v-slider__container",
  112. "onMousedown": !readonly.value ? onSliderMousedown : undefined,
  113. "onTouchstartPassive": !readonly.value ? onSliderTouchstart : undefined
  114. }, [_createVNode("input", {
  115. "id": id.value,
  116. "name": props.name || id.value,
  117. "disabled": !!props.disabled,
  118. "readonly": !!props.readonly,
  119. "tabindex": "-1",
  120. "value": model.value
  121. }, null), _createVNode(VSliderTrack, {
  122. "ref": trackContainerRef,
  123. "start": 0,
  124. "stop": trackStop.value
  125. }, {
  126. 'tick-label': slots['tick-label']
  127. }), _createVNode(VSliderThumb, {
  128. "ref": thumbContainerRef,
  129. "aria-describedby": messagesId.value,
  130. "focused": isFocused.value,
  131. "min": min.value,
  132. "max": max.value,
  133. "modelValue": model.value,
  134. "onUpdate:modelValue": v => model.value = v,
  135. "position": trackStop.value,
  136. "elevation": props.elevation,
  137. "onFocus": focus,
  138. "onBlur": blur,
  139. "ripple": props.ripple,
  140. "name": props.name
  141. }, {
  142. 'thumb-label': slots['thumb-label']
  143. })]);
  144. }
  145. });
  146. });
  147. return {};
  148. }
  149. });
  150. //# sourceMappingURL=VSlider.mjs.map