diff --git a/.vscode/settings.json b/.vscode/settings.json index e4ef8a10..81bd766e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,7 +2,7 @@ "eslint.experimental.useFlatConfig": true, "prettier.enable": false, "editor.codeActionsOnSave": { - "source.fixAll": true + "source.fixAll": "explicit" }, "editor.formatOnSave": false, // Silent the stylistic rules in you IDE, but still auto fix them diff --git a/packages/client/src/App.vue b/packages/client/src/App.vue index 3c1446a6..b77b0fa9 100644 --- a/packages/client/src/App.vue +++ b/packages/client/src/App.vue @@ -19,6 +19,11 @@ const bridge = useDevToolsBridge() const isUtilityView = computed(() => route.path.startsWith('/__') || route.path === '/') const sidebarExpanded = computed(() => clientState.value.expandSidebar) +watchEffect(() => { + const scale = devtoolsClientState.value.scale + document.body.style.fontSize = `${scale * 15}px` +}) + watch(connected, (v) => { if (v) { router.replace(clientState.value.isFirstVisit ? '/' : clientState.value.route) @@ -38,6 +43,14 @@ useEventListener('keydown', (e) => { bridge.value.emit('toggle-panel') }) +watchEffect(() => { + bridge.value.emit('update-client-state', { + minimizePanelInteractive: devtoolsClientState.value.minimizePanelInteractive, + closeOnOutsideClick: devtoolsClientState.value.interactionCloseOnOutsideClick, + showFloatingPanel: devtoolsClientState.value.showPanel, + }) +}) + const splitScreenEnabled = computed(() => clientState.value.splitScreen.enabled) const isSplitScreenAvailable = splitScreenAvailable const splitScreenSize = computed({ @@ -58,12 +71,13 @@ const splitScreenSize = computed({ > - + diff --git a/packages/client/src/assets/styles/main.css b/packages/client/src/assets/styles/main.css index 427bc954..f975578a 100644 --- a/packages/client/src/assets/styles/main.css +++ b/packages/client/src/assets/styles/main.css @@ -114,9 +114,32 @@ body::-webkit-scrollbar { background: #8885; } -.no-scrollbar { - /* Support Firefox */ - scrollbar-width: none +/* Scrollbar */ +::-webkit-scrollbar { + width: 6px; +} + +::-webkit-scrollbar:horizontal { + height: 6px; +} + +::-webkit-scrollbar-corner { + background: transparent; +} + +::-webkit-scrollbar-track { + background: var(--c-border); + border-radius: 1px; +} + +::-webkit-scrollbar-thumb { + background: #8881; + transition: background 0.2s ease; + border-radius: 1px; +} + +::-webkit-scrollbar-thumb:hover { + background: #8885; } .no-scrollbar::-webkit-scrollbar { diff --git a/packages/client/src/components/common/SideNav.vue b/packages/client/src/components/common/SideNav.vue index 7c45bef9..70735b03 100644 --- a/packages/client/src/components/common/SideNav.vue +++ b/packages/client/src/components/common/SideNav.vue @@ -7,15 +7,43 @@ const panel = ref() const buttonDocking = ref() const buttonMoreTabs = ref() const sidebarExpanded = computed(() => devtoolsClientState.value.expandSidebar) -const sidebarScrollable = ref(false) +const sidebarScrollable = computed(() => devtoolsClientState.value.scrollableSidebar) -const { enabledTabs } = useAllTabs() +const { enabledTabs, flattenedTabs } = useAllTabs() + +const ITEM_HEIGHT = 45 +const { height: windowHeight } = useWindowSize() +const containerCapacity = computed(() => { + const containerHeight = windowHeight.value - 130 + return Math.max(0, Math.floor(containerHeight / ITEM_HEIGHT)) +}) +const inlineTabs = computed(() => flattenedTabs.value.slice(0, containerCapacity.value)) +const overflowTabs = computed(() => flattenedTabs.value.slice(containerCapacity.value)) +const categorizedInlineTabs = getCategorizedTabs(inlineTabs, enabledTabs) +const categorizedOverflowTabs = getCategorizedTabs(overflowTabs, enabledTabs) + +const displayedTabs = computed(() => (sidebarScrollable.value || sidebarExpanded.value) + ? enabledTabs.value + : categorizedInlineTabs.value) + +onClickOutside( + panel, + (e) => { + if (buttonDocking.value && e.composedPath().includes(buttonDocking.value)) + return + if (buttonMoreTabs.value && e.composedPath().includes(buttonMoreTabs.value)) + return + showDocking.value = false + showMoreTabs.value = false + }, + { detectIframe: true }, +)