web: keep sidebar collapse local

This commit is contained in:
Keisuke Hirata 2026-07-23 20:45:58 +09:00
parent fb4d3c3f1f
commit f848a96343
No known key found for this signature in database
4 changed files with 10 additions and 20 deletions

View File

@ -124,7 +124,7 @@
@layer layout { @layer layout {
.workspace-layout { .workspace-layout {
display: grid; display: grid;
grid-template-columns: minmax(220px, 280px) minmax(0, 1fr); grid-template-columns: auto minmax(0, 1fr);
grid-template-rows: auto minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr);
width: 100vw; width: 100vw;
height: 100dvh; height: 100dvh;
@ -133,9 +133,6 @@
overflow: hidden; overflow: hidden;
min-width: 0; min-width: 0;
} }
.workspace-layout.sidebar-collapsed {
grid-template-columns: max-content minmax(0, 1fr);
}
.workspace-topbar { .workspace-topbar {
grid-column: 2; grid-column: 2;
grid-row: 1; grid-row: 1;
@ -206,6 +203,7 @@
.global-sidebar { .global-sidebar {
grid-column: 1; grid-column: 1;
grid-row: 1; grid-row: 1;
width: auto;
border-right: 0; border-right: 0;
border-bottom: 1px solid var(--line); border-bottom: 1px solid var(--line);
} }
@ -217,12 +215,10 @@
min-height: 100dvh; min-height: 100dvh;
overflow: visible; overflow: visible;
} }
.workspace-layout.sidebar-collapsed {
grid-template-columns: 1fr;
}
.workspace-sidebar { .workspace-sidebar {
grid-column: 1; grid-column: 1;
grid-row: 1; grid-row: 1;
width: auto;
border-right: 0; border-right: 0;
border-bottom: 1px solid var(--line); border-bottom: 1px solid var(--line);
} }
@ -243,6 +239,7 @@
.global-sidebar { .global-sidebar {
grid-column: 1; grid-column: 1;
grid-row: 1 / 3; grid-row: 1 / 3;
width: clamp(220px, 20vw, 280px);
min-width: 0; min-width: 0;
min-height: 0; min-height: 0;
overflow-y: auto; overflow-y: auto;
@ -256,6 +253,7 @@
.workspace-sidebar { .workspace-sidebar {
grid-column: 1; grid-column: 1;
grid-row: 1 / 3; grid-row: 1 / 3;
width: clamp(220px, 20vw, 280px);
align-self: stretch; align-self: stretch;
min-width: 0; min-width: 0;
min-height: 0; min-height: 0;
@ -263,6 +261,10 @@
padding: var(--space-4) var(--space-3); padding: var(--space-4) var(--space-3);
border-right: 1px solid var(--line); border-right: 1px solid var(--line);
} }
.workspace-sidebar.collapsed {
width: max-content;
}
.sidebar-header { .sidebar-header {
display: grid; display: grid;
gap: var(--space-2); gap: var(--space-2);

View File

@ -6,7 +6,6 @@ export type SidebarSnippet = Snippet<[]>;
export type SidebarController = { export type SidebarController = {
setSidebar(snippet: SidebarSnippet): void; setSidebar(snippet: SidebarSnippet): void;
clearSidebar(snippet: SidebarSnippet): void; clearSidebar(snippet: SidebarSnippet): void;
setCollapsed(collapsed: boolean): void;
}; };
export const SIDEBAR_CONTEXT = Symbol("yoi-sidebar-context"); export const SIDEBAR_CONTEXT = Symbol("yoi-sidebar-context");

View File

@ -9,7 +9,6 @@
let { children }: LayoutProps = $props(); let { children }: LayoutProps = $props();
let sidebar = $state<SidebarSnippet | null>(null); let sidebar = $state<SidebarSnippet | null>(null);
let sidebarCollapsed = $state(false);
setContext(SIDEBAR_CONTEXT, { setContext(SIDEBAR_CONTEXT, {
setSidebar(snippet: SidebarSnippet) { setSidebar(snippet: SidebarSnippet) {
@ -17,17 +16,13 @@
}, },
clearSidebar(snippet: SidebarSnippet) { clearSidebar(snippet: SidebarSnippet) {
if (sidebar === snippet) sidebar = null; if (sidebar === snippet) sidebar = null;
sidebarCollapsed = false;
},
setCollapsed(collapsed: boolean) {
sidebarCollapsed = collapsed;
}, },
}); });
</script> </script>
<WorkspaceAlerts /> <WorkspaceAlerts />
<div class:sidebar-collapsed={sidebarCollapsed} class="workspace-layout"> <div class="workspace-layout">
{#if sidebar} {#if sidebar}
{@render sidebar()} {@render sidebar()}
{:else} {:else}

View File

@ -2,20 +2,14 @@
import { page } from '$app/state'; import { page } from '$app/state';
import SidebarOverride from '$lib/workspace/sidebar/SidebarOverride.svelte'; import SidebarOverride from '$lib/workspace/sidebar/SidebarOverride.svelte';
import WorkspaceSidebar from '$lib/workspace/sidebar/WorkspaceSidebar.svelte'; import WorkspaceSidebar from '$lib/workspace/sidebar/WorkspaceSidebar.svelte';
import { getSidebarController } from '$lib/workspace/sidebar/context';
import type { LayoutProps } from './$types'; import type { LayoutProps } from './$types';
let { data, children }: LayoutProps = $props(); let { data, children }: LayoutProps = $props();
let sidebarCollapsed = $state(false); let sidebarCollapsed = $state(false);
const sidebarController = getSidebarController();
function toggleSidebar() { function toggleSidebar() {
sidebarCollapsed = !sidebarCollapsed; sidebarCollapsed = !sidebarCollapsed;
} }
$effect(() => {
sidebarController.setCollapsed(sidebarCollapsed);
});
</script> </script>
{#snippet workspaceSidebar()} {#snippet workspaceSidebar()}