| <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> |