index.jsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import { generateProps, generateEmits } from '../helper/component-util'
  2. import { componentScheme } from './component.scheme'
  3. import { computed, h, inject } from 'vue'
  4. import { ElIcon } from 'element-plus'
  5. import * as Icons from '@element-plus/icons-vue'
  6. import './index.less'
  7. export default {
  8. name: 'CipTimelineItem',
  9. props: generateProps(componentScheme),
  10. emits: generateEmits(componentScheme),
  11. setup (props, { slots }) {
  12. const mode = inject('cip-timeline-mode', {})
  13. const positionClass = mode === 'right' ? 'right' : ''
  14. const isHollow = computed(() => {
  15. return props.hollow ? 'node-dot' : 'node'
  16. })
  17. const colorStyle = { '--bgColor': props.color }
  18. const currentIcon = computed(() => {
  19. if (!props.icon) return
  20. return Icons[props.icon]
  21. })
  22. return () =>
  23. <li class={['cip-timeline-item', positionClass]}>
  24. <div class="cip-timeline-item__tail"></div>
  25. {props.icon && <ElIcon color={props.color}>
  26. {h(currentIcon.value)}
  27. </ElIcon>}
  28. {!props.icon && <div class={[
  29. 'cip-timeline-item__node',
  30. 'cip-timeline-item__node--normal',
  31. isHollow.value]} style={colorStyle}></div>
  32. }
  33. <div class="cip-timeline-item__wrapper">
  34. <div class="cip-timeline-item__title">{props.title}</div>
  35. <div class="cip-timeline-item__timestamp">{props.timestamp}</div>
  36. <div class="cip-timeline-item__desc">{slots.default?.()}</div>
  37. </div>
  38. </li>
  39. }
  40. }