@cerbur/clutch-dsh-worktree 0.1.23 → 0.1.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -18
- package/README.zh.md +52 -15
- package/assets/screenshots/screenshots-dashboard.png +0 -0
- package/assets/screenshots/screenshots-en.png +0 -0
- package/assets/screenshots/screenshots-git-reviewer.png +0 -0
- package/assets/screenshots/screenshots-zh.png +0 -0
- package/lib/client/WorktreeSurface.d.ts +1 -1
- package/lib/client/WorktreeSurface.d.ts.map +1 -1
- package/lib/client/WorktreeSurface.js +5 -8
- package/lib/client/WorktreeSurface.js.map +1 -1
- package/lib/client/dsh-icons.d.ts +1 -0
- package/lib/client/dsh-icons.d.ts.map +1 -1
- package/lib/client/dsh-icons.js +1 -0
- package/lib/client/dsh-icons.js.map +1 -1
- package/lib/client/dsh-slot-contract.d.ts +6 -1
- package/lib/client/dsh-slot-contract.d.ts.map +1 -1
- package/lib/client/entry.d.ts.map +1 -1
- package/lib/client/entry.js +3 -0
- package/lib/client/entry.js.map +1 -1
- package/lib/client/locales.d.ts +28 -2
- package/lib/client/locales.d.ts.map +1 -1
- package/lib/client/locales.js +28 -2
- package/lib/client/locales.js.map +1 -1
- package/lib/client/overlay/WorktreeOverlay.d.ts +5 -2
- package/lib/client/overlay/WorktreeOverlay.d.ts.map +1 -1
- package/lib/client/overlay/WorktreeOverlay.js +11 -2
- package/lib/client/overlay/WorktreeOverlay.js.map +1 -1
- package/lib/client/surface/components/ActiveWorktree.d.ts +1 -1
- package/lib/client/surface/components/ActiveWorktree.d.ts.map +1 -1
- package/lib/client/surface/components/ActiveWorktree.js +8 -2
- package/lib/client/surface/components/ActiveWorktree.js.map +1 -1
- package/lib/client/surface/components/ActivityFilterBar.d.ts +16 -0
- package/lib/client/surface/components/ActivityFilterBar.d.ts.map +1 -0
- package/lib/client/surface/components/ActivityFilterBar.js +48 -0
- package/lib/client/surface/components/ActivityFilterBar.js.map +1 -0
- package/lib/client/surface/components/AnimatedTree.js +2 -2
- package/lib/client/surface/components/AnimatedTree.js.map +1 -1
- package/lib/client/surface/components/ArchivedWorktree.d.ts +1 -1
- package/lib/client/surface/components/ArchivedWorktree.d.ts.map +1 -1
- package/lib/client/surface/components/ArchivedWorktree.js +7 -2
- package/lib/client/surface/components/ArchivedWorktree.js.map +1 -1
- package/lib/client/surface/components/ArchivedWorktrees.d.ts +1 -1
- package/lib/client/surface/components/ArchivedWorktrees.d.ts.map +1 -1
- package/lib/client/surface/components/ArchivedWorktrees.js +2 -2
- package/lib/client/surface/components/ArchivedWorktrees.js.map +1 -1
- package/lib/client/surface/components/SurfaceContent.d.ts +2 -2
- package/lib/client/surface/components/SurfaceContent.d.ts.map +1 -1
- package/lib/client/surface/components/SurfaceContent.js.map +1 -1
- package/lib/client/surface/components/SurfaceHeader.js +1 -1
- package/lib/client/surface/components/SurfaceHeader.js.map +1 -1
- package/lib/client/surface/components/WorkspaceTree.d.ts +2 -2
- package/lib/client/surface/components/WorkspaceTree.d.ts.map +1 -1
- package/lib/client/surface/components/WorkspaceTree.js +34 -11
- package/lib/client/surface/components/WorkspaceTree.js.map +1 -1
- package/lib/client/surface/components/rows.d.ts.map +1 -1
- package/lib/client/surface/components/rows.js +1 -1
- package/lib/client/surface/components/rows.js.map +1 -1
- package/lib/client/surface/state/useActivityFilter.d.ts +25 -0
- package/lib/client/surface/state/useActivityFilter.d.ts.map +1 -0
- package/lib/client/surface/state/useActivityFilter.js +79 -0
- package/lib/client/surface/state/useActivityFilter.js.map +1 -0
- package/lib/client/surface/state/useSessionExpansion.d.ts +2 -0
- package/lib/client/surface/state/useSessionExpansion.d.ts.map +1 -1
- package/lib/client/surface/state/useSessionExpansion.js +75 -17
- package/lib/client/surface/state/useSessionExpansion.js.map +1 -1
- package/lib/client/surface/state/useSurfaceSources.d.ts +7 -5
- package/lib/client/surface/state/useSurfaceSources.d.ts.map +1 -1
- package/lib/client/surface/state/useSurfaceSources.js +14 -5
- package/lib/client/surface/state/useSurfaceSources.js.map +1 -1
- package/lib/client/surface/types.d.ts +2 -0
- package/lib/client/surface/types.d.ts.map +1 -1
- package/lib/client/view/activity-filter.d.ts +86 -0
- package/lib/client/view/activity-filter.d.ts.map +1 -0
- package/lib/client/view/activity-filter.js +121 -0
- package/lib/client/view/activity-filter.js.map +1 -0
- package/lib/client/view/sidebar-workspace-slot.d.ts +14 -0
- package/lib/client/view/sidebar-workspace-slot.d.ts.map +1 -0
- package/lib/client/view/sidebar-workspace-slot.js +23 -0
- package/lib/client/view/sidebar-workspace-slot.js.map +1 -0
- package/lib/client/view/view-mode-store.d.ts.map +1 -1
- package/lib/client/view/view-mode-store.js +26 -1
- package/lib/client/view/view-mode-store.js.map +1 -1
- package/lib/client/view/view-mode.d.ts +18 -1
- package/lib/client/view/view-mode.d.ts.map +1 -1
- package/lib/client/view/view-mode.js.map +1 -1
- package/lib/client/view/workspace-region-geometry.d.ts +11 -0
- package/lib/client/view/workspace-region-geometry.d.ts.map +1 -0
- package/lib/client/view/workspace-region-geometry.js +28 -0
- package/lib/client/view/workspace-region-geometry.js.map +1 -0
- package/lib/client/view/worktree-expand-state.d.ts +12 -1
- package/lib/client/view/worktree-expand-state.d.ts.map +1 -1
- package/lib/client/view/worktree-expand-state.js +26 -0
- package/lib/client/view/worktree-expand-state.js.map +1 -1
- package/lib/client.js +888 -562
- package/lib/client.js.map +1 -1
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -1844,6 +1844,20 @@ window.__ModuleLoader__.load({
|
|
|
1844
1844
|
"workspace.search": "搜索工作区和会话",
|
|
1845
1845
|
"search.clear": "清除搜索",
|
|
1846
1846
|
"workspace.noMatches": "没有匹配的工作区",
|
|
1847
|
+
"filter.group": "按活跃时间筛选",
|
|
1848
|
+
"filter.today": "今日",
|
|
1849
|
+
"filter.last24h": "24 小时",
|
|
1850
|
+
"filter.last7d": "7 天",
|
|
1851
|
+
"filter.all": "全部",
|
|
1852
|
+
"filter.count": "{label},{count} 个会话",
|
|
1853
|
+
"filter.empty": "这个范围内没有会话",
|
|
1854
|
+
"filter.emptyHint": "切换到「全部」查看所有会话。",
|
|
1855
|
+
"filter.emptyHintMenu": "从右侧菜单显示「全部」,即可查看所有会话。",
|
|
1856
|
+
"filter.choose": "选择显示的筛选",
|
|
1857
|
+
"filter.visible": "显示的筛选",
|
|
1858
|
+
"filter.keepOne": "至少保留一个筛选",
|
|
1859
|
+
"filter.keepInactive": "显示无活跃 Workspace",
|
|
1860
|
+
"filter.keepInactiveHint": "同时保留没有活跃 Session 的 Workspace 和 Worktree 结构。",
|
|
1847
1861
|
"workspace.renameTitle": "重命名工作区",
|
|
1848
1862
|
"workspace.name": "工作区名称",
|
|
1849
1863
|
"workspace.duplicate": "已存在同名 Workspace,请使用不同的名称。",
|
|
@@ -1889,7 +1903,6 @@ window.__ModuleLoader__.load({
|
|
|
1889
1903
|
"worktree.removeDescription": "归档“{name}”?目录、会话绑定和工作目录保持不变。删除目录需另行选择“清理磁盘”。",
|
|
1890
1904
|
"worktree.removeExternalDescription": "归档“{name}”?外部目录、会话绑定和工作目录保持不变。删除目录需另行选择“清理磁盘”。",
|
|
1891
1905
|
"worktree.addSession": "向 {name} 添加会话",
|
|
1892
|
-
"worktree.noWorktrees": "暂无 Worktree",
|
|
1893
1906
|
"worktree.createTitle": "新建 Worktree",
|
|
1894
1907
|
"worktree.createDescription": "“{name}” · Worktree 路径由 DSH 管理。",
|
|
1895
1908
|
"worktree.tabCreate": "创建",
|
|
@@ -2291,6 +2304,20 @@ window.__ModuleLoader__.load({
|
|
|
2291
2304
|
"workspace.search": "Search Workspaces and Sessions",
|
|
2292
2305
|
"search.clear": "Clear search",
|
|
2293
2306
|
"workspace.noMatches": "No matching Workspaces",
|
|
2307
|
+
"filter.group": "Filter by activity",
|
|
2308
|
+
"filter.today": "Today",
|
|
2309
|
+
"filter.last24h": "24h",
|
|
2310
|
+
"filter.last7d": "7d",
|
|
2311
|
+
"filter.all": "All",
|
|
2312
|
+
"filter.count": "{label}, {count} Sessions",
|
|
2313
|
+
"filter.empty": "No Sessions in this range",
|
|
2314
|
+
"filter.emptyHint": "Switch to All to see every Session.",
|
|
2315
|
+
"filter.emptyHintMenu": "Show All from the range menu to see every Session.",
|
|
2316
|
+
"filter.choose": "Choose visible filters",
|
|
2317
|
+
"filter.visible": "Visible filters",
|
|
2318
|
+
"filter.keepOne": "Keep at least one filter",
|
|
2319
|
+
"filter.keepInactive": "Show inactive Workspaces",
|
|
2320
|
+
"filter.keepInactiveHint": "Also keep Workspaces and Worktrees with no active Session in the range.",
|
|
2294
2321
|
"workspace.renameTitle": "Rename Workspace",
|
|
2295
2322
|
"workspace.name": "Workspace name",
|
|
2296
2323
|
"workspace.duplicate": "A Workspace with this name already exists. Choose a different name.",
|
|
@@ -2336,7 +2363,6 @@ window.__ModuleLoader__.load({
|
|
|
2336
2363
|
"worktree.removeDescription": "Archive {name}? The directory, Session bindings, and working directories are preserved. Deleting the directory requires the separate Clean Disk action.",
|
|
2337
2364
|
"worktree.removeExternalDescription": "Archive {name}? The external directory, Session bindings, and working directories are preserved. Deleting the directory requires the separate Clean Disk action.",
|
|
2338
2365
|
"worktree.addSession": "Add Session to {name}",
|
|
2339
|
-
"worktree.noWorktrees": "No Worktrees",
|
|
2340
2366
|
"worktree.createTitle": "New Worktree",
|
|
2341
2367
|
"worktree.createDescription": "{name} · the Worktree path is managed by DSH.",
|
|
2342
2368
|
"worktree.tabCreate": "Create",
|
|
@@ -2861,9 +2887,10 @@ window.__ModuleLoader__.load({
|
|
|
2861
2887
|
const IconRefreshOutline16 = createDshIconAlias(exports$1, "IconRefreshOutline16", "IconRefreshOutlineRegular");
|
|
2862
2888
|
const IconRightUpOutline16 = createDshIconAlias(exports$1, "IconRightUpOutline16", "IconRightUpOutlineRegular");
|
|
2863
2889
|
const IconSearchOutline16 = createDshIconAlias(exports$1, "IconSearchOutline16", "IconSearchOutlineRegular");
|
|
2890
|
+
const IconSlidersTwoOutline16 = createDshIconAlias(exports$1, "IconSlidersTwoOutline16", "IconSlidersTwoOutlineRegular");
|
|
2864
2891
|
const IconTrashOutline16 = createDshIconAlias(exports$1, "IconTrashOutline16", "IconTrashOutlineRegular");
|
|
2865
2892
|
//#endregion
|
|
2866
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
2893
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/context/worktree-context.css.mjs
|
|
2867
2894
|
const css$9 = ".-cerbur-clutch-dsh-worktree-headerContext {\n display: inline-flex;\n min-width: 0;\n height: 22px;\n align-items: center;\n gap: 4px;\n max-width: 180px;\n overflow: hidden;\n border-radius: 6px;\n padding: 0 2px 0 0;\n background: var(--dsw-alias-fill-tsp-secondary);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 22px;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-contextIcon {\n flex: none;\n opacity: 0.7;\n}\n\n.-cerbur-clutch-dsh-worktree-contextLabel {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-contextHoverTitle {\n max-width: 360px;\n color: var(--dsw-static-neutral-bluish-00);\n font-size: 14px;\n line-height: 20px;\n overflow-wrap: anywhere;\n white-space: normal;\n}\n\n.-cerbur-clutch-dsh-worktree-heroContextHost {\n position: absolute;\n z-index: 0;\n display: block;\n width: max-content;\n max-width: 260px;\n min-height: 22px;\n}\n\n.-cerbur-clutch-dsh-worktree-heroContext {\n display: inline-flex;\n box-sizing: border-box;\n max-width: 260px;\n min-height: 22px;\n align-items: center;\n overflow: hidden;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n padding: 0 8px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 20px;\n pointer-events: auto;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n";
|
|
2868
2895
|
const styleId$9 = "@cerbur/clutch-dsh-worktree/worktree-context.css";
|
|
2869
2896
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree-context.css\"]") === null) {
|
|
@@ -2927,8 +2954,8 @@ window.__ModuleLoader__.load({
|
|
|
2927
2954
|
globalSetViewMode?.(mode);
|
|
2928
2955
|
}
|
|
2929
2956
|
//#endregion
|
|
2930
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
2931
|
-
const css$8 = ".-cerbur-clutch-dsh-worktree-action {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 8px;\n width: calc(100% + 4px);\n height: 42px;\n margin: 4px -2px;\n box-sizing: border-box;\n border: 0;\n border-radius: 12px;\n padding: 0 10px 0 8px;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n line-height: 22px;\n text-align: left;\n overflow: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-action:hover,\n.-cerbur-clutch-dsh-worktree-action[data-active='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-action[data-collapsed='true'] {\n width: 36px;\n height: 36px;\n margin: 8px 0 10px;\n justify-content: center;\n gap: 0;\n padding: 0;\n border-radius: 50%;\n}\n\n.-cerbur-clutch-dsh-worktree-actionLabel {\n display: inline-flex;\n min-width: 0;\n align-items: center;\n height: 22px;\n overflow: hidden;\n font-weight: 400;\n line-height: 22px;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-surface {\n position: absolute;\n top: 0;\n left: 0;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n min-width: 0;\n overflow: hidden;\n border-right: 1px solid var(--dsw-alias-border-l1);\n background: var(--dsw-specific-sidebar-fill);\n color: var(--dsw-alias-label-primary);\n pointer-events: auto;\n transition: width var(--ds-transition-duration-slow) var(--ds-ease-in-out);\n}\n\n/* Native macOS AppFrame already paints the tint over OS window vibrancy.\n Once the covered native rows are concealed, use that one material without\n adding another fill or backdrop root (menus keep their own native blur). */\n[data-platform='darwin'] .-cerbur-clutch-dsh-worktree-surface[data-native-sidebar-covered='true'] {\n background: transparent;\n border-right: none;\n}\n\n/* The shell overlay is outside the native column's clipping boundary.\n Follow the semantic collapse immediately, even during the track transition. */\n[data-sidebar-collapsed] [data-shell-overlay] .-cerbur-clutch-dsh-worktree-surface,\n.-cerbur-clutch-dsh-worktree-surface[data-collapsed='true'] {\n visibility: hidden;\n opacity: 0;\n pointer-events: none;\n}\n\n@media (prefers-reduced-transparency: reduce) {\n [data-platform='darwin'] .-cerbur-clutch-dsh-worktree-surface[data-native-sidebar-covered='true'] {\n background: color-mix(in srgb, var(--dsw-specific-sidebar-fill) 90%, transparent);\n }\n}\n\n.-cerbur-clutch-dsh-worktree-motionExits {\n position: absolute;\n inset: 0;\n contain: strict;\n overflow: clip;\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .-cerbur-clutch-dsh-worktree-surface {\n transition: none;\n }\n}\n\n.-cerbur-clutch-dsh-worktree-wideContent {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex: 1;\n flex-direction: column;\n}\n\n.-cerbur-clutch-dsh-worktree-surface[data-collapsed='true'] .-cerbur-clutch-dsh-worktree-wideContent {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationDialog {\n width: min(440px, 100%);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody {\n display: grid;\n min-width: 0;\n gap: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody .-cerbur-clutch-dsh-worktree-modalField {\n min-width: 0;\n gap: 8px;\n line-height: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody .-cerbur-clutch-dsh-worktree-renameInput,\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody [data-single-select] > button {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n height: 40px;\n padding: 0 12px;\n border: 1px solid var(--dsw-alias-border-l3);\n font-size: 14px;\n line-height: 22px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody .-cerbur-clutch-dsh-worktree-renameInput:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTabs {\n display: flex;\n gap: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTab {\n border: 0;\n border-bottom: 2px solid transparent;\n padding: 4px 0 8px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n line-height: 22px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTab[aria-selected='true'] {\n border-bottom-color: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeImportCandidates {\n display: grid;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeImportError {\n display: grid;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton {\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: inherit;\n cursor: pointer;\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-header {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: none;\n min-height: 44px;\n padding: 6px 10px;\n box-sizing: border-box;\n border-bottom: 1px solid var(--dsw-alias-border-l1);\n}\n\n.-cerbur-clutch-dsh-worktree-title {\n min-width: 0;\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 14px;\n font-weight: 600;\n opacity: 1;\n visibility: visible;\n transition:\n opacity 120ms var(--ds-ease-in-out),\n transform 180ms var(--ds-ease-in-out),\n visibility 0s linear;\n}\n\n.-cerbur-clutch-dsh-worktree-titleHidden {\n flex: 0 0 0px;\n max-width: 0;\n opacity: 0;\n transform: translateX(-4px);\n visibility: hidden;\n pointer-events: none;\n transition-delay: 0s, 0s, 180ms;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 28px;\n height: 28px;\n border: 0;\n border-radius: 7px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 16px;\n line-height: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-modeButton[data-active='true'] {\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-workspacePicker {\n display: block;\n width: calc(100% - 20px);\n margin: 6px 10px 8px;\n padding: 6px 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 7px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceLabel {\n display: block;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollFrame {\n position: relative;\n min-height: 0;\n flex: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-content {\n height: 100%;\n box-sizing: border-box;\n overflow: auto;\n padding: 0 10px 12px;\n scrollbar-width: none;\n}\n\n.-cerbur-clutch-dsh-worktree-content::-webkit-scrollbar {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollContent {\n min-width: 0;\n display: flow-root;\n}\n\n/* The themed thumb floats in the existing right inset. Native scrolling\n stays on .-cerbur-clutch-dsh-worktree-content; OS scrollbar preferences cannot shift the rows. */\n.-cerbur-clutch-dsh-worktree-overlayScrollbar {\n position: absolute;\n top: 0;\n right: 2px;\n bottom: 0;\n width: 5px;\n touch-action: none;\n user-select: none;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollbarThumb {\n width: 100%;\n border-radius: 999px;\n background: var(--dsw-alias-scrollbar-bg-l2);\n opacity: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollFrame:hover .-cerbur-clutch-dsh-worktree-scrollbarThumb,\n.-cerbur-clutch-dsh-worktree-scrollFrame:focus-within .-cerbur-clutch-dsh-worktree-scrollbarThumb,\n.-cerbur-clutch-dsh-worktree-overlayScrollbar[data-dragging='true'] .-cerbur-clutch-dsh-worktree-scrollbarThumb {\n opacity: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollbarThumb:hover,\n.-cerbur-clutch-dsh-worktree-overlayScrollbar[data-dragging='true'] .-cerbur-clutch-dsh-worktree-scrollbarThumb {\n background: var(--dsw-alias-scrollbar-hover-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-content:focus-visible {\n outline: 2px solid var(--dsw-alias-border-l3);\n outline-offset: -2px;\n}\n\n.-cerbur-clutch-dsh-worktree-error {\n margin: 12px 0 0;\n padding: 8px;\n border: 1px solid var(--dsw-alias-state-error-primary);\n border-radius: 7px;\n}\n\n.-cerbur-clutch-dsh-worktree-notice {\n margin: 12px 0 0;\n padding: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 7px;\n background: var(--dsw-alias-button-elevated-fill);\n}\n\n.-cerbur-clutch-dsh-worktree-retryButton,\n.-cerbur-clutch-dsh-worktree-actionButton {\n border: 0;\n border-radius: 6px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-retryButton,\n.-cerbur-clutch-dsh-worktree-actionButton {\n width: 100%;\n padding: 6px 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-recoveryActions {\n display: grid;\n gap: 6px;\n margin-top: 6px;\n}\n\n.-cerbur-clutch-dsh-worktree-retryButton:disabled,\n.-cerbur-clutch-dsh-worktree-actionButton:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.-cerbur-clutch-dsh-worktree-actions {\n display: grid;\n gap: 6px;\n margin-top: 10px;\n padding: 8px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 7px;\n}\n\n.-cerbur-clutch-dsh-worktree-actionSelect {\n min-width: 0;\n padding: 5px 6px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-section {\n margin: 12px 0 0;\n}\n\n.-cerbur-clutch-dsh-worktree-sectionTitle {\n margin: 0 2px 4px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n text-transform: uppercase;\n}\n\n.-cerbur-clutch-dsh-worktree-empty,\n.-cerbur-clutch-dsh-worktree-message {\n margin: 0;\n padding: 8px 4px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 12px;\n line-height: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitReadiness {\n display: grid;\n gap: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-commandBlock {\n margin: 6px 0 0;\n padding: 8px;\n overflow-x: auto;\n border-radius: 6px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-secondary);\n font:\n 11px/16px ui-monospace,\n SFMono-Regular,\n Menlo,\n monospace;\n white-space: pre-wrap;\n}\n\n.-cerbur-clutch-dsh-worktree-message[data-error='true'] {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktree,\n.-cerbur-clutch-dsh-worktree-session {\n display: flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n border: 0;\n border-radius: 7px;\n padding: 6px 8px;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 12px;\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-worktree {\n cursor: default;\n}\n\n.-cerbur-clutch-dsh-worktree-session {\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-worktree:hover,\n.-cerbur-clutch-dsh-worktree-session:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel,\n.-cerbur-clutch-dsh-worktree-sessionLabel {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-status {\n flex: none;\n margin-left: auto;\n padding-left: 8px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-searchSlot {\n flex: none;\n max-width: 28px;\n min-width: 0;\n display: flex;\n align-items: center;\n margin-left: auto;\n box-sizing: border-box;\n transition:\n flex 180ms var(--ds-ease-in-out),\n max-width 180ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-searchSlotExpanded {\n flex: 1;\n max-width: 100%;\n}\n\n.-cerbur-clutch-dsh-worktree-headerActions {\n flex: none;\n display: flex;\n align-items: center;\n gap: 4px;\n margin-left: 0;\n opacity: 1;\n visibility: visible;\n transition:\n opacity 120ms var(--ds-ease-in-out),\n transform 180ms var(--ds-ease-in-out),\n visibility 0s linear;\n}\n\n.-cerbur-clutch-dsh-worktree-headerActionsHidden {\n flex: 0 0 0px;\n max-width: 0;\n margin-left: 0;\n opacity: 0;\n transform: translateX(4px);\n visibility: hidden;\n pointer-events: none;\n transition-delay: 0s, 0s, 180ms;\n}\n\n.-cerbur-clutch-dsh-worktree-search {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n height: 28px;\n box-sizing: border-box;\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n transition:\n background 180ms var(--ds-ease-in-out),\n box-shadow 180ms var(--ds-ease-in-out),\n color 180ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded {\n background: var(--dsw-alias-interactive-bg-subtle);\n box-shadow: inset 0 0 0 1px var(--dsw-alias-border-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded:focus-within {\n box-shadow: inset 0 0 0 1px #3b82f6;\n}\n\n.-cerbur-clutch-dsh-worktree-searchButton {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 50%;\n padding: 0;\n background: transparent;\n cursor: pointer;\n color: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-searchButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded .-cerbur-clutch-dsh-worktree-searchButton:hover {\n background: transparent;\n}\n\n.-cerbur-clutch-dsh-worktree-searchInput {\n flex: 1;\n width: 0;\n min-width: 0;\n box-sizing: border-box;\n border: none;\n outline: none;\n background: transparent;\n opacity: 0;\n pointer-events: none;\n font: inherit;\n font-size: 13px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n transition: opacity 120ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded .-cerbur-clutch-dsh-worktree-searchInput {\n margin-left: -2px;\n opacity: 1;\n pointer-events: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-searchInput::placeholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.-cerbur-clutch-dsh-worktree-clearButton {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n border-radius: 50%;\n padding: 0;\n background: transparent;\n cursor: pointer;\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-clearButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-actionSelect:focus {\n border-color: #3b82f6;\n}\n\n.-cerbur-clutch-dsh-worktree-iconButton {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 0;\n border-radius: 7px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 20px;\n line-height: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-iconButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityBell {\n display: inline-flex;\n position: relative;\n}\n\n.-cerbur-clutch-dsh-worktree-activityBadge {\n position: absolute;\n top: 4px;\n right: 4px;\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: var(--dsw-alias-brand-primary, #3b82f6);\n outline: 2px solid var(--dsw-specific-sidebar-fill);\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityPanel {\n position: fixed;\n z-index: 1000;\n box-sizing: border-box;\n width: min(360px, calc(100vw - 16px));\n max-height: min(440px, calc(100dvh - 72px));\n display: flex;\n flex-direction: column;\n padding: 6px;\n color: var(--dsw-alias-label-primary);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l1);\n box-shadow: var(--dsw-elevation-prominent);\n outline: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityHeading {\n flex: none;\n padding: 8px 10px;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityEmpty {\n margin: 0;\n padding: 26px 10px 32px;\n text-align: center;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityList {\n overflow: auto;\n min-height: 0;\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityEntry {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n box-sizing: border-box;\n width: 100%;\n height: auto;\n border: 0;\n border-radius: 7px;\n padding: 10px;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-activityEntry:hover,\n.-cerbur-clutch-dsh-worktree-activityEntry:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-activityEntry:focus-visible {\n outline: 1px solid var(--dsw-alias-label-secondary);\n outline-offset: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityIdentity {\n display: flex;\n flex-direction: column;\n min-width: 0;\n gap: 3px;\n flex: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-activityName,\n.-cerbur-clutch-dsh-worktree-activityContext {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-activityName {\n font-size: 13px;\n line-height: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityContext,\n.-cerbur-clutch-dsh-worktree-activityTime {\n color: var(--dsw-alias-label-secondary);\n font-size: 11px;\n line-height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityMetadata {\n display: flex;\n flex: none;\n flex-direction: column;\n align-items: flex-end;\n gap: 5px;\n padding-top: 2px;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceList {\n position: relative;\n min-width: 0;\n min-height: 0;\n display: grid;\n gap: 4px;\n overflow-x: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceGroup {\n min-width: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow,\n.-cerbur-clutch-dsh-worktree-worktreeRow {\n position: relative;\n display: flex;\n align-items: center;\n min-width: 0;\n min-height: 36px;\n box-sizing: border-box;\n border-radius: 8px;\n padding: 3px 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow .-cerbur-clutch-dsh-worktree-workspaceDisclosure {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover .-cerbur-clutch-dsh-worktree-workspaceDisclosure,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-workspaceDisclosure {\n display: inline-flex;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover .-cerbur-clutch-dsh-worktree-workspaceIcon,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-workspaceIcon {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-worktreeDisclosure {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeDisclosure,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-worktreeDisclosure {\n display: inline-flex;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeIcon,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-worktreeIcon {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 28px;\n border: 0;\n border-radius: 6px;\n padding: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 17px;\n line-height: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton > svg {\n display: block;\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureArrow {\n transition: transform 150ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton[aria-expanded='true'] .-cerbur-clutch-dsh-worktree-disclosureArrow {\n transform: rotate(90deg);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceDisclosure,\n.-cerbur-clutch-dsh-worktree-worktreeDisclosure {\n color: var(--dsw-alias-label-caption);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .-cerbur-clutch-dsh-worktree-disclosureArrow {\n transition: none;\n }\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceIcon,\n.-cerbur-clutch-dsh-worktree-worktreeIcon {\n flex: none;\n width: 24px;\n color: var(--dsw-alias-label-secondary);\n font-size: 20px;\n line-height: 1;\n text-align: center;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeIcon[data-worktree-state='done'] {\n color: var(--dsw-alias-state-success-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeIcon[data-worktree-state='warning'] {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeIcon[data-worktree-state='error'] {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeStateLabel {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n overflow: hidden;\n border: 0;\n padding: 0;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceIcon {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceIcon[data-workspace-active='true'] {\n color: var(--dsw-alias-state-business-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceTitle,\n.-cerbur-clutch-dsh-worktree-worktreeLabel {\n min-width: 0;\n overflow: hidden;\n flex: 1;\n padding: 0 6px;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-main-group='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel {\n font-weight: 600;\n}\n\n/* Native title reveal: the span clips its own text and scrolls only while\n hovered. Activity alone keeps the resting ellipsis. */\n@media (hover: hover) {\n .-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeLabel,\n .-cerbur-clutch-dsh-worktree-treeSessionRow:hover .-cerbur-clutch-dsh-worktree-sessionLabel {\n text-overflow: clip;\n }\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel[data-scrolled],\n.-cerbur-clutch-dsh-worktree-sessionLabel[data-scrolled] {\n mask-image: linear-gradient(to right, transparent, #000 12px);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel[data-clipped],\n.-cerbur-clutch-dsh-worktree-sessionLabel[data-clipped] {\n mask-image: linear-gradient(to left, transparent, #000 12px);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel[data-scrolled][data-clipped],\n.-cerbur-clutch-dsh-worktree-sessionLabel[data-scrolled][data-clipped] {\n mask-image: linear-gradient(\n to right,\n transparent,\n #000 12px,\n #000 calc(100% - 12px),\n transparent\n );\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeHoverTitle {\n color: var(--dsw-static-neutral-bluish-00);\n font-size: 14px;\n line-height: 20px;\n overflow-wrap: anywhere;\n}\n\n/* Native Session hover card: full title, relative time, and current status. */\n.-cerbur-clutch-dsh-worktree-sessionHoverContent {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionHoverTitle {\n color: #FFFFFF;\n font-size: 14px;\n line-height: 20px;\n overflow-wrap: break-word;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionHoverTime {\n color: #CFD3D6;\n font-size: 12px;\n line-height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionHoverStatus {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #ADB2B8;\n font-size: 12px;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeActionSlot,\n.-cerbur-clutch-dsh-worktree-workspaceActions {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n height: 28px;\n margin-left: auto;\n}\n\n/* Workspace rows retain the native fixed action column. */\n.-cerbur-clutch-dsh-worktree-workspaceActions {\n flex: 0 0 64px;\n width: 64px;\n}\n\n/* Group actions do not reserve space until their row needs to show them. */\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot {\n min-width: 0;\n flex: 0 0 0;\n width: 0;\n gap: 4px;\n}\n\n/* Keep the 28px activity indicator plus a 4px label gap while collapsed. */\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot {\n flex: 0 0 32px;\n width: 32px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot {\n flex: 0 0 auto;\n width: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceActions > .-cerbur-clutch-dsh-worktree-menuAction {\n position: absolute;\n top: 0;\n right: 32px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceActions > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n position: absolute;\n top: 0;\n right: 0;\n visibility: hidden;\n}\n\n/* Worktree actions flow naturally so the rail matches the controls that exist. */\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n position: static;\n opacity: 0;\n pointer-events: none;\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-groupActivity {\n position: absolute;\n top: 0;\n right: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n visibility: hidden;\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-groupActivity {\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'][data-menu-open='true'] .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'][data-menu-open='true'] .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-groupActivity {\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'][data-menu-open='true']\n .-cerbur-clutch-dsh-worktree-treeActionSlot\n > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'][data-menu-open='true']\n .-cerbur-clutch-dsh-worktree-treeActionSlot\n > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardAction {\n display: inline-flex;\n flex: 0 0 28px;\n width: 28px;\n height: 28px;\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-menuAction {\n display: inline-flex;\n flex: 0 0 28px;\n width: 28px;\n height: 28px;\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-workspaceRow:focus-within .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover [data-add-worktree],\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] [data-add-worktree],\n.-cerbur-clutch-dsh-worktree-workspaceRow:focus-within [data-add-worktree] {\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n opacity: 1;\n pointer-events: auto;\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropBefore::before,\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n position: absolute;\n right: 4px;\n left: 4px;\n height: 2px;\n border-radius: 2px;\n background: var(--dsw-alias-brand-primary);\n content: '';\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropBefore::before {\n top: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n bottom: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropBefore::before,\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n position: absolute;\n right: 4px;\n left: 4px;\n height: 2px;\n border-radius: 2px;\n background: var(--dsw-alias-brand-primary);\n content: '';\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropBefore::before {\n top: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n bottom: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeChildren {\n margin-left: 16px;\n padding: 2px 0 5px 12px;\n border-left: 1px solid var(--dsw-alias-border-l1);\n}\n\n.-cerbur-clutch-dsh-worktree-groupLabel {\n padding: 6px 8px 3px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n}\n\n.-cerbur-clutch-dsh-worktree-groupHeader {\n display: flex;\n align-items: center;\n min-height: 34px;\n padding-right: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-groupHeader .-cerbur-clutch-dsh-worktree-groupLabel {\n flex: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeGroup {\n margin-top: 2px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow {\n min-height: 34px;\n}\n\n/* Compact the Worktree leading slots to make room for its third action. */\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-worktreeIcon,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-disclosureButton {\n width: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow {\n position: relative;\n display: flex;\n align-items: center;\n width: calc(100% - 20px);\n margin-left: 20px;\n min-width: 0;\n min-height: 31px;\n box-sizing: border-box;\n border-radius: 7px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow:hover,\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-menu-open='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-session-current='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-session-current='true'] .-cerbur-clutch-dsh-worktree-treeSessionContent {\n font-weight: 600;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow.-cerbur-clutch-dsh-worktree-dropBefore::before,\n.-cerbur-clutch-dsh-worktree-treeSessionRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n position: absolute;\n right: 4px;\n left: 4px;\n height: 2px;\n border-radius: 2px;\n background: var(--dsw-alias-brand-primary);\n content: '';\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow.-cerbur-clutch-dsh-worktree-dropBefore::before {\n top: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n bottom: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionContent {\n display: flex;\n align-items: center;\n flex: 1;\n width: 0;\n min-width: 0;\n min-height: 31px;\n box-sizing: border-box;\n border: 0;\n border-radius: 7px;\n padding: 4px 4px;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionContent:hover {\n background: transparent;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionTrailing {\n position: relative;\n display: inline-flex;\n flex: 0 0 52px;\n align-items: center;\n justify-content: flex-end;\n width: 52px;\n height: 28px;\n margin-left: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionMeta,\n.-cerbur-clutch-dsh-worktree-rowActions {\n position: absolute;\n inset: 0;\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionMeta {\n color: var(--dsw-alias-label-tertiary);\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionStatus {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionTime {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-right: 4px;\n font-size: 12px;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionOverflowButton {\n display: block;\n width: calc(100% - 24px);\n margin: 2px 0 4px 24px;\n padding: 4px 8px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 12px;\n font-weight: 400;\n line-height: 20px;\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionOverflowButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-rowActions {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow:hover .-cerbur-clutch-dsh-worktree-sessionMeta,\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-sessionMeta,\n.-cerbur-clutch-dsh-worktree-sessionTrailing:focus-within .-cerbur-clutch-dsh-worktree-sessionMeta {\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow:hover .-cerbur-clutch-dsh-worktree-rowActions,\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-rowActions,\n.-cerbur-clutch-dsh-worktree-sessionTrailing:focus-within .-cerbur-clutch-dsh-worktree-rowActions {\n display: inline-flex;\n}\n\n.-cerbur-clutch-dsh-worktree-renameInput {\n width: 100%;\n}\n\n.-cerbur-clutch-dsh-worktree-renameError {\n margin: 8px 0 0;\n color: var(--dsw-alias-state-error-primary);\n font-size: 13px;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-emptyNested {\n margin: 0;\n padding: 4px 8px 5px 28px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-archivedGroup {\n margin-top: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-modalField {\n display: grid;\n gap: 5px;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-worktreeHoverDetails {\n max-width: 360px;\n white-space: normal;\n overflow-wrap: anywhere;\n line-height: 1.5;\n}\n";
|
|
2957
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/worktree.css.mjs
|
|
2958
|
+
const css$8 = ".-cerbur-clutch-dsh-worktree-action {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 8px;\n width: calc(100% + 4px);\n height: 42px;\n margin: 4px -2px;\n box-sizing: border-box;\n border: 0;\n border-radius: 12px;\n padding: 0 10px 0 8px;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n line-height: 22px;\n text-align: left;\n overflow: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-action:hover,\n.-cerbur-clutch-dsh-worktree-action[data-active='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-action[data-collapsed='true'] {\n width: 36px;\n height: 36px;\n margin: 8px 0 10px;\n justify-content: center;\n gap: 0;\n padding: 0;\n border-radius: 50%;\n}\n\n.-cerbur-clutch-dsh-worktree-actionLabel {\n display: inline-flex;\n min-width: 0;\n align-items: center;\n height: 22px;\n overflow: hidden;\n font-weight: 400;\n line-height: 22px;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceSeat {\n display: flex;\n flex: 1;\n min-height: 0;\n min-width: 0;\n overflow: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-surface {\n position: relative;\n flex: 1;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n min-width: 0;\n overflow: hidden;\n min-height: 0;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n pointer-events: auto;\n transition: width var(--ds-transition-duration-slow) var(--ds-ease-in-out);\n}\n\n/* Fold state comes directly from the sidebar.-cerbur-clutch-dsh-worktree-workspaces owner. */\n.-cerbur-clutch-dsh-worktree-surface[data-collapsed='true'] {\n visibility: hidden;\n opacity: 0;\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-motionExits {\n position: absolute;\n inset: 0;\n contain: strict;\n overflow: clip;\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .-cerbur-clutch-dsh-worktree-surface {\n transition: none;\n }\n}\n\n.-cerbur-clutch-dsh-worktree-wideContent {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex: 1;\n flex-direction: column;\n}\n\n.-cerbur-clutch-dsh-worktree-surface[data-collapsed='true'] .-cerbur-clutch-dsh-worktree-wideContent {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationDialog {\n width: min(440px, 100%);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody {\n display: grid;\n min-width: 0;\n gap: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody .-cerbur-clutch-dsh-worktree-modalField {\n min-width: 0;\n gap: 8px;\n line-height: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody .-cerbur-clutch-dsh-worktree-renameInput,\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody [data-single-select] > button {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n height: 40px;\n padding: 0 12px;\n border: 1px solid var(--dsw-alias-border-l3);\n font-size: 14px;\n line-height: 22px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRegistrationBody .-cerbur-clutch-dsh-worktree-renameInput:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTabs {\n display: flex;\n gap: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTab {\n border: 0;\n border-bottom: 2px solid transparent;\n padding: 4px 0 8px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n line-height: 22px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTab[aria-selected='true'] {\n border-bottom-color: var(--dsw-alias-label-primary);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeImportCandidates {\n display: grid;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeImportError {\n display: grid;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton {\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: inherit;\n cursor: pointer;\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-header {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: none;\n height: 36px;\n margin: 2px 0 4px;\n padding: 0 10px 0 4px;\n box-sizing: border-box;\n color: var(--dsw-alias-label-tertiary);\n}\n\n/* Activity range selector. Its tabs scroll horizontally instead of clipping\n labels, while the visible-range menu stays pinned at the right edge. */\n.-cerbur-clutch-dsh-worktree-activityBar {\n display: flex;\n align-items: center;\n gap: 4px;\n flex: none;\n padding: 0 10px 8px;\n box-sizing: border-box;\n border-bottom: 0.5px solid var(--dsw-alias-border-l1);\n}\n\n.-cerbur-clutch-dsh-worktree-activityTabs {\n display: flex;\n align-items: center;\n gap: 4px;\n flex: 1 1 auto;\n min-width: 0;\n overflow-x: auto;\n scrollbar-width: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityTabs::-webkit-scrollbar {\n display: none;\n}\n\n/* Compact pinned trigger: it never widens the bar or competes with the active\n range pill, and it keeps the tabs as the only horizontally scrolling row. */\n.-cerbur-clutch-dsh-worktree-activityConfig {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n border: 0;\n border-radius: 7px;\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-activityConfig:hover,\n.-cerbur-clutch-dsh-worktree-activityConfig[aria-expanded='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityConfig:focus-visible {\n outline: 2px solid var(--dsw-alias-border-l3);\n outline-offset: 1px;\n}\n\n/* Checkbox rows in the pinned menu. They keep the menu open while toggling so\n several ranges can be shown or hidden in one visit. */\n.-cerbur-clutch-dsh-worktree-activityOption {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-height: 30px;\n padding: 5px 8px;\n border: 0;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 13px;\n line-height: 20px;\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-activityOption:hover:not(:disabled),\n.-cerbur-clutch-dsh-worktree-activityOption:focus-visible:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n outline: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityOption:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.-cerbur-clutch-dsh-worktree-activityOptionLabel {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-activityOption[data-checked='true'] .-cerbur-clutch-dsh-worktree-activityOptionLabel {\n font-weight: 500;\n}\n\n.-cerbur-clutch-dsh-worktree-activityOptionCount {\n flex: 0 0 auto;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n}\n\n.-cerbur-clutch-dsh-worktree-activityOptionCheck {\n display: inline-flex;\n flex: 0 0 14px;\n width: 14px;\n height: 14px;\n align-items: center;\n justify-content: center;\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityOptionCheck svg {\n width: 14px;\n height: 14px;\n}\n\n.-cerbur-clutch-dsh-worktree-activitySegment {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n flex: 0 0 auto;\n padding: 3px 8px;\n border: 0;\n /* Explicit pill: the shared standard requires corner-shape with a full circle. */\n border-radius: 999px;\n corner-shape: round;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 11px;\n line-height: 1.4;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-activitySegment:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-activitySegment:focus-visible {\n outline: 2px solid var(--dsw-alias-border-l3);\n outline-offset: 1px;\n}\n\n.-cerbur-clutch-dsh-worktree-activitySegmentActive,\n.-cerbur-clutch-dsh-worktree-activitySegmentActive:hover {\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n.-cerbur-clutch-dsh-worktree-activityLabel {\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-activityCount {\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n.-cerbur-clutch-dsh-worktree-activitySegmentActive .-cerbur-clutch-dsh-worktree-activityCount {\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-sidebarTitle {\n min-width: 0;\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n opacity: 1;\n visibility: visible;\n transition:\n opacity 120ms var(--ds-ease-in-out),\n transform 180ms var(--ds-ease-in-out),\n visibility 0s linear;\n}\n\n.-cerbur-clutch-dsh-worktree-titleHidden {\n flex: 0 0 0px;\n max-width: 0;\n opacity: 0;\n transform: translateX(-4px);\n visibility: hidden;\n pointer-events: none;\n transition-delay: 0s, 0s, 180ms;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 28px;\n height: 28px;\n border: 0;\n border-radius: 7px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 16px;\n line-height: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-closeButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-modeButton[data-active='true'] {\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-workspacePicker {\n display: block;\n width: calc(100% - 20px);\n margin: 6px 10px 8px;\n padding: 6px 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 7px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceLabel {\n display: block;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollFrame {\n position: relative;\n min-height: 0;\n flex: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-content {\n height: 100%;\n box-sizing: border-box;\n overflow: auto;\n padding: 0 10px 12px 0;\n scrollbar-width: none;\n}\n\n.-cerbur-clutch-dsh-worktree-content::-webkit-scrollbar {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollContent {\n min-width: 0;\n display: flow-root;\n}\n\n/* The themed thumb floats in the existing right inset. Native scrolling\n stays on .-cerbur-clutch-dsh-worktree-content; OS scrollbar preferences cannot shift the rows. */\n.-cerbur-clutch-dsh-worktree-overlayScrollbar {\n position: absolute;\n top: 0;\n right: 2px;\n bottom: 0;\n width: 5px;\n touch-action: none;\n user-select: none;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollbarThumb {\n width: 100%;\n border-radius: 999px;\n background: var(--dsw-alias-scrollbar-bg-l2);\n opacity: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollFrame:hover .-cerbur-clutch-dsh-worktree-scrollbarThumb,\n.-cerbur-clutch-dsh-worktree-scrollFrame:focus-within .-cerbur-clutch-dsh-worktree-scrollbarThumb,\n.-cerbur-clutch-dsh-worktree-overlayScrollbar[data-dragging='true'] .-cerbur-clutch-dsh-worktree-scrollbarThumb {\n opacity: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-scrollbarThumb:hover,\n.-cerbur-clutch-dsh-worktree-overlayScrollbar[data-dragging='true'] .-cerbur-clutch-dsh-worktree-scrollbarThumb {\n background: var(--dsw-alias-scrollbar-hover-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-content:focus-visible {\n outline: 2px solid var(--dsw-alias-border-l3);\n outline-offset: -2px;\n}\n\n.-cerbur-clutch-dsh-worktree-error {\n margin: 12px 0 0;\n padding: 8px;\n border: 1px solid var(--dsw-alias-state-error-primary);\n border-radius: 7px;\n}\n\n.-cerbur-clutch-dsh-worktree-notice {\n margin: 12px 0 0;\n padding: 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 7px;\n background: var(--dsw-alias-button-elevated-fill);\n}\n\n.-cerbur-clutch-dsh-worktree-retryButton,\n.-cerbur-clutch-dsh-worktree-actionButton {\n border: 0;\n border-radius: 6px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-retryButton,\n.-cerbur-clutch-dsh-worktree-actionButton {\n width: 100%;\n padding: 6px 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-recoveryActions {\n display: grid;\n gap: 6px;\n margin-top: 6px;\n}\n\n.-cerbur-clutch-dsh-worktree-retryButton:disabled,\n.-cerbur-clutch-dsh-worktree-actionButton:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.-cerbur-clutch-dsh-worktree-actions {\n display: grid;\n gap: 6px;\n margin-top: 10px;\n padding: 8px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 7px;\n}\n\n.-cerbur-clutch-dsh-worktree-actionSelect {\n min-width: 0;\n padding: 5px 6px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-section {\n margin: 12px 0 0;\n}\n\n.-cerbur-clutch-dsh-worktree-sectionTitle {\n margin: 0 2px 4px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n text-transform: uppercase;\n}\n\n.-cerbur-clutch-dsh-worktree-empty,\n.-cerbur-clutch-dsh-worktree-message {\n margin: 0;\n padding: 8px 4px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 12px;\n line-height: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-emptyHint {\n margin: 0;\n padding: 0 4px 8px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n line-height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityMenuSeparator {\n height: 0.5px;\n margin: 4px 2px;\n background: var(--dsw-alias-border-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-gitReadiness {\n display: grid;\n gap: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-commandBlock {\n margin: 6px 0 0;\n padding: 8px;\n overflow-x: auto;\n border-radius: 6px;\n background: var(--dsw-alias-button-elevated-fill);\n color: var(--dsw-alias-label-secondary);\n font:\n 11px/16px ui-monospace,\n SFMono-Regular,\n Menlo,\n monospace;\n white-space: pre-wrap;\n}\n\n.-cerbur-clutch-dsh-worktree-message[data-error='true'] {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktree,\n.-cerbur-clutch-dsh-worktree-session {\n display: flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n border: 0;\n border-radius: 7px;\n padding: 6px 8px;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n font-size: 12px;\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-worktree {\n cursor: default;\n}\n\n.-cerbur-clutch-dsh-worktree-session {\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-worktree:hover,\n.-cerbur-clutch-dsh-worktree-session:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel,\n.-cerbur-clutch-dsh-worktree-sessionLabel {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-status {\n flex: none;\n margin-left: auto;\n padding-left: 8px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-searchSlot {\n flex: none;\n max-width: 28px;\n min-width: 0;\n display: flex;\n align-items: center;\n margin-left: auto;\n box-sizing: border-box;\n transition:\n flex 180ms var(--ds-ease-in-out),\n max-width 180ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-searchSlotExpanded {\n flex: 1;\n max-width: 100%;\n}\n\n.-cerbur-clutch-dsh-worktree-headerActions {\n flex: none;\n display: flex;\n align-items: center;\n gap: 4px;\n margin-left: 0;\n opacity: 1;\n visibility: visible;\n transition:\n opacity 120ms var(--ds-ease-in-out),\n transform 180ms var(--ds-ease-in-out),\n visibility 0s linear;\n}\n\n.-cerbur-clutch-dsh-worktree-headerActionsHidden {\n flex: 0 0 0px;\n max-width: 0;\n margin-left: 0;\n opacity: 0;\n transform: translateX(4px);\n visibility: hidden;\n pointer-events: none;\n transition-delay: 0s, 0s, 180ms;\n}\n\n.-cerbur-clutch-dsh-worktree-search {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n height: 28px;\n box-sizing: border-box;\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n transition:\n background 180ms var(--ds-ease-in-out),\n box-shadow 180ms var(--ds-ease-in-out),\n color 180ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded {\n background: var(--dsw-alias-interactive-bg-subtle);\n box-shadow: inset 0 0 0 1px var(--dsw-alias-border-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded:focus-within {\n box-shadow: inset 0 0 0 1px #3b82f6;\n}\n\n.-cerbur-clutch-dsh-worktree-searchButton {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: 50%;\n padding: 0;\n background: transparent;\n cursor: pointer;\n color: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-searchButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded .-cerbur-clutch-dsh-worktree-searchButton:hover {\n background: transparent;\n}\n\n.-cerbur-clutch-dsh-worktree-searchInput {\n flex: 1;\n width: 0;\n min-width: 0;\n box-sizing: border-box;\n border: none;\n outline: none;\n background: transparent;\n opacity: 0;\n pointer-events: none;\n font: inherit;\n font-size: 13px;\n line-height: 18px;\n color: var(--dsw-alias-label-primary);\n transition: opacity 120ms var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-searchExpanded .-cerbur-clutch-dsh-worktree-searchInput {\n margin-left: -2px;\n opacity: 1;\n pointer-events: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-searchInput::placeholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.-cerbur-clutch-dsh-worktree-clearButton {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: none;\n border-radius: 50%;\n padding: 0;\n background: transparent;\n cursor: pointer;\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-clearButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-actionSelect:focus {\n border-color: #3b82f6;\n}\n\n.-cerbur-clutch-dsh-worktree-iconButton {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 0;\n border-radius: 7px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 20px;\n line-height: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-iconButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityBell {\n display: inline-flex;\n position: relative;\n}\n\n.-cerbur-clutch-dsh-worktree-activityBadge {\n position: absolute;\n top: 4px;\n right: 4px;\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: var(--dsw-alias-brand-primary, #3b82f6);\n outline: 2px solid var(--dsw-specific-sidebar-fill);\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityPanel {\n position: fixed;\n z-index: 1000;\n box-sizing: border-box;\n width: min(360px, calc(100vw - 16px));\n max-height: min(440px, calc(100dvh - 72px));\n display: flex;\n flex-direction: column;\n padding: 6px;\n color: var(--dsw-alias-label-primary);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l1);\n box-shadow: var(--dsw-elevation-prominent);\n outline: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityHeading {\n flex: none;\n padding: 8px 10px;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityEmpty {\n margin: 0;\n padding: 26px 10px 32px;\n text-align: center;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-activityList {\n overflow: auto;\n min-height: 0;\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\n.-cerbur-clutch-dsh-worktree-activityEntry {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n box-sizing: border-box;\n width: 100%;\n height: auto;\n border: 0;\n border-radius: 7px;\n padding: 10px;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-activityEntry:hover,\n.-cerbur-clutch-dsh-worktree-activityEntry:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-activityEntry:focus-visible {\n outline: 1px solid var(--dsw-alias-label-secondary);\n outline-offset: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityIdentity {\n display: flex;\n flex-direction: column;\n min-width: 0;\n gap: 3px;\n flex: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-activityName,\n.-cerbur-clutch-dsh-worktree-activityContext {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-activityName {\n font-size: 13px;\n line-height: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityContext,\n.-cerbur-clutch-dsh-worktree-activityTime {\n color: var(--dsw-alias-label-secondary);\n font-size: 11px;\n line-height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-activityMetadata {\n display: flex;\n flex: none;\n flex-direction: column;\n align-items: flex-end;\n gap: 5px;\n padding-top: 2px;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n/* One indent rhythm for the whole tree: each level advances by --wt-step and every\n label starts after one --wt-lead cell, so a Session label shares the exact column\n of its group label (one axis per depth, no per-level ad-hoc offsets). */\n.-cerbur-clutch-dsh-worktree-workspaceList {\n --wt-step: 12px;\n --wt-lead: 20px;\n --wt-label-pad: 6px;\n --wt-row-inset: 4px;\n position: relative;\n min-width: 0;\n min-height: 0;\n display: grid;\n gap: 2px;\n overflow-x: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceGroup {\n min-width: 0;\n}\n\n/* Navigation rows sit in the standard control band (H32-40) and share one radius. */\n.-cerbur-clutch-dsh-worktree-workspaceRow,\n.-cerbur-clutch-dsh-worktree-worktreeRow {\n position: relative;\n display: flex;\n align-items: center;\n min-width: 0;\n box-sizing: border-box;\n border-radius: var(--dsw-radius-md);\n padding-block: 3px;\n padding-inline: calc(var(--wt-row-inset) + var(--wt-depth, 0) * var(--wt-step))\n var(--wt-row-inset);\n cursor: pointer;\n user-select: none;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow {\n min-height: 34px;\n}\n\n/* One Workspace is open at a time: the open row owns the tree body, and every\n collapsed row carries its aggregated activity indicator at the action edge. The\n open state reuses the native hover fill instead of adding a custom accent bar. */\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-workspace-open='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-workspace-open='true'] .-cerbur-clutch-dsh-worktree-workspaceTitle {\n font-weight: 400;\n}\n\n@media (hover: hover) {\n .-cerbur-clutch-dsh-worktree-workspaceRow:hover,\n .-cerbur-clutch-dsh-worktree-worktreeRow:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n }\n}\n\n/* The disclosure overlays the type icon's own cell: one 20px axis, no reflow, and\n it stays keyboard reachable while invisible. Hover reveal is pointer-only. */\n.-cerbur-clutch-dsh-worktree-workspaceRow .-cerbur-clutch-dsh-worktree-workspaceDisclosure,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-worktreeDisclosure {\n opacity: 0;\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:focus-within .-cerbur-clutch-dsh-worktree-workspaceDisclosure,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-worktreeDisclosure,\n.-cerbur-clutch-dsh-worktree-workspaceRow .-cerbur-clutch-dsh-worktree-workspaceDisclosure:focus-visible,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-worktreeDisclosure:focus-visible {\n opacity: 1;\n pointer-events: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:focus-within .-cerbur-clutch-dsh-worktree-workspaceIcon,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-worktreeIcon {\n visibility: hidden;\n}\n\n@media (hover: hover) {\n .-cerbur-clutch-dsh-worktree-workspaceRow:hover .-cerbur-clutch-dsh-worktree-workspaceDisclosure,\n .-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-workspaceDisclosure,\n .-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeDisclosure,\n .-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-worktreeDisclosure {\n opacity: 1;\n pointer-events: auto;\n }\n\n .-cerbur-clutch-dsh-worktree-workspaceRow:hover .-cerbur-clutch-dsh-worktree-workspaceIcon,\n .-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-workspaceIcon,\n .-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeIcon,\n .-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-worktreeIcon {\n visibility: hidden;\n }\n}\n\n/* Touch and stylus have no hover phase: keep the expand/collapse affordance\n visible so the tab switch never depends on a pointer hover. */\n@media (hover: none) {\n .-cerbur-clutch-dsh-worktree-workspaceRow .-cerbur-clutch-dsh-worktree-workspaceDisclosure,\n .-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-worktreeDisclosure {\n opacity: 1;\n pointer-events: auto;\n }\n\n .-cerbur-clutch-dsh-worktree-workspaceRow .-cerbur-clutch-dsh-worktree-workspaceIcon,\n .-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-worktreeIcon {\n visibility: hidden;\n }\n}\n\n/* Absolute so the reveal never moves the label; the parent row owns the cell.\n The 24px hit target stays centered on the 20px leading cell. */\n.-cerbur-clutch-dsh-worktree-disclosureButton {\n position: absolute;\n inset-inline-start: calc(\n var(--wt-row-inset) + var(--wt-depth, 0) * var(--wt-step) - 2px\n );\n top: 50%;\n transform: translateY(-50%);\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n padding: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 13px;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton:active {\n background: var(--dsw-alias-interactive-bg-active);\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton > svg {\n display: block;\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureArrow {\n transition: transform var(--ds-transition-duration) var(--ds-ease-in-out);\n}\n\n.-cerbur-clutch-dsh-worktree-disclosureButton[aria-expanded='true'] .-cerbur-clutch-dsh-worktree-disclosureArrow {\n transform: rotate(90deg);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceDisclosure,\n.-cerbur-clutch-dsh-worktree-worktreeDisclosure {\n color: var(--dsw-alias-label-caption);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .-cerbur-clutch-dsh-worktree-disclosureArrow {\n transition: none;\n }\n}\n\n@media (hover: hover) {\n .-cerbur-clutch-dsh-worktree-disclosureButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n }\n}\n\n/* One leading cell for every level keeps all 16px glyphs and the 14px twisty on\n the same vertical axis per depth. */\n.-cerbur-clutch-dsh-worktree-workspaceIcon,\n.-cerbur-clutch-dsh-worktree-worktreeIcon {\n flex: none;\n width: var(--wt-lead);\n color: var(--dsw-alias-label-secondary);\n line-height: 1;\n text-align: center;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeIcon[data-worktree-state='done'] {\n color: var(--dsw-alias-state-success-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeIcon[data-worktree-state='warning'] {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeIcon[data-worktree-state='error'] {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeStateLabel {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n overflow: hidden;\n border: 0;\n padding: 0;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceIcon {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceIcon[data-workspace-active='true'] {\n color: var(--dsw-alias-state-business-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceTitle,\n.-cerbur-clutch-dsh-worktree-worktreeLabel {\n min-width: 0;\n overflow: hidden;\n flex: 1;\n padding: 0 2px;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n}\n\n/* Emphasis stays at weight 500 (design standard: no 600+ in functional CSS). */\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-main-group='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel {\n font-weight: 500;\n}\n\n/* Native title reveal: the span clips its own text and scrolls only while\n hovered. Activity alone keeps the resting ellipsis. */\n@media (hover: hover) {\n .-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeLabel,\n .-cerbur-clutch-dsh-worktree-treeSessionRow:hover .-cerbur-clutch-dsh-worktree-sessionLabel {\n text-overflow: clip;\n }\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel[data-scrolled],\n.-cerbur-clutch-dsh-worktree-sessionLabel[data-scrolled] {\n mask-image: linear-gradient(to right, transparent, #000 12px);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel[data-clipped],\n.-cerbur-clutch-dsh-worktree-sessionLabel[data-clipped] {\n mask-image: linear-gradient(to left, transparent, #000 12px);\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeLabel[data-scrolled][data-clipped],\n.-cerbur-clutch-dsh-worktree-sessionLabel[data-scrolled][data-clipped] {\n mask-image: linear-gradient(\n to right,\n transparent,\n #000 12px,\n #000 calc(100% - 12px),\n transparent\n );\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeHoverTitle {\n color: var(--dsw-static-neutral-bluish-00);\n font-size: 13px;\n line-height: 20px;\n overflow-wrap: anywhere;\n}\n\n/* Native Session hover card: full title, relative time, and current status. */\n.-cerbur-clutch-dsh-worktree-sessionHoverContent {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionHoverTitle {\n color: #FFFFFF;\n font-size: 13px;\n line-height: 20px;\n overflow-wrap: break-word;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionHoverTime {\n color: #CFD3D6;\n font-size: 12px;\n line-height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionHoverStatus {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #ADB2B8;\n font-size: 12px;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeActionSlot,\n.-cerbur-clutch-dsh-worktree-workspaceActions {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n height: 28px;\n margin-left: auto;\n}\n\n/* Workspace rows retain the native fixed action column. */\n.-cerbur-clutch-dsh-worktree-workspaceActions {\n flex: 0 0 64px;\n width: 64px;\n}\n\n/* The intrinsic action column owns the title's visible end. At rest the title\n spans it, leaving only the activity lane; revealed controls narrow the actual\n scroll viewport so the marquee tail and fade stop beside the first button.\n The leading icon, title start and action positions remain fixed. */\n.-cerbur-clutch-dsh-worktree-worktreeRow > .-cerbur-clutch-dsh-worktree-worktreeIcon {\n grid-area: 1 / 1;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow > .-cerbur-clutch-dsh-worktree-worktreeLabel {\n grid-area: 1 / 2 / 2 / 4;\n margin-inline-end: 32px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeLabel,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-worktreeLabel {\n grid-column-end: 3;\n margin-inline-end: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot {\n grid-area: 1 / 3;\n min-width: 0;\n width: auto;\n gap: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceActions > .-cerbur-clutch-dsh-worktree-menuAction {\n position: absolute;\n top: 0;\n right: 32px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceActions > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n position: absolute;\n top: 0;\n right: 0;\n visibility: hidden;\n}\n\n/* Worktree actions flow naturally so the rail matches the controls that exist. */\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n position: static;\n opacity: 0;\n pointer-events: none;\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-groupActivity {\n position: absolute;\n top: 0;\n right: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n visibility: hidden;\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-groupActivity {\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'][data-menu-open='true'] .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'][data-menu-open='true'] .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-groupActivity,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-groupActivity {\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true'][data-menu-open='true']\n .-cerbur-clutch-dsh-worktree-treeActionSlot\n > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'][data-menu-open='true']\n .-cerbur-clutch-dsh-worktree-treeActionSlot\n > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true']:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardAction {\n display: inline-flex;\n flex: 0 0 28px;\n width: 28px;\n height: 28px;\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-menuAction {\n display: inline-flex;\n flex: 0 0 28px;\n width: 28px;\n height: 28px;\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-workspaceRow:focus-within .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-workspaceRow:hover [data-add-worktree],\n.-cerbur-clutch-dsh-worktree-workspaceRow[data-menu-open='true'] [data-add-worktree],\n.-cerbur-clutch-dsh-worktree-workspaceRow:focus-within [data-add-worktree] {\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-dashboardAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-menuAction,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-treeActionSlot > .-cerbur-clutch-dsh-worktree-iconButton:last-child {\n opacity: 1;\n pointer-events: auto;\n visibility: visible;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropBefore::before,\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n position: absolute;\n right: 4px;\n left: 4px;\n height: 2px;\n border-radius: 2px;\n background: var(--dsw-alias-brand-primary);\n content: '';\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropBefore::before {\n top: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-workspaceRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n bottom: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropBefore::before,\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n position: absolute;\n right: 4px;\n left: 4px;\n height: 2px;\n border-radius: 2px;\n background: var(--dsw-alias-brand-primary);\n content: '';\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropBefore::before {\n top: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n bottom: -1px;\n}\n\n/* Depth comes from explicit nesting selectors rather than a self-referencing custom\n property (`--d: calc(var(--d) + 1)` is a cycle and resolves to invalid). Rows own\n their inline padding, so nesting never accumulates margins, and rows stay full\n width so hover fills and drop markers share one edge. */\n.-cerbur-clutch-dsh-worktree-treeChildren {\n margin-inline-start: 0;\n padding: 2px 0 5px;\n border-inline-start: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-worktreeRow,\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeSessionRow,\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-sessionOverflowButton {\n --wt-depth: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-worktreeRow,\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeSessionRow,\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-sessionOverflowButton {\n --wt-depth: 2;\n}\n\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-worktreeRow,\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeSessionRow,\n.-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-treeChildren .-cerbur-clutch-dsh-worktree-sessionOverflowButton {\n --wt-depth: 3;\n}\n\n.-cerbur-clutch-dsh-worktree-groupLabel {\n padding: 6px 8px 3px;\n color: var(--dsw-alias-label-tertiary);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n}\n\n.-cerbur-clutch-dsh-worktree-groupHeader {\n display: flex;\n align-items: center;\n min-height: 34px;\n padding-right: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-groupHeader .-cerbur-clutch-dsh-worktree-groupLabel {\n flex: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeGroup {\n margin-top: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow {\n min-height: 32px;\n padding-block: 2px;\n display: grid;\n grid-template-columns: var(--wt-lead) minmax(0, 1fr) max-content;\n}\n\n/* Session rows indent to their group's label column, not one step past the row\n start: the label reads as a child of that group without hanging to its left. */\n.-cerbur-clutch-dsh-worktree-treeSessionRow {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n margin-inline-start: 0;\n padding-inline-start: calc(\n var(--wt-row-inset) + var(--wt-depth, 0) * var(--wt-step) + var(--wt-lead) +\n var(--wt-label-pad)\n );\n padding-inline-end: var(--wt-row-inset);\n min-width: 0;\n min-height: 30px;\n box-sizing: border-box;\n border-radius: var(--dsw-radius-md);\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow:hover,\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-menu-open='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-session-current='true'] {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-session-current='true'] .-cerbur-clutch-dsh-worktree-treeSessionContent {\n font-weight: 400;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow.-cerbur-clutch-dsh-worktree-dropBefore::before,\n.-cerbur-clutch-dsh-worktree-treeSessionRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n position: absolute;\n right: 4px;\n left: 4px;\n height: 2px;\n border-radius: 2px;\n background: var(--dsw-alias-brand-primary);\n content: '';\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow.-cerbur-clutch-dsh-worktree-dropBefore::before {\n top: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow.-cerbur-clutch-dsh-worktree-dropAfter::after {\n bottom: -1px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionContent {\n display: flex;\n align-items: center;\n flex: 1;\n width: 0;\n min-width: 0;\n min-height: 30px;\n box-sizing: border-box;\n border: 0;\n border-radius: var(--dsw-radius-md);\n padding: 4px 0;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionContent:focus-visible {\n outline: 2px solid var(--dsw-alias-border-l3);\n outline-offset: 1px;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionContent:hover {\n background: transparent;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionTrailing {\n position: relative;\n display: inline-flex;\n flex: 0 0 52px;\n align-items: center;\n justify-content: flex-end;\n width: 52px;\n height: 28px;\n margin-left: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionMeta,\n.-cerbur-clutch-dsh-worktree-rowActions {\n position: absolute;\n inset: 0;\n display: inline-flex;\n align-items: center;\n justify-content: flex-end;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionMeta {\n color: var(--dsw-alias-label-tertiary);\n pointer-events: none;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionStatus {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionTime {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-right: 4px;\n font-size: 12px;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionOverflowButton {\n display: block;\n width: auto;\n margin: 2px var(--wt-row-inset) 4px\n calc(\n var(--wt-row-inset) + var(--wt-depth, 0) * var(--wt-step) + var(--wt-lead) +\n var(--wt-label-pad)\n );\n padding: 4px 8px;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\n font-size: 12px;\n font-weight: 400;\n line-height: 20px;\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-sessionOverflowButton:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n.-cerbur-clutch-dsh-worktree-rowActions {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow:hover .-cerbur-clutch-dsh-worktree-sessionMeta,\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-sessionMeta,\n.-cerbur-clutch-dsh-worktree-sessionTrailing:focus-within .-cerbur-clutch-dsh-worktree-sessionMeta {\n visibility: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-treeSessionRow:hover .-cerbur-clutch-dsh-worktree-rowActions,\n.-cerbur-clutch-dsh-worktree-treeSessionRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-rowActions,\n.-cerbur-clutch-dsh-worktree-sessionTrailing:focus-within .-cerbur-clutch-dsh-worktree-rowActions {\n display: inline-flex;\n}\n\n.-cerbur-clutch-dsh-worktree-renameInput {\n width: 100%;\n}\n\n.-cerbur-clutch-dsh-worktree-renameError {\n margin: 8px 0 0;\n color: var(--dsw-alias-state-error-primary);\n font-size: 13px;\n line-height: 20px;\n}\n\n.-cerbur-clutch-dsh-worktree-archivedGroup {\n margin-top: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-modalField {\n display: grid;\n gap: 5px;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-worktreeHoverDetails {\n max-width: 360px;\n white-space: normal;\n overflow-wrap: anywhere;\n line-height: 1.5;\n}\n";
|
|
2932
2959
|
const styleId$8 = "@cerbur/clutch-dsh-worktree/worktree.css";
|
|
2933
2960
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree.css\"]") === null) {
|
|
2934
2961
|
const tag = document.createElement("style");
|
|
@@ -2940,7 +2967,9 @@ window.__ModuleLoader__.load({
|
|
|
2940
2967
|
var worktree_css_default = {
|
|
2941
2968
|
"action": "-cerbur-clutch-dsh-worktree-action",
|
|
2942
2969
|
"actionLabel": "-cerbur-clutch-dsh-worktree-actionLabel",
|
|
2970
|
+
"workspaceSeat": "-cerbur-clutch-dsh-worktree-workspaceSeat",
|
|
2943
2971
|
"surface": "-cerbur-clutch-dsh-worktree-surface",
|
|
2972
|
+
"workspaces": "-cerbur-clutch-dsh-worktree-workspaces",
|
|
2944
2973
|
"motionExits": "-cerbur-clutch-dsh-worktree-motionExits",
|
|
2945
2974
|
"wideContent": "-cerbur-clutch-dsh-worktree-wideContent",
|
|
2946
2975
|
"worktreeRegistrationDialog": "-cerbur-clutch-dsh-worktree-worktreeRegistrationDialog",
|
|
@@ -2953,7 +2982,18 @@ window.__ModuleLoader__.load({
|
|
|
2953
2982
|
"worktreeImportError": "-cerbur-clutch-dsh-worktree-worktreeImportError",
|
|
2954
2983
|
"closeButton": "-cerbur-clutch-dsh-worktree-closeButton",
|
|
2955
2984
|
"header": "-cerbur-clutch-dsh-worktree-header",
|
|
2956
|
-
"
|
|
2985
|
+
"activityBar": "-cerbur-clutch-dsh-worktree-activityBar",
|
|
2986
|
+
"activityTabs": "-cerbur-clutch-dsh-worktree-activityTabs",
|
|
2987
|
+
"activityConfig": "-cerbur-clutch-dsh-worktree-activityConfig",
|
|
2988
|
+
"activityOption": "-cerbur-clutch-dsh-worktree-activityOption",
|
|
2989
|
+
"activityOptionLabel": "-cerbur-clutch-dsh-worktree-activityOptionLabel",
|
|
2990
|
+
"activityOptionCount": "-cerbur-clutch-dsh-worktree-activityOptionCount",
|
|
2991
|
+
"activityOptionCheck": "-cerbur-clutch-dsh-worktree-activityOptionCheck",
|
|
2992
|
+
"activitySegment": "-cerbur-clutch-dsh-worktree-activitySegment",
|
|
2993
|
+
"activitySegmentActive": "-cerbur-clutch-dsh-worktree-activitySegmentActive",
|
|
2994
|
+
"activityLabel": "-cerbur-clutch-dsh-worktree-activityLabel",
|
|
2995
|
+
"activityCount": "-cerbur-clutch-dsh-worktree-activityCount",
|
|
2996
|
+
"sidebarTitle": "-cerbur-clutch-dsh-worktree-sidebarTitle",
|
|
2957
2997
|
"titleHidden": "-cerbur-clutch-dsh-worktree-titleHidden",
|
|
2958
2998
|
"modeButton": "-cerbur-clutch-dsh-worktree-modeButton",
|
|
2959
2999
|
"workspacePicker": "-cerbur-clutch-dsh-worktree-workspacePicker",
|
|
@@ -2974,6 +3014,8 @@ window.__ModuleLoader__.load({
|
|
|
2974
3014
|
"sectionTitle": "-cerbur-clutch-dsh-worktree-sectionTitle",
|
|
2975
3015
|
"empty": "-cerbur-clutch-dsh-worktree-empty",
|
|
2976
3016
|
"message": "-cerbur-clutch-dsh-worktree-message",
|
|
3017
|
+
"emptyHint": "-cerbur-clutch-dsh-worktree-emptyHint",
|
|
3018
|
+
"activityMenuSeparator": "-cerbur-clutch-dsh-worktree-activityMenuSeparator",
|
|
2977
3019
|
"gitReadiness": "-cerbur-clutch-dsh-worktree-gitReadiness",
|
|
2978
3020
|
"commandBlock": "-cerbur-clutch-dsh-worktree-commandBlock",
|
|
2979
3021
|
"worktree": "-cerbur-clutch-dsh-worktree-worktree",
|
|
@@ -3007,14 +3049,14 @@ window.__ModuleLoader__.load({
|
|
|
3007
3049
|
"workspaceGroup": "-cerbur-clutch-dsh-worktree-workspaceGroup",
|
|
3008
3050
|
"workspaceRow": "-cerbur-clutch-dsh-worktree-workspaceRow",
|
|
3009
3051
|
"worktreeRow": "-cerbur-clutch-dsh-worktree-worktreeRow",
|
|
3052
|
+
"workspaceTitle": "-cerbur-clutch-dsh-worktree-workspaceTitle",
|
|
3010
3053
|
"workspaceDisclosure": "-cerbur-clutch-dsh-worktree-workspaceDisclosure",
|
|
3011
|
-
"workspaceIcon": "-cerbur-clutch-dsh-worktree-workspaceIcon",
|
|
3012
3054
|
"worktreeDisclosure": "-cerbur-clutch-dsh-worktree-worktreeDisclosure",
|
|
3055
|
+
"workspaceIcon": "-cerbur-clutch-dsh-worktree-workspaceIcon",
|
|
3013
3056
|
"worktreeIcon": "-cerbur-clutch-dsh-worktree-worktreeIcon",
|
|
3014
3057
|
"disclosureButton": "-cerbur-clutch-dsh-worktree-disclosureButton",
|
|
3015
3058
|
"disclosureArrow": "-cerbur-clutch-dsh-worktree-disclosureArrow",
|
|
3016
3059
|
"worktreeStateLabel": "-cerbur-clutch-dsh-worktree-worktreeStateLabel",
|
|
3017
|
-
"workspaceTitle": "-cerbur-clutch-dsh-worktree-workspaceTitle",
|
|
3018
3060
|
"treeSessionRow": "-cerbur-clutch-dsh-worktree-treeSessionRow",
|
|
3019
3061
|
"worktreeHoverTitle": "-cerbur-clutch-dsh-worktree-worktreeHoverTitle",
|
|
3020
3062
|
"sessionHoverContent": "-cerbur-clutch-dsh-worktree-sessionHoverContent",
|
|
@@ -3029,6 +3071,7 @@ window.__ModuleLoader__.load({
|
|
|
3029
3071
|
"dropBefore": "-cerbur-clutch-dsh-worktree-dropBefore",
|
|
3030
3072
|
"dropAfter": "-cerbur-clutch-dsh-worktree-dropAfter",
|
|
3031
3073
|
"treeChildren": "-cerbur-clutch-dsh-worktree-treeChildren",
|
|
3074
|
+
"sessionOverflowButton": "-cerbur-clutch-dsh-worktree-sessionOverflowButton",
|
|
3032
3075
|
"groupLabel": "-cerbur-clutch-dsh-worktree-groupLabel",
|
|
3033
3076
|
"groupHeader": "-cerbur-clutch-dsh-worktree-groupHeader",
|
|
3034
3077
|
"worktreeGroup": "-cerbur-clutch-dsh-worktree-worktreeGroup",
|
|
@@ -3038,9 +3081,7 @@ window.__ModuleLoader__.load({
|
|
|
3038
3081
|
"rowActions": "-cerbur-clutch-dsh-worktree-rowActions",
|
|
3039
3082
|
"sessionStatus": "-cerbur-clutch-dsh-worktree-sessionStatus",
|
|
3040
3083
|
"sessionTime": "-cerbur-clutch-dsh-worktree-sessionTime",
|
|
3041
|
-
"sessionOverflowButton": "-cerbur-clutch-dsh-worktree-sessionOverflowButton",
|
|
3042
3084
|
"renameError": "-cerbur-clutch-dsh-worktree-renameError",
|
|
3043
|
-
"emptyNested": "-cerbur-clutch-dsh-worktree-emptyNested",
|
|
3044
3085
|
"archivedGroup": "-cerbur-clutch-dsh-worktree-archivedGroup",
|
|
3045
3086
|
"worktreeHoverDetails": "-cerbur-clutch-dsh-worktree-worktreeHoverDetails"
|
|
3046
3087
|
};
|
|
@@ -3120,7 +3161,7 @@ window.__ModuleLoader__.load({
|
|
|
3120
3161
|
});
|
|
3121
3162
|
}
|
|
3122
3163
|
//#endregion
|
|
3123
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
3164
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/dashboard/dashboard-header-action.css.mjs
|
|
3124
3165
|
const css$7 = "/* Match the native 28px circular Session-header utility controls. */\n.-cerbur-clutch-dsh-worktree-headerDashboardButton {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 6px;\n color: var(--dsw-alias-label-secondary);\n background: transparent;\n border: none;\n border-radius: 28px;\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-headerDashboardButton svg {\n width: 16px;\n height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-headerDashboardButton:hover,\n.-cerbur-clutch-dsh-worktree-headerDashboardButton:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n";
|
|
3125
3166
|
const styleId$7 = "@cerbur/clutch-dsh-worktree/dashboard-header-action.css";
|
|
3126
3167
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/dashboard-header-action.css\"]") === null) {
|
|
@@ -3689,7 +3730,7 @@ window.__ModuleLoader__.load({
|
|
|
3689
3730
|
}, current.key);
|
|
3690
3731
|
}
|
|
3691
3732
|
//#endregion
|
|
3692
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
3733
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/select/single-select.css.mjs
|
|
3693
3734
|
const css$6 = ".-cerbur-clutch-dsh-worktree-singleSelectRoot { min-width: 0; width: 100%; }\n.-cerbur-clutch-dsh-worktree-singleSelectTrigger {\n display: flex; align-items: center; gap: 8px; width: 100%; min-width: 0;\n min-height: 36px; padding: 6px 10px; border-radius: var(--dsw-radius-md, 8px);\n border: 1px solid var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-base); color: var(--dsw-alias-label-primary);\n font: inherit; text-align: start; cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-singleSelectRoot[data-size='compact'] { width: min(280px, 45vw); }\n.-cerbur-clutch-dsh-worktree-singleSelectRoot[data-size='compact'] .-cerbur-clutch-dsh-worktree-singleSelectTrigger { min-height: 28px; padding: 3px 8px; font-size: 12px; }\n.-cerbur-clutch-dsh-worktree-singleSelectTrigger:disabled, .-cerbur-clutch-dsh-worktree-singleSelectOption:disabled { opacity: .4; cursor: default; }\n.-cerbur-clutch-dsh-worktree-singleSelectTrigger:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: 2px; }\n.-cerbur-clutch-dsh-worktree-singleSelectPopup {\n position: fixed; z-index: 1100; padding: 8px; box-sizing: border-box;\n border: 0; border-radius: var(--dsw-radius-lg, 12px);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l1);\n box-shadow: var(--dsw-elevation-prominent);\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n}\n.-cerbur-clutch-dsh-worktree-singleSelectPicker { display: flex; flex-direction: column; gap: 8px; min-width: 0; }\n.-cerbur-clutch-dsh-worktree-singleSelectSearch { box-sizing: border-box; width: 100%; min-width: 0; }\n.-cerbur-clutch-dsh-worktree-singleSelectLoading { display: flex; align-items: center; justify-content: center; gap: 8px; min-height: 80px; color: var(--dsw-alias-label-secondary); font-size: 12px; }\n.-cerbur-clutch-dsh-worktree-singleSelectLoading svg { width: 16px; height: 16px; animation: singleSelectSpin 1s linear infinite; }\n@keyframes singleSelectSpin { to { transform: rotate(360deg); } }\n@media (prefers-reduced-motion: reduce) { .-cerbur-clutch-dsh-worktree-singleSelectLoading svg { animation: none; } }\n.-cerbur-clutch-dsh-worktree-singleSelectFilters { display: flex; flex-wrap: wrap; gap: 4px; }\n.-cerbur-clutch-dsh-worktree-singleSelectFilters button {\n border: 0; border-radius: var(--dsw-radius-md, 8px); padding: 4px 8px; background: transparent;\n color: var(--dsw-alias-label-secondary); font: inherit; font-size: 11px; cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-singleSelectFilters button[aria-pressed='true'], .-cerbur-clutch-dsh-worktree-singleSelectFilters button:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-primary); }\n.-cerbur-clutch-dsh-worktree-singleSelectViewport {\n height: clamp(120px, calc(100dvh - 160px), 300px); overflow-y: auto; overscroll-behavior: contain;\n padding: 4px; box-sizing: border-box; min-height: 0;\n}\n.-cerbur-clutch-dsh-worktree-singleSelectPopup .-cerbur-clutch-dsh-worktree-singleSelectViewport { height: auto; max-height: var(--single-select-viewport-height, 220px); }\n.-cerbur-clutch-dsh-worktree-singleSelectPopup .-cerbur-clutch-dsh-worktree-singleSelectEmpty { min-height: 80px; }\n.-cerbur-clutch-dsh-worktree-singleSelectGroup { display: flex; align-items: center; justify-content: space-between; gap: 8px; height: 36px; box-sizing: border-box; padding: 6px 8px; color: var(--dsw-alias-label-tertiary); font-size: 11px; line-height: 15px; }\n.-cerbur-clutch-dsh-worktree-singleSelectOption {\n box-sizing: border-box;\n display: flex; align-items: center; gap: 6px; width: 100%; min-height: 34px;\n padding: 6px 8px; border: 0; border-radius: var(--dsw-radius-md, 8px); background: transparent;\n color: var(--dsw-alias-label-primary); font: inherit; font-size: 13px; line-height: 20px; text-align: start; cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-singleSelectOption:hover:not(:disabled), .-cerbur-clutch-dsh-worktree-singleSelectOption[data-highlighted='true']:not(:disabled), .-cerbur-clutch-dsh-worktree-singleSelectOption:focus-visible:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover); outline: none; }\n.-cerbur-clutch-dsh-worktree-singleSelectOption[data-description='true'] { min-height: 48px; }\n.-cerbur-clutch-dsh-worktree-singleSelectText { display: flex; flex-direction: column; flex: 1; min-width: 0; }\n.-cerbur-clutch-dsh-worktree-singleSelectName { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.-cerbur-clutch-dsh-worktree-singleSelectDescription { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--dsw-alias-label-tertiary); font-size: 11px; line-height: 16px; }\n.-cerbur-clutch-dsh-worktree-singleSelectBadge { flex: none; color: var(--dsw-alias-label-tertiary); font-size: 11px; }\n.-cerbur-clutch-dsh-worktree-singleSelectTrigger > svg, .-cerbur-clutch-dsh-worktree-singleSelectOption > svg { width: 14px; height: 14px; flex: none; }\n.-cerbur-clutch-dsh-worktree-singleSelectEmpty { display: grid; place-items: center; height: 100%; color: var(--dsw-alias-label-tertiary); font-size: 13px; }\n";
|
|
3694
3735
|
const styleId$6 = "@cerbur/clutch-dsh-worktree/single-select.css";
|
|
3695
3736
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/single-select.css\"]") === null) {
|
|
@@ -4090,7 +4131,7 @@ window.__ModuleLoader__.load({
|
|
|
4090
4131
|
});
|
|
4091
4132
|
}
|
|
4092
4133
|
//#endregion
|
|
4093
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
4134
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/branch/git-branch.css.mjs
|
|
4094
4135
|
const css$5 = ".-cerbur-clutch-dsh-worktree-branchFetch { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; padding: 4px; border: 0; border-radius: var(--dsw-radius-sm); background: transparent; color: var(--dsw-alias-label-secondary); cursor: pointer; }\n.-cerbur-clutch-dsh-worktree-branchFetch:hover:not(:disabled) { background: var(--dsw-alias-interactive-bg-hover); }\n.-cerbur-clutch-dsh-worktree-branchFetch:disabled { opacity: .4; cursor: default; }\n.-cerbur-clutch-dsh-worktree-branchFetch svg { width: 16px; height: 16px; }\n.-cerbur-clutch-dsh-worktree-branchFetch[aria-busy='true'] svg { animation: branchFetchSpin 1s linear infinite; }\n@keyframes branchFetchSpin { to { transform: rotate(360deg); } }\n@media (prefers-reduced-motion: reduce) { .-cerbur-clutch-dsh-worktree-branchFetch[aria-busy='true'] svg { animation: none; } }\n.-cerbur-clutch-dsh-worktree-branchFetch[data-fetch-status='success'], .-cerbur-clutch-dsh-worktree-branchFetch[data-fetch-status='error'] { width: auto; padding-inline: 6px; white-space: nowrap; font-size: 12px; line-height: 18px; }\n.-cerbur-clutch-dsh-worktree-branchFetch[data-fetch-status='success']:disabled { opacity: 1; }\n.-cerbur-clutch-dsh-worktree-branchFetch[data-fetch-status='error'] { color: var(--dsw-alias-state-error-primary); }\n";
|
|
4095
4136
|
const styleId$5 = "@cerbur/clutch-dsh-worktree/git-branch.css";
|
|
4096
4137
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/git-branch.css\"]") === null) {
|
|
@@ -5656,6 +5697,18 @@ window.__ModuleLoader__.load({
|
|
|
5656
5697
|
function isWorkspaceExpanded(state, workspaceId) {
|
|
5657
5698
|
return state.collapsedWorkspaceIds[workspaceId] !== true;
|
|
5658
5699
|
}
|
|
5700
|
+
/**
|
|
5701
|
+
* The one open Workspace that owns the tree body.
|
|
5702
|
+
*
|
|
5703
|
+
* A temporary current-Session reveal wins over the persisted choice so navigation
|
|
5704
|
+
* never waits for the store write. Otherwise the first uncollapsed Workspace is the
|
|
5705
|
+
* open one; legacy records with several uncollapsed IDs render one Workspace and are
|
|
5706
|
+
* normalized by the caller.
|
|
5707
|
+
*/
|
|
5708
|
+
function resolveOpenWorkspaceId(state, workspaceIds, revealedWorkspaceId) {
|
|
5709
|
+
if (revealedWorkspaceId !== void 0 && workspaceIds.includes(revealedWorkspaceId)) return revealedWorkspaceId;
|
|
5710
|
+
return workspaceIds.find((workspaceId) => isWorkspaceExpanded(state, workspaceId));
|
|
5711
|
+
}
|
|
5659
5712
|
function isMainExpanded(state, workspaceId) {
|
|
5660
5713
|
return state.collapsedMainWorkspaceIds[workspaceId] !== true;
|
|
5661
5714
|
}
|
|
@@ -5685,6 +5738,13 @@ window.__ModuleLoader__.load({
|
|
|
5685
5738
|
toggle(draft.collapsedWorkspaceIds, workspaceId);
|
|
5686
5739
|
});
|
|
5687
5740
|
},
|
|
5741
|
+
openWorkspaceExclusive: (workspaceId, workspaceIds) => {
|
|
5742
|
+
if (!workspaceIds.includes(workspaceId)) return;
|
|
5743
|
+
store.update((draft) => {
|
|
5744
|
+
for (const id of workspaceIds) if (id === workspaceId) delete draft.collapsedWorkspaceIds[id];
|
|
5745
|
+
else draft.collapsedWorkspaceIds[id] = true;
|
|
5746
|
+
});
|
|
5747
|
+
},
|
|
5688
5748
|
toggleMain: (workspaceId) => {
|
|
5689
5749
|
store.update((draft) => {
|
|
5690
5750
|
toggle(draft.collapsedMainWorkspaceIds, workspaceId);
|
|
@@ -5893,6 +5953,7 @@ window.__ModuleLoader__.load({
|
|
|
5893
5953
|
className: `${worktree_css_default.workspaceRow} ${markerClass}`,
|
|
5894
5954
|
"data-worktree-motion-key": `workspace:${workspace.workspaceId}`,
|
|
5895
5955
|
"data-workspace-drag": drag.active ? "active" : void 0,
|
|
5956
|
+
"data-workspace-open": expanded ? "true" : void 0,
|
|
5896
5957
|
"data-group-activity": groupActivityVisible ? "true" : void 0,
|
|
5897
5958
|
"data-menu-open": menuOpen || void 0,
|
|
5898
5959
|
draggable: true,
|
|
@@ -6408,7 +6469,7 @@ window.__ModuleLoader__.load({
|
|
|
6408
6469
|
//#endregion
|
|
6409
6470
|
//#region lib/client/surface/components/ActiveWorktree.js
|
|
6410
6471
|
function ActiveWorktree({ record, source, expansion, ordering, props, lifecycle, session, menus, mutation, read, registration, lifecycleState, drag, native, bindings, workspaceMatchesQuery, workspace, workspaceWorktreeNames, sameWorkspaceWorktreeDrag, activeWorktrees }) {
|
|
6411
|
-
const { sessions, archivedSessionIds, currentSessionId, expandSnapshot, sessionPresentations } = source;
|
|
6472
|
+
const { sessions, archivedSessionIds, currentSessionId, expandSnapshot, sessionPresentations, activity } = source;
|
|
6412
6473
|
const { query, isCurrentSessionReveal, expandedSessionGroups, toggleWorktree, toggleSessionGroup } = expansion;
|
|
6413
6474
|
const { orderedSessionIdsByAccount } = ordering;
|
|
6414
6475
|
const { t, renameSession, forkSession, archiveSession } = props;
|
|
@@ -6421,7 +6482,8 @@ window.__ModuleLoader__.load({
|
|
|
6421
6482
|
const { setWorktreeRemoval } = lifecycleState;
|
|
6422
6483
|
const { worktreeDrag, worktreeDropCommitted, setWorktreeDrag, commitWorktreeDrag, sessionDrag, sessionDropCommitted, setSessionDrag, commitSessionDrag } = drag;
|
|
6423
6484
|
const { openSessionRename, archiveWorktreeSession } = native;
|
|
6424
|
-
const worktreeSessionIds = filterVisibleSessionIds(filterArchivedSessionIds(bindingIdsFor(bindings, record.worktreeId).filter((sessionId) => sessions.ids.includes(sessionId)), archivedSessionIds), sessions);
|
|
6485
|
+
const worktreeSessionIds = filterVisibleSessionIds(activity.scopeSessionIds(filterArchivedSessionIds(bindingIdsFor(bindings, record.worktreeId).filter((sessionId) => sessions.ids.includes(sessionId)), archivedSessionIds)), sessions);
|
|
6486
|
+
if (activity.active && !activity.showInactiveStructure && worktreeSessionIds.length === 0) return null;
|
|
6425
6487
|
const worktreeMatchesQuery = workspaceMatchesQuery || includesText(record.branch, query) || includesText(record.absolutePath, query);
|
|
6426
6488
|
if (query.length > 0 && !worktreeMatchesQuery && !worktreeSessionIds.some((sessionId) => sessionMatchesQuery(sessionId, sessions, query))) return null;
|
|
6427
6489
|
const visibleWorktreeSessionIds = worktreeSessionIds.filter((sessionId) => worktreeMatchesQuery || sessionMatchesQuery(sessionId, sessions, query));
|
|
@@ -6573,7 +6635,7 @@ window.__ModuleLoader__.load({
|
|
|
6573
6635
|
//#endregion
|
|
6574
6636
|
//#region lib/client/surface/components/ArchivedWorktree.js
|
|
6575
6637
|
function ArchivedWorktree({ record, source, expansion, ordering, props, lifecycle, mutation, menus, read, lifecycleState, drag, session, native, bindings, workspaceMatchesQuery, workspace }) {
|
|
6576
|
-
const { sessions, archivedSessionIds, currentSessionId, expandSnapshot, sessionPresentations } = source;
|
|
6638
|
+
const { sessions, archivedSessionIds, currentSessionId, expandSnapshot, sessionPresentations, activity } = source;
|
|
6577
6639
|
const { query, isCurrentSessionReveal, expandedSessionGroups, toggleWorktree, toggleSessionGroup } = expansion;
|
|
6578
6640
|
const { orderedSessionIdsByAccount } = ordering;
|
|
6579
6641
|
const { t, manager, renameSession, forkSession, archiveSession } = props;
|
|
@@ -6585,7 +6647,8 @@ window.__ModuleLoader__.load({
|
|
|
6585
6647
|
const { sessionDrag, sessionDropCommitted, setSessionDrag, commitSessionDrag } = drag;
|
|
6586
6648
|
const { openWorkspaceSession } = session;
|
|
6587
6649
|
const { openSessionRename, archiveWorktreeSession } = native;
|
|
6588
|
-
const worktreeSessionIds = filterVisibleSessionIds(filterArchivedSessionIds(bindingIdsFor(bindings, record.worktreeId).filter((sessionId) => sessions.ids.includes(sessionId)), archivedSessionIds), sessions);
|
|
6650
|
+
const worktreeSessionIds = filterVisibleSessionIds(activity.scopeSessionIds(filterArchivedSessionIds(bindingIdsFor(bindings, record.worktreeId).filter((sessionId) => sessions.ids.includes(sessionId)), archivedSessionIds)), sessions);
|
|
6651
|
+
if (activity.active && !activity.showInactiveStructure && worktreeSessionIds.length === 0) return null;
|
|
6589
6652
|
const worktreeMatchesQuery = workspaceMatchesQuery || includesText(record.branch, query) || includesText(record.absolutePath, query);
|
|
6590
6653
|
if (query.length > 0 && !worktreeMatchesQuery && !worktreeSessionIds.some((sessionId) => sessionMatchesQuery(sessionId, sessions, query))) return null;
|
|
6591
6654
|
const visibleWorktreeSessionIds = worktreeSessionIds.filter((sessionId) => worktreeMatchesQuery || sessionMatchesQuery(sessionId, sessions, query));
|
|
@@ -6741,7 +6804,7 @@ window.__ModuleLoader__.load({
|
|
|
6741
6804
|
function ArchivedWorktrees({ expansion, props, source, ordering, lifecycle, mutation, menus, read, lifecycleState, drag, session, native, workspace, archivedWorktrees, bindings, workspaceMatchesQuery }) {
|
|
6742
6805
|
const { isCurrentSessionReveal, expandedArchivedWorkspaces, toggleArchivedWorkspace } = expansion;
|
|
6743
6806
|
const { t } = props;
|
|
6744
|
-
const { sessions, archivedSessionIds, sessionPresentations } = source;
|
|
6807
|
+
const { sessions, archivedSessionIds, sessionPresentations, activity } = source;
|
|
6745
6808
|
const isArchivedAutoExpanded = isCurrentSessionReveal("archived:" + workspace.workspaceId);
|
|
6746
6809
|
const isArchivedExpanded = expandedArchivedWorkspaces[workspace.workspaceId] === true || isArchivedAutoExpanded;
|
|
6747
6810
|
return (0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -6752,7 +6815,7 @@ window.__ModuleLoader__.load({
|
|
|
6752
6815
|
kind: "archived-group",
|
|
6753
6816
|
label: `${t("worktree.archivedGroup")} (${archivedWorktrees.length})`,
|
|
6754
6817
|
expanded: isArchivedExpanded,
|
|
6755
|
-
groupActivityStatus: aggregateSessionStatus(filterArchivedSessionIds(archivedWorktrees.flatMap((record) => bindingIdsFor(bindings, record.worktreeId).filter((sessionId) => sessions.ids.includes(sessionId))), archivedSessionIds), sessionPresentations),
|
|
6818
|
+
groupActivityStatus: aggregateSessionStatus(activity.scopeSessionIds(filterArchivedSessionIds(archivedWorktrees.flatMap((record) => bindingIdsFor(bindings, record.worktreeId).filter((sessionId) => sessions.ids.includes(sessionId))), archivedSessionIds)), sessionPresentations),
|
|
6756
6819
|
icon: (0, react_jsx_runtime.jsx)(IconArchiveOutline20, { size: 16 }),
|
|
6757
6820
|
workspaceTitle: workspace.title,
|
|
6758
6821
|
onToggle: () => {
|
|
@@ -6848,7 +6911,7 @@ window.__ModuleLoader__.load({
|
|
|
6848
6911
|
overlay.append(clone);
|
|
6849
6912
|
const animation = clone.animate([{ opacity: row.opacity }, { opacity: 0 }], {
|
|
6850
6913
|
duration: 100,
|
|
6851
|
-
easing: "
|
|
6914
|
+
easing: "cubic-bezier(0.4, 0, 0.2, 1)",
|
|
6852
6915
|
fill: "forwards"
|
|
6853
6916
|
});
|
|
6854
6917
|
this.removed.set(key, {
|
|
@@ -6875,7 +6938,7 @@ window.__ModuleLoader__.load({
|
|
|
6875
6938
|
move(element, frames, duration) {
|
|
6876
6939
|
const animation = element.animate(frames, {
|
|
6877
6940
|
duration,
|
|
6878
|
-
easing: "
|
|
6941
|
+
easing: "cubic-bezier(0.4, 0, 0.2, 1)"
|
|
6879
6942
|
});
|
|
6880
6943
|
this.movements.set(element, animation);
|
|
6881
6944
|
animation.onfinish = () => {
|
|
@@ -6925,31 +6988,46 @@ window.__ModuleLoader__.load({
|
|
|
6925
6988
|
function WorkspaceTree({ props, read, source, expansion, ordering, drag, mutation, menus, registration, native, lifecycle, session, lifecycleState }) {
|
|
6926
6989
|
const { t, createMainSession, openSession, renameSession, forkSession, archiveSession } = props;
|
|
6927
6990
|
const { viewByWorkspace } = read;
|
|
6928
|
-
const { expandSnapshot, workspaces, sessions, archivedSessionIds, sessionPresentations, currentSessionId } = source;
|
|
6929
|
-
const { isCurrentSessionReveal, query, expandedSessionGroups, toggleWorkspace, toggleMain, toggleSessionGroup } = expansion;
|
|
6991
|
+
const { expandSnapshot, workspaces, sessions, archivedSessionIds, sessionPresentations, currentSessionId, activity } = source;
|
|
6992
|
+
const { isCurrentSessionReveal, isWorkspaceOpen, query, expandedSessionGroups, toggleWorkspace, toggleMain, toggleSessionGroup } = expansion;
|
|
6930
6993
|
const { orderedSessionIdsByAccount } = ordering;
|
|
6931
6994
|
const { worktreeDrag, workspaceDrag, workspaceDropCommitted, setWorkspaceDrag, commitWorkspaceDrag, sessionDrag, sessionDropCommitted, setSessionDrag, commitSessionDrag } = drag;
|
|
6932
6995
|
const { actionPending } = mutation;
|
|
6933
6996
|
const { openWorkspaceMenuId, setOpenWorkspaceMenuId, openMainMenuId, setOpenMainMenuId } = menus;
|
|
6934
6997
|
const { openWorktreeCreator } = registration;
|
|
6935
6998
|
const { openWorkspaceRename, openWorkspaceDelete, openSessionRename, archiveWorktreeSession } = native;
|
|
6936
|
-
const
|
|
6999
|
+
const workspaceCandidateSessionIds = (workspaceId) => {
|
|
7000
|
+
const candidates = new Set(workspaceSessionIds(workspaces, workspaceId, sessions.ids));
|
|
7001
|
+
for (const binding of viewByWorkspace.get(workspaceId)?.bindings ?? []) candidates.add(binding.sessionId);
|
|
7002
|
+
return [...candidates];
|
|
7003
|
+
};
|
|
7004
|
+
const structureSurvivesWindow = (sessionIds) => !activity.active || activity.showInactiveStructure || activity.hasActiveSession(sessionIds);
|
|
7005
|
+
const worktreeSurvivesWindow = (workspaceId, worktreeId) => {
|
|
7006
|
+
if (!activity.active || activity.showInactiveStructure) return true;
|
|
7007
|
+
const bindings = viewByWorkspace.get(workspaceId)?.bindings ?? [];
|
|
7008
|
+
return activity.hasActiveSession(filterArchivedSessionIds(bindingIdsFor(bindings, worktreeId).filter((sessionId) => sessions.ids.includes(sessionId)), archivedSessionIds));
|
|
7009
|
+
};
|
|
7010
|
+
const visibleWorkspaces = workspaces.items.filter((workspace) => workspaceMatches(workspace, viewByWorkspace.get(workspace.workspaceId), sessions, query) && structureSurvivesWindow(workspaceCandidateSessionIds(workspace.workspaceId)));
|
|
6937
7011
|
return (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: (0, react_jsx_runtime.jsx)(AnimatedTree, {
|
|
6938
7012
|
className: worktree_css_default.workspaceList,
|
|
6939
7013
|
ready: sessions.phase !== "pending" && workspaceDrag === void 0 && worktreeDrag === void 0 && sessionDrag === void 0,
|
|
6940
|
-
resetKey: query,
|
|
6941
|
-
children: visibleWorkspaces.length === 0 ? (0, react_jsx_runtime.jsx)("p", {
|
|
7014
|
+
resetKey: activity.window + "|" + query,
|
|
7015
|
+
children: visibleWorkspaces.length === 0 ? (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("p", {
|
|
6942
7016
|
className: worktree_css_default.empty,
|
|
6943
|
-
children: t("workspace.noMatches")
|
|
6944
|
-
})
|
|
7017
|
+
children: activity.active && !activity.showInactiveStructure ? t("filter.empty") : t("workspace.noMatches")
|
|
7018
|
+
}), activity.active && !activity.showInactiveStructure && (0, react_jsx_runtime.jsx)("p", {
|
|
7019
|
+
className: worktree_css_default.emptyHint,
|
|
7020
|
+
children: t(activity.isWindowVisible("all") ? "filter.emptyHint" : "filter.emptyHintMenu")
|
|
7021
|
+
})] }) : visibleWorkspaces.map((workspace) => {
|
|
6945
7022
|
const view = viewByWorkspace.get(workspace.workspaceId);
|
|
6946
7023
|
const currentBranch = view?.currentBranch === null ? void 0 : view?.currentBranch ?? view?.branches.find((branch) => branch.isCurrent)?.name;
|
|
6947
7024
|
const currentHead = view?.checkout?.currentHead;
|
|
6948
7025
|
const mainRef = currentHead?.name ?? currentBranch;
|
|
6949
7026
|
const mainLabel = mainRef === void 0 ? t("worktree.main") : t("worktree.mainWithBranch", { branch: mainRef });
|
|
6950
|
-
const expanded =
|
|
7027
|
+
const expanded = isWorkspaceOpen(workspace.workspaceId);
|
|
6951
7028
|
const workspaceMatchesQuery = includesText(workspace.title, query);
|
|
6952
|
-
const
|
|
7029
|
+
const workspaceMembershipSessionIds = filterArchivedSessionIds(workspaceSessionIds(workspaces, workspace.workspaceId, sessions.ids), archivedSessionIds);
|
|
7030
|
+
const allWorkspaceSessionIds = activity.scopeSessionIds(workspaceMembershipSessionIds);
|
|
6953
7031
|
const workspaceGroupActivityStatus = aggregateSessionStatus(filterVisibleSessionIds(allWorkspaceSessionIds, sessions), sessionPresentations);
|
|
6954
7032
|
const bindings = view?.bindings ?? [];
|
|
6955
7033
|
const mainSessionIds = filterVisibleSessionIds(unboundSessionIds(allWorkspaceSessionIds, [...new Set(bindings.map((binding) => binding.sessionId))]).filter((id) => view?.knownSessionIds === void 0 || view.knownSessionIds.includes(id)), sessions);
|
|
@@ -6964,6 +7042,8 @@ window.__ModuleLoader__.load({
|
|
|
6964
7042
|
const worktrees = view?.worktrees ?? [];
|
|
6965
7043
|
const activeWorktrees = worktrees.filter((record) => record.status === "active");
|
|
6966
7044
|
const archivedWorktrees = worktrees.filter((record) => record.status === "removed");
|
|
7045
|
+
const visibleActiveWorktrees = activeWorktrees.filter((record) => worktreeSurvivesWindow(workspace.workspaceId, record.worktreeId));
|
|
7046
|
+
const visibleArchivedWorktrees = archivedWorktrees.filter((record) => worktreeSurvivesWindow(workspace.workspaceId, record.worktreeId));
|
|
6967
7047
|
const workspaceWorktreeNames = [...view?.branches.map((branch) => branch.name) ?? [], ...view?.worktrees.map((worktree) => worktree.branch) ?? []];
|
|
6968
7048
|
const sameWorkspaceWorktreeDrag = worktreeDrag?.workspaceId === workspace.workspaceId;
|
|
6969
7049
|
return (0, react_jsx_runtime.jsxs)("section", {
|
|
@@ -7113,11 +7193,7 @@ window.__ModuleLoader__.load({
|
|
|
7113
7193
|
onFork: forkSession,
|
|
7114
7194
|
onArchive: archiveSession === void 0 ? void 0 : archiveWorktreeSession
|
|
7115
7195
|
}),
|
|
7116
|
-
|
|
7117
|
-
className: worktree_css_default.emptyNested,
|
|
7118
|
-
children: t("worktree.noWorktrees")
|
|
7119
|
-
}),
|
|
7120
|
-
activeWorktrees.map((record) => (0, react_jsx_runtime.jsx)(ActiveWorktree, {
|
|
7196
|
+
visibleActiveWorktrees.map((record) => (0, react_jsx_runtime.jsx)(ActiveWorktree, {
|
|
7121
7197
|
record,
|
|
7122
7198
|
source,
|
|
7123
7199
|
expansion,
|
|
@@ -7139,7 +7215,7 @@ window.__ModuleLoader__.load({
|
|
|
7139
7215
|
sameWorkspaceWorktreeDrag,
|
|
7140
7216
|
activeWorktrees
|
|
7141
7217
|
}, record.worktreeId)),
|
|
7142
|
-
|
|
7218
|
+
visibleArchivedWorktrees.length > 0 && (0, react_jsx_runtime.jsx)(ArchivedWorktrees, {
|
|
7143
7219
|
expansion,
|
|
7144
7220
|
props,
|
|
7145
7221
|
source,
|
|
@@ -7153,7 +7229,7 @@ window.__ModuleLoader__.load({
|
|
|
7153
7229
|
session,
|
|
7154
7230
|
native,
|
|
7155
7231
|
workspace,
|
|
7156
|
-
archivedWorktrees,
|
|
7232
|
+
archivedWorktrees: visibleArchivedWorktrees,
|
|
7157
7233
|
bindings,
|
|
7158
7234
|
workspaceMatchesQuery
|
|
7159
7235
|
})
|
|
@@ -7437,6 +7513,167 @@ window.__ModuleLoader__.load({
|
|
|
7437
7513
|
});
|
|
7438
7514
|
}
|
|
7439
7515
|
//#endregion
|
|
7516
|
+
//#region lib/client/surface/components/ActivityFilterBar.js
|
|
7517
|
+
/** Short labels keep four ranges readable in a narrow Sidebar. */
|
|
7518
|
+
const ACTIVITY_OPTIONS = [
|
|
7519
|
+
{
|
|
7520
|
+
id: "today",
|
|
7521
|
+
labelKey: "filter.today"
|
|
7522
|
+
},
|
|
7523
|
+
{
|
|
7524
|
+
id: "last24h",
|
|
7525
|
+
labelKey: "filter.last24h"
|
|
7526
|
+
},
|
|
7527
|
+
{
|
|
7528
|
+
id: "last7d",
|
|
7529
|
+
labelKey: "filter.last7d"
|
|
7530
|
+
},
|
|
7531
|
+
{
|
|
7532
|
+
id: "all",
|
|
7533
|
+
labelKey: "filter.all"
|
|
7534
|
+
}
|
|
7535
|
+
];
|
|
7536
|
+
/**
|
|
7537
|
+
* Browser-only range selector above the Worktree tree.
|
|
7538
|
+
*
|
|
7539
|
+
* It scopes an existing projection and adds no read: counts come from the Session
|
|
7540
|
+
* list and presentations already held by the surface, and the selected range is a
|
|
7541
|
+
* Client preference, never a Sidecar or DSH value. The trailing menu only chooses
|
|
7542
|
+
* which ranges the bar renders; it never changes membership or Host state.
|
|
7543
|
+
*/
|
|
7544
|
+
function ActivityFilterBar({ t, activity }) {
|
|
7545
|
+
const chooseLabel = t("filter.choose");
|
|
7546
|
+
const onlyVisible = activity.visibleWindows.length === 1;
|
|
7547
|
+
return (0, react_jsx_runtime.jsxs)("div", {
|
|
7548
|
+
className: worktree_css_default.activityBar,
|
|
7549
|
+
children: [(0, react_jsx_runtime.jsx)("div", {
|
|
7550
|
+
className: worktree_css_default.activityTabs,
|
|
7551
|
+
role: "group",
|
|
7552
|
+
"aria-label": t("filter.group"),
|
|
7553
|
+
children: ACTIVITY_OPTIONS.filter(({ id }) => activity.isWindowVisible(id)).map(({ id, labelKey }) => {
|
|
7554
|
+
const label = t(labelKey);
|
|
7555
|
+
const selected = activity.window === id;
|
|
7556
|
+
const count = activity.count(id);
|
|
7557
|
+
const accessibleLabel = t("filter.count", {
|
|
7558
|
+
label,
|
|
7559
|
+
count
|
|
7560
|
+
});
|
|
7561
|
+
return (0, react_jsx_runtime.jsxs)("button", {
|
|
7562
|
+
type: "button",
|
|
7563
|
+
className: cx(worktree_css_default.activitySegment, selected && worktree_css_default.activitySegmentActive),
|
|
7564
|
+
"data-activity-window": id,
|
|
7565
|
+
"data-selected": selected || void 0,
|
|
7566
|
+
"aria-pressed": selected,
|
|
7567
|
+
"aria-label": accessibleLabel,
|
|
7568
|
+
title: accessibleLabel,
|
|
7569
|
+
onClick: () => {
|
|
7570
|
+
activity.setWindow(id);
|
|
7571
|
+
},
|
|
7572
|
+
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
7573
|
+
className: worktree_css_default.activityLabel,
|
|
7574
|
+
children: label
|
|
7575
|
+
}), count > 0 && (0, react_jsx_runtime.jsx)("span", {
|
|
7576
|
+
className: worktree_css_default.activityCount,
|
|
7577
|
+
"aria-hidden": "true",
|
|
7578
|
+
children: count
|
|
7579
|
+
})]
|
|
7580
|
+
}, id);
|
|
7581
|
+
})
|
|
7582
|
+
}), (0, react_jsx_runtime.jsxs)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
|
|
7583
|
+
open: activity.menuOpen,
|
|
7584
|
+
onClose: () => {
|
|
7585
|
+
activity.setMenuOpen(false);
|
|
7586
|
+
},
|
|
7587
|
+
align: "end",
|
|
7588
|
+
portal: true,
|
|
7589
|
+
items: [{
|
|
7590
|
+
type: "label",
|
|
7591
|
+
id: "visible-filters",
|
|
7592
|
+
text: t("filter.visible")
|
|
7593
|
+
}],
|
|
7594
|
+
anchor: (0, react_jsx_runtime.jsx)("button", {
|
|
7595
|
+
type: "button",
|
|
7596
|
+
className: worktree_css_default.activityConfig,
|
|
7597
|
+
"data-activity-config": true,
|
|
7598
|
+
"aria-label": chooseLabel,
|
|
7599
|
+
"aria-haspopup": "menu",
|
|
7600
|
+
"aria-expanded": activity.menuOpen,
|
|
7601
|
+
title: chooseLabel,
|
|
7602
|
+
onClick: () => {
|
|
7603
|
+
activity.setMenuOpen(!activity.menuOpen);
|
|
7604
|
+
},
|
|
7605
|
+
children: (0, react_jsx_runtime.jsx)(IconSlidersTwoOutline16, {})
|
|
7606
|
+
}),
|
|
7607
|
+
children: [
|
|
7608
|
+
ACTIVITY_OPTIONS.map(({ id, labelKey }) => {
|
|
7609
|
+
const label = t(labelKey);
|
|
7610
|
+
const checked = activity.isWindowVisible(id);
|
|
7611
|
+
const locked = checked && onlyVisible;
|
|
7612
|
+
return (0, react_jsx_runtime.jsxs)("button", {
|
|
7613
|
+
type: "button",
|
|
7614
|
+
role: "menuitemcheckbox",
|
|
7615
|
+
"aria-checked": checked,
|
|
7616
|
+
"aria-label": t("filter.count", {
|
|
7617
|
+
label,
|
|
7618
|
+
count: activity.count(id)
|
|
7619
|
+
}),
|
|
7620
|
+
className: worktree_css_default.activityOption,
|
|
7621
|
+
"data-activity-option": id,
|
|
7622
|
+
"data-checked": checked || void 0,
|
|
7623
|
+
disabled: locked,
|
|
7624
|
+
title: locked ? t("filter.keepOne") : void 0,
|
|
7625
|
+
onClick: () => {
|
|
7626
|
+
activity.setWindowVisible(id, !checked);
|
|
7627
|
+
},
|
|
7628
|
+
children: [
|
|
7629
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
7630
|
+
className: worktree_css_default.activityOptionLabel,
|
|
7631
|
+
children: label
|
|
7632
|
+
}),
|
|
7633
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
7634
|
+
className: worktree_css_default.activityOptionCount,
|
|
7635
|
+
"aria-hidden": "true",
|
|
7636
|
+
children: activity.count(id)
|
|
7637
|
+
}),
|
|
7638
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
7639
|
+
className: worktree_css_default.activityOptionCheck,
|
|
7640
|
+
"aria-hidden": "true",
|
|
7641
|
+
children: checked && (0, react_jsx_runtime.jsx)(IconCheckOutline16, {})
|
|
7642
|
+
})
|
|
7643
|
+
]
|
|
7644
|
+
}, id);
|
|
7645
|
+
}),
|
|
7646
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
7647
|
+
className: worktree_css_default.activityMenuSeparator,
|
|
7648
|
+
role: "separator",
|
|
7649
|
+
"aria-hidden": "true"
|
|
7650
|
+
}),
|
|
7651
|
+
(0, react_jsx_runtime.jsxs)("button", {
|
|
7652
|
+
type: "button",
|
|
7653
|
+
role: "menuitemcheckbox",
|
|
7654
|
+
"aria-checked": activity.showInactiveStructure,
|
|
7655
|
+
"aria-label": t("filter.keepInactive"),
|
|
7656
|
+
className: worktree_css_default.activityOption,
|
|
7657
|
+
"data-activity-keep-inactive": true,
|
|
7658
|
+
"data-checked": activity.showInactiveStructure || void 0,
|
|
7659
|
+
title: t("filter.keepInactiveHint"),
|
|
7660
|
+
onClick: () => {
|
|
7661
|
+
activity.setShowInactiveStructure(!activity.showInactiveStructure);
|
|
7662
|
+
},
|
|
7663
|
+
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
7664
|
+
className: worktree_css_default.activityOptionLabel,
|
|
7665
|
+
children: t("filter.keepInactive")
|
|
7666
|
+
}), (0, react_jsx_runtime.jsx)("span", {
|
|
7667
|
+
className: worktree_css_default.activityOptionCheck,
|
|
7668
|
+
"aria-hidden": "true",
|
|
7669
|
+
children: activity.showInactiveStructure && (0, react_jsx_runtime.jsx)(IconCheckOutline16, {})
|
|
7670
|
+
})]
|
|
7671
|
+
})
|
|
7672
|
+
]
|
|
7673
|
+
})]
|
|
7674
|
+
});
|
|
7675
|
+
}
|
|
7676
|
+
//#endregion
|
|
7440
7677
|
//#region lib/client/session/active-sessions.js
|
|
7441
7678
|
/** Join existing ready facts only, independently of tree search, folding and row limits. */
|
|
7442
7679
|
function activeSessions(sessions, presentations, workspaces, views) {
|
|
@@ -7683,7 +7920,7 @@ window.__ModuleLoader__.load({
|
|
|
7683
7920
|
className: worktree_css_default.header,
|
|
7684
7921
|
children: [
|
|
7685
7922
|
(0, react_jsx_runtime.jsx)("span", {
|
|
7686
|
-
className: cx(worktree_css_default.
|
|
7923
|
+
className: cx(worktree_css_default.sidebarTitle, searchExpanded && worktree_css_default.titleHidden),
|
|
7687
7924
|
children: t("worktree.title")
|
|
7688
7925
|
}),
|
|
7689
7926
|
(0, react_jsx_runtime.jsx)("div", {
|
|
@@ -8797,6 +9034,7 @@ window.__ModuleLoader__.load({
|
|
|
8797
9034
|
const [currentSessionReveal, setCurrentSessionReveal] = (0, react.useState)();
|
|
8798
9035
|
const revealSessionIdRef = (0, react.useRef)(Symbol("initial"));
|
|
8799
9036
|
const revealModeRef = (0, react.useRef)(Symbol("initial"));
|
|
9037
|
+
const appliedRevealRef = (0, react.useRef)();
|
|
8800
9038
|
let activeReveal = currentSessionReveal;
|
|
8801
9039
|
if (currentSessionId !== revealSessionIdRef.current || mode !== revealModeRef.current) {
|
|
8802
9040
|
revealSessionIdRef.current = currentSessionId;
|
|
@@ -8809,6 +9047,9 @@ window.__ModuleLoader__.load({
|
|
|
8809
9047
|
}
|
|
8810
9048
|
const searchQueryRef = (0, react.useRef)(searchQuery);
|
|
8811
9049
|
searchQueryRef.current = searchQuery;
|
|
9050
|
+
(0, react.useEffect)(() => {
|
|
9051
|
+
if (mode !== "worktree") appliedRevealRef.current = void 0;
|
|
9052
|
+
}, [mode]);
|
|
8812
9053
|
(0, react.useEffect)(() => {
|
|
8813
9054
|
if (!searchExpanded) return;
|
|
8814
9055
|
const onClick = (event) => {
|
|
@@ -8838,6 +9079,9 @@ window.__ModuleLoader__.load({
|
|
|
8838
9079
|
]);
|
|
8839
9080
|
const currentRevealKeys = (0, react.useMemo)(() => new Set(currentSessionRevealKeys(currentSessionLocation)), [currentSessionLocation]);
|
|
8840
9081
|
const isCurrentSessionReveal = (key) => activeReveal !== void 0 && activeReveal.sessionId === currentSessionId && currentRevealKeys.has(key) && activeReveal.suppressedKeys[key] !== true;
|
|
9082
|
+
const revealedWorkspaceId = currentSessionLocation?.workspaceId !== void 0 && workspaceIds.includes(currentSessionLocation.workspaceId) && isCurrentSessionReveal("workspace:" + currentSessionLocation.workspaceId) ? currentSessionLocation.workspaceId : void 0;
|
|
9083
|
+
const openWorkspaceId = resolveOpenWorkspaceId(expandSnapshot, workspaceIds, revealedWorkspaceId);
|
|
9084
|
+
const isWorkspaceOpen = (workspaceId) => workspaceId === openWorkspaceId;
|
|
8841
9085
|
(0, react.useLayoutEffect)(() => {
|
|
8842
9086
|
locateGenerationRef.current += 1;
|
|
8843
9087
|
positionedLocateGenerationRef.current = void 0;
|
|
@@ -8873,6 +9117,30 @@ window.__ModuleLoader__.load({
|
|
|
8873
9117
|
query,
|
|
8874
9118
|
readState.status
|
|
8875
9119
|
]);
|
|
9120
|
+
(0, react.useLayoutEffect)(() => {
|
|
9121
|
+
if (mode !== "worktree" || readState.status !== "ready" || isPendingListPhase(workspaces.phase) || workspaceIds.length === 0) return;
|
|
9122
|
+
const expandedIds = workspaceIds.filter((workspaceId) => isWorkspaceExpanded(expandSnapshot, workspaceId));
|
|
9123
|
+
if (revealedWorkspaceId !== void 0) {
|
|
9124
|
+
const applied = appliedRevealRef.current;
|
|
9125
|
+
if (applied !== void 0 && applied.sessionId === currentSessionId && applied.workspaceId === revealedWorkspaceId) return;
|
|
9126
|
+
expandState.actions.openWorkspaceExclusive(revealedWorkspaceId, workspaceIds);
|
|
9127
|
+
appliedRevealRef.current = {
|
|
9128
|
+
sessionId: currentSessionId,
|
|
9129
|
+
workspaceId: revealedWorkspaceId
|
|
9130
|
+
};
|
|
9131
|
+
return;
|
|
9132
|
+
}
|
|
9133
|
+
if (expandedIds.length > 1 && openWorkspaceId !== void 0) expandState.actions.openWorkspaceExclusive(openWorkspaceId, workspaceIds);
|
|
9134
|
+
}, [
|
|
9135
|
+
mode,
|
|
9136
|
+
readState.status,
|
|
9137
|
+
workspaces.phase,
|
|
9138
|
+
workspaceIds,
|
|
9139
|
+
expandSnapshot,
|
|
9140
|
+
revealedWorkspaceId,
|
|
9141
|
+
openWorkspaceId,
|
|
9142
|
+
expandState
|
|
9143
|
+
]);
|
|
8876
9144
|
(0, react.useEffect)(() => {
|
|
8877
9145
|
if (readState.status !== "ready" || isPendingListPhase(workspaces.phase) || !isCompleteWorktreeWorkspaceSnapshot(workspaceIds, readState.views)) return;
|
|
8878
9146
|
expandState.actions.retain(workspaceIds, readState.views.flatMap((view) => view.worktrees.map((record) => record.worktreeId)));
|
|
@@ -8901,17 +9169,18 @@ window.__ModuleLoader__.load({
|
|
|
8901
9169
|
});
|
|
8902
9170
|
return true;
|
|
8903
9171
|
};
|
|
9172
|
+
const workspaceGroupKeys = (workspaceId) => ["main:" + workspaceId, ...(viewByWorkspace.get(workspaceId)?.worktrees.map((record) => record.worktreeId) ?? []).map((worktreeId) => "worktree:" + worktreeId)];
|
|
8904
9173
|
const toggleWorkspace = (workspaceId) => {
|
|
8905
|
-
|
|
8906
|
-
|
|
8907
|
-
|
|
8908
|
-
|
|
8909
|
-
if (visuallyExpanded && !persistedExpanded) {
|
|
8910
|
-
clearSessionGroups(["main:" + workspaceId, ...(viewByWorkspace.get(workspaceId)?.worktrees.map((record) => record.worktreeId) ?? []).map((worktreeId) => "worktree:" + worktreeId)]);
|
|
9174
|
+
if (openWorkspaceId === workspaceId) {
|
|
9175
|
+
suppressCurrentSessionReveal("workspace:" + workspaceId);
|
|
9176
|
+
if (isWorkspaceExpanded(expandSnapshot, workspaceId)) expandState.actions.toggleWorkspace(workspaceId);
|
|
9177
|
+
clearSessionGroups(workspaceGroupKeys(workspaceId));
|
|
8911
9178
|
return;
|
|
8912
9179
|
}
|
|
8913
|
-
|
|
8914
|
-
if (
|
|
9180
|
+
const currentWorkspaceId = currentSessionLocation?.workspaceId;
|
|
9181
|
+
if (currentWorkspaceId !== void 0 && currentWorkspaceId !== workspaceId) suppressCurrentSessionReveal("workspace:" + currentWorkspaceId);
|
|
9182
|
+
if (openWorkspaceId !== void 0) clearSessionGroups(workspaceGroupKeys(openWorkspaceId));
|
|
9183
|
+
expandState.actions.openWorkspaceExclusive(workspaceId, workspaceIds);
|
|
8915
9184
|
};
|
|
8916
9185
|
const toggleMain = (workspaceId) => {
|
|
8917
9186
|
const persistedExpanded = isMainExpanded(expandSnapshot, workspaceId);
|
|
@@ -8984,6 +9253,8 @@ window.__ModuleLoader__.load({
|
|
|
8984
9253
|
currentSessionLocation,
|
|
8985
9254
|
currentRevealKeys,
|
|
8986
9255
|
isCurrentSessionReveal,
|
|
9256
|
+
openWorkspaceId,
|
|
9257
|
+
isWorkspaceOpen,
|
|
8987
9258
|
clearSessionGroups,
|
|
8988
9259
|
suppressCurrentSessionReveal,
|
|
8989
9260
|
toggleWorkspace,
|
|
@@ -9464,485 +9735,285 @@ window.__ModuleLoader__.load({
|
|
|
9464
9735
|
};
|
|
9465
9736
|
}
|
|
9466
9737
|
//#endregion
|
|
9467
|
-
//#region lib/client/
|
|
9468
|
-
|
|
9469
|
-
|
|
9470
|
-
|
|
9471
|
-
|
|
9472
|
-
|
|
9473
|
-
|
|
9474
|
-
|
|
9475
|
-
|
|
9476
|
-
|
|
9477
|
-
|
|
9478
|
-
|
|
9479
|
-
|
|
9480
|
-
|
|
9481
|
-
|
|
9738
|
+
//#region lib/client/view/workspace-region-geometry.js
|
|
9739
|
+
/** Measure only the plugin-owned seat for popover readiness, never for placement. */
|
|
9740
|
+
function useWorkspaceRegionGeometry(seat) {
|
|
9741
|
+
const [measured, setMeasured] = (0, react.useState)();
|
|
9742
|
+
(0, react.useLayoutEffect)(() => {
|
|
9743
|
+
if (!seat) return;
|
|
9744
|
+
const element = seat.element;
|
|
9745
|
+
let disposed = false;
|
|
9746
|
+
const measure = () => {
|
|
9747
|
+
if (disposed) return;
|
|
9748
|
+
const rect = element.getBoundingClientRect();
|
|
9749
|
+
const height = element.isConnected && Number.isFinite(rect.height) && rect.width > 0 ? Math.max(0, rect.height) : 0;
|
|
9750
|
+
setMeasured((previous) => previous?.element === element && previous.height === height ? previous : {
|
|
9751
|
+
element,
|
|
9752
|
+
height
|
|
9753
|
+
});
|
|
9754
|
+
};
|
|
9755
|
+
measure();
|
|
9756
|
+
const observer = typeof ResizeObserver === "undefined" ? void 0 : new ResizeObserver(measure);
|
|
9757
|
+
observer?.observe(element);
|
|
9758
|
+
return () => {
|
|
9759
|
+
disposed = true;
|
|
9760
|
+
observer?.disconnect();
|
|
9761
|
+
};
|
|
9762
|
+
}, [seat]);
|
|
9763
|
+
const collapsed = seat?.wide !== true;
|
|
9764
|
+
const height = measured?.element === seat?.element ? measured?.height ?? 0 : 0;
|
|
9482
9765
|
return {
|
|
9483
|
-
|
|
9484
|
-
|
|
9485
|
-
|
|
9766
|
+
collapsed,
|
|
9767
|
+
bounds: {
|
|
9768
|
+
ready: !collapsed && height > 0,
|
|
9769
|
+
top: 0,
|
|
9770
|
+
height
|
|
9771
|
+
}
|
|
9486
9772
|
};
|
|
9487
9773
|
}
|
|
9488
9774
|
//#endregion
|
|
9489
|
-
//#region lib/client/
|
|
9490
|
-
/**
|
|
9491
|
-
|
|
9492
|
-
|
|
9493
|
-
|
|
9494
|
-
|
|
9775
|
+
//#region lib/client/view/activity-filter.js
|
|
9776
|
+
/**
|
|
9777
|
+
* Browser-only activity window that scopes the Worktree tree.
|
|
9778
|
+
*
|
|
9779
|
+
* The filter is a presentation projection over native Session facts
|
|
9780
|
+
* (`updatedAt`, running state and pending interaction). It never adds an RPC,
|
|
9781
|
+
* never reads Git, and never writes a Sidecar field: hiding a row must not
|
|
9782
|
+
* change what the Host or DSH considers to exist.
|
|
9783
|
+
*/
|
|
9784
|
+
const ACTIVITY_WINDOWS = [
|
|
9785
|
+
"today",
|
|
9786
|
+
"last24h",
|
|
9787
|
+
"last7d",
|
|
9788
|
+
"all"
|
|
9789
|
+
];
|
|
9790
|
+
const DAY_MS = 864e5;
|
|
9791
|
+
function isActivityWindowId(value) {
|
|
9792
|
+
return typeof value === "string" && ACTIVITY_WINDOWS.includes(value);
|
|
9495
9793
|
}
|
|
9496
|
-
|
|
9497
|
-
|
|
9498
|
-
|
|
9499
|
-
|
|
9500
|
-
|
|
9501
|
-
|
|
9502
|
-
|
|
9503
|
-
|
|
9504
|
-
|
|
9505
|
-
|
|
9506
|
-
|
|
9507
|
-
|
|
9508
|
-
|
|
9794
|
+
/** Guard persisted values before they scope a visible tree. */
|
|
9795
|
+
function effectiveActivityWindow(value) {
|
|
9796
|
+
return isActivityWindowId(value) ? value : "all";
|
|
9797
|
+
}
|
|
9798
|
+
/** The selector shows every range until the user narrows it. */
|
|
9799
|
+
const DEFAULT_ACTIVITY_WINDOWS = ACTIVITY_WINDOWS;
|
|
9800
|
+
/**
|
|
9801
|
+
* Guard the persisted visible-range list: unknown and duplicate entries are
|
|
9802
|
+
* dropped, the canonical selector order is restored, and an empty result falls
|
|
9803
|
+
* back to every range so the selector can never become unreachable.
|
|
9804
|
+
*/
|
|
9805
|
+
function effectiveActivityWindows(value) {
|
|
9806
|
+
const values = Array.isArray(value) ? value.filter(isActivityWindowId) : [];
|
|
9807
|
+
const selected = new Set(values);
|
|
9808
|
+
const visible = ACTIVITY_WINDOWS.filter((window) => selected.has(window));
|
|
9809
|
+
return visible.length > 0 ? visible : DEFAULT_ACTIVITY_WINDOWS;
|
|
9810
|
+
}
|
|
9811
|
+
/**
|
|
9812
|
+
* Apply one visibility checkbox without producing an empty selector.
|
|
9813
|
+
* Re-showing a range inserts it back into the canonical order.
|
|
9814
|
+
*/
|
|
9815
|
+
function toggleActivityWindow(current, window, visible) {
|
|
9816
|
+
const enabled = new Set(current);
|
|
9817
|
+
if (visible === enabled.has(window)) return current;
|
|
9818
|
+
if (visible) enabled.add(window);
|
|
9819
|
+
else enabled.delete(window);
|
|
9820
|
+
if (enabled.size === 0) return current;
|
|
9821
|
+
return ACTIVITY_WINDOWS.filter((candidate) => enabled.has(candidate));
|
|
9822
|
+
}
|
|
9823
|
+
/**
|
|
9824
|
+
* Pick the tab that takes over when the selected range is hidden: the next
|
|
9825
|
+
* visible range in selector order, wrapping to the first one at the end.
|
|
9826
|
+
*/
|
|
9827
|
+
function nextActivityWindow(hidden, visible) {
|
|
9828
|
+
const start = ACTIVITY_WINDOWS.indexOf(hidden);
|
|
9829
|
+
for (let step = 1; step <= ACTIVITY_WINDOWS.length; step += 1) {
|
|
9830
|
+
const candidate = ACTIVITY_WINDOWS[(start + step) % ACTIVITY_WINDOWS.length];
|
|
9831
|
+
if (candidate !== void 0 && visible.includes(candidate)) return candidate;
|
|
9832
|
+
}
|
|
9833
|
+
return visible[0] ?? "all";
|
|
9834
|
+
}
|
|
9835
|
+
/** Local calendar-day start: DSH presents Session times in the local time zone. */
|
|
9836
|
+
function startOfLocalDay(now) {
|
|
9837
|
+
const date = new Date(now);
|
|
9838
|
+
date.setHours(0, 0, 0, 0);
|
|
9839
|
+
return date.getTime();
|
|
9840
|
+
}
|
|
9841
|
+
/** Inclusive lower bound in epoch milliseconds; `undefined` disables filtering. */
|
|
9842
|
+
function activityWindowSince(window, now) {
|
|
9843
|
+
if (!Number.isFinite(now)) return void 0;
|
|
9844
|
+
switch (window) {
|
|
9845
|
+
case "today": return startOfLocalDay(now);
|
|
9846
|
+
case "last24h": return now - DAY_MS;
|
|
9847
|
+
case "last7d": return now - 7 * DAY_MS;
|
|
9848
|
+
case "all": return;
|
|
9509
9849
|
}
|
|
9510
9850
|
}
|
|
9511
|
-
function
|
|
9512
|
-
|
|
9513
|
-
|
|
9514
|
-
rect.right,
|
|
9515
|
-
rect.top,
|
|
9516
|
-
rect.bottom,
|
|
9517
|
-
rect.width,
|
|
9518
|
-
rect.height
|
|
9519
|
-
].every(Number.isFinite);
|
|
9851
|
+
function lastActivityAt(sessionId, scope) {
|
|
9852
|
+
const updatedAt = scope.sessionPresentations[sessionId]?.updatedAt ?? scope.sessions.byId[sessionId]?.updatedAt;
|
|
9853
|
+
return updatedAt !== void 0 && Number.isFinite(updatedAt) ? updatedAt : void 0;
|
|
9520
9854
|
}
|
|
9521
|
-
|
|
9522
|
-
|
|
9523
|
-
|
|
9524
|
-
|
|
9525
|
-
|
|
9526
|
-
|
|
9527
|
-
const
|
|
9528
|
-
|
|
9529
|
-
if (
|
|
9530
|
-
const
|
|
9531
|
-
if (
|
|
9532
|
-
const
|
|
9533
|
-
|
|
9534
|
-
|
|
9535
|
-
|
|
9536
|
-
|
|
9537
|
-
|
|
9538
|
-
|
|
9855
|
+
/**
|
|
9856
|
+
* A Session is active in a window when it runs now, waits for interaction, or
|
|
9857
|
+
* was updated inside the window. Running and pending Sessions count even with
|
|
9858
|
+
* an old `updatedAt`, because they are active now.
|
|
9859
|
+
*/
|
|
9860
|
+
function isSessionActiveInWindow(sessionId, window, now, scope) {
|
|
9861
|
+
const since = activityWindowSince(window, now);
|
|
9862
|
+
if (since === void 0) return true;
|
|
9863
|
+
if (scope.currentSessionId === sessionId) return true;
|
|
9864
|
+
const presentation = scope.sessionPresentations[sessionId];
|
|
9865
|
+
if (presentation !== void 0 && (presentation.ongoing || presentation.status.state === "warning")) return true;
|
|
9866
|
+
const at = lastActivityAt(sessionId, scope);
|
|
9867
|
+
return at !== void 0 && at >= since;
|
|
9868
|
+
}
|
|
9869
|
+
/** Filter a group without mutating its source order. */
|
|
9870
|
+
function filterSessionIdsByActivity(sessionIds, window, now, scope) {
|
|
9871
|
+
if (window === "all") return sessionIds;
|
|
9872
|
+
return sessionIds.filter((sessionId) => isSessionActiveInWindow(sessionId, window, now, scope));
|
|
9873
|
+
}
|
|
9874
|
+
/** Session scope the tree and the range selector both count. */
|
|
9875
|
+
function activityCandidateSessionIds(source, archivedSessionIds) {
|
|
9876
|
+
const excluded = new Set(archivedSessionIds);
|
|
9877
|
+
return source.ids.filter((sessionId) => !excluded.has(sessionId) && source.byId[sessionId]?.blank !== true);
|
|
9878
|
+
}
|
|
9879
|
+
/** Count the Sessions a window would show; used for the range selector labels. */
|
|
9880
|
+
function countSessionsInWindow(candidateSessionIds, window, now, scope) {
|
|
9881
|
+
return filterSessionIdsByActivity(candidateSessionIds, window, now, scope).length;
|
|
9882
|
+
}
|
|
9883
|
+
//#endregion
|
|
9884
|
+
//#region lib/client/surface/state/useActivityFilter.js
|
|
9885
|
+
/** A bounded window crosses a day/hour boundary while the panel is open. */
|
|
9886
|
+
const ACTIVITY_CLOCK_INTERVAL_MS = 6e4;
|
|
9887
|
+
/**
|
|
9888
|
+
* Derive the browser-only activity range for the Worktree tree.
|
|
9889
|
+
*
|
|
9890
|
+
* The range is a persisted Client preference read through the shared view store;
|
|
9891
|
+
* this hook adds the wall clock, the per-Session predicate and the range counts.
|
|
9892
|
+
* It reads only native Session facts, so it never widens the refresh scope.
|
|
9893
|
+
*/
|
|
9894
|
+
function useActivityFilter({ props, source, enabled }) {
|
|
9895
|
+
const preferred = props.useStore((state) => state.activityWindow);
|
|
9896
|
+
const preferredWindows = props.useStore((state) => state.activityWindows);
|
|
9897
|
+
const showInactiveStructure = props.useStore((state) => state.showInactiveStructure !== false);
|
|
9898
|
+
const visibleWindows = (0, react.useMemo)(() => effectiveActivityWindows(preferredWindows), [preferredWindows]);
|
|
9899
|
+
const preferredWindow = effectiveActivityWindow(preferred);
|
|
9900
|
+
const window = visibleWindows.includes(preferredWindow) ? preferredWindow : visibleWindows[0] ?? "all";
|
|
9901
|
+
const [now, setNow] = (0, react.useState)(() => Date.now());
|
|
9902
|
+
const [menuOpen, setMenuOpen] = (0, react.useState)(false);
|
|
9903
|
+
(0, react.useEffect)(() => {
|
|
9904
|
+
if (!enabled) return;
|
|
9905
|
+
setNow(Date.now());
|
|
9906
|
+
const timer = setInterval(() => setNow(Date.now()), ACTIVITY_CLOCK_INTERVAL_MS);
|
|
9907
|
+
return () => clearInterval(timer);
|
|
9908
|
+
}, [enabled]);
|
|
9909
|
+
const { sessions, sessionPresentations, currentSessionId, archivedSessionIds } = source;
|
|
9910
|
+
const scope = (0, react.useMemo)(() => ({
|
|
9911
|
+
sessions,
|
|
9912
|
+
sessionPresentations,
|
|
9913
|
+
...currentSessionId === void 0 ? {} : { currentSessionId }
|
|
9914
|
+
}), [
|
|
9915
|
+
sessions,
|
|
9916
|
+
sessionPresentations,
|
|
9917
|
+
currentSessionId
|
|
9918
|
+
]);
|
|
9919
|
+
const candidateSessionIds = (0, react.useMemo)(() => activityCandidateSessionIds(sessions, archivedSessionIds), [sessions, archivedSessionIds]);
|
|
9920
|
+
const counts = (0, react.useMemo)(() => {
|
|
9921
|
+
const next = {};
|
|
9922
|
+
for (const candidate of ACTIVITY_WINDOWS) next[candidate] = countSessionsInWindow(candidateSessionIds, candidate, now, scope);
|
|
9923
|
+
return next;
|
|
9924
|
+
}, [
|
|
9925
|
+
candidateSessionIds,
|
|
9926
|
+
now,
|
|
9927
|
+
scope
|
|
9928
|
+
]);
|
|
9929
|
+
const isActive = (0, react.useCallback)((sessionId) => isSessionActiveInWindow(sessionId, window, now, scope), [
|
|
9930
|
+
now,
|
|
9931
|
+
scope,
|
|
9932
|
+
window
|
|
9933
|
+
]);
|
|
9934
|
+
const hasActiveSession = (0, react.useCallback)((sessionIds) => sessionIds.some(isActive), [isActive]);
|
|
9935
|
+
const scopeSessionIds = (0, react.useCallback)((sessionIds) => window === "all" ? sessionIds : sessionIds.filter(isActive), [isActive, window]);
|
|
9936
|
+
const setWindow = (0, react.useCallback)((next) => {
|
|
9937
|
+
props.actions.setActivityWindow(effectiveActivityWindow(next));
|
|
9938
|
+
}, [props.actions]);
|
|
9939
|
+
const isWindowVisible = (0, react.useCallback)((candidate) => visibleWindows.includes(candidate), [visibleWindows]);
|
|
9940
|
+
const setWindowVisible = (0, react.useCallback)((candidate, visible) => {
|
|
9941
|
+
props.actions.setActivityWindowVisible(candidate, visible);
|
|
9942
|
+
}, [props.actions]);
|
|
9943
|
+
const setShowInactiveStructure = (0, react.useCallback)((show) => {
|
|
9944
|
+
props.actions.setShowInactiveStructure(show === true);
|
|
9945
|
+
}, [props.actions]);
|
|
9946
|
+
const count = (0, react.useCallback)((candidate) => counts[effectiveActivityWindow(candidate)] ?? 0, [counts]);
|
|
9539
9947
|
return {
|
|
9540
|
-
|
|
9541
|
-
|
|
9948
|
+
window,
|
|
9949
|
+
active: window !== "all",
|
|
9950
|
+
now,
|
|
9951
|
+
setWindow,
|
|
9952
|
+
visibleWindows,
|
|
9953
|
+
isWindowVisible,
|
|
9954
|
+
setWindowVisible,
|
|
9955
|
+
showInactiveStructure,
|
|
9956
|
+
setShowInactiveStructure,
|
|
9957
|
+
menuOpen,
|
|
9958
|
+
setMenuOpen,
|
|
9959
|
+
isActive,
|
|
9960
|
+
scopeSessionIds,
|
|
9961
|
+
hasActiveSession,
|
|
9962
|
+
count
|
|
9542
9963
|
};
|
|
9543
9964
|
}
|
|
9544
9965
|
//#endregion
|
|
9545
|
-
//#region lib/client/
|
|
9546
|
-
|
|
9547
|
-
|
|
9548
|
-
|
|
9549
|
-
const
|
|
9550
|
-
const
|
|
9551
|
-
const
|
|
9552
|
-
const
|
|
9553
|
-
|
|
9554
|
-
|
|
9555
|
-
|
|
9556
|
-
|
|
9557
|
-
|
|
9558
|
-
|
|
9559
|
-
|
|
9560
|
-
|
|
9561
|
-
|
|
9562
|
-
|
|
9563
|
-
|
|
9564
|
-
|
|
9565
|
-
|
|
9566
|
-
|
|
9567
|
-
|
|
9568
|
-
const
|
|
9569
|
-
const
|
|
9570
|
-
|
|
9571
|
-
|
|
9572
|
-
|
|
9573
|
-
|
|
9574
|
-
|
|
9575
|
-
|
|
9576
|
-
|
|
9577
|
-
|
|
9578
|
-
|
|
9579
|
-
|
|
9580
|
-
|
|
9581
|
-
|
|
9582
|
-
|
|
9583
|
-
|
|
9584
|
-
|
|
9585
|
-
|
|
9586
|
-
|
|
9587
|
-
|
|
9588
|
-
|
|
9589
|
-
|
|
9590
|
-
|
|
9591
|
-
|
|
9592
|
-
|
|
9593
|
-
|
|
9594
|
-
|
|
9595
|
-
|
|
9596
|
-
const nextObserved = [
|
|
9597
|
-
frame,
|
|
9598
|
-
overlay,
|
|
9599
|
-
...Array.from(frame.children),
|
|
9600
|
-
...Array.from(frame.querySelectorAll("[data-rightbar-col]"))
|
|
9601
|
-
];
|
|
9602
|
-
for (const old of observed) if (!nextObserved.includes(old)) resize?.unobserve(old);
|
|
9603
|
-
for (const next of nextObserved) if (!observed.includes(next)) resize?.observe(next);
|
|
9604
|
-
observed = nextObserved;
|
|
9605
|
-
if (!anchors || !content) {
|
|
9606
|
-
restore();
|
|
9607
|
-
onPlacement(void 0);
|
|
9608
|
-
if (lastRightSidebarOpen) {
|
|
9609
|
-
lastRightSidebarOpen = false;
|
|
9610
|
-
options?.onRightSidebarChange?.(false);
|
|
9611
|
-
}
|
|
9612
|
-
return;
|
|
9613
|
-
}
|
|
9614
|
-
const { sidebar } = anchors;
|
|
9615
|
-
const { center, rightbar } = content;
|
|
9616
|
-
const box = overlay.getBoundingClientRect();
|
|
9617
|
-
const boundary = sidebar.getBoundingClientRect();
|
|
9618
|
-
const rightBoundary = rightbar instanceof HTMLElement ? rightbar.getBoundingClientRect().left : box.right;
|
|
9619
|
-
const left = Math.max(0, boundary.right - box.left + SIDEBAR_RESIZE_HANDLE_HALF_WIDTH);
|
|
9620
|
-
const width = Math.min(box.right, rightBoundary) - box.left - left;
|
|
9621
|
-
if (width <= 0 || box.height <= 0) {
|
|
9622
|
-
restore();
|
|
9623
|
-
onPlacement(void 0);
|
|
9624
|
-
return;
|
|
9625
|
-
}
|
|
9626
|
-
const centerBox = center.getBoundingClientRect();
|
|
9627
|
-
const top = Math.max(0, centerBox.top - box.top);
|
|
9628
|
-
const height = Math.min(box.bottom, centerBox.bottom) - box.top - top;
|
|
9629
|
-
if (height <= 0) {
|
|
9630
|
-
restore();
|
|
9631
|
-
onPlacement(void 0);
|
|
9632
|
-
return;
|
|
9633
|
-
}
|
|
9634
|
-
for (const [element, cleanup] of hidden) if (element !== center) {
|
|
9635
|
-
cleanup();
|
|
9636
|
-
hidden.delete(element);
|
|
9637
|
-
}
|
|
9638
|
-
if (!hidden.has(center)) hidden.set(center, concealDashboardBackground(center));
|
|
9639
|
-
onPlacement({
|
|
9640
|
-
left,
|
|
9641
|
-
top,
|
|
9642
|
-
width,
|
|
9643
|
-
height
|
|
9644
|
-
});
|
|
9645
|
-
const isRightSidebarOpen = options?.isRightSidebarExpanded !== void 0 ? options.isRightSidebarExpanded() : isRightSidebarOpenFromDom(frame, rightbar);
|
|
9646
|
-
if (lastRightSidebarOpen !== isRightSidebarOpen) {
|
|
9647
|
-
lastRightSidebarOpen = isRightSidebarOpen;
|
|
9648
|
-
options?.onRightSidebarChange?.(isRightSidebarOpen);
|
|
9649
|
-
}
|
|
9650
|
-
};
|
|
9651
|
-
const mutation = typeof MutationObserver === "undefined" ? void 0 : new MutationObserver(schedule);
|
|
9652
|
-
try {
|
|
9653
|
-
mutation?.observe(frame, {
|
|
9654
|
-
childList: true,
|
|
9655
|
-
attributes: true,
|
|
9656
|
-
subtree: true,
|
|
9657
|
-
attributeFilter: [
|
|
9658
|
-
"data-rightbar-collapsed",
|
|
9659
|
-
"data-sidebar-right-open",
|
|
9660
|
-
"data-sidebar-right-panel",
|
|
9661
|
-
"data-rightbar-col",
|
|
9662
|
-
"data-worktree-mode-action",
|
|
9663
|
-
"data-pane",
|
|
9664
|
-
"data-window-drag",
|
|
9665
|
-
"data-shell-leading",
|
|
9666
|
-
"data-shell-overlay"
|
|
9667
|
-
]
|
|
9668
|
-
});
|
|
9669
|
-
} catch {
|
|
9670
|
-
mutation?.observe(frame, { childList: true });
|
|
9671
|
-
}
|
|
9672
|
-
if (frame.parentElement) try {
|
|
9673
|
-
mutation?.observe(frame.parentElement, { childList: true });
|
|
9674
|
-
} catch {}
|
|
9675
|
-
update();
|
|
9676
|
-
return () => {
|
|
9677
|
-
disposed = true;
|
|
9678
|
-
resize?.disconnect();
|
|
9679
|
-
mutation?.disconnect();
|
|
9680
|
-
if (scheduled !== void 0) cancelAnimationFrame(scheduled);
|
|
9681
|
-
restore();
|
|
9682
|
-
if (lastRightSidebarOpen) {
|
|
9683
|
-
lastRightSidebarOpen = false;
|
|
9684
|
-
options?.onRightSidebarChange?.(false);
|
|
9685
|
-
}
|
|
9686
|
-
};
|
|
9687
|
-
}
|
|
9688
|
-
//#endregion
|
|
9689
|
-
//#region lib/client/overlay/sidebar-overlay-geometry.js
|
|
9690
|
-
const EMPTY_BOUNDS = {
|
|
9691
|
-
ready: false,
|
|
9692
|
-
top: 0,
|
|
9693
|
-
height: 0
|
|
9694
|
-
};
|
|
9695
|
-
function asRect(element) {
|
|
9696
|
-
const rect = element.getBoundingClientRect();
|
|
9697
|
-
return {
|
|
9698
|
-
top: rect.top,
|
|
9699
|
-
bottom: rect.bottom
|
|
9700
|
-
};
|
|
9701
|
-
}
|
|
9702
|
-
function syncObservedElement(observer, previous, next) {
|
|
9703
|
-
const nextElement = next ?? void 0;
|
|
9704
|
-
if (previous === nextElement) return previous;
|
|
9705
|
-
if (previous !== void 0) observer?.unobserve(previous);
|
|
9706
|
-
if (nextElement !== void 0) observer?.observe(nextElement);
|
|
9707
|
-
return nextElement;
|
|
9708
|
-
}
|
|
9709
|
-
function resolveNativeSidebarRoot(sidebar) {
|
|
9710
|
-
const newSession = findNewSessionAnchor(sidebar);
|
|
9711
|
-
const action = sidebar.querySelector("[data-worktree-mode-action]");
|
|
9712
|
-
if (!newSession || !action) return void 0;
|
|
9713
|
-
let candidate;
|
|
9714
|
-
for (let root = newSession.parentElement; root; root = root.parentElement) {
|
|
9715
|
-
const content = directChildWithin(root, newSession);
|
|
9716
|
-
const footer = directChildWithin(root, action);
|
|
9717
|
-
const rect = root.getBoundingClientRect();
|
|
9718
|
-
if (content && footer && content !== footer) {
|
|
9719
|
-
candidate ??= root;
|
|
9720
|
-
if (rect.width > 0 && rect.height > 0) return root;
|
|
9721
|
-
}
|
|
9722
|
-
if (root === sidebar) break;
|
|
9723
|
-
}
|
|
9724
|
-
return candidate;
|
|
9725
|
-
}
|
|
9726
|
-
function findNewSessionAnchor(root) {
|
|
9727
|
-
const labels = [
|
|
9728
|
-
"新建会话",
|
|
9729
|
-
"New session",
|
|
9730
|
-
"新会话",
|
|
9731
|
-
"New Session"
|
|
9732
|
-
];
|
|
9733
|
-
const buttons = Array.from(root.querySelectorAll("button")).filter((button) => {
|
|
9734
|
-
let parent = button.parentElement;
|
|
9735
|
-
while (parent && parent !== root) {
|
|
9736
|
-
if (parent.hasAttribute("data-window-drag")) return false;
|
|
9737
|
-
parent = parent.parentElement;
|
|
9738
|
-
}
|
|
9739
|
-
return true;
|
|
9740
|
-
});
|
|
9741
|
-
const visibleLabel = buttons.find((button) => {
|
|
9742
|
-
const text = button.textContent?.trim();
|
|
9743
|
-
if (!text) return false;
|
|
9744
|
-
return text.startsWith("新会话") || text.startsWith("New Session");
|
|
9745
|
-
});
|
|
9746
|
-
if (visibleLabel !== void 0) return visibleLabel;
|
|
9747
|
-
for (const label of labels) {
|
|
9748
|
-
const button = buttons.find((candidate) => candidate.getAttribute("aria-label") === label);
|
|
9749
|
-
if (button !== void 0) return button;
|
|
9750
|
-
}
|
|
9751
|
-
}
|
|
9752
|
-
function sidebarFooterCandidate(root) {
|
|
9753
|
-
return directChildWithin(root, root.querySelector("[data-worktree-mode-action]"));
|
|
9754
|
-
}
|
|
9755
|
-
/** Resolve the footer slot semantically, then validate its content boundary. */
|
|
9756
|
-
function resolveSidebarFooter(root, newSession) {
|
|
9757
|
-
if (!newSession) return void 0;
|
|
9758
|
-
const children = Array.from(root.children);
|
|
9759
|
-
const content = directChildWithin(root, newSession);
|
|
9760
|
-
const start = content === void 0 ? -1 : children.indexOf(content);
|
|
9761
|
-
if (start < 0) return void 0;
|
|
9762
|
-
const anchorRect = asRect(newSession);
|
|
9763
|
-
const rootRect = asRect(root);
|
|
9764
|
-
const candidate = sidebarFooterCandidate(root);
|
|
9765
|
-
if (!candidate || children.indexOf(candidate) <= start) return void 0;
|
|
9766
|
-
const rect = asRect(candidate);
|
|
9767
|
-
return [
|
|
9768
|
-
anchorRect.top,
|
|
9769
|
-
anchorRect.bottom,
|
|
9770
|
-
rootRect.top,
|
|
9771
|
-
rootRect.bottom,
|
|
9772
|
-
rect.top,
|
|
9773
|
-
rect.bottom
|
|
9774
|
-
].every(Number.isFinite) && anchorRect.bottom > anchorRect.top && rect.bottom > rect.top && rect.top >= anchorRect.bottom && rect.top >= rootRect.top && rect.bottom <= rootRect.bottom ? candidate : void 0;
|
|
9775
|
-
}
|
|
9776
|
-
/** Hide only the native content covered by the plugin, keeping chrome and footer alive. */
|
|
9777
|
-
function coveredSidebarChildren(root, newSession, footer) {
|
|
9778
|
-
if (!newSession || !footer) return [];
|
|
9779
|
-
const first = directChildWithin(root, newSession);
|
|
9780
|
-
const children = Array.from(root.children ?? []);
|
|
9781
|
-
const start = first === void 0 ? -1 : children.indexOf(first);
|
|
9782
|
-
const end = children.indexOf(footer);
|
|
9783
|
-
if (start < 0 || end <= start) return [];
|
|
9784
|
-
return children.slice(start, end).filter((element) => element instanceof HTMLElement);
|
|
9785
|
-
}
|
|
9786
|
-
function concealSidebarContent(element) {
|
|
9787
|
-
const restore = concealDashboardBackground(element);
|
|
9788
|
-
const opacity = element.style.getPropertyValue("opacity");
|
|
9789
|
-
const priority = element.style.getPropertyPriority("opacity");
|
|
9790
|
-
element.style.setProperty("opacity", "0");
|
|
9791
|
-
return () => {
|
|
9792
|
-
restore();
|
|
9793
|
-
if (element.style.getPropertyValue("opacity") !== "0") return;
|
|
9794
|
-
if (opacity) element.style.setProperty("opacity", opacity, priority);
|
|
9795
|
-
else element.style.removeProperty("opacity");
|
|
9796
|
-
};
|
|
9797
|
-
}
|
|
9798
|
-
function useSidebarOverlayGeometry(active) {
|
|
9799
|
-
const ref = (0, react.useRef)(null);
|
|
9800
|
-
const [width, setWidth] = (0, react.useState)(280);
|
|
9801
|
-
const [bounds, setBounds] = (0, react.useState)(EMPTY_BOUNDS);
|
|
9802
|
-
const [collapsed, setCollapsed] = (0, react.useState)(false);
|
|
9803
|
-
const [nativeCovered, setNativeCovered] = (0, react.useState)(false);
|
|
9804
|
-
(0, react.useLayoutEffect)(() => {
|
|
9805
|
-
if (!active) {
|
|
9806
|
-
setBounds(EMPTY_BOUNDS);
|
|
9807
|
-
setNativeCovered(false);
|
|
9808
|
-
return;
|
|
9809
|
-
}
|
|
9810
|
-
const surface = ref.current;
|
|
9811
|
-
const overlay = surface?.closest("[data-shell-overlay]");
|
|
9812
|
-
const frame = overlay?.parentElement;
|
|
9813
|
-
if (!(overlay instanceof HTMLElement) || !frame || !surface) {
|
|
9814
|
-
setBounds(EMPTY_BOUNDS);
|
|
9815
|
-
return;
|
|
9816
|
-
}
|
|
9817
|
-
const overlayElement = overlay;
|
|
9818
|
-
let frameHandle;
|
|
9819
|
-
let disposed = false;
|
|
9820
|
-
let observedNewSession;
|
|
9821
|
-
let observedFooter;
|
|
9822
|
-
let observedRoot;
|
|
9823
|
-
let observedSidebar;
|
|
9824
|
-
const hidden = /* @__PURE__ */ new Map();
|
|
9825
|
-
function restore() {
|
|
9826
|
-
for (const cleanup of hidden.values()) cleanup();
|
|
9827
|
-
hidden.clear();
|
|
9828
|
-
}
|
|
9829
|
-
function update() {
|
|
9830
|
-
if (disposed) return;
|
|
9831
|
-
const anchors = resolveAppFrame(surface);
|
|
9832
|
-
const sidebarElement = anchors?.sidebar;
|
|
9833
|
-
const currentRoot = sidebarElement && resolveNativeSidebarRoot(sidebarElement);
|
|
9834
|
-
observedSidebar = syncObservedElement(resizeObserver, observedSidebar, sidebarElement);
|
|
9835
|
-
observedRoot = syncObservedElement(resizeObserver, observedRoot, currentRoot);
|
|
9836
|
-
const nextWidth = sidebarElement?.getBoundingClientRect().width;
|
|
9837
|
-
const nextCollapsed = frame?.hasAttribute("data-sidebar-collapsed") === true || nextWidth !== void 0 && nextWidth <= 64;
|
|
9838
|
-
setCollapsed(nextCollapsed);
|
|
9839
|
-
if (nextWidth !== void 0 && Number.isFinite(nextWidth)) setWidth(Math.max(0, nextWidth));
|
|
9840
|
-
if (anchors?.frame !== frame || anchors?.overlay !== overlayElement || !(currentRoot instanceof HTMLElement) || !sidebarElement || nextWidth === void 0 || !Number.isFinite(nextWidth)) {
|
|
9841
|
-
observedNewSession = syncObservedElement(resizeObserver, observedNewSession, void 0);
|
|
9842
|
-
observedFooter = syncObservedElement(resizeObserver, observedFooter, void 0);
|
|
9843
|
-
restore();
|
|
9844
|
-
setNativeCovered(false);
|
|
9845
|
-
setBounds(EMPTY_BOUNDS);
|
|
9846
|
-
return;
|
|
9847
|
-
}
|
|
9848
|
-
const newSession = findNewSessionAnchor(currentRoot);
|
|
9849
|
-
const footer = resolveSidebarFooter(currentRoot, newSession);
|
|
9850
|
-
observedNewSession = syncObservedElement(resizeObserver, observedNewSession, newSession);
|
|
9851
|
-
observedFooter = syncObservedElement(resizeObserver, observedFooter, sidebarFooterCandidate(currentRoot));
|
|
9852
|
-
const nextBounds = computeOverlayBounds(asRect(overlayElement), newSession === void 0 ? void 0 : asRect(newSession), footer === void 0 ? void 0 : asRect(footer));
|
|
9853
|
-
setBounds(nextCollapsed ? EMPTY_BOUNDS : nextBounds);
|
|
9854
|
-
const covered = !nextCollapsed && nextBounds.ready && nextBounds.height > 0 ? coveredSidebarChildren(currentRoot, newSession, footer) : [];
|
|
9855
|
-
for (const [element, cleanup] of hidden) if (!covered.includes(element)) {
|
|
9856
|
-
cleanup();
|
|
9857
|
-
hidden.delete(element);
|
|
9858
|
-
}
|
|
9859
|
-
for (const element of covered) if (!hidden.has(element)) hidden.set(element, concealSidebarContent(element));
|
|
9860
|
-
setNativeCovered(covered.length > 0);
|
|
9861
|
-
}
|
|
9862
|
-
function scheduleUpdate() {
|
|
9863
|
-
if (disposed || frameHandle !== void 0) return;
|
|
9864
|
-
frameHandle = requestAnimationFrame(() => {
|
|
9865
|
-
frameHandle = void 0;
|
|
9866
|
-
update();
|
|
9867
|
-
});
|
|
9868
|
-
}
|
|
9869
|
-
const resizeObserver = typeof ResizeObserver === "function" ? new ResizeObserver(scheduleUpdate) : void 0;
|
|
9870
|
-
for (const element of [overlayElement, frame]) resizeObserver?.observe(element);
|
|
9871
|
-
update();
|
|
9872
|
-
const mutationObserver = typeof MutationObserver === "function" ? new MutationObserver(scheduleUpdate) : void 0;
|
|
9873
|
-
mutationObserver?.observe(frame, {
|
|
9874
|
-
childList: true,
|
|
9875
|
-
subtree: true,
|
|
9876
|
-
attributes: true,
|
|
9877
|
-
attributeFilter: [
|
|
9878
|
-
"data-sidebar-collapsed",
|
|
9879
|
-
"data-worktree-mode-action",
|
|
9880
|
-
"data-pane",
|
|
9881
|
-
"data-shell-overlay",
|
|
9882
|
-
"data-window-drag"
|
|
9883
|
-
]
|
|
9884
|
-
});
|
|
9885
|
-
if (frame?.parentElement) mutationObserver?.observe(frame.parentElement, { childList: true });
|
|
9886
|
-
return () => {
|
|
9887
|
-
disposed = true;
|
|
9888
|
-
resizeObserver?.disconnect();
|
|
9889
|
-
mutationObserver?.disconnect();
|
|
9890
|
-
if (frameHandle !== void 0) cancelAnimationFrame(frameHandle);
|
|
9891
|
-
restore();
|
|
9892
|
-
};
|
|
9893
|
-
}, [active]);
|
|
9894
|
-
return {
|
|
9895
|
-
ref,
|
|
9896
|
-
width,
|
|
9897
|
-
bounds,
|
|
9898
|
-
collapsed,
|
|
9899
|
-
nativeCovered
|
|
9900
|
-
};
|
|
9901
|
-
}
|
|
9902
|
-
//#endregion
|
|
9903
|
-
//#region lib/client/surface/state/useSurfaceSources.js
|
|
9904
|
-
function useSurfaceSources({ props }) {
|
|
9905
|
-
const { useStore, available, manager, useSessions, useSessionStatus, useWorkspaces, forkRecovery, expandState, sessionOrder } = props;
|
|
9906
|
-
const preferredMode = useStore((state) => state.viewMode);
|
|
9907
|
-
const mode = effectiveViewMode(preferredMode, available && manager !== void 0);
|
|
9908
|
-
const sessions = useSessions((state) => state);
|
|
9909
|
-
const sessionStatuses = useSessionStatus?.((state) => state);
|
|
9910
|
-
const nativeWorkspaces = useWorkspaces((state) => state);
|
|
9911
|
-
const retainedWorkspaces = (0, react.useRef)();
|
|
9912
|
-
const workspaces = (0, react.useMemo)(() => {
|
|
9913
|
-
const next = retainPendingWorkspaces(retainedWorkspaces.current, nativeWorkspaces);
|
|
9914
|
-
retainedWorkspaces.current = next;
|
|
9915
|
-
return next;
|
|
9916
|
-
}, [nativeWorkspaces]);
|
|
9917
|
-
const forkRecoveryStore = forkRecovery ?? EMPTY_FORK_RECOVERY_STORE;
|
|
9918
|
-
const forkRecoverySnapshot = (0, react.useSyncExternalStore)(forkRecoveryStore.subscribe, forkRecoveryStore.getSnapshot, forkRecoveryStore.getSnapshot);
|
|
9919
|
-
const currentSessionId = currentSessionIdFromList(sessions);
|
|
9920
|
-
const workspaceIds = useStableWorkspaceIds(workspaces.items);
|
|
9921
|
-
const workspaceIdsRef = (0, react.useRef)(workspaceIds);
|
|
9922
|
-
workspaceIdsRef.current = workspaceIds;
|
|
9923
|
-
const expandSnapshot = (0, react.useSyncExternalStore)(expandState.subscribe, expandState.getSnapshot, expandState.getSnapshot);
|
|
9924
|
-
const sessionOrderSnapshot = (0, react.useSyncExternalStore)(sessionOrder.subscribe, sessionOrder.getSnapshot, sessionOrder.getSnapshot);
|
|
9925
|
-
const sessionPresentations = (0, react.useMemo)(() => deriveSessionPresentationIndex(sessions, sessionStatuses), [sessions.byId, sessionStatuses]);
|
|
9926
|
-
const { ref, width, bounds, collapsed, nativeCovered } = useSidebarOverlayGeometry(mode === "worktree");
|
|
9927
|
-
return {
|
|
9928
|
-
preferredMode,
|
|
9929
|
-
mode,
|
|
9930
|
-
sessions,
|
|
9931
|
-
workspaces,
|
|
9932
|
-
forkRecoveryStore,
|
|
9933
|
-
forkRecoverySnapshot,
|
|
9934
|
-
currentSessionId,
|
|
9935
|
-
workspaceIds,
|
|
9936
|
-
workspaceIdsRef,
|
|
9937
|
-
expandSnapshot,
|
|
9938
|
-
sessionOrderSnapshot,
|
|
9939
|
-
sessionPresentations,
|
|
9940
|
-
ref,
|
|
9941
|
-
width,
|
|
9942
|
-
bounds,
|
|
9943
|
-
collapsed,
|
|
9944
|
-
nativeCovered,
|
|
9945
|
-
archivedSessionIds: workspaces.archivedSessionIds ?? []
|
|
9966
|
+
//#region lib/client/surface/state/useSurfaceSources.js
|
|
9967
|
+
function useSurfaceSources({ props }) {
|
|
9968
|
+
const { useStore, available, manager, useSessions, useSessionStatus, useWorkspaces, forkRecovery, expandState, sessionOrder } = props;
|
|
9969
|
+
const preferredMode = useStore((state) => state.viewMode);
|
|
9970
|
+
const mode = effectiveViewMode(preferredMode, available && manager !== void 0);
|
|
9971
|
+
const sessions = useSessions((state) => state);
|
|
9972
|
+
const sessionStatuses = useSessionStatus?.((state) => state);
|
|
9973
|
+
const nativeWorkspaces = useWorkspaces((state) => state);
|
|
9974
|
+
const retainedWorkspaces = (0, react.useRef)();
|
|
9975
|
+
const workspaces = (0, react.useMemo)(() => {
|
|
9976
|
+
const next = retainPendingWorkspaces(retainedWorkspaces.current, nativeWorkspaces);
|
|
9977
|
+
retainedWorkspaces.current = next;
|
|
9978
|
+
return next;
|
|
9979
|
+
}, [nativeWorkspaces]);
|
|
9980
|
+
const forkRecoveryStore = forkRecovery ?? EMPTY_FORK_RECOVERY_STORE;
|
|
9981
|
+
const forkRecoverySnapshot = (0, react.useSyncExternalStore)(forkRecoveryStore.subscribe, forkRecoveryStore.getSnapshot, forkRecoveryStore.getSnapshot);
|
|
9982
|
+
const currentSessionId = currentSessionIdFromList(sessions);
|
|
9983
|
+
const workspaceIds = useStableWorkspaceIds(workspaces.items);
|
|
9984
|
+
const workspaceIdsRef = (0, react.useRef)(workspaceIds);
|
|
9985
|
+
workspaceIdsRef.current = workspaceIds;
|
|
9986
|
+
const expandSnapshot = (0, react.useSyncExternalStore)(expandState.subscribe, expandState.getSnapshot, expandState.getSnapshot);
|
|
9987
|
+
const sessionOrderSnapshot = (0, react.useSyncExternalStore)(sessionOrder.subscribe, sessionOrder.getSnapshot, sessionOrder.getSnapshot);
|
|
9988
|
+
const sessionPresentations = (0, react.useMemo)(() => deriveSessionPresentationIndex(sessions, sessionStatuses), [sessions.byId, sessionStatuses]);
|
|
9989
|
+
const { bounds, collapsed } = useWorkspaceRegionGeometry(props.sidebarSeat);
|
|
9990
|
+
const archivedSessionIds = workspaces.archivedSessionIds ?? [];
|
|
9991
|
+
return {
|
|
9992
|
+
preferredMode,
|
|
9993
|
+
mode,
|
|
9994
|
+
sessions,
|
|
9995
|
+
workspaces,
|
|
9996
|
+
forkRecoveryStore,
|
|
9997
|
+
forkRecoverySnapshot,
|
|
9998
|
+
currentSessionId,
|
|
9999
|
+
workspaceIds,
|
|
10000
|
+
workspaceIdsRef,
|
|
10001
|
+
expandSnapshot,
|
|
10002
|
+
sessionOrderSnapshot,
|
|
10003
|
+
sessionPresentations,
|
|
10004
|
+
activity: useActivityFilter({
|
|
10005
|
+
props,
|
|
10006
|
+
enabled: mode === "worktree",
|
|
10007
|
+
source: {
|
|
10008
|
+
sessions,
|
|
10009
|
+
sessionPresentations,
|
|
10010
|
+
currentSessionId,
|
|
10011
|
+
archivedSessionIds
|
|
10012
|
+
}
|
|
10013
|
+
}),
|
|
10014
|
+
bounds,
|
|
10015
|
+
collapsed,
|
|
10016
|
+
archivedSessionIds
|
|
9946
10017
|
};
|
|
9947
10018
|
}
|
|
9948
10019
|
//#endregion
|
|
@@ -10223,7 +10294,7 @@ window.__ModuleLoader__.load({
|
|
|
10223
10294
|
};
|
|
10224
10295
|
const defaultOpenInAppController = new OpenInAppController();
|
|
10225
10296
|
//#endregion
|
|
10226
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
10297
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/dashboard/open-in-app.css.mjs
|
|
10227
10298
|
const css$4 = ".-cerbur-clutch-dsh-worktree-control {\n display: inline-flex;\n align-self: flex-end;\n}\n\n.-cerbur-clutch-dsh-worktree-split {\n display: inline-flex;\n align-items: stretch;\n box-sizing: border-box;\n height: 28px;\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: 14px;\n overflow: hidden;\n font-family: var(--dsw-font-family);\n}\n\n.-cerbur-clutch-dsh-worktree-split .-cerbur-clutch-dsh-worktree-main,\n.-cerbur-clutch-dsh-worktree-split .-cerbur-clutch-dsh-worktree-chevron {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n border: 0;\n background: none;\n color: var(--dsw-alias-label-primary);\n font-size: 11px;\n font-weight: 400;\n line-height: 16px;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-main {\n padding: 5px 6px 5px 7px;\n}\n\n.-cerbur-clutch-dsh-worktree-main:hover:not(:disabled),\n.-cerbur-clutch-dsh-worktree-main:focus-visible,\n.-cerbur-clutch-dsh-worktree-chevron:hover,\n.-cerbur-clutch-dsh-worktree-chevron:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.-cerbur-clutch-dsh-worktree-main:disabled {\n color: var(--dsw-alias-label-dimmed);\n cursor: wait;\n}\n\n.-cerbur-clutch-dsh-worktree-main[data-state='error'] {\n color: var(--dsw-alias-state-error-primary, #e03e3e);\n box-shadow: inset 0 0 0 1px var(--dsw-alias-state-error-primary, #e03e3e);\n}\n\n.-cerbur-clutch-dsh-worktree-split .-cerbur-clutch-dsh-worktree-chevron {\n padding: 5px 6px 5px 4px;\n border-left: 0.5px solid var(--dsw-alias-border-l4);\n color: var(--dsw-alias-label-secondary);\n}\n\n.-cerbur-clutch-dsh-worktree-icon {\n flex: none;\n}\n\n.-cerbur-clutch-dsh-worktree-split .-cerbur-clutch-dsh-worktree-icon {\n width: 16px;\n height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-split .-cerbur-clutch-dsh-worktree-chevron svg {\n width: 12px;\n height: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-fallback {\n text-decoration: none;\n align-self: flex-end;\n}\n\nimg.-cerbur-clutch-dsh-worktree-icon {\n display: block;\n object-fit: contain;\n user-select: none;\n}\n";
|
|
10228
10299
|
const styleId$4 = "@cerbur/clutch-dsh-worktree/open-in-app.css";
|
|
10229
10300
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/open-in-app.css\"]") === null) {
|
|
@@ -10425,6 +10496,206 @@ window.__ModuleLoader__.load({
|
|
|
10425
10496
|
});
|
|
10426
10497
|
}
|
|
10427
10498
|
//#endregion
|
|
10499
|
+
//#region lib/client/layout/app-frame.js
|
|
10500
|
+
/** Public AppFrame anchors; never infer a column from sibling order or private classes. */
|
|
10501
|
+
function directChildWithin(parent, anchor) {
|
|
10502
|
+
let child = anchor;
|
|
10503
|
+
while (child && child.parentElement !== parent) child = child.parentElement;
|
|
10504
|
+
return child ?? void 0;
|
|
10505
|
+
}
|
|
10506
|
+
function resolveAppFrame(surface) {
|
|
10507
|
+
const overlay = surface.closest("[data-shell-overlay]");
|
|
10508
|
+
const frame = overlay?.parentElement;
|
|
10509
|
+
if (!(overlay instanceof HTMLElement) || !frame || !overlay.isConnected) return void 0;
|
|
10510
|
+
for (const selector of ["[data-worktree-mode-action]", "[data-pane=\"sidebar\"]"]) {
|
|
10511
|
+
const columns = new Set(Array.from(frame.querySelectorAll(selector)).map((anchor) => directChildWithin(frame, anchor)).filter((column) => column instanceof HTMLElement && column !== overlay && !column.hasAttribute("data-shell-overlay") && !column.hasAttribute("data-rightbar-col") && !column.hasAttribute("data-shell-leading")));
|
|
10512
|
+
if (columns.size > 1) return void 0;
|
|
10513
|
+
const sidebar = columns.values().next().value;
|
|
10514
|
+
if (sidebar) return {
|
|
10515
|
+
overlay,
|
|
10516
|
+
frame,
|
|
10517
|
+
sidebar
|
|
10518
|
+
};
|
|
10519
|
+
}
|
|
10520
|
+
}
|
|
10521
|
+
function finiteRect(rect) {
|
|
10522
|
+
return [
|
|
10523
|
+
rect.left,
|
|
10524
|
+
rect.right,
|
|
10525
|
+
rect.top,
|
|
10526
|
+
rect.bottom,
|
|
10527
|
+
rect.width,
|
|
10528
|
+
rect.height
|
|
10529
|
+
].every(Number.isFinite);
|
|
10530
|
+
}
|
|
10531
|
+
function resolveFrameContent(frame, overlay, sidebar) {
|
|
10532
|
+
const rightbars = Array.from(frame.querySelectorAll("[data-rightbar-col]")).filter((column) => directChildWithin(frame, column) !== overlay);
|
|
10533
|
+
if (rightbars.length > 1) return void 0;
|
|
10534
|
+
const column = rightbars[0];
|
|
10535
|
+
const rightbar = frame.hasAttribute("data-rightbar-collapsed") ? void 0 : column;
|
|
10536
|
+
const box = overlay.getBoundingClientRect();
|
|
10537
|
+
const boundary = sidebar.getBoundingClientRect();
|
|
10538
|
+
const columnRect = column?.getBoundingClientRect();
|
|
10539
|
+
if (!finiteRect(box) || !finiteRect(boundary) || rightbar && columnRect && !finiteRect(columnRect)) return;
|
|
10540
|
+
const centerEdges = [rightbar && columnRect ? columnRect.left : box.right];
|
|
10541
|
+
if (!rightbar && columnRect && finiteRect(columnRect)) centerEdges.push(columnRect.left);
|
|
10542
|
+
const excluded = column ? directChildWithin(frame, column) : void 0;
|
|
10543
|
+
const centers = Array.from(frame.children).filter((child) => {
|
|
10544
|
+
if (!(child instanceof HTMLElement) || child === sidebar || child === overlay || child === excluded || child.hasAttribute("data-shell-overlay") || child.hasAttribute("data-shell-leading") || child.hasAttribute("data-window-drag")) return false;
|
|
10545
|
+
const rect = child.getBoundingClientRect();
|
|
10546
|
+
return finiteRect(rect) && rect.width > 0 && rect.height > 0 && Math.abs(rect.left - boundary.right) <= 1 && centerEdges.some((edge) => Math.abs(rect.right - edge) <= 1) && rect.top >= box.top - 1 && rect.top < box.bottom && Math.abs(rect.bottom - box.bottom) <= 1;
|
|
10547
|
+
});
|
|
10548
|
+
if (centers.length !== 1) return void 0;
|
|
10549
|
+
return {
|
|
10550
|
+
center: centers[0],
|
|
10551
|
+
rightbar
|
|
10552
|
+
};
|
|
10553
|
+
}
|
|
10554
|
+
//#endregion
|
|
10555
|
+
//#region lib/client/dashboard/dashboard-overlay.js
|
|
10556
|
+
const SIDEBAR_RESIZE_HANDLE_HALF_WIDTH = 4;
|
|
10557
|
+
/** Reversible presentation only: leave the native React tree and Session alive. */
|
|
10558
|
+
function concealDashboardBackground(element) {
|
|
10559
|
+
const visibility = element.style.getPropertyValue("visibility");
|
|
10560
|
+
const priority = element.style.getPropertyPriority("visibility");
|
|
10561
|
+
const inert = element.getAttribute("inert");
|
|
10562
|
+
const hidden = element.getAttribute("aria-hidden");
|
|
10563
|
+
element.style.setProperty("visibility", "hidden");
|
|
10564
|
+
element.setAttribute("inert", "");
|
|
10565
|
+
element.setAttribute("aria-hidden", "true");
|
|
10566
|
+
return () => {
|
|
10567
|
+
if (element.style.getPropertyValue("visibility") === "hidden") if (visibility) element.style.setProperty("visibility", visibility, priority);
|
|
10568
|
+
else element.style.removeProperty("visibility");
|
|
10569
|
+
for (const [name, value] of [["inert", inert], ["aria-hidden", hidden]]) if (value === null) element.removeAttribute(name);
|
|
10570
|
+
else element.setAttribute(name, value);
|
|
10571
|
+
};
|
|
10572
|
+
}
|
|
10573
|
+
function isRightSidebarOpenFromDom(frame, rightbar) {
|
|
10574
|
+
return !frame.hasAttribute("data-rightbar-collapsed") && rightbar instanceof HTMLElement && frame.contains(rightbar) && (rightbar.hasAttribute("data-sidebar-right-open") || rightbar.querySelector("[data-sidebar-right-open]") !== null);
|
|
10575
|
+
}
|
|
10576
|
+
/** Layout seam shared with the existing Sidebar overlay; fail closed on frame/center loss. */
|
|
10577
|
+
function mountDashboardOverlay(surface, onPlacement, options) {
|
|
10578
|
+
const overlay = surface.closest("[data-shell-overlay]");
|
|
10579
|
+
const frame = overlay?.parentElement;
|
|
10580
|
+
if (!overlay || !frame) {
|
|
10581
|
+
onPlacement(void 0);
|
|
10582
|
+
options?.onRightSidebarChange?.(false);
|
|
10583
|
+
return () => {};
|
|
10584
|
+
}
|
|
10585
|
+
const hidden = /* @__PURE__ */ new Map();
|
|
10586
|
+
let observed = [];
|
|
10587
|
+
let scheduled;
|
|
10588
|
+
let disposed = false;
|
|
10589
|
+
let lastRightSidebarOpen;
|
|
10590
|
+
const restore = () => {
|
|
10591
|
+
for (const cleanup of hidden.values()) cleanup();
|
|
10592
|
+
hidden.clear();
|
|
10593
|
+
};
|
|
10594
|
+
const schedule = () => {
|
|
10595
|
+
if (disposed || scheduled !== void 0) return;
|
|
10596
|
+
scheduled = requestAnimationFrame(() => {
|
|
10597
|
+
scheduled = void 0;
|
|
10598
|
+
update();
|
|
10599
|
+
});
|
|
10600
|
+
};
|
|
10601
|
+
const resize = typeof ResizeObserver === "undefined" ? void 0 : new ResizeObserver(schedule);
|
|
10602
|
+
const update = () => {
|
|
10603
|
+
if (disposed) return;
|
|
10604
|
+
const anchors = resolveAppFrame(surface);
|
|
10605
|
+
const content = anchors?.frame === frame && anchors.overlay === overlay ? resolveFrameContent(frame, overlay, anchors.sidebar) : void 0;
|
|
10606
|
+
const nextObserved = [
|
|
10607
|
+
frame,
|
|
10608
|
+
overlay,
|
|
10609
|
+
...Array.from(frame.children),
|
|
10610
|
+
...Array.from(frame.querySelectorAll("[data-rightbar-col]"))
|
|
10611
|
+
];
|
|
10612
|
+
for (const old of observed) if (!nextObserved.includes(old)) resize?.unobserve(old);
|
|
10613
|
+
for (const next of nextObserved) if (!observed.includes(next)) resize?.observe(next);
|
|
10614
|
+
observed = nextObserved;
|
|
10615
|
+
if (!anchors || !content) {
|
|
10616
|
+
restore();
|
|
10617
|
+
onPlacement(void 0);
|
|
10618
|
+
if (lastRightSidebarOpen) {
|
|
10619
|
+
lastRightSidebarOpen = false;
|
|
10620
|
+
options?.onRightSidebarChange?.(false);
|
|
10621
|
+
}
|
|
10622
|
+
return;
|
|
10623
|
+
}
|
|
10624
|
+
const { sidebar } = anchors;
|
|
10625
|
+
const { center, rightbar } = content;
|
|
10626
|
+
const box = overlay.getBoundingClientRect();
|
|
10627
|
+
const boundary = sidebar.getBoundingClientRect();
|
|
10628
|
+
const rightBoundary = rightbar instanceof HTMLElement ? rightbar.getBoundingClientRect().left : box.right;
|
|
10629
|
+
const left = Math.max(0, boundary.right - box.left + SIDEBAR_RESIZE_HANDLE_HALF_WIDTH);
|
|
10630
|
+
const width = Math.min(box.right, rightBoundary) - box.left - left;
|
|
10631
|
+
if (width <= 0 || box.height <= 0) {
|
|
10632
|
+
restore();
|
|
10633
|
+
onPlacement(void 0);
|
|
10634
|
+
return;
|
|
10635
|
+
}
|
|
10636
|
+
const centerBox = center.getBoundingClientRect();
|
|
10637
|
+
const top = Math.max(0, centerBox.top - box.top);
|
|
10638
|
+
const height = Math.min(box.bottom, centerBox.bottom) - box.top - top;
|
|
10639
|
+
if (height <= 0) {
|
|
10640
|
+
restore();
|
|
10641
|
+
onPlacement(void 0);
|
|
10642
|
+
return;
|
|
10643
|
+
}
|
|
10644
|
+
for (const [element, cleanup] of hidden) if (element !== center) {
|
|
10645
|
+
cleanup();
|
|
10646
|
+
hidden.delete(element);
|
|
10647
|
+
}
|
|
10648
|
+
if (!hidden.has(center)) hidden.set(center, concealDashboardBackground(center));
|
|
10649
|
+
onPlacement({
|
|
10650
|
+
left,
|
|
10651
|
+
top,
|
|
10652
|
+
width,
|
|
10653
|
+
height
|
|
10654
|
+
});
|
|
10655
|
+
const isRightSidebarOpen = options?.isRightSidebarExpanded !== void 0 ? options.isRightSidebarExpanded() : isRightSidebarOpenFromDom(frame, rightbar);
|
|
10656
|
+
if (lastRightSidebarOpen !== isRightSidebarOpen) {
|
|
10657
|
+
lastRightSidebarOpen = isRightSidebarOpen;
|
|
10658
|
+
options?.onRightSidebarChange?.(isRightSidebarOpen);
|
|
10659
|
+
}
|
|
10660
|
+
};
|
|
10661
|
+
const mutation = typeof MutationObserver === "undefined" ? void 0 : new MutationObserver(schedule);
|
|
10662
|
+
try {
|
|
10663
|
+
mutation?.observe(frame, {
|
|
10664
|
+
childList: true,
|
|
10665
|
+
attributes: true,
|
|
10666
|
+
subtree: true,
|
|
10667
|
+
attributeFilter: [
|
|
10668
|
+
"data-rightbar-collapsed",
|
|
10669
|
+
"data-sidebar-right-open",
|
|
10670
|
+
"data-sidebar-right-panel",
|
|
10671
|
+
"data-rightbar-col",
|
|
10672
|
+
"data-worktree-mode-action",
|
|
10673
|
+
"data-pane",
|
|
10674
|
+
"data-window-drag",
|
|
10675
|
+
"data-shell-leading",
|
|
10676
|
+
"data-shell-overlay"
|
|
10677
|
+
]
|
|
10678
|
+
});
|
|
10679
|
+
} catch {
|
|
10680
|
+
mutation?.observe(frame, { childList: true });
|
|
10681
|
+
}
|
|
10682
|
+
if (frame.parentElement) try {
|
|
10683
|
+
mutation?.observe(frame.parentElement, { childList: true });
|
|
10684
|
+
} catch {}
|
|
10685
|
+
update();
|
|
10686
|
+
return () => {
|
|
10687
|
+
disposed = true;
|
|
10688
|
+
resize?.disconnect();
|
|
10689
|
+
mutation?.disconnect();
|
|
10690
|
+
if (scheduled !== void 0) cancelAnimationFrame(scheduled);
|
|
10691
|
+
restore();
|
|
10692
|
+
if (lastRightSidebarOpen) {
|
|
10693
|
+
lastRightSidebarOpen = false;
|
|
10694
|
+
options?.onRightSidebarChange?.(false);
|
|
10695
|
+
}
|
|
10696
|
+
};
|
|
10697
|
+
}
|
|
10698
|
+
//#endregion
|
|
10428
10699
|
//#region lib/client/dashboard/worktree-acquisition-facts.js
|
|
10429
10700
|
function selectWorktreeAcquisitionFacts(record) {
|
|
10430
10701
|
return {
|
|
@@ -10434,7 +10705,7 @@ window.__ModuleLoader__.load({
|
|
|
10434
10705
|
};
|
|
10435
10706
|
}
|
|
10436
10707
|
//#endregion
|
|
10437
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
10708
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/dashboard/dashboard.css.mjs
|
|
10438
10709
|
const css$3 = ".-cerbur-clutch-dsh-worktree-dashboardSurface {\n position: absolute;\n box-sizing: border-box;\n z-index: 2;\n overflow: auto;\n overscroll-behavior: contain;\n pointer-events: auto;\n container-type: inline-size;\n background: var(--dsw-alias-bg-base, #fff);\n color: var(--dsw-alias-label-primary, #19212f);\n font-family: inherit;\n font-size: 14px;\n line-height: 1.5;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardSurface *,\n.-cerbur-clutch-dsh-worktree-dashboardSurface *::before,\n.-cerbur-clutch-dsh-worktree-dashboardSurface *::after {\n box-sizing: border-box;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface button:not(.-cerbur-clutch-dsh-worktree-dashboardRefButton) {\n font: inherit;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface svg {\n width: 18px;\n height: 18px;\n flex: none;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface code {\n font-family: ui-monospace, SFMono-Regular, Consolas, monospace;\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface button:focus-visible,\n.-cerbur-clutch-dsh-worktree-dashboardSurface a:focus-visible,\n.-cerbur-clutch-dsh-worktree-dashboardPanel:focus-visible {\n outline: 2px solid #497cd4;\n outline-offset: 3px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface h1:focus {\n outline: none;\n}\n.-cerbur-clutch-dsh-worktree-dashboardPage {\n max-width: 1240px;\n margin: 0 auto;\n padding: 24px 30px 28px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessions {\n list-style: none;\n padding: 0;\n margin: 12px 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessions button {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 12px 8px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: inherit;\n text-align: left;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessionLabel {\n flex: 1;\n min-width: 0;\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessionMeta {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: flex-end;\n min-width: 28px;\n color: var(--dsw-alias-label-tertiary, #858e9d);\n}\n.-cerbur-clutch-dsh-worktree-dashboardChildPath {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #788191);\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardChildState {\n display: flex;\n flex: none;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardManageToolbar {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 12px;\n margin-top: 20px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageToolbar label,\n.-cerbur-clutch-dsh-worktree-dashboardManageStopped {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageHint {\n color: var(--dsw-alias-label-secondary, #788191);\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageList,\n.-cerbur-clutch-dsh-worktree-dashboardManageResults,\n.-cerbur-clutch-dsh-worktree-dashboardManageConfirmList {\n list-style: none;\n padding: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageList label {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 8px;\n border-radius: 6px;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageList label:hover,\n.-cerbur-clutch-dsh-worktree-dashboardManageList label:has(input:checked) {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageList label:has(input:focus-visible) {\n outline: 2px solid #497cd4;\n outline-offset: 2px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageList input,\n.-cerbur-clutch-dsh-worktree-dashboardManageToolbar input,\n.-cerbur-clutch-dsh-worktree-dashboardManageStopped input {\n flex: none;\n accent-color: var(--dsw-alias-brand-primary, #497cd4);\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageResults li,\n.-cerbur-clutch-dsh-worktree-dashboardManageConfirmList li {\n padding: 8px 0;\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageConfirmList {\n max-height: 260px;\n overflow: auto;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageConfirmList code {\n display: block;\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardManageResults [data-batch-result='failed'] {\n color: var(--dsw-alias-label-error, #d34b4b);\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessionStatus {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessionTime {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 12px;\n line-height: 20px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSessions button:hover,\n.-cerbur-clutch-dsh-worktree-dashboardSessions button[aria-current] {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n.-cerbur-clutch-dsh-worktree-dashboardSurface a {\n text-decoration: none;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions button:not(:disabled) {\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTopline {\n position: sticky;\n top: 0;\n z-index: 3;\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: space-between;\n gap: 8px 20px;\n min-height: 50px;\n padding: 10px 20px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n background: var(--dsw-alias-bg-base, #fff);\n color: var(--dsw-alias-label-secondary, #677080);\n font-size: 13px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTopline > span {\n flex: 1 1 120px;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTopline > span > span {\n margin: 0 8px;\n opacity: 0.5;\n}\n.-cerbur-clutch-dsh-worktree-dashboardToplineActions {\n display: inline-flex;\n flex-wrap: nowrap;\n flex-shrink: 0;\n align-items: center;\n gap: 8px;\n margin-inline-start: auto;\n max-width: 100%;\n -webkit-app-region: no-drag;\n}\n/* AppFrame's native reopen/New Session seat follows shell.-cerbur-clutch-dsh-worktree-overlay in DOM order.\n Keep its existing actions above the Dashboard, with its published clearance\n reserved in the title. This rule disappears as soon as the Dashboard closes. */\nhtml[data-platform='darwin']\n [data-sidebar-collapsed]:has([data-worktree-dashboard], [data-worktree-dashboard-request])\n > [data-shell-leading] {\n z-index: 21;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSidebarButton {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 6px;\n border: 0;\n border-radius: 28px;\n background: transparent;\n color: var(--dsw-alias-label-secondary, #677080);\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSidebarButton:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n.-cerbur-clutch-dsh-worktree-dashboardSidebarButton svg {\n width: 15px;\n height: 15px;\n transform: scaleX(-1);\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeader {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(260px, 0.45fr);\n gap: 32px;\n margin-bottom: 15px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardIdentity {\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow > svg {\n width: 24px;\n height: 24px;\n color: #3e73ca;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow h1 {\n font-size: 25px;\n letter-spacing: -0.6px;\n line-height: 1.3;\n font-weight: 650;\n margin: 0;\n flex: 0 1 auto;\n overflow: hidden;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardRefButton {\n display: block;\n max-width: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n font: inherit;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHealth,\n.-cerbur-clutch-dsh-worktree-dashboardSoon {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n white-space: nowrap;\n border-radius: 6px;\n padding: 3px 7px;\n font-size: 11px;\n font-weight: 500;\n color: var(--dsw-alias-label-secondary, #687182);\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n.-cerbur-clutch-dsh-worktree-dashboardHealth[data-health='ready'] {\n background: color-mix(in srgb, #1eab78 13%, transparent);\n color: #21976f;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHealth[data-health='repair'],\n.-cerbur-clutch-dsh-worktree-dashboardHealth[data-health='recovery-needed'],\n.-cerbur-clutch-dsh-worktree-dashboardHealth[data-health='branch-drift'] {\n background: color-mix(in srgb, #e7a839 14%, transparent);\n color: #b27a1e;\n}\n.-cerbur-clutch-dsh-worktree-dashboardPath {\n display: flex;\n align-items: flex-start;\n gap: 9px;\n margin-top: 12px;\n color: var(--dsw-alias-label-secondary, #697283);\n}\n.-cerbur-clutch-dsh-worktree-dashboardPath code {\n padding-top: 4px;\n overflow-wrap: anywhere;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFieldLabel {\n font-size: 10px;\n border: 1px solid var(--dsw-alias-border-l3, #e5e7ed);\n border-radius: 4px;\n padding: 2px 5px;\n margin-top: 2px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardIconButton {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 29px;\n height: 29px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: inherit;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardIconButton:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n.-cerbur-clutch-dsh-worktree-dashboardCopyStatus {\n font-size: 12px;\n margin: 4px 0 0;\n min-height: 18px;\n color: #21976f;\n}\n.-cerbur-clutch-dsh-worktree-dashboardCopyStatus[role='alert'] {\n color: #bd5d43;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderAside {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 8px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderAside > button,\n.-cerbur-clutch-dsh-worktree-dashboardHeaderAside > a {\n align-self: flex-end;\n}\n.-cerbur-clutch-dsh-worktree-dashboardButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 7px;\n padding: 6px 11px;\n border: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 6px;\n background: var(--dsw-alias-bg-base, #fff);\n color: inherit;\n white-space: nowrap;\n cursor: pointer;\n font-size: 12px !important;\n line-height: 1.5;\n}\n.-cerbur-clutch-dsh-worktree-dashboardButton:disabled {\n color: var(--dsw-alias-label-secondary, #737e8e);\n cursor: not-allowed;\n}\n.-cerbur-clutch-dsh-worktree-dashboardButton:not(:disabled):hover {\n background: var(--dsw-alias-interactive-bg-hover, #f4f6f9);\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabs {\n display: flex;\n gap: 22px;\n overflow-x: auto;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #e1e5ed);\n margin-bottom: 24px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabs button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n gap: 8px;\n padding: 12px 2px;\n border: 0;\n border-bottom: 2px solid transparent;\n background: transparent;\n color: var(--dsw-alias-label-secondary, #6c7480);\n cursor: pointer;\n font-size: 13px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabs button[aria-selected='true'] {\n color: #4276c8;\n border-bottom-color: #4276c8;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabs svg {\n width: 16px;\n height: 16px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardPanel {\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardGrid {\n display: grid;\n grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr);\n gap: 20px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardColumn {\n display: flex;\n flex-direction: column;\n gap: 20px;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardCard,\n.-cerbur-clutch-dsh-worktree-dashboardStart {\n padding: 20px;\n border: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n border-radius: 11px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardCard h2,\n.-cerbur-clutch-dsh-worktree-dashboardStart h2 {\n display: flex;\n align-items: center;\n gap: 9px;\n font-size: 16px;\n font-weight: 620;\n line-height: 1.4;\n margin: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardCard p,\n.-cerbur-clutch-dsh-worktree-dashboardStart > p {\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #7b8290);\n margin: 8px 0 15px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardCardHeading {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 10px;\n margin-bottom: 7px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStart {\n background: linear-gradient(\n 115deg,\n color-mix(in srgb, #6b9eff 9%, transparent),\n color-mix(in srgb, #6b9eff 3%, transparent)\n );\n}\n.-cerbur-clutch-dsh-worktree-dashboardStart h2 > svg {\n color: #477bc6;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 13px;\n margin-top: 23px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions button {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 18px 14px;\n text-align: left;\n border: 1px solid color-mix(in srgb, #7299e7 28%, transparent);\n border-radius: 8px;\n background: color-mix(in srgb, #6b9eff 5%, transparent);\n color: #4673bc;\n cursor: not-allowed;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions button:nth-child(2) {\n color: #38846e;\n border-color: color-mix(in srgb, #4fba9a 25%, transparent);\n background: color-mix(in srgb, #4fba9a 5%, transparent);\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions svg {\n width: 23px;\n height: 23px;\n margin-top: 3px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions strong {\n display: block;\n font-size: 14px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions small {\n display: block;\n margin-top: 6px;\n line-height: 1.6;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary, #69788a);\n}\n.-cerbur-clutch-dsh-worktree-dashboardStartActions em {\n display: block;\n font-size: 10px;\n font-style: normal;\n margin-top: 10px;\n opacity: 0.75;\n}\n.-cerbur-clutch-dsh-worktree-dashboardInstructionPlaceholder {\n padding: 26px 20px;\n min-height: 177px;\n border: 1px dashed var(--dsw-alias-border-l3, #dfe4ed);\n border-radius: 7px;\n background: var(--dsw-alias-interactive-bg-hover, #f7f8fa);\n text-align: center;\n}\n.-cerbur-clutch-dsh-worktree-dashboardInstructionPlaceholder > svg {\n display: block;\n margin: 0 auto 10px;\n width: 25px;\n height: 25px;\n color: #929cac;\n}\n.-cerbur-clutch-dsh-worktree-dashboardInstructionPlaceholder strong {\n font-size: 13px;\n font-weight: 500;\n}\n.-cerbur-clutch-dsh-worktree-dashboardInstructionPlaceholder p {\n max-width: 310px;\n margin: 7px auto 12px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardEmpty {\n display: flex;\n flex-direction: column;\n gap: 8px;\n align-items: center;\n justify-content: center;\n min-height: 78px;\n padding: 10px 8px;\n text-align: center;\n}\n.-cerbur-clutch-dsh-worktree-dashboardEmpty p {\n max-width: 300px;\n margin: 0;\n line-height: 1.7;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts {\n margin: 8px 0 14px;\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts > div {\n display: grid;\n grid-template-columns: minmax(70px, 0.65fr) minmax(0, 1fr);\n gap: 12px;\n align-items: center;\n padding: 11px 0;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #eef0f5);\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts > div:last-child {\n border: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts dt {\n grid-column: 1;\n min-width: 0;\n color: var(--dsw-alias-label-secondary, #788191);\n /* Prefer normal break points (including trailing `/` and `-`) first. */\n overflow-wrap: break-word;\n word-break: normal;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts dd {\n grid-column: 2;\n min-width: 0;\n margin: 0;\n text-align: right;\n /* Only split an unbreakable value after natural opportunities are exhausted. */\n overflow-wrap: break-word;\n word-break: normal;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts > div:has(.-cerbur-clutch-dsh-worktree-dashboardFactAction > *) {\n grid-template-columns: minmax(70px, 0.65fr) minmax(0, 1fr) 29px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFacts dd > span {\n max-width: 100%;\n flex-wrap: wrap;\n justify-content: flex-end;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFactAction {\n display: flex;\n grid-column: 3;\n align-items: center;\n justify-content: flex-end;\n min-width: 29px;\n min-height: 29px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFactAction:empty { display: none; }\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts {\n width: 100%;\n margin: 0;\n padding: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts > div,\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts > div:has(.-cerbur-clutch-dsh-worktree-dashboardFactAction > *) {\n grid-template-columns: minmax(60px, 0.55fr) minmax(0, 1fr) 26px;\n gap: 8px;\n min-height: 34px;\n padding: 3px 0;\n border: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts time {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-secondary, #687182);\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts .-cerbur-clutch-dsh-worktree-dashboardFactAction {\n min-width: 26px;\n min-height: 26px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts .-cerbur-clutch-dsh-worktree-dashboardIconButton {\n width: 26px;\n height: 26px;\n border-radius: 6px;\n color: var(--dsw-alias-label-tertiary, #858e9d);\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts .-cerbur-clutch-dsh-worktree-dashboardIconButton:hover,\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts .-cerbur-clutch-dsh-worktree-dashboardIconButton:focus-visible {\n background: transparent;\n color: var(--dsw-alias-label-primary, #19212f);\n}\n.-cerbur-clutch-dsh-worktree-dashboardHeaderFacts .-cerbur-clutch-dsh-worktree-dashboardIconButton svg {\n width: 14px;\n height: 14px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHistorical {\n color: var(--dsw-alias-label-secondary, #788191);\n}\n.-cerbur-clutch-dsh-worktree-dashboardSyncOptions {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSyncOptions p {\n margin: 0;\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSyncOptions label {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardSyncOptions input {\n margin-top: 4px;\n accent-color: var(--dsw-alias-text-link, #3e73ca);\n}\n.-cerbur-clutch-dsh-worktree-dashboardSyncOptions small {\n display: block;\n margin-top: 4px;\n color: var(--dsw-alias-label-secondary, #788191);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n max-width: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-primary, #19212f);\n text-align: left;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink > span {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink svg {\n width: 14px;\n height: 14px;\n color: var(--dsw-alias-label-tertiary, #858e9d);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink:hover,\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink:focus-visible {\n color: var(--dsw-alias-text-link, #3e73ca);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink:hover svg,\n.-cerbur-clutch-dsh-worktree-dashboardBaseLink:focus-visible svg {\n color: inherit;\n}\n.-cerbur-clutch-dsh-worktree-dashboardIconButton:disabled {\n color: var(--dsw-alias-label-secondary, #788191);\n cursor: not-allowed;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineModal {\n box-sizing: border-box;\n width: min(440px, calc(100vw - 48px));\n max-height: calc(100vh - 48px);\n max-height: calc(100dvh - 48px);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineModalContent {\n box-sizing: border-box;\n min-height: 0;\n overflow-y: auto;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselinePicker {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 100%;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardLink {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n width: 100%;\n background: transparent;\n border: 1px solid var(--dsw-alias-border-l3, #e2e6ed);\n border-radius: 6px;\n padding: 7px 10px;\n font-size: 12px !important;\n color: inherit;\n cursor: pointer;\n margin-top: 8px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardLink:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f5f7fa);\n}\n.-cerbur-clutch-dsh-worktree-dashboardQuickActions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 16px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardQuickActions .-cerbur-clutch-dsh-worktree-dashboardButton {\n justify-content: flex-start;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabPlaceholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 390px;\n padding: 40px 24px;\n text-align: center;\n border: 1px dashed var(--dsw-alias-border-l3, #dde3ec);\n border-radius: 11px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabPlaceholder > svg {\n width: 36px;\n height: 36px;\n color: #7c9bcf;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabPlaceholder h2 {\n font-size: 20px;\n font-weight: 600;\n margin: 16px 0 4px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTabPlaceholder p {\n max-width: 420px;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary, #7b8596);\n margin: 8px 0 18px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardFooter {\n margin: 23px 0 0;\n text-align: center;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary, #8a92a0);\n}\n\n@container (max-width: 820px) {\n .-cerbur-clutch-dsh-worktree-dashboardPage {\n padding: 20px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardHeader {\n grid-template-columns: minmax(0, 1fr);\n gap: 12px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardHeaderAside {\n display: flex;\n }\n .-cerbur-clutch-dsh-worktree-dashboardGrid {\n grid-template-columns: minmax(0, 1fr);\n }\n .-cerbur-clutch-dsh-worktree-dashboardTabs {\n gap: 18px;\n }\n}\n\n@container (max-width: 440px) {\n .-cerbur-clutch-dsh-worktree-dashboardManageList label {\n display: grid;\n grid-template-columns: auto auto minmax(0, 1fr);\n gap: 8px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardManageList .-cerbur-clutch-dsh-worktree-dashboardChildState {\n grid-column: 3;\n align-items: flex-start;\n flex-direction: row;\n flex-wrap: wrap;\n min-width: 0;\n }\n .-cerbur-clutch-dsh-worktree-dashboardManageList .-cerbur-clutch-dsh-worktree-dashboardHealth {\n white-space: normal;\n }\n .-cerbur-clutch-dsh-worktree-dashboardPage {\n padding: 16px 12px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardTitleRow h1 {\n font-size: 22px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardStartActions {\n grid-template-columns: minmax(0, 1fr);\n }\n .-cerbur-clutch-dsh-worktree-dashboardCard,\n .-cerbur-clutch-dsh-worktree-dashboardStart {\n padding: 16px;\n }\n .-cerbur-clutch-dsh-worktree-dashboardTopline {\n gap: 10px;\n }\n}\n.-cerbur-clutch-dsh-worktree-dashboardInstructionsText {\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n max-height: 240px;\n overflow: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardInstructionsInput {\n box-sizing: border-box;\n width: 100%;\n resize: vertical;\n padding: 10px;\n border: 1px solid var(--dsw-alias-border-l4);\n border-radius: 8px;\n background: var(--dsw-alias-bg-base);\n color: var(--dsw-alias-label-primary);\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-dashboardInstructionActions {\n display: flex;\n gap: 8px;\n margin-top: 8px;\n}\n";
|
|
10439
10710
|
const styleId$3 = "@cerbur/clutch-dsh-worktree/dashboard.css";
|
|
10440
10711
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/dashboard.css\"]") === null) {
|
|
@@ -10746,7 +11017,7 @@ window.__ModuleLoader__.load({
|
|
|
10746
11017
|
});
|
|
10747
11018
|
}
|
|
10748
11019
|
//#endregion
|
|
10749
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
11020
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/dashboard/git/worktree-git.css.mjs
|
|
10750
11021
|
const css$2 = ".-cerbur-clutch-dsh-worktree-gitPanel {\n min-width: 0;\n min-height: 0;\n}\n.-cerbur-clutch-dsh-worktree-gitCommitStats {\n display: inline-flex;\n gap: 8px;\n color: var(--dsw-alias-label-secondary, #677080);\n font-variant-numeric: tabular-nums;\n}\n.-cerbur-clutch-dsh-worktree-gitFileRow {\n display: flex;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-gitFileRow > button:first-child { flex: 1; min-width: 0; }\n.-cerbur-clutch-dsh-worktree-gitFileRow > .-cerbur-clutch-dsh-worktree-gitFileOpen { width: 28px; min-width: 28px; flex: none; padding: 4px; opacity: 0; }\n.-cerbur-clutch-dsh-worktree-gitFileRow > .-cerbur-clutch-dsh-worktree-gitFileOpen svg { width: 14px; height: 14px; }\n.-cerbur-clutch-dsh-worktree-gitFileRow:hover > .-cerbur-clutch-dsh-worktree-gitFileOpen,\n.-cerbur-clutch-dsh-worktree-gitFileRow:focus-within > .-cerbur-clutch-dsh-worktree-gitFileOpen { opacity: 1; }\n\n.-cerbur-clutch-dsh-worktree-gitPanelHeader {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 20px;\n margin-bottom: 18px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitPanelHeader h2 {\n margin: 0;\n font-size: 18px;\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitPanelHeading {\n min-width: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineSelector {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n margin-top: 10px;\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselinePrompt {\n padding: 22px;\n border: 1px dashed var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 10px;\n background: var(--dsw-alias-bg-base, #fff);\n color: var(--dsw-alias-label-secondary, #6f7887);\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselinePrompt strong {\n display: block;\n margin-bottom: 6px;\n color: var(--dsw-alias-label-primary, #273142);\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselinePrompt p {\n margin: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineFacts {\n display: flex;\n flex-wrap: wrap;\n gap: 8px 20px;\n margin: 10px 0 0;\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineFacts > div {\n display: flex;\n gap: 6px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineFacts dt::after {\n content: ':';\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineFacts dd {\n margin: 0;\n color: var(--dsw-alias-label-primary, #273142);\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineFacts code {\n margin-left: 4px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDerived {\n margin-left: 7px;\n color: var(--dsw-alias-state-warn-label, #9a6e22);\n}\n\n.-cerbur-clutch-dsh-worktree-gitRefresh {\n flex: none;\n padding: 6px 11px;\n border: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 6px;\n background: var(--dsw-alias-bg-base, #fff);\n color: inherit;\n cursor: pointer;\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitRefresh:disabled {\n color: var(--dsw-alias-label-secondary, #7d8795);\n cursor: wait;\n}\n\n/*\n * One 3x3 grid carries both layouts: commit and changed-file panes sit around a\n * row divider, the diff sits beside them across a column divider. Wide layouts\n * place the stack in the left column, narrow layouts place all three panes on\n * three rows. Both shares are custom properties the dividers drag, and both are\n * clamped so each pane keeps a usable size.\n */\n.-cerbur-clutch-dsh-worktree-gitColumns {\n /* Keep the Git surface bounded by the viewport, never by its data volume. */\n --git-columns-height: clamp(360px, calc(100vh - 300px), 560px);\n --git-columns-height: clamp(360px, calc(100dvh - 300px), 560px);\n /* Leading-pane shares: the row divider and the column divider drag these. */\n --git-rows-top: 45%;\n --git-columns-left: 38%;\n display: grid;\n grid-template-columns:\n minmax(240px, min(var(--git-columns-left), calc(100% - 247px)))\n 7px\n minmax(240px, 1fr);\n grid-template-rows:\n minmax(140px, min(var(--git-rows-top), calc(100% - 147px)))\n 7px\n minmax(140px, 1fr);\n height: var(--git-columns-height);\n min-height: 0;\n border: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n border-radius: 10px;\n overflow: hidden;\n resize: none;\n}\n\n/* Wide: commits over changed files in the left column, diff down the right column. */\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='commits'] {\n grid-area: 1 / 1;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='rows'] {\n grid-area: 2 / 1;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='changed-files'] {\n grid-area: 3 / 1;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='columns'] {\n grid-area: 1 / 2 / -1 / 3;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='diff'] {\n grid-area: 1 / 3 / -1 / -1;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--dsw-alias-bg-base, #fff);\n touch-action: none;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter::before {\n content: '';\n border-radius: 999px;\n background: var(--dsw-alias-border-l2, #cbd2dc);\n transition: background 0.15s ease;\n}\n\n/* Widen the grab area without moving the visible divider line. */\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter::after {\n content: '';\n position: absolute;\n}\n\n/* Both divider panes draw a full border box, so the pane above and the pane below\n (or the pane left and the pane right) are each closed by their own edge. */\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='rows'] {\n box-sizing: border-box;\n height: 7px;\n cursor: row-resize;\n border-top: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n border-bottom: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='rows']::before {\n width: 30px;\n height: 2px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='rows']::after {\n inset: -3px 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='columns'] {\n box-sizing: border-box;\n width: 7px;\n cursor: col-resize;\n border-left: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n border-right: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='columns']::before {\n width: 2px;\n height: 30px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='columns']::after {\n inset: 0 -3px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter:hover::before,\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter:focus-visible::before,\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter[data-dashboard-git-splitting='true']::before {\n background: var(--dsw-alias-state-business-primary, #467bc8);\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnSplitter:focus-visible {\n outline: 2px solid #497cd4;\n outline-offset: -2px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumn {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n background: var(--dsw-alias-bg-base, #fff);\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeader {\n display: flex;\n flex: none;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n min-height: 43px;\n padding: 12px 13px 9px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #edf0f4);\n color: var(--dsw-alias-label-secondary, #6f7887);\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeader h3 {\n margin: 0;\n color: var(--dsw-alias-label-primary, #273142);\n font-size: 12px;\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeader span,\n.-cerbur-clutch-dsh-worktree-gitColumnHeader code {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeaderMeta {\n display: flex;\n min-width: 0;\n align-items: baseline;\n justify-content: flex-end;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeader .-cerbur-clutch-dsh-worktree-gitLineStats,\n.-cerbur-clutch-dsh-worktree-gitColumnHeader .-cerbur-clutch-dsh-worktree-gitLineStats > span {\n overflow: visible;\n text-overflow: clip;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitColumnHeaderUnknown {\n color: var(--dsw-alias-label-tertiary, #8a94a3);\n}\n\n/* Right side of the commits header: the truncation note and the multi-select switch. */\n.-cerbur-clutch-dsh-worktree-gitColumnHeaderControls {\n display: flex;\n min-width: 0;\n align-self: center;\n align-items: center;\n justify-content: flex-end;\n gap: 10px;\n}\n\n/*\n * A native checkbox owns the state, focus and keyboard behavior; the track and\n * thumb below are presentational and follow :checked through the sibling selector.\n */\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelect {\n position: relative;\n display: inline-flex;\n flex: none;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n user-select: none;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelect input {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip-path: inset(50%);\n border: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelectTrack {\n position: relative;\n display: block;\n flex: none;\n width: 24px;\n height: 14px;\n border-radius: 999px;\n background: var(--dsw-alias-border-l2, #cbd2dc);\n transition: background 0.15s ease;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelectThumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: var(--dsw-alias-bg-base, #fff);\n box-shadow: 0 1px 2px rgb(15 23 42 / 25%);\n transition: transform 0.15s ease;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelect input:checked + .-cerbur-clutch-dsh-worktree-gitCommitMultiSelectTrack {\n background: var(--dsw-alias-state-business-primary, #467bc8);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelect input:checked + .-cerbur-clutch-dsh-worktree-gitCommitMultiSelectTrack .-cerbur-clutch-dsh-worktree-gitCommitMultiSelectThumb {\n transform: translateX(10px);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMultiSelect input:focus-visible + .-cerbur-clutch-dsh-worktree-gitCommitMultiSelectTrack {\n outline: 2px solid #497cd4;\n outline-offset: 2px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryButton {\n display: flex;\n width: calc(100% - 10px);\n flex-direction: column;\n gap: 3px;\n margin: 5px;\n padding: 8px;\n border: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 6px;\n background: var(--dsw-alias-bg-base, #fff);\n color: var(--dsw-alias-label-primary, #273142);\n text-align: left;\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryButton:hover,\n.-cerbur-clutch-dsh-worktree-gitSummaryButton[aria-pressed='true'] {\n border-color: var(--dsw-alias-state-business-primary, #467bc8);\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryButton span {\n font-size: 12px;\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryButton small {\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle {\n display: flex;\n align-items: flex-start;\n gap: 7px;\n width: calc(100% - 20px);\n margin: 3px 10px 8px;\n color: var(--dsw-alias-label-primary, #273142);\n cursor: pointer;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle input {\n flex: none;\n margin: 2px 0 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle span {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 2px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle strong {\n font-weight: 560;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle small {\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle input:disabled,\n.-cerbur-clutch-dsh-worktree-gitSummaryToggle:has(input:disabled) {\n cursor: wait;\n opacity: 0.65;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSelectionToolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 5px 10px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #edf0f4);\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSelectionToolbar button {\n border: 0;\n background: transparent;\n color: var(--dsw-alias-state-business-primary, #467bc8);\n cursor: pointer;\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList {\n display: block;\n flex: 1 1 auto;\n min-height: 0;\n overflow-x: hidden;\n overflow-y: auto;\n overscroll-behavior: contain;\n scrollbar-gutter: stable;\n list-style: none;\n padding: 5px;\n margin: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList {\n overflow-x: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList > li,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitFolderChildren,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitFolderChildren > li {\n width: max-content;\n min-width: 100%;\n}\n\n.-cerbur-clutch-dsh-worktree-gitFolderChildren {\n list-style: none;\n padding: 0 0 0 12px;\n margin: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitFolderButton {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 8px;\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 11px;\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitFolderButton:hover,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitFolderButton:focus-visible {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n color: var(--dsw-alias-label-primary, #273142);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFolderIcon {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n color: var(--dsw-alias-label-secondary, #6f7887);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFolderIcon > svg {\n width: 16px;\n height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitFolderName {\n min-width: max-content;\n overflow: visible;\n text-overflow: clip;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList button {\n display: block;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button {\n display: grid;\n width: 100%;\n grid-template-columns: 15px minmax(0, 1fr);\n padding: 9px 8px;\n}\n\n/* Without the multi-select marks a row has a single column, so the subject and meta align with it. */\n.-cerbur-clutch-dsh-worktree-gitCommitList[data-dashboard-git-commit-multiselect='off'] button {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList[data-dashboard-git-commit-multiselect='off'] .-cerbur-clutch-dsh-worktree-gitCommitSubject,\n.-cerbur-clutch-dsh-worktree-gitCommitList[data-dashboard-git-commit-multiselect='off'] .-cerbur-clutch-dsh-worktree-gitCommitMeta {\n grid-column: 1;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitSelectionMark {\n grid-row: 1 / span 2;\n color: var(--dsw-alias-state-business-primary, #467bc8);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button:hover,\n.-cerbur-clutch-dsh-worktree-gitCommitList button[aria-selected='true'],\n.-cerbur-clutch-dsh-worktree-gitChangedFileList button:hover,\n.-cerbur-clutch-dsh-worktree-gitChangedFileList button[aria-selected='true'] {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button[aria-selected='true'] {\n box-shadow: inset 2px 0 var(--dsw-alias-state-business-primary, #467bc8);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button[data-dashboard-git-commit-kind='working-tree'] {\n background: var(--dsw-alias-state-warn-tertiary, #f8f5ed);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitList button[data-dashboard-git-commit-kind='working-tree'][aria-selected='true'] {\n box-shadow: inset 2px 0 var(--dsw-alias-state-warn-primary, #b18435);\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitSubject {\n grid-column: 2;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMeta {\n grid-column: 2;\n display: flex;\n gap: 7px;\n margin-top: 4px;\n overflow: hidden;\n color: var(--dsw-alias-label-secondary, #7c8594);\n font-size: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMeta span,\n.-cerbur-clutch-dsh-worktree-gitCommitMeta time {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitMeta time {\n margin-left: auto;\n}\n\n.-cerbur-clutch-dsh-worktree-gitCommitWorkingTree {\n color: var(--dsw-alias-state-warn-label, #8a6728);\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList button {\n display: flex;\n width: max-content;\n min-width: 100%;\n box-sizing: border-box;\n align-items: flex-start;\n gap: 7px;\n padding: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitFileIcon {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n color: var(--dsw-alias-label-secondary, #6f7887);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFileIconGlyph {\n width: 16px;\n height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitFilePath {\n min-width: max-content;\n flex: 0 0 auto;\n overflow: visible;\n text-overflow: clip;\n white-space: nowrap;\n font-family: ui-monospace, SFMono-Regular, Consolas, monospace;\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='added'] {\n color: var(--dsw-alias-state-success-primary, #23845f);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='deleted'] {\n color: var(--dsw-alias-state-error-secondary, #bd5d55);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='modified'],\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='renamed'],\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='copied'],\n.-cerbur-clutch-dsh-worktree-gitFilePath[data-status='type-changed'] {\n color: var(--dsw-alias-state-business-primary, #467bc8);\n}\n\n.-cerbur-clutch-dsh-worktree-gitFileContributors {\n flex: none;\n max-width: 9em;\n overflow: hidden;\n color: var(--dsw-alias-label-tertiary, #65758d);\n font-size: 9px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-gitLineStats {\n display: inline-flex;\n flex: none;\n gap: 6px;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n\n.-cerbur-clutch-dsh-worktree-gitChangedFileList .-cerbur-clutch-dsh-worktree-gitLineStats {\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitLineAdded {\n color: var(--dsw-alias-state-success-primary, #23845f);\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitLineRemoved {\n color: var(--dsw-alias-state-error-secondary, #bd5d55);\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffContainer {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffToolbar {\n display: flex;\n flex: none;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 6px 12px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #edf0f4);\n background: var(--dsw-alias-bg-base, #ffffff);\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 11px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffPath {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: ui-monospace, SFMono-Regular, Consolas, monospace;\n color: var(--dsw-alias-label-primary, #263342);\n font-weight: 560;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffOpenInSidebar {\n display: inline-flex;\n flex: none;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n border: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 4px;\n background: var(--dsw-alias-bg-base, #ffffff);\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 11px;\n line-height: 16px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n/* The square 16px arrow keeps its aspect ratio; pin the box so it centers on the label. */\n.-cerbur-clutch-dsh-worktree-gitDiffOpenIcon {\n flex: none;\n width: 14px;\n height: 14px;\n color: var(--dsw-alias-label-tertiary, #8a94a3);\n transition: color 0.15s ease;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffOpenInSidebar:hover {\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n color: var(--dsw-alias-label-primary, #263342);\n border-color: var(--dsw-alias-border-l2, #cbd2dc);\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffOpenInSidebar:hover .-cerbur-clutch-dsh-worktree-gitDiffOpenIcon {\n color: var(--dsw-alias-label-primary, #263342);\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiff {\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n padding: 7px 0 12px;\n background: var(--dsw-alias-markdown-code-block, #fafbfc);\n color: var(--dsw-alias-label-primary, #263342);\n font: 11px/1.65 ui-monospace, SFMono-Regular, Consolas, monospace;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffSegment {\n margin-bottom: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffSegmentHeader {\n padding: 5px 12px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n background: var(--dsw-alias-interactive-bg-hover, #f1f3f6);\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 10px;\n font-weight: 620;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffSegmentHeader code {\n color: var(--dsw-alias-label-primary, #273142);\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffHunk {\n margin-bottom: 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffHunkHeader {\n padding: 3px 12px;\n background: var(--dsw-alias-markdown-code-block-banner, #edf3fb);\n color: var(--dsw-alias-state-business-primary, #4a70a1);\n box-shadow: inset 0 1px 0 var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.04)), inset 0 -1px 0 var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.04));\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffLine {\n display: grid;\n grid-template-columns: 44px 44px minmax(0, 1fr);\n min-width: max-content;\n padding-right: 12px;\n white-space: pre;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffLineadd {\n background: color-mix(\n in srgb,\n var(--dsw-alias-state-success-primary, #23845f) 18%,\n var(--dsw-alias-markdown-code-block, #fafbfc)\n );\n box-shadow: inset 2px 0 var(--dsw-alias-state-success-primary, #23845f);\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffLinedelete {\n background: color-mix(\n in srgb,\n var(--dsw-alias-state-error-secondary, #bd5d55) 18%,\n var(--dsw-alias-markdown-code-block, #fafbfc)\n );\n box-shadow: inset 2px 0 var(--dsw-alias-state-error-secondary, #bd5d55);\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffLineNumber {\n padding-right: 8px;\n color: var(--dsw-alias-label-tertiary, #9aa3af);\n text-align: right;\n user-select: none;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffLine code {\n min-width: 0;\n color: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-gitSrOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffEmpty,\n.-cerbur-clutch-dsh-worktree-gitDiffMessage,\n.-cerbur-clutch-dsh-worktree-gitEmpty,\n.-cerbur-clutch-dsh-worktree-gitLoading,\n.-cerbur-clutch-dsh-worktree-gitUnavailable,\n.-cerbur-clutch-dsh-worktree-gitError {\n padding: 24px 16px;\n color: var(--dsw-alias-label-secondary, #727d8d);\n font-size: 12px;\n text-align: center;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffMessage,\n.-cerbur-clutch-dsh-worktree-gitUnavailable {\n min-height: 150px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitUnavailable strong {\n display: block;\n margin-bottom: 7px;\n color: var(--dsw-alias-label-primary, #273142);\n font-size: 14px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitUnavailable p {\n max-width: 500px;\n margin: 0 auto;\n line-height: 1.7;\n}\n\n.-cerbur-clutch-dsh-worktree-gitError {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 9px 12px;\n color: var(--dsw-alias-state-error-primary, #ae5c4c);\n text-align: left;\n}\n\n.-cerbur-clutch-dsh-worktree-gitError p {\n margin: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-gitError button {\n flex: none;\n border: 1px solid currentColor;\n border-radius: 5px;\n background: transparent;\n color: inherit;\n cursor: pointer;\n font-size: 11px;\n padding: 3px 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffFolded {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 12px;\n border-top: 1px dashed var(--dsw-alias-border-l3, #dfe3ea);\n background: var(--dsw-alias-bg-base, #fff);\n color: var(--dsw-alias-label-secondary, #6f7887);\n font-size: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-gitDiffShowAll {\n padding: 2px 8px;\n border: 1px solid var(--dsw-alias-border-l3, #dfe3ea);\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-label-primary, #273142);\n cursor: pointer;\n font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-gitRawDiff {\n display: block;\n flex: 1 1 auto;\n min-height: 0;\n max-height: none;\n overflow: auto;\n padding: 12px;\n margin: 0;\n white-space: pre;\n background: var(--dsw-alias-markdown-code-block, #fafbfc);\n color: var(--dsw-alias-label-primary, #263342);\n font: 11px/1.65 ui-monospace, SFMono-Regular, Consolas, monospace;\n}\n\n@container (min-width: 901px) {\n .-cerbur-clutch-dsh-worktree-gitColumns {\n /* Two stacked panes need more vertical room than three side-by-side panes. */\n --git-columns-height: clamp(440px, calc(100vh - 300px), 720px);\n --git-columns-height: clamp(440px, calc(100dvh - 300px), 720px);\n }\n}\n\n@container (max-width: 900px) {\n /* Narrow layout keeps the two-row arrangement: commits and changed files side by\n side on the first row, with the summary diff across the second row. Both\n dividers move with the panes, so either axis stays adjustable. */\n .-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='commits'] {\n grid-area: 1 / 1;\n }\n .-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='columns'] {\n grid-area: 1 / 2;\n }\n .-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='changed-files'] {\n grid-area: 1 / 3;\n }\n .-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-splitter='rows'] {\n grid-area: 2 / 1 / 3 / -1;\n }\n .-cerbur-clutch-dsh-worktree-gitColumns > [data-dashboard-git-pane='diff'] {\n grid-area: 3 / 1 / -1 / -1;\n }\n}\n\n@container (max-width: 520px) {\n .-cerbur-clutch-dsh-worktree-gitPanelHeader {\n flex-direction: column;\n gap: 10px;\n }\n .-cerbur-clutch-dsh-worktree-gitRefresh {\n align-self: flex-end;\n }\n .-cerbur-clutch-dsh-worktree-gitColumns {\n display: block;\n height: auto;\n min-height: 0;\n }\n .-cerbur-clutch-dsh-worktree-gitColumnSplitter {\n display: none;\n }\n .-cerbur-clutch-dsh-worktree-gitColumn {\n height: clamp(260px, calc(100vh - 360px), 360px);\n height: clamp(260px, calc(100dvh - 360px), 360px);\n min-height: 260px;\n border-bottom: 1px solid var(--dsw-alias-border-l3, #e5e8ef);\n }\n .-cerbur-clutch-dsh-worktree-gitColumn:has(> .-cerbur-clutch-dsh-worktree-gitEmpty),\n .-cerbur-clutch-dsh-worktree-gitColumn:has(.-cerbur-clutch-dsh-worktree-gitDiffEmpty) { height: auto; min-height: 100px; }\n .-cerbur-clutch-dsh-worktree-gitColumns > .-cerbur-clutch-dsh-worktree-gitColumn:last-child {\n border-bottom: 0;\n }\n}\n";
|
|
10751
11022
|
const styleId$2 = "@cerbur/clutch-dsh-worktree/worktree-git.css";
|
|
10752
11023
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree-git.css\"]") === null) {
|
|
@@ -12923,7 +13194,7 @@ window.__ModuleLoader__.load({
|
|
|
12923
13194
|
});
|
|
12924
13195
|
}
|
|
12925
13196
|
//#endregion
|
|
12926
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
13197
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/settings/settings.css.mjs
|
|
12927
13198
|
const css$1 = ".-cerbur-clutch-dsh-worktree-settings {\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n min-width: 0;\n max-width: 720px;\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsh-content-font-size, 14px);\n line-height: calc(var(--dsh-content-font-size, 14px) + 8px);\n}\n\n[data-worktree-settings-nav-icon] > svg:not(.-cerbur-clutch-dsh-worktree-settingsNavIcon) {\n display: none;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsNavIcon {\n order: -1;\n flex: 0 0 auto;\n width: 16px;\n height: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-toolSettings {\n display: flex;\n flex-direction: column;\n gap: 20px;\n min-width: 0;\n padding: 20px;\n border: 0.5px solid var(--dsw-alias-settings-card-stroke, var(--dsw-alias-border-l4));\n border-radius: var(--dsw-radius-xl, 16px);\n background: var(--dsw-alias-settings-card-fill, var(--dsw-alias-bg-layer-2));\n}\n\n.-cerbur-clutch-dsh-worktree-toolHeader,\n.-cerbur-clutch-dsh-worktree-toolRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 24px;\n}\n\n.-cerbur-clutch-dsh-worktree-toolHeader > div,\n.-cerbur-clutch-dsh-worktree-toolRow > div {\n min-width: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-toolTitle {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-toolHeader h3 {\n margin: 0;\n font-size: calc(var(--dsh-content-font-size, 14px) + 2px);\n font-weight: 600;\n}\n\n.-cerbur-clutch-dsh-worktree-toolHeader p,\n.-cerbur-clutch-dsh-worktree-toolOptionsHeading p,\n.-cerbur-clutch-dsh-worktree-toolRow p {\n margin: 0;\n color: var(--dsw-alias-label-tertiary);\n font-size: var(--dsh-content-font-size-secondary, calc(var(--dsh-content-font-size, 14px) - 1px));\n line-height: 1.5;\n overflow-wrap: anywhere;\n}\n\n.-cerbur-clutch-dsh-worktree-toolOptions {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding-top: 20px;\n border-top: 0.5px solid var(--dsw-alias-settings-card-stroke, var(--dsw-alias-border-l4));\n}\n\n.-cerbur-clutch-dsh-worktree-toolOptionsHeading h4 {\n margin: 0 0 6px;\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsh-content-font-size, 14px);\n font-weight: 500;\n}\n\n.-cerbur-clutch-dsh-worktree-toolList {\n padding-left: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-toolRow {\n padding: 12px 0;\n}\n\n.-cerbur-clutch-dsh-worktree-toolRow + .-cerbur-clutch-dsh-worktree-toolRow {\n border-top: 0.5px solid var(--dsw-alias-border-l4);\n}\n\n.-cerbur-clutch-dsh-worktree-toolRow h5 {\n margin: 0 0 6px;\n font-size: var(--dsh-content-font-size, 14px);\n font-weight: 500;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsTitle {\n margin: 0;\n font-size: calc(var(--dsh-content-font-size, 14px) + 2px);\n line-height: calc(var(--dsh-content-font-size, 14px) + 10px);\n font-weight: 500;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsTabs {\n width: 100%;\n box-sizing: border-box;\n}\n\n/* Native controls keep their palette and keyboard behavior; text and control\n height follow the body's font-size preference even on older DSH themes. */\n.-cerbur-clutch-dsh-worktree-settings .-cerbur-clutch-dsh-worktree-settingsTabs [role='tab'] {\n height: auto;\n min-height: 34px;\n padding-block: 6px;\n font-size: inherit;\n line-height: calc(var(--dsh-content-font-size, 14px) + 6px);\n white-space: normal;\n overflow-wrap: anywhere;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsPanel,\n.-cerbur-clutch-dsh-worktree-issueList {\n display: flex;\n flex-direction: column;\n min-width: 0;\n gap: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-issueList {\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsDescription,\n.-cerbur-clutch-dsh-worktree-settingsHint,\n.-cerbur-clutch-dsh-worktree-settingsEmpty,\n.-cerbur-clutch-dsh-worktree-issueMessage {\n margin: 0;\n overflow-wrap: anywhere;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsDescription,\n.-cerbur-clutch-dsh-worktree-settingsHint,\n.-cerbur-clutch-dsh-worktree-settingsEmpty {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.-cerbur-clutch-dsh-worktree-settingsHint {\n font-size: var(--dsh-content-font-size-secondary, calc(var(--dsh-content-font-size, 14px) - 1px));\n line-height: 1.5;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsToolbar {\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: 12px;\n padding: 16px 0;\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-settingsToolbar > .-cerbur-clutch-dsh-worktree-settingsHint {\n flex: 1 1 240px;\n min-width: 0;\n}\n\n.-cerbur-clutch-dsh-worktree-settingsEmpty {\n padding-block: 16px;\n}\n\n.-cerbur-clutch-dsh-worktree-issue {\n display: flex;\n flex-direction: column;\n gap: 10px;\n min-width: 0;\n padding: 12px 14px;\n border: 0.5px solid var(--dsw-alias-settings-card-stroke, var(--dsw-alias-border-l4));\n border-radius: var(--dsw-radius-xl, 16px);\n background: var(--dsw-alias-settings-card-fill, var(--dsw-alias-bg-layer-2));\n}\n\n.-cerbur-clutch-dsh-worktree-issueHeader {\n display: flex;\n align-items: baseline;\n flex-wrap: wrap;\n gap: 6px 10px;\n}\n\n.-cerbur-clutch-dsh-worktree-issueTitle {\n flex: 1 1 240px;\n min-width: 0;\n margin: 0;\n font-size: inherit;\n line-height: inherit;\n font-weight: 500;\n overflow-wrap: anywhere;\n}\n\n.-cerbur-clutch-dsh-worktree-settings .-cerbur-clutch-dsh-worktree-issueStatus,\n.-cerbur-clutch-dsh-worktree-settings .-cerbur-clutch-dsh-worktree-settingsAction {\n font-size: calc(var(--dsh-content-font-size, 14px) - 2px);\n line-height: calc(var(--dsh-content-font-size, 14px) + 4px);\n}\n\n.-cerbur-clutch-dsh-worktree-settings .-cerbur-clutch-dsh-worktree-settingsAction {\n flex: none;\n height: auto;\n min-height: 28px;\n padding-block: 4px;\n font-family: inherit;\n white-space: normal;\n overflow-wrap: anywhere;\n max-width: 100%;\n}\n\n.-cerbur-clutch-dsh-worktree-issueActions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.-cerbur-clutch-dsh-worktree-issueDiagnostics {\n min-width: 0;\n padding-top: 10px;\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.-cerbur-clutch-dsh-worktree-issueDiagnostics summary {\n width: fit-content;\n max-width: 100%;\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsh-content-font-size-secondary, calc(var(--dsh-content-font-size, 14px) - 1px));\n line-height: 1.5;\n cursor: pointer;\n overflow-wrap: anywhere;\n}\n\n.-cerbur-clutch-dsh-worktree-issueDiagnostics summary:focus-visible,\n.-cerbur-clutch-dsh-worktree-settings .-cerbur-clutch-dsh-worktree-settingsAction:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n border-radius: var(--dsw-radius-xs, 4px);\n}\n\n.-cerbur-clutch-dsh-worktree-issueDiagnostics pre {\n box-sizing: border-box;\n max-width: 100%;\n max-height: 320px;\n overflow: auto;\n margin: 10px 0 0;\n padding: 10px 12px;\n border-radius: var(--dsw-radius-md, 12px);\n background: var(--dsw-alias-bg-module-platform);\n color: var(--dsw-alias-label-secondary);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsh-content-font-size-secondary, calc(var(--dsh-content-font-size, 14px) - 1px));\n line-height: 1.5;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n user-select: text;\n}\n";
|
|
12928
13199
|
const styleId$1 = "@cerbur/clutch-dsh-worktree/settings.css";
|
|
12929
13200
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/settings.css\"]") === null) {
|
|
@@ -14576,7 +14847,7 @@ window.__ModuleLoader__.load({
|
|
|
14576
14847
|
}
|
|
14577
14848
|
//#endregion
|
|
14578
14849
|
//#region lib/client/WorktreeSurface.js
|
|
14579
|
-
/**
|
|
14850
|
+
/** Retains shared state/actions and portals navigation into the workspace slot. */
|
|
14580
14851
|
function WorktreeSurface(inputProps) {
|
|
14581
14852
|
const [internalDashboard, setInternalDashboard] = (0, react.useState)();
|
|
14582
14853
|
const pendingDashboard = (0, react.useRef)();
|
|
@@ -14788,55 +15059,50 @@ window.__ModuleLoader__.load({
|
|
|
14788
15059
|
dashboardWorkspace
|
|
14789
15060
|
]);
|
|
14790
15061
|
if (source.mode !== "worktree") return null;
|
|
14791
|
-
const {
|
|
15062
|
+
const { collapsed } = source;
|
|
14792
15063
|
const { t } = props;
|
|
14793
15064
|
return (0, react_jsx_runtime.jsxs)(NotificationProvider, {
|
|
14794
15065
|
t,
|
|
14795
15066
|
openSettings: props.openErrorSettings,
|
|
14796
15067
|
children: [
|
|
14797
|
-
(0, react_jsx_runtime.jsxs)("aside", {
|
|
14798
|
-
ref,
|
|
15068
|
+
props.sidebarSeat && (0, react_dom.createPortal)((0, react_jsx_runtime.jsxs)("aside", {
|
|
14799
15069
|
className: worktree_css_default.surface,
|
|
14800
15070
|
"data-worktree-surface": true,
|
|
14801
15071
|
"data-collapsed": collapsed || void 0,
|
|
14802
|
-
"data-native-sidebar-covered": source.nativeCovered || void 0,
|
|
14803
15072
|
"aria-hidden": collapsed || void 0,
|
|
14804
15073
|
"aria-label": t("mode.navigation"),
|
|
14805
|
-
style: {
|
|
14806
|
-
width: `${width}px`,
|
|
14807
|
-
...bounds.ready ? {
|
|
14808
|
-
top: `${bounds.top}px`,
|
|
14809
|
-
height: `${bounds.height}px`
|
|
14810
|
-
} : {
|
|
14811
|
-
height: "0px",
|
|
14812
|
-
visibility: "hidden"
|
|
14813
|
-
}
|
|
14814
|
-
},
|
|
14815
15074
|
children: [
|
|
14816
15075
|
(0, react_jsx_runtime.jsxs)("div", {
|
|
14817
15076
|
className: worktree_css_default.wideContent,
|
|
14818
|
-
children: [
|
|
14819
|
-
|
|
14820
|
-
|
|
14821
|
-
|
|
14822
|
-
|
|
14823
|
-
|
|
14824
|
-
|
|
14825
|
-
|
|
14826
|
-
|
|
14827
|
-
|
|
14828
|
-
|
|
14829
|
-
|
|
14830
|
-
|
|
14831
|
-
|
|
14832
|
-
|
|
14833
|
-
|
|
14834
|
-
|
|
14835
|
-
|
|
14836
|
-
|
|
14837
|
-
|
|
14838
|
-
|
|
14839
|
-
|
|
15077
|
+
children: [
|
|
15078
|
+
(0, react_jsx_runtime.jsx)(SurfaceHeader, {
|
|
15079
|
+
onOpenSession: session.openWorkspaceSession,
|
|
15080
|
+
expansion,
|
|
15081
|
+
props,
|
|
15082
|
+
source,
|
|
15083
|
+
read,
|
|
15084
|
+
mutation
|
|
15085
|
+
}),
|
|
15086
|
+
(0, react_jsx_runtime.jsx)(ActivityFilterBar, {
|
|
15087
|
+
t,
|
|
15088
|
+
activity: source.activity
|
|
15089
|
+
}),
|
|
15090
|
+
(0, react_jsx_runtime.jsx)(SurfaceContent, {
|
|
15091
|
+
source,
|
|
15092
|
+
props,
|
|
15093
|
+
lifecycle,
|
|
15094
|
+
mutation,
|
|
15095
|
+
session,
|
|
15096
|
+
read,
|
|
15097
|
+
expansion,
|
|
15098
|
+
ordering,
|
|
15099
|
+
drag,
|
|
15100
|
+
menus,
|
|
15101
|
+
registration,
|
|
15102
|
+
native,
|
|
15103
|
+
lifecycleState
|
|
15104
|
+
})
|
|
15105
|
+
]
|
|
14840
15106
|
}),
|
|
14841
15107
|
(0, react_jsx_runtime.jsx)(NativeDialogs, {
|
|
14842
15108
|
props,
|
|
@@ -14859,7 +15125,7 @@ window.__ModuleLoader__.load({
|
|
|
14859
15125
|
session
|
|
14860
15126
|
})
|
|
14861
15127
|
]
|
|
14862
|
-
}),
|
|
15128
|
+
}), props.sidebarSeat.element),
|
|
14863
15129
|
dashboard !== void 0 && dashboardRecord === void 0 && dashboard.sessionId === source.currentSessionId && source.workspaceIds.includes(dashboard.workspaceId) && targetView === void 0 && (0, react_jsx_runtime.jsx)(DashboardRequest, {
|
|
14864
15130
|
context: targetWorkspace === void 0 ? dashboard.workspaceId : targetWorkspace.title + " · " + targetWorkspace.path,
|
|
14865
15131
|
t,
|
|
@@ -14997,9 +15263,45 @@ window.__ModuleLoader__.load({
|
|
|
14997
15263
|
}
|
|
14998
15264
|
//#endregion
|
|
14999
15265
|
//#region lib/client/overlay/WorktreeOverlay.js
|
|
15000
|
-
/**
|
|
15266
|
+
/** Keep view state and center overlays alive while the workspace slot changes occupants. */
|
|
15001
15267
|
function WorktreeOverlay(props) {
|
|
15002
|
-
|
|
15268
|
+
const [sidebarSeat, setSidebarSeat] = (0, react.useState)();
|
|
15269
|
+
const active = props.useStore((state) => state.viewMode) === "worktree" && props.available && props.manager !== void 0;
|
|
15270
|
+
(0, react.useLayoutEffect)(() => {
|
|
15271
|
+
if (!active) return;
|
|
15272
|
+
return props.mountWorkspaceSidebar(setSidebarSeat);
|
|
15273
|
+
}, [active, props.mountWorkspaceSidebar]);
|
|
15274
|
+
return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)(WorktreeHeroContext, { ...props }), (0, react_jsx_runtime.jsx)(WorktreeSurface, {
|
|
15275
|
+
...props,
|
|
15276
|
+
sidebarSeat
|
|
15277
|
+
})] });
|
|
15278
|
+
}
|
|
15279
|
+
//#endregion
|
|
15280
|
+
//#region lib/client/view/sidebar-workspace-slot.js
|
|
15281
|
+
/** The shell owns placement and fold state; no native DOM discovery is needed. */
|
|
15282
|
+
function WorktreeWorkspaceSeat({ wide, publish }) {
|
|
15283
|
+
const ref = (0, react.useRef)(null);
|
|
15284
|
+
(0, react.useLayoutEffect)(() => {
|
|
15285
|
+
const element = ref.current;
|
|
15286
|
+
if (element) publish({
|
|
15287
|
+
element,
|
|
15288
|
+
wide
|
|
15289
|
+
});
|
|
15290
|
+
return () => publish(void 0);
|
|
15291
|
+
}, [wide, publish]);
|
|
15292
|
+
return (0, react_jsx_runtime.jsx)("div", {
|
|
15293
|
+
ref,
|
|
15294
|
+
className: worktree_css_default.workspaceSeat,
|
|
15295
|
+
"data-worktree-workspace-seat": true
|
|
15296
|
+
});
|
|
15297
|
+
}
|
|
15298
|
+
/** Shadow only the browsing region, preserving the native registration and its children. */
|
|
15299
|
+
function workspaceSidebarMount(slots) {
|
|
15300
|
+
return (publish) => slots.inject("sidebar.workspaces", () => slots.register({
|
|
15301
|
+
name: "sidebar.workspaces",
|
|
15302
|
+
priority: -10,
|
|
15303
|
+
inject: () => ({ publish })
|
|
15304
|
+
}, WorktreeWorkspaceSeat));
|
|
15003
15305
|
}
|
|
15004
15306
|
//#endregion
|
|
15005
15307
|
//#region lib/client/settings/WorktreeSettings.js
|
|
@@ -15384,7 +15686,7 @@ window.__ModuleLoader__.load({
|
|
|
15384
15686
|
}, "clutch-dsh-worktree: steer activity");
|
|
15385
15687
|
}
|
|
15386
15688
|
//#endregion
|
|
15387
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/
|
|
15689
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/Documents/Code/clutch-dsh/packages/clutch-dsh-worktree/.agents/clutch-worktrees/wt_03c51188ea59/packages/clutch-dsh-worktree/src/client/steer/steer.css.mjs
|
|
15388
15690
|
const css = ".-cerbur-clutch-dsh-worktree-strip {\n box-sizing: border-box;\n flex: none;\n min-width: 0;\n width: calc(100% - var(--dsh-composer-side-clearance, 16px) - var(--dsh-composer-side-clearance, 16px));\n max-width: var(--dsh-composer-card-max-width, 760px);\n margin: 0 auto;\n padding: 8px 12px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 12px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-title { font-weight: 600; margin-bottom: 4px; }\n.-cerbur-clutch-dsh-worktree-items { max-height: 200px; overflow: auto; }\n.-cerbur-clutch-dsh-worktree-item summary { display: flex; align-items: baseline; gap: 8px; cursor: pointer; padding: 4px 0; }\n.-cerbur-clutch-dsh-worktree-item summary::before { content: '›'; flex: none; }\n.-cerbur-clutch-dsh-worktree-item[open] summary::before { transform: rotate(90deg); }\n.-cerbur-clutch-dsh-worktree-status { flex: none; }\n.-cerbur-clutch-dsh-worktree-preview { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.-cerbur-clutch-dsh-worktree-body { padding: 4px 0 8px; overflow-wrap: anywhere; }\n.-cerbur-clutch-dsh-worktree-body p { margin: 6px 0; white-space: pre-wrap; }\n.-cerbur-clutch-dsh-worktree-sender { font-family: monospace; }\n";
|
|
15389
15691
|
const styleId = "@cerbur/clutch-dsh-worktree/steer.css";
|
|
15390
15692
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/steer.css\"]") === null) {
|
|
@@ -15729,11 +16031,33 @@ window.__ModuleLoader__.load({
|
|
|
15729
16031
|
/** Create one root-scoped, browser-local view-mode store for the two slot entries. */
|
|
15730
16032
|
function createWorktreeViewStore() {
|
|
15731
16033
|
return defineStore({
|
|
15732
|
-
init: () => ({
|
|
16034
|
+
init: () => ({
|
|
16035
|
+
viewMode: "workspace-session",
|
|
16036
|
+
activityWindow: "all",
|
|
16037
|
+
activityWindows: [...DEFAULT_ACTIVITY_WINDOWS],
|
|
16038
|
+
showInactiveStructure: true
|
|
16039
|
+
}),
|
|
15733
16040
|
persist: WORKTREE_VIEW_MODE_STORAGE_KEY,
|
|
15734
|
-
actions: {
|
|
15735
|
-
draft
|
|
15736
|
-
|
|
16041
|
+
actions: {
|
|
16042
|
+
setViewMode: (draft, mode) => {
|
|
16043
|
+
draft.viewMode = mode;
|
|
16044
|
+
},
|
|
16045
|
+
setActivityWindow: (draft, window) => {
|
|
16046
|
+
draft.activityWindows = effectiveActivityWindows(draft.activityWindows);
|
|
16047
|
+
draft.activityWindow = window;
|
|
16048
|
+
},
|
|
16049
|
+
setShowInactiveStructure: (draft, show) => {
|
|
16050
|
+
draft.showInactiveStructure = show === true;
|
|
16051
|
+
},
|
|
16052
|
+
setActivityWindowVisible: (draft, window, visible) => {
|
|
16053
|
+
const current = effectiveActivityWindows(draft.activityWindows);
|
|
16054
|
+
const next = toggleActivityWindow(current, window, visible);
|
|
16055
|
+
if (next === current) return;
|
|
16056
|
+
draft.activityWindows = next;
|
|
16057
|
+
const selected = effectiveActivityWindow(draft.activityWindow);
|
|
16058
|
+
if (!next.includes(selected)) draft.activityWindow = nextActivityWindow(selected, next);
|
|
16059
|
+
}
|
|
16060
|
+
}
|
|
15737
16061
|
});
|
|
15738
16062
|
}
|
|
15739
16063
|
//#endregion
|
|
@@ -16200,6 +16524,7 @@ window.__ModuleLoader__.load({
|
|
|
16200
16524
|
const dashboardStore = createSnapshotStore(void 0);
|
|
16201
16525
|
const sessions = ctx.sessions;
|
|
16202
16526
|
const slots = ctx.slots;
|
|
16527
|
+
const mountWorkspaceSidebar = workspaceSidebarMount(slots);
|
|
16203
16528
|
slots.inject("conversation.input.dock", () => slots.register({
|
|
16204
16529
|
name: "conversation.input.dock",
|
|
16205
16530
|
id: "clutch-dsh-worktree-steer",
|
|
@@ -16459,6 +16784,7 @@ window.__ModuleLoader__.load({
|
|
|
16459
16784
|
store: viewStore,
|
|
16460
16785
|
locale: WORKTREE_NS,
|
|
16461
16786
|
inject: () => ({
|
|
16787
|
+
mountWorkspaceSidebar,
|
|
16462
16788
|
available: true,
|
|
16463
16789
|
openErrorSettings: () => openWorktreeErrorSettings(ctx.slots),
|
|
16464
16790
|
openResource: (address, options) => {
|