@cerbur/clutch-dsh-worktree 0.1.14 → 0.1.16
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 +34 -12
- package/README.zh.md +32 -12
- package/lib/client/WorktreeSurface.d.ts.map +1 -1
- package/lib/client/WorktreeSurface.js +32 -9
- package/lib/client/WorktreeSurface.js.map +1 -1
- package/lib/client/context/WorktreeContext.d.ts.map +1 -1
- package/lib/client/context/WorktreeContext.js +3 -2
- package/lib/client/context/WorktreeContext.js.map +1 -1
- package/lib/client/context/worktree-context-store.d.ts +3 -2
- package/lib/client/context/worktree-context-store.d.ts.map +1 -1
- package/lib/client/context/worktree-context-store.js +2 -1
- package/lib/client/context/worktree-context-store.js.map +1 -1
- package/lib/client/dashboard/DashboardRequest.d.ts +10 -0
- package/lib/client/dashboard/DashboardRequest.d.ts.map +1 -0
- package/lib/client/dashboard/DashboardRequest.js +38 -0
- package/lib/client/dashboard/DashboardRequest.js.map +1 -0
- package/lib/client/dashboard/OpenInAppButton.d.ts.map +1 -1
- package/lib/client/dashboard/OpenInAppButton.js +2 -1
- package/lib/client/dashboard/OpenInAppButton.js.map +1 -1
- package/lib/client/dashboard/WorktreeDashboard.d.ts.map +1 -1
- package/lib/client/dashboard/WorktreeDashboard.js +62 -54
- package/lib/client/dashboard/WorktreeDashboard.js.map +1 -1
- package/lib/client/dashboard/dashboard-overlay.d.ts.map +1 -1
- package/lib/client/dashboard/dashboard-overlay.js +12 -2
- package/lib/client/dashboard/dashboard-overlay.js.map +1 -1
- package/lib/client/dashboard/git/GitChangedFiles.js +1 -1
- package/lib/client/dashboard/git/GitChangedFiles.js.map +1 -1
- package/lib/client/dashboard/git/GitDiffView.js +1 -1
- package/lib/client/dashboard/git/GitDiffView.js.map +1 -1
- package/lib/client/dsh-icon-compat.d.ts +11 -0
- package/lib/client/dsh-icon-compat.d.ts.map +1 -0
- package/lib/client/dsh-icon-compat.js +12 -0
- package/lib/client/dsh-icon-compat.js.map +1 -0
- package/lib/client/dsh-icons.d.ts +20 -0
- package/lib/client/dsh-icons.d.ts.map +1 -0
- package/lib/client/dsh-icons.js +23 -0
- package/lib/client/dsh-icons.js.map +1 -0
- package/lib/client/entry.d.ts.map +1 -1
- package/lib/client/entry.js +25 -15
- package/lib/client/entry.js.map +1 -1
- package/lib/client/locales.d.ts +6 -0
- package/lib/client/locales.d.ts.map +1 -1
- package/lib/client/locales.js +6 -0
- package/lib/client/locales.js.map +1 -1
- package/lib/client/overlay/sidebar-overlay-geometry.d.ts +4 -0
- package/lib/client/overlay/sidebar-overlay-geometry.d.ts.map +1 -1
- package/lib/client/overlay/sidebar-overlay-geometry.js +102 -14
- package/lib/client/overlay/sidebar-overlay-geometry.js.map +1 -1
- package/lib/client/restart-notice.d.ts +18 -0
- package/lib/client/restart-notice.d.ts.map +1 -0
- package/lib/client/restart-notice.js +64 -0
- package/lib/client/restart-notice.js.map +1 -0
- package/lib/client/session/session-navigation.d.ts +8 -0
- package/lib/client/session/session-navigation.d.ts.map +1 -0
- package/lib/client/session/session-navigation.js +15 -0
- package/lib/client/session/session-navigation.js.map +1 -0
- package/lib/client/session/session-rename.d.ts +7 -0
- package/lib/client/session/session-rename.d.ts.map +1 -0
- package/lib/client/session/session-rename.js +18 -0
- package/lib/client/session/session-rename.js.map +1 -0
- package/lib/client/session/session-selection.d.ts +12 -0
- package/lib/client/session/session-selection.d.ts.map +1 -0
- package/lib/client/session/session-selection.js +8 -0
- package/lib/client/session/session-selection.js.map +1 -0
- package/lib/client/session/session-view.d.ts +3 -0
- package/lib/client/session/session-view.d.ts.map +1 -1
- package/lib/client/session/session-view.js +2 -1
- package/lib/client/session/session-view.js.map +1 -1
- package/lib/client/surface/components/ActiveWorktree.js +1 -1
- package/lib/client/surface/components/ActiveWorktree.js.map +1 -1
- package/lib/client/surface/components/AnimatedTree.d.ts +32 -0
- package/lib/client/surface/components/AnimatedTree.d.ts.map +1 -0
- package/lib/client/surface/components/AnimatedTree.js +139 -0
- package/lib/client/surface/components/AnimatedTree.js.map +1 -0
- package/lib/client/surface/components/ArchivedWorktree.js +1 -1
- package/lib/client/surface/components/ArchivedWorktree.js.map +1 -1
- package/lib/client/surface/components/ArchivedWorktrees.js +1 -1
- package/lib/client/surface/components/ArchivedWorktrees.js.map +1 -1
- package/lib/client/surface/components/RestartToast.d.ts +6 -0
- package/lib/client/surface/components/RestartToast.d.ts.map +1 -0
- package/lib/client/surface/components/RestartToast.js +10 -0
- package/lib/client/surface/components/RestartToast.js.map +1 -0
- package/lib/client/surface/components/SurfaceContent.d.ts.map +1 -1
- package/lib/client/surface/components/SurfaceContent.js +1 -1
- package/lib/client/surface/components/SurfaceContent.js.map +1 -1
- package/lib/client/surface/components/SurfaceHeader.js +2 -1
- package/lib/client/surface/components/SurfaceHeader.js.map +1 -1
- package/lib/client/surface/components/WorkspaceTree.d.ts.map +1 -1
- package/lib/client/surface/components/WorkspaceTree.js +6 -2
- package/lib/client/surface/components/WorkspaceTree.js.map +1 -1
- package/lib/client/surface/components/dialogs.d.ts.map +1 -1
- package/lib/client/surface/components/dialogs.js +2 -0
- package/lib/client/surface/components/dialogs.js.map +1 -1
- package/lib/client/surface/components/rows.d.ts.map +1 -1
- package/lib/client/surface/components/rows.js +14 -8
- package/lib/client/surface/components/rows.js.map +1 -1
- package/lib/client/surface/state/useSurfaceSources.d.ts +1 -0
- package/lib/client/surface/state/useSurfaceSources.d.ts.map +1 -1
- package/lib/client/surface/state/useSurfaceSources.js +5 -4
- package/lib/client/surface/state/useSurfaceSources.js.map +1 -1
- package/lib/client/view/WorktreeModeAction.js +1 -1
- package/lib/client/view/WorktreeModeAction.js.map +1 -1
- package/lib/client/view/view-mode.d.ts +4 -1
- package/lib/client/view/view-mode.d.ts.map +1 -1
- package/lib/client/view/view-mode.js +2 -1
- package/lib/client/view/view-mode.js.map +1 -1
- package/lib/client/view/worktree-error-copy.d.ts.map +1 -1
- package/lib/client/view/worktree-error-copy.js +6 -0
- package/lib/client/view/worktree-error-copy.js.map +1 -1
- package/lib/client/view/worktree-view-read.d.ts +3 -0
- package/lib/client/view/worktree-view-read.d.ts.map +1 -1
- package/lib/client/view/worktree-view-read.js +9 -0
- package/lib/client/view/worktree-view-read.js.map +1 -1
- package/lib/client/worktree-connection.d.ts +8 -0
- package/lib/client/worktree-connection.d.ts.map +1 -1
- package/lib/client/worktree-connection.js +14 -2
- package/lib/client/worktree-connection.js.map +1 -1
- package/lib/client.js +899 -420
- package/lib/client.js.map +1 -1
- package/lib/contract/index.d.ts +1 -1
- package/lib/contract/index.d.ts.map +1 -1
- package/lib/contract/index.js +1 -0
- package/lib/contract/index.js.map +1 -1
- package/lib/host/worktree-instructions.d.ts.map +1 -1
- package/lib/host/worktree-instructions.js +10 -2
- package/lib/host/worktree-instructions.js.map +1 -1
- package/lib/manage/manager-git-history.d.ts.map +1 -1
- package/lib/manage/manager-git-history.js +14 -10
- package/lib/manage/manager-git-history.js.map +1 -1
- package/lib/manage/manager-sessions.js +2 -2
- package/lib/manage/manager-sessions.js.map +1 -1
- package/lib/manage/manager-support.d.ts +7 -1
- package/lib/manage/manager-support.d.ts.map +1 -1
- package/lib/manage/manager-support.js +73 -14
- package/lib/manage/manager-support.js.map +1 -1
- package/lib/manage/manager-worktrees.d.ts.map +1 -1
- package/lib/manage/manager-worktrees.js +6 -4
- package/lib/manage/manager-worktrees.js.map +1 -1
- package/lib/manage/manager.js +2 -2
- package/lib/manage/manager.js.map +1 -1
- package/lib/typert.host.js +264 -198
- package/lib/typert.remote-client.js +264 -198
- package/package.json +45 -44
package/lib/client.js
CHANGED
|
@@ -614,7 +614,7 @@ window.__ModuleLoader__.load({
|
|
|
614
614
|
}
|
|
615
615
|
var produce = new Immer2().produce;
|
|
616
616
|
//#endregion
|
|
617
|
-
//#region ../../node_modules/.pnpm/@deepseek-ai+dsh-client-store@0.
|
|
617
|
+
//#region ../../node_modules/.pnpm/@deepseek-ai+dsh-client-store@0.2.0-rc.1_@deepseek-ai+cordis@4.0.4/node_modules/@deepseek-ai/dsh-client-store/lib/index.js
|
|
618
618
|
/**
|
|
619
619
|
* React-free snapshot store engine (zustand vanilla + immer + subscribeWithSelector +
|
|
620
620
|
* rafFlush middleware + opt-in persist + dev freeze) plus the declarative
|
|
@@ -780,6 +780,7 @@ window.__ModuleLoader__.load({
|
|
|
780
780
|
//#region lib/client/locales.js
|
|
781
781
|
const WORKTREE_NS = "worktree";
|
|
782
782
|
const zh = {
|
|
783
|
+
restartRequired: "Worktree 插件已安装。请重启 DSH Desktop,或重启 DSH Web 服务后刷新页面,以启用插件。",
|
|
783
784
|
"dashboard.title": "Dashboard",
|
|
784
785
|
"dashboard.preview": "Dashboard 预览",
|
|
785
786
|
"dashboard.open": "打开 Dashboard",
|
|
@@ -1002,6 +1003,7 @@ window.__ModuleLoader__.load({
|
|
|
1002
1003
|
"worktree.baseBranch": "Worktree 基线分支",
|
|
1003
1004
|
"worktree.noLocalBranch": "没有本地分支",
|
|
1004
1005
|
"worktree.noBranches": "此工作区中没有找到本地分支。",
|
|
1006
|
+
"worktree.setup.workspaceMissing": "此 Workspace 的本地目录已不存在。请恢复该目录,或在 DSH 中移除该 Workspace 后重试。",
|
|
1005
1007
|
"worktree.setup.gitNotInstalled": "Git 未安装或不在 PATH 中。请先安装 Git,然后重启 DSH 再重试。",
|
|
1006
1008
|
"worktree.setup.noRepository": "此 Workspace 不是 Git 仓库。请在 Workspace 目录执行以下命令:",
|
|
1007
1009
|
"worktree.setup.noInitialCommit": "此 Git 仓库还没有首次 commit。请先执行以下命令:",
|
|
@@ -1084,6 +1086,7 @@ window.__ModuleLoader__.load({
|
|
|
1084
1086
|
"error.worktreeRegistrationSessionUnavailable": "Worktree 已注册,但 Session 创建不可用,请重新连接后重试。",
|
|
1085
1087
|
"error.workspaceRenameUnavailable": "工作区重命名不可用,请重新连接后重试。",
|
|
1086
1088
|
"error.workspaceDeleteUnavailable": "工作区删除不可用,请重新连接后重试。",
|
|
1089
|
+
"error.workspaceRootMissing": "Workspace 目录不存在:{rootPath}",
|
|
1087
1090
|
"error.sessionRenameUnavailable": "会话重命名不可用,请重新连接后重试。",
|
|
1088
1091
|
"error.sessionBindingFailed": "Session {sessionId} 已创建,但 Worktree 绑定失败:{reason}",
|
|
1089
1092
|
"error.sessionAlreadyBound": "Session 已绑定到其他 Worktree,未创建新的 Session。",
|
|
@@ -1098,6 +1101,7 @@ window.__ModuleLoader__.load({
|
|
|
1098
1101
|
"branch.checkedOut": "(已检出)"
|
|
1099
1102
|
};
|
|
1100
1103
|
const en = {
|
|
1104
|
+
restartRequired: "Worktree is installed. Restart DSH Desktop, or restart the DSH Web server and refresh this page, to enable it.",
|
|
1101
1105
|
"dashboard.title": "Dashboard",
|
|
1102
1106
|
"dashboard.preview": "Dashboard preview",
|
|
1103
1107
|
"dashboard.open": "Open Dashboard",
|
|
@@ -1320,6 +1324,7 @@ window.__ModuleLoader__.load({
|
|
|
1320
1324
|
"worktree.baseBranch": "Worktree base branch",
|
|
1321
1325
|
"worktree.noLocalBranch": "No local branch",
|
|
1322
1326
|
"worktree.noBranches": "No local branches found in this Workspace.",
|
|
1327
|
+
"worktree.setup.workspaceMissing": "The local directory for this Workspace no longer exists. Restore it, or remove the Workspace in DSH and retry.",
|
|
1323
1328
|
"worktree.setup.gitNotInstalled": "Git is not installed or is not available on PATH. Install Git, restart DSH, and retry.",
|
|
1324
1329
|
"worktree.setup.noRepository": "This Workspace is not a Git repository. Run these commands in the Workspace directory:",
|
|
1325
1330
|
"worktree.setup.noInitialCommit": "This Git repository has no initial commit. Run these commands first:",
|
|
@@ -1402,6 +1407,7 @@ window.__ModuleLoader__.load({
|
|
|
1402
1407
|
"error.worktreeRegistrationSessionUnavailable": "The Worktree was registered, but Session creation is unavailable; retry after reconnecting.",
|
|
1403
1408
|
"error.workspaceRenameUnavailable": "Workspace rename is unavailable; retry after reconnecting.",
|
|
1404
1409
|
"error.workspaceDeleteUnavailable": "Workspace delete is unavailable; retry after reconnecting.",
|
|
1410
|
+
"error.workspaceRootMissing": "Workspace directory is missing: {rootPath}",
|
|
1405
1411
|
"error.sessionRenameUnavailable": "Session rename is unavailable; retry after reconnecting.",
|
|
1406
1412
|
"error.sessionBindingFailed": "Session {sessionId} was created, but Worktree binding failed: {reason}",
|
|
1407
1413
|
"error.sessionAlreadyBound": "The Session is already bound to another Worktree; no new Session was created.",
|
|
@@ -1525,9 +1531,12 @@ window.__ModuleLoader__.load({
|
|
|
1525
1531
|
function createWorktreeConnectionAdapter(rpc) {
|
|
1526
1532
|
const inFlight = /* @__PURE__ */ new Set();
|
|
1527
1533
|
let disposed = false;
|
|
1528
|
-
async function
|
|
1534
|
+
async function call(method, input, signal) {
|
|
1529
1535
|
if (disposed) throw disposedError();
|
|
1530
1536
|
const controller = new AbortController();
|
|
1537
|
+
const abort = () => controller.abort();
|
|
1538
|
+
if (signal?.aborted) controller.abort();
|
|
1539
|
+
else signal?.addEventListener("abort", abort, { once: true });
|
|
1531
1540
|
inFlight.add(controller);
|
|
1532
1541
|
const endpoint = WORKTREE_CONNECTION_ENDPOINTS[method];
|
|
1533
1542
|
try {
|
|
@@ -1538,12 +1547,17 @@ window.__ModuleLoader__.load({
|
|
|
1538
1547
|
if (disposed && controller.signal.aborted) throw disposedError();
|
|
1539
1548
|
throw connectionFailure(endpoint, error);
|
|
1540
1549
|
}
|
|
1541
|
-
return
|
|
1550
|
+
return result;
|
|
1542
1551
|
} finally {
|
|
1552
|
+
signal?.removeEventListener("abort", abort);
|
|
1543
1553
|
inFlight.delete(controller);
|
|
1544
1554
|
}
|
|
1545
1555
|
}
|
|
1556
|
+
async function invoke(method, input) {
|
|
1557
|
+
return unwrap(WORKTREE_CONNECTION_ENDPOINTS[method], await call(method, input));
|
|
1558
|
+
}
|
|
1546
1559
|
return {
|
|
1560
|
+
probeHost: (signal) => call("listBindings", { workspaceId: "" }, signal),
|
|
1547
1561
|
listWorktrees: (input) => invoke("listWorktrees", input),
|
|
1548
1562
|
listWorktreeCommits: (input) => invoke("listWorktreeCommits", input),
|
|
1549
1563
|
listWorktreeCommitFiles: (input) => invoke("listWorktreeCommitFiles", input),
|
|
@@ -1595,7 +1609,103 @@ window.__ModuleLoader__.load({
|
|
|
1595
1609
|
};
|
|
1596
1610
|
}
|
|
1597
1611
|
//#endregion
|
|
1598
|
-
//#region
|
|
1612
|
+
//#region lib/client/restart-notice.js
|
|
1613
|
+
const MISSING_HOST_CODES = /* @__PURE__ */ new Set([
|
|
1614
|
+
"gateway/service-unavailable",
|
|
1615
|
+
"gateway/definition-unavailable",
|
|
1616
|
+
"gateway/invocation-unavailable"
|
|
1617
|
+
]);
|
|
1618
|
+
/** A transient reminder owned by one Client fiber, independent of ready view content. */
|
|
1619
|
+
var RestartNotice = class {
|
|
1620
|
+
probe;
|
|
1621
|
+
visible = false;
|
|
1622
|
+
notified = false;
|
|
1623
|
+
disposed = false;
|
|
1624
|
+
pending;
|
|
1625
|
+
listeners = /* @__PURE__ */ new Set();
|
|
1626
|
+
constructor(probe) {
|
|
1627
|
+
this.probe = probe;
|
|
1628
|
+
}
|
|
1629
|
+
getSnapshot = () => this.visible;
|
|
1630
|
+
subscribe = (listener) => {
|
|
1631
|
+
this.listeners.add(listener);
|
|
1632
|
+
return () => this.listeners.delete(listener);
|
|
1633
|
+
};
|
|
1634
|
+
dismiss = () => this.setVisible(false);
|
|
1635
|
+
async check() {
|
|
1636
|
+
if (this.disposed) return;
|
|
1637
|
+
this.pending?.abort();
|
|
1638
|
+
const controller = new AbortController();
|
|
1639
|
+
this.pending = controller;
|
|
1640
|
+
const timer = setTimeout(() => controller.abort(), 5e3);
|
|
1641
|
+
try {
|
|
1642
|
+
const result = await this.probe(controller.signal);
|
|
1643
|
+
if (this.disposed || controller.signal.aborted || this.pending !== controller) return;
|
|
1644
|
+
if (result.ok) this.dismiss();
|
|
1645
|
+
else if (!this.notified && MISSING_HOST_CODES.has(result.error?.code ?? "")) {
|
|
1646
|
+
this.notified = true;
|
|
1647
|
+
this.setVisible(true);
|
|
1648
|
+
}
|
|
1649
|
+
} catch {} finally {
|
|
1650
|
+
clearTimeout(timer);
|
|
1651
|
+
if (this.pending === controller) this.pending = void 0;
|
|
1652
|
+
}
|
|
1653
|
+
}
|
|
1654
|
+
dispose() {
|
|
1655
|
+
this.disposed = true;
|
|
1656
|
+
this.pending?.abort();
|
|
1657
|
+
this.listeners.clear();
|
|
1658
|
+
}
|
|
1659
|
+
setVisible(visible) {
|
|
1660
|
+
if (this.visible === visible || this.disposed) return;
|
|
1661
|
+
this.visible = visible;
|
|
1662
|
+
for (const listener of this.listeners) listener();
|
|
1663
|
+
}
|
|
1664
|
+
};
|
|
1665
|
+
//#endregion
|
|
1666
|
+
//#region lib/client/surface/components/RestartToast.js
|
|
1667
|
+
function RestartToast({ notice, t }) {
|
|
1668
|
+
if (!(0, react.useSyncExternalStore)(notice.subscribe, notice.getSnapshot, notice.getSnapshot)) return null;
|
|
1669
|
+
return (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
|
|
1670
|
+
text: t("restartRequired"),
|
|
1671
|
+
holdMs: 8e3,
|
|
1672
|
+
onDone: notice.dismiss
|
|
1673
|
+
});
|
|
1674
|
+
}
|
|
1675
|
+
//#endregion
|
|
1676
|
+
//#region lib/client/dsh-icon-compat.js
|
|
1677
|
+
/** Resolve a legacy size-named export or the equivalent DSH 1.7 weighted export. */
|
|
1678
|
+
function createDshIconAlias(exports, legacyName, currentName) {
|
|
1679
|
+
return function DshIconAlias(props) {
|
|
1680
|
+
const candidate = exports[legacyName] ?? exports[currentName];
|
|
1681
|
+
if (typeof candidate !== "function") throw new Error(`Missing DSH icon export: ${legacyName} or ${currentName}`);
|
|
1682
|
+
return (0, react.createElement)(candidate, props);
|
|
1683
|
+
};
|
|
1684
|
+
}
|
|
1685
|
+
//#endregion
|
|
1686
|
+
//#region lib/client/dsh-icons.js
|
|
1687
|
+
const exports$1 = _deepseek_ai_dsh_client_ui_primitives;
|
|
1688
|
+
const IconArchiveOutline20 = createDshIconAlias(exports$1, "IconArchiveOutline20", "IconArchiveOutlineRegular");
|
|
1689
|
+
const IconBranchOutline16 = createDshIconAlias(exports$1, "IconBranchOutline16", "IconBranchOutlineRegular");
|
|
1690
|
+
const IconChevronDownOutline14 = createDshIconAlias(exports$1, "IconChevronDownOutline14", "IconChevronDownOutlineRegular");
|
|
1691
|
+
const IconChevronRightOutline14 = createDshIconAlias(exports$1, "IconChevronRightOutline14", "IconChevronRightOutlineRegular");
|
|
1692
|
+
const IconCheckOutline16 = createDshIconAlias(exports$1, "IconCheckOutline16", "IconCheckOutlineRegular");
|
|
1693
|
+
const IconCloseFill14 = createDshIconAlias(exports$1, "IconCloseFill14", "IconCloseFillRegular");
|
|
1694
|
+
const IconCloseOutline16 = createDshIconAlias(exports$1, "IconCloseOutline16", "IconCloseOutlineRegular");
|
|
1695
|
+
const IconCopyOutline16 = createDshIconAlias(exports$1, "IconCopyOutline16", "IconCopyOutlineRegular");
|
|
1696
|
+
const IconEditOutline16 = createDshIconAlias(exports$1, "IconEditOutline16", "IconEditOutlineRegular");
|
|
1697
|
+
const IconEllipsisOutline16 = createDshIconAlias(exports$1, "IconEllipsisOutline16", "IconEllipsisOutlineRegular");
|
|
1698
|
+
const IconFolderClose16 = createDshIconAlias(exports$1, "IconFolderClose16", "IconFolderCloseRegular");
|
|
1699
|
+
const IconFolderOpen16 = createDshIconAlias(exports$1, "IconFolderOpen16", "IconFolderOpenRegular");
|
|
1700
|
+
const IconPanelLeftOutline16 = createDshIconAlias(exports$1, "IconPanelLeftOutline16", "IconPanelLeftOutlineRegular");
|
|
1701
|
+
const IconPlusOutline16 = createDshIconAlias(exports$1, "IconPlusOutline16", "IconPlusOutlineRegular");
|
|
1702
|
+
const IconProjectAddOutline16 = createDshIconAlias(exports$1, "IconProjectAddOutline16", "IconProjectAddOutlineRegular");
|
|
1703
|
+
const IconRefreshOutline16 = createDshIconAlias(exports$1, "IconRefreshOutline16", "IconRefreshOutlineRegular");
|
|
1704
|
+
const IconRightUpOutline16 = createDshIconAlias(exports$1, "IconRightUpOutline16", "IconRightUpOutlineRegular");
|
|
1705
|
+
const IconSearchOutline16 = createDshIconAlias(exports$1, "IconSearchOutline16", "IconSearchOutlineRegular");
|
|
1706
|
+
const IconTrashOutline16 = createDshIconAlias(exports$1, "IconTrashOutline16", "IconTrashOutlineRegular");
|
|
1707
|
+
//#endregion
|
|
1708
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_63cf54e5ec74/packages/clutch-dsh-worktree/src/client/context/worktree-context.css.mjs
|
|
1599
1709
|
const css$5 = ".-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";
|
|
1600
1710
|
const styleId$5 = "@cerbur/clutch-dsh-worktree/worktree-context.css";
|
|
1601
1711
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree-context.css\"]") === null) {
|
|
@@ -1623,10 +1733,9 @@ window.__ModuleLoader__.load({
|
|
|
1623
1733
|
className: worktree_context_css_default.headerContext,
|
|
1624
1734
|
title: value.label,
|
|
1625
1735
|
"aria-label": ariaLabel,
|
|
1626
|
-
children: [(0, react_jsx_runtime.jsx)(
|
|
1736
|
+
children: [(0, react_jsx_runtime.jsx)(IconBranchOutline16, {
|
|
1627
1737
|
size: 14,
|
|
1628
|
-
className: worktree_context_css_default.contextIcon
|
|
1629
|
-
"aria-hidden": "true"
|
|
1738
|
+
className: worktree_context_css_default.contextIcon
|
|
1630
1739
|
}), (0, react_jsx_runtime.jsx)("span", {
|
|
1631
1740
|
className: worktree_context_css_default.contextLabel,
|
|
1632
1741
|
children: value.label
|
|
@@ -1660,8 +1769,8 @@ window.__ModuleLoader__.load({
|
|
|
1660
1769
|
globalSetViewMode?.(mode);
|
|
1661
1770
|
}
|
|
1662
1771
|
//#endregion
|
|
1663
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/
|
|
1664
|
-
const css$4 = ".-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: 56px;\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@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-worktreeModalTabs {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTab {\n border: 0;\n border-bottom: 2px solid transparent;\n padding: 4px 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\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-worktreeImportSelect {\n width: 100%;\n min-width: 0;\n padding: 7px 8px;\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: 13px;\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-content {\n min-height: 0;\n flex: 1;\n overflow: auto;\n padding: 0 10px 12px;\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.-cerbur-clutch-dsh-worktree-worktreeImportSelect: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-workspaceList {\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-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-brand-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/* A collapsed running row keeps one shared scroll container for its label. */\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel,\n/* Once the action rail is revealed, allow long branch labels to scroll inline. */\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 overflow-x: auto;\n overflow-y: hidden;\n text-overflow: clip;\n scrollbar-width: none;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel::-webkit-scrollbar,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeLabel::-webkit-scrollbar,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel::-webkit-scrollbar,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-worktreeLabel::-webkit-scrollbar {\n display: none;\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}\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 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\n.-cerbur-clutch-dsh-worktree-notificationDetails > summary {\n cursor: pointer;\n padding: 8px;\n font-size: 12px;\n}\n";
|
|
1772
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_63cf54e5ec74/packages/clutch-dsh-worktree/src/client/worktree.css.mjs
|
|
1773
|
+
const css$4 = ".-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-worktreeModalTabs {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeModalTab {\n border: 0;\n border-bottom: 2px solid transparent;\n padding: 4px 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n font: inherit;\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-worktreeImportSelect {\n width: 100%;\n min-width: 0;\n padding: 7px 8px;\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: 13px;\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-content {\n min-height: 0;\n flex: 1;\n overflow: auto;\n padding: 0 10px 12px;\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.-cerbur-clutch-dsh-worktree-worktreeImportSelect: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-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-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-brand-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/* A collapsed running row keeps one shared scroll container for its label. */\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel,\n/* Once the action rail is revealed, allow long branch labels to scroll inline. */\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 overflow-x: auto;\n overflow-y: hidden;\n text-overflow: clip;\n scrollbar-width: none;\n}\n\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-group-activity='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel::-webkit-scrollbar,\n.-cerbur-clutch-dsh-worktree-worktreeRow:hover .-cerbur-clutch-dsh-worktree-worktreeLabel::-webkit-scrollbar,\n.-cerbur-clutch-dsh-worktree-worktreeRow[data-menu-open='true'] .-cerbur-clutch-dsh-worktree-worktreeLabel::-webkit-scrollbar,\n.-cerbur-clutch-dsh-worktree-worktreeRow:focus-within .-cerbur-clutch-dsh-worktree-worktreeLabel::-webkit-scrollbar {\n display: none;\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}\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 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\n.-cerbur-clutch-dsh-worktree-notificationDetails > summary {\n cursor: pointer;\n padding: 8px;\n font-size: 12px;\n}\n";
|
|
1665
1774
|
const styleId$4 = "@cerbur/clutch-dsh-worktree/worktree.css";
|
|
1666
1775
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree.css\"]") === null) {
|
|
1667
1776
|
const tag = document.createElement("style");
|
|
@@ -1674,6 +1783,7 @@ window.__ModuleLoader__.load({
|
|
|
1674
1783
|
"action": "-cerbur-clutch-dsh-worktree-action",
|
|
1675
1784
|
"actionLabel": "-cerbur-clutch-dsh-worktree-actionLabel",
|
|
1676
1785
|
"surface": "-cerbur-clutch-dsh-worktree-surface",
|
|
1786
|
+
"motionExits": "-cerbur-clutch-dsh-worktree-motionExits",
|
|
1677
1787
|
"wideContent": "-cerbur-clutch-dsh-worktree-wideContent",
|
|
1678
1788
|
"worktreeModalTabs": "-cerbur-clutch-dsh-worktree-worktreeModalTabs",
|
|
1679
1789
|
"worktreeModalTab": "-cerbur-clutch-dsh-worktree-worktreeModalTab",
|
|
@@ -1783,7 +1893,7 @@ window.__ModuleLoader__.load({
|
|
|
1783
1893
|
onClick: () => {
|
|
1784
1894
|
actions.setViewMode(active ? "workspace-session" : "worktree");
|
|
1785
1895
|
},
|
|
1786
|
-
children: [(0, react_jsx_runtime.jsx)(
|
|
1896
|
+
children: [(0, react_jsx_runtime.jsx)(IconBranchOutline16, { size: wide ? 16 : 18 }), wide && (0, react_jsx_runtime.jsx)("span", {
|
|
1787
1897
|
className: worktree_css_default.actionLabel,
|
|
1788
1898
|
children: t("mode.label")
|
|
1789
1899
|
})]
|
|
@@ -1835,7 +1945,7 @@ window.__ModuleLoader__.load({
|
|
|
1835
1945
|
});
|
|
1836
1946
|
}
|
|
1837
1947
|
//#endregion
|
|
1838
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/
|
|
1948
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_63cf54e5ec74/packages/clutch-dsh-worktree/src/client/dashboard/dashboard-header-action.css.mjs
|
|
1839
1949
|
const css$3 = "/* 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";
|
|
1840
1950
|
const styleId$3 = "@cerbur/clutch-dsh-worktree/dashboard-header-action.css";
|
|
1841
1951
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/dashboard-header-action.css\"]") === null) {
|
|
@@ -2065,6 +2175,7 @@ window.__ModuleLoader__.load({
|
|
|
2065
2175
|
case "WORKTREE_REGISTRATION_SESSION_UNAVAILABLE": return t("error.worktreeRegistrationSessionUnavailable");
|
|
2066
2176
|
case "WORKSPACE_RENAME_UNAVAILABLE": return t("error.workspaceRenameUnavailable");
|
|
2067
2177
|
case "WORKSPACE_DELETE_UNAVAILABLE": return t("error.workspaceDeleteUnavailable");
|
|
2178
|
+
case "WORKSPACE_ROOT_MISSING": return t("error.workspaceRootMissing", { rootPath: detail(error, "rootPath") });
|
|
2068
2179
|
case "SESSION_RENAME_UNAVAILABLE": return t("error.sessionRenameUnavailable");
|
|
2069
2180
|
case "SESSION_BINDING_FAILED": return t("error.sessionBindingFailed", {
|
|
2070
2181
|
sessionId: detail(error, "sessionId"),
|
|
@@ -2308,6 +2419,7 @@ window.__ModuleLoader__.load({
|
|
|
2308
2419
|
/** Return copyable, read-only setup commands for a Git readiness state. */
|
|
2309
2420
|
function worktreeSetupCommands(status) {
|
|
2310
2421
|
switch (status) {
|
|
2422
|
+
case "workspaceMissing": return [];
|
|
2311
2423
|
case "gitNotInstalled": return [];
|
|
2312
2424
|
case "noRepository": return [
|
|
2313
2425
|
"git init",
|
|
@@ -2326,6 +2438,10 @@ window.__ModuleLoader__.load({
|
|
|
2326
2438
|
}
|
|
2327
2439
|
function readinessFromBranchError(error) {
|
|
2328
2440
|
const viewError = toWorktreeViewError(error);
|
|
2441
|
+
if (viewError.code === "WORKSPACE_ROOT_MISSING") return {
|
|
2442
|
+
status: "workspaceMissing",
|
|
2443
|
+
error: viewError
|
|
2444
|
+
};
|
|
2329
2445
|
if (viewError.code === "GIT_NOT_INSTALLED") return {
|
|
2330
2446
|
status: "gitNotInstalled",
|
|
2331
2447
|
error: viewError
|
|
@@ -2447,6 +2563,13 @@ window.__ModuleLoader__.load({
|
|
|
2447
2563
|
return sessionIds.filter((sessionId) => !archivedSessionIds.includes(sessionId));
|
|
2448
2564
|
}
|
|
2449
2565
|
//#endregion
|
|
2566
|
+
//#region lib/client/session/session-selection.js
|
|
2567
|
+
/** Prefer the legacy selected-id field; DSH 1.7 represents selection by mainView retention. */
|
|
2568
|
+
function currentSessionIdFromList(sessions) {
|
|
2569
|
+
if (sessions.current !== void 0) return sessions.current;
|
|
2570
|
+
return Object.keys(sessions.byId).find((sessionId) => (sessions.byId[sessionId]?.retainedBy?.mainView ?? 0) > 0);
|
|
2571
|
+
}
|
|
2572
|
+
//#endregion
|
|
2450
2573
|
//#region lib/client/session/session-view.js
|
|
2451
2574
|
function isPendingInteractionStatus(value) {
|
|
2452
2575
|
return value === "approval" || value === "plan-review" || value === "question";
|
|
@@ -2621,7 +2744,7 @@ window.__ModuleLoader__.load({
|
|
|
2621
2744
|
}
|
|
2622
2745
|
/** Native tree visibility: ordinary rows plus the currently selected blank row. */
|
|
2623
2746
|
function isVisibleSession(sessionId, sessions) {
|
|
2624
|
-
return !isBlankSession(sessionId, sessions) || sessions
|
|
2747
|
+
return !isBlankSession(sessionId, sessions) || currentSessionIdFromList(sessions) === sessionId;
|
|
2625
2748
|
}
|
|
2626
2749
|
/** Filter a group without mutating its source order. */
|
|
2627
2750
|
function filterVisibleSessionIds(sessionIds, sessions) {
|
|
@@ -2774,6 +2897,7 @@ window.__ModuleLoader__.load({
|
|
|
2774
2897
|
}
|
|
2775
2898
|
function worktreeSetupMessage(status, t) {
|
|
2776
2899
|
switch (status) {
|
|
2900
|
+
case "workspaceMissing": return t("worktree.setup.workspaceMissing");
|
|
2777
2901
|
case "gitNotInstalled": return t("worktree.setup.gitNotInstalled");
|
|
2778
2902
|
case "noRepository": return t("worktree.setup.noRepository");
|
|
2779
2903
|
case "noInitialCommit": return t("worktree.setup.noInitialCommit");
|
|
@@ -3607,7 +3731,7 @@ window.__ModuleLoader__.load({
|
|
|
3607
3731
|
//#endregion
|
|
3608
3732
|
//#region lib/client/view/navigation.js
|
|
3609
3733
|
/** Open an existing Session through DSH without touching the peer view mode. */
|
|
3610
|
-
function openWorktreeSession(opener, sessionId) {
|
|
3734
|
+
function openWorktreeSession$1(opener, sessionId) {
|
|
3611
3735
|
opener.open(sessionId);
|
|
3612
3736
|
}
|
|
3613
3737
|
//#endregion
|
|
@@ -3879,12 +4003,12 @@ window.__ModuleLoader__.load({
|
|
|
3879
4003
|
const workspaceMenuItems = [{
|
|
3880
4004
|
id: "rename",
|
|
3881
4005
|
label: t("workspace.rename"),
|
|
3882
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
4006
|
+
icon: (0, react_jsx_runtime.jsx)(IconEditOutline16, {}),
|
|
3883
4007
|
disabled: actionPending
|
|
3884
4008
|
}, {
|
|
3885
4009
|
id: "delete",
|
|
3886
4010
|
label: t("workspace.delete"),
|
|
3887
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
4011
|
+
icon: (0, react_jsx_runtime.jsx)(IconTrashOutline16, {}),
|
|
3888
4012
|
danger: true,
|
|
3889
4013
|
disabled: actionPending
|
|
3890
4014
|
}];
|
|
@@ -3893,6 +4017,7 @@ window.__ModuleLoader__.load({
|
|
|
3893
4017
|
const groupActivityLabel = groupActivityStatus === void 0 ? void 0 : sessionStatusLabel$1(t, groupActivityStatus);
|
|
3894
4018
|
return (0, react_jsx_runtime.jsxs)("div", {
|
|
3895
4019
|
className: `${worktree_css_default.workspaceRow} ${markerClass}`,
|
|
4020
|
+
"data-worktree-motion-key": `workspace:${workspace.workspaceId}`,
|
|
3896
4021
|
"data-workspace-drag": drag.active ? "active" : void 0,
|
|
3897
4022
|
"data-group-activity": groupActivityVisible ? "true" : void 0,
|
|
3898
4023
|
"data-menu-open": menuOpen || void 0,
|
|
@@ -3927,12 +4052,12 @@ window.__ModuleLoader__.load({
|
|
|
3927
4052
|
event.stopPropagation();
|
|
3928
4053
|
onToggle();
|
|
3929
4054
|
},
|
|
3930
|
-
children: expanded ? (0, react_jsx_runtime.jsx)(
|
|
4055
|
+
children: expanded ? (0, react_jsx_runtime.jsx)(IconChevronDownOutline14, { size: 18 }) : (0, react_jsx_runtime.jsx)(IconChevronRightOutline14, { size: 18 })
|
|
3931
4056
|
}),
|
|
3932
4057
|
(0, react_jsx_runtime.jsx)("span", {
|
|
3933
4058
|
className: worktree_css_default.workspaceIcon,
|
|
3934
4059
|
"aria-hidden": "true",
|
|
3935
|
-
children: expanded ? (0, react_jsx_runtime.jsx)(
|
|
4060
|
+
children: expanded ? (0, react_jsx_runtime.jsx)(IconFolderOpen16, {}) : (0, react_jsx_runtime.jsx)(IconFolderClose16, {})
|
|
3936
4061
|
}),
|
|
3937
4062
|
(0, react_jsx_runtime.jsx)("span", {
|
|
3938
4063
|
className: worktree_css_default.workspaceTitle,
|
|
@@ -3973,7 +4098,7 @@ window.__ModuleLoader__.load({
|
|
|
3973
4098
|
event.stopPropagation();
|
|
3974
4099
|
onMenuOpenChange(!menuOpen);
|
|
3975
4100
|
},
|
|
3976
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
4101
|
+
children: (0, react_jsx_runtime.jsx)(IconEllipsisOutline16, {})
|
|
3977
4102
|
})
|
|
3978
4103
|
})
|
|
3979
4104
|
}),
|
|
@@ -3986,7 +4111,7 @@ window.__ModuleLoader__.load({
|
|
|
3986
4111
|
event.stopPropagation();
|
|
3987
4112
|
onCreateWorktree();
|
|
3988
4113
|
},
|
|
3989
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
4114
|
+
children: (0, react_jsx_runtime.jsx)(IconPlusOutline16, {})
|
|
3990
4115
|
})
|
|
3991
4116
|
]
|
|
3992
4117
|
})
|
|
@@ -4070,6 +4195,7 @@ window.__ModuleLoader__.load({
|
|
|
4070
4195
|
};
|
|
4071
4196
|
const row = (0, react_jsx_runtime.jsxs)("div", {
|
|
4072
4197
|
className: `${worktree_css_default.worktreeRow} ${markerClass}`,
|
|
4198
|
+
"data-worktree-motion-key": `group:${kind}:${menu?.copyPath ?? ""}`,
|
|
4073
4199
|
"data-main-group": main ? "true" : void 0,
|
|
4074
4200
|
"data-main-expanded": main ? String(expanded) : void 0,
|
|
4075
4201
|
"data-group-activity": groupActivityVisible ? "true" : void 0,
|
|
@@ -4095,7 +4221,7 @@ window.__ModuleLoader__.load({
|
|
|
4095
4221
|
event.stopPropagation();
|
|
4096
4222
|
onToggle();
|
|
4097
4223
|
},
|
|
4098
|
-
children: expanded ? (0, react_jsx_runtime.jsx)(
|
|
4224
|
+
children: expanded ? (0, react_jsx_runtime.jsx)(IconChevronDownOutline14, { size: 18 }) : (0, react_jsx_runtime.jsx)(IconChevronRightOutline14, { size: 18 })
|
|
4099
4225
|
}),
|
|
4100
4226
|
(0, react_jsx_runtime.jsx)("span", {
|
|
4101
4227
|
className: worktree_css_default.worktreeIcon,
|
|
@@ -4153,19 +4279,19 @@ window.__ModuleLoader__.load({
|
|
|
4153
4279
|
...menu.showCreate ? [{
|
|
4154
4280
|
id: "create",
|
|
4155
4281
|
label: t("worktree.createNew"),
|
|
4156
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
4282
|
+
icon: (0, react_jsx_runtime.jsx)(IconPlusOutline16, {}),
|
|
4157
4283
|
disabled: menu.disabled || menu.onCreateWorktree === void 0
|
|
4158
4284
|
}] : [],
|
|
4159
4285
|
{
|
|
4160
4286
|
id: "copy-path",
|
|
4161
4287
|
label: t("worktree.copyPath"),
|
|
4162
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
4288
|
+
icon: (0, react_jsx_runtime.jsx)(IconCopyOutline16, {}),
|
|
4163
4289
|
disabled: menu.disabled
|
|
4164
4290
|
},
|
|
4165
4291
|
...menu.showRemove ? [{
|
|
4166
4292
|
id: "remove",
|
|
4167
4293
|
label: t("worktree.archive"),
|
|
4168
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
4294
|
+
icon: (0, react_jsx_runtime.jsx)(IconArchiveOutline20, { size: 16 }),
|
|
4169
4295
|
danger: true,
|
|
4170
4296
|
disabled: menu.disabled || menu.onRemove === void 0
|
|
4171
4297
|
}] : [],
|
|
@@ -4182,20 +4308,20 @@ window.__ModuleLoader__.load({
|
|
|
4182
4308
|
...menu.showUnarchive ? [{
|
|
4183
4309
|
id: "unarchive",
|
|
4184
4310
|
label: menu.unarchiveDisabledReason ? `${t("worktree.unarchive")} (${menu.unarchiveDisabledReason})` : t("worktree.unarchive"),
|
|
4185
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
4311
|
+
icon: (0, react_jsx_runtime.jsx)(IconRefreshOutline16, {}),
|
|
4186
4312
|
disabled: menu.disabled || menu.unarchiveDisabled || menu.onUnarchive === void 0
|
|
4187
4313
|
}] : [],
|
|
4188
4314
|
...menu.showCleanDisk ? [{
|
|
4189
4315
|
id: "clean-disk",
|
|
4190
4316
|
label: menu.cleanDiskDisabledReason ? `${t("worktree.cleanDisk")} (${menu.cleanDiskDisabledReason})` : t("worktree.cleanDisk"),
|
|
4191
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
4317
|
+
icon: (0, react_jsx_runtime.jsx)(IconTrashOutline16, {}),
|
|
4192
4318
|
danger: true,
|
|
4193
4319
|
disabled: menu.disabled || menu.cleanDiskDisabled || menu.onCleanDisk === void 0
|
|
4194
4320
|
}] : [],
|
|
4195
4321
|
...menu.showForget ? [{
|
|
4196
4322
|
id: "forget",
|
|
4197
4323
|
label: menu.forgetDisabledReason ? `${t("worktree.forget")} (${menu.forgetDisabledReason})` : t("worktree.forget"),
|
|
4198
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
4324
|
+
icon: (0, react_jsx_runtime.jsx)(IconTrashOutline16, {}),
|
|
4199
4325
|
danger: true,
|
|
4200
4326
|
disabled: menu.disabled || menu.forgetDisabled || menu.onForget === void 0
|
|
4201
4327
|
}] : []
|
|
@@ -4223,7 +4349,7 @@ window.__ModuleLoader__.load({
|
|
|
4223
4349
|
event.stopPropagation();
|
|
4224
4350
|
menu.onOpenChange(!menu.open);
|
|
4225
4351
|
},
|
|
4226
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
4352
|
+
children: (0, react_jsx_runtime.jsx)(IconEllipsisOutline16, {})
|
|
4227
4353
|
})
|
|
4228
4354
|
})
|
|
4229
4355
|
}),
|
|
@@ -4237,7 +4363,7 @@ window.__ModuleLoader__.load({
|
|
|
4237
4363
|
event.stopPropagation();
|
|
4238
4364
|
onCreateSession();
|
|
4239
4365
|
},
|
|
4240
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
4366
|
+
children: (0, react_jsx_runtime.jsx)(IconPlusOutline16, {})
|
|
4241
4367
|
})
|
|
4242
4368
|
]
|
|
4243
4369
|
})
|
|
@@ -4280,25 +4406,25 @@ window.__ModuleLoader__.load({
|
|
|
4280
4406
|
{
|
|
4281
4407
|
id: "rename",
|
|
4282
4408
|
label: t("session.rename"),
|
|
4283
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
4409
|
+
icon: (0, react_jsx_runtime.jsx)(IconEditOutline16, {}),
|
|
4284
4410
|
disabled: onRename === void 0 || actionPending
|
|
4285
4411
|
},
|
|
4286
4412
|
{
|
|
4287
4413
|
id: "fork",
|
|
4288
4414
|
label: t("session.fork"),
|
|
4289
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
4415
|
+
icon: (0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
|
|
4290
4416
|
disabled: onFork === void 0 || actionPending
|
|
4291
4417
|
},
|
|
4292
4418
|
{
|
|
4293
4419
|
id: "archive",
|
|
4294
4420
|
label: t("session.archive"),
|
|
4295
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
4421
|
+
icon: (0, react_jsx_runtime.jsx)(IconArchiveOutline20, { size: 16 }),
|
|
4296
4422
|
disabled: onArchive === void 0 || actionPending
|
|
4297
4423
|
},
|
|
4298
4424
|
{
|
|
4299
4425
|
id: "copy-session-id",
|
|
4300
4426
|
label: t("session.copyId"),
|
|
4301
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
4427
|
+
icon: (0, react_jsx_runtime.jsx)(IconCopyOutline16, {})
|
|
4302
4428
|
}
|
|
4303
4429
|
];
|
|
4304
4430
|
const statusLabel = presentation === void 0 ? void 0 : sessionStatusLabel$1(t, presentation.status);
|
|
@@ -4309,6 +4435,7 @@ window.__ModuleLoader__.load({
|
|
|
4309
4435
|
anchor: (0, react_jsx_runtime.jsxs)("div", {
|
|
4310
4436
|
className: `${worktree_css_default.treeSessionRow} ${markerClass}`,
|
|
4311
4437
|
"data-session-id": sessionId,
|
|
4438
|
+
"data-worktree-motion-key": `session:${sessionId}`,
|
|
4312
4439
|
"data-session-blank": blank ? "true" : void 0,
|
|
4313
4440
|
"data-session-current": current ? "true" : void 0,
|
|
4314
4441
|
"data-session-drag": drag.active ? "active" : void 0,
|
|
@@ -4383,7 +4510,7 @@ window.__ModuleLoader__.load({
|
|
|
4383
4510
|
event.stopPropagation();
|
|
4384
4511
|
setMenuOpen((current) => !current);
|
|
4385
4512
|
},
|
|
4386
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
4513
|
+
children: (0, react_jsx_runtime.jsx)(IconEllipsisOutline16, {})
|
|
4387
4514
|
})
|
|
4388
4515
|
})
|
|
4389
4516
|
})]
|
|
@@ -4487,7 +4614,7 @@ window.__ModuleLoader__.load({
|
|
|
4487
4614
|
worktreeId: record.worktreeId,
|
|
4488
4615
|
expanded: worktreeExpanded,
|
|
4489
4616
|
groupActivityStatus: aggregateSessionStatus(worktreeSessionIds, sessionPresentations),
|
|
4490
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
4617
|
+
icon: (0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
|
|
4491
4618
|
workspaceTitle: workspace.title,
|
|
4492
4619
|
state,
|
|
4493
4620
|
stateLabel,
|
|
@@ -4651,7 +4778,7 @@ window.__ModuleLoader__.load({
|
|
|
4651
4778
|
worktreeId: record.worktreeId,
|
|
4652
4779
|
expanded: worktreeExpanded,
|
|
4653
4780
|
groupActivityStatus: aggregateSessionStatus(worktreeSessionIds, sessionPresentations),
|
|
4654
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
4781
|
+
icon: (0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
|
|
4655
4782
|
workspaceTitle: workspace.title,
|
|
4656
4783
|
state,
|
|
4657
4784
|
stateLabel,
|
|
@@ -4797,7 +4924,7 @@ window.__ModuleLoader__.load({
|
|
|
4797
4924
|
label: `${t("worktree.archivedGroup")} (${archivedWorktrees.length})`,
|
|
4798
4925
|
expanded: isArchivedExpanded,
|
|
4799
4926
|
groupActivityStatus: aggregateSessionStatus(filterArchivedSessionIds(archivedWorktrees.flatMap((record) => bindingIdsFor(bindings, record.worktreeId).filter((sessionId) => sessions.ids.includes(sessionId))), archivedSessionIds), sessionPresentations),
|
|
4800
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
4927
|
+
icon: (0, react_jsx_runtime.jsx)(IconArchiveOutline20, { size: 16 }),
|
|
4801
4928
|
workspaceTitle: workspace.title,
|
|
4802
4929
|
onToggle: () => {
|
|
4803
4930
|
toggleArchivedWorkspace(workspace.workspaceId);
|
|
@@ -4826,6 +4953,145 @@ window.__ModuleLoader__.load({
|
|
|
4826
4953
|
});
|
|
4827
4954
|
}
|
|
4828
4955
|
//#endregion
|
|
4956
|
+
//#region lib/client/surface/components/AnimatedTree.js
|
|
4957
|
+
/** Plugin-owned equivalent of native keyed-row fades and movement, without importing DSH internals. */
|
|
4958
|
+
var AnimatedTree = class extends react.Component {
|
|
4959
|
+
armed = false;
|
|
4960
|
+
list = (0, react.createRef)();
|
|
4961
|
+
exits = (0, react.createRef)();
|
|
4962
|
+
movements = /* @__PURE__ */ new Map();
|
|
4963
|
+
removed = /* @__PURE__ */ new Map();
|
|
4964
|
+
getSnapshotBeforeUpdate(previous) {
|
|
4965
|
+
if (!this.armed || !previous.ready || !this.props.ready || previous.resetKey !== this.props.resetKey || !this.list.current || typeof this.list.current.animate !== "function" || window.matchMedia("(prefers-reduced-motion: reduce)").matches) return null;
|
|
4966
|
+
return this.positions();
|
|
4967
|
+
}
|
|
4968
|
+
componentDidUpdate(_previous, _state, snapshot) {
|
|
4969
|
+
if (!snapshot) {
|
|
4970
|
+
this.clear();
|
|
4971
|
+
return;
|
|
4972
|
+
}
|
|
4973
|
+
const next = this.positions();
|
|
4974
|
+
const keys = [...snapshot.keys()];
|
|
4975
|
+
const nextKeys = [...next.keys()];
|
|
4976
|
+
if (keys.length === next.size && keys.every((key, index) => key === nextKeys[index])) return;
|
|
4977
|
+
this.cancelMovements();
|
|
4978
|
+
const list = this.list.current;
|
|
4979
|
+
const viewport = (list.closest("[data-worktree-scrollport]") ?? list).getBoundingClientRect();
|
|
4980
|
+
const visible = (rect) => rect.bottom > viewport.top && rect.top < viewport.bottom;
|
|
4981
|
+
for (const [key, row] of next) {
|
|
4982
|
+
this.removeExit(key);
|
|
4983
|
+
const old = snapshot.get(key);
|
|
4984
|
+
if (!visible(row.rect) && (!old || !visible(old.rect))) continue;
|
|
4985
|
+
if (!old) {
|
|
4986
|
+
this.move(row.element, [{ opacity: 0 }, { opacity: 1 }], 100);
|
|
4987
|
+
continue;
|
|
4988
|
+
}
|
|
4989
|
+
const dx = old.rect.left - row.rect.left;
|
|
4990
|
+
const dy = old.rect.top - row.rect.top;
|
|
4991
|
+
if (dx === 0 && dy === 0 && old.opacity === 1) continue;
|
|
4992
|
+
this.move(row.element, [{
|
|
4993
|
+
transform: `translate(${dx}px, ${dy}px)`,
|
|
4994
|
+
opacity: old.opacity
|
|
4995
|
+
}, {
|
|
4996
|
+
transform: "translate(0, 0)",
|
|
4997
|
+
opacity: 1
|
|
4998
|
+
}], 200);
|
|
4999
|
+
}
|
|
5000
|
+
const overlay = this.exits.current;
|
|
5001
|
+
const origin = overlay.getBoundingClientRect();
|
|
5002
|
+
for (const [key, row] of snapshot) {
|
|
5003
|
+
if (next.has(key) || !visible(row.rect)) continue;
|
|
5004
|
+
this.removeExit(key);
|
|
5005
|
+
const clone = row.element.cloneNode(true);
|
|
5006
|
+
clone.removeAttribute("data-worktree-motion-key");
|
|
5007
|
+
clone.removeAttribute("id");
|
|
5008
|
+
clone.inert = true;
|
|
5009
|
+
Object.assign(clone.style, {
|
|
5010
|
+
position: "absolute",
|
|
5011
|
+
margin: "0",
|
|
5012
|
+
transform: "none",
|
|
5013
|
+
boxSizing: "border-box",
|
|
5014
|
+
left: `${row.rect.left - origin.left}px`,
|
|
5015
|
+
top: `${row.rect.top - origin.top}px`,
|
|
5016
|
+
width: `${row.rect.width}px`,
|
|
5017
|
+
height: `${row.rect.height}px`
|
|
5018
|
+
});
|
|
5019
|
+
overlay.append(clone);
|
|
5020
|
+
const animation = clone.animate([{ opacity: row.opacity }, { opacity: 0 }], {
|
|
5021
|
+
duration: 100,
|
|
5022
|
+
easing: "ease-out",
|
|
5023
|
+
fill: "forwards"
|
|
5024
|
+
});
|
|
5025
|
+
this.removed.set(key, {
|
|
5026
|
+
element: clone,
|
|
5027
|
+
animation
|
|
5028
|
+
});
|
|
5029
|
+
animation.onfinish = () => this.removeExit(key);
|
|
5030
|
+
}
|
|
5031
|
+
}
|
|
5032
|
+
componentWillUnmount() {
|
|
5033
|
+
this.clear();
|
|
5034
|
+
}
|
|
5035
|
+
positions() {
|
|
5036
|
+
const rows = this.list.current.querySelectorAll("[data-worktree-motion-key]");
|
|
5037
|
+
return new Map(Array.from(rows, (element) => {
|
|
5038
|
+
const workspace = element.closest("[data-workspace-id]")?.dataset.workspaceId ?? "";
|
|
5039
|
+
return [JSON.stringify([workspace, element.dataset.worktreeMotionKey]), {
|
|
5040
|
+
element,
|
|
5041
|
+
rect: element.getBoundingClientRect(),
|
|
5042
|
+
opacity: this.movements.has(element) ? Number(getComputedStyle(element).opacity) : 1
|
|
5043
|
+
}];
|
|
5044
|
+
}));
|
|
5045
|
+
}
|
|
5046
|
+
move(element, frames, duration) {
|
|
5047
|
+
const animation = element.animate(frames, {
|
|
5048
|
+
duration,
|
|
5049
|
+
easing: "ease-out"
|
|
5050
|
+
});
|
|
5051
|
+
this.movements.set(element, animation);
|
|
5052
|
+
animation.onfinish = () => {
|
|
5053
|
+
this.movements.delete(element);
|
|
5054
|
+
animation.cancel();
|
|
5055
|
+
};
|
|
5056
|
+
}
|
|
5057
|
+
cancelMovements() {
|
|
5058
|
+
for (const animation of this.movements.values()) {
|
|
5059
|
+
animation.onfinish = null;
|
|
5060
|
+
animation.cancel();
|
|
5061
|
+
}
|
|
5062
|
+
this.movements.clear();
|
|
5063
|
+
}
|
|
5064
|
+
removeExit(key) {
|
|
5065
|
+
const exit = this.removed.get(key);
|
|
5066
|
+
if (!exit) return;
|
|
5067
|
+
exit.animation.onfinish = null;
|
|
5068
|
+
exit.animation.cancel();
|
|
5069
|
+
exit.element.remove();
|
|
5070
|
+
this.removed.delete(key);
|
|
5071
|
+
}
|
|
5072
|
+
clear() {
|
|
5073
|
+
this.cancelMovements();
|
|
5074
|
+
for (const key of this.removed.keys()) this.removeExit(key);
|
|
5075
|
+
}
|
|
5076
|
+
render() {
|
|
5077
|
+
return (0, react_jsx_runtime.jsxs)("div", {
|
|
5078
|
+
ref: this.list,
|
|
5079
|
+
className: this.props.className,
|
|
5080
|
+
onPointerDownCapture: () => {
|
|
5081
|
+
this.armed = true;
|
|
5082
|
+
},
|
|
5083
|
+
onKeyDownCapture: () => {
|
|
5084
|
+
this.armed = true;
|
|
5085
|
+
},
|
|
5086
|
+
children: [this.props.children, (0, react_jsx_runtime.jsx)("div", {
|
|
5087
|
+
ref: this.exits,
|
|
5088
|
+
className: worktree_css_default.motionExits,
|
|
5089
|
+
"aria-hidden": "true"
|
|
5090
|
+
})]
|
|
5091
|
+
});
|
|
5092
|
+
}
|
|
5093
|
+
};
|
|
5094
|
+
//#endregion
|
|
4829
5095
|
//#region lib/client/surface/components/WorkspaceTree.js
|
|
4830
5096
|
function WorkspaceTree({ props, read, source, expansion, ordering, drag, mutation, menus, registration, native, lifecycle, session, lifecycleState }) {
|
|
4831
5097
|
const { t, createMainSession, openSession, renameSession, forkSession, archiveSession } = props;
|
|
@@ -4839,8 +5105,10 @@ window.__ModuleLoader__.load({
|
|
|
4839
5105
|
const { openWorktreeCreator } = registration;
|
|
4840
5106
|
const { openWorkspaceRename, openWorkspaceDelete, openSessionRename, archiveWorktreeSession } = native;
|
|
4841
5107
|
const visibleWorkspaces = workspaces.items.filter((workspace) => workspaceMatches(workspace, viewByWorkspace.get(workspace.workspaceId), sessions, query));
|
|
4842
|
-
return (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: (0, react_jsx_runtime.jsx)(
|
|
5108
|
+
return (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: (0, react_jsx_runtime.jsx)(AnimatedTree, {
|
|
4843
5109
|
className: worktree_css_default.workspaceList,
|
|
5110
|
+
ready: sessions.phase !== "pending" && workspaceDrag === void 0 && worktreeDrag === void 0 && sessionDrag === void 0,
|
|
5111
|
+
resetKey: query,
|
|
4844
5112
|
children: visibleWorkspaces.length === 0 ? (0, react_jsx_runtime.jsx)("p", {
|
|
4845
5113
|
className: worktree_css_default.empty,
|
|
4846
5114
|
children: t("workspace.noMatches")
|
|
@@ -4933,7 +5201,7 @@ window.__ModuleLoader__.load({
|
|
|
4933
5201
|
label: mainLabel,
|
|
4934
5202
|
expanded: mainExpanded,
|
|
4935
5203
|
groupActivityStatus: aggregateSessionStatus(mainSessionIds, sessionPresentations),
|
|
4936
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
5204
|
+
icon: (0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
|
|
4937
5205
|
workspaceTitle: workspace.title,
|
|
4938
5206
|
onToggle: () => {
|
|
4939
5207
|
toggleMain(workspace.workspaceId);
|
|
@@ -5000,7 +5268,7 @@ window.__ModuleLoader__.load({
|
|
|
5000
5268
|
},
|
|
5001
5269
|
onCommitDrag: commitSessionDrag,
|
|
5002
5270
|
onOpen: (sessionId) => {
|
|
5003
|
-
openWorktreeSession({ open: openSession }, sessionId);
|
|
5271
|
+
openWorktreeSession$1({ open: openSession }, sessionId);
|
|
5004
5272
|
},
|
|
5005
5273
|
onRename: renameSession === void 0 ? void 0 : openSessionRename,
|
|
5006
5274
|
onFork: forkSession,
|
|
@@ -5123,6 +5391,7 @@ window.__ModuleLoader__.load({
|
|
|
5123
5391
|
ref: expansion.contentRef,
|
|
5124
5392
|
className: worktree_css_default.content,
|
|
5125
5393
|
tabIndex: 0,
|
|
5394
|
+
"data-worktree-scrollport": true,
|
|
5126
5395
|
children: [
|
|
5127
5396
|
(0, react_jsx_runtime.jsx)(NotificationToasts, {
|
|
5128
5397
|
notices,
|
|
@@ -5346,7 +5615,7 @@ window.__ModuleLoader__.load({
|
|
|
5346
5615
|
setSearchExpanded(true);
|
|
5347
5616
|
searchInput.current?.focus();
|
|
5348
5617
|
},
|
|
5349
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
5618
|
+
children: (0, react_jsx_runtime.jsx)(IconSearchOutline16, { size: searchExpanded ? 12 : 14 })
|
|
5350
5619
|
})
|
|
5351
5620
|
}),
|
|
5352
5621
|
(0, react_jsx_runtime.jsx)("input", {
|
|
@@ -5376,7 +5645,7 @@ window.__ModuleLoader__.load({
|
|
|
5376
5645
|
setSearchQuery("");
|
|
5377
5646
|
setSearchExpanded(false);
|
|
5378
5647
|
},
|
|
5379
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
5648
|
+
children: (0, react_jsx_runtime.jsx)(IconCloseFill14, {})
|
|
5380
5649
|
})
|
|
5381
5650
|
]
|
|
5382
5651
|
})
|
|
@@ -5412,7 +5681,7 @@ window.__ModuleLoader__.load({
|
|
|
5412
5681
|
onClick: () => {
|
|
5413
5682
|
if (createWorkspace !== void 0) runMutation(createWorkspace);
|
|
5414
5683
|
},
|
|
5415
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
5684
|
+
children: (0, react_jsx_runtime.jsx)(IconProjectAddOutline16, {})
|
|
5416
5685
|
})
|
|
5417
5686
|
}),
|
|
5418
5687
|
(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
|
|
@@ -5426,7 +5695,7 @@ window.__ModuleLoader__.load({
|
|
|
5426
5695
|
onClick: () => {
|
|
5427
5696
|
actions.setViewMode("workspace-session");
|
|
5428
5697
|
},
|
|
5429
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
5698
|
+
children: (0, react_jsx_runtime.jsx)(IconCloseOutline16, {})
|
|
5430
5699
|
})
|
|
5431
5700
|
})
|
|
5432
5701
|
]
|
|
@@ -6528,7 +6797,7 @@ window.__ModuleLoader__.load({
|
|
|
6528
6797
|
};
|
|
6529
6798
|
const openWorkspaceSession = (workspaceId, sessionId) => {
|
|
6530
6799
|
ensureSessionWorkspace?.(workspaceId, sessionId);
|
|
6531
|
-
openWorktreeSession({ open: openSession }, sessionId);
|
|
6800
|
+
openWorktreeSession$1({ open: openSession }, sessionId);
|
|
6532
6801
|
};
|
|
6533
6802
|
return {
|
|
6534
6803
|
pendingSessionBinding,
|
|
@@ -7151,6 +7420,156 @@ window.__ModuleLoader__.load({
|
|
|
7151
7420
|
};
|
|
7152
7421
|
}
|
|
7153
7422
|
//#endregion
|
|
7423
|
+
//#region lib/client/dashboard/dashboard-overlay.js
|
|
7424
|
+
const SIDEBAR_RESIZE_HANDLE_HALF_WIDTH = 4;
|
|
7425
|
+
/** Reversible presentation only: leave the native React tree and Session alive. */
|
|
7426
|
+
function concealDashboardBackground(element) {
|
|
7427
|
+
const visibility = element.style.getPropertyValue("visibility");
|
|
7428
|
+
const priority = element.style.getPropertyPriority("visibility");
|
|
7429
|
+
const inert = element.getAttribute("inert");
|
|
7430
|
+
const hidden = element.getAttribute("aria-hidden");
|
|
7431
|
+
element.style.setProperty("visibility", "hidden");
|
|
7432
|
+
element.setAttribute("inert", "");
|
|
7433
|
+
element.setAttribute("aria-hidden", "true");
|
|
7434
|
+
return () => {
|
|
7435
|
+
if (element.style.getPropertyValue("visibility") === "hidden") if (visibility) element.style.setProperty("visibility", visibility, priority);
|
|
7436
|
+
else element.style.removeProperty("visibility");
|
|
7437
|
+
for (const [name, value] of [["inert", inert], ["aria-hidden", hidden]]) if (value === null) element.removeAttribute(name);
|
|
7438
|
+
else element.setAttribute(name, value);
|
|
7439
|
+
};
|
|
7440
|
+
}
|
|
7441
|
+
function isRightSidebarOpenFromDom(frame, rightbar) {
|
|
7442
|
+
if (typeof frame.querySelector === "function") {
|
|
7443
|
+
if (frame.querySelector("[data-sidebar-right-open]") !== null) return true;
|
|
7444
|
+
if (frame.hasAttribute("data-rightbar-collapsed")) return false;
|
|
7445
|
+
}
|
|
7446
|
+
if (frame.getAttribute?.("data-rightbar-collapsed") !== null) return false;
|
|
7447
|
+
if (rightbar instanceof HTMLElement) {
|
|
7448
|
+
if (rightbar.getAttribute?.("data-sidebar-right-open") !== null) return true;
|
|
7449
|
+
}
|
|
7450
|
+
return false;
|
|
7451
|
+
}
|
|
7452
|
+
/** Layout seam shared with the existing Sidebar overlay; fail closed on frame/center loss. */
|
|
7453
|
+
function mountDashboardOverlay(surface, onPlacement, options) {
|
|
7454
|
+
const overlay = surface.closest("[data-shell-overlay]");
|
|
7455
|
+
const frame = overlay?.parentElement;
|
|
7456
|
+
if (!overlay || !frame) {
|
|
7457
|
+
onPlacement(void 0);
|
|
7458
|
+
options?.onRightSidebarChange?.(false);
|
|
7459
|
+
return () => {};
|
|
7460
|
+
}
|
|
7461
|
+
const hidden = /* @__PURE__ */ new Map();
|
|
7462
|
+
let observed = [];
|
|
7463
|
+
let scheduled;
|
|
7464
|
+
let disposed = false;
|
|
7465
|
+
let lastRightSidebarOpen;
|
|
7466
|
+
const restore = () => {
|
|
7467
|
+
for (const cleanup of hidden.values()) cleanup();
|
|
7468
|
+
hidden.clear();
|
|
7469
|
+
};
|
|
7470
|
+
const schedule = () => {
|
|
7471
|
+
if (disposed || scheduled !== void 0) return;
|
|
7472
|
+
scheduled = requestAnimationFrame(() => {
|
|
7473
|
+
scheduled = void 0;
|
|
7474
|
+
update();
|
|
7475
|
+
});
|
|
7476
|
+
};
|
|
7477
|
+
const resize = typeof ResizeObserver === "undefined" ? void 0 : new ResizeObserver(schedule);
|
|
7478
|
+
const update = () => {
|
|
7479
|
+
if (disposed) return;
|
|
7480
|
+
const sidebar = frame.firstElementChild;
|
|
7481
|
+
const center = sidebar?.nextElementSibling;
|
|
7482
|
+
const rightbar = center?.nextElementSibling;
|
|
7483
|
+
const hasRightbar = rightbar instanceof HTMLElement && rightbar !== overlay && rightbar.nextElementSibling === overlay;
|
|
7484
|
+
const hasNoRightbar = rightbar === overlay;
|
|
7485
|
+
const valid = overlay.isConnected && overlay.parentElement === frame && sidebar instanceof HTMLElement && center instanceof HTMLElement && (hasRightbar || hasNoRightbar);
|
|
7486
|
+
const nextObserved = valid ? hasRightbar ? [
|
|
7487
|
+
overlay,
|
|
7488
|
+
sidebar,
|
|
7489
|
+
center,
|
|
7490
|
+
rightbar
|
|
7491
|
+
] : [
|
|
7492
|
+
overlay,
|
|
7493
|
+
sidebar,
|
|
7494
|
+
center
|
|
7495
|
+
] : [frame];
|
|
7496
|
+
for (const old of observed) if (!nextObserved.includes(old)) resize?.unobserve(old);
|
|
7497
|
+
for (const next of nextObserved) if (!observed.includes(next)) resize?.observe(next);
|
|
7498
|
+
observed = nextObserved;
|
|
7499
|
+
if (!valid) {
|
|
7500
|
+
restore();
|
|
7501
|
+
onPlacement(void 0);
|
|
7502
|
+
if (lastRightSidebarOpen) {
|
|
7503
|
+
lastRightSidebarOpen = false;
|
|
7504
|
+
options?.onRightSidebarChange?.(false);
|
|
7505
|
+
}
|
|
7506
|
+
return;
|
|
7507
|
+
}
|
|
7508
|
+
const box = overlay.getBoundingClientRect();
|
|
7509
|
+
const boundary = sidebar.getBoundingClientRect();
|
|
7510
|
+
const rightBoundary = hasRightbar && rightbar instanceof HTMLElement ? rightbar.getBoundingClientRect().left : box.right;
|
|
7511
|
+
const left = Math.max(0, boundary.right - box.left + SIDEBAR_RESIZE_HANDLE_HALF_WIDTH);
|
|
7512
|
+
const width = Math.min(box.right, rightBoundary) - box.left - left;
|
|
7513
|
+
if (width <= 0 || box.height <= 0) {
|
|
7514
|
+
restore();
|
|
7515
|
+
onPlacement(void 0);
|
|
7516
|
+
return;
|
|
7517
|
+
}
|
|
7518
|
+
for (const [element, cleanup] of hidden) if (element !== center) {
|
|
7519
|
+
cleanup();
|
|
7520
|
+
hidden.delete(element);
|
|
7521
|
+
}
|
|
7522
|
+
if (!hidden.has(center)) hidden.set(center, concealDashboardBackground(center));
|
|
7523
|
+
const top = Math.max(0, (center.getBoundingClientRect().top ?? 0) - (box.top ?? 0));
|
|
7524
|
+
if (top >= box.height) {
|
|
7525
|
+
restore();
|
|
7526
|
+
onPlacement(void 0);
|
|
7527
|
+
return;
|
|
7528
|
+
}
|
|
7529
|
+
onPlacement({
|
|
7530
|
+
left,
|
|
7531
|
+
top,
|
|
7532
|
+
width,
|
|
7533
|
+
height: box.height - top
|
|
7534
|
+
});
|
|
7535
|
+
const isRightSidebarOpen = options?.isRightSidebarExpanded !== void 0 ? options.isRightSidebarExpanded() : isRightSidebarOpenFromDom(frame, hasRightbar ? rightbar : void 0);
|
|
7536
|
+
if (lastRightSidebarOpen !== isRightSidebarOpen) {
|
|
7537
|
+
lastRightSidebarOpen = isRightSidebarOpen;
|
|
7538
|
+
options?.onRightSidebarChange?.(isRightSidebarOpen);
|
|
7539
|
+
}
|
|
7540
|
+
};
|
|
7541
|
+
const mutation = typeof MutationObserver === "undefined" ? void 0 : new MutationObserver(schedule);
|
|
7542
|
+
try {
|
|
7543
|
+
mutation?.observe(frame, {
|
|
7544
|
+
childList: true,
|
|
7545
|
+
attributes: true,
|
|
7546
|
+
subtree: true,
|
|
7547
|
+
attributeFilter: [
|
|
7548
|
+
"data-rightbar-collapsed",
|
|
7549
|
+
"data-sidebar-right-open",
|
|
7550
|
+
"data-sidebar-right-panel"
|
|
7551
|
+
]
|
|
7552
|
+
});
|
|
7553
|
+
} catch {
|
|
7554
|
+
mutation?.observe(frame, { childList: true });
|
|
7555
|
+
}
|
|
7556
|
+
if (frame.parentElement) try {
|
|
7557
|
+
mutation?.observe(frame.parentElement, { childList: true });
|
|
7558
|
+
} catch {}
|
|
7559
|
+
update();
|
|
7560
|
+
return () => {
|
|
7561
|
+
disposed = true;
|
|
7562
|
+
resize?.disconnect();
|
|
7563
|
+
mutation?.disconnect();
|
|
7564
|
+
if (scheduled !== void 0) cancelAnimationFrame(scheduled);
|
|
7565
|
+
restore();
|
|
7566
|
+
if (lastRightSidebarOpen) {
|
|
7567
|
+
lastRightSidebarOpen = false;
|
|
7568
|
+
options?.onRightSidebarChange?.(false);
|
|
7569
|
+
}
|
|
7570
|
+
};
|
|
7571
|
+
}
|
|
7572
|
+
//#endregion
|
|
7154
7573
|
//#region lib/client/overlay/sidebar-overlay-geometry.js
|
|
7155
7574
|
const EMPTY_BOUNDS = {
|
|
7156
7575
|
ready: false,
|
|
@@ -7185,7 +7604,14 @@ window.__ModuleLoader__.load({
|
|
|
7185
7604
|
"新会话",
|
|
7186
7605
|
"New Session"
|
|
7187
7606
|
];
|
|
7188
|
-
const buttons = Array.from(root.querySelectorAll("button"))
|
|
7607
|
+
const buttons = Array.from(root.querySelectorAll("button")).filter((button) => {
|
|
7608
|
+
let parent = button.parentElement;
|
|
7609
|
+
while (parent && parent !== root) {
|
|
7610
|
+
if (parent.hasAttribute("data-window-drag")) return false;
|
|
7611
|
+
parent = parent.parentElement;
|
|
7612
|
+
}
|
|
7613
|
+
return true;
|
|
7614
|
+
});
|
|
7189
7615
|
const visibleLabel = buttons.find((button) => {
|
|
7190
7616
|
const text = button.textContent?.trim();
|
|
7191
7617
|
return text === "新会话" || text === "New Session";
|
|
@@ -7196,17 +7622,43 @@ window.__ModuleLoader__.load({
|
|
|
7196
7622
|
if (button !== void 0) return button;
|
|
7197
7623
|
}
|
|
7198
7624
|
}
|
|
7625
|
+
/** Hide only the native content covered by the plugin, keeping chrome and footer alive. */
|
|
7626
|
+
function coveredSidebarChildren(root, newSession, footer) {
|
|
7627
|
+
if (!newSession || !footer) return [];
|
|
7628
|
+
let first = newSession;
|
|
7629
|
+
while (first.parentElement && first.parentElement !== root) first = first.parentElement;
|
|
7630
|
+
const children = Array.from(root.children ?? []);
|
|
7631
|
+
const start = children.indexOf(first);
|
|
7632
|
+
const end = children.indexOf(footer);
|
|
7633
|
+
if (start < 0 || end <= start) return [];
|
|
7634
|
+
return children.slice(start, end).filter((element) => element instanceof HTMLElement);
|
|
7635
|
+
}
|
|
7636
|
+
function concealSidebarContent(element) {
|
|
7637
|
+
const restore = concealDashboardBackground(element);
|
|
7638
|
+
const opacity = element.style.getPropertyValue("opacity");
|
|
7639
|
+
const priority = element.style.getPropertyPriority("opacity");
|
|
7640
|
+
element.style.setProperty("opacity", "0");
|
|
7641
|
+
return () => {
|
|
7642
|
+
restore();
|
|
7643
|
+
if (element.style.getPropertyValue("opacity") !== "0") return;
|
|
7644
|
+
if (opacity) element.style.setProperty("opacity", opacity, priority);
|
|
7645
|
+
else element.style.removeProperty("opacity");
|
|
7646
|
+
};
|
|
7647
|
+
}
|
|
7199
7648
|
function useSidebarOverlayGeometry(active) {
|
|
7200
7649
|
const ref = (0, react.useRef)(null);
|
|
7201
7650
|
const [width, setWidth] = (0, react.useState)(280);
|
|
7202
7651
|
const [bounds, setBounds] = (0, react.useState)(EMPTY_BOUNDS);
|
|
7652
|
+
const [collapsed, setCollapsed] = (0, react.useState)(false);
|
|
7653
|
+
const [nativeCovered, setNativeCovered] = (0, react.useState)(false);
|
|
7203
7654
|
(0, react.useLayoutEffect)(() => {
|
|
7204
7655
|
if (!active) {
|
|
7205
7656
|
setBounds(EMPTY_BOUNDS);
|
|
7206
7657
|
return;
|
|
7207
7658
|
}
|
|
7208
7659
|
const overlay = ref.current?.closest("[data-shell-overlay]");
|
|
7209
|
-
const
|
|
7660
|
+
const frame = overlay?.parentElement;
|
|
7661
|
+
const sidebar = frame?.firstElementChild;
|
|
7210
7662
|
const nativeRoot = sidebar === null || sidebar === void 0 ? void 0 : resolveNativeSidebarRoot(sidebar);
|
|
7211
7663
|
if (!(overlay instanceof HTMLElement) || !(sidebar instanceof HTMLElement) || !(nativeRoot instanceof HTMLElement)) {
|
|
7212
7664
|
setBounds(EMPTY_BOUNDS);
|
|
@@ -7218,14 +7670,38 @@ window.__ModuleLoader__.load({
|
|
|
7218
7670
|
let frameHandle;
|
|
7219
7671
|
let observedNewSession;
|
|
7220
7672
|
let observedFooter;
|
|
7673
|
+
let observedRoot;
|
|
7674
|
+
const hidden = /* @__PURE__ */ new Map();
|
|
7675
|
+
function restore() {
|
|
7676
|
+
for (const cleanup of hidden.values()) cleanup();
|
|
7677
|
+
hidden.clear();
|
|
7678
|
+
}
|
|
7221
7679
|
function update() {
|
|
7222
|
-
const
|
|
7223
|
-
|
|
7680
|
+
const currentRoot = resolveNativeSidebarRoot(sidebarElement);
|
|
7681
|
+
if (!(currentRoot instanceof HTMLElement) || overlayElement.isConnected === false || frame?.firstElementChild !== sidebarElement) {
|
|
7682
|
+
restore();
|
|
7683
|
+
setNativeCovered(false);
|
|
7684
|
+
setBounds(EMPTY_BOUNDS);
|
|
7685
|
+
return;
|
|
7686
|
+
}
|
|
7687
|
+
observedRoot = syncObservedElement(resizeObserver, observedRoot, currentRoot);
|
|
7688
|
+
const newSession = findNewSessionAnchor(currentRoot);
|
|
7689
|
+
const footer = currentRoot.lastElementChild;
|
|
7224
7690
|
observedNewSession = syncObservedElement(resizeObserver, observedNewSession, newSession);
|
|
7225
7691
|
observedFooter = syncObservedElement(resizeObserver, observedFooter, footer);
|
|
7226
7692
|
const nextWidth = sidebarElement.getBoundingClientRect().width;
|
|
7227
|
-
|
|
7228
|
-
|
|
7693
|
+
setWidth(Math.max(0, nextWidth));
|
|
7694
|
+
const nextCollapsed = frame?.hasAttribute("data-sidebar-collapsed") === true || nextWidth <= 64;
|
|
7695
|
+
setCollapsed(nextCollapsed);
|
|
7696
|
+
const nextBounds = computeOverlayBounds(asRect(overlayElement), newSession === void 0 ? void 0 : asRect(newSession), footer === null ? void 0 : asRect(footer));
|
|
7697
|
+
setBounds(nextCollapsed ? EMPTY_BOUNDS : nextBounds);
|
|
7698
|
+
const covered = !nextCollapsed && nextBounds.ready && nextBounds.height > 0 ? coveredSidebarChildren(currentRoot, newSession, footer) : [];
|
|
7699
|
+
for (const [element, cleanup] of hidden) if (!covered.includes(element)) {
|
|
7700
|
+
cleanup();
|
|
7701
|
+
hidden.delete(element);
|
|
7702
|
+
}
|
|
7703
|
+
for (const element of covered) if (!hidden.has(element)) hidden.set(element, concealSidebarContent(element));
|
|
7704
|
+
setNativeCovered(covered.length > 0);
|
|
7229
7705
|
}
|
|
7230
7706
|
function scheduleUpdate() {
|
|
7231
7707
|
if (frameHandle !== void 0) return;
|
|
@@ -7242,20 +7718,26 @@ window.__ModuleLoader__.load({
|
|
|
7242
7718
|
]) resizeObserver?.observe(element);
|
|
7243
7719
|
update();
|
|
7244
7720
|
const mutationObserver = typeof MutationObserver === "function" ? new MutationObserver(scheduleUpdate) : void 0;
|
|
7245
|
-
mutationObserver?.observe(
|
|
7721
|
+
mutationObserver?.observe(frame, {
|
|
7246
7722
|
childList: true,
|
|
7247
|
-
subtree: true
|
|
7723
|
+
subtree: true,
|
|
7724
|
+
attributes: true,
|
|
7725
|
+
attributeFilter: ["data-sidebar-collapsed"]
|
|
7248
7726
|
});
|
|
7727
|
+
if (frame?.parentElement) mutationObserver?.observe(frame.parentElement, { childList: true });
|
|
7249
7728
|
return () => {
|
|
7250
7729
|
resizeObserver?.disconnect();
|
|
7251
7730
|
mutationObserver?.disconnect();
|
|
7252
7731
|
if (frameHandle !== void 0) cancelAnimationFrame(frameHandle);
|
|
7732
|
+
restore();
|
|
7253
7733
|
};
|
|
7254
7734
|
}, [active]);
|
|
7255
7735
|
return {
|
|
7256
7736
|
ref,
|
|
7257
7737
|
width,
|
|
7258
|
-
bounds
|
|
7738
|
+
bounds,
|
|
7739
|
+
collapsed,
|
|
7740
|
+
nativeCovered
|
|
7259
7741
|
};
|
|
7260
7742
|
}
|
|
7261
7743
|
//#endregion
|
|
@@ -7268,7 +7750,7 @@ window.__ModuleLoader__.load({
|
|
|
7268
7750
|
const workspaces = useWorkspaces((state) => state);
|
|
7269
7751
|
const forkRecoveryStore = forkRecovery ?? EMPTY_FORK_RECOVERY_STORE;
|
|
7270
7752
|
const forkRecoverySnapshot = (0, react.useSyncExternalStore)(forkRecoveryStore.subscribe, forkRecoveryStore.getSnapshot, forkRecoveryStore.getSnapshot);
|
|
7271
|
-
const currentSessionId = sessions
|
|
7753
|
+
const currentSessionId = currentSessionIdFromList(sessions);
|
|
7272
7754
|
const workspaceIds = useStableWorkspaceIds(workspaces.items);
|
|
7273
7755
|
const workspaceIdsRef = (0, react.useRef)(workspaceIds);
|
|
7274
7756
|
workspaceIdsRef.current = workspaceIds;
|
|
@@ -7287,7 +7769,7 @@ window.__ModuleLoader__.load({
|
|
|
7287
7769
|
}, [fullAccessConfirmationKey]);
|
|
7288
7770
|
const sessionOrderSnapshot = (0, react.useSyncExternalStore)(sessionOrder.subscribe, sessionOrder.getSnapshot, sessionOrder.getSnapshot);
|
|
7289
7771
|
const sessionPresentations = (0, react.useMemo)(() => deriveSessionPresentationIndex(sessions), [sessions.byId]);
|
|
7290
|
-
const { ref, width, bounds } = useSidebarOverlayGeometry(mode === "worktree");
|
|
7772
|
+
const { ref, width, bounds, collapsed, nativeCovered } = useSidebarOverlayGeometry(mode === "worktree");
|
|
7291
7773
|
return {
|
|
7292
7774
|
preferredMode,
|
|
7293
7775
|
mode,
|
|
@@ -7309,7 +7791,8 @@ window.__ModuleLoader__.load({
|
|
|
7309
7791
|
ref,
|
|
7310
7792
|
width,
|
|
7311
7793
|
bounds,
|
|
7312
|
-
collapsed
|
|
7794
|
+
collapsed,
|
|
7795
|
+
nativeCovered,
|
|
7313
7796
|
archivedSessionIds: workspaces.archivedSessionIds ?? []
|
|
7314
7797
|
};
|
|
7315
7798
|
}
|
|
@@ -7595,7 +8078,7 @@ window.__ModuleLoader__.load({
|
|
|
7595
8078
|
};
|
|
7596
8079
|
const defaultOpenInAppController = new OpenInAppController();
|
|
7597
8080
|
//#endregion
|
|
7598
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/
|
|
8081
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_63cf54e5ec74/packages/clutch-dsh-worktree/src/client/dashboard/open-in-app.css.mjs
|
|
7599
8082
|
const css$2 = ".-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";
|
|
7600
8083
|
const styleId$2 = "@cerbur/clutch-dsh-worktree/open-in-app.css";
|
|
7601
8084
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/open-in-app.css\"]") === null) {
|
|
@@ -7790,175 +8273,31 @@ window.__ModuleLoader__.load({
|
|
|
7790
8273
|
onClick: () => {
|
|
7791
8274
|
setOpen((prev) => !prev);
|
|
7792
8275
|
},
|
|
7793
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
8276
|
+
children: (0, react_jsx_runtime.jsx)(IconChevronDownOutline14, { size: 12 })
|
|
7794
8277
|
})]
|
|
7795
8278
|
})
|
|
7796
8279
|
})
|
|
7797
8280
|
});
|
|
7798
8281
|
}
|
|
7799
8282
|
//#endregion
|
|
7800
|
-
//#region lib/client/dashboard/
|
|
7801
|
-
|
|
7802
|
-
|
|
7803
|
-
|
|
7804
|
-
|
|
7805
|
-
|
|
7806
|
-
const inert = element.getAttribute("inert");
|
|
7807
|
-
const hidden = element.getAttribute("aria-hidden");
|
|
7808
|
-
element.style.setProperty("visibility", "hidden");
|
|
7809
|
-
element.setAttribute("inert", "");
|
|
7810
|
-
element.setAttribute("aria-hidden", "true");
|
|
7811
|
-
return () => {
|
|
7812
|
-
if (element.style.getPropertyValue("visibility") === "hidden") if (visibility) element.style.setProperty("visibility", visibility, priority);
|
|
7813
|
-
else element.style.removeProperty("visibility");
|
|
7814
|
-
for (const [name, value] of [["inert", inert], ["aria-hidden", hidden]]) if (value === null) element.removeAttribute(name);
|
|
7815
|
-
else element.setAttribute(name, value);
|
|
8283
|
+
//#region lib/client/dashboard/worktree-acquisition-facts.js
|
|
8284
|
+
function selectWorktreeAcquisitionFacts(record) {
|
|
8285
|
+
return {
|
|
8286
|
+
timestampKind: record.source === "external" ? "imported" : "created",
|
|
8287
|
+
...record.source === "external" ? record.importedAt === void 0 ? {} : { timestamp: record.importedAt } : record.createdAt === void 0 ? {} : { timestamp: record.createdAt },
|
|
8288
|
+
...record.baseBranch === void 0 ? {} : { baseBranch: record.baseBranch }
|
|
7816
8289
|
};
|
|
7817
8290
|
}
|
|
7818
|
-
|
|
7819
|
-
|
|
7820
|
-
if (frame.querySelector("[data-sidebar-right-open]") !== null) return true;
|
|
7821
|
-
|
|
7822
|
-
|
|
7823
|
-
|
|
7824
|
-
|
|
7825
|
-
|
|
7826
|
-
|
|
7827
|
-
|
|
7828
|
-
}
|
|
7829
|
-
/** Layout seam shared with the existing Sidebar overlay; fail closed on frame/center loss. */
|
|
7830
|
-
function mountDashboardOverlay(surface, onPlacement, options) {
|
|
7831
|
-
const overlay = surface.closest("[data-shell-overlay]");
|
|
7832
|
-
const frame = overlay?.parentElement;
|
|
7833
|
-
if (!overlay || !frame) {
|
|
7834
|
-
onPlacement(void 0);
|
|
7835
|
-
options?.onRightSidebarChange?.(false);
|
|
7836
|
-
return () => {};
|
|
7837
|
-
}
|
|
7838
|
-
const hidden = /* @__PURE__ */ new Map();
|
|
7839
|
-
let observed = [];
|
|
7840
|
-
let scheduled;
|
|
7841
|
-
let disposed = false;
|
|
7842
|
-
let lastRightSidebarOpen;
|
|
7843
|
-
const restore = () => {
|
|
7844
|
-
for (const cleanup of hidden.values()) cleanup();
|
|
7845
|
-
hidden.clear();
|
|
7846
|
-
};
|
|
7847
|
-
const schedule = () => {
|
|
7848
|
-
if (disposed || scheduled !== void 0) return;
|
|
7849
|
-
scheduled = requestAnimationFrame(() => {
|
|
7850
|
-
scheduled = void 0;
|
|
7851
|
-
update();
|
|
7852
|
-
});
|
|
7853
|
-
};
|
|
7854
|
-
const resize = typeof ResizeObserver === "undefined" ? void 0 : new ResizeObserver(schedule);
|
|
7855
|
-
const update = () => {
|
|
7856
|
-
if (disposed) return;
|
|
7857
|
-
const sidebar = frame.firstElementChild;
|
|
7858
|
-
const center = sidebar?.nextElementSibling;
|
|
7859
|
-
const rightbar = center?.nextElementSibling;
|
|
7860
|
-
const hasRightbar = rightbar instanceof HTMLElement && rightbar !== overlay && rightbar.nextElementSibling === overlay;
|
|
7861
|
-
const hasNoRightbar = rightbar === overlay;
|
|
7862
|
-
const valid = overlay.isConnected && overlay.parentElement === frame && sidebar instanceof HTMLElement && center instanceof HTMLElement && (hasRightbar || hasNoRightbar);
|
|
7863
|
-
const nextObserved = valid ? hasRightbar ? [
|
|
7864
|
-
overlay,
|
|
7865
|
-
sidebar,
|
|
7866
|
-
center,
|
|
7867
|
-
rightbar
|
|
7868
|
-
] : [
|
|
7869
|
-
overlay,
|
|
7870
|
-
sidebar,
|
|
7871
|
-
center
|
|
7872
|
-
] : [frame];
|
|
7873
|
-
for (const old of observed) if (!nextObserved.includes(old)) resize?.unobserve(old);
|
|
7874
|
-
for (const next of nextObserved) if (!observed.includes(next)) resize?.observe(next);
|
|
7875
|
-
observed = nextObserved;
|
|
7876
|
-
if (!valid) {
|
|
7877
|
-
restore();
|
|
7878
|
-
onPlacement(void 0);
|
|
7879
|
-
if (lastRightSidebarOpen) {
|
|
7880
|
-
lastRightSidebarOpen = false;
|
|
7881
|
-
options?.onRightSidebarChange?.(false);
|
|
7882
|
-
}
|
|
7883
|
-
return;
|
|
7884
|
-
}
|
|
7885
|
-
const box = overlay.getBoundingClientRect();
|
|
7886
|
-
const boundary = sidebar.getBoundingClientRect();
|
|
7887
|
-
const rightBoundary = hasRightbar && rightbar instanceof HTMLElement ? rightbar.getBoundingClientRect().left : box.right;
|
|
7888
|
-
const left = Math.max(0, boundary.right - box.left + SIDEBAR_RESIZE_HANDLE_HALF_WIDTH);
|
|
7889
|
-
const width = Math.min(box.right, rightBoundary) - box.left - left;
|
|
7890
|
-
if (width <= 0 || box.height <= 0) {
|
|
7891
|
-
restore();
|
|
7892
|
-
onPlacement(void 0);
|
|
7893
|
-
return;
|
|
7894
|
-
}
|
|
7895
|
-
for (const [element, cleanup] of hidden) if (element !== center) {
|
|
7896
|
-
cleanup();
|
|
7897
|
-
hidden.delete(element);
|
|
7898
|
-
}
|
|
7899
|
-
if (!hidden.has(center)) hidden.set(center, concealDashboardBackground(center));
|
|
7900
|
-
onPlacement({
|
|
7901
|
-
left,
|
|
7902
|
-
top: 0,
|
|
7903
|
-
width,
|
|
7904
|
-
height: box.height
|
|
7905
|
-
});
|
|
7906
|
-
const isRightSidebarOpen = options?.isRightSidebarExpanded !== void 0 ? options.isRightSidebarExpanded() : isRightSidebarOpenFromDom(frame, hasRightbar ? rightbar : void 0);
|
|
7907
|
-
if (lastRightSidebarOpen !== isRightSidebarOpen) {
|
|
7908
|
-
lastRightSidebarOpen = isRightSidebarOpen;
|
|
7909
|
-
options?.onRightSidebarChange?.(isRightSidebarOpen);
|
|
7910
|
-
}
|
|
7911
|
-
};
|
|
7912
|
-
const mutation = typeof MutationObserver === "undefined" ? void 0 : new MutationObserver(schedule);
|
|
7913
|
-
try {
|
|
7914
|
-
mutation?.observe(frame, {
|
|
7915
|
-
childList: true,
|
|
7916
|
-
attributes: true,
|
|
7917
|
-
subtree: true,
|
|
7918
|
-
attributeFilter: [
|
|
7919
|
-
"data-rightbar-collapsed",
|
|
7920
|
-
"data-sidebar-right-open",
|
|
7921
|
-
"data-sidebar-right-panel"
|
|
7922
|
-
]
|
|
7923
|
-
});
|
|
7924
|
-
} catch {
|
|
7925
|
-
mutation?.observe(frame, { childList: true });
|
|
7926
|
-
}
|
|
7927
|
-
if (frame.parentElement) try {
|
|
7928
|
-
mutation?.observe(frame.parentElement, { childList: true });
|
|
7929
|
-
} catch {}
|
|
7930
|
-
update();
|
|
7931
|
-
return () => {
|
|
7932
|
-
disposed = true;
|
|
7933
|
-
resize?.disconnect();
|
|
7934
|
-
mutation?.disconnect();
|
|
7935
|
-
if (scheduled !== void 0) cancelAnimationFrame(scheduled);
|
|
7936
|
-
restore();
|
|
7937
|
-
if (lastRightSidebarOpen) {
|
|
7938
|
-
lastRightSidebarOpen = false;
|
|
7939
|
-
options?.onRightSidebarChange?.(false);
|
|
7940
|
-
}
|
|
7941
|
-
};
|
|
7942
|
-
}
|
|
7943
|
-
//#endregion
|
|
7944
|
-
//#region lib/client/dashboard/worktree-acquisition-facts.js
|
|
7945
|
-
function selectWorktreeAcquisitionFacts(record) {
|
|
7946
|
-
return {
|
|
7947
|
-
timestampKind: record.source === "external" ? "imported" : "created",
|
|
7948
|
-
...record.source === "external" ? record.importedAt === void 0 ? {} : { timestamp: record.importedAt } : record.createdAt === void 0 ? {} : { timestamp: record.createdAt },
|
|
7949
|
-
...record.baseBranch === void 0 ? {} : { baseBranch: record.baseBranch }
|
|
7950
|
-
};
|
|
7951
|
-
}
|
|
7952
|
-
//#endregion
|
|
7953
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_f7c3c8176e38/packages/clutch-dsh-worktree/src/client/dashboard/dashboard.css.mjs
|
|
7954
|
-
const css$1 = ".-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 {\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-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 display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 20px;\n margin-bottom: 28px;\n color: var(--dsw-alias-label-secondary, #677080);\n font-size: 12px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTopline > span {\n overflow-wrap: anywhere;\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 align-items: center;\n gap: 8px;\n flex: none;\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) 225px;\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 overflow-wrap: anywhere;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow[role='button'] {\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow[role='button']:focus-visible {\n outline: 2px solid #497cd4;\n outline-offset: 3px;\n border-radius: 4px;\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 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(90px, 0.85fr) minmax(0, 1fr) 29px;\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-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-dashboardHeaderAside .-cerbur-clutch-dsh-worktree-dashboardFacts > div {\n padding: 4px 0;\n border: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHistorical {\n color: var(--dsw-alias-label-secondary, #788191);\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-dashboardBaselineSearch {\n box-sizing: border-box;\n flex: none;\n display: flex;\n width: 100%;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOptions {\n box-sizing: border-box;\n display: flex;\n flex: none;\n flex-direction: column;\n width: 100%;\n min-width: min(220px, 100%);\n max-width: min(420px, calc(100vw - 32px));\n /* Constant frame: six rows on compact windows, seven on normal ones. Search\n swaps the rows inside this fixed box, so the modal never resizes. */\n height: clamp(258px, 48vh, 300px);\n height: clamp(258px, 48dvh, 300px);\n padding: 4px;\n overflow-y: auto;\n overscroll-behavior: contain;\n border: 0;\n border-radius: 20px;\n background: var(--dsw-specific-menu, var(--dsw-alias-bg-layer-3, #fff));\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l1);\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n box-shadow: var(--dsw-elevation-prominent, 0 8px 24px rgb(25 33 47 / 12%));\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineList {\n display: flex;\n flex-direction: column;\n gap: 2px;\n width: 100%;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-height: 40px;\n padding: 8px 10px;\n border: 0;\n border-radius: 10px;\n outline: none;\n background: transparent;\n color: var(--dsw-alias-label-primary, #19212f);\n text-align: left;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption:hover,\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption[data-highlighted='true'],\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption[aria-selected='true'] {\n background: var(--dsw-alias-interactive-bg-hover, #f0f3f8);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption:focus-visible {\n outline: 2px solid #497cd4;\n outline-offset: -2px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption > svg {\n width: 16px;\n height: 16px;\n color: var(--dsw-alias-label-secondary, #788191);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption[aria-selected='true'] > svg:last-child {\n color: var(--dsw-alias-label-primary, #19212f);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOptionLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineEmpty {\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n padding: 8px 10px;\n color: var(--dsw-alias-label-secondary, #788191);\n text-align: center;\n}\n/* Zero-height anchor: the save error floats over the list instead of growing\n the modal, so the frame keeps its size in every state. */\n.-cerbur-clutch-dsh-worktree-dashboardBaselineStatus {\n position: relative;\n box-sizing: border-box;\n min-height: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineError {\n position: absolute;\n right: 4px;\n bottom: 12px;\n left: 4px;\n z-index: 1;\n box-sizing: border-box;\n padding: 6px 10px;\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-2, #fff);\n background: color-mix(\n in srgb,\n var(--dsw-alias-state-error-label, #bd5d43) 10%,\n var(--dsw-alias-bg-layer-2, #fff)\n );\n box-shadow:\n inset 0 0 0 1px color-mix(in srgb, var(--dsw-alias-state-error-label, #bd5d43) 32%, transparent),\n var(--dsw-elevation-prominent, 0 8px 24px rgb(25 33 47 / 12%));\n color: var(--dsw-alias-state-error-label, #bd5d43);\n font-size: 12px;\n line-height: 16px;\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-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 align-items: flex-start;\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";
|
|
7955
|
-
const styleId$1 = "@cerbur/clutch-dsh-worktree/dashboard.css";
|
|
7956
|
-
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/dashboard.css\"]") === null) {
|
|
7957
|
-
const tag = document.createElement("style");
|
|
7958
|
-
tag.dataset.plugin = "@cerbur/clutch-dsh-worktree";
|
|
7959
|
-
tag.dataset.pluginCss = styleId$1;
|
|
7960
|
-
tag.textContent = css$1;
|
|
7961
|
-
document.head.appendChild(tag);
|
|
8291
|
+
//#endregion
|
|
8292
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_63cf54e5ec74/packages/clutch-dsh-worktree/src/client/dashboard/dashboard.css.mjs
|
|
8293
|
+
const css$1 = ".-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 {\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-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: wrap;\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: wrap;\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) 225px;\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 overflow-wrap: anywhere;\n min-width: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow[role='button'] {\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardTitleRow[role='button']:focus-visible {\n outline: 2px solid #497cd4;\n outline-offset: 3px;\n border-radius: 4px;\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 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(90px, 0.85fr) minmax(0, 1fr) 29px;\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-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-dashboardHeaderAside .-cerbur-clutch-dsh-worktree-dashboardFacts > div {\n padding: 4px 0;\n border: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardHistorical {\n color: var(--dsw-alias-label-secondary, #788191);\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-dashboardBaselineSearch {\n box-sizing: border-box;\n flex: none;\n display: flex;\n width: 100%;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOptions {\n box-sizing: border-box;\n display: flex;\n flex: none;\n flex-direction: column;\n width: 100%;\n min-width: min(220px, 100%);\n max-width: min(420px, calc(100vw - 32px));\n /* Constant frame: six rows on compact windows, seven on normal ones. Search\n swaps the rows inside this fixed box, so the modal never resizes. */\n height: clamp(258px, 48vh, 300px);\n height: clamp(258px, 48dvh, 300px);\n padding: 4px;\n overflow-y: auto;\n overscroll-behavior: contain;\n border: 0;\n border-radius: 20px;\n background: var(--dsw-specific-menu, var(--dsw-alias-bg-layer-3, #fff));\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l1);\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n box-shadow: var(--dsw-elevation-prominent, 0 8px 24px rgb(25 33 47 / 12%));\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineList {\n display: flex;\n flex-direction: column;\n gap: 2px;\n width: 100%;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n min-height: 40px;\n padding: 8px 10px;\n border: 0;\n border-radius: 10px;\n outline: none;\n background: transparent;\n color: var(--dsw-alias-label-primary, #19212f);\n text-align: left;\n cursor: pointer;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption:hover,\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption[data-highlighted='true'],\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption[aria-selected='true'] {\n background: var(--dsw-alias-interactive-bg-hover, #f0f3f8);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption:focus-visible {\n outline: 2px solid #497cd4;\n outline-offset: -2px;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption > svg {\n width: 16px;\n height: 16px;\n color: var(--dsw-alias-label-secondary, #788191);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOption[aria-selected='true'] > svg:last-child {\n color: var(--dsw-alias-label-primary, #19212f);\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineOptionLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineEmpty {\n display: flex;\n flex: 1;\n align-items: center;\n justify-content: center;\n padding: 8px 10px;\n color: var(--dsw-alias-label-secondary, #788191);\n text-align: center;\n}\n/* Zero-height anchor: the save error floats over the list instead of growing\n the modal, so the frame keeps its size in every state. */\n.-cerbur-clutch-dsh-worktree-dashboardBaselineStatus {\n position: relative;\n box-sizing: border-box;\n min-height: 0;\n}\n.-cerbur-clutch-dsh-worktree-dashboardBaselineError {\n position: absolute;\n right: 4px;\n bottom: 12px;\n left: 4px;\n z-index: 1;\n box-sizing: border-box;\n padding: 6px 10px;\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-2, #fff);\n background: color-mix(\n in srgb,\n var(--dsw-alias-state-error-label, #bd5d43) 10%,\n var(--dsw-alias-bg-layer-2, #fff)\n );\n box-shadow:\n inset 0 0 0 1px color-mix(in srgb, var(--dsw-alias-state-error-label, #bd5d43) 32%, transparent),\n var(--dsw-elevation-prominent, 0 8px 24px rgb(25 33 47 / 12%));\n color: var(--dsw-alias-state-error-label, #bd5d43);\n font-size: 12px;\n line-height: 16px;\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-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";
|
|
8294
|
+
const styleId$1 = "@cerbur/clutch-dsh-worktree/dashboard.css";
|
|
8295
|
+
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/dashboard.css\"]") === null) {
|
|
8296
|
+
const tag = document.createElement("style");
|
|
8297
|
+
tag.dataset.plugin = "@cerbur/clutch-dsh-worktree";
|
|
8298
|
+
tag.dataset.pluginCss = styleId$1;
|
|
8299
|
+
tag.textContent = css$1;
|
|
8300
|
+
document.head.appendChild(tag);
|
|
7962
8301
|
}
|
|
7963
8302
|
var dashboard_css_default = {
|
|
7964
8303
|
"dashboardSurface": "-cerbur-clutch-dsh-worktree-dashboardSurface",
|
|
@@ -7972,6 +8311,7 @@ window.__ModuleLoader__.load({
|
|
|
7972
8311
|
"dashboardStartActions": "-cerbur-clutch-dsh-worktree-dashboardStartActions",
|
|
7973
8312
|
"dashboardTopline": "-cerbur-clutch-dsh-worktree-dashboardTopline",
|
|
7974
8313
|
"dashboardToplineActions": "-cerbur-clutch-dsh-worktree-dashboardToplineActions",
|
|
8314
|
+
"overlay": "-cerbur-clutch-dsh-worktree-overlay",
|
|
7975
8315
|
"dashboardSidebarButton": "-cerbur-clutch-dsh-worktree-dashboardSidebarButton",
|
|
7976
8316
|
"dashboardHeader": "-cerbur-clutch-dsh-worktree-dashboardHeader",
|
|
7977
8317
|
"dashboardIdentity": "-cerbur-clutch-dsh-worktree-dashboardIdentity",
|
|
@@ -8241,7 +8581,7 @@ window.__ModuleLoader__.load({
|
|
|
8241
8581
|
});
|
|
8242
8582
|
}
|
|
8243
8583
|
//#endregion
|
|
8244
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/
|
|
8584
|
+
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_63cf54e5ec74/packages/clutch-dsh-worktree/src/client/dashboard/git/worktree-git.css.mjs
|
|
8245
8585
|
const css = ".-cerbur-clutch-dsh-worktree-gitPanel {\n min-width: 0;\n min-height: 0;\n}\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-gitBaselineSelector select {\n min-width: 180px;\n max-width: min(360px, 60vw);\n padding: 5px 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 font: inherit;\n}\n\n.-cerbur-clutch-dsh-worktree-gitBaselineSelector select:disabled {\n cursor: wait;\n opacity: 0.7;\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-gitColumns > .-cerbur-clutch-dsh-worktree-gitColumn:last-child {\n border-bottom: 0;\n }\n}\n";
|
|
8246
8586
|
const styleId = "@cerbur/clutch-dsh-worktree/worktree-git.css";
|
|
8247
8587
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree-git.css\"]") === null) {
|
|
@@ -8403,7 +8743,7 @@ window.__ModuleLoader__.load({
|
|
|
8403
8743
|
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
8404
8744
|
className: worktree_git_css_default.gitFolderIcon,
|
|
8405
8745
|
"aria-hidden": "true",
|
|
8406
|
-
children: collapsed ? (0, react_jsx_runtime.jsx)(
|
|
8746
|
+
children: collapsed ? (0, react_jsx_runtime.jsx)(IconFolderClose16, {}) : (0, react_jsx_runtime.jsx)(IconFolderOpen16, {})
|
|
8407
8747
|
}), (0, react_jsx_runtime.jsx)("span", {
|
|
8408
8748
|
className: worktree_git_css_default.gitFolderName,
|
|
8409
8749
|
title: node.path,
|
|
@@ -8783,7 +9123,7 @@ window.__ModuleLoader__.load({
|
|
|
8783
9123
|
onClick: () => onOpenFile(diff.path),
|
|
8784
9124
|
title: t("dashboard.git.openInSidebar"),
|
|
8785
9125
|
"data-dashboard-git-open-file": diff.path,
|
|
8786
|
-
children: [(0, react_jsx_runtime.jsx)(
|
|
9126
|
+
children: [(0, react_jsx_runtime.jsx)(IconRightUpOutline16, {
|
|
8787
9127
|
size: 14,
|
|
8788
9128
|
className: worktree_git_css_default.gitDiffOpenIcon
|
|
8789
9129
|
}), (0, react_jsx_runtime.jsx)("span", { children: t("dashboard.git.openInSidebar") })]
|
|
@@ -8977,6 +9317,7 @@ window.__ModuleLoader__.load({
|
|
|
8977
9317
|
}
|
|
8978
9318
|
Object.freeze([
|
|
8979
9319
|
"WORKSPACE_NOT_FOUND",
|
|
9320
|
+
"WORKSPACE_ROOT_MISSING",
|
|
8980
9321
|
"WORKSPACE_NOT_GIT_REPOSITORY",
|
|
8981
9322
|
"GIT_NOT_INSTALLED",
|
|
8982
9323
|
"WORKTREE_REQUIRES_INITIAL_COMMIT",
|
|
@@ -10510,7 +10851,7 @@ window.__ModuleLoader__.load({
|
|
|
10510
10851
|
"aria-expanded": draft !== void 0,
|
|
10511
10852
|
disabled: disabled || options.length === 0,
|
|
10512
10853
|
onClick: openEditor,
|
|
10513
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
10854
|
+
children: (0, react_jsx_runtime.jsx)(IconEditOutline16, {})
|
|
10514
10855
|
})
|
|
10515
10856
|
}) : void 0,
|
|
10516
10857
|
children: saved === void 0 ? (0, react_jsx_runtime.jsx)("span", {
|
|
@@ -10545,7 +10886,7 @@ window.__ModuleLoader__.load({
|
|
|
10545
10886
|
"data-dashboard-baseline-modal": true,
|
|
10546
10887
|
children: [
|
|
10547
10888
|
(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Input, {
|
|
10548
|
-
icon: (0, react_jsx_runtime.jsx)(
|
|
10889
|
+
icon: (0, react_jsx_runtime.jsx)(IconSearchOutline16, {}),
|
|
10549
10890
|
className: dashboard_css_default.dashboardBaselineSearch,
|
|
10550
10891
|
"aria-label": t("dashboard.searchBranches"),
|
|
10551
10892
|
role: "combobox",
|
|
@@ -10582,12 +10923,12 @@ window.__ModuleLoader__.load({
|
|
|
10582
10923
|
"aria-selected": branch.name === draft,
|
|
10583
10924
|
onClick: () => selectOption(index),
|
|
10584
10925
|
children: [
|
|
10585
|
-
(0, react_jsx_runtime.jsx)(
|
|
10926
|
+
(0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
|
|
10586
10927
|
(0, react_jsx_runtime.jsx)("span", {
|
|
10587
10928
|
className: dashboard_css_default.dashboardBaselineOptionLabel,
|
|
10588
10929
|
children: branch.name
|
|
10589
10930
|
}),
|
|
10590
|
-
branch.name === draft && (0, react_jsx_runtime.jsx)(
|
|
10931
|
+
branch.name === draft && (0, react_jsx_runtime.jsx)(IconCheckOutline16, {})
|
|
10591
10932
|
]
|
|
10592
10933
|
}, branch.name))
|
|
10593
10934
|
}) : (0, react_jsx_runtime.jsx)("div", {
|
|
@@ -10745,7 +11086,7 @@ window.__ModuleLoader__.load({
|
|
|
10745
11086
|
return (0, react_jsx_runtime.jsx)("li", { children: (0, react_jsx_runtime.jsxs)("button", {
|
|
10746
11087
|
type: "button",
|
|
10747
11088
|
"data-dashboard-session": sessionId,
|
|
10748
|
-
"aria-current": sessions
|
|
11089
|
+
"aria-current": currentSessionIdFromList(sessions) === sessionId ? "page" : void 0,
|
|
10749
11090
|
onClick: () => onOpenSession(sessionId),
|
|
10750
11091
|
children: [
|
|
10751
11092
|
(0, react_jsx_runtime.jsx)(DashboardIcon, { kind: "sessions" }),
|
|
@@ -10777,7 +11118,7 @@ window.__ModuleLoader__.load({
|
|
|
10777
11118
|
})
|
|
10778
11119
|
});
|
|
10779
11120
|
const topActionIsCreateSession = sessionIds.length === 0 && onCreateSession !== void 0;
|
|
10780
|
-
return (0, react_jsx_runtime.
|
|
11121
|
+
return (0, react_jsx_runtime.jsxs)("section", {
|
|
10781
11122
|
ref: surface,
|
|
10782
11123
|
className: dashboard_css_default.dashboardSurface,
|
|
10783
11124
|
"data-worktree-dashboard": record.worktreeId,
|
|
@@ -10787,54 +11128,67 @@ window.__ModuleLoader__.load({
|
|
|
10787
11128
|
height: 0
|
|
10788
11129
|
},
|
|
10789
11130
|
onKeyDown: (event) => {
|
|
11131
|
+
if (event.defaultPrevented) return;
|
|
10790
11132
|
if (event.key === "Escape") {
|
|
10791
11133
|
if (event.currentTarget.querySelector("[role=\"menu\"]")) return;
|
|
10792
11134
|
event.stopPropagation();
|
|
10793
11135
|
onClose();
|
|
10794
11136
|
}
|
|
10795
11137
|
},
|
|
10796
|
-
children: (0, react_jsx_runtime.jsxs)("
|
|
10797
|
-
className: dashboard_css_default.
|
|
10798
|
-
|
|
10799
|
-
|
|
10800
|
-
|
|
10801
|
-
|
|
10802
|
-
|
|
10803
|
-
|
|
10804
|
-
|
|
10805
|
-
|
|
10806
|
-
|
|
10807
|
-
|
|
10808
|
-
|
|
10809
|
-
|
|
10810
|
-
|
|
11138
|
+
children: [(0, react_jsx_runtime.jsxs)("header", {
|
|
11139
|
+
className: dashboard_css_default.dashboardTopline,
|
|
11140
|
+
"data-dashboard-topbar": true,
|
|
11141
|
+
"data-window-drag": true,
|
|
11142
|
+
children: [(0, react_jsx_runtime.jsxs)("span", {
|
|
11143
|
+
title: `${workspaceTitle}/${displayBranch}`,
|
|
11144
|
+
style: { marginInlineStart: `max(0px, calc(var(--dsh-frame-leading-clearance, 0px) - ${placement?.left ?? 0}px - 20px))` },
|
|
11145
|
+
children: [
|
|
11146
|
+
workspaceTitle,
|
|
11147
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
11148
|
+
"aria-hidden": "true",
|
|
11149
|
+
children: " / "
|
|
11150
|
+
}),
|
|
11151
|
+
displayBranch
|
|
11152
|
+
]
|
|
11153
|
+
}), (0, react_jsx_runtime.jsxs)("div", {
|
|
11154
|
+
className: dashboard_css_default.dashboardToplineActions,
|
|
11155
|
+
children: [
|
|
11156
|
+
(0, react_jsx_runtime.jsx)(OpenInAppButton, {
|
|
11157
|
+
path: record.absolutePath,
|
|
11158
|
+
t
|
|
11159
|
+
}),
|
|
11160
|
+
(0, react_jsx_runtime.jsx)("button", {
|
|
11161
|
+
type: "button",
|
|
11162
|
+
className: dashboard_css_default.dashboardButton,
|
|
11163
|
+
"aria-label": t(topActionIsCreateSession ? "dashboard.newSession" : "dashboard.back"),
|
|
11164
|
+
onClick: () => {
|
|
11165
|
+
if (topActionIsCreateSession) onCreateSession?.();
|
|
11166
|
+
else onClose();
|
|
11167
|
+
},
|
|
11168
|
+
children: topActionIsCreateSession ? t("dashboard.newSession") : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: ["← ", t("dashboard.back")] })
|
|
11169
|
+
}),
|
|
11170
|
+
!rightSidebarOpen && onOpenSidebar !== void 0 && (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
|
|
11171
|
+
label: t("dashboard.openSidebar"),
|
|
11172
|
+
side: "bottom",
|
|
11173
|
+
delayMs: 500,
|
|
11174
|
+
children: (0, react_jsx_runtime.jsx)("button", {
|
|
10811
11175
|
type: "button",
|
|
10812
|
-
className: dashboard_css_default.
|
|
10813
|
-
"aria-label": t(
|
|
11176
|
+
className: dashboard_css_default.dashboardSidebarButton,
|
|
11177
|
+
"aria-label": t("dashboard.openSidebar"),
|
|
11178
|
+
title: t("dashboard.openSidebar"),
|
|
11179
|
+
"data-sidebar-right-expand": true,
|
|
10814
11180
|
onClick: () => {
|
|
10815
|
-
|
|
10816
|
-
|
|
11181
|
+
onOpenSidebar();
|
|
11182
|
+
setRightSidebarOpen(true);
|
|
10817
11183
|
},
|
|
10818
|
-
children:
|
|
10819
|
-
})
|
|
10820
|
-
|
|
10821
|
-
|
|
10822
|
-
|
|
10823
|
-
|
|
10824
|
-
|
|
10825
|
-
|
|
10826
|
-
"aria-label": t("dashboard.openSidebar"),
|
|
10827
|
-
title: t("dashboard.openSidebar"),
|
|
10828
|
-
"data-sidebar-right-expand": true,
|
|
10829
|
-
onClick: () => {
|
|
10830
|
-
onOpenSidebar();
|
|
10831
|
-
setRightSidebarOpen(true);
|
|
10832
|
-
},
|
|
10833
|
-
children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPanelLeftOutline16, {})
|
|
10834
|
-
})
|
|
10835
|
-
})]
|
|
10836
|
-
})]
|
|
10837
|
-
}),
|
|
11184
|
+
children: (0, react_jsx_runtime.jsx)(IconPanelLeftOutline16, {})
|
|
11185
|
+
})
|
|
11186
|
+
})
|
|
11187
|
+
]
|
|
11188
|
+
})]
|
|
11189
|
+
}), (0, react_jsx_runtime.jsxs)("div", {
|
|
11190
|
+
className: dashboard_css_default.dashboardPage,
|
|
11191
|
+
children: [
|
|
10838
11192
|
(0, react_jsx_runtime.jsxs)("header", {
|
|
10839
11193
|
className: dashboard_css_default.dashboardHeader,
|
|
10840
11194
|
children: [(0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -10856,7 +11210,7 @@ window.__ModuleLoader__.load({
|
|
|
10856
11210
|
}
|
|
10857
11211
|
} : void 0,
|
|
10858
11212
|
children: [
|
|
10859
|
-
(0, react_jsx_runtime.jsx)(
|
|
11213
|
+
(0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
|
|
10860
11214
|
(0, react_jsx_runtime.jsx)("h1", {
|
|
10861
11215
|
id: `${id}-title`,
|
|
10862
11216
|
ref: heading,
|
|
@@ -10894,7 +11248,7 @@ window.__ModuleLoader__.load({
|
|
|
10894
11248
|
onClick: () => {
|
|
10895
11249
|
copyPath();
|
|
10896
11250
|
},
|
|
10897
|
-
children: (0, react_jsx_runtime.jsx)(
|
|
11251
|
+
children: (0, react_jsx_runtime.jsx)(IconCopyOutline16, {})
|
|
10898
11252
|
})
|
|
10899
11253
|
]
|
|
10900
11254
|
}),
|
|
@@ -10904,12 +11258,9 @@ window.__ModuleLoader__.load({
|
|
|
10904
11258
|
children: branchCopyState === "pending" ? "\xA0" : branchCopyState === "copied" ? t("dashboard.branchCopied") : branchCopyState === "failed" ? t("dashboard.branchCopyFailed") : copyState === "copied" ? t("dashboard.copied") : copyState === "failed" ? t("dashboard.copyFailed") : "\xA0"
|
|
10905
11259
|
})
|
|
10906
11260
|
]
|
|
10907
|
-
}), (0, react_jsx_runtime.
|
|
11261
|
+
}), (0, react_jsx_runtime.jsx)("div", {
|
|
10908
11262
|
className: dashboard_css_default.dashboardHeaderAside,
|
|
10909
|
-
children:
|
|
10910
|
-
path: record.absolutePath,
|
|
10911
|
-
t
|
|
10912
|
-
}), (0, react_jsx_runtime.jsxs)("dl", {
|
|
11263
|
+
children: (0, react_jsx_runtime.jsxs)("dl", {
|
|
10913
11264
|
className: dashboard_css_default.dashboardFacts,
|
|
10914
11265
|
children: [
|
|
10915
11266
|
(0, react_jsx_runtime.jsx)(DashboardFactRow, {
|
|
@@ -10942,7 +11293,7 @@ window.__ModuleLoader__.load({
|
|
|
10942
11293
|
children: isMainWorktreeId$1(record.worktreeId) ? t("worktree.main") : t(record.source === "external" ? "dashboard.external" : "dashboard.plugin")
|
|
10943
11294
|
})
|
|
10944
11295
|
]
|
|
10945
|
-
})
|
|
11296
|
+
})
|
|
10946
11297
|
})]
|
|
10947
11298
|
}),
|
|
10948
11299
|
(0, react_jsx_runtime.jsx)("div", {
|
|
@@ -10982,7 +11333,7 @@ window.__ModuleLoader__.load({
|
|
|
10982
11333
|
(0, react_jsx_runtime.jsxs)("section", {
|
|
10983
11334
|
className: dashboard_css_default.dashboardStart,
|
|
10984
11335
|
children: [
|
|
10985
|
-
(0, react_jsx_runtime.jsxs)("h2", { children: [(0, react_jsx_runtime.jsx)(
|
|
11336
|
+
(0, react_jsx_runtime.jsxs)("h2", { children: [(0, react_jsx_runtime.jsx)(IconBranchOutline16, {}), t("dashboard.start")] }),
|
|
10986
11337
|
(0, react_jsx_runtime.jsx)("p", { children: t("dashboard.startDescription") }),
|
|
10987
11338
|
(0, react_jsx_runtime.jsxs)("div", {
|
|
10988
11339
|
className: dashboard_css_default.dashboardStartActions,
|
|
@@ -11147,7 +11498,73 @@ window.__ModuleLoader__.load({
|
|
|
11147
11498
|
children: t("dashboard.mvpHint")
|
|
11148
11499
|
})
|
|
11149
11500
|
]
|
|
11150
|
-
})
|
|
11501
|
+
})]
|
|
11502
|
+
});
|
|
11503
|
+
}
|
|
11504
|
+
//#endregion
|
|
11505
|
+
//#region lib/client/dashboard/DashboardRequest.js
|
|
11506
|
+
/** Present a header request while its target read settles, without expanding navigation. */
|
|
11507
|
+
function DashboardRequest({ t, error, onRetry, onClose }) {
|
|
11508
|
+
const ref = (0, react.useRef)(null);
|
|
11509
|
+
const [placement, setPlacement] = (0, react.useState)();
|
|
11510
|
+
(0, react.useLayoutEffect)(() => {
|
|
11511
|
+
if (!ref.current) return;
|
|
11512
|
+
return mountDashboardOverlay(ref.current, (next) => setPlacement((old) => JSON.stringify(old) === JSON.stringify(next) ? old : next));
|
|
11513
|
+
}, []);
|
|
11514
|
+
(0, react.useLayoutEffect)(() => {
|
|
11515
|
+
if (!placement) return;
|
|
11516
|
+
const previous = document.activeElement;
|
|
11517
|
+
const element = ref.current;
|
|
11518
|
+
element?.focus({ preventScroll: true });
|
|
11519
|
+
return () => {
|
|
11520
|
+
if (previous instanceof HTMLElement && previous.isConnected && (element?.contains(document.activeElement) || document.activeElement === document.body)) previous.focus({ preventScroll: true });
|
|
11521
|
+
};
|
|
11522
|
+
}, [placement !== void 0]);
|
|
11523
|
+
return (0, react_jsx_runtime.jsxs)("section", {
|
|
11524
|
+
ref,
|
|
11525
|
+
className: dashboard_css_default.dashboardSurface,
|
|
11526
|
+
"data-worktree-dashboard-request": true,
|
|
11527
|
+
"aria-label": t("dashboard.title"),
|
|
11528
|
+
"aria-busy": error === void 0,
|
|
11529
|
+
tabIndex: -1,
|
|
11530
|
+
style: placement ?? {
|
|
11531
|
+
visibility: "hidden",
|
|
11532
|
+
height: 0
|
|
11533
|
+
},
|
|
11534
|
+
onKeyDown: (event) => {
|
|
11535
|
+
if (event.key === "Escape") {
|
|
11536
|
+
event.stopPropagation();
|
|
11537
|
+
onClose();
|
|
11538
|
+
}
|
|
11539
|
+
},
|
|
11540
|
+
children: [(0, react_jsx_runtime.jsxs)("header", {
|
|
11541
|
+
className: dashboard_css_default.dashboardTopline,
|
|
11542
|
+
"data-dashboard-topbar": true,
|
|
11543
|
+
"data-window-drag": true,
|
|
11544
|
+
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
11545
|
+
style: { marginInlineStart: `max(0px, calc(var(--dsh-frame-leading-clearance, 0px) - ${placement?.left ?? 0}px - 20px))` },
|
|
11546
|
+
children: t("dashboard.title")
|
|
11547
|
+
}), (0, react_jsx_runtime.jsx)("div", {
|
|
11548
|
+
className: dashboard_css_default.dashboardToplineActions,
|
|
11549
|
+
children: (0, react_jsx_runtime.jsx)("button", {
|
|
11550
|
+
type: "button",
|
|
11551
|
+
className: dashboard_css_default.dashboardButton,
|
|
11552
|
+
onClick: onClose,
|
|
11553
|
+
children: t("dashboard.back")
|
|
11554
|
+
})
|
|
11555
|
+
})]
|
|
11556
|
+
}), (0, react_jsx_runtime.jsxs)("div", {
|
|
11557
|
+
className: dashboard_css_default.dashboardPage,
|
|
11558
|
+
children: [(0, react_jsx_runtime.jsx)("p", {
|
|
11559
|
+
role: error ? "alert" : "status",
|
|
11560
|
+
children: error ? formatWorktreeViewError(error, t) : t("status.loading")
|
|
11561
|
+
}), error && (0, react_jsx_runtime.jsx)("button", {
|
|
11562
|
+
type: "button",
|
|
11563
|
+
className: dashboard_css_default.dashboardButton,
|
|
11564
|
+
onClick: onRetry,
|
|
11565
|
+
children: t("action.retry")
|
|
11566
|
+
})]
|
|
11567
|
+
})]
|
|
11151
11568
|
});
|
|
11152
11569
|
}
|
|
11153
11570
|
//#endregion
|
|
@@ -11274,11 +11691,15 @@ window.__ModuleLoader__.load({
|
|
|
11274
11691
|
const dashboardMainRecord = targetWorkspace === void 0 ? void 0 : createMainWorktreeRecord(targetWorkspace, dashboardMainBranch, targetView?.mainInstructions);
|
|
11275
11692
|
const dashboardRecord = resolveDashboardRecord(dashboard, source.mode, source.currentSessionId, source.workspaceIds, dashboard === void 0 ? void 0 : targetView?.worktrees, dashboardMainRecord);
|
|
11276
11693
|
(0, react.useEffect)(() => {
|
|
11277
|
-
if (dashboard !== void 0 && dashboardRecord === void 0) setDashboard(void 0);
|
|
11694
|
+
if (dashboard !== void 0 && dashboardRecord === void 0 && (source.mode !== "worktree" || dashboard.sessionId !== void 0 && dashboard.sessionId !== source.currentSessionId || !source.workspaceIds.includes(dashboard.workspaceId) || targetView !== void 0)) setDashboard(void 0);
|
|
11278
11695
|
}, [
|
|
11279
11696
|
dashboard,
|
|
11280
11697
|
dashboardRecord,
|
|
11281
|
-
setDashboard
|
|
11698
|
+
setDashboard,
|
|
11699
|
+
source.mode,
|
|
11700
|
+
source.currentSessionId,
|
|
11701
|
+
source.workspaceIds,
|
|
11702
|
+
targetView
|
|
11282
11703
|
]);
|
|
11283
11704
|
const mutation = useSurfaceMutation({ read });
|
|
11284
11705
|
const lifecycleState = useLifecycleState({
|
|
@@ -11402,147 +11823,166 @@ window.__ModuleLoader__.load({
|
|
|
11402
11823
|
if (source.mode !== "worktree") return null;
|
|
11403
11824
|
const { ref, width, bounds, collapsed } = source;
|
|
11404
11825
|
const { t } = props;
|
|
11405
|
-
return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
11406
|
-
|
|
11407
|
-
|
|
11408
|
-
|
|
11409
|
-
|
|
11410
|
-
|
|
11411
|
-
|
|
11412
|
-
|
|
11413
|
-
|
|
11414
|
-
|
|
11415
|
-
|
|
11416
|
-
|
|
11417
|
-
|
|
11418
|
-
|
|
11419
|
-
|
|
11420
|
-
|
|
11421
|
-
|
|
11422
|
-
|
|
11423
|
-
|
|
11424
|
-
|
|
11425
|
-
|
|
11826
|
+
return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
11827
|
+
(0, react_jsx_runtime.jsxs)("aside", {
|
|
11828
|
+
ref,
|
|
11829
|
+
className: worktree_css_default.surface,
|
|
11830
|
+
"data-worktree-surface": true,
|
|
11831
|
+
"data-collapsed": collapsed || void 0,
|
|
11832
|
+
"data-native-sidebar-covered": source.nativeCovered || void 0,
|
|
11833
|
+
"aria-hidden": collapsed || void 0,
|
|
11834
|
+
"aria-label": t("mode.navigation"),
|
|
11835
|
+
style: {
|
|
11836
|
+
width: `${width}px`,
|
|
11837
|
+
...bounds.ready ? {
|
|
11838
|
+
top: `${bounds.top}px`,
|
|
11839
|
+
height: `${bounds.height}px`
|
|
11840
|
+
} : {
|
|
11841
|
+
height: "0px",
|
|
11842
|
+
visibility: "hidden"
|
|
11843
|
+
}
|
|
11844
|
+
},
|
|
11845
|
+
children: [
|
|
11846
|
+
(0, react_jsx_runtime.jsxs)("div", {
|
|
11847
|
+
className: worktree_css_default.wideContent,
|
|
11848
|
+
children: [(0, react_jsx_runtime.jsx)(SurfaceHeader, {
|
|
11849
|
+
expansion,
|
|
11850
|
+
props,
|
|
11851
|
+
source,
|
|
11852
|
+
read,
|
|
11853
|
+
mutation
|
|
11854
|
+
}), (0, react_jsx_runtime.jsx)(SurfaceContent, {
|
|
11855
|
+
source,
|
|
11856
|
+
props,
|
|
11857
|
+
lifecycle,
|
|
11858
|
+
mutation,
|
|
11859
|
+
session,
|
|
11860
|
+
read,
|
|
11861
|
+
expansion,
|
|
11862
|
+
ordering,
|
|
11863
|
+
drag,
|
|
11864
|
+
menus,
|
|
11865
|
+
registration,
|
|
11866
|
+
native,
|
|
11867
|
+
lifecycleState
|
|
11868
|
+
})]
|
|
11869
|
+
}),
|
|
11870
|
+
(0, react_jsx_runtime.jsx)(NativeDialogs, {
|
|
11426
11871
|
props,
|
|
11427
|
-
|
|
11428
|
-
|
|
11429
|
-
|
|
11430
|
-
}), (0, react_jsx_runtime.jsx)(SurfaceContent, {
|
|
11431
|
-
source,
|
|
11872
|
+
native
|
|
11873
|
+
}),
|
|
11874
|
+
(0, react_jsx_runtime.jsx)(RegistrationDialog, {
|
|
11432
11875
|
props,
|
|
11433
|
-
|
|
11876
|
+
registration,
|
|
11877
|
+
registrationState,
|
|
11434
11878
|
mutation,
|
|
11435
|
-
|
|
11436
|
-
|
|
11879
|
+
read
|
|
11880
|
+
}),
|
|
11881
|
+
(0, react_jsx_runtime.jsx)(LifecycleDialogs, {
|
|
11882
|
+
props,
|
|
11883
|
+
lifecycleState,
|
|
11884
|
+
mutation,
|
|
11885
|
+
lifecycle,
|
|
11437
11886
|
expansion,
|
|
11438
|
-
|
|
11439
|
-
|
|
11440
|
-
|
|
11441
|
-
|
|
11442
|
-
|
|
11443
|
-
|
|
11444
|
-
})
|
|
11445
|
-
|
|
11446
|
-
|
|
11447
|
-
|
|
11448
|
-
|
|
11449
|
-
|
|
11450
|
-
|
|
11451
|
-
|
|
11452
|
-
registration,
|
|
11453
|
-
registrationState,
|
|
11454
|
-
mutation,
|
|
11455
|
-
read
|
|
11456
|
-
}),
|
|
11457
|
-
(0, react_jsx_runtime.jsx)(LifecycleDialogs, {
|
|
11458
|
-
props,
|
|
11459
|
-
lifecycleState,
|
|
11460
|
-
mutation,
|
|
11461
|
-
lifecycle,
|
|
11462
|
-
expansion,
|
|
11463
|
-
read,
|
|
11464
|
-
session
|
|
11465
|
-
}),
|
|
11466
|
-
(0, react_jsx_runtime.jsx)(AccessConfirmation, {
|
|
11467
|
-
source,
|
|
11468
|
-
props
|
|
11469
|
-
})
|
|
11470
|
-
]
|
|
11471
|
-
}), dashboardRecord !== void 0 && (0, react_jsx_runtime.jsx)(WorktreeDashboard, {
|
|
11472
|
-
manager: props.manager,
|
|
11473
|
-
record: dashboardRecord,
|
|
11474
|
-
onSaveInstructions: props.manager ? async (instructions, expectedInstructions) => {
|
|
11475
|
-
try {
|
|
11476
|
-
return await props.manager.updateWorktreeInstructions({
|
|
11477
|
-
workspaceId: dashboardRecord.workspaceId,
|
|
11478
|
-
worktreeId: dashboardRecord.worktreeId,
|
|
11479
|
-
instructions,
|
|
11480
|
-
expectedInstructions
|
|
11481
|
-
});
|
|
11482
|
-
} finally {
|
|
11887
|
+
read,
|
|
11888
|
+
session
|
|
11889
|
+
}),
|
|
11890
|
+
(0, react_jsx_runtime.jsx)(AccessConfirmation, {
|
|
11891
|
+
source,
|
|
11892
|
+
props
|
|
11893
|
+
})
|
|
11894
|
+
]
|
|
11895
|
+
}),
|
|
11896
|
+
dashboard !== void 0 && dashboardRecord === void 0 && dashboard.sessionId === source.currentSessionId && source.workspaceIds.includes(dashboard.workspaceId) && targetView === void 0 && (0, react_jsx_runtime.jsx)(DashboardRequest, {
|
|
11897
|
+
t,
|
|
11898
|
+
error: read.readState.error ?? (read.readState.targetError?.workspaceIds.includes(dashboard.workspaceId) ? read.readState.targetError.error : void 0),
|
|
11899
|
+
onClose: closeDashboard,
|
|
11900
|
+
onRetry: () => {
|
|
11483
11901
|
read.refresh({
|
|
11484
|
-
preserveCurrent: true,
|
|
11485
11902
|
scope: {
|
|
11486
11903
|
kind: "workspace",
|
|
11487
|
-
workspaceId:
|
|
11488
|
-
}
|
|
11904
|
+
workspaceId: dashboard.workspaceId
|
|
11905
|
+
},
|
|
11906
|
+
preserveCurrent: true
|
|
11489
11907
|
});
|
|
11490
11908
|
}
|
|
11491
|
-
}
|
|
11492
|
-
|
|
11493
|
-
|
|
11494
|
-
|
|
11909
|
+
}),
|
|
11910
|
+
dashboardRecord !== void 0 && (0, react_jsx_runtime.jsx)(WorktreeDashboard, {
|
|
11911
|
+
manager: props.manager,
|
|
11912
|
+
record: dashboardRecord,
|
|
11913
|
+
onSaveInstructions: props.manager ? async (instructions, expectedInstructions) => {
|
|
11914
|
+
try {
|
|
11915
|
+
return await props.manager.updateWorktreeInstructions({
|
|
11916
|
+
workspaceId: dashboardRecord.workspaceId,
|
|
11917
|
+
worktreeId: dashboardRecord.worktreeId,
|
|
11918
|
+
instructions,
|
|
11919
|
+
expectedInstructions
|
|
11920
|
+
});
|
|
11921
|
+
} finally {
|
|
11922
|
+
read.refresh({
|
|
11923
|
+
preserveCurrent: true,
|
|
11924
|
+
scope: {
|
|
11925
|
+
kind: "workspace",
|
|
11926
|
+
workspaceId: dashboardRecord.workspaceId
|
|
11927
|
+
}
|
|
11928
|
+
});
|
|
11929
|
+
}
|
|
11930
|
+
} : void 0,
|
|
11931
|
+
onSaveBaseline: props.manager && typeof props.manager.updateWorktreeBaseBranch === "function" && dashboardManagedRecord !== void 0 && dashboardCanCreate ? async (baseBranch, expectedBaseBranch) => {
|
|
11932
|
+
try {
|
|
11933
|
+
return await props.manager.updateWorktreeBaseBranch({
|
|
11934
|
+
workspaceId: dashboardRecord.workspaceId,
|
|
11935
|
+
worktreeId: dashboardRecord.worktreeId,
|
|
11936
|
+
baseBranch,
|
|
11937
|
+
expectedBaseBranch
|
|
11938
|
+
});
|
|
11939
|
+
} finally {
|
|
11940
|
+
read.refresh({
|
|
11941
|
+
preserveCurrent: true,
|
|
11942
|
+
scope: {
|
|
11943
|
+
kind: "workspace",
|
|
11944
|
+
workspaceId: dashboardRecord.workspaceId
|
|
11945
|
+
}
|
|
11946
|
+
});
|
|
11947
|
+
}
|
|
11948
|
+
} : void 0,
|
|
11949
|
+
branches: dashboardView?.branches ?? [],
|
|
11950
|
+
workspaceTitle: dashboardWorkspace?.title ?? "",
|
|
11951
|
+
sessions: source.sessions,
|
|
11952
|
+
sessionPresentations: source.sessionPresentations,
|
|
11953
|
+
sessionIds: dashboardSessionIds(dashboardRecord, source.sessions, dashboardView?.bindings ?? [], source.archivedSessionIds, isMainWorktreeId$1(dashboardRecord.worktreeId) ? ordering.orderedSessionIdsByAccount.get(`main:${dashboardRecord.workspaceId}`) : ordering.orderedSessionIdsByAccount.get(`worktree:${dashboardRecord.worktreeId}`), dashboardWorkspace === void 0 ? [] : workspaceSessionIds(source.workspaces, dashboardWorkspace.workspaceId, source.sessions.ids)),
|
|
11954
|
+
actionPending: mutation.actionPending,
|
|
11955
|
+
onOpenFile: typeof props.openResource === "function" ? onOpenFile : void 0,
|
|
11956
|
+
onOpenSession: (sessionId) => session.openWorkspaceSession(dashboardRecord.workspaceId, sessionId),
|
|
11957
|
+
onCreateSession: dashboardCanCreate && (isMainWorktreeId$1(dashboardRecord.worktreeId) ? props.createMainSession !== void 0 : props.createSessionForWorktree !== void 0) ? () => {
|
|
11958
|
+
if (mutation.actionPending) return;
|
|
11959
|
+
closeDashboard();
|
|
11960
|
+
if (isMainWorktreeId$1(dashboardRecord.worktreeId)) props.createMainSession?.(dashboardRecord.workspaceId);
|
|
11961
|
+
else session.createSession({
|
|
11495
11962
|
workspaceId: dashboardRecord.workspaceId,
|
|
11496
11963
|
worktreeId: dashboardRecord.worktreeId,
|
|
11497
|
-
|
|
11498
|
-
expectedBaseBranch
|
|
11964
|
+
cwd: dashboardRecord.absolutePath
|
|
11499
11965
|
});
|
|
11500
|
-
}
|
|
11501
|
-
|
|
11502
|
-
|
|
11503
|
-
|
|
11504
|
-
|
|
11505
|
-
|
|
11506
|
-
|
|
11966
|
+
} : void 0,
|
|
11967
|
+
onCreateWorktree: dashboardCanCreate && dashboardRecord.currentBranch !== null && dashboardRecord.branch.length > 0 && dashboardWorkspace !== void 0 && dashboardView !== void 0 ? () => {
|
|
11968
|
+
if (mutation.actionPending) return;
|
|
11969
|
+
const branch = dashboardRecord.currentBranch ?? dashboardRecord.branch;
|
|
11970
|
+
registration.openWorktreeCreator(dashboardWorkspace, {
|
|
11971
|
+
baseBranch: branch,
|
|
11972
|
+
newBranch: createNumberedWorktreeName(branch, [...dashboardView.branches.map((candidate) => candidate.name), ...dashboardView.worktrees.map((candidate) => candidate.branch)])
|
|
11507
11973
|
});
|
|
11508
|
-
}
|
|
11509
|
-
|
|
11510
|
-
|
|
11511
|
-
|
|
11512
|
-
|
|
11513
|
-
|
|
11514
|
-
|
|
11515
|
-
|
|
11516
|
-
|
|
11517
|
-
|
|
11518
|
-
|
|
11519
|
-
|
|
11520
|
-
closeDashboard();
|
|
11521
|
-
if (isMainWorktreeId$1(dashboardRecord.worktreeId)) props.createMainSession?.(dashboardRecord.workspaceId);
|
|
11522
|
-
else session.createSession({
|
|
11523
|
-
workspaceId: dashboardRecord.workspaceId,
|
|
11524
|
-
worktreeId: dashboardRecord.worktreeId,
|
|
11525
|
-
cwd: dashboardRecord.absolutePath
|
|
11526
|
-
});
|
|
11527
|
-
} : void 0,
|
|
11528
|
-
onCreateWorktree: dashboardCanCreate && dashboardRecord.currentBranch !== null && dashboardRecord.branch.length > 0 && dashboardWorkspace !== void 0 && dashboardView !== void 0 ? () => {
|
|
11529
|
-
if (mutation.actionPending) return;
|
|
11530
|
-
const branch = dashboardRecord.currentBranch ?? dashboardRecord.branch;
|
|
11531
|
-
registration.openWorktreeCreator(dashboardWorkspace, {
|
|
11532
|
-
baseBranch: branch,
|
|
11533
|
-
newBranch: createNumberedWorktreeName(branch, [...dashboardView.branches.map((candidate) => candidate.name), ...dashboardView.worktrees.map((candidate) => candidate.branch)])
|
|
11534
|
-
});
|
|
11535
|
-
} : void 0,
|
|
11536
|
-
onArchiveWorktree: dashboardManagedRecord !== void 0 && dashboardManagedRecord.status === "active" && dashboardManagedRecord.health !== "recovery-needed" ? () => {
|
|
11537
|
-
if (mutation.actionPending) return;
|
|
11538
|
-
lifecycleState.setWorktreeRemoval(dashboardManagedRecord);
|
|
11539
|
-
mutation.setActionError(void 0);
|
|
11540
|
-
} : void 0,
|
|
11541
|
-
t,
|
|
11542
|
-
onClose: closeDashboard,
|
|
11543
|
-
onOpenSidebar: source.currentSessionId === void 0 ? void 0 : props.openRightSidebar,
|
|
11544
|
-
isRightSidebarExpanded: props.isRightSidebarExpanded
|
|
11545
|
-
}, `${dashboardRecord.workspaceId}:${dashboardRecord.worktreeId}`)] });
|
|
11974
|
+
} : void 0,
|
|
11975
|
+
onArchiveWorktree: dashboardManagedRecord !== void 0 && dashboardManagedRecord.status === "active" && dashboardManagedRecord.health !== "recovery-needed" ? () => {
|
|
11976
|
+
if (mutation.actionPending) return;
|
|
11977
|
+
lifecycleState.setWorktreeRemoval(dashboardManagedRecord);
|
|
11978
|
+
mutation.setActionError(void 0);
|
|
11979
|
+
} : void 0,
|
|
11980
|
+
t,
|
|
11981
|
+
onClose: closeDashboard,
|
|
11982
|
+
onOpenSidebar: source.currentSessionId === void 0 ? void 0 : props.openRightSidebar,
|
|
11983
|
+
isRightSidebarExpanded: props.isRightSidebarExpanded
|
|
11984
|
+
}, `${dashboardRecord.workspaceId}:${dashboardRecord.worktreeId}`)
|
|
11985
|
+
] });
|
|
11546
11986
|
}
|
|
11547
11987
|
//#endregion
|
|
11548
11988
|
//#region lib/client/overlay/WorktreeOverlay.js
|
|
@@ -11606,7 +12046,7 @@ window.__ModuleLoader__.load({
|
|
|
11606
12046
|
function identityFrom(sessions, workspaces) {
|
|
11607
12047
|
const sessionSnapshot = sessions.getSnapshot();
|
|
11608
12048
|
const workspaceSnapshot = workspaces.getSnapshot();
|
|
11609
|
-
const sessionId = sessionSnapshot
|
|
12049
|
+
const sessionId = currentSessionIdFromList(sessionSnapshot);
|
|
11610
12050
|
if (sessionId === void 0) return { workspaceId: deriveRecentWorkspaceId({ items: workspaceSnapshot.items }, sessionSnapshot.byId) };
|
|
11611
12051
|
return {
|
|
11612
12052
|
sessionId,
|
|
@@ -11941,6 +12381,37 @@ window.__ModuleLoader__.load({
|
|
|
11941
12381
|
};
|
|
11942
12382
|
}
|
|
11943
12383
|
//#endregion
|
|
12384
|
+
//#region lib/client/session/session-rename.js
|
|
12385
|
+
/** Rename a listed Session across DSH generations with different retention semantics. */
|
|
12386
|
+
async function renameWorktreeSession(sessions, sessionId, title) {
|
|
12387
|
+
const compatibleSessions = sessions;
|
|
12388
|
+
if (typeof compatibleSessions.using === "function") {
|
|
12389
|
+
const result = await compatibleSessions.using(sessionId, { source: "workspaceOperation" }, (reference) => reference.binding.session.rename(title));
|
|
12390
|
+
if (!result.ok) throw new Error(result.error.message);
|
|
12391
|
+
return;
|
|
12392
|
+
}
|
|
12393
|
+
const session = compatibleSessions.binding(sessionId)?.session;
|
|
12394
|
+
if (session === void 0) throw new Error(`unknown session "${sessionId}"`);
|
|
12395
|
+
const result = await session.rename(title);
|
|
12396
|
+
if (!result.ok) throw new Error(result.error.message);
|
|
12397
|
+
}
|
|
12398
|
+
//#endregion
|
|
12399
|
+
//#region lib/client/session/session-navigation.js
|
|
12400
|
+
/** Use DSH-owned navigation in 1.7; keep the older Session-controller fallback. */
|
|
12401
|
+
function openWorktreeSession(uiWorkspace, sessions, sessionId) {
|
|
12402
|
+
const compatibleUiWorkspace = uiWorkspace;
|
|
12403
|
+
if (typeof compatibleUiWorkspace.openSession === "function") {
|
|
12404
|
+
compatibleUiWorkspace.openSession(sessionId);
|
|
12405
|
+
return;
|
|
12406
|
+
}
|
|
12407
|
+
const legacyOpen = sessions.open;
|
|
12408
|
+
if (typeof legacyOpen === "function") {
|
|
12409
|
+
legacyOpen(sessionId);
|
|
12410
|
+
return;
|
|
12411
|
+
}
|
|
12412
|
+
throw new Error("DSH Client does not expose a Session navigation method");
|
|
12413
|
+
}
|
|
12414
|
+
//#endregion
|
|
11944
12415
|
//#region lib/client/permission/worktree-permission.js
|
|
11945
12416
|
/**
|
|
11946
12417
|
* Coordinate async permission requests with the one in-page confirmation
|
|
@@ -12406,6 +12877,23 @@ window.__ModuleLoader__.load({
|
|
|
12406
12877
|
};
|
|
12407
12878
|
const sessions = ctx.sessions;
|
|
12408
12879
|
const slots = ctx.slots;
|
|
12880
|
+
ctx.effect(() => {
|
|
12881
|
+
const notice = new RestartNotice((signal) => manager.probeHost(signal));
|
|
12882
|
+
const check = () => void notice.check();
|
|
12883
|
+
const reset = ctx.on("connection/reset", check);
|
|
12884
|
+
const overlay = slots.inject("shell.overlay", () => slots.register({
|
|
12885
|
+
name: "shell.overlay",
|
|
12886
|
+
id: "clutch-dsh-worktree-restart-toast",
|
|
12887
|
+
locale: WORKTREE_NS,
|
|
12888
|
+
inject: () => ({ notice })
|
|
12889
|
+
}, RestartToast));
|
|
12890
|
+
check();
|
|
12891
|
+
return () => {
|
|
12892
|
+
notice.dispose();
|
|
12893
|
+
reset();
|
|
12894
|
+
overlay();
|
|
12895
|
+
};
|
|
12896
|
+
}, "clutch-dsh-worktree: restart reminder");
|
|
12409
12897
|
const virtualWorkspaceMembership = createVirtualWorkspaceMembership(ctx.workspaces.list);
|
|
12410
12898
|
const contextProjection = createWorktreeContextProjection({
|
|
12411
12899
|
sessions: ctx.sessions.list,
|
|
@@ -12526,9 +13014,7 @@ window.__ModuleLoader__.load({
|
|
|
12526
13014
|
permission: permissionManager,
|
|
12527
13015
|
confirmFullAccess: permissionManager === void 0 ? void 0 : fullAccessConfirmation.request,
|
|
12528
13016
|
onPermissionResult: reportPermissionNotice,
|
|
12529
|
-
openSession: (sessionId) =>
|
|
12530
|
-
ctx.sessions.open(sessionId);
|
|
12531
|
-
}
|
|
13017
|
+
openSession: (sessionId) => openWorktreeSession(ctx.uiWorkspace, ctx.sessions, sessionId)
|
|
12532
13018
|
});
|
|
12533
13019
|
ctx.effect(() => () => worktreeSessionConnector.dispose(), "clutch-dsh-worktree: Worktree Session connector cleanup");
|
|
12534
13020
|
const openDashboardForSession = (sessionId) => {
|
|
@@ -12646,19 +13132,14 @@ window.__ModuleLoader__.load({
|
|
|
12646
13132
|
worktreeId,
|
|
12647
13133
|
beforeWorktreeId
|
|
12648
13134
|
}),
|
|
12649
|
-
renameSession:
|
|
12650
|
-
const session = ctx.sessions.binding(sessionId)?.session;
|
|
12651
|
-
if (session === void 0) throw new Error(`unknown session "${sessionId}"`);
|
|
12652
|
-
const result = await session.rename(title);
|
|
12653
|
-
if (!result.ok) throw new Error(result.error.message);
|
|
12654
|
-
},
|
|
13135
|
+
renameSession: (sessionId, title) => renameWorktreeSession(ctx.sessions, sessionId, title),
|
|
12655
13136
|
forkSession: (sessionId) => {
|
|
12656
13137
|
if (forkableSessions.fork === void 0) return;
|
|
12657
13138
|
ctx.sessions.fork({
|
|
12658
13139
|
sessionId,
|
|
12659
13140
|
increaseTitle: true
|
|
12660
13141
|
}).then((childId) => {
|
|
12661
|
-
ctx.sessions
|
|
13142
|
+
openWorktreeSession(ctx.uiWorkspace, ctx.sessions, childId);
|
|
12662
13143
|
}).catch(() => {});
|
|
12663
13144
|
},
|
|
12664
13145
|
archiveSession: (sessionId) => ctx.workspaces.archiveSession(sessionId),
|
|
@@ -12668,9 +13149,7 @@ window.__ModuleLoader__.load({
|
|
|
12668
13149
|
retryForkSession: forkCoordinator === void 0 ? void 0 : async (key) => {
|
|
12669
13150
|
await forkCoordinator.retry(key);
|
|
12670
13151
|
},
|
|
12671
|
-
openSession: (sessionId) =>
|
|
12672
|
-
ctx.sessions.open(sessionId);
|
|
12673
|
-
},
|
|
13152
|
+
openSession: (sessionId) => openWorktreeSession(ctx.uiWorkspace, ctx.sessions, sessionId),
|
|
12674
13153
|
onWorktreeForgotten: (input) => {
|
|
12675
13154
|
forkCoordinator?.forgetWorktree(input);
|
|
12676
13155
|
for (const sessionId of input.sessionIds) virtualWorkspaceMembership.removeSession(sessionId);
|