@cerbur/clutch-dsh-worktree 0.1.15 → 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/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/WorktreeDashboard.d.ts.map +1 -1
- package/lib/client/dashboard/WorktreeDashboard.js +58 -52
- 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/entry.d.ts.map +1 -1
- package/lib/client/entry.js +19 -0
- 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/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/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/WorkspaceTree.d.ts.map +1 -1
- package/lib/client/surface/components/WorkspaceTree.js +5 -1
- 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 +13 -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 +3 -3
- package/lib/client/surface/state/useSurfaceSources.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 +777 -358
- 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/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 +22 -22
- package/lib/typert.remote-client.js +22 -22
- package/package.json +42 -42
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,6 +1609,70 @@ window.__ModuleLoader__.load({
|
|
|
1595
1609
|
};
|
|
1596
1610
|
}
|
|
1597
1611
|
//#endregion
|
|
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
|
|
1598
1676
|
//#region lib/client/dsh-icon-compat.js
|
|
1599
1677
|
/** Resolve a legacy size-named export or the equivalent DSH 1.7 weighted export. */
|
|
1600
1678
|
function createDshIconAlias(exports, legacyName, currentName) {
|
|
@@ -1627,7 +1705,7 @@ window.__ModuleLoader__.load({
|
|
|
1627
1705
|
const IconSearchOutline16 = createDshIconAlias(exports$1, "IconSearchOutline16", "IconSearchOutlineRegular");
|
|
1628
1706
|
const IconTrashOutline16 = createDshIconAlias(exports$1, "IconTrashOutline16", "IconTrashOutlineRegular");
|
|
1629
1707
|
//#endregion
|
|
1630
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/
|
|
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
|
|
1631
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";
|
|
1632
1710
|
const styleId$5 = "@cerbur/clutch-dsh-worktree/worktree-context.css";
|
|
1633
1711
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree-context.css\"]") === null) {
|
|
@@ -1691,8 +1769,8 @@ window.__ModuleLoader__.load({
|
|
|
1691
1769
|
globalSetViewMode?.(mode);
|
|
1692
1770
|
}
|
|
1693
1771
|
//#endregion
|
|
1694
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/
|
|
1695
|
-
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";
|
|
1696
1774
|
const styleId$4 = "@cerbur/clutch-dsh-worktree/worktree.css";
|
|
1697
1775
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree.css\"]") === null) {
|
|
1698
1776
|
const tag = document.createElement("style");
|
|
@@ -1705,6 +1783,7 @@ window.__ModuleLoader__.load({
|
|
|
1705
1783
|
"action": "-cerbur-clutch-dsh-worktree-action",
|
|
1706
1784
|
"actionLabel": "-cerbur-clutch-dsh-worktree-actionLabel",
|
|
1707
1785
|
"surface": "-cerbur-clutch-dsh-worktree-surface",
|
|
1786
|
+
"motionExits": "-cerbur-clutch-dsh-worktree-motionExits",
|
|
1708
1787
|
"wideContent": "-cerbur-clutch-dsh-worktree-wideContent",
|
|
1709
1788
|
"worktreeModalTabs": "-cerbur-clutch-dsh-worktree-worktreeModalTabs",
|
|
1710
1789
|
"worktreeModalTab": "-cerbur-clutch-dsh-worktree-worktreeModalTab",
|
|
@@ -1866,7 +1945,7 @@ window.__ModuleLoader__.load({
|
|
|
1866
1945
|
});
|
|
1867
1946
|
}
|
|
1868
1947
|
//#endregion
|
|
1869
|
-
//#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
|
|
1870
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";
|
|
1871
1950
|
const styleId$3 = "@cerbur/clutch-dsh-worktree/dashboard-header-action.css";
|
|
1872
1951
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/dashboard-header-action.css\"]") === null) {
|
|
@@ -2096,6 +2175,7 @@ window.__ModuleLoader__.load({
|
|
|
2096
2175
|
case "WORKTREE_REGISTRATION_SESSION_UNAVAILABLE": return t("error.worktreeRegistrationSessionUnavailable");
|
|
2097
2176
|
case "WORKSPACE_RENAME_UNAVAILABLE": return t("error.workspaceRenameUnavailable");
|
|
2098
2177
|
case "WORKSPACE_DELETE_UNAVAILABLE": return t("error.workspaceDeleteUnavailable");
|
|
2178
|
+
case "WORKSPACE_ROOT_MISSING": return t("error.workspaceRootMissing", { rootPath: detail(error, "rootPath") });
|
|
2099
2179
|
case "SESSION_RENAME_UNAVAILABLE": return t("error.sessionRenameUnavailable");
|
|
2100
2180
|
case "SESSION_BINDING_FAILED": return t("error.sessionBindingFailed", {
|
|
2101
2181
|
sessionId: detail(error, "sessionId"),
|
|
@@ -2339,6 +2419,7 @@ window.__ModuleLoader__.load({
|
|
|
2339
2419
|
/** Return copyable, read-only setup commands for a Git readiness state. */
|
|
2340
2420
|
function worktreeSetupCommands(status) {
|
|
2341
2421
|
switch (status) {
|
|
2422
|
+
case "workspaceMissing": return [];
|
|
2342
2423
|
case "gitNotInstalled": return [];
|
|
2343
2424
|
case "noRepository": return [
|
|
2344
2425
|
"git init",
|
|
@@ -2357,6 +2438,10 @@ window.__ModuleLoader__.load({
|
|
|
2357
2438
|
}
|
|
2358
2439
|
function readinessFromBranchError(error) {
|
|
2359
2440
|
const viewError = toWorktreeViewError(error);
|
|
2441
|
+
if (viewError.code === "WORKSPACE_ROOT_MISSING") return {
|
|
2442
|
+
status: "workspaceMissing",
|
|
2443
|
+
error: viewError
|
|
2444
|
+
};
|
|
2360
2445
|
if (viewError.code === "GIT_NOT_INSTALLED") return {
|
|
2361
2446
|
status: "gitNotInstalled",
|
|
2362
2447
|
error: viewError
|
|
@@ -2812,6 +2897,7 @@ window.__ModuleLoader__.load({
|
|
|
2812
2897
|
}
|
|
2813
2898
|
function worktreeSetupMessage(status, t) {
|
|
2814
2899
|
switch (status) {
|
|
2900
|
+
case "workspaceMissing": return t("worktree.setup.workspaceMissing");
|
|
2815
2901
|
case "gitNotInstalled": return t("worktree.setup.gitNotInstalled");
|
|
2816
2902
|
case "noRepository": return t("worktree.setup.noRepository");
|
|
2817
2903
|
case "noInitialCommit": return t("worktree.setup.noInitialCommit");
|
|
@@ -3931,6 +4017,7 @@ window.__ModuleLoader__.load({
|
|
|
3931
4017
|
const groupActivityLabel = groupActivityStatus === void 0 ? void 0 : sessionStatusLabel$1(t, groupActivityStatus);
|
|
3932
4018
|
return (0, react_jsx_runtime.jsxs)("div", {
|
|
3933
4019
|
className: `${worktree_css_default.workspaceRow} ${markerClass}`,
|
|
4020
|
+
"data-worktree-motion-key": `workspace:${workspace.workspaceId}`,
|
|
3934
4021
|
"data-workspace-drag": drag.active ? "active" : void 0,
|
|
3935
4022
|
"data-group-activity": groupActivityVisible ? "true" : void 0,
|
|
3936
4023
|
"data-menu-open": menuOpen || void 0,
|
|
@@ -4108,6 +4195,7 @@ window.__ModuleLoader__.load({
|
|
|
4108
4195
|
};
|
|
4109
4196
|
const row = (0, react_jsx_runtime.jsxs)("div", {
|
|
4110
4197
|
className: `${worktree_css_default.worktreeRow} ${markerClass}`,
|
|
4198
|
+
"data-worktree-motion-key": `group:${kind}:${menu?.copyPath ?? ""}`,
|
|
4111
4199
|
"data-main-group": main ? "true" : void 0,
|
|
4112
4200
|
"data-main-expanded": main ? String(expanded) : void 0,
|
|
4113
4201
|
"data-group-activity": groupActivityVisible ? "true" : void 0,
|
|
@@ -4347,6 +4435,7 @@ window.__ModuleLoader__.load({
|
|
|
4347
4435
|
anchor: (0, react_jsx_runtime.jsxs)("div", {
|
|
4348
4436
|
className: `${worktree_css_default.treeSessionRow} ${markerClass}`,
|
|
4349
4437
|
"data-session-id": sessionId,
|
|
4438
|
+
"data-worktree-motion-key": `session:${sessionId}`,
|
|
4350
4439
|
"data-session-blank": blank ? "true" : void 0,
|
|
4351
4440
|
"data-session-current": current ? "true" : void 0,
|
|
4352
4441
|
"data-session-drag": drag.active ? "active" : void 0,
|
|
@@ -4864,6 +4953,145 @@ window.__ModuleLoader__.load({
|
|
|
4864
4953
|
});
|
|
4865
4954
|
}
|
|
4866
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
|
|
4867
5095
|
//#region lib/client/surface/components/WorkspaceTree.js
|
|
4868
5096
|
function WorkspaceTree({ props, read, source, expansion, ordering, drag, mutation, menus, registration, native, lifecycle, session, lifecycleState }) {
|
|
4869
5097
|
const { t, createMainSession, openSession, renameSession, forkSession, archiveSession } = props;
|
|
@@ -4877,8 +5105,10 @@ window.__ModuleLoader__.load({
|
|
|
4877
5105
|
const { openWorktreeCreator } = registration;
|
|
4878
5106
|
const { openWorkspaceRename, openWorkspaceDelete, openSessionRename, archiveWorktreeSession } = native;
|
|
4879
5107
|
const visibleWorkspaces = workspaces.items.filter((workspace) => workspaceMatches(workspace, viewByWorkspace.get(workspace.workspaceId), sessions, query));
|
|
4880
|
-
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, {
|
|
4881
5109
|
className: worktree_css_default.workspaceList,
|
|
5110
|
+
ready: sessions.phase !== "pending" && workspaceDrag === void 0 && worktreeDrag === void 0 && sessionDrag === void 0,
|
|
5111
|
+
resetKey: query,
|
|
4882
5112
|
children: visibleWorkspaces.length === 0 ? (0, react_jsx_runtime.jsx)("p", {
|
|
4883
5113
|
className: worktree_css_default.empty,
|
|
4884
5114
|
children: t("workspace.noMatches")
|
|
@@ -5161,6 +5391,7 @@ window.__ModuleLoader__.load({
|
|
|
5161
5391
|
ref: expansion.contentRef,
|
|
5162
5392
|
className: worktree_css_default.content,
|
|
5163
5393
|
tabIndex: 0,
|
|
5394
|
+
"data-worktree-scrollport": true,
|
|
5164
5395
|
children: [
|
|
5165
5396
|
(0, react_jsx_runtime.jsx)(NotificationToasts, {
|
|
5166
5397
|
notices,
|
|
@@ -7189,6 +7420,156 @@ window.__ModuleLoader__.load({
|
|
|
7189
7420
|
};
|
|
7190
7421
|
}
|
|
7191
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
|
|
7192
7573
|
//#region lib/client/overlay/sidebar-overlay-geometry.js
|
|
7193
7574
|
const EMPTY_BOUNDS = {
|
|
7194
7575
|
ready: false,
|
|
@@ -7223,7 +7604,14 @@ window.__ModuleLoader__.load({
|
|
|
7223
7604
|
"新会话",
|
|
7224
7605
|
"New Session"
|
|
7225
7606
|
];
|
|
7226
|
-
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
|
+
});
|
|
7227
7615
|
const visibleLabel = buttons.find((button) => {
|
|
7228
7616
|
const text = button.textContent?.trim();
|
|
7229
7617
|
return text === "新会话" || text === "New Session";
|
|
@@ -7234,17 +7622,43 @@ window.__ModuleLoader__.load({
|
|
|
7234
7622
|
if (button !== void 0) return button;
|
|
7235
7623
|
}
|
|
7236
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
|
+
}
|
|
7237
7648
|
function useSidebarOverlayGeometry(active) {
|
|
7238
7649
|
const ref = (0, react.useRef)(null);
|
|
7239
7650
|
const [width, setWidth] = (0, react.useState)(280);
|
|
7240
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);
|
|
7241
7654
|
(0, react.useLayoutEffect)(() => {
|
|
7242
7655
|
if (!active) {
|
|
7243
7656
|
setBounds(EMPTY_BOUNDS);
|
|
7244
7657
|
return;
|
|
7245
7658
|
}
|
|
7246
7659
|
const overlay = ref.current?.closest("[data-shell-overlay]");
|
|
7247
|
-
const
|
|
7660
|
+
const frame = overlay?.parentElement;
|
|
7661
|
+
const sidebar = frame?.firstElementChild;
|
|
7248
7662
|
const nativeRoot = sidebar === null || sidebar === void 0 ? void 0 : resolveNativeSidebarRoot(sidebar);
|
|
7249
7663
|
if (!(overlay instanceof HTMLElement) || !(sidebar instanceof HTMLElement) || !(nativeRoot instanceof HTMLElement)) {
|
|
7250
7664
|
setBounds(EMPTY_BOUNDS);
|
|
@@ -7256,14 +7670,38 @@ window.__ModuleLoader__.load({
|
|
|
7256
7670
|
let frameHandle;
|
|
7257
7671
|
let observedNewSession;
|
|
7258
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
|
+
}
|
|
7259
7679
|
function update() {
|
|
7260
|
-
const
|
|
7261
|
-
|
|
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;
|
|
7262
7690
|
observedNewSession = syncObservedElement(resizeObserver, observedNewSession, newSession);
|
|
7263
7691
|
observedFooter = syncObservedElement(resizeObserver, observedFooter, footer);
|
|
7264
7692
|
const nextWidth = sidebarElement.getBoundingClientRect().width;
|
|
7265
|
-
|
|
7266
|
-
|
|
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);
|
|
7267
7705
|
}
|
|
7268
7706
|
function scheduleUpdate() {
|
|
7269
7707
|
if (frameHandle !== void 0) return;
|
|
@@ -7280,20 +7718,26 @@ window.__ModuleLoader__.load({
|
|
|
7280
7718
|
]) resizeObserver?.observe(element);
|
|
7281
7719
|
update();
|
|
7282
7720
|
const mutationObserver = typeof MutationObserver === "function" ? new MutationObserver(scheduleUpdate) : void 0;
|
|
7283
|
-
mutationObserver?.observe(
|
|
7721
|
+
mutationObserver?.observe(frame, {
|
|
7284
7722
|
childList: true,
|
|
7285
|
-
subtree: true
|
|
7723
|
+
subtree: true,
|
|
7724
|
+
attributes: true,
|
|
7725
|
+
attributeFilter: ["data-sidebar-collapsed"]
|
|
7286
7726
|
});
|
|
7727
|
+
if (frame?.parentElement) mutationObserver?.observe(frame.parentElement, { childList: true });
|
|
7287
7728
|
return () => {
|
|
7288
7729
|
resizeObserver?.disconnect();
|
|
7289
7730
|
mutationObserver?.disconnect();
|
|
7290
7731
|
if (frameHandle !== void 0) cancelAnimationFrame(frameHandle);
|
|
7732
|
+
restore();
|
|
7291
7733
|
};
|
|
7292
7734
|
}, [active]);
|
|
7293
7735
|
return {
|
|
7294
7736
|
ref,
|
|
7295
7737
|
width,
|
|
7296
|
-
bounds
|
|
7738
|
+
bounds,
|
|
7739
|
+
collapsed,
|
|
7740
|
+
nativeCovered
|
|
7297
7741
|
};
|
|
7298
7742
|
}
|
|
7299
7743
|
//#endregion
|
|
@@ -7325,7 +7769,7 @@ window.__ModuleLoader__.load({
|
|
|
7325
7769
|
}, [fullAccessConfirmationKey]);
|
|
7326
7770
|
const sessionOrderSnapshot = (0, react.useSyncExternalStore)(sessionOrder.subscribe, sessionOrder.getSnapshot, sessionOrder.getSnapshot);
|
|
7327
7771
|
const sessionPresentations = (0, react.useMemo)(() => deriveSessionPresentationIndex(sessions), [sessions.byId]);
|
|
7328
|
-
const { ref, width, bounds } = useSidebarOverlayGeometry(mode === "worktree");
|
|
7772
|
+
const { ref, width, bounds, collapsed, nativeCovered } = useSidebarOverlayGeometry(mode === "worktree");
|
|
7329
7773
|
return {
|
|
7330
7774
|
preferredMode,
|
|
7331
7775
|
mode,
|
|
@@ -7347,7 +7791,8 @@ window.__ModuleLoader__.load({
|
|
|
7347
7791
|
ref,
|
|
7348
7792
|
width,
|
|
7349
7793
|
bounds,
|
|
7350
|
-
collapsed
|
|
7794
|
+
collapsed,
|
|
7795
|
+
nativeCovered,
|
|
7351
7796
|
archivedSessionIds: workspaces.archivedSessionIds ?? []
|
|
7352
7797
|
};
|
|
7353
7798
|
}
|
|
@@ -7633,7 +8078,7 @@ window.__ModuleLoader__.load({
|
|
|
7633
8078
|
};
|
|
7634
8079
|
const defaultOpenInAppController = new OpenInAppController();
|
|
7635
8080
|
//#endregion
|
|
7636
|
-
//#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
|
|
7637
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";
|
|
7638
8083
|
const styleId$2 = "@cerbur/clutch-dsh-worktree/open-in-app.css";
|
|
7639
8084
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/open-in-app.css\"]") === null) {
|
|
@@ -7835,168 +8280,24 @@ window.__ModuleLoader__.load({
|
|
|
7835
8280
|
});
|
|
7836
8281
|
}
|
|
7837
8282
|
//#endregion
|
|
7838
|
-
//#region lib/client/dashboard/
|
|
7839
|
-
|
|
7840
|
-
|
|
7841
|
-
|
|
7842
|
-
|
|
7843
|
-
|
|
7844
|
-
const inert = element.getAttribute("inert");
|
|
7845
|
-
const hidden = element.getAttribute("aria-hidden");
|
|
7846
|
-
element.style.setProperty("visibility", "hidden");
|
|
7847
|
-
element.setAttribute("inert", "");
|
|
7848
|
-
element.setAttribute("aria-hidden", "true");
|
|
7849
|
-
return () => {
|
|
7850
|
-
if (element.style.getPropertyValue("visibility") === "hidden") if (visibility) element.style.setProperty("visibility", visibility, priority);
|
|
7851
|
-
else element.style.removeProperty("visibility");
|
|
7852
|
-
for (const [name, value] of [["inert", inert], ["aria-hidden", hidden]]) if (value === null) element.removeAttribute(name);
|
|
7853
|
-
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 }
|
|
7854
8289
|
};
|
|
7855
8290
|
}
|
|
7856
|
-
|
|
7857
|
-
|
|
7858
|
-
if (frame.querySelector("[data-sidebar-right-open]") !== null) return true;
|
|
7859
|
-
|
|
7860
|
-
|
|
7861
|
-
|
|
7862
|
-
|
|
7863
|
-
|
|
7864
|
-
|
|
7865
|
-
|
|
7866
|
-
}
|
|
7867
|
-
/** Layout seam shared with the existing Sidebar overlay; fail closed on frame/center loss. */
|
|
7868
|
-
function mountDashboardOverlay(surface, onPlacement, options) {
|
|
7869
|
-
const overlay = surface.closest("[data-shell-overlay]");
|
|
7870
|
-
const frame = overlay?.parentElement;
|
|
7871
|
-
if (!overlay || !frame) {
|
|
7872
|
-
onPlacement(void 0);
|
|
7873
|
-
options?.onRightSidebarChange?.(false);
|
|
7874
|
-
return () => {};
|
|
7875
|
-
}
|
|
7876
|
-
const hidden = /* @__PURE__ */ new Map();
|
|
7877
|
-
let observed = [];
|
|
7878
|
-
let scheduled;
|
|
7879
|
-
let disposed = false;
|
|
7880
|
-
let lastRightSidebarOpen;
|
|
7881
|
-
const restore = () => {
|
|
7882
|
-
for (const cleanup of hidden.values()) cleanup();
|
|
7883
|
-
hidden.clear();
|
|
7884
|
-
};
|
|
7885
|
-
const schedule = () => {
|
|
7886
|
-
if (disposed || scheduled !== void 0) return;
|
|
7887
|
-
scheduled = requestAnimationFrame(() => {
|
|
7888
|
-
scheduled = void 0;
|
|
7889
|
-
update();
|
|
7890
|
-
});
|
|
7891
|
-
};
|
|
7892
|
-
const resize = typeof ResizeObserver === "undefined" ? void 0 : new ResizeObserver(schedule);
|
|
7893
|
-
const update = () => {
|
|
7894
|
-
if (disposed) return;
|
|
7895
|
-
const sidebar = frame.firstElementChild;
|
|
7896
|
-
const center = sidebar?.nextElementSibling;
|
|
7897
|
-
const rightbar = center?.nextElementSibling;
|
|
7898
|
-
const hasRightbar = rightbar instanceof HTMLElement && rightbar !== overlay && rightbar.nextElementSibling === overlay;
|
|
7899
|
-
const hasNoRightbar = rightbar === overlay;
|
|
7900
|
-
const valid = overlay.isConnected && overlay.parentElement === frame && sidebar instanceof HTMLElement && center instanceof HTMLElement && (hasRightbar || hasNoRightbar);
|
|
7901
|
-
const nextObserved = valid ? hasRightbar ? [
|
|
7902
|
-
overlay,
|
|
7903
|
-
sidebar,
|
|
7904
|
-
center,
|
|
7905
|
-
rightbar
|
|
7906
|
-
] : [
|
|
7907
|
-
overlay,
|
|
7908
|
-
sidebar,
|
|
7909
|
-
center
|
|
7910
|
-
] : [frame];
|
|
7911
|
-
for (const old of observed) if (!nextObserved.includes(old)) resize?.unobserve(old);
|
|
7912
|
-
for (const next of nextObserved) if (!observed.includes(next)) resize?.observe(next);
|
|
7913
|
-
observed = nextObserved;
|
|
7914
|
-
if (!valid) {
|
|
7915
|
-
restore();
|
|
7916
|
-
onPlacement(void 0);
|
|
7917
|
-
if (lastRightSidebarOpen) {
|
|
7918
|
-
lastRightSidebarOpen = false;
|
|
7919
|
-
options?.onRightSidebarChange?.(false);
|
|
7920
|
-
}
|
|
7921
|
-
return;
|
|
7922
|
-
}
|
|
7923
|
-
const box = overlay.getBoundingClientRect();
|
|
7924
|
-
const boundary = sidebar.getBoundingClientRect();
|
|
7925
|
-
const rightBoundary = hasRightbar && rightbar instanceof HTMLElement ? rightbar.getBoundingClientRect().left : box.right;
|
|
7926
|
-
const left = Math.max(0, boundary.right - box.left + SIDEBAR_RESIZE_HANDLE_HALF_WIDTH);
|
|
7927
|
-
const width = Math.min(box.right, rightBoundary) - box.left - left;
|
|
7928
|
-
if (width <= 0 || box.height <= 0) {
|
|
7929
|
-
restore();
|
|
7930
|
-
onPlacement(void 0);
|
|
7931
|
-
return;
|
|
7932
|
-
}
|
|
7933
|
-
for (const [element, cleanup] of hidden) if (element !== center) {
|
|
7934
|
-
cleanup();
|
|
7935
|
-
hidden.delete(element);
|
|
7936
|
-
}
|
|
7937
|
-
if (!hidden.has(center)) hidden.set(center, concealDashboardBackground(center));
|
|
7938
|
-
onPlacement({
|
|
7939
|
-
left,
|
|
7940
|
-
top: 0,
|
|
7941
|
-
width,
|
|
7942
|
-
height: box.height
|
|
7943
|
-
});
|
|
7944
|
-
const isRightSidebarOpen = options?.isRightSidebarExpanded !== void 0 ? options.isRightSidebarExpanded() : isRightSidebarOpenFromDom(frame, hasRightbar ? rightbar : void 0);
|
|
7945
|
-
if (lastRightSidebarOpen !== isRightSidebarOpen) {
|
|
7946
|
-
lastRightSidebarOpen = isRightSidebarOpen;
|
|
7947
|
-
options?.onRightSidebarChange?.(isRightSidebarOpen);
|
|
7948
|
-
}
|
|
7949
|
-
};
|
|
7950
|
-
const mutation = typeof MutationObserver === "undefined" ? void 0 : new MutationObserver(schedule);
|
|
7951
|
-
try {
|
|
7952
|
-
mutation?.observe(frame, {
|
|
7953
|
-
childList: true,
|
|
7954
|
-
attributes: true,
|
|
7955
|
-
subtree: true,
|
|
7956
|
-
attributeFilter: [
|
|
7957
|
-
"data-rightbar-collapsed",
|
|
7958
|
-
"data-sidebar-right-open",
|
|
7959
|
-
"data-sidebar-right-panel"
|
|
7960
|
-
]
|
|
7961
|
-
});
|
|
7962
|
-
} catch {
|
|
7963
|
-
mutation?.observe(frame, { childList: true });
|
|
7964
|
-
}
|
|
7965
|
-
if (frame.parentElement) try {
|
|
7966
|
-
mutation?.observe(frame.parentElement, { childList: true });
|
|
7967
|
-
} catch {}
|
|
7968
|
-
update();
|
|
7969
|
-
return () => {
|
|
7970
|
-
disposed = true;
|
|
7971
|
-
resize?.disconnect();
|
|
7972
|
-
mutation?.disconnect();
|
|
7973
|
-
if (scheduled !== void 0) cancelAnimationFrame(scheduled);
|
|
7974
|
-
restore();
|
|
7975
|
-
if (lastRightSidebarOpen) {
|
|
7976
|
-
lastRightSidebarOpen = false;
|
|
7977
|
-
options?.onRightSidebarChange?.(false);
|
|
7978
|
-
}
|
|
7979
|
-
};
|
|
7980
|
-
}
|
|
7981
|
-
//#endregion
|
|
7982
|
-
//#region lib/client/dashboard/worktree-acquisition-facts.js
|
|
7983
|
-
function selectWorktreeAcquisitionFacts(record) {
|
|
7984
|
-
return {
|
|
7985
|
-
timestampKind: record.source === "external" ? "imported" : "created",
|
|
7986
|
-
...record.source === "external" ? record.importedAt === void 0 ? {} : { timestamp: record.importedAt } : record.createdAt === void 0 ? {} : { timestamp: record.createdAt },
|
|
7987
|
-
...record.baseBranch === void 0 ? {} : { baseBranch: record.baseBranch }
|
|
7988
|
-
};
|
|
7989
|
-
}
|
|
7990
|
-
//#endregion
|
|
7991
|
-
//#region \0clutch-dsh-worktree-css:/Users/yuancheng/.dsh/clutch-dsh-worktree/worktree/wt_12c44ccd600c/packages/clutch-dsh-worktree/src/client/dashboard/dashboard.css.mjs
|
|
7992
|
-
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";
|
|
7993
|
-
const styleId$1 = "@cerbur/clutch-dsh-worktree/dashboard.css";
|
|
7994
|
-
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/dashboard.css\"]") === null) {
|
|
7995
|
-
const tag = document.createElement("style");
|
|
7996
|
-
tag.dataset.plugin = "@cerbur/clutch-dsh-worktree";
|
|
7997
|
-
tag.dataset.pluginCss = styleId$1;
|
|
7998
|
-
tag.textContent = css$1;
|
|
7999
|
-
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);
|
|
8000
8301
|
}
|
|
8001
8302
|
var dashboard_css_default = {
|
|
8002
8303
|
"dashboardSurface": "-cerbur-clutch-dsh-worktree-dashboardSurface",
|
|
@@ -8010,6 +8311,7 @@ window.__ModuleLoader__.load({
|
|
|
8010
8311
|
"dashboardStartActions": "-cerbur-clutch-dsh-worktree-dashboardStartActions",
|
|
8011
8312
|
"dashboardTopline": "-cerbur-clutch-dsh-worktree-dashboardTopline",
|
|
8012
8313
|
"dashboardToplineActions": "-cerbur-clutch-dsh-worktree-dashboardToplineActions",
|
|
8314
|
+
"overlay": "-cerbur-clutch-dsh-worktree-overlay",
|
|
8013
8315
|
"dashboardSidebarButton": "-cerbur-clutch-dsh-worktree-dashboardSidebarButton",
|
|
8014
8316
|
"dashboardHeader": "-cerbur-clutch-dsh-worktree-dashboardHeader",
|
|
8015
8317
|
"dashboardIdentity": "-cerbur-clutch-dsh-worktree-dashboardIdentity",
|
|
@@ -8279,7 +8581,7 @@ window.__ModuleLoader__.load({
|
|
|
8279
8581
|
});
|
|
8280
8582
|
}
|
|
8281
8583
|
//#endregion
|
|
8282
|
-
//#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
|
|
8283
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";
|
|
8284
8586
|
const styleId = "@cerbur/clutch-dsh-worktree/worktree-git.css";
|
|
8285
8587
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=\"@cerbur/clutch-dsh-worktree/worktree-git.css\"]") === null) {
|
|
@@ -9015,6 +9317,7 @@ window.__ModuleLoader__.load({
|
|
|
9015
9317
|
}
|
|
9016
9318
|
Object.freeze([
|
|
9017
9319
|
"WORKSPACE_NOT_FOUND",
|
|
9320
|
+
"WORKSPACE_ROOT_MISSING",
|
|
9018
9321
|
"WORKSPACE_NOT_GIT_REPOSITORY",
|
|
9019
9322
|
"GIT_NOT_INSTALLED",
|
|
9020
9323
|
"WORKTREE_REQUIRES_INITIAL_COMMIT",
|
|
@@ -10815,7 +11118,7 @@ window.__ModuleLoader__.load({
|
|
|
10815
11118
|
})
|
|
10816
11119
|
});
|
|
10817
11120
|
const topActionIsCreateSession = sessionIds.length === 0 && onCreateSession !== void 0;
|
|
10818
|
-
return (0, react_jsx_runtime.
|
|
11121
|
+
return (0, react_jsx_runtime.jsxs)("section", {
|
|
10819
11122
|
ref: surface,
|
|
10820
11123
|
className: dashboard_css_default.dashboardSurface,
|
|
10821
11124
|
"data-worktree-dashboard": record.worktreeId,
|
|
@@ -10825,54 +11128,67 @@ window.__ModuleLoader__.load({
|
|
|
10825
11128
|
height: 0
|
|
10826
11129
|
},
|
|
10827
11130
|
onKeyDown: (event) => {
|
|
11131
|
+
if (event.defaultPrevented) return;
|
|
10828
11132
|
if (event.key === "Escape") {
|
|
10829
11133
|
if (event.currentTarget.querySelector("[role=\"menu\"]")) return;
|
|
10830
11134
|
event.stopPropagation();
|
|
10831
11135
|
onClose();
|
|
10832
11136
|
}
|
|
10833
11137
|
},
|
|
10834
|
-
children: (0, react_jsx_runtime.jsxs)("
|
|
10835
|
-
className: dashboard_css_default.
|
|
10836
|
-
|
|
10837
|
-
|
|
10838
|
-
|
|
10839
|
-
|
|
10840
|
-
|
|
10841
|
-
|
|
10842
|
-
|
|
10843
|
-
|
|
10844
|
-
|
|
10845
|
-
|
|
10846
|
-
|
|
10847
|
-
|
|
10848
|
-
|
|
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", {
|
|
10849
11175
|
type: "button",
|
|
10850
|
-
className: dashboard_css_default.
|
|
10851
|
-
"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,
|
|
10852
11180
|
onClick: () => {
|
|
10853
|
-
|
|
10854
|
-
|
|
11181
|
+
onOpenSidebar();
|
|
11182
|
+
setRightSidebarOpen(true);
|
|
10855
11183
|
},
|
|
10856
|
-
children:
|
|
10857
|
-
})
|
|
10858
|
-
|
|
10859
|
-
|
|
10860
|
-
|
|
10861
|
-
|
|
10862
|
-
|
|
10863
|
-
|
|
10864
|
-
"aria-label": t("dashboard.openSidebar"),
|
|
10865
|
-
title: t("dashboard.openSidebar"),
|
|
10866
|
-
"data-sidebar-right-expand": true,
|
|
10867
|
-
onClick: () => {
|
|
10868
|
-
onOpenSidebar();
|
|
10869
|
-
setRightSidebarOpen(true);
|
|
10870
|
-
},
|
|
10871
|
-
children: (0, react_jsx_runtime.jsx)(IconPanelLeftOutline16, {})
|
|
10872
|
-
})
|
|
10873
|
-
})]
|
|
10874
|
-
})]
|
|
10875
|
-
}),
|
|
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: [
|
|
10876
11192
|
(0, react_jsx_runtime.jsxs)("header", {
|
|
10877
11193
|
className: dashboard_css_default.dashboardHeader,
|
|
10878
11194
|
children: [(0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -10942,12 +11258,9 @@ window.__ModuleLoader__.load({
|
|
|
10942
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"
|
|
10943
11259
|
})
|
|
10944
11260
|
]
|
|
10945
|
-
}), (0, react_jsx_runtime.
|
|
11261
|
+
}), (0, react_jsx_runtime.jsx)("div", {
|
|
10946
11262
|
className: dashboard_css_default.dashboardHeaderAside,
|
|
10947
|
-
children:
|
|
10948
|
-
path: record.absolutePath,
|
|
10949
|
-
t
|
|
10950
|
-
}), (0, react_jsx_runtime.jsxs)("dl", {
|
|
11263
|
+
children: (0, react_jsx_runtime.jsxs)("dl", {
|
|
10951
11264
|
className: dashboard_css_default.dashboardFacts,
|
|
10952
11265
|
children: [
|
|
10953
11266
|
(0, react_jsx_runtime.jsx)(DashboardFactRow, {
|
|
@@ -10980,7 +11293,7 @@ window.__ModuleLoader__.load({
|
|
|
10980
11293
|
children: isMainWorktreeId$1(record.worktreeId) ? t("worktree.main") : t(record.source === "external" ? "dashboard.external" : "dashboard.plugin")
|
|
10981
11294
|
})
|
|
10982
11295
|
]
|
|
10983
|
-
})
|
|
11296
|
+
})
|
|
10984
11297
|
})]
|
|
10985
11298
|
}),
|
|
10986
11299
|
(0, react_jsx_runtime.jsx)("div", {
|
|
@@ -11185,7 +11498,73 @@ window.__ModuleLoader__.load({
|
|
|
11185
11498
|
children: t("dashboard.mvpHint")
|
|
11186
11499
|
})
|
|
11187
11500
|
]
|
|
11188
|
-
})
|
|
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
|
+
})]
|
|
11189
11568
|
});
|
|
11190
11569
|
}
|
|
11191
11570
|
//#endregion
|
|
@@ -11312,11 +11691,15 @@ window.__ModuleLoader__.load({
|
|
|
11312
11691
|
const dashboardMainRecord = targetWorkspace === void 0 ? void 0 : createMainWorktreeRecord(targetWorkspace, dashboardMainBranch, targetView?.mainInstructions);
|
|
11313
11692
|
const dashboardRecord = resolveDashboardRecord(dashboard, source.mode, source.currentSessionId, source.workspaceIds, dashboard === void 0 ? void 0 : targetView?.worktrees, dashboardMainRecord);
|
|
11314
11693
|
(0, react.useEffect)(() => {
|
|
11315
|
-
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);
|
|
11316
11695
|
}, [
|
|
11317
11696
|
dashboard,
|
|
11318
11697
|
dashboardRecord,
|
|
11319
|
-
setDashboard
|
|
11698
|
+
setDashboard,
|
|
11699
|
+
source.mode,
|
|
11700
|
+
source.currentSessionId,
|
|
11701
|
+
source.workspaceIds,
|
|
11702
|
+
targetView
|
|
11320
11703
|
]);
|
|
11321
11704
|
const mutation = useSurfaceMutation({ read });
|
|
11322
11705
|
const lifecycleState = useLifecycleState({
|
|
@@ -11440,147 +11823,166 @@ window.__ModuleLoader__.load({
|
|
|
11440
11823
|
if (source.mode !== "worktree") return null;
|
|
11441
11824
|
const { ref, width, bounds, collapsed } = source;
|
|
11442
11825
|
const { t } = props;
|
|
11443
|
-
return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
11444
|
-
|
|
11445
|
-
|
|
11446
|
-
|
|
11447
|
-
|
|
11448
|
-
|
|
11449
|
-
|
|
11450
|
-
|
|
11451
|
-
|
|
11452
|
-
|
|
11453
|
-
|
|
11454
|
-
|
|
11455
|
-
|
|
11456
|
-
|
|
11457
|
-
|
|
11458
|
-
|
|
11459
|
-
|
|
11460
|
-
|
|
11461
|
-
|
|
11462
|
-
|
|
11463
|
-
|
|
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, {
|
|
11464
11871
|
props,
|
|
11465
|
-
|
|
11466
|
-
|
|
11467
|
-
|
|
11468
|
-
}), (0, react_jsx_runtime.jsx)(SurfaceContent, {
|
|
11469
|
-
source,
|
|
11872
|
+
native
|
|
11873
|
+
}),
|
|
11874
|
+
(0, react_jsx_runtime.jsx)(RegistrationDialog, {
|
|
11470
11875
|
props,
|
|
11471
|
-
|
|
11876
|
+
registration,
|
|
11877
|
+
registrationState,
|
|
11472
11878
|
mutation,
|
|
11473
|
-
|
|
11474
|
-
|
|
11879
|
+
read
|
|
11880
|
+
}),
|
|
11881
|
+
(0, react_jsx_runtime.jsx)(LifecycleDialogs, {
|
|
11882
|
+
props,
|
|
11883
|
+
lifecycleState,
|
|
11884
|
+
mutation,
|
|
11885
|
+
lifecycle,
|
|
11475
11886
|
expansion,
|
|
11476
|
-
|
|
11477
|
-
|
|
11478
|
-
|
|
11479
|
-
|
|
11480
|
-
|
|
11481
|
-
|
|
11482
|
-
})
|
|
11483
|
-
|
|
11484
|
-
|
|
11485
|
-
|
|
11486
|
-
|
|
11487
|
-
|
|
11488
|
-
|
|
11489
|
-
|
|
11490
|
-
registration,
|
|
11491
|
-
registrationState,
|
|
11492
|
-
mutation,
|
|
11493
|
-
read
|
|
11494
|
-
}),
|
|
11495
|
-
(0, react_jsx_runtime.jsx)(LifecycleDialogs, {
|
|
11496
|
-
props,
|
|
11497
|
-
lifecycleState,
|
|
11498
|
-
mutation,
|
|
11499
|
-
lifecycle,
|
|
11500
|
-
expansion,
|
|
11501
|
-
read,
|
|
11502
|
-
session
|
|
11503
|
-
}),
|
|
11504
|
-
(0, react_jsx_runtime.jsx)(AccessConfirmation, {
|
|
11505
|
-
source,
|
|
11506
|
-
props
|
|
11507
|
-
})
|
|
11508
|
-
]
|
|
11509
|
-
}), dashboardRecord !== void 0 && (0, react_jsx_runtime.jsx)(WorktreeDashboard, {
|
|
11510
|
-
manager: props.manager,
|
|
11511
|
-
record: dashboardRecord,
|
|
11512
|
-
onSaveInstructions: props.manager ? async (instructions, expectedInstructions) => {
|
|
11513
|
-
try {
|
|
11514
|
-
return await props.manager.updateWorktreeInstructions({
|
|
11515
|
-
workspaceId: dashboardRecord.workspaceId,
|
|
11516
|
-
worktreeId: dashboardRecord.worktreeId,
|
|
11517
|
-
instructions,
|
|
11518
|
-
expectedInstructions
|
|
11519
|
-
});
|
|
11520
|
-
} 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: () => {
|
|
11521
11901
|
read.refresh({
|
|
11522
|
-
preserveCurrent: true,
|
|
11523
11902
|
scope: {
|
|
11524
11903
|
kind: "workspace",
|
|
11525
|
-
workspaceId:
|
|
11526
|
-
}
|
|
11904
|
+
workspaceId: dashboard.workspaceId
|
|
11905
|
+
},
|
|
11906
|
+
preserveCurrent: true
|
|
11527
11907
|
});
|
|
11528
11908
|
}
|
|
11529
|
-
}
|
|
11530
|
-
|
|
11531
|
-
|
|
11532
|
-
|
|
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({
|
|
11533
11962
|
workspaceId: dashboardRecord.workspaceId,
|
|
11534
11963
|
worktreeId: dashboardRecord.worktreeId,
|
|
11535
|
-
|
|
11536
|
-
expectedBaseBranch
|
|
11964
|
+
cwd: dashboardRecord.absolutePath
|
|
11537
11965
|
});
|
|
11538
|
-
}
|
|
11539
|
-
|
|
11540
|
-
|
|
11541
|
-
|
|
11542
|
-
|
|
11543
|
-
|
|
11544
|
-
|
|
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)])
|
|
11545
11973
|
});
|
|
11546
|
-
}
|
|
11547
|
-
|
|
11548
|
-
|
|
11549
|
-
|
|
11550
|
-
|
|
11551
|
-
|
|
11552
|
-
|
|
11553
|
-
|
|
11554
|
-
|
|
11555
|
-
|
|
11556
|
-
|
|
11557
|
-
|
|
11558
|
-
closeDashboard();
|
|
11559
|
-
if (isMainWorktreeId$1(dashboardRecord.worktreeId)) props.createMainSession?.(dashboardRecord.workspaceId);
|
|
11560
|
-
else session.createSession({
|
|
11561
|
-
workspaceId: dashboardRecord.workspaceId,
|
|
11562
|
-
worktreeId: dashboardRecord.worktreeId,
|
|
11563
|
-
cwd: dashboardRecord.absolutePath
|
|
11564
|
-
});
|
|
11565
|
-
} : void 0,
|
|
11566
|
-
onCreateWorktree: dashboardCanCreate && dashboardRecord.currentBranch !== null && dashboardRecord.branch.length > 0 && dashboardWorkspace !== void 0 && dashboardView !== void 0 ? () => {
|
|
11567
|
-
if (mutation.actionPending) return;
|
|
11568
|
-
const branch = dashboardRecord.currentBranch ?? dashboardRecord.branch;
|
|
11569
|
-
registration.openWorktreeCreator(dashboardWorkspace, {
|
|
11570
|
-
baseBranch: branch,
|
|
11571
|
-
newBranch: createNumberedWorktreeName(branch, [...dashboardView.branches.map((candidate) => candidate.name), ...dashboardView.worktrees.map((candidate) => candidate.branch)])
|
|
11572
|
-
});
|
|
11573
|
-
} : void 0,
|
|
11574
|
-
onArchiveWorktree: dashboardManagedRecord !== void 0 && dashboardManagedRecord.status === "active" && dashboardManagedRecord.health !== "recovery-needed" ? () => {
|
|
11575
|
-
if (mutation.actionPending) return;
|
|
11576
|
-
lifecycleState.setWorktreeRemoval(dashboardManagedRecord);
|
|
11577
|
-
mutation.setActionError(void 0);
|
|
11578
|
-
} : void 0,
|
|
11579
|
-
t,
|
|
11580
|
-
onClose: closeDashboard,
|
|
11581
|
-
onOpenSidebar: source.currentSessionId === void 0 ? void 0 : props.openRightSidebar,
|
|
11582
|
-
isRightSidebarExpanded: props.isRightSidebarExpanded
|
|
11583
|
-
}, `${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
|
+
] });
|
|
11584
11986
|
}
|
|
11585
11987
|
//#endregion
|
|
11586
11988
|
//#region lib/client/overlay/WorktreeOverlay.js
|
|
@@ -12475,6 +12877,23 @@ window.__ModuleLoader__.load({
|
|
|
12475
12877
|
};
|
|
12476
12878
|
const sessions = ctx.sessions;
|
|
12477
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");
|
|
12478
12897
|
const virtualWorkspaceMembership = createVirtualWorkspaceMembership(ctx.workspaces.list);
|
|
12479
12898
|
const contextProjection = createWorktreeContextProjection({
|
|
12480
12899
|
sessions: ctx.sessions.list,
|