| <template> | |
| <svg width="100%" height="100%" viewBox="0 0 100 10"> | |
| <defs> | |
| <LinePointMarker | |
| v-if="markers && markers[0]" | |
| :id="id" | |
| position="start" | |
| :type="markers[0]" | |
| :color="color" | |
| :baseSize="width" | |
| /> | |
| <LinePointMarker | |
| v-if="markers && markers[1]" | |
| :id="id" | |
| position="end" | |
| :type="markers[1]" | |
| :color="color" | |
| :baseSize="width" | |
| /> | |
| </defs> | |
| <line | |
| :x1="padding" | |
| :y1="5" | |
| :x2="100 - padding" | |
| :y2="5" | |
| :stroke="color" | |
| :stroke-width="width" | |
| :stroke-dasharray="lineDashArray" | |
| :marker-start="markers && markers[0] ? `url(#${id}-${markers[0]}-start)` : ''" | |
| :marker-end="markers && markers[1] ? `url(#${id}-${markers[1]}-end)` : ''" | |
| /> | |
| </svg> | |
| </template> | |
| <script lang="ts" setup> | |
| import { computed, onMounted, ref } from 'vue' | |
| import { nanoid } from 'nanoid' | |
| import type { LinePoint, LineStyleType } from '@/types/slides' | |
| import LinePointMarker from '@/views/components/element/LineElement/LinePointMarker.vue' | |
| const props = withDefaults(defineProps<{ | |
| width?: number | |
| color?: string | |
| markers?: [LinePoint, LinePoint] | |
| type?: LineStyleType | |
| padding?: number | |
| }>(), { | |
| width: 2, | |
| color: '#333', | |
| padding: 0 | |
| }) | |
| const id = ref('') | |
| onMounted(() => { | |
| id.value = nanoid() | |
| }) | |
| const lineDashArray = computed(() => { | |
| const size = props.width | |
| if (props.type === 'dashed') return size <= 8 ? `${size * 5} ${size * 2.5}` : `${size * 5} ${size * 1.5}` | |
| if (props.type === 'dotted') return size <= 8 ? `${size * 1.8} ${size * 1.6}` : `${size * 1.5} ${size * 1.2}` | |
| return '0 0' | |
| }) | |
| </script> | |
| <style lang="scss" scoped> | |
| </style> |