| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- <template>
- <div class="line-pool">
- <div class="category" v-for="(item, i) in LINE_LIST" :key="item.type">
- <div class="category-name">{{item.type}}</div>
- <div class="line-list">
- <div class="line-item" v-for="(line, j) in item.children" :key="j">
- <div class="line-content" @click="selectLine(line)">
- <svg
- overflow="visible"
- width="20"
- height="20"
- >
- <defs>
- <LinePointMarker
- class="line-marker"
- v-if="line.points[0]"
- :id="`preset-line-${i}-${j}`"
- position="start"
- :type="line.points[0]"
- color="currentColor"
- :baseSize="2"
- />
- <LinePointMarker
- class="line-marker"
- v-if="line.points[1]"
- :id="`preset-line-${i}-${j}`"
- position="end"
- :type="line.points[1]"
- color="currentColor"
- :baseSize="2"
- />
- </defs>
- <path
- class="line-path"
- :d="line.path"
- stroke="currentColor"
- fill="none"
- stroke-width="2"
- :stroke-dasharray="line.style === 'solid' ? '0, 0' : '4, 1'"
- :marker-start="line.points[0] ? `url(#${`preset-line-${i}-${j}`}-${line.points[0]}-start)` : ''"
- :marker-end="line.points[1] ? `url(#${`preset-line-${i}-${j}`}-${line.points[1]}-end)` : ''"
- ></path>
- </svg>
- </div>
- </div>
- </div>
- </div>
- </div>
- </template>
- <script lang="ts" setup>
- import { LINE_LIST, type LinePoolItem } from '@/configs/lines'
- import LinePointMarker from '@/views/components/element/LineElement/LinePointMarker.vue'
- const emit = defineEmits<{
- (event: 'select', payload: LinePoolItem): void
- }>()
- const selectLine = (line: LinePoolItem) => {
- emit('select', line)
- }
- </script>
- <style lang="scss" scoped>
- .line-pool {
- width: 220px;
- overflow: auto;
- margin-bottom: -12px;
- margin-right: -12px;
- padding-right: 12px;
- }
- .category-name {
- width: 100%;
- font-size: 12px;
- margin-bottom: 10px;
- border-left: 4px solid #bbb;
- background-color: #f1f1f1;
- padding: 3px 0 3px 8px;
- color: #555;
- }
- .line-list {
- @include flex-grid-layout();
- margin-bottom: 10px;
- }
- .line-item {
- @include flex-grid-layout-children(5, 19%);
- height: 0;
- padding-bottom: 19%;
- flex-shrink: 0;
- position: relative;
- cursor: pointer;
- }
- .line-content {
- @include absolute-0();
- display: flex;
- justify-content: center;
- align-items: center;
- color: #999;
- &:hover {
- color: $themeColor;
- }
- svg:not(:root) {
- overflow: visible;
- }
- }
- </style>
|