Custom select + styling toolbar
This commit is contained in:
parent
a308696cf2
commit
be766cda59
4
public/assets/icons/zoneEditor/chevron.svg
Normal file
4
public/assets/icons/zoneEditor/chevron.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M17 9.5L12 14.5L7 9.5" stroke="#000000" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 325 B |
@ -2,11 +2,13 @@
|
|||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<div class="toolbar">
|
<div class="toolbar">
|
||||||
<div class="tools">
|
<div class="tools">
|
||||||
<button :class="{ active: zoneEditorStore.tool === 'move' }" @click="zoneEditorStore.setTool('move')">
|
<button class="tool move" :class="{ active: zoneEditorStore.tool === 'move' }" @click="zoneEditorStore.setTool('move')">
|
||||||
<img src="/assets/icons/zoneEditor/move.svg" alt="Move camera" />
|
<img src="/assets/icons/zoneEditor/move.svg" alt="Move camera" />
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<div class="divider"></div>
|
<div class="divider"></div>
|
||||||
<button :class="{ active: zoneEditorStore.tool === 'pencil' }" @click="zoneEditorStore.setTool('pencil')">
|
|
||||||
|
<button class="tool pencil" :class="{ active: zoneEditorStore.tool === 'pencil' }" @click="zoneEditorStore.setTool('pencil')">
|
||||||
<img src="/assets/icons/zoneEditor/pencil.svg" alt="Pencil" />
|
<img src="/assets/icons/zoneEditor/pencil.svg" alt="Pencil" />
|
||||||
<select v-model="drawMode" v-if="zoneEditorStore.tool === 'pencil'">
|
<select v-model="drawMode" v-if="zoneEditorStore.tool === 'pencil'">
|
||||||
<option value="tile" :selected="zoneEditorStore.drawMode === 'tile'">tile</option>
|
<option value="tile" :selected="zoneEditorStore.drawMode === 'tile'">tile</option>
|
||||||
@ -15,23 +17,53 @@
|
|||||||
<option value="teleport" :selected="zoneEditorStore.drawMode === 'teleport'">teleport</option>
|
<option value="teleport" :selected="zoneEditorStore.drawMode === 'teleport'">teleport</option>
|
||||||
<option value="blocking_tile" :selected="zoneEditorStore.drawMode === 'blocking_tile'">blocking tile</option>
|
<option value="blocking_tile" :selected="zoneEditorStore.drawMode === 'blocking_tile'">blocking tile</option>
|
||||||
</select>
|
</select>
|
||||||
|
<div class="select" v-if="zoneEditorStore.tool === 'pencil'">
|
||||||
|
<div class="select-trigger" :class="{ open: selectPencilOpen }" @click="selectPencilOpen = !selectPencilOpen">
|
||||||
|
{{ zoneEditorStore.drawMode }}
|
||||||
|
<img src="/assets/icons/zoneEditor/chevron.svg"/>
|
||||||
|
</div>
|
||||||
|
<div class="options" v-show="selectPencilOpen && zoneEditorStore.tool === 'pencil'">
|
||||||
|
<span class="option" data-value="tile">Tile</span>
|
||||||
|
<span class="option" data-value="wall">Wall</span>
|
||||||
|
<span class="option" data-value="decoration">Decoration</span>
|
||||||
|
<span class="option" data-value="teleport">Teleport</span>
|
||||||
|
<span class="option" data-value="blocking_tile">Blocking tile</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<div class="divider"></div>
|
<div class="divider"></div>
|
||||||
<button :class="{ active: zoneEditorStore.tool === 'eraser' }" @click="zoneEditorStore.setTool('eraser')">
|
|
||||||
|
<button class="tool eraser" :class="{ active: zoneEditorStore.tool === 'eraser' }" @click="zoneEditorStore.setTool('eraser')">
|
||||||
<img src="/assets/icons/zoneEditor/eraser.svg" alt="Eraser" />
|
<img src="/assets/icons/zoneEditor/eraser.svg" alt="Eraser" />
|
||||||
<select v-model="drawMode" v-if="zoneEditorStore.tool === 'eraser'">
|
<select v-model="drawMode" v-if="zoneEditorStore.tool === 'pencil'">
|
||||||
<option value="tile" :selected="zoneEditorStore.drawMode === 'tile'">tile</option>
|
<option value="tile" :selected="zoneEditorStore.drawMode === 'tile'">tile</option>
|
||||||
<option value="wall" :selected="zoneEditorStore.drawMode === 'wall'">wall</option>
|
<option value="wall" :selected="zoneEditorStore.drawMode === 'wall'">wall</option>
|
||||||
<option value="decoration" :selected="zoneEditorStore.drawMode === 'decoration'">decoration</option>
|
<option value="decoration" :selected="zoneEditorStore.drawMode === 'decoration'">decoration</option>
|
||||||
<option value="teleport" :selected="zoneEditorStore.drawMode === 'teleport'">teleport</option>
|
<option value="teleport" :selected="zoneEditorStore.drawMode === 'teleport'">teleport</option>
|
||||||
<option value="blocking_tile" :selected="zoneEditorStore.drawMode === 'blocking_tile'">blocking tile</option>
|
<option value="blocking_tile" :selected="zoneEditorStore.drawMode === 'blocking_tile'">blocking tile</option>
|
||||||
</select>
|
</select>
|
||||||
|
<div class="select" v-if="zoneEditorStore.tool === 'eraser'">
|
||||||
|
<div class="select-trigger" :class="{ open: selectEraserOpen }" @click="selectEraserOpen = !selectEraserOpen">
|
||||||
|
{{ zoneEditorStore.drawMode }}
|
||||||
|
<img src="/assets/icons/zoneEditor/chevron.svg"/>
|
||||||
|
</div>
|
||||||
|
<div class="options" v-show="selectEraserOpen">
|
||||||
|
<span class="option" data-value="tile">Tile</span>
|
||||||
|
<span class="option" data-value="wall">Wall</span>
|
||||||
|
<span class="option" data-value="decoration">Decoration</span>
|
||||||
|
<span class="option" data-value="teleport">Teleport</span>
|
||||||
|
<span class="option" data-value="blocking_tile">Blocking tile</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<div class="divider"></div>
|
<div class="divider"></div>
|
||||||
<button @click="() => zoneEditorStore.toggleSettingsModal()">
|
<button class="tool settings" @click="() => zoneEditorStore.toggleSettingsModal()">
|
||||||
<img src="/assets/icons/zoneEditor/gear.svg" alt="Zone settings" />
|
<img src="/assets/icons/zoneEditor/gear.svg" alt="Zone settings" />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="buttons">
|
<div class="buttons">
|
||||||
<button class="btn-cyan">Load</button>
|
<button class="btn-cyan">Load</button>
|
||||||
<button class="btn-cyan" @click="() => emit('save')">Save</button>
|
<button class="btn-cyan" @click="() => emit('save')">Save</button>
|
||||||
@ -58,6 +90,11 @@ const props = defineProps({
|
|||||||
const scene = useScene()
|
const scene = useScene()
|
||||||
const emit = defineEmits(['move', 'eraser', 'pencil', 'save'])
|
const emit = defineEmits(['move', 'eraser', 'pencil', 'save'])
|
||||||
|
|
||||||
|
// track select state
|
||||||
|
let selectPencilOpen = ref(false);
|
||||||
|
let selectEraserOpen = ref(false);
|
||||||
|
|
||||||
|
|
||||||
// drawMode
|
// drawMode
|
||||||
const drawMode = ref('tile')
|
const drawMode = ref('tile')
|
||||||
|
|
||||||
@ -119,12 +156,11 @@ function clear() {
|
|||||||
position: fixed;
|
position: fixed;
|
||||||
top: 20px;
|
top: 20px;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
opacity: 0.8;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
background: $dark-gray;
|
background: rgba($dark-gray, 0.8);
|
||||||
border: 2px solid $cyan;
|
border: 2px solid $cyan;
|
||||||
color: $light-gray;
|
color: $light-gray;
|
||||||
padding: 5px;
|
padding: 5px 5px 5px 10px;
|
||||||
min-width: 90%;
|
min-width: 90%;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
|
|
||||||
@ -138,13 +174,73 @@ function clear() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// vertical center
|
// vertical center
|
||||||
button {
|
.tool {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
min-width: 40px;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
select {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
border-bottom: 3px solid $light-cyan;
|
border-bottom: 3px solid $light-cyan;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select {
|
||||||
|
position: relative;
|
||||||
|
.select-trigger {
|
||||||
|
text-transform: capitalize;
|
||||||
|
display: flex;
|
||||||
|
gap: 15px;
|
||||||
|
|
||||||
|
img {
|
||||||
|
transform: rotate(0);
|
||||||
|
transition: ease-in-out 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.open {
|
||||||
|
img {
|
||||||
|
transform: rotate(180deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.options {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
position: absolute;
|
||||||
|
top: calc(100% + 20px);
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
background: rgba($dark-gray, 0.8);
|
||||||
|
border-radius: 5px;
|
||||||
|
min-width: 100px;
|
||||||
|
border: 1px solid $cyan;
|
||||||
|
text-align: left;
|
||||||
|
.option {
|
||||||
|
padding: 8px 10px;
|
||||||
|
position: relative;
|
||||||
|
&:hover {
|
||||||
|
background-color: rgba($cyan, 0.5);
|
||||||
|
}
|
||||||
|
&::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
width: 80%;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
bottom: 0;
|
||||||
|
height: 1px;
|
||||||
|
background-color: $cyan;
|
||||||
|
}
|
||||||
|
&:last-child::after {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user