Skip to content
This repository was archived by the owner on Jan 6, 2024. It is now read-only.

Commit 17c2da1

Browse files
feat: fullscreen view mode (#189)
1 parent cd71414 commit 17c2da1

File tree

6 files changed

+64
-15
lines changed

6 files changed

+64
-15
lines changed

packages/client/components/DockingPanel.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { isInPopup } from '~/logic/state'
66
<div>
77
<div px3 py2 border="b base" flex="~ gap-2">
88
<PopupButton v-if="!isInPopup" />
9+
<FullscreenButton v-if="!isInPopup" />
910
<VDDarkToggle v-slot="{ toggle, isDark }">
1011
<VDButton n="sm primary" @click="toggle">
1112
<div carbon-sun translate-y--1px dark:carbon-moon />
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<script setup lang="ts">
2+
import { useDevToolsClient } from '../logic/client'
3+
4+
const isFullscreen = ref(false)
5+
const client = useDevToolsClient()
6+
7+
function toggleFullscreen() {
8+
client.value.panel?.toggleViewMode(isFullscreen.value ? 'default' : 'fullscreen')
9+
isFullscreen.value = !isFullscreen.value
10+
}
11+
</script>
12+
13+
<template>
14+
<div flex="~ gap-1">
15+
<VDButton n="sm primary" @click="toggleFullscreen">
16+
<template v-if="isFullscreen">
17+
<i material-symbols:fullscreen-exit /> Exit Fullscreen
18+
</template>
19+
<template v-else>
20+
<i material-symbols:fullscreen /> Fullscreen
21+
</template>
22+
</VDButton>
23+
</div>
24+
</template>

packages/client/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export interface ComponentInspectorBounds {
1212
export interface VueDevtoolsHostClient {
1313
markClientLoaded: () => void
1414
panel?: {
15-
toggleViewMode: (mode?: 'xs' | 'default') => void
15+
toggleViewMode: (mode?: ViewMode) => void
1616
popup: () => void
1717
toggle: () => void
1818
}

packages/node/client.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,10 @@ declare interface PackageMeta {
5656
version: string
5757
name: string
5858
}
59+
60+
/**
61+
* - `xs` for functions that should only be available in the small view mode, e.g. `__EyeDropper`
62+
* - `default` is the default view mode
63+
* - `fullscreen` for fullscreen the whole devtool
64+
*/
65+
declare type ViewMode = 'xs' | 'default' | 'fullscreen'

packages/node/src/views/FrameBox.vue

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="ts">
2-
import { ref, watchEffect } from 'vue'
2+
import { computed, ref, watchEffect } from 'vue'
33
import { PANEL_MAX, PANEL_MIN, popupWindow, state } from './composables'
44
import { useWindowEventListener } from './utils'
55
@@ -14,8 +14,7 @@ const props = defineProps<{
1414
disable: () => void
1515
} | undefined
1616
}
17-
18-
viewMode: 'default' | 'xs'
17+
viewMode: 'xs' | 'default' | 'fullscreen'
1918
}>()
2019
2120
const container = ref<HTMLElement>()
@@ -100,14 +99,22 @@ useWindowEventListener('mouseup', () => {
10099
useWindowEventListener('mouseleave', () => {
101100
isResizing.value = false
102101
})
102+
103+
const viewModeClass = computed(() => {
104+
if (props.viewMode === 'xs')
105+
return 'view-mode-xs'
106+
if (props.viewMode === 'fullscreen')
107+
return 'view-mode-fullscreen'
108+
return ''
109+
})
103110
</script>
104111

105112
<template>
106113
<div
107114
v-show="state.open && !client.inspector?.isEnabled.value && !popupWindow"
108115
ref="container"
109116
class="vue-devtools-frame"
110-
:class="{ 'view-mode-xs': props.viewMode === 'xs' }"
117+
:class="viewModeClass"
111118
>
112119
<!-- Handlers -->
113120
<div
@@ -209,4 +216,16 @@ useWindowEventListener('mouseleave', () => {
209216
width: 400px !important;
210217
height: 80px !important;
211218
}
219+
220+
.vue-devtools-frame.view-mode-fullscreen {
221+
width: 100vw !important;
222+
height: 100vh !important;
223+
z-index: 1 !important;
224+
bottom: 0 !important;
225+
transform: none !important;
226+
}
227+
228+
.vue-devtools-frame.view-mode-fullscreen :deep(iframe) {
229+
border-radius: 0 !important;
230+
}
212231
</style>

packages/node/src/views/Main.vue

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ const { hookBuffer, collect } = collectDevToolsHookBuffer()
2323
2424
let isAppCreated = false
2525
const panelState = ref<{
26-
viewMode: 'default' | 'xs'
26+
viewMode: ViewMode
2727
}>({
2828
viewMode: 'default',
2929
})
@@ -90,16 +90,9 @@ async function setupClient(iframe: HTMLIFrameElement) {
9090
injection.setClient({
9191
hook,
9292
hookBuffer,
93-
// inspector: {
94-
// enable: enableInspector,
95-
// disable: disableInspector,
96-
// },
9793
panel: {
98-
toggleViewMode: () => {
99-
if (panelState.value.viewMode === 'xs')
100-
panelState.value.viewMode = 'default'
101-
else
102-
panelState.value.viewMode = 'xs'
94+
toggleViewMode: (mode?: ViewMode) => {
95+
panelState.value.viewMode = mode ?? 'default'
10396
},
10497
toggle: togglePanelVisible,
10598
popup,
@@ -242,6 +235,7 @@ collectHookBuffer()
242235
:class="{
243236
'vue-devtools-vertical': isVertical,
244237
'vue-devtools-hide': isHidden,
238+
'fullscreen': panelState.viewMode === 'fullscreen',
245239
}"
246240
@mousemove="bringUp"
247241
>
@@ -303,6 +297,10 @@ collectHookBuffer()
303297
transform-origin: center center;
304298
transform: translate(-50%, -50%) rotate(0);
305299
}
300+
#vue-devtools-anchor.fullscreen {
301+
transform: none !important;
302+
left: 0 !important;
303+
}
306304
307305
#vue-devtools-anchor .vue-devtools-icon-button {
308306
border: none;

0 commit comments

Comments
 (0)