VSliderTrack.mjs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import { createVNode as _createVNode } from "vue";
  2. // Styles
  3. import "./VSliderTrack.css";
  4. // Components
  5. import { VSliderSymbol } from "./slider.mjs"; // Composables
  6. import { useBackgroundColor } from "../../composables/color.mjs";
  7. import { makeComponentProps } from "../../composables/component.mjs";
  8. import { useRounded } from "../../composables/rounded.mjs"; // Utilities
  9. import { computed, inject } from 'vue';
  10. import { convertToUnit, genericComponent, propsFactory, useRender } from "../../util/index.mjs"; // Types
  11. export const makeVSliderTrackProps = propsFactory({
  12. start: {
  13. type: Number,
  14. required: true
  15. },
  16. stop: {
  17. type: Number,
  18. required: true
  19. },
  20. ...makeComponentProps()
  21. }, 'VSliderTrack');
  22. export const VSliderTrack = genericComponent()({
  23. name: 'VSliderTrack',
  24. props: makeVSliderTrackProps(),
  25. emits: {},
  26. setup(props, _ref) {
  27. let {
  28. slots
  29. } = _ref;
  30. const slider = inject(VSliderSymbol);
  31. if (!slider) throw new Error('[Vuetify] v-slider-track must be inside v-slider or v-range-slider');
  32. const {
  33. color,
  34. parsedTicks,
  35. rounded,
  36. showTicks,
  37. tickSize,
  38. trackColor,
  39. trackFillColor,
  40. trackSize,
  41. vertical,
  42. min,
  43. max,
  44. indexFromEnd
  45. } = slider;
  46. const {
  47. roundedClasses
  48. } = useRounded(rounded);
  49. const {
  50. backgroundColorClasses: trackFillColorClasses,
  51. backgroundColorStyles: trackFillColorStyles
  52. } = useBackgroundColor(trackFillColor);
  53. const {
  54. backgroundColorClasses: trackColorClasses,
  55. backgroundColorStyles: trackColorStyles
  56. } = useBackgroundColor(trackColor);
  57. const startDir = computed(() => `inset-${vertical.value ? 'block' : 'inline'}-${indexFromEnd.value ? 'end' : 'start'}`);
  58. const endDir = computed(() => vertical.value ? 'height' : 'width');
  59. const backgroundStyles = computed(() => {
  60. return {
  61. [startDir.value]: '0%',
  62. [endDir.value]: '100%'
  63. };
  64. });
  65. const trackFillWidth = computed(() => props.stop - props.start);
  66. const trackFillStyles = computed(() => {
  67. return {
  68. [startDir.value]: convertToUnit(props.start, '%'),
  69. [endDir.value]: convertToUnit(trackFillWidth.value, '%')
  70. };
  71. });
  72. const computedTicks = computed(() => {
  73. if (!showTicks.value) return [];
  74. const ticks = vertical.value ? parsedTicks.value.slice().reverse() : parsedTicks.value;
  75. return ticks.map((tick, index) => {
  76. const directionValue = tick.value !== min.value && tick.value !== max.value ? convertToUnit(tick.position, '%') : undefined;
  77. return _createVNode("div", {
  78. "key": tick.value,
  79. "class": ['v-slider-track__tick', {
  80. 'v-slider-track__tick--filled': tick.position >= props.start && tick.position <= props.stop,
  81. 'v-slider-track__tick--first': tick.value === min.value,
  82. 'v-slider-track__tick--last': tick.value === max.value
  83. }],
  84. "style": {
  85. [startDir.value]: directionValue
  86. }
  87. }, [(tick.label || slots['tick-label']) && _createVNode("div", {
  88. "class": "v-slider-track__tick-label"
  89. }, [slots['tick-label']?.({
  90. tick,
  91. index
  92. }) ?? tick.label])]);
  93. });
  94. });
  95. useRender(() => {
  96. return _createVNode("div", {
  97. "class": ['v-slider-track', roundedClasses.value, props.class],
  98. "style": [{
  99. '--v-slider-track-size': convertToUnit(trackSize.value),
  100. '--v-slider-tick-size': convertToUnit(tickSize.value)
  101. }, props.style]
  102. }, [_createVNode("div", {
  103. "class": ['v-slider-track__background', trackColorClasses.value, {
  104. 'v-slider-track__background--opacity': !!color.value || !trackFillColor.value
  105. }],
  106. "style": {
  107. ...backgroundStyles.value,
  108. ...trackColorStyles.value
  109. }
  110. }, null), _createVNode("div", {
  111. "class": ['v-slider-track__fill', trackFillColorClasses.value],
  112. "style": {
  113. ...trackFillStyles.value,
  114. ...trackFillColorStyles.value
  115. }
  116. }, null), showTicks.value && _createVNode("div", {
  117. "class": ['v-slider-track__ticks', {
  118. 'v-slider-track__ticks--always-show': showTicks.value === 'always'
  119. }]
  120. }, [computedTicks.value])]);
  121. });
  122. return {};
  123. }
  124. });
  125. //# sourceMappingURL=VSliderTrack.mjs.map