VTimeline.mjs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import { createVNode as _createVNode, resolveDirective as _resolveDirective } from "vue";
  2. // Styles
  3. import "./VTimeline.css";
  4. // Composables
  5. import { makeComponentProps } from "../../composables/component.mjs";
  6. import { provideDefaults } from "../../composables/defaults.mjs";
  7. import { makeDensityProps, useDensity } from "../../composables/density.mjs";
  8. import { useRtl } from "../../composables/locale.mjs";
  9. import { makeTagProps } from "../../composables/tag.mjs";
  10. import { makeThemeProps, provideTheme } from "../../composables/theme.mjs"; // Utilities
  11. import { computed, toRef } from 'vue';
  12. import { convertToUnit, genericComponent, only, propsFactory, useRender } from "../../util/index.mjs"; // Types
  13. import { makeVTimelineItemProps } from "./VTimelineItem.mjs";
  14. export const makeVTimelineProps = propsFactory({
  15. align: {
  16. type: String,
  17. default: 'center',
  18. validator: v => ['center', 'start'].includes(v)
  19. },
  20. direction: {
  21. type: String,
  22. default: 'vertical',
  23. validator: v => ['vertical', 'horizontal'].includes(v)
  24. },
  25. justify: {
  26. type: String,
  27. default: 'auto',
  28. validator: v => ['auto', 'center'].includes(v)
  29. },
  30. side: {
  31. type: String,
  32. validator: v => v == null || ['start', 'end'].includes(v)
  33. },
  34. lineThickness: {
  35. type: [String, Number],
  36. default: 2
  37. },
  38. lineColor: String,
  39. truncateLine: {
  40. type: String,
  41. validator: v => ['start', 'end', 'both'].includes(v)
  42. },
  43. ...only(makeVTimelineItemProps({
  44. lineInset: 0
  45. }), ['dotColor', 'fillDot', 'hideOpposite', 'iconColor', 'lineInset', 'size']),
  46. ...makeComponentProps(),
  47. ...makeDensityProps(),
  48. ...makeTagProps(),
  49. ...makeThemeProps()
  50. }, 'VTimeline');
  51. export const VTimeline = genericComponent()({
  52. name: 'VTimeline',
  53. props: makeVTimelineProps(),
  54. setup(props, _ref) {
  55. let {
  56. slots
  57. } = _ref;
  58. const {
  59. themeClasses
  60. } = provideTheme(props);
  61. const {
  62. densityClasses
  63. } = useDensity(props);
  64. const {
  65. rtlClasses
  66. } = useRtl();
  67. provideDefaults({
  68. VTimelineDivider: {
  69. lineColor: toRef(props, 'lineColor')
  70. },
  71. VTimelineItem: {
  72. density: toRef(props, 'density'),
  73. dotColor: toRef(props, 'dotColor'),
  74. fillDot: toRef(props, 'fillDot'),
  75. hideOpposite: toRef(props, 'hideOpposite'),
  76. iconColor: toRef(props, 'iconColor'),
  77. lineColor: toRef(props, 'lineColor'),
  78. lineInset: toRef(props, 'lineInset'),
  79. size: toRef(props, 'size')
  80. }
  81. });
  82. const sideClasses = computed(() => {
  83. const side = props.side ? props.side : props.density !== 'default' ? 'end' : null;
  84. return side && `v-timeline--side-${side}`;
  85. });
  86. const truncateClasses = computed(() => {
  87. const classes = ['v-timeline--truncate-line-start', 'v-timeline--truncate-line-end'];
  88. switch (props.truncateLine) {
  89. case 'both':
  90. return classes;
  91. case 'start':
  92. return classes[0];
  93. case 'end':
  94. return classes[1];
  95. default:
  96. return null;
  97. }
  98. });
  99. useRender(() => _createVNode(props.tag, {
  100. "class": ['v-timeline', `v-timeline--${props.direction}`, `v-timeline--align-${props.align}`, `v-timeline--justify-${props.justify}`, truncateClasses.value, {
  101. 'v-timeline--inset-line': !!props.lineInset
  102. }, themeClasses.value, densityClasses.value, sideClasses.value, rtlClasses.value, props.class],
  103. "style": [{
  104. '--v-timeline-line-thickness': convertToUnit(props.lineThickness)
  105. }, props.style]
  106. }, slots));
  107. return {};
  108. }
  109. });
  110. //# sourceMappingURL=VTimeline.mjs.map