VTimelineItem.mjs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { resolveDirective as _resolveDirective, createVNode as _createVNode } from "vue";
  2. // Components
  3. import { VTimelineDivider } from "./VTimelineDivider.mjs"; // Composables
  4. import { makeComponentProps } from "../../composables/component.mjs";
  5. import { makeDimensionProps, useDimension } from "../../composables/dimensions.mjs";
  6. import { makeElevationProps } from "../../composables/elevation.mjs";
  7. import { IconValue } from "../../composables/icons.mjs";
  8. import { makeRoundedProps } from "../../composables/rounded.mjs";
  9. import { makeSizeProps } from "../../composables/size.mjs";
  10. import { makeTagProps } from "../../composables/tag.mjs"; // Utilities
  11. import { ref, shallowRef, watch } from 'vue';
  12. import { convertToUnit, genericComponent, propsFactory, useRender } from "../../util/index.mjs"; // Types
  13. // Types
  14. export const makeVTimelineItemProps = propsFactory({
  15. density: String,
  16. dotColor: String,
  17. fillDot: Boolean,
  18. hideDot: Boolean,
  19. hideOpposite: {
  20. type: Boolean,
  21. default: undefined
  22. },
  23. icon: IconValue,
  24. iconColor: String,
  25. lineInset: [Number, String],
  26. ...makeComponentProps(),
  27. ...makeDimensionProps(),
  28. ...makeElevationProps(),
  29. ...makeRoundedProps(),
  30. ...makeSizeProps(),
  31. ...makeTagProps()
  32. }, 'VTimelineItem');
  33. export const VTimelineItem = genericComponent()({
  34. name: 'VTimelineItem',
  35. props: makeVTimelineItemProps(),
  36. setup(props, _ref) {
  37. let {
  38. slots
  39. } = _ref;
  40. const {
  41. dimensionStyles
  42. } = useDimension(props);
  43. const dotSize = shallowRef(0);
  44. const dotRef = ref();
  45. watch(dotRef, newValue => {
  46. if (!newValue) return;
  47. dotSize.value = newValue.$el.querySelector('.v-timeline-divider__dot')?.getBoundingClientRect().width ?? 0;
  48. }, {
  49. flush: 'post'
  50. });
  51. useRender(() => _createVNode("div", {
  52. "class": ['v-timeline-item', {
  53. 'v-timeline-item--fill-dot': props.fillDot
  54. }, props.class],
  55. "style": [{
  56. '--v-timeline-dot-size': convertToUnit(dotSize.value),
  57. '--v-timeline-line-inset': props.lineInset ? `calc(var(--v-timeline-dot-size) / 2 + ${convertToUnit(props.lineInset)})` : convertToUnit(0)
  58. }, props.style]
  59. }, [_createVNode("div", {
  60. "class": "v-timeline-item__body",
  61. "style": dimensionStyles.value
  62. }, [slots.default?.()]), _createVNode(VTimelineDivider, {
  63. "ref": dotRef,
  64. "hideDot": props.hideDot,
  65. "icon": props.icon,
  66. "iconColor": props.iconColor,
  67. "size": props.size,
  68. "elevation": props.elevation,
  69. "dotColor": props.dotColor,
  70. "fillDot": props.fillDot,
  71. "rounded": props.rounded
  72. }, {
  73. default: slots.icon
  74. }), props.density !== 'compact' && _createVNode("div", {
  75. "class": "v-timeline-item__opposite"
  76. }, [!props.hideOpposite && slots.opposite?.()])]));
  77. return {};
  78. }
  79. });
  80. //# sourceMappingURL=VTimelineItem.mjs.map