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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy