Skip to content

Commit 0070073

Browse files
committed
feat: improve dock style
1 parent a16276e commit 0070073

File tree

7 files changed

+60
-24
lines changed

7 files changed

+60
-24
lines changed

packages/core/src/client/webcomponents/.generated/css.ts

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

packages/core/src/client/webcomponents/components/Dock.vue

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import type { DockProps } from './DockProps'
55
import { useEventListener, useScreenSafeArea } from '@vueuse/core'
66
import { computed, onMounted, reactive, ref, toRefs, useTemplateRef, watchEffect } from 'vue'
77
import DockEntries from './DockEntries.vue'
8+
import BracketLeft from './icons/BracketLeft.vue'
9+
import BracketRight from './icons/BracketRight.vue'
810
911
const props = defineProps<DockProps>()
1012
@@ -215,10 +217,9 @@ const panelStyle = computed(() => {
215217
return style
216218
})
217219
218-
// TODO: use a visual module to host all the imports
219220
function importScript(entry: DevToolsDockEntry): Promise<(context: ImportScriptContext) => void | Promise<void>> {
220221
const id = entry.id
221-
return import(/* vite-ignore */ ['/.devtools', 'imports'].join('-'))
222+
return import(/* @vite-ignore */ ['/.devtools', 'imports'].join('-'))
222223
.then((module) => {
223224
const importsMap = module.importsMap as Record<string, () => Promise<() => void>>
224225
const importFn = importsMap[id]
@@ -229,13 +230,20 @@ function importScript(entry: DevToolsDockEntry): Promise<(context: ImportScriptC
229230
})
230231
.catch((error) => {
231232
// TODO: maybe popup a error toast here?
233+
// TODO: A unified logger API
232234
console.error('[VITE DEVTOOLS] Error executing import action', error)
233235
return Promise.reject(error)
234236
})
235237
}
236238
237-
function onSelected(entry: DevToolsDockEntry) {
238-
const context: ImportScriptContext = reactive({
239+
function onSelected(entry?: DevToolsDockEntry) {
240+
if (!entry) {
241+
state.value.open = false
242+
state.value.dockEntry = undefined
243+
return
244+
}
245+
246+
const scriptContext: ImportScriptContext = reactive({
239247
dockEntry: entry,
240248
// @ts-expect-error cast for unwraping
241249
dockState: computed<'active' | 'inactive'>({
@@ -254,8 +262,17 @@ function onSelected(entry: DevToolsDockEntry) {
254262
},
255263
})
256264
265+
// If it's an action, run and return (early exit)
257266
if (entry?.type === 'action') {
258-
return importScript(entry).then(fn => fn(context))
267+
return importScript(entry).then(fn => fn(scriptContext))
268+
}
269+
270+
state.value.dockEntry = entry
271+
state.value.open = true
272+
273+
// If has import script, run it
274+
if (entry.import) {
275+
importScript(entry).then(fn => fn(scriptContext))
259276
}
260277
}
261278
@@ -291,9 +308,17 @@ onMounted(() => {
291308
id="vite-devtools-dock"
292309
@pointerdown="onPointerDown"
293310
>
311+
<BracketLeft
312+
class="vite-devtools-dock-bracket absolute left--1 top-1/2 translate-y--1/2 bottom-0 w-2.5 op75"
313+
/>
314+
<BracketRight
315+
class="vite-devtools-dock-bracket absolute right--1 top-1/2 translate-y--1/2 bottom-0 w-2.5 op75"
316+
:class="isVertical ? 'scale-y--100' : ''"
317+
/>
294318
<DockEntries
295319
:entries="docks"
296-
:class="isMinimized ? 'opacity-0' : 'opacity-100'"
320+
class="transition duration-200"
321+
:class="isMinimized ? 'opacity-0 pointer-events-none' : 'opacity-100'"
297322
:is-vertical="isVertical"
298323
:selected="state.dockEntry"
299324
@select="onSelected"
@@ -304,7 +329,7 @@ onMounted(() => {
304329
:dock-el="dockEl"
305330
:panel-margins="panelMargins"
306331
:state="state"
307-
:entry="state.dockEntry"
332+
:entry="state.dockEntry?.type === 'action' ? undefined : state.dockEntry"
308333
/>
309334
</div>
310335
</template>

packages/core/src/client/webcomponents/components/DockEntries.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ function toggleDockEntry(dock: DevToolsDockEntry) {
3636
:title="dock.title"
3737
:class="[
3838
isVertical ? 'rotate-270' : '',
39-
selected ? selected.id !== dock.id ? 'op50 saturate-0' : 'scale-120' : '',
39+
selected ? selected.id !== dock.id ? 'op50 saturate-0' : 'scale-120 text-purple' : '',
4040
]"
4141
class="flex items-center justify-center p1.5 rounded-xl hover:bg-[#8881] hover:scale-120 transition-all duration-300 relative"
4242
@click="toggleDockEntry(dock)"

packages/core/src/client/webcomponents/components/DockIcon.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ const icon = computed(() => {
3232
<img
3333
:src="icon.light"
3434
:alt="title"
35+
class="w-full h-full m-auto"
3536
draggable="false"
3637
>
3738
</picture>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<template>
2+
<svg viewBox="0 0 9 20" fill="none" xmlns="http://www.w3.org/2000/svg">
3+
<path
4+
d="M4.95763 0C1.02563 5.628 1.00263 14.351 4.95763 20H7.61363C3.65963 14.35 3.68363 5.627 7.61363 0H4.95763Z"
5+
class="fill-black dark:fill-white"
6+
/>
7+
</svg>
8+
</template>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<template>
2+
<svg viewBox="0 0 9 20" fill="none" xmlns="http://www.w3.org/2000/svg">
3+
<path
4+
d="M4.246 10H6.903C6.902 6.407 5.913 2.816 3.946 0H1.29C3.256 2.816 4.244 6.407 4.246 10ZM8.935 14.907H6.27C6.46624 14.1665 6.61752 13.4148 6.723 12.656H4.066C3.96052 13.4148 3.80924 14.1665 3.613 14.907H0.944C0.703507 15.8176 0.387753 16.7067 0 17.565H2.669C2.2859 18.4179 1.82388 19.2331 1.289 20H3.945C4.47988 19.2331 4.9419 18.4179 5.325 17.565H7.99C8.376 16.714 8.691 15.823 8.935 14.907Z"
5+
class="fill-black dark:fill-white"
6+
/>
7+
</svg>
8+
</template>

packages/core/src/client/webcomponents/style.css

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,35 +24,29 @@
2424
}
2525

2626
#vite-devtools-anchor #vite-devtools-dock-container {
27-
--uno: absolute left-0 top-0 h-[44px] min-w-[100px] w-max;
27+
--uno: absolute left-0 top-0 h-[40px] min-w-[100px] w-max flex;
2828
transform: translate(-50%, -50%);
2929
}
3030

3131
#vite-devtools-anchor.vite-devtools-vertical #vite-devtools-dock-container {
3232
transform: translate(-50%, -50%) rotate(90deg);
33-
transition:
34-
all 0.6s ease,
35-
max-width 0.6s ease,
36-
padding 0.5s ease,
37-
transform 0.4s ease,
38-
opacity 0.2s ease;
33+
--uno: transition-all duration-500;
3934
}
4035

4136
#vite-devtools-anchor #vite-devtools-dock {
42-
--uno: h-full min-w-full rounded-full select-none touch-none px4;
37+
--uno: h-full rounded-full select-none touch-none px4 ma h-[40px];
4338
--uno: shadow text-white bg-glass border border-base;
44-
transition:
45-
all 0.6s ease,
46-
max-width 0.6s ease,
47-
padding 0.5s ease,
48-
transform 0.4s ease,
49-
opacity 0.2s ease;
39+
--uno: transition-all duration-500;
40+
width: calc-size(max-content, size);
5041
}
5142

5243
#vite-devtools-anchor.vite-devtools-minimized #vite-devtools-dock {
53-
--uno: w-[52px] h-[8px] px-0 py-[2px];
44+
--uno: w-[20px] h-[20px] px-0 py-[2px];
5445
}
5546

47+
#vite-devtools-anchor.vite-devtools-minimized .vite-devtools-dock-bracket {
48+
--uno: w-2 op50;
49+
}
5650

5751
#vite-devtools-anchor:hover #vite-devtools-glowing {
5852
--uno: opacity-60;

0 commit comments

Comments
 (0)