web: register sidebar snippets from layouts

This commit is contained in:
2026-07-23 20:01:54 +09:00
parent b3854004a1
commit fb4d3c3f1f
8 changed files with 137 additions and 40 deletions
@@ -0,0 +1,35 @@
<script lang="ts">
import { page } from '$app/state';
import SidebarOverride from '$lib/workspace/sidebar/SidebarOverride.svelte';
import WorkspaceSidebar from '$lib/workspace/sidebar/WorkspaceSidebar.svelte';
import { getSidebarController } from '$lib/workspace/sidebar/context';
import type { LayoutProps } from './$types';
let { data, children }: LayoutProps = $props();
let sidebarCollapsed = $state(false);
const sidebarController = getSidebarController();
function toggleSidebar() {
sidebarCollapsed = !sidebarCollapsed;
}
$effect(() => {
sidebarController.setCollapsed(sidebarCollapsed);
});
</script>
{#snippet workspaceSidebar()}
<WorkspaceSidebar
workspace={data.workspace ?? null}
workspaceError={data.workspaceError ?? null}
repositories={data.repositories ?? null}
repositoriesError={data.repositoriesError ?? null}
currentPath={page.url.pathname}
collapsed={sidebarCollapsed}
onToggleCollapsed={toggleSidebar}
/>
{/snippet}
<SidebarOverride sidebar={workspaceSidebar} />
{@render children()}
@@ -0,0 +1,19 @@
import { loadJson, workspaceApiPath } from "$lib/workspace/api/http";
import type { RepositoryListResponse, WorkspaceResponse } from "$lib/workspace/sidebar/types";
import type { LayoutLoad } from "./$types";
export const load: LayoutLoad = async ({ fetch, params }) => {
const workspaceId = params.workspaceId;
const apiPath = (path: string) => workspaceApiPath(workspaceId, path);
const [workspace, repositories] = await Promise.all([
loadJson<WorkspaceResponse>(fetch, apiPath("/workspace")),
loadJson<RepositoryListResponse>(fetch, apiPath("/repositories")),
]);
return {
workspace: workspace.data,
workspaceError: workspace.error,
repositories: repositories.data,
repositoriesError: repositories.error,
};
};