Skip to Content
デベロッパーガイドDaemon UIWebShell サイドバー — カスタマイズガイド

WebShell サイドバー — カスタマイズガイド

WebShellSidebar は、web-shell の App コンポーネント内で描画されるセッションリストおよびナビゲーションパネルです。本文書では、各視覚領域を現在のカスタマイズ機能に対応させ、外部注入ポイントを持たない領域を特定します。

サイドバーの有効化

サイドバーはデフォルトで無効です。sidebar prop を渡して有効化します。

import { WebShellWithProviders } from '@qwen-code/web-shell'; <WebShellWithProviders baseUrl="http://localhost:4170" sidebar={true} // simple enable // or with fine-grained options: // sidebar={{ enabled: true, defaultCollapsed: false, ... }} />;

レイアウト概要

┌─────────────────────────────────────┐ │ ① ブランディング (topRow) │ ✅ カスタマイズ可 ├─────────────────────────────────────┤ │ ② プライマリナビゲーション │ ✅ カスタマイズ可 │ [+ New task] [🧩 Plugins] │ │ [📅 Scheduled] [🎯 Goals] │ │ [custom render...] │ ├─────────────────────────────────────┤ │ ③ プロジェクトヘッダー │ ✅ 表示/非表示 │ 📁 Projects ▼ [🔍] [+] │ │ Session list entries... │ │ 📦 Archived sessions │ ├─────────────────────────────────────┤ │ ④ フッターアクションバー │ ✅ カスタマイズ可 │ [⚙ Settings] v0.19 [☀] [▦] [◧] │ ├─────────────────────────────────────┤ │ ⑤ リサイズハンドル │ ❌ カスタマイズ不可 └─────────────────────────────────────┘

カスタマイズ可能な領域

① ブランディング — branding

interface WebShellSidebarBranding { render?: () => ReactNode; // replace the entire branding row hideWhenCompact?: boolean; // hide when sidebar is collapsed (default: true) }
効果
undefined(デフォルト)Qwen ロゴ + “Qwen Code” テキスト
falseブランディング行全体を非表示
{ render: () => <MyHeader /> }カスタムコンテンツで全面置換
{ hideWhenCompact: false }折りたたみアイコンレールモードでもブランディングを表示
sidebar={{ branding: { render: () => ( <div style={{ display: 'flex', gap: 8 }}> <img src="/my-logo.svg" alt="" width={24} /> <span>My App</span> </div> ), }, }}

② プライマリナビゲーション — primaryNav

type WebShellSidebarPrimaryNavItem = | 'newTask' // ✏️ New Task button | 'plugins' // 🧩 Plugins button | 'scheduledTasks' // 📅 Scheduled Tasks button | 'goals'; // 🎯 Goals button interface WebShellSidebarPrimaryNavOptions { items?: readonly WebShellSidebarPrimaryNavItem[]; // which built-in buttons to show (default: all) render?: () => ReactNode; // additional custom content after built-in buttons }

プライマリナビゲーション領域には、items で制御される組み込みボタンが含まれます。

  • items を指定しない場合、すべてのボタンが表示される
  • items を指定した場合、リストされたボタンのみ表示される
  • カスタムコンテンツは render() で組み込みボタンの後に追加できる
効果
undefined(デフォルト)すべての組み込みボタンを表示
{ items: ['plugins'] }Plugins ボタンのみ
{ items: ['plugins', 'scheduledTasks'] }Plugins + Scheduled Tasks
{ items: [], render: () => ... }組み込みをすべて非表示、カスタムコンテンツのみ
sidebar={{ primaryNav: { items: ['plugins', 'scheduledTasks'], // hide newTask and goals render: () => ( <button onClick={() => console.log('custom action')}> 🔗 Data Sync </button> ), }, }}
type WebShellSidebarFooterItem = | 'settings' // ⚙ Settings panel | 'version' // version label (e.g. "v0.19.10") | 'theme' // ☀/🌙 light/dark toggle | 'sessionsOverview' // ▦ session overview panel (large screens only) | 'splitView' // ◧ split view (large screens only) | 'daemonStatus' // 📊 daemon status panel | 'collapse'; // ◁/▷ collapse/expand toggle interface WebShellSidebarFooterOptions { items?: readonly WebShellSidebarFooterItem[]; // which built-in items to show (default: all) render?: () => ReactNode; // custom content rendered on the left side, before built-in items }
効果
undefined(デフォルト)すべてのアイテムを表示
falseフッター全体を非表示
{ items: ['settings', 'theme', 'collapse'] }リストされたアイテムのみ表示

フッターは狭い幅に自動適応します。一定の閾値以下ではラベルが非表示になり、バージョン表示も削除されます。

sidebar={{ footer: { items: ['theme', 'collapse'] }, // minimal footer }}

render() によるカスタムコンテンツは、フッターの左側、組み込みアイテムより前に表示されます。

sidebar={{ footer: { items: ['collapse'], render: () => ( <button onClick={() => openHelpCenter()}> ❓ Help </button> ), }, }}

注: 'scheduledTasks''goals' はプライマリナビゲーション領域(②)に移動されており、デフォルトで表示されます。これらは footer.items ではなく primaryNav.items で制御されます。

その他のトップレベルオプション

interface WebShellSidebarOptions { enabled?: boolean; // show/hide sidebar (default: true when passed) defaultCollapsed?: boolean; // initial collapsed state (persisted in localStorage) showCompactToggle?: boolean; // show the collapse button in the chat area (default: true) branding?: false | WebShellSidebarBranding; primaryNav?: WebShellSidebarPrimaryNavOptions; hideProjectHeader?: boolean; // hide "Projects" header row (default: false = shown) sessionActions?: WebShellSidebarSessionActionsOptions; footer?: false | WebShellSidebarFooterOptions; }

③ プロジェクトヘッダー — hideProjectHeader

「Projects」ヘッダー行(折りたたみトグル、検索アイコン、ワークスペース追加ボタンを含む行)の表示/非表示を制御します。デフォルトは false(表示)です。

sidebar={{ hideProjectHeader: true, // hide the "项目 ▼ [🔍] [+]" row }}

非表示にしても、セッションリストエントリとアーカイブされたセッションは引き続き表示されます。アクションボタンとセッション検索バーを含むヘッダー行のみが削除されます。

セッション行アクション — sessionActions

type WebShellSidebarSessionActionItem = | 'details' // 📝 Details (dropdown sub-menu) | 'rename' // ✏️ Rename (dropdown menu) | 'group' // 📁 Group/Move to folder (dropdown menu) | 'export' // 📤 Export chat history (dropdown menu) | 'delete' // 🗑 Delete session (dropdown menu) | 'pin' // 📌 Pin/Unpin (inline button) | 'archive'; // 📦 Archive (inline button) /** Subset with working inline (hover-button) handlers. */ type WebShellSidebarSessionInlineActionItem = | 'pin' | 'archive' | 'rename' | 'export' | 'delete'; interface WebShellSidebarSessionActionsOptions { items?: readonly WebShellSidebarSessionActionItem[]; // which actions to show (default: all) inlineItems?: readonly WebShellSidebarSessionInlineActionItem[]; // which items appear as inline buttons (default: ['pin', 'archive']) }

セッション行に表示されるアクションボタンを制御します。

  • items: すべてのアクション(インラインおよびドロップダウン)のマスター制御。items に含まれないアイテムは全域で非表示になります。
  • inlineItems: インラインボタン(ホバー時)として表示されるアイテムを制御します。デフォルトは ['pin', 'archive'] です。インラインハンドラーが動作するアイテムのみ使用可能です: 'pin''archive''rename''export''delete''details''group' はドロップダウン専用です。

表示優先度: インラインボタンを表示するには、items とアイテムの組み込み条件と inlineItems のすべてを満たす必要があります。たとえば、delete をインラインで表示するには、items'delete' が含まれ、かつ inlineItems'delete' が含まれている必要があります。

効果
undefined(デフォルト)すべてのアクションを表示、pin + archive はインライン
{ inlineItems: ['pin', 'delete'] }Pin + delete をインラインボタンとして表示
{ inlineItems: [] }インラインボタンをすべて非表示
{ inlineItems: ['archive', 'export'] }Archive + export をインラインボタンとして表示

ドロップダウンアイテムが有効になっていない場合、ドロップダウントリガー(⋮)は自動的に非表示になります。インラインボタン(pinarchive)は、ケーパビリティ条件と items の両方を満たす場合にのみ表示されます。

sidebar={{ sessionActions: { items: ['details', 'rename', 'export', 'delete', 'pin'], // which actions to show (master control) inlineItems: ['pin', 'delete'], // pin + delete as inline buttons }, }}

カスタマイズ不可の領域

プロジェクト / ワークスペース(セッションリスト内)

セッションリストが表示されている場合、以下のサブ領域は描画されますが個別にカスタマイズはできません

側面詳細
データソースuseSessions() フック → デーモン API(/sessions エンドポイント)
セッションリストの排序作成時刻の降順
セッション行の描画内部の renderSessionRow useCallback — 注入不可
検索 / フィルタクライアントサイドのテキストマッチングによる組み込み検索バー
セッショングループSessionGroupSection コンポーネント(6 色のプリセット + カスタム hex)
ワークスペースセクションデーモンワークスペースごとの WorkspaceSection、置換不可
ワークスペース追加ダイアログ組み込みの AddWorkspaceDialog

⑤ リサイズハンドル

  • 右端のドラッグハンドルでサイドバー幅をリサイズ
  • 幅は localStorage に永続化される
  • 設定不可

ランタイム動作 prop

以下の WebShellProps はサイドバーの動作に間接的に影響します。

Prop効果
onNewSession新規セッションハンドラーをオーバーライド
onLoadSessionセッション読み込みロジックをオーバーライド
onSessionIdChangeセッション切替に反応する
splitSessionIdsスプリットビューセッションを外部から制御
theme / onThemeChangeテーマの制御 / 監視
language / onLanguageChangeUI 言語の制御 / 監視

折りたたみ状態とモバイル状態

状態動作
展開状態テキストラベル付きの完全なサイドバー
折りたたみアイコンレールモード(ロゴ、ペンアイコン、アクションアイコンのみ)
モバイル左からバックドロップオーバーレイ付きでドロワーがスライド

折りたたみ状態は qwen-code-web-shell-sidebar-collapsed キーで localStorage に永続化されます。

ソースコードの場所

コンポーネントファイル
WebShellSidebarpackages/web-shell/client/components/sidebar/WebShellSidebar.tsx
SessionGroupSectionpackages/web-shell/client/components/sidebar/SessionGroupSection.tsx
WorkspaceSectionpackages/web-shell/client/components/sidebar/WorkspaceSection.tsx
Sidebar stylespackages/web-shell/client/components/sidebar/WebShellSidebar.module.css
App integrationpackages/web-shell/client/App.tsxWebShellSidebar を検索)
Entry point (dev)packages/web-shell/client/main.tsxsidebar: true
Last updated on